From e40853f5e2e6e5449aab0526f3632dcc50dd12ef Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 27 Feb 2024 10:12:26 +0000 Subject: [PATCH 01/65] Culling POLYGON EMPTY geometries from data --- meshiphi/dataloaders/lut/thickness.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/meshiphi/dataloaders/lut/thickness.py b/meshiphi/dataloaders/lut/thickness.py index 90d43d6b..61bb69ac 100644 --- a/meshiphi/dataloaders/lut/thickness.py +++ b/meshiphi/dataloaders/lut/thickness.py @@ -96,12 +96,19 @@ def import_data(self, bounds): dates = pd.date_range(start=bounds.get_time_min(), end=bounds.get_time_max()) - thickness_df = pd.concat([ - pd.DataFrame({'time': dates, - 'geometry': region.geometry & bounds_polygon, - 'thickness': region.get_value(month)}) - for region in regions for month in dates.month - ]) + thickness_df = pd.DataFrame() + + for region in regions: + + if region.geometry & bounds_polygon: + region_df = pd.concat([ + pd.DataFrame({'time': dates, + 'geometry': region.geometry & bounds_polygon, + 'thickness': region.get_value(month)}) + for month in dates.month + ]) + + thickness_df = pd.concat([region_df, thickness_df]) thickness_df = thickness_df.set_index('time').sort_index() From 03df400900c0ba4a0c2f363683d3bc6a4e9cc353 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:08:05 +0000 Subject: [PATCH 02/65] Removing LINESTRING and duplicate entries from data --- meshiphi/dataloaders/lut/thickness.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/meshiphi/dataloaders/lut/thickness.py b/meshiphi/dataloaders/lut/thickness.py index 61bb69ac..2cc5d016 100644 --- a/meshiphi/dataloaders/lut/thickness.py +++ b/meshiphi/dataloaders/lut/thickness.py @@ -3,7 +3,7 @@ import logging import pandas as pd -from shapely import wkt +from shapely import wkt, Polygon # Mapping of month number to season per hemisphere @@ -99,17 +99,21 @@ def import_data(self, bounds): thickness_df = pd.DataFrame() for region in regions: - - if region.geometry & bounds_polygon: + + intersection = region.geometry & bounds_polygon + if intersection.geom_type in ['Polygon', 'MultiPolygon'] and \ + intersection != Polygon(): + region_df = pd.concat([ pd.DataFrame({'time': dates, 'geometry': region.geometry & bounds_polygon, 'thickness': region.get_value(month)}) - for month in dates.month + for month in dates.month ]) - thickness_df = pd.concat([region_df, thickness_df]) - + thickness_df = pd.concat([thickness_df, region_df]) + + thickness_df = thickness_df.drop_duplicates() thickness_df = thickness_df.set_index('time').sort_index() return thickness_df \ No newline at end of file From b8c156c226adc536d5c8bfb71ff081dea604026c Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Thu, 29 Feb 2024 15:13:39 +0000 Subject: [PATCH 03/65] adding splitting, to polystring and from polystring to boundary object --- meshiphi/mesh_generation/boundary.py | 57 ++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index 9649286a..a87fb0ec 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -43,7 +43,26 @@ def from_json(cls, config): obj = Boundary (lat_range , long_range , time_range) return obj + @classmethod + def from_poly_string(cls, poly_string): + """ + Creates a Boundary object from a string representation of a polygon. + """ + coords = poly_string.split("POLYGON ((")[1].split("))")[0].split(", ") + x = [float(coord.split(" ")[0]) for coord in coords] + y = [float(coord.split(" ")[1]) for coord in coords] + + lat_min = min(x) + lat_max = max(x) + long_min = min(y) + long_max = max(y) + + long_range = [long_min, long_max] + lat_range = [lat_min, lat_max] + bounds = Boundary(long_range, lat_range) + + return bounds def __init__(self, lat_range , long_range , time_range=None): """ @@ -290,6 +309,44 @@ def to_polygon(self): ) return polygon + def to_poly_string(self): + """ + Creates a string representation of the polygon from the extent of the boundary. + Will be a rectangle in mercator projection. + + Returns: + (str): + String representation of the shapely polygon with corners at + the min/max lat/long values of this boundary + """ + return f'POLYGON (({self.get_long_min():g} {self.get_lat_min():g}, ' + \ + f'{self.get_long_min():g} {self.get_lat_max():g}, ' + \ + f'{self.get_long_max():g} {self.get_lat_max():g}, ' + \ + f'{self.get_long_max():g} {self.get_lat_min():g}, ' + \ + f'{self.get_long_min():g} {self.get_lat_min():g}))' + + def split(self): + """ + Splits the boundary into four equal parts. + + Returns: + (list): + List of four new boundaries, each representing a quarter of the + original boundary. + """ + lat_mid = self.get_lat_min() + (self.get_height() / 2) + long_mid = self.get_long_min() + (self.get_width() / 2) + + bounds = [ + Boundary([self.get_lat_min(), lat_mid], [self.get_long_min(), long_mid]), + Boundary([lat_mid, self.get_lat_max()], [self.get_long_min(), long_mid]), + Boundary([self.get_lat_min(), lat_mid], [long_mid, self.get_long_max()]), + Boundary([lat_mid, self.get_lat_max()], [long_mid, self.get_long_max()]) + ] + + return bounds + + def __str__(self): From b685754d1bd2c81d659bfd6ec4582c7e657a34b4 Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Tue, 5 Mar 2024 13:16:59 +0000 Subject: [PATCH 04/65] adding 'split_and_replace' functionality to environmental_mesh.py --- meshiphi/mesh_generation/boundary.py | 1 + meshiphi/mesh_generation/environment_mesh.py | 352 ++++++++++++++++++- meshiphi/mesh_generation/neighbour_graph.py | 77 +++- 3 files changed, 428 insertions(+), 2 deletions(-) diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index a87fb0ec..3f99c537 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -337,6 +337,7 @@ def split(self): lat_mid = self.get_lat_min() + (self.get_height() / 2) long_mid = self.get_long_min() + (self.get_width() / 2) + # 0 = south_west, 1 = north_west, 2 = south_east, 3 = north_east bounds = [ Boundary([self.get_lat_min(), lat_mid], [self.get_long_min(), long_mid]), Boundary([lat_mid, self.get_lat_max()], [self.get_long_min(), long_mid]), diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index 883cd53d..321f07ec 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -110,6 +110,357 @@ def __init__(self, bounds, agg_cellboxes, neighbour_graph, config): self.neighbour_graph = neighbour_graph self.config = config + def get_cellbox(self, cellbox_id): + """ + returns the cellbox with the given id + + Args: + cellbox_id (string): the id of the cellbox to be returned + Returns: + AggregatedCellBox: the cellbox with the given id + """ + for cellbox in self.agg_cellboxes: + if str(cellbox.get_id()) == str(cellbox_id): + return cellbox + + def get_max_cellbox_id(self): + """ + returns the maximum cellbox id in the mesh + + Returns: + int: the maximum cellbox id + """ + max_id = 0 + for cellbox in self.agg_cellboxes: + if int(cellbox.get_id()) > max_id: + max_id = int(cellbox.get_id()) + return max_id + + # Splitting + def sim_split_cellbox(self, cellbox_id): + """ + splits the cellbox with the given id + + Args: + cellbox_id (string): the id of the cellbox to be split + Returns: + split_cells (list): a list of the new cellboxes created by the split + """ + cellbox = self.get_cellbox(cellbox_id) + + max_id = self.get_max_cellbox_id() + + # Copy agg_data, update id's + agg_data = cellbox.get_agg_data() + agg_data1 = agg_data.copy() + agg_data1['id'] = str(max_id + 1) + agg_data2 = agg_data.copy() + agg_data2['id'] = str(max_id + 2) + agg_data3 = agg_data.copy() + agg_data3['id'] = str(max_id + 3) + agg_data4 = agg_data.copy() + agg_data4['id'] = str(max_id + 4) + + bounds = cellbox.get_bounds() + split_bounds = bounds.split() + + cellbox1 = AggregatedCellBox(split_bounds[0], agg_data1, max_id + 1) + cellbox2 = AggregatedCellBox(split_bounds[1], agg_data2, max_id + 2) + cellbox3 = AggregatedCellBox(split_bounds[2], agg_data3, max_id + 3) + cellbox4 = AggregatedCellBox(split_bounds[3], agg_data4, max_id + 4) + + # Update neighbour graph + + + return [cellbox1, cellbox2, cellbox3, cellbox4] + + def split_and_replace(self, cellbox_id): + """ + splits the cellbox with the given id and replaces it with the new cellboxes + + Args: + cellbox_id (string): the id of the cellbox to be split + """ + + split_cellboxes = self.sim_split_cellbox(cellbox_id) + + for cellbox in split_cellboxes: + self.agg_cellboxes.append(cellbox) + + north_west_index = int(split_cellboxes[1].get_agg_data()['id']) + north_east_index = int(split_cellboxes[3].get_agg_data()['id']) + south_west_index = int(split_cellboxes[0].get_agg_data()['id']) + south_east_index = int(split_cellboxes[2].get_agg_data()['id']) + + south_neighbour_index = self.neighbour_graph.get_neighbours(cellbox_id, "4") + north_neighbour_indx = self.neighbour_graph.get_neighbours(cellbox_id, "-4") + east_neighbour_indx = self.neighbour_graph.get_neighbours(cellbox_id, "2") + west_neighbour_indx = self.neighbour_graph.get_neighbours(cellbox_id, "-2") + + + # initialize the neighbour map of SW cellbox + sw_neighbour_map = { + "1": [north_east_index], + "2": [south_east_index], + "3": [], + "4": [], + "-1": self.neighbour_graph.get_neighbours(cellbox_id, "-1"), + "-2": [], + "-3": [], + "-4": [north_west_index] + } + # fill remaining neighbour map + sw_neighbour_map = self.fill_sw_neighbour_map(sw_neighbour_map, south_west_index, south_neighbour_index, west_neighbour_indx) + self.neighbour_graph.add_node(str(south_west_index), sw_neighbour_map) + + # initialize the neighbour map of NW cellbox + nw_neighbour_map = { + "1": [], + "2": [north_east_index], + "3": [south_east_index], + "4": [south_west_index], + "-1": [], + "-2": [], + "-3": self.neighbour_graph.get_neighbours(cellbox_id, "-3"), + "-4": [] + } + # fill remaining neighbour map + nw_neighbour_map = self.fill_nw_neighbour_map(nw_neighbour_map, north_west_index, north_neighbour_indx, west_neighbour_indx) + self.neighbour_graph.add_node(str(north_west_index), nw_neighbour_map) + + # initialize the neighbour map of NE cellbox + ne_neighbour_map = { + "1": self.neighbour_graph.get_neighbours(cellbox_id, "1"), + "2": [], + "3": [], + "4": [south_east_index], + "-1": [south_west_index], + "-2": [north_west_index], + "-3": [], + "-4": [] + } + # fill remaining neighbour map + ne_neighbour_map = self.fill_ne_neighbour_map(ne_neighbour_map, north_east_index, north_neighbour_indx, east_neighbour_indx) + self.neighbour_graph.add_node(str(north_east_index), ne_neighbour_map) + + # initialize the neighbour map of SE cellbox + se_neighbour_map = { + "1": [], + "2": [], + "3": self.neighbour_graph.get_neighbours(cellbox_id, "3"), + "4": [], + "-1": [], + "-2": [south_west_index], + "-3": [north_west_index], + "-4": [north_east_index] + } + # fill remaining neighbour map + se_neighbour_map = self.fill_se_neighbour_map(se_neighbour_map, south_east_index, south_neighbour_index, east_neighbour_indx) + self.neighbour_graph.add_node(str(south_east_index), se_neighbour_map) + + + + # update corner neighbours + ne_corner_index = self.neighbour_graph.get_neighbours(cellbox_id, "1") + se_corner_index = self.neighbour_graph.get_neighbours(cellbox_id, "3") + nw_corner_index = self.neighbour_graph.get_neighbours(cellbox_id, "-3") + sw_corner_index = self.neighbour_graph.get_neighbours(cellbox_id, "-1") + + if len(ne_corner_index) > 0: + self.neighbour_graph.update_neighbour(str(ne_corner_index[0]), "-1", [north_east_index]) + if len(se_corner_index) > 0: + self.neighbour_graph.update_neighbour(str(se_corner_index[0]), "-3", [south_east_index]) + if len(nw_corner_index) > 0: + self.neighbour_graph.update_neighbour(str(nw_corner_index[0]), "3", [north_west_index]) + if len(sw_corner_index) > 0: + self.neighbour_graph.update_neighbour(str(sw_corner_index[0]), "1", [south_west_index]) + + # update sides neighbours + ne_bounds = self.get_cellbox(north_east_index).get_bounds() + nw_bounds = self.get_cellbox(north_west_index).get_bounds() + se_bounds = self.get_cellbox(south_east_index).get_bounds() + sw_bounds = self.get_cellbox(south_west_index).get_bounds() + + # update north cellbox neighbours + self.neighbour_graph.remove_node_from_neighbours(cellbox_id, -4) + + for indx in north_neighbour_indx: + cellbox_bounds = self.get_cellbox(indx).get_bounds() + + crossing_case = self.neighbour_graph.get_neighbour_case_bounds(cellbox_bounds, ne_bounds) + if crossing_case != 0: + self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), north_east_index) + + crossing_case = self.neighbour_graph.get_neighbour_case_bounds(cellbox_bounds, nw_bounds) + if crossing_case != 0: + self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), north_west_index) + + # update south cellbox neighbours + self.neighbour_graph.remove_node_from_neighbours(cellbox_id, 4) + + for indx in south_neighbour_index: + cellbox_bounds = self.get_cellbox(indx).get_bounds() + + crossing_case = self.neighbour_graph.get_neighbour_case_bounds(cellbox_bounds, se_bounds) + if crossing_case != 0: + self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), south_east_index) + + crossing_case = self.neighbour_graph.get_neighbour_case_bounds(cellbox_bounds, sw_bounds) + if crossing_case != 0: + self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), south_west_index) + + # update east cellbox neighbours + self.neighbour_graph.remove_node_from_neighbours(cellbox_id, 2) + + for indx in east_neighbour_indx: + cellbox_bounds = self.get_cellbox(indx).get_bounds() + + crossing_case = self.neighbour_graph.get_neighbour_case_bounds(cellbox_bounds, ne_bounds) + if crossing_case != 0: + self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), north_east_index) + + crossing_case = self.neighbour_graph.get_neighbour_case_bounds(cellbox_bounds, se_bounds) + if crossing_case != 0: + self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), south_east_index) + + # update west cellbox neighbours + self.neighbour_graph.remove_node_from_neighbours(cellbox_id, -2) + + for indx in west_neighbour_indx: + cellbox_bounds = self.get_cellbox(indx).get_bounds() + + crossing_case = self.neighbour_graph.get_neighbour_case_bounds(cellbox_bounds, nw_bounds) + if crossing_case != 0: + self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), north_west_index) + + crossing_case = self.neighbour_graph.get_neighbour_case_bounds(cellbox_bounds, sw_bounds) + if crossing_case != 0: + self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), south_west_index) + + # remove original cellbox from mesh. + cellbox = self.get_cellbox(cellbox_id) + self.agg_cellboxes.remove(cellbox) + + self.neighbour_graph.remove_node(cellbox_id) + + + def fill_se_neighbour_map(self, se_neighbour_map, se_neighbour_id, south_neighbour_index, east_neighbour_indx): + """ + fills the south east neighbour map with the given values + Args: + se_neighbour_map (dict): the map to be filled + se_neighbour_ID (string): the index of the south east cellbox + south_neighbour_index (List): the index of the south neighbours of the parent cellbox + east_neighbour_indx (List): the index of the east neighbour of the parent cellbox + Returns: + se_neighbour_map (dict): the filled map + """ + se_bounds = self.get_cellbox(se_neighbour_id).get_bounds() + + for indx in south_neighbour_index: + neighbour_bounds = self.get_cellbox(indx).get_bounds() + if self.neighbour_graph.get_neighbour_case_bounds(se_bounds, neighbour_bounds) == 4: + se_neighbour_map["4"].append(indx) + if self.neighbour_graph.get_neighbour_case_bounds(se_bounds, neighbour_bounds) == -1: + se_neighbour_map["-1"].append(indx) + + for indx in east_neighbour_indx: + neighbour_bounds = self.get_cellbox(indx).get_bounds() + if self.neighbour_graph.get_neighbour_case_bounds(se_bounds, neighbour_bounds) == 2: + se_neighbour_map["2"].append(indx) + if self.neighbour_graph.get_neighbour_case_bounds(se_bounds, neighbour_bounds) == 1: + se_neighbour_map["1"].append(indx) + + return se_neighbour_map + + def fill_ne_neighbour_map(self, ne_neighbour_map, ne_neighbour_id, north_neighbour_indx, east_neighbour_indx): + """ + fills the north east neighbour map with the given values + Args: + ne_neighbour_map (dict): the map to be filled + ne_neighbour_ID (string): the index of the north east cellbox + north_neighbour_index (List): the index of the north neighbours of the parent cellbox + east_neighbour_indx (List): the index of the east neighbour of the parent cellbox + Returns: + ne_neighbour_map (dict): the filled map + """ + ne_bounds = self.get_cellbox(ne_neighbour_id).get_bounds() + + for indx in north_neighbour_indx: + neighbour_bounds = self.get_cellbox(indx).get_bounds() + if self.neighbour_graph.get_neighbour_case_bounds(ne_bounds, neighbour_bounds) == -4: + ne_neighbour_map["-4"].append(indx) + if self.neighbour_graph.get_neighbour_case_bounds(ne_bounds, neighbour_bounds) == -3: + ne_neighbour_map["-3"].append(indx) + + for indx in east_neighbour_indx: + neighbour_bounds = self.get_cellbox(indx).get_bounds() + if self.neighbour_graph.get_neighbour_case_bounds(ne_bounds, neighbour_bounds) == 2: + ne_neighbour_map["2"].append(indx) + if self.neighbour_graph.get_neighbour_case_bounds(ne_bounds, neighbour_bounds) == 3: + ne_neighbour_map["3"].append(indx) + + return ne_neighbour_map + + def fill_sw_neighbour_map(self, sw_neighbour_map, sw_neighbour_id, south_neighbour_index, west_neighbour_indx): + """ + fills the south west neighbour map with the given values + Args: + sw_neighbour_map (dict): the map to be filled + sw_neighbour_ID (string): the index of the south west cellbox + south_neighbour_index (List): the index of the south neighbours of the parent cellbox + west_neighbour_indx (List): the index of the west neighbour of the parent cellbox + Returns: + sw_neighbour_map (dict): the filled map + """ + sw_bounds = self.get_cellbox(sw_neighbour_id).get_bounds() + + for indx in south_neighbour_index: + neighbour_bounds = self.get_cellbox(indx).get_bounds() + if self.neighbour_graph.get_neighbour_case_bounds(sw_bounds, neighbour_bounds) == 3: + sw_neighbour_map["3"].append(indx) + if self.neighbour_graph.get_neighbour_case_bounds(sw_bounds, neighbour_bounds) == 4: + sw_neighbour_map["4"].append(indx) + + for indx in west_neighbour_indx: + neighbour_bounds = self.get_cellbox(indx).get_bounds() + if self.neighbour_graph.get_neighbour_case_bounds(sw_bounds, neighbour_bounds) == -2: + sw_neighbour_map["-2"].append(indx) + if self.neighbour_graph.get_neighbour_case_bounds(sw_bounds, neighbour_bounds) == -3: + sw_neighbour_map["-3"].append(indx) + + return sw_neighbour_map + + def fill_nw_neighbour_map(self, nw_neighbour_map, nw_neighbour_id, north_neighbour_indx, west_neighbour_indx): + """ + fills the north west neighbour map with the given values + Args: + nw_neighbour_map (dict): the map to be filled + nw_neighbour_ID (string): the index of the north west cellbox + north_neighbour_index (List): the index of the north neighbours of the parent cellbox + west_neighbour_indx (List): the index of the west neighbour of the parent cellbox + Returns: + nw_neighbour_map (dict): the filled map + """ + nw_bounds = self.get_cellbox(nw_neighbour_id).get_bounds() + + for indx in north_neighbour_indx: + neighbour_bounds = self.get_cellbox(indx).get_bounds() + if self.neighbour_graph.get_neighbour_case_bounds(nw_bounds, neighbour_bounds) == -4: + nw_neighbour_map["-4"].append(indx) + if self.neighbour_graph.get_neighbour_case_bounds(nw_bounds, neighbour_bounds) == 1: + nw_neighbour_map["1"].append(indx) + + for indx in west_neighbour_indx: + neighbour_bounds = self.get_cellbox(indx).get_bounds() + if self.neighbour_graph.get_neighbour_case_bounds(nw_bounds, neighbour_bounds) == -2: + nw_neighbour_map["-2"].append(indx) + if self.neighbour_graph.get_neighbour_case_bounds(nw_bounds, neighbour_bounds) == -1: + nw_neighbour_map["-1"].append(indx) + + return nw_neighbour_map + + def to_json(self): """ Returns this Mesh converted to a JSON object.\n @@ -155,7 +506,6 @@ def to_png(self, params_file, path): plotter.save(path) - def to_geojson(self, params_file = None): """ Returns the cellboxes of this mesh converted to a geoJSON format.\n diff --git a/meshiphi/mesh_generation/neighbour_graph.py b/meshiphi/mesh_generation/neighbour_graph.py index 630f6bc3..10d0bc76 100644 --- a/meshiphi/mesh_generation/neighbour_graph.py +++ b/meshiphi/mesh_generation/neighbour_graph.py @@ -160,7 +160,7 @@ def remove_node_from_neighbours(self, cellbox_indx, direction): self.neighbour_graph[indx][-1*direction].remove(cellbox_indx) except KeyError: self.neighbour_graph[str(indx)][str(-1*direction)].remove(int(cellbox_indx)) - + def update_corner_neighbours(self, cellbox_indx, north_west_indx, north_east_indx, south_west_indx, south_east_indx): ''' method that updates the corner neighbours of cellbox_indx with the given indeces @@ -181,6 +181,72 @@ def update_corner_neighbours(self, cellbox_indx, north_west_indx, north_east_ind if len(south_west_corner_indx) > 0: self.neighbour_graph[south_west_corner_indx[0]][Direction.north_east] = [south_west_indx] + def get_neighbour_case_bounds(self, bounds_a, bounds_b): + """ + Given two bounds (bounds_a, bounds_b) returns a case number + representing where the two bounds are touching. + + Args: + bounds_a (Bounds): starting Bounds + bounds_b (Bounds): destination Bounds + + Returns: + int: an int representing the direction of the adjacency between input bounds_a and bounds_b. The meaning of each case is as follows - + + case 0 -> Bounds are not neighbours + + case 1 -> bounds_b is the North-East corner of bounds_a\n + case 2 -> bounds_b is East of bounds_a\n + case 3 -> bounds_b is the South-East corner of bounds_a\n + case 4 -> bounds_b is South of bounds_a\n + case -1 -> bounds_b is the South-West corner of bounds_a\n + case -2 -> bounds_b is West of bounds_a\n + case -3 -> bounds_b is the North-West corner of bounds_a\n + case -4 -> bounds_b is North of bounds_a\n + """ + long_a = bounds_a.get_long_min() + lat_a = bounds_a.get_lat_min() + long_b = bounds_b.get_long_min() + lat_b = bounds_b.get_lat_min() + + if (long_a + bounds_a.get_width()) == long_b and ( + lat_a + bounds_a.get_height()) == lat_b: + return Direction.north_east + + if (long_a + bounds_a.get_width() == long_b) and ( + lat_b < (lat_a + bounds_a.get_height())) and ( + (lat_b + bounds_b.get_height()) > lat_a): + return Direction.east + + if (long_a + bounds_a.get_width()) == long_b and ( + lat_a == lat_b + bounds_b.get_height()): + return Direction.south_east + + if ((lat_b + bounds_b.get_height()) == lat_a) and ( + (long_b + bounds_b.get_width()) > long_a) and ( + long_b < (long_a + bounds_a.get_width())): + return Direction.south + + if long_a == (long_b + bounds_b.get_width()) and lat_a == ( + lat_b + bounds_b.get_height()): + return Direction.south_west + + if (long_b + bounds_b.get_width() == long_a) and ( + lat_b < (lat_a + bounds_a.get_height())) and ( + (lat_b + bounds_b.get_height()) > lat_a): + return Direction.west + + if long_a == (long_b + bounds_b.get_width()) and ( + lat_a + bounds_a.get_height() == lat_b): + return Direction.north_west + + if (lat_b == (lat_a + bounds_a.get_height())) and ( + (long_b + bounds_b.get_width()) > long_a) and ( + long_b < (long_a + bounds_a.get_width())): + return Direction.north + + return 0 # Cells are not neighbours. + def get_neighbour_case(self, cellbox_a, cellbox_b): """ Given two cellboxes (cellbox_a, cellbox_b) returns a case number @@ -209,6 +275,7 @@ def get_neighbour_case(self, cellbox_a, cellbox_b): lat_a = cellbox_a.get_bounds().get_lat_min() long_b = cellbox_b.get_bounds().get_long_min() lat_b = cellbox_b.get_bounds().get_lat_min() + def on_global_bound(cellbox_a , cellbox_b): """ Given two cellboxes (cellbox_a, cellbox_b) returns a boolean @@ -224,30 +291,38 @@ def on_global_bound(cellbox_a , cellbox_b): return long_a == -180 and cellbox_b.get_bounds().get_long_max() == 180 or long_b == -180 and cellbox_a.get_bounds().get_long_max() == 180 if self.is_global_mesh() and on_global_bound (cellbox_a , cellbox_b) : return self.get_global_mesh_neighbour_case(cellbox_a, cellbox_b) + if (long_a + cellbox_a.get_bounds().get_width()) == long_b and ( lat_a + cellbox_a.get_bounds().get_height()) == lat_b: return Direction.north_east + if (long_a + cellbox_a.get_bounds().get_width() == long_b) and ( lat_b < (lat_a + cellbox_a.get_bounds().get_height())) and ( (lat_b + cellbox_b.get_bounds().get_height()) > lat_a): return Direction.east + if (long_a + cellbox_a.get_bounds().get_width()) == long_b and ( lat_a == lat_b + cellbox_b.get_bounds().get_height()): return Direction.south_east + if ((lat_b + cellbox_b.get_bounds().get_height()) == lat_a) and ( (long_b + cellbox_b.get_bounds().get_width()) > long_a) and ( long_b < (long_a + cellbox_a.get_bounds().get_width())): return Direction.south + if long_a == (long_b + cellbox_b.get_bounds().get_width()) and lat_a == ( lat_b + cellbox_b.get_bounds().get_height()): return Direction.south_west + if (long_b + cellbox_b.get_bounds().get_width() == long_a) and ( lat_b < (lat_a + cellbox_a.get_bounds().get_height())) and ( (lat_b + cellbox_b.get_bounds().get_height()) > lat_a): return Direction.west + if long_a == (long_b + cellbox_b.get_bounds().get_width()) and ( lat_a + cellbox_a.get_bounds().get_height() == lat_b): return Direction.north_west + if (lat_b == (lat_a + cellbox_a.get_bounds().get_height())) and ( (long_b + cellbox_b.get_bounds().get_width()) > long_a) and ( long_b < (long_a + cellbox_a.get_bounds().get_width())): From d89eb6aec1931782ad889f8d87ad661c94904773 Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Tue, 5 Mar 2024 14:14:10 +0000 Subject: [PATCH 05/65] adding additional comments --- meshiphi/mesh_generation/environment_mesh.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index 321f07ec..a399f406 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -182,22 +182,24 @@ def split_and_replace(self, cellbox_id): cellbox_id (string): the id of the cellbox to be split """ + # Create new cellboxes and append to agg_cellboxes split_cellboxes = self.sim_split_cellbox(cellbox_id) - for cellbox in split_cellboxes: self.agg_cellboxes.append(cellbox) + # get ID's of new cellboxes north_west_index = int(split_cellboxes[1].get_agg_data()['id']) north_east_index = int(split_cellboxes[3].get_agg_data()['id']) south_west_index = int(split_cellboxes[0].get_agg_data()['id']) south_east_index = int(split_cellboxes[2].get_agg_data()['id']) + # Get neighbours of original cellbox south_neighbour_index = self.neighbour_graph.get_neighbours(cellbox_id, "4") north_neighbour_indx = self.neighbour_graph.get_neighbours(cellbox_id, "-4") east_neighbour_indx = self.neighbour_graph.get_neighbours(cellbox_id, "2") west_neighbour_indx = self.neighbour_graph.get_neighbours(cellbox_id, "-2") - + # ================== Create Neighbour Maps ================== # initialize the neighbour map of SW cellbox sw_neighbour_map = { "1": [north_east_index], @@ -258,7 +260,7 @@ def split_and_replace(self, cellbox_id): se_neighbour_map = self.fill_se_neighbour_map(se_neighbour_map, south_east_index, south_neighbour_index, east_neighbour_indx) self.neighbour_graph.add_node(str(south_east_index), se_neighbour_map) - + # ================== Update Neighbours of original cellbox ================== # update corner neighbours ne_corner_index = self.neighbour_graph.get_neighbours(cellbox_id, "1") @@ -275,6 +277,7 @@ def split_and_replace(self, cellbox_id): if len(sw_corner_index) > 0: self.neighbour_graph.update_neighbour(str(sw_corner_index[0]), "1", [south_west_index]) + # update sides neighbours ne_bounds = self.get_cellbox(north_east_index).get_bounds() nw_bounds = self.get_cellbox(north_west_index).get_bounds() @@ -295,6 +298,7 @@ def split_and_replace(self, cellbox_id): if crossing_case != 0: self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), north_west_index) + # update south cellbox neighbours self.neighbour_graph.remove_node_from_neighbours(cellbox_id, 4) @@ -309,6 +313,7 @@ def split_and_replace(self, cellbox_id): if crossing_case != 0: self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), south_west_index) + # update east cellbox neighbours self.neighbour_graph.remove_node_from_neighbours(cellbox_id, 2) @@ -323,6 +328,7 @@ def split_and_replace(self, cellbox_id): if crossing_case != 0: self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), south_east_index) + # update west cellbox neighbours self.neighbour_graph.remove_node_from_neighbours(cellbox_id, -2) @@ -337,10 +343,10 @@ def split_and_replace(self, cellbox_id): if crossing_case != 0: self.neighbour_graph.add_neighbour(str(indx), str(crossing_case), south_west_index) + # remove original cellbox from mesh. cellbox = self.get_cellbox(cellbox_id) self.agg_cellboxes.remove(cellbox) - self.neighbour_graph.remove_node(cellbox_id) From 8f4bb93cdf6e059f285a7f1b5dd57530f7586a63 Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Tue, 5 Mar 2024 15:12:57 +0000 Subject: [PATCH 06/65] updating version number --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index b204ad56..dd12c5b5 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.1.6" +__version__ = "2.0.1" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" From 7404b0214a4d96788c518f5b2d6df71e93413843 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 27 Feb 2024 10:12:26 +0000 Subject: [PATCH 07/65] Culling POLYGON EMPTY geometries from data --- meshiphi/dataloaders/lut/thickness.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/meshiphi/dataloaders/lut/thickness.py b/meshiphi/dataloaders/lut/thickness.py index 90d43d6b..61bb69ac 100644 --- a/meshiphi/dataloaders/lut/thickness.py +++ b/meshiphi/dataloaders/lut/thickness.py @@ -96,12 +96,19 @@ def import_data(self, bounds): dates = pd.date_range(start=bounds.get_time_min(), end=bounds.get_time_max()) - thickness_df = pd.concat([ - pd.DataFrame({'time': dates, - 'geometry': region.geometry & bounds_polygon, - 'thickness': region.get_value(month)}) - for region in regions for month in dates.month - ]) + thickness_df = pd.DataFrame() + + for region in regions: + + if region.geometry & bounds_polygon: + region_df = pd.concat([ + pd.DataFrame({'time': dates, + 'geometry': region.geometry & bounds_polygon, + 'thickness': region.get_value(month)}) + for month in dates.month + ]) + + thickness_df = pd.concat([region_df, thickness_df]) thickness_df = thickness_df.set_index('time').sort_index() From 12554d3fd38edc231497183558cd62d6ba167d6f Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:08:05 +0000 Subject: [PATCH 08/65] Removing LINESTRING and duplicate entries from data --- meshiphi/dataloaders/lut/thickness.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/meshiphi/dataloaders/lut/thickness.py b/meshiphi/dataloaders/lut/thickness.py index 61bb69ac..2cc5d016 100644 --- a/meshiphi/dataloaders/lut/thickness.py +++ b/meshiphi/dataloaders/lut/thickness.py @@ -3,7 +3,7 @@ import logging import pandas as pd -from shapely import wkt +from shapely import wkt, Polygon # Mapping of month number to season per hemisphere @@ -99,17 +99,21 @@ def import_data(self, bounds): thickness_df = pd.DataFrame() for region in regions: - - if region.geometry & bounds_polygon: + + intersection = region.geometry & bounds_polygon + if intersection.geom_type in ['Polygon', 'MultiPolygon'] and \ + intersection != Polygon(): + region_df = pd.concat([ pd.DataFrame({'time': dates, 'geometry': region.geometry & bounds_polygon, 'thickness': region.get_value(month)}) - for month in dates.month + for month in dates.month ]) - thickness_df = pd.concat([region_df, thickness_df]) - + thickness_df = pd.concat([thickness_df, region_df]) + + thickness_df = thickness_df.drop_duplicates() thickness_df = thickness_df.set_index('time').sort_index() return thickness_df \ No newline at end of file From e9c313ed1946ae3c75adf19f492dd8d8e9def6ac Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 5 Mar 2024 16:17:33 +0000 Subject: [PATCH 09/65] Increment version number --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index b204ad56..6c6516ab 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.1.6" +__version__ = "2.0.2" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" From fcdae02b2952bf42c1a4e7158caf8955c1155a04 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 6 Mar 2024 10:32:15 +0000 Subject: [PATCH 10/65] Prepping for data subsets --- meshiphi/mesh_generation/cellbox.py | 14 ++++++++++++++ meshiphi/mesh_generation/metadata.py | 25 +++++++++++-------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/meshiphi/mesh_generation/cellbox.py b/meshiphi/mesh_generation/cellbox.py index c632808b..e4f40109 100644 --- a/meshiphi/mesh_generation/cellbox.py +++ b/meshiphi/mesh_generation/cellbox.py @@ -52,6 +52,7 @@ def __init__(self, bounds, id): self.split_depth = 0 self.data_source = None self.id = id + self.data_subset = None ######## setters and getters ######## def set_minimum_datapoints(self, minimum_datapoints): @@ -97,6 +98,12 @@ def set_id(self, id): """ self.id = id + def set_data_subset(self, data_subset): + """ + sets the cellboxes data subset + """ + self.data_subset = data_subset + def get_id(self): """ method returns cellbox cell id @@ -137,6 +144,13 @@ def get_split_depth(self): has been split to reach it's current size. """ return self.split_depth + + + def get_data_subset(self): + """ + gets the cellboxes data subset + """ + return self.data_subset ###################################################### # methods used for splitting a cellbox diff --git a/meshiphi/mesh_generation/metadata.py b/meshiphi/mesh_generation/metadata.py index 7f881790..3bddae2f 100644 --- a/meshiphi/mesh_generation/metadata.py +++ b/meshiphi/mesh_generation/metadata.py @@ -37,6 +37,12 @@ def get_data_loader(self): """ return self.data_loader + def set_data_loader(self , data_loader): + """ + sets the data loader + """ + self.data_loader = data_loader + def get_splitting_conditions(self): """ returns a list of the splitting conditions @@ -44,29 +50,20 @@ def get_splitting_conditions(self): return self.splitting_conditions - def set_data_loader(self , data_loader): - """ - sets the data loader - """ - self.data_loader = data_loader - - def set_splitting_conditions(self , splitting_conditions): """ sets the splitting conditions """ self.splitting_conditions = splitting_conditions - def set_value_fill_type(self , value_fill_type): - """ - sets the value fill type - """ - self.value_fill_type = value_fill_type - def get_value_fill_type(self ): """ returns thevalue fill type """ return self.value_fill_type - + def set_value_fill_type(self , value_fill_type): + """ + sets the value fill type + """ + self.value_fill_type = value_fill_type From 1522d12efa2220844088c55d7ea24ff00d39e3e9 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 6 Mar 2024 13:35:58 +0000 Subject: [PATCH 11/65] Preparing dataloaders for cellbox data subsets --- meshiphi/dataloaders/scalar/abstract_scalar.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/meshiphi/dataloaders/scalar/abstract_scalar.py b/meshiphi/dataloaders/scalar/abstract_scalar.py index 992a526f..acf9ba7b 100644 --- a/meshiphi/dataloaders/scalar/abstract_scalar.py +++ b/meshiphi/dataloaders/scalar/abstract_scalar.py @@ -426,7 +426,7 @@ def get_dp_from_coord_xr(data, name, long, lat, return_coords): elif type(self.data) == xr.core.dataset.Dataset: return get_dp_from_coord_xr(self.data, data_name, long, lat, return_coords) - def get_value(self, bounds, agg_type=None, skipna=True): + def get_value(self, bounds, data=None, agg_type=None, skipna=True): ''' Retrieve aggregated value from within bounds @@ -550,7 +550,7 @@ def get_value_from_xr(dps, bounds, agg_type, skipna): agg_type = self.aggregate_type # Limit data series to just the data, excluding coords/index - dps = self.trim_datapoints(bounds)[self.data_name] + dps = self.trim_datapoints(bounds, data=data)[self.data_name] if type(self.data) == pd.core.frame.DataFrame: value = get_value_from_df(dps, bounds, agg_type, skipna) @@ -560,7 +560,7 @@ def get_value_from_xr(dps, bounds, agg_type, skipna): # Cast to regular float before returning so can be saved in JSON later return {self.data_name: float(value)} - def get_hom_condition(self, bounds, splitting_conds): + def get_hom_condition(self, bounds, splitting_conds, data=None): ''' Retrieves homogeneity condition of data within boundary. @@ -674,7 +674,7 @@ def get_hom_condition_from_xr(dps, splitting_conds): if 'split_lock' not in splitting_conds: splitting_conds['split_lock'] = False - dps = self.trim_datapoints(bounds)[self.data_name] + dps = self.trim_datapoints(bounds, data=data)[self.data_name] # Retrieve datapoints to analyse if type(dps) == pd.core.series.Series: return get_hom_condition_from_df(dps, splitting_conds) From d2247f6c18e0fd8315b509031a7eca2fff41a828 Mon Sep 17 00:00:00 2001 From: George Date: Wed, 6 Mar 2024 13:58:03 +0000 Subject: [PATCH 12/65] [#38] Add ecmwflibs to requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 187c7388..b72a7259 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ jsonschema matplotlib netcdf4 cfgrib +ecmwflibs numpy>=1.21.6,<=1.24.1 pandas>=1.3.5,<=1.4.4 pytest From d1318d017a232dc98e36ad0a6cb14f3475a65f2e Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 7 Mar 2024 14:35:20 +0000 Subject: [PATCH 13/65] Added data subsets to cellbox metadata --- meshiphi/mesh_generation/cellbox.py | 61 +++++++++++++++--------- meshiphi/mesh_generation/mesh_builder.py | 25 +++++++++- meshiphi/mesh_generation/metadata.py | 24 +++++++++- 3 files changed, 84 insertions(+), 26 deletions(-) diff --git a/meshiphi/mesh_generation/cellbox.py b/meshiphi/mesh_generation/cellbox.py index e4f40109..b847cb4d 100644 --- a/meshiphi/mesh_generation/cellbox.py +++ b/meshiphi/mesh_generation/cellbox.py @@ -21,7 +21,9 @@ import numpy as np from meshiphi.mesh_generation.boundary import Boundary from meshiphi.mesh_generation.aggregated_cellbox import AggregatedCellBox +from meshiphi.mesh_generation.metadata import Metadata import logging +import time @@ -52,7 +54,6 @@ def __init__(self, bounds, id): self.split_depth = 0 self.data_source = None self.id = id - self.data_subset = None ######## setters and getters ######## def set_minimum_datapoints(self, minimum_datapoints): @@ -98,12 +99,6 @@ def set_id(self, id): """ self.id = id - def set_data_subset(self, data_subset): - """ - sets the cellboxes data subset - """ - self.data_subset = data_subset - def get_id(self): """ method returns cellbox cell id @@ -144,13 +139,6 @@ def get_split_depth(self): has been split to reach it's current size. """ return self.split_depth - - - def get_data_subset(self): - """ - gets the cellboxes data subset - """ - return self.data_subset ###################################################### # methods used for splitting a cellbox @@ -184,11 +172,11 @@ def should_split(self, stop_index): for index in range(0, stop_index): current_data_source = self.get_data_source()[index] data_loader = current_data_source.get_data_loader() + data_subset = current_data_source.get_data_subset() for splitting_cond in current_data_source.get_splitting_conditions(): hom_cond = data_loader.get_hom_condition( - self.bounds, splitting_cond) + self.bounds, splitting_cond, data=data_subset) hom_conditions.append(hom_cond) - if "HOM" in hom_conditions: return False if "MIN" in hom_conditions: @@ -221,9 +209,10 @@ def should_split_breadth_first(self): hom_conditions = [] for current_data_source in self.data_source: data_loader = current_data_source.get_data_loader() + data_subset = current_data_source.get_data_subset() for splitting_cond in current_data_source.get_splitting_conditions(): hom_cond = data_loader.get_hom_condition( - self.bounds, splitting_cond) + self.bounds, splitting_cond, data=data_subset) hom_conditions.append(hom_cond) if "HOM" in hom_conditions: @@ -251,9 +240,19 @@ def split(self, start_id): # set CellBox split_depth, data_source and parent for split_box in split_boxes: split_box.set_split_depth(self.get_split_depth() + 1) - split_box.set_data_source(self.get_data_source()) + # Create metadata with data subset + split_box_data_sources = [] + for source in self.get_data_source(): + # Extract data for each new cellbox + data_subset = source.data_loader.trim_datapoints(split_box.bounds, data=source.data_subset) + # Update metadata with that (rest stays the same) + split_box_data_source = Metadata(source.get_data_loader(), + source.get_splitting_conditions(), + source.get_value_fill_type(), + data_subset) + split_box_data_sources += [split_box_data_source] + split_box.set_data_source(split_box_data_sources) split_box.set_parent(self) - return split_boxes def create_splitted_cell_boxes(self, index): @@ -304,8 +303,10 @@ def aggregate(self): agg_dict = {} for source in self.get_data_source(): loader = source.get_data_loader() + data_subset = source.get_data_subset() + # get the aggregated value from the associated DataLoader - agg_value = loader.get_value(self.bounds) + agg_value = loader.get_value(self.bounds, data=data_subset) data_name = loader.data_name parent = self.get_parent() # check if the data name has many entries (ex. uC,uV) @@ -317,7 +318,15 @@ def aggregate(self): if source.get_value_fill_type() == 'parent': # if the agg_value empty and get_value_fill_type is parent, then use the parent bounds while parent is not None and np.isnan(agg_value[data_name]): - agg_value = loader.get_value(parent.bounds) + # Search through parent metadata to find match + for parent_source in parent.get_data_source(): + if parent_source.get_data_loader() == source.get_data_loader(): + break + # If no match found + else: + raise ValueError('Dataloader not found in parent') + parent_data_subset = parent_source.get_data_subset() + agg_value = loader.get_value(parent.bounds, data=parent_data_subset) parent = parent.get_parent() else: # not parent, so either float or Nan so set the agg_Data to value_fill_type agg_value[data_name] = source.get_value_fill_type() @@ -346,7 +355,15 @@ def check_vector_data(self, source, loader, agg_value, data_name): if source.get_value_fill_type() == 'parent': # if the agg_value empty and get_value_fill_type is parent, then use the parent bounds while parent is not None and np.isnan(agg_value[name]): - agg_value[name] = loader.get_value(parent.bounds)[name] + # Search through parent metadata to find match + for parent_source in parent.get_data_source(): + if parent_source.get_data_loader() == source.get_data_loader(): + break + # If no match found + else: + raise ValueError('Dataloader not found in parent') + parent_data_subset = parent_source.get_data_subset() + agg_value[name] = loader.get_value(parent.bounds, data=parent_data_subset)[name] parent = parent.get_parent() else: # not parent, so either float or Nan so set the agg_Data to value_fill_type agg_value[data_name] = source.get_value_fill_type() diff --git a/meshiphi/mesh_generation/mesh_builder.py b/meshiphi/mesh_generation/mesh_builder.py index b4e0e1b5..e8e4fa8c 100644 --- a/meshiphi/mesh_generation/mesh_builder.py +++ b/meshiphi/mesh_generation/mesh_builder.py @@ -113,10 +113,18 @@ def __init__(self, config): # checking to avoid any dummy cellboxes (the ones that was splitted and replaced) logging.info("Assigning data sources to cellboxes...") for cellbox in cellboxes: + # Initialise data to be area within bounds of cellbox + + # for i, source in enumerate(meta_data_list): + # # Add this to the metadata of the cellbox + # source.set_data_subset(data_subsets[i]) + if isinstance(cellbox, CellBox): cellbox.set_minimum_datapoints(min_datapoints) # assign meta data to each cellbox - cellbox.set_data_source(meta_data_list) + updated_meta_data_list = self.initialize_meta_data_subsets(cellbox.bounds, meta_data_list) + cellbox.set_data_source(updated_meta_data_list) + logging.info("Initialising neighbour graph...") @@ -158,11 +166,24 @@ def initialize_meta_data(self, bounds, min_datapoints): data_source['params']['files'] = loader.files meta_data_obj = Metadata( - loader, updated_splitting_cond, value_fill_type) + loader, updated_splitting_cond, value_fill_type, loader.data) meta_data_list.append(meta_data_obj) return meta_data_list + def initialize_meta_data_subsets(self, bounds, meta_data_list): + logging.debug(f'Initilizing data subset for {bounds}') + updated_meta_data_list = [] + for source in meta_data_list: + data_subset = source.data_loader.trim_datapoints(bounds) + updated_meta_data_list += [Metadata(source.get_data_loader(), + source.get_splitting_conditions(), + source.get_value_fill_type(), + data_subset)] + return updated_meta_data_list + + + def check_value_fill_type(self, data_source): def is_float(element: any) -> bool: if element is None: diff --git a/meshiphi/mesh_generation/metadata.py b/meshiphi/mesh_generation/metadata.py index 3bddae2f..59e5f4e9 100644 --- a/meshiphi/mesh_generation/metadata.py +++ b/meshiphi/mesh_generation/metadata.py @@ -17,7 +17,7 @@ class Metadata: """ - def __init__(self, data_loader , spliiting_conditions =None, value_fill_type= ""): + def __init__(self, data_loader , splitting_conditions =None, value_fill_type= "", data_subset=None): """ Args: @@ -28,8 +28,16 @@ def __init__(self, data_loader , spliiting_conditions =None, value_fill_type= "" """ self.data_loader = data_loader - self.splitting_conditions = spliiting_conditions + self.splitting_conditions = splitting_conditions self.value_fill_type = value_fill_type + self.data_name = data_loader.data_name + if data_subset is None: + if ',' in data_loader.data_name: + self.data_subset = data_loader.data[data_loader.data_name.split(',')] + else: + self.data_subset = data_loader.data[data_loader.data_name] + else: + self.data_subset = data_subset def get_data_loader(self): """ @@ -67,3 +75,15 @@ def set_value_fill_type(self , value_fill_type): sets the value fill type """ self.value_fill_type = value_fill_type + + def get_data_subset(self): + """ + gets the data subset + """ + return self.data_subset + + def set_data_subset(self, data_subset): + """ + sets the data subset + """ + self.data_subset = data_subset \ No newline at end of file From 3a1820e1177da932709b60fbe44d608010fb7242 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 7 Mar 2024 14:35:49 +0000 Subject: [PATCH 14/65] Enabled all dataloaders to read in data from cellboxes --- meshiphi/dataloaders/lut/abstract_lut.py | 8 ++++---- meshiphi/dataloaders/scalar/abstract_scalar.py | 6 ++++-- meshiphi/dataloaders/vector/abstract_vector.py | 12 +++++++++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/meshiphi/dataloaders/lut/abstract_lut.py b/meshiphi/dataloaders/lut/abstract_lut.py index 38c56fa6..1ba8eefd 100644 --- a/meshiphi/dataloaders/lut/abstract_lut.py +++ b/meshiphi/dataloaders/lut/abstract_lut.py @@ -257,7 +257,7 @@ def get_val_from_coord(self, long=None, lat=None, return_coords=False): return data - def get_value(self, bounds, agg_type=None, skipna=False): + def get_value(self, bounds, agg_type=None, skipna=False, data=None): ''' Retrieve aggregated value from within bounds @@ -277,7 +277,7 @@ def get_value(self, bounds, agg_type=None, skipna=False): Raises: ValueError: aggregation type not in list of available methods ''' - polygons = self.trim_datapoints(bounds) + polygons = self.trim_datapoints(bounds, data=data) logging.debug(f"\t{len(polygons)} polygons found for attribute " + \ f"'{self.data_name}' within bounds '{bounds}'") @@ -337,7 +337,7 @@ def get_value(self, bounds, agg_type=None, skipna=False): return { self.data_name: ret_val} - def get_hom_condition(self, bounds, splitting_conds): + def get_hom_condition(self, bounds, splitting_conds, data=None): ''' Retrieves homogeneity condition of data within boundary. @@ -361,7 +361,7 @@ def get_hom_condition(self, bounds, splitting_conds): ''' bounds_polygon = bounds.to_polygon() # Extract polygons that overlap the boundary - polygons = self.trim_datapoints(bounds)['geometry'].tolist() + polygons = self.trim_datapoints(bounds, data=data)['geometry'].tolist() # If there's no polygon that overlaps with bounds diff --git a/meshiphi/dataloaders/scalar/abstract_scalar.py b/meshiphi/dataloaders/scalar/abstract_scalar.py index acf9ba7b..1154c60c 100644 --- a/meshiphi/dataloaders/scalar/abstract_scalar.py +++ b/meshiphi/dataloaders/scalar/abstract_scalar.py @@ -656,7 +656,6 @@ def get_hom_condition_from_xr(dps, splitting_conds): # Determine fraction of datapoints over threshold value num_over_threshold = np.count_nonzero(dps > splitting_conds['threshold']) frac_over_threshold = num_over_threshold/dps.size - # Return homogeneity condition if frac_over_threshold <= splitting_conds['lower_bound']: hom_type = "CLR" elif frac_over_threshold >= splitting_conds['upper_bound']: @@ -673,8 +672,11 @@ def get_hom_condition_from_xr(dps, splitting_conds): # Set default values for splitting_conds if not provided if 'split_lock' not in splitting_conds: splitting_conds['split_lock'] = False + if data is None: + dps = self.trim_datapoints(bounds)[self.data_name] + else: + dps = data[self.data_name] - dps = self.trim_datapoints(bounds, data=data)[self.data_name] # Retrieve datapoints to analyse if type(dps) == pd.core.series.Series: return get_hom_condition_from_df(dps, splitting_conds) diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index 22ab87f2..f164dd8b 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -429,7 +429,7 @@ def get_dp_from_coord_xr(data, names, long, lat, return_coords): elif type(self.data) == xr.core.dataset.Dataset: return get_dp_from_coord_xr(self.data, self.data_name_list, long, lat, return_coords) - def get_value(self, bounds, agg_type=None, skipna=True): + def get_value(self, bounds, agg_type=None, skipna=True, data=None): ''' Retrieve aggregated value from within bounds @@ -560,7 +560,10 @@ def get_value_from_xr(dps, variable_names, bounds, agg_type, skipna): agg_type = self.aggregate_type # Limit data to boundary - dps = self.trim_datapoints(bounds) + if data is None: + dps = self.trim_datapoints(bounds, data=data) + else: + dps = data # Get list of values if type(self.data) == pd.core.frame.DataFrame: values = get_value_from_df(dps, self.data_name_list, bounds, agg_type, skipna) @@ -570,7 +573,7 @@ def get_value_from_xr(dps, variable_names, bounds, agg_type, skipna): # Put in dict to map variable to values return {self.data_name_list[i]: values[i] for i in range(len(self.data_name_list))} - def get_hom_condition(self, bounds, splitting_conds, agg_type='MEAN'): + def get_hom_condition(self, bounds, splitting_conds, agg_type='MEAN', data=None): ''' Retrieves homogeneity condition of data within boundary. @@ -590,6 +593,9 @@ def get_hom_condition(self, bounds, splitting_conds, agg_type='MEAN'): 'HET' = Threshold values defined in config are exceeded \n 'CLR' = None of the HET conditions were triggered \n ''' + if data is None: + data = self.trim_datapoints(bounds) + # Get length of dataset in bounds if type(self.data) == pd.core.frame.DataFrame: num_dp = len(self.trim_datapoints(bounds)) From b3e690e2072dc58b71eeeddcf5e8c64aea058399 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 7 Mar 2024 15:25:03 +0000 Subject: [PATCH 15/65] Updating docs and adding progress bar --- meshiphi/mesh_generation/mesh_builder.py | 59 +++++++++++++++++++----- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/meshiphi/mesh_generation/mesh_builder.py b/meshiphi/mesh_generation/mesh_builder.py index e8e4fa8c..90c995e9 100644 --- a/meshiphi/mesh_generation/mesh_builder.py +++ b/meshiphi/mesh_generation/mesh_builder.py @@ -103,26 +103,25 @@ def __init__(self, config): grid_width = (bounds.get_long_max() - bounds.get_long_min()) / cell_width - - min_datapoints = 5 if 'splitting' in self.config: min_datapoints = self.config['splitting']['minimum_datapoints'] meta_data_list = self.initialize_meta_data(bounds, min_datapoints) - # checking to avoid any dummy cellboxes (the ones that was splitted and replaced) - logging.info("Assigning data sources to cellboxes...") - for cellbox in cellboxes: - # Initialise data to be area within bounds of cellbox - - # for i, source in enumerate(meta_data_list): - # # Add this to the metadata of the cellbox - # source.set_data_subset(data_subsets[i]) - + # Initialise the metadata for each cellbox, including subsets of each + # dataloader's data set + logging.info("Initialising cellbox metadata...") + for cellbox in tqdm(cellboxes, + bar_format='{desc}{n_fmt}/{total_fmt} |{bar}| {percentage:3.0f}%, [{elapsed} elapsed] '): + # checking to avoid any dummy cellboxes + # (the ones that were split and replaced) if isinstance(cellbox, CellBox): cellbox.set_minimum_datapoints(min_datapoints) + # Update metadata with cellbox's data subset + updated_meta_data_list = self.initialize_meta_data_subsets( + cellbox.bounds, + meta_data_list) # assign meta data to each cellbox - updated_meta_data_list = self.initialize_meta_data_subsets(cellbox.bounds, meta_data_list) cellbox.set_data_source(updated_meta_data_list) @@ -142,6 +141,21 @@ def __init__(self, config): def initialize_meta_data(self, bounds, min_datapoints): + ''' + Creates a metadata object which holds information about the data sources + within a cellbox. + + Args: + bounds (Boundary): + Outer boundary of the mesh being created + + min_datapoints (int): + Minimum number of datapoints each dataloader is allowed to + aggregate + Returns: + list(Metadata): + Array of metadata objects; one for each data source + ''' meta_data_list = [] splitting_conds = [] if 'data_sources' in self.config.keys(): @@ -172,14 +186,35 @@ def initialize_meta_data(self, bounds, min_datapoints): return meta_data_list def initialize_meta_data_subsets(self, bounds, meta_data_list): + ''' + Updates cellbox metadata objects to include data subsets which contain + datapoints from only within the cellbox boundaries (as opposed to the + entire mesh's boundary) + + Args: + bounds (Boundary): + Outer boundary of the cellbox + + meta_data_list (list(Metadata)): + Cellbox's metadata that needs to be updated with data subsets + + Returns: + list(Metadata): + Array of metadata objects; one for each data source. Includes + data_subsets + ''' logging.debug(f'Initilizing data subset for {bounds}') updated_meta_data_list = [] + # For each set of data within the cellbox for source in meta_data_list: + # Limit data within dataloader to just that within cellbox boundary data_subset = source.data_loader.trim_datapoints(bounds) + # Update metadata object with this data subset updated_meta_data_list += [Metadata(source.get_data_loader(), source.get_splitting_conditions(), source.get_value_fill_type(), data_subset)] + return updated_meta_data_list From e1caf40c73a06c5866c69e87820e104258193111 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 7 Mar 2024 15:28:53 +0000 Subject: [PATCH 16/65] Incrementing version number --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index 6c6516ab..f2a676eb 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.2" +__version__ = "2.0.3" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" From af49c62c6c07315182239e9da02458cbb069e63a Mon Sep 17 00:00:00 2001 From: George Date: Wed, 13 Mar 2024 14:46:14 +0000 Subject: [PATCH 17/65] Fix baltic current dataloader --- meshiphi/dataloaders/vector/baltic_current.py | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/meshiphi/dataloaders/vector/baltic_current.py b/meshiphi/dataloaders/vector/baltic_current.py index c91a2d0e..a6953dd0 100644 --- a/meshiphi/dataloaders/vector/baltic_current.py +++ b/meshiphi/dataloaders/vector/baltic_current.py @@ -4,31 +4,39 @@ import xarray as xr + class BalticCurrentDataLoader(VectorDataLoader): def import_data(self, bounds): - ''' + """ Reads in current data from a copernicus baltic sea physics reanalysis NetCDF file. - Renames coordinates to 'lat' and 'long', and renames variable to + Renames coordinates to 'lat' and 'long', and renames variable to 'uC, vC' - + Args: bounds (Boundary): Initial boundary to limit the dataset to - + Returns: - xr.Dataset: - Baltic currents dataset within limits of bounds. + xr.Dataset: + Baltic currents dataset within limits of bounds. Dataset has coordinates 'lat', 'long', and variable 'uC', 'vC' - ''' + """ # Open Dataset if len(self.files) == 1: data = xr.open_dataset(self.files[0]) else: data = xr.open_mfdataset(self.files) + + # Reduce and drop unused depth dimension + data = data.isel(depth=0) + data = data.reset_coords(names="depth", drop=True) # Change column names data = data.rename({'latitude': 'lat', 'longitude': 'long', 'uo': 'uC', 'vo': 'vC'}) - + # Trim to initial datapoints data = self.trim_datapoints(bounds, data=data) + + # Reduce along time dimension + data = data.mean(dim="time") return data From 8e57149c7b1ead81c558d44abff4c9534c66f6a7 Mon Sep 17 00:00:00 2001 From: George Date: Thu, 14 Mar 2024 13:46:13 +0000 Subject: [PATCH 18/65] Remove problematic if statement --- meshiphi/dataloaders/scalar/abstract_scalar.py | 8 -------- meshiphi/dataloaders/vector/abstract_vector.py | 8 -------- 2 files changed, 16 deletions(-) diff --git a/meshiphi/dataloaders/scalar/abstract_scalar.py b/meshiphi/dataloaders/scalar/abstract_scalar.py index 1154c60c..75db5ccf 100644 --- a/meshiphi/dataloaders/scalar/abstract_scalar.py +++ b/meshiphi/dataloaders/scalar/abstract_scalar.py @@ -320,14 +320,6 @@ def trim_datapoints_from_xr(data, bounds): if data is None: data = self.data - # Skip trimming if data already completely within bounds - if data.lat.min() > bounds.get_lat_min() and \ - data.lat.max() <= bounds.get_lat_max() and \ - data.long.min() > bounds.get_long_min() and \ - data.long.max() <= bounds.get_long_max(): - logging.debug('\tData is already trimmed to bounds!') - return data - if type(data) == pd.core.frame.DataFrame: return trim_datapoints_from_df(data, bounds) elif type(data) == xr.core.dataset.Dataset: diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index f164dd8b..a652c443 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -362,14 +362,6 @@ def trim_datapoints_from_xr(data, bounds): # If no specific data passed in, default to entire dataset if data is None: data = self.data - - # Skip trimming if data already completely within bounds - if data.lat.min() > bounds.get_lat_min() and \ - data.lat.max() <= bounds.get_lat_max() and \ - data.long.min() > bounds.get_long_min() and \ - data.long.max() <= bounds.get_long_max(): - logging.debug('\tData is already trimmed to bounds!') - return data if type(data) == pd.core.frame.DataFrame: return trim_datapoints_from_df(data, bounds) From e176f23c93e2e2c60c6f02d4797be2cc240efaea Mon Sep 17 00:00:00 2001 From: George Date: Thu, 14 Mar 2024 13:47:01 +0000 Subject: [PATCH 19/65] Update thickness dataloader with baltic region --- meshiphi/__init__.py | 2 +- meshiphi/dataloaders/lut/thickness.py | 23 +++++++++++++++-------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index f2a676eb..b6d67d71 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.3" +__version__ = "2.0.4" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" diff --git a/meshiphi/dataloaders/lut/thickness.py b/meshiphi/dataloaders/lut/thickness.py index 2cc5d016..a6096567 100644 --- a/meshiphi/dataloaders/lut/thickness.py +++ b/meshiphi/dataloaders/lut/thickness.py @@ -20,6 +20,7 @@ 9: 'sp', 10: 'sp', 11: 'sp', } + class ThicknessDataLoader(LutDataLoader): class Region: @@ -45,8 +46,7 @@ def get_value(self, month): float: Sea Ice Density in the specified season """ return self.value_dict[self.month_to_season[month]] - - + def import_data(self, bounds): """ Creates a simulated dataset of sea ice thickness based on @@ -83,8 +83,15 @@ def import_data(self, bounds): self.Region('Ross W', Boundary([-90, 0], [160, 180]).to_polygon(), {'wi': 0.72, 'sp': 0.67, 'su': 1.32, 'au': 0.82, 'y': 1.07}), + # Baltic thickness to match example from arxiv paper + self.Region('Baltic', + Boundary([54, 66], [12, 32]).to_polygon(), + {'wi': 0.3, 'sp': 0.3, 'su': 0.3, 'au': 0.3, 'y': 0.3}, + seasons=northern_seasons), + # Keep previous defaults everywhere else self.Region('None', - Boundary([0, 90], [-180, 180]).to_polygon(), + Polygon([(-180, 0), (180, 0), (180, 90), (-180, 90)], + holes=[[(12, 54), (32, 54), (32, 66), (12, 66)]]), {'wi': 0.72, 'sp': 0.67, 'su': 1.32, 'au': 0.82, 'y': 1.07}, seasons=northern_seasons), ] @@ -102,13 +109,13 @@ def import_data(self, bounds): intersection = region.geometry & bounds_polygon if intersection.geom_type in ['Polygon', 'MultiPolygon'] and \ - intersection != Polygon(): + intersection != Polygon(): region_df = pd.concat([ pd.DataFrame({'time': dates, - 'geometry': region.geometry & bounds_polygon, - 'thickness': region.get_value(month)}) - for month in dates.month + 'geometry': region.geometry & bounds_polygon, + 'thickness': region.get_value(month)}) + for month in dates.month ]) thickness_df = pd.concat([thickness_df, region_df]) @@ -116,4 +123,4 @@ def import_data(self, bounds): thickness_df = thickness_df.drop_duplicates() thickness_df = thickness_df.set_index('time').sort_index() - return thickness_df \ No newline at end of file + return thickness_df From 1b4fde189f0aa609d5a8479ac06a5d40d461b592 Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Tue, 19 Mar 2024 13:05:09 +0000 Subject: [PATCH 20/65] adding tying neighbour_graphs to merge meshes function --- meshiphi/mesh_generation/environment_mesh.py | 498 ++++++++++++++++++- meshiphi/mesh_generation/neighbour_graph.py | 24 +- 2 files changed, 520 insertions(+), 2 deletions(-) diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index a399f406..6d4d8f7f 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -122,7 +122,477 @@ def get_cellbox(self, cellbox_id): for cellbox in self.agg_cellboxes: if str(cellbox.get_id()) == str(cellbox_id): return cellbox + + # Merging meshes + + def merge_mesh(self, mesh2): + """ + merges the given mesh with this mesh. The given mesh is not modified. + + Args: + mesh2 (EnvironmentMesh): the mesh to be merged with this mesh + """ + + # TODO check meshes are compatible with merging. + + # merge cellboxes + mesh2_bounds = mesh2.bounds + + # remove cellboxes within bounds of mesh2 from this mesh + self.remove_cellboxes_within_bounds(mesh2_bounds) + + # Appended cellboxes from mesh2 to this mesh + mesh1_max_id = self.get_max_cellbox_id() + mesh2.increment_ids(mesh1_max_id) + for cellbox in mesh2.agg_cellboxes: + self.add_cellbox(cellbox) + + # Appened neighbour graph from mesh2 to this mesh + for index in mesh2.neighbour_graph.get_graph().keys(): + neighbour_map = mesh2.neighbour_graph.neighbour_graph[index] + + self.neighbour_graph.add_node(index, neighbour_map) + + # Tie the neighbour graphs of the cellboxes on the boundary between the two meshes + north_ext_cellboxes = self.get_cellboxes_north_of_bounds(mesh2_bounds) + north_int_cellboxes = mesh2.get_top_edge_cellboxes() + self.tie_northern_cellbox_ng(north_ext_cellboxes, north_int_cellboxes) + + south_ext_cellboxes = self.get_cellboxes_south_of_bounds(mesh2_bounds) + south_int_cellboxes = mesh2.get_bottom_edge_cellboxes() + self.tie_southern_cellbox_ng(south_ext_cellboxes, south_int_cellboxes) + + east_ext_cellboxes = self.get_cellboxes_east_of_bounds(mesh2_bounds) + east_int_cellboxes = mesh2.get_right_edge_cellboxes() + self.tie_eastern_cellbox_ng(east_ext_cellboxes, east_int_cellboxes) + + west_ext_cellboxes = self.get_cellboxes_west_of_bounds(mesh2_bounds) + west_int_cellboxes = mesh2.get_left_edge_cellboxes() + self.tie_western_cellbox_ng(west_ext_cellboxes, west_int_cellboxes) + + + def tie_northern_cellbox_ng(self, north_ext_cellboxes, north_int_cellboxes): + + """ + Joins the neighbour graphs of sets of cellboxes on the northen edge of a boundary between two meshes. + + Args: + north_ext_cellboxes (AggregatedCellBox[]): a list of cellboxes that are directly north of the northen edge of the boundary + north_int_cellboxes (AggregatedCellBox[]): a list of cellboxes that are directly south of the northen edge of the boundary + """ + + # Tie northen exterior cellboxes to northen interior cellboxes + for cellbox_l in north_ext_cellboxes: + + south_neighbours = [] + south_west_neighbours = [] + south_east_neighbours = [] + + for cellbox_s in north_int_cellboxes: + + cb_l_bounds = cellbox_l.get_bounds() + cb_s_bounds = cellbox_s.get_bounds() + + neighbour_case = self.neighbour_graph.get_neighbour_case_bounds(cb_l_bounds, cb_s_bounds) + + if (str(neighbour_case) == "4"): + south_neighbours.append(int(cellbox_s.get_id())) + if (str(neighbour_case) == "-1"): + south_west_neighbours.append(int(cellbox_s.get_id())) + if (str(neighbour_case) == "3"): + south_east_neighbours.append(int(cellbox_s.get_id())) + + for neighbour in south_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["4"].append(neighbour) + for neighbour in south_west_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["-1"].append(neighbour) + for neighbour in south_east_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["3"].append(neighbour) + + # Tie northen interior cellboxes to northen exterior cellboxes + + for cellbox_s in north_int_cellboxes: + + north_neighbours = [] + north_west_neighbours = [] + north_east_neighbours = [] + + for cellbox_l in north_ext_cellboxes: + + cb_l_bounds = cellbox_l.get_bounds() + cb_s_bounds = cellbox_s.get_bounds() + + neighbour_case = self.neighbour_graph.get_neighbour_case_bounds(cb_s_bounds, cb_l_bounds) + + if (str(neighbour_case) == "-4"): + north_neighbours.append(int(cellbox_l.get_id())) + if (str(neighbour_case) == "-3"): + north_west_neighbours.append(int(cellbox_l.get_id())) + if (str(neighbour_case) == "1"): + north_east_neighbours.append(int(cellbox_l.get_id())) + + for neighbour in north_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["-4"].append(neighbour)# + for neighbour in north_west_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["-3"].append(neighbour) + for neighbour in north_east_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["1"].append(neighbour) + + def tie_southern_cellbox_ng(self, south_ext_cellboxes, south_int_cellboxes): + + """ + Joins the neighbour graphs of sets of cellboxes on the southern edge of a boundary between two meshes. + + Args: + south_ext_cellboxes (AggregatedCellBox[]): a list of cellboxes that are directly south of the southern edge of the boundary + south_int_cellboxes (AggregatedCellBox[]): a list of cellboxes that are directly north of the southern edge of the boundary + + """ + + # Tie southern exterior cellboxes to southern interior cellboxes + for cellbox_l in south_ext_cellboxes: + + north_neighbours = [] + north_west_neighbours = [] + north_east_neighbours = [] + + for cellbox_s in south_int_cellboxes: + + cb_l_bounds = cellbox_l.get_bounds() + cb_s_bounds = cellbox_s.get_bounds() + + neighbour_case = self.neighbour_graph.get_neighbour_case_bounds(cb_l_bounds, cb_s_bounds) + + if (str(neighbour_case) == "-4"): + north_neighbours.append(int(cellbox_s.get_id())) + if (str(neighbour_case) == "-3"): + north_west_neighbours.append(int(cellbox_s.get_id())) + if (str(neighbour_case) == "1"): + north_east_neighbours.append(int(cellbox_s.get_id())) + + for neighbour in north_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["-4"].append(neighbour) + for neighbour in north_west_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["-3"].append(neighbour) + for neighbour in north_east_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["1"].append(neighbour) + + # Tie southern interior cellboxes to southern exterior cellboxes + + for cellbox_s in south_int_cellboxes: + + south_neighbours = [] + south_west_neighbours = [] + south_east_neighbours = [] + + for cellbox_l in south_ext_cellboxes: + + cb_l_bounds = cellbox_l.get_bounds() + cb_s_bounds = cellbox_s.get_bounds() + + neighbour_case = self.neighbour_graph.get_neighbour_case_bounds(cb_s_bounds, cb_l_bounds) + + if (str(neighbour_case) == "4"): + south_neighbours.append(int(cellbox_l.get_id())) + if (str(neighbour_case) == "-1"): + south_west_neighbours.append(int(cellbox_l.get_id())) + if (str(neighbour_case) == "3"): + south_east_neighbours.append(int(cellbox_l.get_id())) + + for neighbour in south_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["4"].append(neighbour) + for neighbour in south_west_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["-1"].append(neighbour) + for neighbour in south_east_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["3"].append(neighbour) + + def tie_eastern_cellbox_ng(self, east_ext_cellboxes, east_int_cellboxes): + + """ + Joins the neighbour graphs of sets of cellboxes on the eastern edge of a boundary between two meshes. + + Args: + east_ext_cellboxes (AggregatedCellBox[]): a list of cellboxes that are directly east of the eastern edge of the boundary + east_int_cellboxes (AggregatedCellBox[]): a list of cellboxes that are directly west of the eastern edge of the boundary + + """ + + # Tie eastern exterior cellboxes to eastern interior cellboxes + for cellbox_l in east_ext_cellboxes: + + west_neighbours = [] + south_west_neighbours = [] + north_west_neighbours = [] + + for cellbox_s in east_int_cellboxes: + + cb_l_bounds = cellbox_l.get_bounds() + cb_s_bounds = cellbox_s.get_bounds() + + neighbour_case = self.neighbour_graph.get_neighbour_case_bounds(cb_l_bounds, cb_s_bounds) + + if (str(neighbour_case) == "-2"): + west_neighbours.append(int(cellbox_s.get_id())) + if (str(neighbour_case) == "-1"): + south_west_neighbours.append(int(cellbox_s.get_id())) + if (str(neighbour_case) == "-3"): + north_west_neighbours.append(int(cellbox_s.get_id())) + + for neighbour in west_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["-2"].append(neighbour) + for neighbour in south_west_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["-1"].append(neighbour) + for neighbour in north_west_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["-3"].append(neighbour) + + # Tie eastern interior cellboxes to eastern exterior cellboxes + + for cellbox_s in east_int_cellboxes: + + east_neighbours = [] + south_east_neighbours = [] + north_east_neighbours = [] + + for cellbox_l in east_ext_cellboxes: + + cb_l_bounds = cellbox_l.get_bounds() + cb_s_bounds = cellbox_s.get_bounds() + + neighbour_case = self.neighbour_graph.get_neighbour_case_bounds(cb_s_bounds, cb_l_bounds) + + if (str(neighbour_case) == "2"): + east_neighbours.append(int(cellbox_l.get_id())) + if (str(neighbour_case) == "3"): + south_east_neighbours.append(int(cellbox_l.get_id())) + if (str(neighbour_case) == "1"): + north_east_neighbours.append(int(cellbox_l.get_id())) + + for neighbour in east_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["2"].append(neighbour) + for neighbour in south_east_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["3"].append(neighbour) + for neighbour in north_east_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["1"].append(neighbour) + + def tie_western_cellbox_ng(self, west_ext_cellboxes, west_int_cellboxes): + + """ + Joins the neighbour graphs of sets of cellboxes on the western edge of a boundary between two meshes. + + Args: + west_ext_cellboxes (AggregatedCellBox[]): a list of cellboxes that are directly west of the western edge of the boundary + west_int_cellboxes (AggregatedCellBox[]): a list of cellboxes that are directly east of the western edge of the boundary + + """ + + # Tie western exterior cellboxes to western interior cellboxes + for cellbox_l in west_ext_cellboxes: + + east_neighbours = [] + south_east_neighbours = [] + north_east_neighbours = [] + + for cellbox_s in west_int_cellboxes: + + cb_l_bounds = cellbox_l.get_bounds() + cb_s_bounds = cellbox_s.get_bounds() + + neighbour_case = self.neighbour_graph.get_neighbour_case_bounds(cb_l_bounds, cb_s_bounds) + + if (str(neighbour_case) == "2"): + east_neighbours.append(int(cellbox_s.get_id())) + if (str(neighbour_case) == "3"): + south_east_neighbours.append(int(cellbox_s.get_id())) + if (str(neighbour_case) == "1"): + north_east_neighbours.append(int(cellbox_s.get_id())) + + for neighbour in east_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["2"].append(neighbour) + for neighbour in south_east_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["3"].append(neighbour) + for neighbour in north_east_neighbours: + self.neighbour_graph.get_graph()[cellbox_l.get_id()]["1"].append(neighbour) + + # Tie western interior cellboxes to western exterior cellboxes + + for cellbox_s in west_int_cellboxes: + + west_neighbours = [] + south_west_neighbours = [] + north_west_neighbours = [] + + for cellbox_l in west_ext_cellboxes: + + cb_l_bounds = cellbox_l.get_bounds() + cb_s_bounds = cellbox_s.get_bounds() + + neighbour_case = self.neighbour_graph.get_neighbour_case_bounds(cb_s_bounds, cb_l_bounds) + + if (str(neighbour_case) == "-2"): + west_neighbours.append(int(cellbox_l.get_id())) + if (str(neighbour_case) == "-1"): + south_west_neighbours.append(int(cellbox_l.get_id())) + if (str(neighbour_case) == "-3"): + north_west_neighbours.append(int(cellbox_l.get_id())) + + for neighbour in west_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["-2"].append(neighbour) + for neighbour in south_west_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["-1"].append(neighbour) + for neighbour in north_west_neighbours: + self.neighbour_graph.get_graph()[cellbox_s.get_id()]["-3"].append(neighbour) + + def get_cellboxes_within_bounds(self, bounds): + """ + returns the cellboxes within the given bounds. + Only cellboxes that are completely within the given bounds are returned. + + Args: + bounds (Boundary): the bounds encapsulating the cellboxes to be returned + Returns: + AggregatedCellBox[]: the cellboxes within the given bounds + """ + cells_within_bounds = [] + + for cellbox in self.agg_cellboxes: + cb_bounds = cellbox.get_bounds() + + if (cb_bounds.get_long_min() >= bounds.get_long_min() and + cb_bounds.get_long_max() <= bounds.get_long_max() and + cb_bounds.get_lat_min() >= bounds.get_lat_min() and + cb_bounds.get_lat_max() <= bounds.get_lat_max()): + + cells_within_bounds.append(cellbox) + + return cells_within_bounds + + def get_cellboxes_north_of_bounds(self, bounds): + """ + returns all cellboxes that are directly north of the given bounds. + Only cellboxes which are touching the north edge of the boundary, + yet lie entirely outside of the boundary will be returned + + Args: + bounds (Boundary): the bounds encapsulating the cellboxes to be returned + Returns: + north_cellboxes (AggregatedCellBox[]): a list of cellboxes that are directly north of the given bounds + """ + + north_cellboxes = [] + + for cellbox in self.agg_cellboxes: + if (cellbox.get_bounds().get_lat_min() == bounds.get_lat_max() and + cellbox.get_bounds().get_long_max() >= bounds.get_long_min() and + cellbox.get_bounds().get_long_min() <= bounds.get_long_max()): + + north_cellboxes.append(cellbox) + + return north_cellboxes + + def get_cellboxes_south_of_bounds(self, bounds): + + south_cellboxes = [] + + for cellbox in self.agg_cellboxes: + if (cellbox.get_bounds().get_lat_max() == bounds.get_lat_min() and + cellbox.get_bounds().get_long_max() >= bounds.get_long_min() and + cellbox.get_bounds().get_long_min() <= bounds.get_long_max()): + + south_cellboxes.append(cellbox) + + return south_cellboxes + + def get_cellboxes_east_of_bounds(self, bounds): + + east_cellboxes = [] + + for cellbox in self.agg_cellboxes: + if (cellbox.get_bounds().get_long_min() == bounds.get_long_max() and + cellbox.get_bounds().get_lat_min() >= bounds.get_lat_min() and + cellbox.get_bounds().get_lat_max() <= bounds.get_lat_max()): + + east_cellboxes.append(cellbox) + + return east_cellboxes + + def get_cellboxes_west_of_bounds(self, bounds): + + west_cellboxes = [] + + for cellbox in self.agg_cellboxes: + if (cellbox.get_bounds().get_long_max() == bounds.get_long_min() and + cellbox.get_bounds().get_lat_min() >= bounds.get_lat_min() and + cellbox.get_bounds().get_lat_max() <= bounds.get_lat_max()): + + west_cellboxes.append(cellbox) + + return west_cellboxes + + def get_top_edge_cellboxes(self): + + top_cellboxes = [] + mesh_bounds = self.bounds + + for cellbox in self.agg_cellboxes: + cb_bounds = cellbox.get_bounds() + + if cb_bounds.get_lat_max() == mesh_bounds.get_lat_max(): + top_cellboxes.append(cellbox) + + return top_cellboxes + + def get_bottom_edge_cellboxes(self): + + bottom_cellboxes = [] + mesh_bounds = self.bounds + + for cellbox in self.agg_cellboxes: + cb_bounds = cellbox.get_bounds() + + if cb_bounds.get_lat_min() == mesh_bounds.get_lat_min(): + bottom_cellboxes.append(cellbox) + + return bottom_cellboxes + + def get_right_edge_cellboxes(self): + + right_cellboxes = [] + mesh_bounds = self.bounds + + for cellbox in self.agg_cellboxes: + cb_bounds = cellbox.get_bounds() + + if cb_bounds.get_long_max() == mesh_bounds.get_long_max(): + right_cellboxes.append(cellbox) + + return right_cellboxes + + def get_left_edge_cellboxes(self): + + left_cellboxes = [] + mesh_bounds = self.bounds + + for cellbox in self.agg_cellboxes: + cb_bounds = cellbox.get_bounds() + + if cb_bounds.get_long_min() == mesh_bounds.get_long_min(): + left_cellboxes.append(cellbox) + + return left_cellboxes + + def remove_cellboxes_within_bounds(self, bounds): + """ + removes the cellboxes within the given bounds. + Only cellboxes that are completely within the given bounds are removed. + + Args: + bounds (Boundary): the bounds encapsulating the cellboxes to be removed + """ + cells_within_bounds = self.get_cellboxes_within_bounds(bounds) + for cellbox in cells_within_bounds: + self.remove_cellbox(cellbox) + def get_max_cellbox_id(self): """ returns the maximum cellbox id in the mesh @@ -136,6 +606,33 @@ def get_max_cellbox_id(self): max_id = int(cellbox.get_id()) return max_id + def remove_cellbox(self, cellbox): + """ + removes the given cellbox from the mesh + + Args: + cellbox (AggregatedCellBox): the cellbox to be removed + """ + self.agg_cellboxes.remove(cellbox) + + self.neighbour_graph.remove_node_and_update_neighbours(cellbox.get_id()) + + def add_cellbox(self, cellbox): + """ + adds the given cellbox to the mesh + """ + self.agg_cellboxes.append(cellbox) + + # TODO: update neighbour graph + + def increment_ids(self, increment): + + for cellbox in self.agg_cellboxes: + cellbox.set_id(str(int(cellbox.get_id()) + increment)) + cellbox.agg_data['id'] = str(int(cellbox.get_id()) + increment) + + self.neighbour_graph.increment_ids(increment) + # Splitting def sim_split_cellbox(self, cellbox_id): """ @@ -349,7 +846,6 @@ def split_and_replace(self, cellbox_id): self.agg_cellboxes.remove(cellbox) self.neighbour_graph.remove_node(cellbox_id) - def fill_se_neighbour_map(self, se_neighbour_map, se_neighbour_id, south_neighbour_index, east_neighbour_indx): """ fills the south east neighbour map with the given values diff --git a/meshiphi/mesh_generation/neighbour_graph.py b/meshiphi/mesh_generation/neighbour_graph.py index 10d0bc76..1b75732b 100644 --- a/meshiphi/mesh_generation/neighbour_graph.py +++ b/meshiphi/mesh_generation/neighbour_graph.py @@ -54,6 +54,27 @@ def from_json(cls, ng_json): obj.neighbour_graph = neighbour_graph return obj + def increment_ids(self, inc): + """ + Increments all ID's within the neighbour_graph by a given int inc + + Args: + inc (int): The number to increment all ID's in the neighbour_graph by + """ + + ng = self.get_graph() + new_ng = {} + + for node in ng: + for direction in ng[node]: + inc_neighbours = [x + inc for x in ng[node][direction]] + ng[node][direction] = inc_neighbours + + new_ng[str( int(node) + inc)] = ng[node] + + self.neighbour_graph = new_ng + + def get_graph(self): """ returns the graph dict @@ -115,7 +136,8 @@ def remove_node(self, cellbox_index): def update_neighbours(self, cellbox_indx, new_neighbours_indx, direction, cellboxes): ''' - method that updates the neighbour of a certain cellbox in a specific direction. It removes cellbox_indx from the neighbour_map of its neighbours in a specific direction and add new_neighbour_indx + method that updates the neighbour of a certain cellbox in a specific direction. + It removes cellbox_indx from the neighbour_map of its neighbours in a specific direction and add new_neighbour_indx Args: cellbox_index (int): index of the cellbox that its neighbour will be updated From 1f8f70ad61bc1862a1a77bc3baade3067f8a1500 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:18:10 +0000 Subject: [PATCH 21/65] Removing version limits --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index b72a7259..07e1f0aa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,8 +5,8 @@ matplotlib netcdf4 cfgrib ecmwflibs -numpy>=1.21.6,<=1.24.1 -pandas>=1.3.5,<=1.4.4 +numpy>=1.21.6 +pandas>=1.3.5 pytest rioxarray shapely>=2.0.1 From a65e4623e352253bf741ecafb128b47f4c4b0948 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:25:56 +0000 Subject: [PATCH 22/65] Commenting out library that doesnt work with Py3.12 yet --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 07e1f0aa..1b54087e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ jsonschema matplotlib netcdf4 cfgrib -ecmwflibs +#ecmwflibs numpy>=1.21.6 pandas>=1.3.5 pytest From 205bc4f3a723c72e2a144339a2fc51c373c5eaa3 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 19 Mar 2024 16:26:24 +0000 Subject: [PATCH 23/65] Forcing generator to evaluate so that dstack can be called --- meshiphi/dataloaders/vector/abstract_vector.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index a652c443..d3189646 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -1173,8 +1173,8 @@ def meshgrid_from_df(data, data_name_list): def meshgrid_from_xr(data, data_name_list): # Extract out each variable and combine as tuple - data_arrays = (data[name].values - for name in data_name_list) + data_arrays = list(data[name].values + for name in data_name_list) # Zip them together to make 2D array of n-dimensional vectors return np.dstack(data_arrays) From d8a51eb00aee281b359825480684a3311838416a Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 20 Mar 2024 13:45:24 +0000 Subject: [PATCH 24/65] Fixing new FutureWarnings from Pandas --- meshiphi/dataloaders/scalar/shape.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/meshiphi/dataloaders/scalar/shape.py b/meshiphi/dataloaders/scalar/shape.py index 9be53e98..048aa0d0 100644 --- a/meshiphi/dataloaders/scalar/shape.py +++ b/meshiphi/dataloaders/scalar/shape.py @@ -127,12 +127,14 @@ def gen_circle(self, bounds): row = pd.DataFrame(data={'lat':self.lat[i], 'long':self.long[j], 'dummy_data':mask[i][j]}, index=[0]) - dummy_df = pd.concat([dummy_df, row], ignore_index=True) + # Avoid concat with empty df + if dummy_df.empty: dummy_df = row + else: dummy_df = pd.concat([dummy_df, row], + ignore_index=True) # Change boolean values to int - dummy_df = dummy_df.replace(False, 0) - dummy_df = dummy_df.replace(True, 1) - + dummy_df['dummy_data'] = dummy_df['dummy_data'].astype(int) + return dummy_df def gen_gradient(self, bounds): @@ -169,7 +171,10 @@ def gen_gradient(self, bounds): row = pd.DataFrame(data={'lat':self.lat[i], 'long':self.long[j], 'dummy_data':datum}, index=[0]) - dummy_df = pd.concat([dummy_df, row], ignore_index=True) + # Avoid concat with empty df + if dummy_df.empty: dummy_df = row + else: dummy_df = pd.concat([dummy_df, row], + ignore_index=True) return dummy_df @@ -210,7 +215,10 @@ def gen_checkerboard(self, bounds): row = pd.DataFrame(data={'lat':self.lat[i], 'long':self.long[j], 'dummy_data':datum}, index=[0]) - dummy_df = pd.concat([dummy_df, row], ignore_index=True) + # Avoid concat with empty df + if dummy_df.empty: dummy_df = row + else: dummy_df = pd.concat([dummy_df, row], + ignore_index=True) return dummy_df From 7426e2ebd2282df9c2170702d6e2a98251aa26af Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 20 Mar 2024 13:53:18 +0000 Subject: [PATCH 25/65] Adjusting check for cellsize to be more explicit about integer number of divisions --- meshiphi/config_validation/config_validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/config_validation/config_validator.py b/meshiphi/config_validation/config_validator.py index 71bc02b8..3f550771 100644 --- a/meshiphi/config_validation/config_validator.py +++ b/meshiphi/config_validation/config_validator.py @@ -94,7 +94,7 @@ def assert_valid_cellsize(bound_min, bound_max, cell_size): bound_max (float): Maximum value of boundary in the same axis cell_size (float): Initial cellbox size in the same axis """ - assert((bound_max - bound_min)%cell_size == 0), \ + assert(((bound_max - bound_min)/cell_size)%1 == 0), \ f"{bound_max}-{bound_min}={bound_max-bound_min} is not evenly "+\ f"divided by {cell_size}" From 57c22358bf9dd447710216ff6c13f5d72e2fd94b Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 20 Mar 2024 13:56:42 +0000 Subject: [PATCH 26/65] Removing need for long_min lat_range [1]: raise ValueError('Boundary: Latitude start range should be smaller than range end') - if long_range[0] > long_range [1]: - raise ValueError('Boundary: Longtitude start range should be smaller than range end') if long_range[0] < -180 or long_range[1] > 180: raise ValueError('Boundary: Longtitude range should be within -180:180') if len (time_range) > 0: From 3225c34eee0fde57a875c80a7041aebf160b1eec Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:15:55 +0000 Subject: [PATCH 27/65] Fixing indexing over antimeridian in scalar dataloaders --- .../dataloaders/scalar/abstract_scalar.py | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/meshiphi/dataloaders/scalar/abstract_scalar.py b/meshiphi/dataloaders/scalar/abstract_scalar.py index 75db5ccf..abf25d0d 100644 --- a/meshiphi/dataloaders/scalar/abstract_scalar.py +++ b/meshiphi/dataloaders/scalar/abstract_scalar.py @@ -194,7 +194,13 @@ def calculate_coverage_from_df(bounds, data): bounds_lat_range = bounds.get_lat_max() - bounds.get_lat_min() # Get range of longitude values data_long_range = data.long.max() - data.long.min() - bounds_long_range = bounds.get_long_max() - bounds.get_long_min() + # If not going over antimeridian + if bounds.get_long_max() > bounds.get_long_min(): + bounds_long_range = bounds.get_long_max() - bounds.get_long_min() + # If goes over antimeridian + else: + bounds_long_range = (180 - bounds.get_long_min()) + \ + (bounds.get_long_max() + 180) # Calcualte area of each region data_area = data_lat_range * data_long_range bounds_area = bounds_lat_range * bounds_long_range @@ -221,7 +227,13 @@ def calculate_coverage_from_xr(bounds, data): bounds_lat_range = bounds.get_lat_max() - bounds.get_lat_min() # Get range of longitude values data_long_range = data.long.max().item() - data.long.min().item() - bounds_long_range = bounds.get_long_max() - bounds.get_long_min() + # If not going over antimeridian + if bounds.get_long_max() > bounds.get_long_min(): + bounds_long_range = bounds.get_long_max() - bounds.get_long_min() + # If goes over antimeridian + else: + bounds_long_range = (180 - bounds.get_long_min()) + \ + (bounds.get_long_max() + 180) # Calcualte area of each region data_area = data_lat_range * data_long_range bounds_area = bounds_lat_range * bounds_long_range @@ -270,10 +282,17 @@ def trim_datapoints_from_df(data, bounds): upper and lower time bounds ''' # Mask off any positions not within spatial bounds - mask = (data['lat'] > bounds.get_lat_min()) & \ - (data['lat'] <= bounds.get_lat_max()) & \ - (data['long'] > bounds.get_long_min()) & \ - (data['long'] <= bounds.get_long_max()) + # If not going through antimeridian + if bounds.get_long_min() < bounds.get_long_max(): + mask = (data['lat'] > bounds.get_lat_min()) & \ + (data['lat'] <= bounds.get_lat_max()) & \ + (data['long'] > bounds.get_long_min()) & \ + (data['long'] <= bounds.get_long_max()) + else: + mask = (data['lat'] > bounds.get_lat_min()) & \ + (data['lat'] <= bounds.get_lat_max()) & \ + (data['long'] <= bounds.get_long_min()) & \ + (data['long'] > bounds.get_long_max()) # Mask with time if time column exists if 'time' in data.columns: mask &= (data['time'] >= bounds.get_time_min()) & \ @@ -301,8 +320,16 @@ def trim_datapoints_from_xr(data, bounds): ''' # Select data region within spatial bounds # NOTE slice in xarray is inclusive of bounds - data = data.sel(lat=slice(bounds.get_lat_min(), bounds.get_lat_max() )) - data = data.sel(long=slice(bounds.get_long_min(), bounds.get_long_max())) + data = data.sel(lat=(data.lat > bounds.get_lat_min()) & \ + (data.lat < bounds.get_lat_max())) + # If not going over antimeridian + if bounds.get_long_min() < bounds.get_long_max(): + data = data.sel(long=(data.long > bounds.get_long_min()) & \ + (data.long < bounds.get_long_max())) + else: + data = data.sel(long=(data.long < bounds.get_long_min()) | \ + (data.long > bounds.get_long_max())) + # Select data region within temporal bounds if time exists as a coordinate if 'time' in data.coords.keys(): data = data.sel(time=slice(bounds.get_time_min(), bounds.get_time_max())) From f515bfbdb0c79e73403fd281da631f8f35f1ab8f Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:18:30 +0000 Subject: [PATCH 28/65] Fixing indexing over antimeridian in vector dataloaders --- .../dataloaders/vector/abstract_vector.py | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index d3189646..8aec012e 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -261,8 +261,13 @@ def calculate_coverage_from_df(bounds, data): bounds_lat_range = bounds.get_lat_max() - bounds.get_lat_min() # Get range of longitude values data_long_range = data.long.max() - data.long.min() - bounds_long_range = bounds.get_long_max() - bounds.get_long_min() - # Calcualte area of each region + # If not going over antimeridian + if bounds.get_long_max() > bounds.get_long_min(): + bounds_long_range = bounds.get_long_max() - bounds.get_long_min() + # If goes over antimeridian + else: + bounds_long_range = (180 - bounds.get_long_min()) + \ + (bounds.get_long_max() + 180) # Calcualte area of each region data_area = data_lat_range * data_long_range bounds_area = bounds_lat_range * bounds_long_range # If data area completely covers bounds, 100% coverage @@ -289,7 +294,13 @@ def calculate_coverage_from_xr(bounds, data): bounds_lat_range = bounds.get_lat_max() - bounds.get_lat_min() # Get range of longitude values data_long_range = data.long.max().item() - data.long.min().item() - bounds_long_range = bounds.get_long_max() - bounds.get_long_min() + # If not going over antimeridian + if bounds.get_long_max() > bounds.get_long_min(): + bounds_long_range = bounds.get_long_max() - bounds.get_long_min() + # If goes over antimeridian + else: + bounds_long_range = (180 - bounds.get_long_min()) + \ + (bounds.get_long_max() + 180) # Calcualte area of each region data_area = data_lat_range * data_long_range bounds_area = bounds_lat_range * bounds_long_range @@ -325,10 +336,17 @@ def trim_datapoints_from_df(data, bounds): Extracts data from a pd.DataFrame ''' # Mask off any positions not within spatial bounds - mask = (data['lat'] > bounds.get_lat_min()) & \ - (data['lat'] <= bounds.get_lat_max()) & \ - (data['long'] > bounds.get_long_min()) & \ - (data['long'] <= bounds.get_long_max()) + # If not going through antimeridian + if bounds.get_long_min() < bounds.get_long_max(): + mask = (data['lat'] > bounds.get_lat_min()) & \ + (data['lat'] <= bounds.get_lat_max()) & \ + (data['long'] > bounds.get_long_min()) & \ + (data['long'] <= bounds.get_long_max()) + else: + mask = (data['lat'] > bounds.get_lat_min()) & \ + (data['lat'] <= bounds.get_lat_max()) & \ + (data['long'] <= bounds.get_long_min()) & \ + (data['long'] > bounds.get_long_max()) # Mask with time if time column exists if 'time' in data.columns: mask &= (data['time'] >= bounds.get_time_min()) & \ @@ -345,8 +363,14 @@ def trim_datapoints_from_xr(data, bounds): # Select data region within spatial bounds # NOTE slice in xarray is inclusive of bounds data = data.sel(lat=slice(bounds.get_lat_min(), bounds.get_lat_max() )) - data = data.sel(long=slice(bounds.get_long_min(), bounds.get_long_max())) - # Select data region within temporal bounds if time exists as a coordinate + # If not going over antimeridian + if bounds.get_long_min() < bounds.get_long_max(): + data = data.sel(long=(data.long > bounds.get_long_min()) & \ + (data.long < bounds.get_long_max())) + else: + data = data.sel(long=(data.long < bounds.get_long_min()) | \ + (data.long > bounds.get_long_max())) + # Select data region within temporal bounds if time exists as a coordinate if 'time' in data.coords.keys(): data = data.sel(time=slice(bounds.get_time_min(), bounds.get_time_max())) From be15f22671e9c17cc3b1f5c63364a0699161e647 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:20:42 +0000 Subject: [PATCH 29/65] Fixing indexing over antimeridian in LUT dataloaders --- meshiphi/mesh_generation/boundary.py | 42 +++++++++++++++++++--------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index 95f3569f..afb1d069 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -5,7 +5,7 @@ from datetime import timedelta from math import cos, sin, asin, sqrt, radians -from shapely import wkt +from shapely import wkt, MultiPolygon class Boundary: """ @@ -298,13 +298,33 @@ def to_polygon(self): Shapely polygon with corners at the min/max lat/long values of this boundary """ - polygon = wkt.loads( - f'POLYGON(({self.get_long_min()} {self.get_lat_min()},' + \ - f'{self.get_long_min()} {self.get_lat_max()},' + \ - f'{self.get_long_max()} {self.get_lat_max()},' + \ - f'{self.get_long_max()} {self.get_lat_min()},' + \ - f'{self.get_long_min()} {self.get_lat_min()}))' - ) + # If not going over the antimeridian + if self.get_long_min() < self.get_long_max(): + # Create a polygon of boundary + polygon = wkt.loads( + f'POLYGON(({self.get_long_min()} {self.get_lat_min()},' + \ + f'{self.get_long_min()} {self.get_lat_max()},' + \ + f'{self.get_long_max()} {self.get_lat_max()},' + \ + f'{self.get_long_max()} {self.get_lat_min()},' + \ + f'{self.get_long_min()} {self.get_lat_min()}))' + ) + else: + # Create a multipolygon of boundary + polygon_1 = wkt.loads( + f'POLYGON(({self.get_long_min()} {self.get_lat_min()},' + \ + f'{self.get_long_min()} {self.get_lat_max()},' + \ + f'180 {self.get_lat_max()},' + \ + f'180 {self.get_lat_min()},' + \ + f'{self.get_long_min()} {self.get_lat_min()}))' + ) + polygon_2 = wkt.loads( + f'POLYGON((-180 {self.get_lat_min()},' + \ + f'-180 {self.get_lat_max()},' + \ + f'{self.get_long_max()} {self.get_lat_max()},' + \ + f'{self.get_long_max()} {self.get_lat_min()},' + \ + f'-180 {self.get_lat_min()}))' + ) + polygon = MultiPolygon([polygon_1, polygon_2]) return polygon def to_poly_string(self): @@ -317,11 +337,7 @@ def to_poly_string(self): String representation of the shapely polygon with corners at the min/max lat/long values of this boundary """ - return f'POLYGON (({self.get_long_min():g} {self.get_lat_min():g}, ' + \ - f'{self.get_long_min():g} {self.get_lat_max():g}, ' + \ - f'{self.get_long_max():g} {self.get_lat_max():g}, ' + \ - f'{self.get_long_max():g} {self.get_lat_min():g}, ' + \ - f'{self.get_long_min():g} {self.get_lat_min():g}))' + return self.to_polygon().wkt def split(self): """ From 72dac376f8af9c772aef927fef9036cc750564a4 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:21:04 +0000 Subject: [PATCH 30/65] Fixing empty geometries in density dataloader --- meshiphi/dataloaders/lut/density.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/meshiphi/dataloaders/lut/density.py b/meshiphi/dataloaders/lut/density.py index c8b44b8c..6231da44 100644 --- a/meshiphi/dataloaders/lut/density.py +++ b/meshiphi/dataloaders/lut/density.py @@ -2,8 +2,9 @@ import logging +import geopandas as gpd import pandas as pd -from shapely import wkt +from shapely import wkt, Polygon, MultiPolygon class DensityDataLoader(LutDataLoader): def import_data(self, bounds): @@ -25,6 +26,7 @@ def import_data(self, bounds): northern_hemisphere = wkt.loads('POLYGON((-180 0, -180 90, 180 90, 180 0, -180 0))') southern_hemisphere = wkt.loads('POLYGON((-180 -90, -180 0, 180 0, 180 -90, -180 -90))') + # su = summer, au = autumn, wi = winter, sp = spring northern_seasons = { 1: 'wi', 2: 'wi', 12: 'wi', 3: 'sp', 4: 'sp', 5: 'sp', @@ -61,6 +63,15 @@ def import_data(self, bounds): 'geometry': southern_hemisphere & bounds_polygon, # Intersect shapes 'density': [densities[southern_seasons[month]] for month in dates.month]}) ] - ) + ).reset_index() + # Remove empty geometry rows from df + drop_idxs = [] + for idx, row in density_df.iterrows(): + if row['geometry'].is_empty: + drop_idxs += [idx] + density_df.drop(index=drop_idxs, inplace=True) + density_df.drop(columns=['index'], inplace=True) + + density_df = density_df.drop_duplicates() density_df = density_df.set_index('time').sort_index() return density_df \ No newline at end of file From 0ea8982cafc74e988ac7cf68ae2ebcbc0771a5b1 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:02:32 +0000 Subject: [PATCH 31/65] Antimeridian cellboxes generating correctly but slow --- .../dataloaders/scalar/abstract_scalar.py | 12 +++--- meshiphi/mesh_generation/boundary.py | 14 ++++++- meshiphi/mesh_generation/cellbox.py | 13 +++++-- meshiphi/mesh_generation/mesh_builder.py | 39 ++++++++++++++----- meshiphi/utils.py | 16 ++++++++ 5 files changed, 72 insertions(+), 22 deletions(-) diff --git a/meshiphi/dataloaders/scalar/abstract_scalar.py b/meshiphi/dataloaders/scalar/abstract_scalar.py index abf25d0d..bfcabdd3 100644 --- a/meshiphi/dataloaders/scalar/abstract_scalar.py +++ b/meshiphi/dataloaders/scalar/abstract_scalar.py @@ -320,16 +320,14 @@ def trim_datapoints_from_xr(data, bounds): ''' # Select data region within spatial bounds # NOTE slice in xarray is inclusive of bounds - data = data.sel(lat=(data.lat > bounds.get_lat_min()) & \ - (data.lat < bounds.get_lat_max())) + data = data.sel(lat=slice(bounds.get_lat_min(), bounds.get_lat_max())) # If not going over antimeridian if bounds.get_long_min() < bounds.get_long_max(): - data = data.sel(long=(data.long > bounds.get_long_min()) & \ - (data.long < bounds.get_long_max())) + data = data.sel(long=slice(bounds.get_long_min(), bounds.get_long_max())) else: - data = data.sel(long=(data.long < bounds.get_long_min()) | \ - (data.long > bounds.get_long_max())) - + # data = data.drop_sel(long=slice(bounds.get_long_max(), bounds.get_long_min())) + data = data.sel(long=(data.long > bounds.get_long_max()) | (data.long < bounds.get_long_min())) + # data = data.sel(long=slice(bounds.get_long_min(), 180) | slice(-180, bounds.get_long_max())) # Select data region within temporal bounds if time exists as a coordinate if 'time' in data.coords.keys(): data = data.sel(time=slice(bounds.get_time_min(), bounds.get_time_max())) diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index afb1d069..3ed05c60 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -169,7 +169,13 @@ def getcx(self): cx (float): the x-position of the top-left corner of the CellBox given in degrees longitude. """ - return self.long_range[0] + self.get_width()/2 + cx = self.long_range[0] + self.get_width()/2 + + if cx > 180: + cx -= 360 + + return cx + def getcy(self): """ returns y-position of the centroid of the cellbox @@ -197,7 +203,11 @@ def get_width(self): width (float): the width of the CellBox given in degrees longtitude. """ - width = self.long_range[1] - self.long_range[0] + # If not over the antimeridian + if self.long_range[1] > self.long_range[0]: + width = self.long_range[1] - self.long_range[0] + else: + width = (180 - self.long_range[0]) + (self.long_range[1] + 180) return width def get_time_range (self): """ diff --git a/meshiphi/mesh_generation/cellbox.py b/meshiphi/mesh_generation/cellbox.py index b847cb4d..ff721f72 100644 --- a/meshiphi/mesh_generation/cellbox.py +++ b/meshiphi/mesh_generation/cellbox.py @@ -24,6 +24,7 @@ from meshiphi.mesh_generation.metadata import Metadata import logging import time +from meshiphi.utils import longitude_domain @@ -267,24 +268,28 @@ def create_splitted_cell_boxes(self, index): lat = self.bounds.get_lat_min() lat_range = [lat + half_height, lat + self.bounds.get_height()] long = self.bounds.get_long_min() - long_range = [long, long + half_width] + long_range = [long, + longitude_domain(long + half_width)] boundary = Boundary(lat_range, long_range, time_range) north_west = CellBox(boundary, str(index)) lat_range = [lat + half_height, lat + self.bounds.get_height()] - long_range = [long + half_width, long + self.bounds.get_width()] + long_range = [longitude_domain(long + half_width), + longitude_domain(long + self.bounds.get_width())] boundary = Boundary(lat_range, long_range, time_range) index += 1 north_east = CellBox(boundary, str(index)) lat_range = [lat, lat + half_height] - long_range = [long, long + half_width] + long_range = [long, + longitude_domain(long + half_width)] boundary = Boundary(lat_range, long_range, time_range) index += 1 south_west = CellBox(boundary, str(index)) lat_range = [lat, lat + half_height] - long_range = [long + half_width, long + self.bounds.get_width()] + long_range = [longitude_domain(long + half_width), + longitude_domain(long + self.bounds.get_width())] boundary = Boundary(lat_range, long_range, time_range) index += 1 south_east = CellBox(boundary, str(index)) diff --git a/meshiphi/mesh_generation/mesh_builder.py b/meshiphi/mesh_generation/mesh_builder.py index 90c995e9..384642ae 100644 --- a/meshiphi/mesh_generation/mesh_builder.py +++ b/meshiphi/mesh_generation/mesh_builder.py @@ -33,6 +33,8 @@ from meshiphi.dataloaders.factory import DataLoaderFactory from meshiphi.config_validation.config_validator import validate_mesh_config +from meshiphi.utils import longitude_distance, longitude_domain + class MeshBuilder: """ @@ -99,10 +101,10 @@ def __init__(self, config): cellboxes = [] cellboxes = self.initialize_cellboxes(bounds, cell_width, cell_height) - - grid_width = (bounds.get_long_max() - - bounds.get_long_min()) / cell_width - + # Account for going over the antimeridian with longitude_distance + grid_width = longitude_distance(bounds.get_long_min(), + bounds.get_long_max()) / cell_width + min_datapoints = 5 if 'splitting' in self.config: min_datapoints = self.config['splitting']['minimum_datapoints'] @@ -244,14 +246,33 @@ def is_jgrid_mesh(self): def initialize_cellboxes(self, bounds, cell_width, cell_height): cellboxes = [] - grid_width = (bounds.get_long_max() - - bounds.get_long_min()) / cell_width grid_height = (bounds.get_lat_max() - bounds.get_lat_min()) / cell_height - for lat in np.arange(bounds.get_lat_min(), bounds.get_lat_max(), cell_height): - for long in np.arange(bounds.get_long_min(), bounds.get_long_max(), cell_width): + + lat_range = np.arange(bounds.get_lat_min(), bounds.get_lat_max(), cell_height) + + + # Account for going over the antimeridian with longitude_distance + grid_width = longitude_distance(bounds.get_long_min(), + bounds.get_long_max()) / cell_width + + if bounds.get_long_min() < bounds.get_long_max(): + long_range = np.arange(bounds.get_long_min(), + bounds.get_long_max(), + cell_width) + else: + long_range = np.arange(bounds.get_long_min(), + bounds.get_long_max() + 360, + cell_width) + # Cast to within -180:180 + long_range = longitude_domain(long_range) + + for lat in lat_range: + for long in long_range: cell_lat_range = [lat, lat+cell_height] - cell_long_range = [long, long+cell_width] + # If doesn't go over anti-meridian + if long + cell_width <= 180: cell_long_range = [long, long+cell_width] + else: cell_long_range = [long, long+cell_width-360] cell_bounds = Boundary( cell_lat_range, cell_long_range, bounds.get_time_range()) cell_id = str(len(cellboxes)) diff --git a/meshiphi/utils.py b/meshiphi/utils.py index 1d2a3192..781a8620 100644 --- a/meshiphi/utils.py +++ b/meshiphi/utils.py @@ -12,6 +12,22 @@ from calendar import monthrange from scipy.fftpack import fftshift +def longitude_domain(long): + """ + Converts any longitude degree value into one between -180:180 + """ + return np.subtract(np.mod(np.add(long,180),360),180) + +def longitude_distance(long_a, long_b): + """ + Calculates the angular distance between two longitude values + """ + + long_dist = longitude_domain(long_b) - longitude_domain(long_a) + if long_b >= long_a: + return long_dist + else: + return 360 - np.abs(long_dist) def frac_of_month(year, month, start_date=None, end_date=None): From 3cbd5d7d6eea6090b54e862b148d9bc3d356e966 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:43:28 +0000 Subject: [PATCH 32/65] Sped up cellbox splitting over antimeridian --- meshiphi/dataloaders/scalar/abstract_scalar.py | 6 +++--- meshiphi/dataloaders/vector/abstract_vector.py | 6 ++---- meshiphi/utils.py | 5 ++++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/meshiphi/dataloaders/scalar/abstract_scalar.py b/meshiphi/dataloaders/scalar/abstract_scalar.py index bfcabdd3..54a6b373 100644 --- a/meshiphi/dataloaders/scalar/abstract_scalar.py +++ b/meshiphi/dataloaders/scalar/abstract_scalar.py @@ -325,9 +325,9 @@ def trim_datapoints_from_xr(data, bounds): if bounds.get_long_min() < bounds.get_long_max(): data = data.sel(long=slice(bounds.get_long_min(), bounds.get_long_max())) else: - # data = data.drop_sel(long=slice(bounds.get_long_max(), bounds.get_long_min())) - data = data.sel(long=(data.long > bounds.get_long_max()) | (data.long < bounds.get_long_min())) - # data = data.sel(long=slice(bounds.get_long_min(), 180) | slice(-180, bounds.get_long_max())) + data_lhs = data.sel(long=slice(-180, bounds.get_long_max())) + data_rhs = data.sel(long=slice(bounds.get_long_min(), 180)) + data = xr.concat([data_lhs, data_rhs], 'long') # Select data region within temporal bounds if time exists as a coordinate if 'time' in data.coords.keys(): data = data.sel(time=slice(bounds.get_time_min(), bounds.get_time_max())) diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index 8aec012e..130e120b 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -365,11 +365,9 @@ def trim_datapoints_from_xr(data, bounds): data = data.sel(lat=slice(bounds.get_lat_min(), bounds.get_lat_max() )) # If not going over antimeridian if bounds.get_long_min() < bounds.get_long_max(): - data = data.sel(long=(data.long > bounds.get_long_min()) & \ - (data.long < bounds.get_long_max())) + data = data.sel(long=slice(bounds.get_long_min(), bounds.get_long_max())) else: - data = data.sel(long=(data.long < bounds.get_long_min()) | \ - (data.long > bounds.get_long_max())) + data = data.sel(long=(data.long > bounds.get_long_max()) | (data.long < bounds.get_long_min())) # Select data region within temporal bounds if time exists as a coordinate if 'time' in data.coords.keys(): data = data.sel(time=slice(bounds.get_time_min(), bounds.get_time_max())) diff --git a/meshiphi/utils.py b/meshiphi/utils.py index 781a8620..46595a0f 100644 --- a/meshiphi/utils.py +++ b/meshiphi/utils.py @@ -16,7 +16,10 @@ def longitude_domain(long): """ Converts any longitude degree value into one between -180:180 """ - return np.subtract(np.mod(np.add(long,180),360),180) + if long in [-180, 180]: + return long + else: + return (long + 180) % 360 - 180 def longitude_distance(long_a, long_b): """ From 6bd9278f9164bc0ddcff82107ef0df7318ee8f5f Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 21 Mar 2024 11:44:08 +0000 Subject: [PATCH 33/65] Sped up cellbox splitting over antimeridian for vector dataloaders --- meshiphi/dataloaders/vector/abstract_vector.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index 130e120b..4f1b47ed 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -367,7 +367,9 @@ def trim_datapoints_from_xr(data, bounds): if bounds.get_long_min() < bounds.get_long_max(): data = data.sel(long=slice(bounds.get_long_min(), bounds.get_long_max())) else: - data = data.sel(long=(data.long > bounds.get_long_max()) | (data.long < bounds.get_long_min())) + data_lhs = data.sel(long=slice(-180, bounds.get_long_max())) + data_rhs = data.sel(long=slice(bounds.get_long_min(), 180)) + data = xr.concat([data_lhs, data_rhs], 'long') # Select data region within temporal bounds if time exists as a coordinate if 'time' in data.coords.keys(): data = data.sel(time=slice(bounds.get_time_min(), bounds.get_time_max())) From 77561d68d39423e00e2858b76bef5d6bd7726ee5 Mon Sep 17 00:00:00 2001 From: George Date: Fri, 22 Mar 2024 14:39:49 +0000 Subject: [PATCH 34/65] Cast cell ids to str when resplitting env mesh --- meshiphi/mesh_generation/environment_mesh.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index a399f406..42573081 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -164,10 +164,10 @@ def sim_split_cellbox(self, cellbox_id): bounds = cellbox.get_bounds() split_bounds = bounds.split() - cellbox1 = AggregatedCellBox(split_bounds[0], agg_data1, max_id + 1) - cellbox2 = AggregatedCellBox(split_bounds[1], agg_data2, max_id + 2) - cellbox3 = AggregatedCellBox(split_bounds[2], agg_data3, max_id + 3) - cellbox4 = AggregatedCellBox(split_bounds[3], agg_data4, max_id + 4) + cellbox1 = AggregatedCellBox(split_bounds[0], agg_data1, str(max_id + 1)) + cellbox2 = AggregatedCellBox(split_bounds[1], agg_data2, str(max_id + 2)) + cellbox3 = AggregatedCellBox(split_bounds[2], agg_data3, str(max_id + 3)) + cellbox4 = AggregatedCellBox(split_bounds[3], agg_data4, str(max_id + 4)) # Update neighbour graph From 5ff8921b9b0588f169a32f941fb37dbfdbfcdab3 Mon Sep 17 00:00:00 2001 From: George Date: Fri, 22 Mar 2024 14:46:15 +0000 Subject: [PATCH 35/65] Increment version number --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index b6d67d71..1c7efba4 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.4" +__version__ = "2.0.5" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" From 939574fbfc0defd60ebb812056fabe28a6a8e51f Mon Sep 17 00:00:00 2001 From: Jonathan Smith Date: Tue, 26 Mar 2024 08:50:08 +0000 Subject: [PATCH 36/65] Updating contains_point and adding in splitting at locations --- .../mesh_generation/aggregated_cellbox.py | 4 +- meshiphi/mesh_generation/environment_mesh.py | 70 +++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/meshiphi/mesh_generation/aggregated_cellbox.py b/meshiphi/mesh_generation/aggregated_cellbox.py index f7415d5b..f37eb98b 100644 --- a/meshiphi/mesh_generation/aggregated_cellbox.py +++ b/meshiphi/mesh_generation/aggregated_cellbox.py @@ -145,8 +145,8 @@ def contains_point(self, lat, long): contains_points (bool): True if this CellBox contains a point given by parameters (lat, long) """ - if (lat >= self.boundary.get_lat_min()) & (lat <= self.boundary.get_lat_max()): - if (long >= self.boundary.get_long_min()) & (long <= self.boundary.get_long_max()): + if (lat >= self.boundary.get_lat_min()) & (lat < self.boundary.get_lat_max()): + if (long >= self.boundary.get_long_min()) & (long < self.boundary.get_long_max()): return True return False diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index 42573081..19465a44 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -8,6 +8,7 @@ import sys import os import tempfile +from shapely import wkt from meshiphi.mesh_generation.jgrid_aggregated_cellbox import JGridAggregatedCellBox from meshiphi.mesh_generation.boundary import Boundary @@ -110,6 +111,67 @@ def __init__(self, bounds, agg_cellboxes, neighbour_graph, config): self.neighbour_graph = neighbour_graph self.config = config + + def query_inside_mesh(self,point): + """ + Returns a bool whether the given point is within the cell + + Args: + point (tuple) - (lat,long) of point to query + Returns: + inside_mesh (bool) - Boolean stating if point inside mesh + """ + inside_cell = [agg_cell.contains_point(point[0],point[1]) for agg_cell in self.agg_cellboxes] + if any(inside_cell): + return True + else: + return False + + def _split_loc(self,point): + """ + Given a point determine if agg_cellboxes should be split or if at maximum split depth + + Args: + point (tuple) - (lat,long) of point location used for splitting + Returns: + further_splittined (bool) - A boolean describing if further splitting is possible + """ + + # Defining cellbox containing point + agg_cellbox_index = np.where([agg_cell.contains_point(point[0],point[1]) for agg_cell in self.agg_cellboxes])[0][0] + agg_cellbox_wp = self.agg_cellboxes[agg_cellbox_index] + + # Determing the mesh maximum split depth + min_dcx = self.config['region']['cell_width']/(2**(self.config['splitting']['split_depth'])) + min_dcy = self.config['region']['cell_height']/(2**(self.config['splitting']['split_depth'])) + + # Finding the split depth which contains waypoint + cb_width = agg_cellbox_wp.boundary.get_width() + cb_height = agg_cellbox_wp.boundary.get_height() + + if (cb_width < min_dcx) or (cb_height < min_dcy): + # Continue if cellbox is at max split depth + return False + else: + # Split mesh if at maximum split depth + self.split_and_replace(agg_cellbox_wp.id) + return True + + + def split_points(self,points): + """ + Splitting the mesh to maximum split depth around a series of point locations + + Args: + points ([tuple,tuple]) - List of tuples (lat,lon) for the different point locations to split about + + """ + for point in points: + splitting_waypoint = True + if self.query_inside_mesh(point): + while splitting_waypoint: + splitting_waypoint = self._split_loc(point) + def get_cellbox(self, cellbox_id): """ returns the cellbox with the given id @@ -488,6 +550,14 @@ def to_json(self): return json.loads(json.dumps(output, indent=4)) + def to_shapely(self): + + msh_shapely = gpd.GeoDataFrame(pd.DataFrame(self.cellboxes_to_json())).set_index('id') + msh_shapely['geometry'] = msh_shapely['geometry'].apply(wkt.loads) + msh_shapely = gpd.GeoDataFrame(msh_shapely, crs='EPSG:4326', geometry='geometry') + return msh_shapely + + def to_png(self, params_file, path): """ exports a mesh and saves to a png file From f273806f95c890f37a599c31a358fa8907d25687 Mon Sep 17 00:00:00 2001 From: Jonathan Smith Date: Tue, 26 Mar 2024 09:36:11 +0000 Subject: [PATCH 37/65] Adding a query to the index from a given position in long,lat --- meshiphi/mesh_generation/environment_mesh.py | 27 ++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index 19465a44..c0df5189 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -127,6 +127,29 @@ def query_inside_mesh(self,point): else: return False + def query_index(self,point): + """ + Returns a index of the aggregate cellbox that contains the point + + Args: + point (tuple) - (lat,long) of point to query + Returns: + cellbox_index (str) - Cellbox index containing the point + """ + inside_cell = [agg_cell.contains_point(point[0],point[1]) for agg_cell in self.agg_cellboxes] + + if any(inside_cell): + indices = np.where(inside_cell)[0] + if len(indices) > 1: + raise Exception('Point within more than one cellbox') + else: + indx = indices[0] + return self.agg_cellboxes[indx].id + else: + raise Exception('Point not within the mesh') + + + def _split_loc(self,point): """ Given a point determine if agg_cellboxes should be split or if at maximum split depth @@ -138,8 +161,8 @@ def _split_loc(self,point): """ # Defining cellbox containing point - agg_cellbox_index = np.where([agg_cell.contains_point(point[0],point[1]) for agg_cell in self.agg_cellboxes])[0][0] - agg_cellbox_wp = self.agg_cellboxes[agg_cellbox_index] + agg_cellbox_index = self.query_index(point) + agg_cellbox_wp = self.get_cellbox(agg_cellbox_index) # Determing the mesh maximum split depth min_dcx = self.config['region']['cell_width']/(2**(self.config['splitting']['split_depth'])) From a71490d7ee2863712227bd808558aaec2726fe8b Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 26 Mar 2024 10:20:38 +0000 Subject: [PATCH 38/65] Setting up for multipolygon outputs in mesh json --- .../mesh_generation/aggregated_cellbox.py | 2 +- meshiphi/mesh_generation/boundary.py | 29 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/meshiphi/mesh_generation/aggregated_cellbox.py b/meshiphi/mesh_generation/aggregated_cellbox.py index f7415d5b..00e40201 100644 --- a/meshiphi/mesh_generation/aggregated_cellbox.py +++ b/meshiphi/mesh_generation/aggregated_cellbox.py @@ -118,7 +118,7 @@ def to_json(self): cell_json (dict): A JSON parsable dictionary representation of this AggregatedCellBox ''' cell_json = { - "geometry": str(Polygon(self.get_bounds().get_bounds())), + "geometry": str(self.get_bounds().to_poly_string()), 'cx': float(self.get_bounds().getcx()), 'cy': float(self.get_bounds().getcy()), 'dcx': float(self.get_bounds().getdcx()), diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index 3ed05c60..8fa7bdd4 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -48,19 +48,22 @@ def from_poly_string(cls, poly_string): """ Creates a Boundary object from a string representation of a polygon. """ - coords = poly_string.split("POLYGON ((")[1].split("))")[0].split(", ") - x = [float(coord.split(" ")[0]) for coord in coords] - y = [float(coord.split(" ")[1]) for coord in coords] - - lat_min = min(x) - lat_max = max(x) - long_min = min(y) - long_max = max(y) - - long_range = [long_min, long_max] - lat_range = [lat_min, lat_max] - - bounds = Boundary(long_range, lat_range) + if "MULTIPOLYGON" in poly_string: + pass + else: + coords = poly_string.split("POLYGON ((")[1].split("))")[0].split(", ") + x = [float(coord.split(" ")[0]) for coord in coords] + y = [float(coord.split(" ")[1]) for coord in coords] + + lat_min = min(x) + lat_max = max(x) + long_min = min(y) + long_max = max(y) + + long_range = [long_min, long_max] + lat_range = [lat_min, lat_max] + + bounds = Boundary(long_range, lat_range) return bounds From 16e041f6175d6cc25bfa005dfb61fba8cf2eb243 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 26 Mar 2024 10:26:46 +0000 Subject: [PATCH 39/65] Removing deprecated functionality from dataloaders --- meshiphi/dataloaders/lut/abstract_lut.py | 29 ------ .../dataloaders/scalar/abstract_scalar.py | 93 ------------------- .../dataloaders/vector/abstract_vector.py | 53 ----------- 3 files changed, 175 deletions(-) diff --git a/meshiphi/dataloaders/lut/abstract_lut.py b/meshiphi/dataloaders/lut/abstract_lut.py index 1ba8eefd..cdd58a17 100644 --- a/meshiphi/dataloaders/lut/abstract_lut.py +++ b/meshiphi/dataloaders/lut/abstract_lut.py @@ -227,35 +227,6 @@ def trim_datapoints(self, bounds, data=None): intersections = lut_polys.query(bounds_polygon, predicate='intersects').tolist() # Return only rows intersecting with cellbox boundary return data.iloc[intersections] - - def get_val_from_coord(self, long=None, lat=None, return_coords=False): - ''' - Extracts value from self.data with lat and long specified in kwargs. - - Args: - long (float): Longitude coordinate to search for - lat (float) : Latitude coordinate to search for - return_coords (boolean): - Flag for whether to return coordinates with the value or not - - Returns: - pd.DataFrame: - Either with one entry (the value at the coords), - Optionaly with coordinates associated with it if - return_coords = True - ''' - # Check if lat/long point is within any of the data polygons - point = Point(long, lat) - values = self.data[point.within(self.data['geometry'])][self.data_name] - # Add lat/long coords to df if return_coords True - if return_coords: - data = pd.DataFrame({'lat': lat, - 'long': long, - self.data_name: values}) - else: - data = values - - return data def get_value(self, bounds, agg_type=None, skipna=False, data=None): ''' diff --git a/meshiphi/dataloaders/scalar/abstract_scalar.py b/meshiphi/dataloaders/scalar/abstract_scalar.py index 75db5ccf..40c0d20c 100644 --- a/meshiphi/dataloaders/scalar/abstract_scalar.py +++ b/meshiphi/dataloaders/scalar/abstract_scalar.py @@ -324,99 +324,6 @@ def trim_datapoints_from_xr(data, bounds): return trim_datapoints_from_df(data, bounds) elif type(data) == xr.core.dataset.Dataset: return trim_datapoints_from_xr(data, bounds) - - def get_dp_from_coord(self, long=None, lat=None, return_coords=False): - ''' - Extracts datapoint from self.data with lat and long specified in kwargs. - self.data can be pd.DataFrame or xr.Dataset. Will return multiple values - if one set of coordinates have multiple entries (e.g. time series data) - - Args: - long (float): Longitude coordinate to search for - lat (float) : Latitude coordinate to search for - - Returns: - pd.Series: Column of data values with chosen lat/long. Could be many - datapoints because either bad data or multiple time steps - ''' - def get_dp_from_coord_df(data, name, long, lat, return_coords): - ''' - Extracts a singular datapoint from dataframe - - Args: - data (pd.DataFrame): - Dataset to search within - name (str): - Variable name to extract - long (float): - Longitude of datapoint requested - lat (float): - Latitude of datapoint requested - return_coords (bool): - Flag to choose if coords - are returned with the datapoint or not - - Returns: - pd.DataFrame: - Dataframe containing one row with the datapoint - (and coords if requested). If no datapoint found, - returns empty DataFrame. - ''' - # Mask off any positions not within spatial bounds - mask = (data['lat'] == lat) & \ - (data['long'] == long) - - # Include lat/long/time if requested - if return_coords: columns = list(data.columns) - else: columns = [name] - # Return column of data from within bounds - return data.loc[mask][columns] - - def get_dp_from_coord_xr(data, name, long, lat, return_coords): - ''' - Extracts a singular datapoint from xr.Dataset - - Args: - data (xr.Dataset): - Dataset to search within - name (str): - Variable name to extract - long (float): - Longitude of datapoint requested - lat (float): - Latitude of datapoint requested - return_coords (bool): - Flag to choose if coords - are returned with the datapoint or not - - Returns: - pd.DataFrame: - Dataframe containing one row with the datapoint - (and coords if requested). If no datapoint found, - returns empty DataFrame. - ''' - # Select data region within spatial bounds - data = data.sel(lat=lat, long=long) - # Cast as a pd.DataFrame - data = data.to_dataframe().reset_index() - # Include lat/long/time if requested - if return_coords: columns = list(data.columns) - else: columns = [name] - # Return column of data from within bounds - return data[columns] - - # Ensure that lat and long provided - assert (lat is not None) and (long) is not None, \ - 'Must provide lat and long to this method!' - - # Choose which method to retrieve data based on input type - if hasattr(self, 'data_name'): data_name = self.data_name - else: data_name = self.get_data_col_name() - - if type(self.data) == pd.core.frame.DataFrame: - return get_dp_from_coord_df(self.data, data_name, long, lat, return_coords) - elif type(self.data) == xr.core.dataset.Dataset: - return get_dp_from_coord_xr(self.data, data_name, long, lat, return_coords) def get_value(self, bounds, data=None, agg_type=None, skipna=True): ''' diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index a652c443..396f85fd 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -367,59 +367,6 @@ def trim_datapoints_from_xr(data, bounds): return trim_datapoints_from_df(data, bounds) elif type(data) == xr.core.dataset.Dataset: return trim_datapoints_from_xr(data, bounds) - - def get_dp_from_coord(self, long=None, lat=None, return_coords=False): - ''' - Extracts datapoint from self.data with lat and long specified in kwargs. - self.data can be pd.DataFrame or xr.Dataset. Will return multiple values - if one set of coordinates have multiple entries (e.g. time series data) - - Args: - long (float): Longitude coordinate to search for - lat (float) : Latitude coordinate to search for - - Returns: - pd.Dataframe: - Column of data values with chosen lat/long. Could be many - datapoints because either bad data or multiple time steps - ''' - def get_dp_from_coord_df(data, names, long, lat, return_coords): - ''' - Extracts data from a pd.DataFrame - ''' - # Mask off any positions not within spatial bounds - mask = (data['lat'] == lat) & \ - (data['long'] == long) - - # Include lat/long/time if requested - if return_coords: columns = list(data.columns) - else: columns = names - # Return column of data from within bounds - return data.loc[mask][columns] - - def get_dp_from_coord_xr(data, names, long, lat, return_coords): - ''' - Extracts data from a xr.Dataset - ''' - # Select data region within spatial bounds - data = data.sel(lat=lat, long=long) - # Cast as a pd.DataFrame - data = data.to_dataframe().reset_index() - # Include lat/long/time if requested - if return_coords: columns = list(data.columns) - else: columns = names - # Return column of data from within bounds - return data[columns] - - # Ensure that lat and long provided - assert (lat is not None) and (long) is not None, \ - 'Must provide lat and long to this method!' - - # Choose which method to retrieve data based on input type - if type(self.data) == pd.core.frame.DataFrame: - return get_dp_from_coord_df(self.data, self.data_name_list, long, lat, return_coords) - elif type(self.data) == xr.core.dataset.Dataset: - return get_dp_from_coord_xr(self.data, self.data_name_list, long, lat, return_coords) def get_value(self, bounds, agg_type=None, skipna=True, data=None): ''' From b972d92987d54fdf31ba38d1f557d576d6389fbb Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:41:26 +0000 Subject: [PATCH 40/65] Fixing deprecation warning --- meshiphi/config_validation/config_validator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/config_validation/config_validator.py b/meshiphi/config_validation/config_validator.py index 71bc02b8..d6222d05 100644 --- a/meshiphi/config_validation/config_validator.py +++ b/meshiphi/config_validation/config_validator.py @@ -66,7 +66,7 @@ def assert_valid_time(time_str): """ correctly_formatted = False # If relative time is parsed - if re.match('TODAY[+,-]\d+', time_str.replace(' ','')): + if re.match(r'TODAY[+,-]\d+', time_str.replace(' ','')): correctly_formatted = True elif time_str == 'TODAY': correctly_formatted = True From 2fab0d3a59d0bae5e33bffbc8f91feb0d1dff568 Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Tue, 26 Mar 2024 14:41:28 +0000 Subject: [PATCH 41/65] fixing bug in cellbox ID incrementation --- meshiphi/mesh_generation/environment_mesh.py | 53 +++++++++++++++++--- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index 6d4d8f7f..2d8e0575 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -124,7 +124,6 @@ def get_cellbox(self, cellbox_id): return cellbox # Merging meshes - def merge_mesh(self, mesh2): """ merges the given mesh with this mesh. The given mesh is not modified. @@ -143,7 +142,7 @@ def merge_mesh(self, mesh2): # Appended cellboxes from mesh2 to this mesh mesh1_max_id = self.get_max_cellbox_id() - mesh2.increment_ids(mesh1_max_id) + mesh2.increment_ids(mesh1_max_id + 1) for cellbox in mesh2.agg_cellboxes: self.add_cellbox(cellbox) @@ -170,6 +169,44 @@ def merge_mesh(self, mesh2): west_int_cellboxes = mesh2.get_left_edge_cellboxes() self.tie_western_cellbox_ng(west_ext_cellboxes, west_int_cellboxes) + def validate_merge_compatibility(self, mesh2): + """ + checks if the given mesh is compatible with merging with this mesh + + Args: + mesh2 (EnvironmentMesh): the mesh to be checked for compatibility + Returns: + bool: True if the given mesh is compatible with merging with this mesh, False otherwise + """ + + # check if the bounds of the mesh to be merged is divisible by the cell width and height of this mesh + l_cell_width = self.config['region']['cell_width'] + l_cell_height = self.config['region']['cell_height'] + + m2_bounds_height = mesh2.bounds.get_height() + m2_bounds_width = mesh2.bounds.get_width() + + if m2_bounds_height % l_cell_height != 0: + return False + if m2_bounds_width % l_cell_width != 0: + return False + + # check if mesh2 is aligned with this mesh + + l_bounds = self.bounds + s_bounds = mesh2.bounds + + lat_diff = l_bounds.get_lat_min() - s_bounds.get_lat_min() + if lat_diff % l_cell_height != 0: + return False + + long_diff = l_bounds.get_long_min() - s_bounds.get_long_min() + if long_diff % l_cell_width != 0: + return False + + + return True + def tie_northern_cellbox_ng(self, north_ext_cellboxes, north_int_cellboxes): @@ -443,6 +480,7 @@ def tie_western_cellbox_ng(self, west_ext_cellboxes, west_int_cellboxes): for neighbour in north_west_neighbours: self.neighbour_graph.get_graph()[cellbox_s.get_id()]["-3"].append(neighbour) + def get_cellboxes_within_bounds(self, bounds): """ returns the cellboxes within the given bounds. @@ -467,6 +505,7 @@ def get_cellboxes_within_bounds(self, bounds): return cells_within_bounds + def get_cellboxes_north_of_bounds(self, bounds): """ returns all cellboxes that are directly north of the given bounds. @@ -529,6 +568,7 @@ def get_cellboxes_west_of_bounds(self, bounds): return west_cellboxes + def get_top_edge_cellboxes(self): top_cellboxes = [] @@ -581,6 +621,7 @@ def get_left_edge_cellboxes(self): return left_cellboxes + def remove_cellboxes_within_bounds(self, bounds): """ removes the cellboxes within the given bounds. @@ -661,10 +702,10 @@ def sim_split_cellbox(self, cellbox_id): bounds = cellbox.get_bounds() split_bounds = bounds.split() - cellbox1 = AggregatedCellBox(split_bounds[0], agg_data1, max_id + 1) - cellbox2 = AggregatedCellBox(split_bounds[1], agg_data2, max_id + 2) - cellbox3 = AggregatedCellBox(split_bounds[2], agg_data3, max_id + 3) - cellbox4 = AggregatedCellBox(split_bounds[3], agg_data4, max_id + 4) + cellbox1 = AggregatedCellBox(split_bounds[0], agg_data1, str(max_id + 1)) + cellbox2 = AggregatedCellBox(split_bounds[1], agg_data2, str(max_id + 2)) + cellbox3 = AggregatedCellBox(split_bounds[2], agg_data3, str(max_id + 3)) + cellbox4 = AggregatedCellBox(split_bounds[3], agg_data4, str(max_id + 4)) # Update neighbour graph From 484bc608ee28e4adc9bb4a4edc5c21d5afa55128 Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Tue, 26 Mar 2024 16:13:34 +0000 Subject: [PATCH 42/65] updating version number --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index 1c7efba4..24d7cf90 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.5" +__version__ = "2.0.6" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" From 059f6b0f3050d6fd477336b96ac6cf3813f91808 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 26 Mar 2024 16:17:54 +0000 Subject: [PATCH 43/65] Incrementing version number --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index 1c7efba4..24d7cf90 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.5" +__version__ = "2.0.6" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" From 88ad3664600b7e7e8c057d61d5838086404b9eac Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Tue, 26 Mar 2024 16:41:28 +0000 Subject: [PATCH 44/65] List comprehension instead of tuple casting\ --- meshiphi/dataloaders/vector/abstract_vector.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index 1dc9f313..bbfeb080 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -1120,8 +1120,8 @@ def meshgrid_from_df(data, data_name_list): def meshgrid_from_xr(data, data_name_list): # Extract out each variable and combine as tuple - data_arrays = list(data[name].values - for name in data_name_list) + data_arrays = [data[name].values + for name in data_name_list] # Zip them together to make 2D array of n-dimensional vectors return np.dstack(data_arrays) From b615557ceea4fc551983dfbf19c56c521d091b2a Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 27 Mar 2024 09:38:58 +0000 Subject: [PATCH 45/65] Commenting out cfgrib from requirements until ecmwf fixes --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1b54087e..2e90aca9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ geopandas jsonschema matplotlib netcdf4 -cfgrib +#cfgrib #ecmwflibs numpy>=1.21.6 pandas>=1.3.5 From fdd0c92672aec01597643148816adc05df46e6fa Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Wed, 27 Mar 2024 14:49:16 +0000 Subject: [PATCH 46/65] added mesh compatibility validation before merge --- meshiphi/__init__.py | 2 +- meshiphi/mesh_generation/boundary.py | 2 -- meshiphi/mesh_generation/environment_mesh.py | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index 24d7cf90..220575ac 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.6" +__version__ = "2.0.7" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index 3f99c537..1e9e4962 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -249,7 +249,6 @@ def get_time_min(self): returns the min of time range """ return self.time_range[0] - def get_time_max(self): """ returns the max of time range @@ -347,7 +346,6 @@ def split(self): return bounds - def __str__(self): diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index ea5b0703..3d3aa2f1 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -217,7 +217,7 @@ def merge_mesh(self, mesh2): mesh2 (EnvironmentMesh): the mesh to be merged with this mesh """ - # TODO check meshes are compatible with merging. + assert self.validate_merge_compatibility(mesh2), "The given mesh is not compatible with merging with this mesh" # merge cellboxes mesh2_bounds = mesh2.bounds From 68cc0c25dca06775b98e9366de0239a36cb5177c Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Wed, 27 Mar 2024 15:05:10 +0000 Subject: [PATCH 47/65] appending config files of merged meshes --- meshiphi/mesh_generation/environment_mesh.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index 3d3aa2f1..53ce6c99 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -219,6 +219,12 @@ def merge_mesh(self, mesh2): assert self.validate_merge_compatibility(mesh2), "The given mesh is not compatible with merging with this mesh" + # append config files + if "merged" not in self.config.keys(): + self.config["merged"] = [] + + self.config["merged"].append(mesh2.config) + # merge cellboxes mesh2_bounds = mesh2.bounds From 24713dc315cbb5d72518011d63da5bcb70342f1a Mon Sep 17 00:00:00 2001 From: Samuel Hall <96304883+SamuelHall700@users.noreply.github.com> Date: Wed, 27 Mar 2024 15:54:15 +0000 Subject: [PATCH 48/65] removing unneeded comments --- meshiphi/mesh_generation/environment_mesh.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/meshiphi/mesh_generation/environment_mesh.py b/meshiphi/mesh_generation/environment_mesh.py index 53ce6c99..584f3b4f 100644 --- a/meshiphi/mesh_generation/environment_mesh.py +++ b/meshiphi/mesh_generation/environment_mesh.py @@ -755,8 +755,6 @@ def add_cellbox(self, cellbox): """ self.agg_cellboxes.append(cellbox) - # TODO: update neighbour graph - def increment_ids(self, increment): for cellbox in self.agg_cellboxes: @@ -798,9 +796,6 @@ def sim_split_cellbox(self, cellbox_id): cellbox3 = AggregatedCellBox(split_bounds[2], agg_data3, str(max_id + 3)) cellbox4 = AggregatedCellBox(split_bounds[3], agg_data4, str(max_id + 4)) - # Update neighbour graph - - return [cellbox1, cellbox2, cellbox3, cellbox4] def split_and_replace(self, cellbox_id): From 99dd778184d7f8f75d639e3521089d6cfaf7de8c Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 27 Mar 2024 17:02:43 +0000 Subject: [PATCH 49/65] Added multipolygon support --- .../mesh_generation/aggregated_cellbox.py | 28 ++++++++++++++++--- meshiphi/mesh_generation/boundary.py | 3 -- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/meshiphi/mesh_generation/aggregated_cellbox.py b/meshiphi/mesh_generation/aggregated_cellbox.py index 8f5e127c..8ea70616 100644 --- a/meshiphi/mesh_generation/aggregated_cellbox.py +++ b/meshiphi/mesh_generation/aggregated_cellbox.py @@ -23,11 +23,31 @@ def from_json(cls, cellbox_json): """ cellbox_id = cellbox_json ['id'] def load_boundary (cellbox_json): - shape = shapely.wkt.loads (cellbox_json ["geometry"]) - bounds = shape.bounds - lat_range = [bounds[1] , bounds[3]] - long_range = [bounds [0], bounds [2]] + # Take case where crossing antimeridian + if shape.geom_type == 'MultiPolygon': + shapes = list(shape.geoms) + assert (len(shapes) == 2), 'Too many polygons in MultiPolygon boundary!' + bounds_a = shapes[0].bounds + bounds_b = shapes[1].bounds + + # Bottom left should be origin from which all polygons are defined + # They should have the same lat range + lat_range = [bounds_a[1] , bounds_a[3]] + # Left most boundary and right most boundary are from two different polygons + # Right boundary of bounds_a should be 180, + # and left boundary of bounds_b should be -180 + long_range = [bounds_a [0], bounds_b [2]] + + # Otherwise it's just a normal cellbox + elif shape.geom_type == 'Polygon': + bounds = shape.bounds + lat_range = [bounds[1] , bounds[3]] + long_range = [bounds [0], bounds [2]] + # Or something is wrong with the mesh + else: + raise TypeError(f'Expected Polygon or MultiPolygon, instead got {shape.geom_type}') + return Boundary (lat_range , long_range) def load_agg_data (cellbox_json): diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index 8fa7bdd4..06223222 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -1,6 +1,3 @@ - - - from datetime import datetime from datetime import timedelta From 308d3fa9ae28f4d77ba52cde2bd0d45a0b0f735d Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 28 Mar 2024 09:53:08 +0000 Subject: [PATCH 50/65] Flexible input for casting to longitude domain --- meshiphi/utils.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/meshiphi/utils.py b/meshiphi/utils.py index 46595a0f..30590e3a 100644 --- a/meshiphi/utils.py +++ b/meshiphi/utils.py @@ -16,8 +16,15 @@ def longitude_domain(long): """ Converts any longitude degree value into one between -180:180 """ - if long in [-180, 180]: + # Allow input type to be list or ndarray + if isinstance(long, list): + return [longitude_domain(x) for x in long] + elif isinstance(long, np.ndarray): + return np.array([longitude_domain(x) for x in long]) + # Return same format as input at antimeridian + elif long in [-180, 180]: return long + # Otherwise convert it to be within domain else: return (long + 180) % 360 - 180 From a18c37edc158fd2a3c9ef8b986d6c4df5800789a Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 28 Mar 2024 11:36:51 +0000 Subject: [PATCH 51/65] Incrementing version number --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index 24d7cf90..220575ac 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.6" +__version__ = "2.0.7" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" From 4d31646f9950033df3c2fe1b0534b4bcedd361df Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 28 Mar 2024 12:14:51 +0000 Subject: [PATCH 52/65] Add ability to create boundary from MultiPolygon --- meshiphi/mesh_generation/boundary.py | 29 ++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index 06223222..beb19d5f 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -46,7 +46,28 @@ def from_poly_string(cls, poly_string): Creates a Boundary object from a string representation of a polygon. """ if "MULTIPOLYGON" in poly_string: - pass + + coord_strings = poly_string.split("MULTIPOLYGON (((")[1].split(")))")[0].split(")), ((") + # pos_coords on +180 side of antimeridian + # neg_coords on -180 side of antimeridian + pos_coords, neg_coords = [[polygon_coords.split(',') + for polygon_coords in coord_string] + for coord_string in coord_strings] + + pos_x = [float(coord.split(" ")[1]) for coord in pos_coords] + pos_y = [float(coord.split(" ")[0]) for coord in pos_coords] + neg_x = [float(coord.split(" ")[1]) for coord in neg_coords] + neg_y = [float(coord.split(" ")[0]) for coord in neg_coords] + + assert(pos_y == neg_y), "Latitudes of polygons in multipolygon " + \ + "don't match, cannot construct valid " + \ + "boundary object" + + lat_min = min(pos_y) + lat_max = max(pos_y) + long_min = min(pos_x) + long_max = max(neg_x) + else: coords = poly_string.split("POLYGON ((")[1].split("))")[0].split(", ") x = [float(coord.split(" ")[0]) for coord in coords] @@ -57,10 +78,10 @@ def from_poly_string(cls, poly_string): long_min = min(y) long_max = max(y) - long_range = [long_min, long_max] - lat_range = [lat_min, lat_max] + long_range = [long_min, long_max] + lat_range = [lat_min, lat_max] - bounds = Boundary(long_range, lat_range) + bounds = Boundary(long_range, lat_range) return bounds From 3e08a5428655a08730aa6512876ef11beec9f848 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 28 Mar 2024 12:19:28 +0000 Subject: [PATCH 53/65] Better comments and sanity check --- meshiphi/mesh_generation/boundary.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index beb19d5f..03fa82eb 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -46,14 +46,20 @@ def from_poly_string(cls, poly_string): Creates a Boundary object from a string representation of a polygon. """ if "MULTIPOLYGON" in poly_string: + # Seperate out uneccessary components + poly_string = poly_string.split("MULTIPOLYGON (((")[1] + poly_string = poly_string.split(")))")[0] + # Split into two sets of polygon coords + coord_strings = poly_string.split(")), ((") + assert(len(coord_strings) == 2), \ + "Too many polygons in multipolygon, cannot form boundary object" - coord_strings = poly_string.split("MULTIPOLYGON (((")[1].split(")))")[0].split(")), ((") # pos_coords on +180 side of antimeridian # neg_coords on -180 side of antimeridian pos_coords, neg_coords = [[polygon_coords.split(',') for polygon_coords in coord_string] for coord_string in coord_strings] - + # Extract longs and lats for each polygon pos_x = [float(coord.split(" ")[1]) for coord in pos_coords] pos_y = [float(coord.split(" ")[0]) for coord in pos_coords] neg_x = [float(coord.split(" ")[1]) for coord in neg_coords] @@ -62,7 +68,7 @@ def from_poly_string(cls, poly_string): assert(pos_y == neg_y), "Latitudes of polygons in multipolygon " + \ "don't match, cannot construct valid " + \ "boundary object" - + lat_min = min(pos_y) lat_max = max(pos_y) long_min = min(pos_x) From a6e2191568cefee06467246916db6f154ec53af1 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 28 Mar 2024 12:20:13 +0000 Subject: [PATCH 54/65] Fixing incorrect lat/long order --- meshiphi/mesh_generation/boundary.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meshiphi/mesh_generation/boundary.py b/meshiphi/mesh_generation/boundary.py index 03fa82eb..39b2f5e4 100644 --- a/meshiphi/mesh_generation/boundary.py +++ b/meshiphi/mesh_generation/boundary.py @@ -76,8 +76,8 @@ def from_poly_string(cls, poly_string): else: coords = poly_string.split("POLYGON ((")[1].split("))")[0].split(", ") - x = [float(coord.split(" ")[0]) for coord in coords] - y = [float(coord.split(" ")[1]) for coord in coords] + x = [float(coord.split(" ")[1]) for coord in coords] + y = [float(coord.split(" ")[0]) for coord in coords] lat_min = min(x) lat_max = max(x) From a2f755e3b1714af40e3d7836bae6fe8c7f6017b2 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 18 Apr 2024 12:49:44 +0100 Subject: [PATCH 55/65] Fixing longitude_distance method to be direction agnostic --- meshiphi/utils.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/meshiphi/utils.py b/meshiphi/utils.py index 30590e3a..5ddb0d64 100644 --- a/meshiphi/utils.py +++ b/meshiphi/utils.py @@ -33,12 +33,14 @@ def longitude_distance(long_a, long_b): Calculates the angular distance between two longitude values """ - long_dist = longitude_domain(long_b) - longitude_domain(long_a) - if long_b >= long_a: - return long_dist + long_dist = np.abs(longitude_domain(long_b) - longitude_domain(long_a)) + long_dist = np.mod(long_dist, 360) + + if long_dist > 180: + return 360 - long_dist else: - return 360 - np.abs(long_dist) - + return long_dist + def frac_of_month(year, month, start_date=None, end_date=None): # Determine the number of days in the month specified From c9cb51f9671b1f3bc4a7f5a062671a2597c267fe Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 18 Apr 2024 14:15:06 +0100 Subject: [PATCH 56/65] More accurately calculating the overlap region for data coverage estimate --- meshiphi/dataloaders/lut/abstract_lut.py | 8 +-- .../dataloaders/scalar/abstract_scalar.py | 69 +++++++------------ .../dataloaders/vector/abstract_vector.py | 68 +++++++----------- 3 files changed, 54 insertions(+), 91 deletions(-) diff --git a/meshiphi/dataloaders/lut/abstract_lut.py b/meshiphi/dataloaders/lut/abstract_lut.py index cdd58a17..a0e449e7 100644 --- a/meshiphi/dataloaders/lut/abstract_lut.py +++ b/meshiphi/dataloaders/lut/abstract_lut.py @@ -196,11 +196,11 @@ def calculate_coverage(self, bounds, data=None): bounds_polygon = bounds.to_polygon() # Extract out polygons, add to multipolygon data_polygon = unary_union([datum for datum in data.tolist()]) - coverage = data_polygon.area / bounds_polygon.area - # Cap output at 100% - if coverage >= 1: return 1 - else: return coverage + overlap_area = data_polygon.intersection(bounds_polygon).area + total_area = bounds_polygon.area + + return overlap_area / total_area def trim_datapoints(self, bounds, data=None): diff --git a/meshiphi/dataloaders/scalar/abstract_scalar.py b/meshiphi/dataloaders/scalar/abstract_scalar.py index cbe321e8..9c66c311 100644 --- a/meshiphi/dataloaders/scalar/abstract_scalar.py +++ b/meshiphi/dataloaders/scalar/abstract_scalar.py @@ -9,7 +9,7 @@ import pandas as pd from rasterio.enums import Resampling -from meshiphi.utils import round_to_sigfig +from meshiphi.mesh_generation.boundary import Boundary @@ -189,28 +189,18 @@ def calculate_coverage_from_df(bounds, data): # Otherwise, calculate coverage, assuming rectangular region # in mercator projection else: - # Get range of latitude values - data_lat_range = data.lat.max() - data.lat.min() - bounds_lat_range = bounds.get_lat_max() - bounds.get_lat_min() - # Get range of longitude values - data_long_range = data.long.max() - data.long.min() - # If not going over antimeridian - if bounds.get_long_max() > bounds.get_long_min(): - bounds_long_range = bounds.get_long_max() - bounds.get_long_min() - # If goes over antimeridian - else: - bounds_long_range = (180 - bounds.get_long_min()) + \ - (bounds.get_long_max() + 180) - # Calcualte area of each region - data_area = data_lat_range * data_long_range - bounds_area = bounds_lat_range * bounds_long_range - # If data area completely covers bounds, 100% coverage - if data_area >= bounds_area: - return 1 - # Otherwise return decimal fraction - else: - return data_area / bounds_area - + # Create a polygon to calculate overlap region from + data_boundary = Boundary([data.lat.min(), data.lat.max()], + [data.long.min(), data.long.max()]) + data_polygon = data_boundary.to_polygon() + bounds_polygon = bounds.to_polygon() + + # Get fraction of bounds covered by data + overlap_area = data_polygon.intersection(bounds_polygon).area + total_area = bounds_polygon.area + + return overlap_area / total_area + def calculate_coverage_from_xr(bounds, data): # Remove all NaN columns/rows @@ -222,27 +212,18 @@ def calculate_coverage_from_xr(bounds, data): # Otherwise, calculate coverage, assuming rectangular region # in mercator projection else: - # Get range of latitude values - data_lat_range = data.lat.max().item() - data.lat.min().item() - bounds_lat_range = bounds.get_lat_max() - bounds.get_lat_min() - # Get range of longitude values - data_long_range = data.long.max().item() - data.long.min().item() - # If not going over antimeridian - if bounds.get_long_max() > bounds.get_long_min(): - bounds_long_range = bounds.get_long_max() - bounds.get_long_min() - # If goes over antimeridian - else: - bounds_long_range = (180 - bounds.get_long_min()) + \ - (bounds.get_long_max() + 180) - # Calcualte area of each region - data_area = data_lat_range * data_long_range - bounds_area = bounds_lat_range * bounds_long_range - # If data area completely covers bounds, 100% coverage - if data_area >= bounds_area: - return 1 - # Otherwise return decimal fraction - else: - return data_area / bounds_area + # Create a polygon to calculate overlap region from + data_boundary = Boundary([data.lat.min().item(), data.lat.max().item()], + [data.long.min().item(), data.long.max().item()]) + data_polygon = data_boundary.to_polygon() + bounds_polygon = bounds.to_polygon() + + # Get fraction of bounds covered by data + overlap_area = data_polygon.intersection(bounds_polygon).area + total_area = bounds_polygon.area + + return overlap_area / total_area + # Use self.data if not no explicit dataset specified if data is None: data = self.data diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index 47f946aa..8edd27e0 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -9,7 +9,7 @@ import pandas as pd from rasterio.enums import Resampling -from meshiphi.utils import round_to_sigfig +from meshiphi.mesh_generation.boundary import Boundary class VectorDataLoader(DataLoaderInterface): @@ -256,26 +256,17 @@ def calculate_coverage_from_df(bounds, data): # Otherwise, calculate coverage, assuming rectangular region # in mercator projection else: - # Get range of latitude values - data_lat_range = data.lat.max() - data.lat.min() - bounds_lat_range = bounds.get_lat_max() - bounds.get_lat_min() - # Get range of longitude values - data_long_range = data.long.max() - data.long.min() - # If not going over antimeridian - if bounds.get_long_max() > bounds.get_long_min(): - bounds_long_range = bounds.get_long_max() - bounds.get_long_min() - # If goes over antimeridian - else: - bounds_long_range = (180 - bounds.get_long_min()) + \ - (bounds.get_long_max() + 180) # Calcualte area of each region - data_area = data_lat_range * data_long_range - bounds_area = bounds_lat_range * bounds_long_range - # If data area completely covers bounds, 100% coverage - if data_area >= bounds_area: - return 1 - # Otherwise return decimal fraction - else: - return data_area / bounds_area + # Create a polygon to calculate overlap region from + data_boundary = Boundary([data.lat.min(), data.lat.max()], + [data.long.min(), data.long.max()]) + data_polygon = data_boundary.to_polygon() + bounds_polygon = bounds.to_polygon() + + # Get fraction of bounds covered by data + overlap_area = data_polygon.intersection(bounds_polygon).area + total_area = bounds_polygon.area + + return overlap_area / total_area def calculate_coverage_from_xr(bounds, data): @@ -289,27 +280,18 @@ def calculate_coverage_from_xr(bounds, data): # Otherwise, calculate coverage, assuming rectangular region # in mercator projection else: - # Get range of latitude values - data_lat_range = data.lat.max().item() - data.lat.min().item() - bounds_lat_range = bounds.get_lat_max() - bounds.get_lat_min() - # Get range of longitude values - data_long_range = data.long.max().item() - data.long.min().item() - # If not going over antimeridian - if bounds.get_long_max() > bounds.get_long_min(): - bounds_long_range = bounds.get_long_max() - bounds.get_long_min() - # If goes over antimeridian - else: - bounds_long_range = (180 - bounds.get_long_min()) + \ - (bounds.get_long_max() + 180) - # Calcualte area of each region - data_area = data_lat_range * data_long_range - bounds_area = bounds_lat_range * bounds_long_range - # If data area completely covers bounds, 100% coverage - if data_area >= bounds_area: - return 1 - # Otherwise return decimal fraction - else: - return data_area / bounds_area + # Create a polygon to calculate overlap region from + data_boundary = Boundary([data.lat.min().item(), data.lat.max().item()], + [data.long.min().item(), data.long.max().item()]) + data_polygon = data_boundary.to_polygon() + bounds_polygon = bounds.to_polygon() + + # Get fraction of bounds covered by data + overlap_area = data_polygon.intersection(bounds_polygon).area + total_area = bounds_polygon.area + + return overlap_area / total_area + # Use self.data if not no explicit dataset specified if data is None: data = self.data @@ -370,7 +352,7 @@ def trim_datapoints_from_xr(data, bounds): data_lhs = data.sel(long=slice(-180, bounds.get_long_max())) data_rhs = data.sel(long=slice(bounds.get_long_min(), 180)) data = xr.concat([data_lhs, data_rhs], 'long') - # Select data region within temporal bounds if time exists as a coordinate + # Select data region within temporal bounds if time exists as a coordinate if 'time' in data.coords.keys(): data = data.sel(time=slice(bounds.get_time_min(), bounds.get_time_max())) From ae5bd112fa07e8df90afd70e18a11e0c4fde7b84 Mon Sep 17 00:00:00 2001 From: George Date: Wed, 24 Apr 2024 10:35:45 +0100 Subject: [PATCH 57/65] [#55] Check for crs variable before dropping --- meshiphi/dataloaders/vector/duacs_current.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/meshiphi/dataloaders/vector/duacs_current.py b/meshiphi/dataloaders/vector/duacs_current.py index c973ba0e..6ddae70b 100644 --- a/meshiphi/dataloaders/vector/duacs_current.py +++ b/meshiphi/dataloaders/vector/duacs_current.py @@ -38,8 +38,10 @@ def import_data(self, bounds): 'longitude': 'long', 'ugos': 'uC', 'vgos': 'vC'}) - # Drop unnecessary variable - data = data.drop_vars('crs') + + # Drop unnecessary variable, if present + if 'crs' in data.keys(): + data = data.drop_vars('crs') # Trim to initial datapoints data = self.trim_datapoints(bounds, data=data) From b31d039ec870bcc27369b633ba75481373e39ce9 Mon Sep 17 00:00:00 2001 From: George Date: Wed, 24 Apr 2024 14:37:52 +0100 Subject: [PATCH 58/65] [#54] Update __init__.py to new format --- meshiphi/__init__.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index 220575ac..817da645 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,10 +1,9 @@ -__version__ = "2.0.7" - -__description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" +__version__ = "2.0.0" +__description__ = "MeshiPhi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" -__author__ = "Samuel Hall, George Coombs, Harrison Abbot, Ayat Fekry, Jonathan Smith, Maria Fox, James Byrne, Michael Thorne" -__email__ = "polarroute@bas.ac.uk" -__copyright__ = "2022-2023, BAS AI Lab" +__author__ = "Autonomous Marine Operations Planning (AMOP) Team, AI Lab, British Antarctic Survey" +__email__ = "amop@bas.ac.uk" +__copyright__ = "2021-, BAS AI Lab" # Wrapped in try-except so that setup.py can import meshiphi without crashing due to dependency errors try: From 39782873b0417e6f5bb1451ee9a0c93754df68f7 Mon Sep 17 00:00:00 2001 From: George Date: Wed, 24 Apr 2024 15:11:47 +0100 Subject: [PATCH 59/65] Version number --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index 817da645..a4f633eb 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.0" +__version__ = "2.0.7" __description__ = "MeshiPhi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" __author__ = "Autonomous Marine Operations Planning (AMOP) Team, AI Lab, British Antarctic Survey" From 79d812eb926d13e284beae01ca95d1d6d696a4ac Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:26:04 +0100 Subject: [PATCH 60/65] Removing erroneous LINESTRINGS in density geodataframe --- meshiphi/dataloaders/lut/density.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/meshiphi/dataloaders/lut/density.py b/meshiphi/dataloaders/lut/density.py index 6231da44..8cf57db8 100644 --- a/meshiphi/dataloaders/lut/density.py +++ b/meshiphi/dataloaders/lut/density.py @@ -67,8 +67,10 @@ def import_data(self, bounds): # Remove empty geometry rows from df drop_idxs = [] for idx, row in density_df.iterrows(): - if row['geometry'].is_empty: + if row['geometry'].is_empty or \ + row['geometry'].geom_type not in ['Polygon', 'MultiPolygon']: drop_idxs += [idx] + density_df.drop(index=drop_idxs, inplace=True) density_df.drop(columns=['index'], inplace=True) From 554c424dbff67d0b79b6d8466662d531e1158cf8 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:26:35 +0100 Subject: [PATCH 61/65] Fixing data coverage calculation and converting error to warning in case of no coverage --- meshiphi/dataloaders/scalar/abstract_scalar.py | 6 +++--- meshiphi/dataloaders/vector/abstract_vector.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/meshiphi/dataloaders/scalar/abstract_scalar.py b/meshiphi/dataloaders/scalar/abstract_scalar.py index 9c66c311..6f51f5ed 100644 --- a/meshiphi/dataloaders/scalar/abstract_scalar.py +++ b/meshiphi/dataloaders/scalar/abstract_scalar.py @@ -81,9 +81,9 @@ def __init__(self, bounds, params): "of initial boundary") # If there's 0 datapoints in the initial boundary, raise ValueError if data_coverage == 0: - logging.error('\tDataloader has no data in initial region!') - raise ValueError(f"Dataloader {params['dataloader_name']}"+\ - " contains no data within initial region!") + logging.warning('\tDataloader has no data in initial region!') + #raise ValueError(f"Dataloader {params['dataloader_name']}"+\ + # " contains no data within initial region!") else: # Cut dataset down to initial boundary logging.info( diff --git a/meshiphi/dataloaders/vector/abstract_vector.py b/meshiphi/dataloaders/vector/abstract_vector.py index 8edd27e0..ed89a642 100644 --- a/meshiphi/dataloaders/vector/abstract_vector.py +++ b/meshiphi/dataloaders/vector/abstract_vector.py @@ -83,9 +83,9 @@ def __init__(self, bounds, params): "of initial boundary") # If there's 0 datapoints in the initial boundary, raise ValueError if data_coverage == 0: - logging.error('\tDataloader has no data in initial region!') - raise ValueError(f"Dataloader {params['dataloader_name']}"+\ - " contains no data within initial region!") + logging.warning('\tDataloader has no data in initial region!') + # raise ValueError(f"Dataloader {params['dataloader_name']}"+\ + # " contains no data within initial region!") else: # Cut dataset down to initial boundary logging.info( From 66b4d6a84f437a6803098ac6b666393895529d5d Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Wed, 24 Apr 2024 17:36:46 +0100 Subject: [PATCH 62/65] Incrementing version number --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index 220575ac..db5ce88b 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.0.7" +__version__ = "2.0.8" __description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" From e6a2ad305fe0518a15c4db1119cafcbdb9c424ea Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 25 Apr 2024 09:45:32 +0100 Subject: [PATCH 63/65] Properly formatting meshiphi description --- meshiphi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshiphi/__init__.py b/meshiphi/__init__.py index 564e6218..5696e2ba 100644 --- a/meshiphi/__init__.py +++ b/meshiphi/__init__.py @@ -1,5 +1,5 @@ __version__ = "2.0.8" -__description__ = "meshiphi: Earth's digital twin mapped on a non-uniform mesh" +__description__ = "MeshiPhi: Earth's digital twin mapped on a non-uniform mesh" __license__ = "MIT" __author__ = "Autonomous Marine Operations Planning (AMOP) Team, AI Lab, British Antarctic Survey" __email__ = "amop@bas.ac.uk" From 8f4ad1d79d5cadf3ac688249ce9124aba9c53113 Mon Sep 17 00:00:00 2001 From: hjabbot <42661345+hjabbot@users.noreply.github.com> Date: Thu, 25 Apr 2024 14:01:56 +0100 Subject: [PATCH 64/65] Fixing incorrect calculation of grid_width for cellboxes larger than 180 degrees --- meshiphi/mesh_generation/mesh_builder.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/meshiphi/mesh_generation/mesh_builder.py b/meshiphi/mesh_generation/mesh_builder.py index 384642ae..57f9a99b 100644 --- a/meshiphi/mesh_generation/mesh_builder.py +++ b/meshiphi/mesh_generation/mesh_builder.py @@ -101,9 +101,10 @@ def __init__(self, config): cellboxes = [] cellboxes = self.initialize_cellboxes(bounds, cell_width, cell_height) - # Account for going over the antimeridian with longitude_distance - grid_width = longitude_distance(bounds.get_long_min(), - bounds.get_long_max()) / cell_width + + # Account for going over the antimeridian with longitude_distance + grid_width = np.divide(bounds.get_long_max() - bounds.get_long_min(), + cell_width) min_datapoints = 5 if 'splitting' in self.config: From 0f25781e8fb87c5a4663ed213ace5c405155d89c Mon Sep 17 00:00:00 2001 From: George Date: Thu, 25 Apr 2024 15:47:47 +0100 Subject: [PATCH 65/65] Rebuild html docs --- docs/html/.buildinfo | 2 +- docs/html/.doctrees/environment.pickle | Bin 1722997 -> 1692841 bytes .../Dataloaders/lut/abstractLUT.doctree | Bin 66134 -> 60469 bytes .../Dataloaders/scalar/abstractScalar.doctree | Bin 79405 -> 73572 bytes .../Dataloaders/vector/abstractVector.doctree | Bin 119036 -> 113811 bytes .../Mesh_construction_classes.doctree | Bin 198645 -> 199595 bytes docs/html/_static/documentation_options.js | 2 +- docs/html/genindex.html | 14 ++----- docs/html/index.html | 6 +-- docs/html/objects.inv | Bin 5482 -> 5457 bytes docs/html/py-modindex.html | 6 +-- docs/html/search.html | 6 +-- docs/html/searchindex.js | 2 +- docs/html/sections/Code_overview.html | 6 +-- .../html/sections/Command_line_interface.html | 6 +-- .../Configuration/Configuration_overview.html | 6 +-- .../Mesh_construction_config.html | 6 +-- .../Dataloaders/AddingDataloaders.html | 6 +-- .../Dataloaders/DataLoaderInterface.html | 6 +-- docs/html/sections/Dataloaders/Factory.html | 6 +-- .../sections/Dataloaders/lut/abstractLUT.html | 33 +++------------- .../Dataloaders/lut/implemented/Density.html | 6 +-- .../Dataloaders/lut/implemented/LutCSV.html | 6 +-- .../lut/implemented/LutGeoJSON.html | 6 +-- .../lut/implemented/Scotland_NCMPA.html | 6 +-- .../lut/implemented/Thickness.html | 6 +-- docs/html/sections/Dataloaders/lut/index.html | 6 +-- docs/html/sections/Dataloaders/overview.html | 6 +-- .../Dataloaders/scalar/abstractScalar.html | 36 +++--------------- .../Dataloaders/scalar/implemented/AMSR.html | 6 +-- .../scalar/implemented/BSOSEDepth.html | 6 +-- .../scalar/implemented/BSOSESeaIce.html | 6 +-- .../scalar/implemented/BalticSeaIce.html | 6 +-- .../scalar/implemented/BinaryGRF.html | 6 +-- .../implemented/ECMWFSigWaveHeight.html | 6 +-- .../scalar/implemented/ERA5MaxWaveHeight.html | 6 +-- .../scalar/implemented/ERA5SigWaveHeight.html | 6 +-- .../scalar/implemented/ERA5WaveDirection.html | 6 +-- .../scalar/implemented/ERA5WavePeriod.html | 6 +-- .../scalar/implemented/ERA5WindDirection.html | 6 +-- .../scalar/implemented/ERA5WindMagnitude.html | 6 +-- .../Dataloaders/scalar/implemented/GEBCO.html | 6 +-- .../scalar/implemented/IceNet.html | 6 +-- .../Dataloaders/scalar/implemented/MODIS.html | 6 +-- .../scalar/implemented/ScalarCSV.html | 6 +-- .../scalar/implemented/ScalarGRF.html | 6 +-- .../Dataloaders/scalar/implemented/Shape.html | 6 +-- .../scalar/implemented/visual_iced.html | 6 +-- .../sections/Dataloaders/scalar/index.html | 6 +-- .../Dataloaders/vector/abstractVector.html | 33 +++------------- .../vector/implemented/BalticCurrent.html | 6 +-- .../Dataloaders/vector/implemented/DUACS.html | 6 +-- .../vector/implemented/ERA5WaveDirection.html | 6 +-- .../vector/implemented/ERA5Wind.html | 6 +-- .../vector/implemented/NorthSeaCurrent.html | 6 +-- .../vector/implemented/ORAS5Current.html | 6 +-- .../Dataloaders/vector/implemented/SOSE.html | 6 +-- .../vector/implemented/VectorCSV.html | 6 +-- .../vector/implemented/VectorGRF.html | 6 +-- .../sections/Dataloaders/vector/index.html | 6 +-- docs/html/sections/Examples.html | 6 +-- docs/html/sections/Installation.html | 6 +-- .../Mesh_construction_classes.html | 13 ++++--- .../Mesh_construction_overview.html | 6 +-- .../Mesh_Construction/Mesh_validation.html | 6 +-- docs/html/sections/Outputs.html | 6 +-- .../html/sections/Plotting/mesh_plotting.html | 6 +-- 67 files changed, 187 insertions(+), 266 deletions(-) diff --git a/docs/html/.buildinfo b/docs/html/.buildinfo index 2e2e283c..2a571da5 100644 --- a/docs/html/.buildinfo +++ b/docs/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 9721d97e1e55ef6dd749bf7a0aab04aa +config: 8d646c634711e3939a9768417015a87e tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/html/.doctrees/environment.pickle b/docs/html/.doctrees/environment.pickle index 5a556dfc571a36d725f76454ffce7afdf6b9ce12..a7eff03fbe494f4573671e26e5993dbd6a33c7c9 100644 GIT binary patch literal 1692841 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 _$qn$s zvUMP5E)9tVL{(g5+|624eT?U_0Q&60!{d1)Z{LUFg_cb$lAPQ$ zJokuyjj8cNp6&t|?#RFIKS~#(QRcmjC^Ln5!>jEG^V(Z-ey{E=v0LW70)Ue=E8Xi8 z^WK^Qx&Uce<_(YM_4%3ia0KMZnN34-k2v>Mt$9ayt_z?y%DH*^m8DqQoyIo!pG9Sh zjhcUiLFDP7jz)W1Ow_!Qc@G!umyMcl6$N3DpRhT09dC{;g8)zR%^aKVQEiGDgBz>>MN^%U&%5#-WNvqGV9+wzOZ+s04|^& zto99!CgKZA8%qIU9p?+%q1D{W6-xW%3sXcB#I;MB>Xk1n+KBLleWbV3XMJIWx$b;n z&LLn}lOL@rA!63IKX9}S#gL{eD%YB!m`9WVT18VO1>fg-OKVo}{e$AtSg!%y%Pjcv zx%9r40=g^F7aq@;OJD=<8}68Us) z5Sf;NriXu%8@!V|t&D&In2TEmntr{kXus?-@K=k1u*g@-z&u0CgnSdl`OTtHoZrBU z)_PFs{068>`N`8~J)?Hm7ZP}R0HLj88dDH9Em1xbLQF9dr>tePg!}{dAho*1Imw~D zR!$|Ir=;r%Q_2*@;5iSqy6Dken{|#%b4oqL+mp4a1!U4v>NB#(tF~xq#2WD{B)XK7 zQ7P}f_Cna7)!s_YI9YXvw&lxcDqjH$O*giXu$;aKfyU5H`ze&bJgh6tI^~47ID;qPBN!#f2vA=+r6 za3Nu&)2o^W6%VBVsDxOxfqea1g=!`syB*oXs7~BmK!JsFa{v`*DRsVHp{fKE)p-S2QgSGK|ysKJXDuhpt@#M8G=pAjaFQc zUA=euNxX|WD~@;M)po+X;J#P8Ow#MB%lBvzDftn5IT1~<_vr|K+@TZZKZp3_3MBz2PRM;h1qSkyr0-{z5yyneFC5qwI~kGAst^8R~TZF z9Y-+|59Kskbu=++p@VMc2Fi``8pswkTZpnzq(Z$@Z&0m`__s(q@)`;)s-fstanMQ` z6+@s+BV``K6$MIV9Q8L*okNcCgg3Zl(7+&}fodXElsZ8J1LLSNvfrD5RH9)~lR=z| zY8=OH-n$iVtDC&hu8N8PmuO+|j^O41Z{(?)NXX`jVl>uU!iDGAP?u;=AqD z;P0tOorLzwFcKx$M@PMpkxjSI5~AAN6!a)macE?IZi*@bjiR2;)Z8enDzahtmxFY? zkhiS)qha|5GR;AyC@B zJom@~x`twlWZ?&z0BHlv{Ij_j_%vy-LToaW9vRP zF_h^NW}v`fK&+%+*>=a>`>Z7&G3WdrQ5Q{g5xdV%i)md_)=%gi={pI`QUASbrDQxQ z(({1)xv}H)fMf$JFGy}6$}oDt93PqziHBn`OA_!IM+gTiBIk#t4X}U*F3vqu)6Dooo{FRij#HS9Tkm@=X=N z-dwuvwww3tvqklyzKZsJ{b|sUQ%Px!&I)rOg}xjnJ}m|%rbX4@@gZzULVh%*p`^Jk z%FHyVE|@tNP6B4ed`ny$3lfkxc-0ZYL6n)(2G}EJ-mjVYA)bn)3GN9q=jm~#{V=2S zJ31V1hub-1Hw_uPmIS+UZ0Wls4A^&Pj`oPJb~_NQc1tCR>n$#H2*)2e(q@`C7X)RP z>8OsN{wpm|t$nTAM4jG!1G*$~6BTo@&j7F6)D+eXYWsi<`MHJJaroNc5hFjNTU3~K zBXq1dd-})?sf>FRb*2KOW1;sF_W8K~#;Zvl%*u4NvLC%*=MqN6+l7HwqU6XO!(+5w zi13(WoPPK)^4K4RgPMv=4>X~jmFK~{e8 z2#vCK*!Z*uh$J45Fa&;*fWLc$5c$5NOZW)?Z5mbQQ8#)K7`L*Vjdk4OQh3w8E zKnb3hUQ4Od(U!6Io|-mlG0F5+QV)AH$qhZpCvyjrhMma@I>GI2y8B>X$TCU6$&iPQ zI8_oVv^`&&44qVojmsu>Hd_mgxxm5+OYkTST}NFt&V(cy%A(6RyJHT#c}d7Ds_8~~ ziqtCR_TJ%3%3^9HiR2Qk9x@&Ser0E%yRz7w0=Pez>Jf)DHHTco=uhfue>lX*N;0}q zW<0=sl+I@f>7D32i$&KsjI&o~L@PSaE-UG+B*N_xCA2gp?B@<1UP=gyHBiDm6sE+> zBdsp&mS2Ph+82aZcrkAp;z?fAWMS_&rl3CwQ$+>g>p}!_dK@yONTbL5Oc@KBGG5(( z%E&{@?X_g2sWZaXApB~)R>7X$JnfS|jP0EEn&!eJeQm@2q7A|030WC}3mY-Ph3!vq z;8E49KHO>`oDgS%;P3-=u7@VVd$)R(KYG4zV<+hF0~FDlKG1-n(@Z0PFBUj$s@b*nu5;xCF3=j%Xj=Qm@U{ zX398@rp~OScJ5XD-jHPrR%quY4^2|rU!+i*qd-rTXfbUn*|$a^OM?GY3iw|084bl4 zt*d#;WM2vmRZn+hsOnb<{tHKFsITIU%;iLiVo{KW^*q8MW#xBJi!;Z)n0*`mTD^N< z0}tUvLxfAMLE*#{lNk6SwcS1ldwbBDkr6fK|CFe~m@>?g8!|K@DeAvdD9Yi@(=~6# zcaMAUl<+;-)anb9l}@kul!oPof5?cBxZrp{Zq@&Yp8Fp&(4?+rGIxLIqC0&-czx=O zs)!DUY+$~okj;9U2SGL$XKF;w=0z#9*^zK$2PNUqJ=xULQ<_SejiQDW4XbB_^E^#B z9s^D4YJUi4M9pcVilF>)oDPV+h8b)?G+ko3dC%a!WLtSS7aXI*^j79m&C492F1sP; z`1X`J?o3WJ1k<##6aqN}OFcqPcc(O!G)G0riH6lPa(Yyg(=Gicr#xCS)ApQ^p^pBH zD7C#*FJ=#{)gV69Yf{RMjThhMq@n3_6&12<-{Vvib-Zd2hJR_LK08~V!=aj$2F@lW z7aH5SWI3C(DK_hZy*_(dC?)scC`TOC$>2Cw2zK?roz>rO67yPFZm5C0XC$ zusR+2&W-BbJM09uaE>wU^5J|`+GDHJxx%xs%Vz<90I$r2a+I3$$b{g;h-Q6;WAaA^ zMnju%EK;A-KRin2ZKiOPbC&#CGY67k*QlA1fFDT#oW!ar;?%~RQjd)t{|~=_#30d_ zHa~edJ;gqLev*BBQzU-#nd<`%T|eqQLc!eXmoZLBTR(cu5dY@xRIeYsdcZ>ztTJ7c znC}{zT1Tkm{cAxK&0Ob^`*%^?=WbjyYMx1dN5Z{doP?T)=xc9KegTpe2g;3F83!jr zLebj3sn2k31}v_IpXm*;RC-%)IV#Rvek^Ic*_TQq2dY(vbKhV3UZ6M8#^E4w;^-vCuT(5hXm}>r~1n)je`5qq6t8~4S?Etd3Kh<-ps)DG>e>K;z=@=$UssYsS4PTSC{OjaY#%$bRJ)slLGFF^5{2cFiAXm zW_-s3V9ctgx?__Z`)wCr9d|=hEEvnN-{iSeY9Pw7bgxewyK;Rp=mLagEwb=<#x=+G zlO_ZYrXj3HJlNJe_%)ul0;tN)gL!(KY4K*{M|ANPZK%C2(3?(W3UNzhDJs)x`Wj_~ z&7b8Em=!Qwz`<$t0>}g2sNn4IVOlQ@<0s@RFYwCI>C1)U1#FkmDy8INEoh$sGsgM80$1eZpd_86jeP4m=&XxX3 z`dIBBt3Foot<`*8gX*z8-m*eU3l;F1$=-Y{OIf*VO)8!Ogrg!_N z;$xS88edPRpSJsF;KRQSsh0kk{PS6SJ)5uR@bz52K9#TM@%4OM6%L=qe_udn6@!wbDddRn{H~ zTpwKWNAZCr&JF70M)h%%`k?GTJVI%L<)*)te=PY|l0d$UE?+(umw%RpBy&$EMNt7=sM6dS8&P)cTIY3GXeD&Efar!jmfOxmlc zT*T6y<12K7yYL7#Qvt$u`4b9lll(^z^|vtIzC^p+nwz%6FE&#zV@cKAv}Ixf7zzEd zQqod#;xv)R+K{XYR^wNG_{nGO3OuN?%$*liF4@BsN6 zt^`tWuYQ0_6gPy=|*wvBrkT7Ik?2fb>bCVQ_Lg5Qt!2S#9x98%KovU&U_iQ~} z9bIkKK;zvpIhGg$H_!J*b8wb}U@ zt|kQsFT6SMHCM?!-Ku(Z<$|E43^^XEa|ddT`WzLWf_s3M!>=skgE>2V#<4NpvF}Mg102|8{qVx|w?G%(9fdPLaQ) z1x)=@u#p=t`J%zy+qX^E>j?UxIyUpDs51}G9_BqXHN0*uHLF!`6e?zPpA`Y#9;l|~ zzEIhl2+8?>Oeio*SYDDoJx6ty{ zJO-tl%9bvlqUe&Q4AjUIzY=63*duK|ql>6qp%G3uKA0PK8vS-r`v(9K(a~1g#%0>? z+eWeue8rNE%2DbPR60n7WM>Wa!$yeA?$9>OBNoTQG&PUzV~HANPO8h1T;t+9)K$TA zXD9VVPRM_{V+`b#v&lV@ZyW*NF)dt@ZS=BxKThdh0>}A9H^vDShH%eKnFB%4Y540A zL7$-b>Ra5sq(P@R=(-^2A8R7g^A3}t-e_^AW@)1e4=vT_X(t?;){7fWtSHQ2?2=5D z7iL;xs`w&3JzH%}*C$Ys^5%!jWP0%C1(ivHF)=}*ov=)3XNjxhA#odxUUuO)*lJolnJE)bP2sAe#gzjT%OG5bDA!y%P-^DHfD{-IX8F zU71Cu|*vnA@DM;}6hRJnqSGAe6> zs$T@Q27zQ-!8Sdtn@)*Bedkfpf5YKA`t|z4ot7N`J0O_M#?4^H2{V0FYsU-3dcmDv z*`eP{=}?lUC~5%F;Ee$^l!wY>ms4>VRq^K}QfPp+s1pA(LP=POpX$=L?9rd+M`Bls z{G*J>r0L12$Ug;O>5AO-Z^U6lOSU)<$4N?ctNHJd1lBNrD>o`~OW-^m_WzW!LjH^{ zAHxOPQ-4n1KaPuT*QOv!N2KEw0;fbggnQ42hil6u>gbw-2y~1axg>de94P_hdA9UQ ztHOmD#4lH|hXKit@`u zU>ZMnqduEcwRolK$kd2_X~3-ACcQB(pE@?SdGp}d7`ffX#s)|Cc^lcjLuFp{79|iS z7v^}BDBp^LOXF4a8)K~^*^z_&YOP@LsipSomnX8M@c0%ecv-20AEtCDN#+z)2{d@4 z5>AxV(FK-_rBh3ytU&g&hwbd7=VTWKE=r!Le&Xed0(>Cs;WP@%BiytEi`!c{MM-!m z(%fvB_StYh&|ZA2J`AA(pMJ1kSe9;U^Q5tE#gi%VJn5U8w9}V;FZTi%eIyZe8b@vS zB0O<(-Y%T(FkY|kZ%Qia__UalkpjdNr`YwJ?5BMN-XMRv3)ni}cb@HPmG*BTvum-w zK+Z%8jW}3C02O5aY<;3O355ZDLdd6|FnJzMe+c&chxonOGESMo9XePCyPGQ8oVPp2 zQ5Fv#POYVkyvMWb3RR}5b#YQqwzAglguh>hf7_b5TBc7QuHH)KzrjUovRCr#us<%q z7Dg&5=Hw_QWRu%dn(Vc_q2U=he7yF<(R|1rr6M6}d7tXeWib4x$^C2^YS`pHK12et z4-e$WN>{e_{fwC;e8;h5iqotLV0mrrB{h74oz%%<=F68CV1R0BXq+H^OJbm zzIdFzK0i)bV45<=LhNm=Jm#2StJJClq%QKQ9vi$Jyy?aI!?=Azs)IsjNVQO6rB|6L zH=C3yHc3kgqIcfywNRTQYRhWGKpInjdunUPQ{MIM!S1l`!aWE8T$m5HO4*obwTVq( z59L=(FRBlt#vf5rs7dM%cg(wU(Lydoo7y-^58~ej?=GtGiZvCjrs&AIiD1P74f@am zibG83XK`P5U2O{DFuF+;f~(`;rDgz-Vcv~Z8?-8SOuvlZVX)3r=MZNyGdV)r<;{)W zW>lUTrGC&5P;=(t#z=j>I>+!)KrZy`1D8Fx(SoYZG^_j`y&L%#0W~{GKS*F9NE^I8 zjoPegA65X524`>CrZhP2HA>-zOV^gv*oXM-&Gg_#o{fu82HdHgWQdVFxyd%!Bp!QET-+%~r7uCZHo+;Q{R z<%66~uT-MEbw&8r2;%cMc)RQKIB^m|b$rq+tgTrpE60tH)k6#ZxoTjLJZL}?gLF0%a)KpzZ}!a_&A4UUGoY=%Q4GH;KDex%=n!!FUpWg}OcruD%1w97HJ2l)Q= zk^5W*KXm_ci!VTU)c$3@K1e@3nqoL?>6#RT+-=|39Xx4{JnqtV;CRThDot_TU7;B9 zL-FRw0q_dQDL<7<5_jlZQm`d%`Mag;++?k2I)$J+P_v=hSUOH2;=wcu9!w!$L$Lh$ z;J~9xuRG=#ARqt2zLC98PDq?!IV=+r){39(k5;@o%#4RuD{cX??XU_DSq?Xg6c+Ny z8NH_$-hQ(_N8(j3KJ?9y4^J=1w{dnaxspSQmDc+VfB>LFg(B86v+ zA#7$q=7kY{aZDum@N=b&DQadz2HZ+TfaXqVd^}*vh!Y${uXS4 zS%aVV&_WV3@Tw?R7p*nuVdLD>%Zemfx|Mu`+MA{UZ1&8LBgAN9BnAWFMY42*7vCeC zIH5`_QJv~WRb?Myr9jL;@A1xGjgGa|&qbtPWZNq29v#vPo4}bV;2BX$JBuOsY2q|R zo}Lpwx=`^v6%a?+wlVV}W#`(9^Kb6QZT_T~+4m{xT!oh4X^(pSE&%~$Bav9CYDi%q z6LA!xjGmH304zUENb&k4-m>zNkichx3j5&Gd3Kn_`znF+0M8SZCwDHRQF&fWOv?q3 zhuAwBR$(H;HEcs7Ok~*XLpGh7HTs1hu0*{MY+TX{g(F-L;1R`4sePvIA@ayWiCc(Y zc|LOEB8R63Pe-!On@h2E8mehsZ2){Ew9WeEcCPZjjp`3519BtD-UU3{^uMcqp?;}f z+~LSLA=$jGnehUG@MHm=t_tul4u3HV@DPEa+6)n0r~nTWBGcYxBFRy@lxR_PFWmffKj4*B%(WBlM_{Lo{z;0^=hm^22)-xwH2$`LT11Wq4{>-4Uu&UJ249W76+ zvD@reS!WVs&8Kj}rWA*^RRAJqT7QSiIz-{Rvd+$|g>^`%p|B1%)K$o}D6F#`7X2NZ zpuS@c!6;PcBTs3abEveA#VXQrHIU-Pbxw~1XX1#Q@;c8aisa;5{>J5X#(Gs=Ck8qB z3+$XuP}E`x?vVh;;o!0OM?{FttKD&S<5l0k3TR^*eWeT7e+B)<#dTJ@kx+XtgW-P< z;-74FayE(es*I|oSL!HxOHr0g4v6$uUNX5Mg#_^(a~?crC`E&ph6eb=VU)lcLvbX# zTT@ao_4GSe+N8e`zC>F=*t$ZvKb>}2qo~cr5$`TE(ZI5h6VU0o0eE+U;x{^$MuqvA zz#J7Glagw#lFSF>TOAWG@s_1yn`EwILLWbx@h8`zZ*}P>AWWxl%jFV_8E_x0ouUz# z@1b_XOq80r{QD`rOxTp_DhTu4XfLPa4>Ff8I~FoNT+ro@04zNS)6HBy*U-0{xol+V z=Sc=|y>QF#$0?yelM2q~SVPWP9_ZbqXJDPgN&j1##@I=Z%U1q-dRpp+fHeCt>7Qb( zB|wf1c(jqX&ZPe{fEAx~CtEq^q@N(AmrzA%93NfErLBF!=2AQvO5Fs4j8yis#S~=) zzxHMD)-23axg4t#nQ7(nSYWP1m%Ncx+Ui;p5SLJx@@2#{Y=y9?@$!tO25Cs@$R^u( zGxXhd1o_OPRQ3D2$v)0(Lr@x9mmPFa_qG$_i-!3Ub!ijUK92IYYt`n`gDB1U zJ^*ZAt`PlujH(Gm&R)$e)tKSJHVjcl`s`RkQbI3TPAGixKE zSqpu)v$k=my*cy4p`uXM9?Xr9k0s1!$^V4B(>^0+kl5bPaU_jUy>}KRku!*ZA5y7+T%hSL~D_6N`apsrrRqHLKdVr%7+OiTh7$`eBK@>%4|ab z>;ku|?cZ8H!X=hwwZMT~{#1nIF3rviat8CfD3sF8F8%`HkucRI|8wZJ|4+EYm+5n+ z>yz|6&wb2v`P-=rylSGuSicZK$!RfMD90ZAgc#&KMF#nG>hw3V5AyTb2kB`0bJ0PQ z7g_SpI}t6Pk4pl2FT}0(#>}L$5_kmxurGrU(#UM zxCqUTn!@wwwZJ;WjBUib@ntn%4hb2$)BfNdgjNQ&0|GS~^@S;%!!=z)307L=(wOwp zmdc;09FDLO86av#i`pkhh{thY^oRn?h1P~Rot)2;L8vPitSE8T4h$y7fkQrye04BWCY@$evZj4!h>4H-Xsn zkZpMps52}%ueNriaZuzpCD)o)r8W6#!3k0x_#=^ybTS>^m;x-pp72NUPDb02`r0$w z@fB`gk5klLR!NvEZdWld zz2H4#QkMK5L>f8SG-9~dKKj$hqifWo<^g3fm>&gd|1v*n{k5>OQrYAuWVErF{V{+C zLGTLo^k6ACPi1u$;+Cl^?6wp8F7dbM?q~CNx4mLMeL?vD5X^9I^NN};=kHV=QKNAf zo#VApGKf0st#gf0X`dGu{eFSY$E~iz4)5tVTE{2b{CrcLkFwOZOT>=)NtHcs&Q~i4 zIjW%S`8s&ll*ej`mksT;_(3@)cm<(X4eS}`Dg6$Hm+Z&SP07xJ>G@b$z*7>35oh)J z{eUeV=UzD+euhkT(%RT?amkO8z)6wk&6A4Xox5V*&lwD_o}{u((vLaNbq2tL@&5q> z4GYRn{5@EpS6@UMsp7~oxb9V62EV#MuX5NDx>wQJT}7r?Fr|@VClTgW&x#4YwLqui z$T&M=t4{Dq1>LahHYS~((O^$mwiqz~Y-mix=6 z8gGmWstk%rP*8nvo;#JnP%fV4fbrPW7vLajc+-@@Tc^bqei%VvfYw3-hqjP&s1YzR zE8_k)C*;8MdL#$*3l|1m{~x_D%-K zprw6(JUDlULuh*Cxw$oP77$%)hi2>+S)2!my%6lh%M;XG>!-w`b;$Q-CFD{T$X5^|fc7ncs8!+CIuCIMySx zE|4WsH-&x|O5{^69{TBli9x&nN$NtP2WD&cyk#(Pm^?54mLH{gJTIRI_yP;CZx!fO zjs=+RRo(^I&kFP^hse;qiY~yc$HaIm(-&d(dBHm;m4x9y=0YdliS;LBUx*!656kfw zUb3y1!)2gmA;GMR#Yl>W<)0P#M}4R#2yJRP-kEyyoOwjKRMrMRiy6MMzzpX=%qGTg zZePll0=>$?%DPv1S^2I4y~@GLx>wQp#Ho&U6_(D${HU1Ta)B<#t#Pt5F!!NrN6Ldt zH%TT{ZUXEnXBGpN;7I9cE;y~d1LC32aV{Z8%K53w0_{L~1!gP3ffBOHjN{~jRFH8F zlaT$S7O(FXN)@(3Qv8hLFnJ`^VWM*U$^C)QmPoJ*93lg#=WXks>68wtW#;kunp_FY zE74kKRJmll(%k$A4k<3TuDNO>k~hQQ<43e7LP)&6M?%7Jv%HI@DePu>t!OD(^~Q-H z$IT*%K)G2$l#;lRDrI!DypKA|ZkG4cH+Hk|w_e>o46dFE;0U6JCuiKW8Id* zKih0Syq%H&&Y5}E^~DY^n{u++WL5ta4fRFnP>@wky;Hv=A~e>pvsu;L%#&HwU1e1> z4xhG$mK_)1>U(s#5SK&#dR%v|@HgP&&XWiIi}1P2zZh447m}F#OX%AmT}pgsBYk}q z-MJLscCMX%iW&@-Fx?J@r{zFv+i8oGl2xDr?Yc6#J0{`+cN z5Bb;7_vxF+fqE^z?((n06??0r_<-2IL4Dk)K5kMUL|}M?h%S^>&4kFb_X#4&kKRQ&|d(`8ciHvl4^)@pZ1swM)DPpU48 zuKQec<;_Uyh|0AayGG?|faonMj{$+lqq6E()(}@t;0l(T&Tj3@t3P~M}Ra(EnPf`zTC3xQI#&BNbF*R}7-xMx9mUz?isg+`^i zDGeFrA(B=84{P2iJ zt#NT!Rc2Y|p35gG+1#9>pzr8Ib;wt4`y-DJqGSP0pExn3#mNH)syKsSrdn>c5dZJZ z(a8_93pi139Gx(|#I7<-|R3P|T= zz4NF*r3~ZS;?hh&jQ)Gq3JupbXB#=wU=X2vb0xnp_{31!tY)BP{n-~OUgRQiymlTFPhY zYD>i)+VDcRvz9|?*%`&)Ga-qPo#%;D&$UrtF*>GMViu1zQ8gxTZU&V^9nQb8JHTcR zwFPi`95ku@-s%oLAXrD?UeIBPrg^2{&Pu?9?7+KII*`OMMb$427PHA>==jil$R4Gk zq({2&Y(=_n;{GI!GDR+AC*3?9&QqIGiXY`BwYvT+*Q?hiWkav(MlcW zjTkj&-$-#zN=qZ!Mbf+3O^@SlRtE%13J-o2qVIDBC^}`Xts(JQ7qAsmJI}*_BBHzf z<{gxvj3W&7`G&mgfYH!I=5QHj!&xJ0-|V72PEM^S_j%KZQXQ{SqA{v*Auk!P&rJ*f z+)TZ~dCKLMIo~*l7Tg}dY;IBzH@Tou3&lB2bz|nfN_PE4``SCt)SC&Gw1;E6bS9>-l`2>?dN0TtlxGAb4< zS|cAE-&Bteay5d%$@JXV;Q%M4dvTr^{*~Ne z4tWpg^Qpo|quMs~H+%@0yZ6cIp;K*nskKa|M;V2RyGr2We7j>#2;(#1{frv17bWm+ z)DC>ho;nwciK+=m=kP*SdbgFMoDV(PH$bwJ4iskZldc@04k9F74-fYYvYh6SxqYC@ zekS%$DRDVOSx|vmfLnf|28aAYc}8gnEA{oNbvRdNrR8u4-6(qI_cE;Jsih>Nw5- z0SctNdqw1~)g^eEPo%`>qd4O)?Bv^9eiG#&y$uXWq+T9Ds=S*SSf^Og)+00P z0uFg(c3{vw&-moxtQVygXEolj_J*|36!TPEMXi`|1q<-r4~Yx5UhkOnoyxW90iep* zNZ@a<277Zv-w&my-hy2zEN^2|Qd5VVy(CvC(OtI|F31`!n$@4;t8a6u(#~Gqw2b$p z0827-a-?NYUtMQ$+7`287~4{-Z*lwDeo@8{9YaE!LL{`wkWi-5&E{c;ke6(BVziv< z`KH-WX0@eUDeXEuDkl+g&-|6S~T^P7%YYN7-Q~>0e-s3 z0E<`t>NvotI`w}89W9PTrVBjPpNCD!d3Xt zLanlYW)bd5RRJ|pXrmmI+K{e}_L1m-Ail2%J@EB|mCTTxn}?DtzRxz_~`fC_Mq|o*ot!k&)*$C{9TMmY|yQ6vd;y_ROGI z?e?|(>LYJZL8KEh=uIKxE^&w6Nyc?kS~CXI{>9XVz=DXD)_htz zo0y@xMH^Ppi{`ddI#1r^P!aW$z|IZ%v6H7p!*u|kFQ&<{ifv87s~DJ5Q_xiXG+v)* zW_0vEqr&_skg=z~$k=^2kf9uhiBz#Ba$g}s|0s|#(_dsv9|mNsH9KMk9d3ciHR=)b zfRZQXM}dzQ_ZJ^8V0@@LvZn-fWYyVo^+qJpW5s6KVf-!nx|F}K?G^R(BC@X`m>kNX zyBay}ti9suNT;rroqBtLPMv@)P>S4D2kRwtuzgx{VSc{eXpJ>z%Z=7U3-uNb05Vn0 zR>J=q?zgkR5lN*o3cRB*Dh4be$-krOa9TSCDDC~)j8|bk7f1}PhO`&RQQ5qB`vf}D zj#=uqqpI0t_pk40JjPT+4CzrdqbmhT!K%-`_`7l&hk_woWF9Fi^Nkwz|3lm4dhKUY za^`r;UD9_U2!c)jPIO`otn2#iGgF@Hlr$HD3mP}^Sw3k&aLuJ zdti6D0fPwJw>X76?1Bm35cvPH=tkH0za=Q`_^$+*lgKT}($44ovdh6R{g19o8h<2W z+rARn8sGaK$T`l$;>r@<@UXXw^0E-WM9V=>C+$(4y%FzDovc-#;|H+sH&Z`I+kC?V zgDR|JtkOI%IOLhXrW%v<*LZCXhbxTfzsj@C2LIYb9@kj2Rv8=`7#!z6CaUwTX}(vU z!E#pJ^aiJ@~0V&8x*PG(>6|d;gWDxTBz9=X7kkTAP~Y5!&A-5ZJ-VFoT9b zOa4Ad676he`+xVAa>oM7{V@Q8P}wY8>6N4gr<>N-Cix|~Hv7TI2t}nLZpbZ2blOmI zO9dq3fnainBKU1sJTBz859R4J>QjSf2To;1(&!Azv8jTWzJ;8dwv>Aq`71W&z&&GewfChLyw=P4*4|@rU{xVOfmlB)DiBFHgyzjJ zU^nxN6&dCi5*y~bk`@ph^uquEgv3YiOdvwcFDypPA4-&%zgV2m9|SBADdw&gE9Orn zTFhTcyqLd?h@rm;R#?oKXRN4+{1P6&6gdW5Aa=}~j_5Hrr1&wvk_a-eq!=!~7^Lj-9=gYgTUG%5p71 zZqv=~<+d&UD8^}j79-u4(q@7Aw-Wq89%&vBVF~V+@H*F>%O=6cX&Bihcz7D3559o;m3y+fX7byV*VZc`Q-{_0 zolxDg3$x6@^L6|h;_gX2ou&%elsP2h97**%{h z3se~#sD}6#K{)@F(o!B4)w6E7{QEqwZeunkio23&xjFmbZYE8p>RM-1iF^|q=qv=h~R3EOPwyr9rV-7Fo1L~=su%c#E zyfj5{f?_$Sl^N8^p}IJx#*OqEO%!ehTdSnNu?30h3bfIxlF;dIZcg8CI(w9t72vBl z3f6X{4W3%=LR-avT-e_kj*JYONNE!+{S}nG8eQF+07P#r|`8iy7+`z7K%S^2~|Qp__@;SK_H) z2Tv5yXYFjeKlPNh3e3Ir3(xQf^MDAioAbu#JVe6?`GrZ|r^M)l(H~tMr(!?RFWmX9 zOA~j0T+$WnnFiX?yLsX`?#Vqx&T^eNJfHEcL0BK`GmG}ZF4v_Pl>)2)hU{`(>g=c} zOIxnL7^CWZx;H(gmg|2+-*~ys-@03_cQt02i>t;QO4v=D?TklGeLNWQUj#$uZ+V8y zua{V5v1QMKt^^Y_I7oju3Nm$e~^^4o@v@!_xBrGnw`{YSj zU7du*IQ+#t35y5}$MO)-g-*g^LS)+eERp1A_(G)kcXaV7?R$zYpQamsgNr>Ui(WnC z(`%3UpTX0Q@#By2qoI?t7&zBpX5jpdfph6-2F^7n3AoSVh2)3-IJ}^7DGh$)Y#(~q zEO%plPVLpTCc;{m4r%?z2l|i%YtJ8U_mWA_RZ9?AX$Ceam5T7W!UQEI`K#$dt9hTC z0EhJyv7)D9UFV*P<*I?s=U#2fTO?6Wt=$h<4G{Ur)#3*2IgbL5Xcz* zSZWWc=Z9mre4NMQ%8SK}G(chR2gwyiZoFfmWnGJ%N{dBDff{31W*Y8@XeM??D|PVM z3yqyGS}Lh%eN)spWdo}}CC4UQ+O;#9w?fEF3a}*iMvm<(>T5n*+j{FY)7tH;eQsad zugWM34MmBPV<5diJrKX)sDx1xnkbPpH${=y=B-pNjnJXp(1{ixyCfSpDKfLZB;@7` zT}%Zek}#{?lq8Fp82<&-g#f=ucmq7&C1WyH~P~Q(WCEL*4rX_A@QMD@j-e`IeqB)JR6L|ft9KbG@#=X=x|T6 zS%t}p0MKTn{$0*@1!I0mbXhuX6QppO^=h~OmaWoLQ}snL?ta+PY-Zj%hLEaSYiukr zrixU0*q)Y}+7__8ArnE%w?|Ctv4*Eaft>mr_3JJXYBFdt*#eE~*|kA0jhZo^^z*1P${v{XD|_fTKm0#9jl=9b zoZ>fC9j1a3s7N!9+68pfFN!na7XE@!f%Afg2AT`V(#1hu>d+=yN0Q%g$eXAioNJb6 zQIcbBY6y9~sOUsR_W3WI1%_Wx83%t294MpE6P##~ESw|V8KEeCxd6ju3T#^b;$KnK z0|Eh12}dNfsVRDqNnfWKm^LG3o&a-bljSF}x$g(l#%>sOUmPl-2*!?Zy$fCvqq-BF zv&RK5aJVKoF(@Df_Ng|59IlwqsLX5XSN0aOHZ<(Y+Q6DJ;4Cvfx`>et&1H)42N>!I>Zt%>4r_s-QGTENjyb&rZ-4A=*ayDWzH zGrN%f50OsbX^>o)hnzKvEbo6#p(vjB>1I-^*?B)(Smd`;+A1(Y%k$sl5#|9A=6U}^ zcs)nqoA1&vvh#cx{ZXDz#eO2scYbSoPl#FwfwV@u5(1yiJ$VU2pg=Ed>ii3f_QEDK zll78s(@77+hHcIk?S&27lqRASBYoO<-9dsd;W&qMU)Ts8+Uk{C*!db?XjQQX8-J)n z1}MB&7V8vC#Ypzu*mcxb)rvN7N`7>!Z8bk*w1G0W^lyTh?z}u%>L!S>ZZ^txxXt-9 zAT_m8KOTl*)Pc8(rc{nY{UnC*fD5;iH>exOUB_WK5@0(zn9t$Bz5)MvDE%1nCY&W5 z0U<&lcS0%NpRkG^TSCSFVG^r@OUUz3M~5`m+f9eiRH$X%EdsBYp6t$pH*6+$M^Uj_%e=1Of_m(3(q< z>m=ZJ49)@Hd#86M>V=-dS8CI9^xUwd6(6d|V~&WAa@$PcPSmwzObaH0!;%aHX! z?rDxSVe5zx9cb=8S&6#>5!)kEachz7(?EB#TI#30cw(ffu8qbg1l>zgO;APM7>!?d zn+qwe(_)Oqb-@e=BAlgh=yxHBf9kdn5Mkngibqv-9FW72UqJ_ZU_PFgU_L4mJxu+Ox>Cwo#F~Zc~@|a#X_Ndn>G~3Z16AmLl0sH*U7BMa1;W!n zC-8EbfU_Hrugr~bXN60&o+we$dSSi(&n?;uD@)US+yyXXm$5RADazDo#Ts~5tz&IP zdP)h>e~NsYG=3WDBxR)EMwh%#4crf6c1dI3mCU? zx2R%tL*Z2SB`Iy=9uPv{yF?%P_Q$)~YGt=Tb>rqa940tPmpti(%9sf zP}$*4l=Gt)+sTDFK6KD)PS+P^U`193>IbR~erQ4k|5RocCaTyWTJ)+9BcI>YY-hMQ z2&-DDP1Y(Q&{C)^k1h!@dIiy8J~5hR#RS_2N0o3?w6;m0BE_*&>T9LITSYf|xD4A) zfO#2a*$i?sIh@+(wMWv>%87pl94%7Cph!sHNh9&B1P;R-Cb zI7mG>?tpkE5;qrY3wIMZ_e;ISpIwga1z@0y-Iq?#EZt1vqh1HjJ(SW`frYvaoSWkj z<^d62aOT|g^qVw{(1MdxOiHk982!<}xm4`)gvFit+4-$odqvkm=BBmlm;#+WU3UF? zZ|?bX)~_Tax?I0*VGucFWN@^Lu|#>sf?oyhexHb>clydYseYFL7m$vDP@D_V3W_!e z*(VN6KUhQ7uNH$t2$exL4$k79P^ZB}43-+Xx>^)$bD&1?$U)`RKvXJubhsNAbMkm^ z=fu+UhnbS{$RmfIX<83AJ&VI*1Wk)O0*C+HTO3-t{@(<+8@gVj4u~|CY)KJZ^!S*s zr}RHr|1qP-oR|3B6li(KA*`PKmjY<^xNcM1H@ku&6d3y;s-V)))0N2oDmR)3Ck~4c zh4h3)3Jk=$ET#1=&E5ilt;FBbgr^E=&HlJYALu^{gz+ zlv~xY3N3ESQ`IBmvUK~=PnYGD(i`D69uzYmx4`CI^*KbJ+sz{+IfoJs+o!tkn}?Nj zjC(+c`>jMO`OKJZyq7n+%`L+PdK^}bi_Gy}o}#iSkR*6+GhxYg7uj_HRP&o#u8{!<%miZZo4VYVmHwf2p(Dv^ia#ug)xb^YxjA1a$=eAU&-e3*xzHR3GyUk1R5+)p>V=l-XJu`DfGc}q~+j+C|wjMz$n zTX@8IK!l}$e+pjD?)39_(lD}1f$(%hr9kRzBuatKZ~an7qL1XW<|2GCscD_*N`wsO zp40>pQlJ;M$ix3zRFK)Ida`M{^qu~dl7-n19}G6e#MVOatC+!85wqtugm& z1UQc|7mew@ayx=$W+8Kt9HgRduxZBD8kN=xtvpN;k+b?J1VLcut-ZyL-MD&lQTn!& zMF>9JlqI&O1a*l!0*8%$2GU4P=m|C`4^8I8{5SDyt_Ig6T1th%PRFX?-xt1*e*lsFGze|)%(>9gZAnCZN zL{F(rrB&D98*eJ{w`IAhv?C}h+WltIjYZ<$ZTnd_k=k!scEQ`BL9pj@7YzOE^@z@u zJ6skR{D_GgSp)Vl^N@0?hi?d(_%tHNdXUCQd) z@xL$7%aWlqTJ!?(1!G5#)^Ru+;)rTztmqvH9VVCXA)pVCkj*B zL`(VhAoV<0?I_W%v}0&)672$gylqGA_#k!mT}WW`f0@3qcI0n`w4)y&gCuUxPh8_u zB6cIia*UiUEEwmQ99kosxO0G?i?!VLaCCRwyi)cIThzlah{e6D(1f6 zoP&a%GjUEgdaCI**Z!SlXJN$P)aZ)-tE(6k`7a@~nJzd6`5f*Z9(8p=2TIjRP_IXa z9IX{YiAH&4U;sylg;1g-^SmIf6di`+xFbOccifHId$sC;s;bBW2Mhbrl|yi3;9g3V zr!)+%0m#yciu19yLmYB#4!7Y$SIHiMPh1&@y#*~;_pM^UnOHZ?XJxm9k0ORtQ~zdx z2~2%2c7y{*p>Xg7zly2&py)u?Q(>Jue?WlQ60!778yksx!BNsa&D0|bQMA+$u}_H6 zeWJIcv;LEh18^Y|%KA?TL5X%!8oAp#0`F%KIr1=slTT2GxFc}*rQYJuQpgtxa5oep ziWMc6|6u2zTaf67JsMWn^_O!;y6qGsBK4E9CHE^b#7*{Rb4}V5H_`&%^DqQ9g=s* zSf;3!A(Zc(8*Cw^NGp4KWWd8e(&k1e!o-%=fsM0?mcThtcEvzYia&Z&p!eF|qSx+w zUj@MVXgkb#{%X9QybJ75`o zvys-WV{E7Rpq%}IVIFV+2ZR+9#4kM&69ooh_XnhbCGDF6fUO5a8tqZRkhVX-q}tH~ zLQg3V$iwuFJs|w8kO#yr?)&Kdn6A&l`7t+v^Hb_`N6z~py3tSX$2NCODcTM)PMSE4 ztwl$$F?yPzjD{4?J+C?iJSnDQ?hD!QY9gC_im)61$Sd6DmZ^Uvf>Yz1aQq|dIaUF) zl{|fBM*5kM^1Ci#18z}pS%OKfd+k@nt+mwlwl)O_Pr=yEi>_4Bw+BC%9DB}oL3h*x@sDH5;@_|HM9cxq* zfyu#^g!xfmc2{pPYh4?+127QDEjtN4bTf&;k{vqTCG=EM+AKgr2k4+HPMzJyBh3RM z?8M3GKJ}|KjF1zDBz=naG&~K_Q2x|e;E9WK`*eQm%B?ypO=qHHqGdsqX>B;lH;;?w z*4%TYMTSlC+0G!cC;2Qz)&ZU>JVO<~x7nI<6b?RFpP8v2q}09r)y3xMpiy#zqXPq2 zR@Y~$<++XCo(2wQMFAz8a)vF=@|?=~;YQSsr%n_KqRt1V>Zm5(nr_q=rl!@ef!uX7 zft>Y*@IE_t#k9SNXffaFJ56s|Ve$rr^LSxGH{-O;uKiypKni z2Siwi_z&atWKS?1^v92zqUe7}!^kc~!sw3*kyPv_3X#;eqMM>mOXm}*xgAD!$TNoW2{~QWl!U={kkee?v>a+wQn~(A&(1of%>8p_;fU?1_wYcxR|2GQ#OXN7dYM@1B81bqb)d ziGcHL=Bl`lH7gsagLm%O5$`LEu(?dCnnZIBxsvJVQ%fG&B? zV2l`c0}3zCjU59^t#1pwFG%M(y(OJEGejT1d!J|t$}>VM?R)z&?-E_lhS31(!nN1* zB{k}_7_5}31voMettTm^(h;rK6r+5Jw;O;lFi;HM5?Kh(wiN40)EwwPYEI3Fnp+2Z z%ifA5cVgs#n})0Gf zGxYA>&XCo_?;yZkXks1vSnxE-$9puaE*uAL@MZ`1~2urv$Z#^O0 z0vu?gvgBThR7V8>+o&wL?-nJ{w5Tk08+DAzqNh|;*0+cRIVy|4Ez78^+bA7~560;_ z8f$aWTr_UJpHW!1x=~na$ZV>^@-9zJjkOl%t6UKk(LDQW^K<3Rx0Gj^)ohVi>jE@N zBP8^@5V~teK^pmdzuiP$t#X@d|K_sHOjEQF#11$SS0nkR%*;kVqpvP-k=x7YtEU2d zK2szm{^KkL=0sneAQ-?REgF2a);wn(QRbulSrGZP{YA``YAkspjBYN_s~izVx>v;_ zjP5DWx9%g1RG0H8)%+Cpl(0-S)KhYz`_`z(%ma$N%#VV&W(uGxN6h1NG2(h|fnMbx zF5Rmrajj-eC6T6o6F56mpm*Jqm+EwX$*Xr^k#8%2qa1YgmSS}EKMM3J2VLo2Md>PA zJ@bzi=v((xrMlcxswxI7AuKY+(V-45?L&M}!#hkK%qV13s3ww0wQrDDEU zh4B2U=&)Rn7G1KFcjRa=#MPAjyTAaZtQVQ+;V4Gou?pW16Y*2gjjkucI;?&~fZ1VX zsTHPoU&9;UYDgGcK)eL?O3hY->l)u#ZB5rFD4a3$jEQcXucKaZQ3{$!e5s&3^2orJN~JoFSJ<~cgpVzI2kGPHExXj`_8scmJ$ts(58Lj# zch{al!#-~4)5)P;anH@8%4lql4}KC!<=l{) zJ3f@sQUPgUL!UPC`0{`Vdoc6HPma(qLZMHj8dBmX!^n?@KBeM5G4!ePTW{$TpP+!U z+CCcc=t!C%?RTP#kIbQuFsOb|aZRKHAhuc5SBg_M$8*cw=8b)?*52HWI?Wx#LQ z?ZP=Ah{#GNZ7A?;#7z%wl)65x`L2Y*dvZ@>f>0>X3mc<2P_!3zqnXxQU2Zi0fI;*r zMseVVWTwxBfp?Mqu&a=>r#+^+(a-iI(m8ldEFBeCHC1Q0#?dEzVu4TXR(Sa>d zABhhA)8?B^qe)-S9iAqIAbe_X@o%l=vjI5YmYSYIOS?3Mhnsdq43Dsn#T|je>w1er zOT$+a;BIJGrVu68rDE|Ob2|8)JsMaSDlX=9@DA(a9ZWR^WQV2QTZ)3Pv`bTWxM|lE zViRO*eiRhj>e0kHQuiSO+zrJ(^S<)TLN%z&7Lu191&?saRFq1csWn^dwL4I*&9IC{ z_BK3up)|roYLD8*1GY(NH->Kr^tF47KATne7*kCi+RedQPW81{(lD}Hk1yfQDdRmZ z4VUgG+V3o4F3&%m0`F-p6fm?b!@npu-W_E{l;0DEFE9`r(I>YLm=l9InF4@qM4#MB zin4fGL?1gaI!5%-Q!1kGZ;6aJqL05V%ZR?)YqNYDG!=mCI;QWLMPm9w9q4CNU!<^h zs8#qbP!bahGOcY&{zaF_gu|;JxM4%9`fzL18!V4w!v&|04c<89-2h)jWvp478f(s% zE7egic*+~R@x})&JQf*i&8u?Z_kYu5%}AspD?9^K2`~ID#L5#Xz>;L~DB4IZ?KO-C z)RrFgHJ@Z~LVq>{z`o@6wf*L07iAct6H~nf`$be$W6 zN+w~hx(VuxLASq>x?mys0jP;nt3 zA=*^J=ZivKfC;mQfZUH`3mTp|pFr8ye2RhU162j#8p#|FGFh9cBFGy~YMg>F=TW(= zMwx1D4%la!75r40mcqDitq5M(T7Xwl$~Cd&NXwj~L-s0Cc&5MsNTC;@B|+w~k#{Vw zf?vfX+%GyHjnf3#owk{1{Umz`Ft0i-{X=#o2bDy9eJ|TquQw)YbJ%TZqL$T!B5ZYN zy`pwRKLvD-Qa9nFn}-Gl?p(lfbh?c5Kh%*Qhya9CB$*4ywJ*(%)c_X}R`cIL;||+; zBQDU$x!Q&ynSrF~{>I*7F^)Vn7GK9$EFh+A^v7$|M0^}2Ho|7`c@_c5%c?dmrdO*48T8dvC9><`{D+HP-w~2B4W&3@>RX4R5HidT@B-*NgVgmTyt)m8XBY zTef_Q)2-(g?UpUyBE_kcF9kYlePz|6eY4JS(%1P`#2RJx%$;X3h#Z@eV*5r2AaO_V z$#>95l1Hw>7E=&!VchU3-5EWpoG4XZ8Iq!vqLB23`i_JA^ypUEEhw+3!%7&2r*w2TsN-9-EMQsf7TAq0o*aD@y7{W#tZAn%-eDI@VNRS zd0rtJV@F>T9dR6eA&N6@z7&Gi+RC239U8i_vhNh6gSB3glP|i8XkT@=5oA<(4e_O3 z{?oS$fe@VbJkfutwF)R@yNbJm04pLgY3Ep?UhEi!cKAC zk~%8pzTlwu3A)b2LEY%8_qfe1!&9bWaB38Wvu(H5Oj3aN=*FGajDZ1X>L%8IgDsof#t1?Z;Wlc!Q)bVLC>Vv%Ot0Rp_X*3i7Y&}?VF%hNRv|Sx0gO0m8^px^o{R@3#4;Ftb{biKE;tw>~lq!a!0TwNwTSCN)=gnzc;yeCComP*dKE9BJoi8g{Itt9UR zGqW4#)py+H+P}T*Lg*cQ8o!9+x;jN=Vua?&Aitj#d7pAq?n%oNeZCgp^NIfy_th!} z=2YbET|vu>`il%t^*?VF-YW|9Dn~&}-K$~+EpIB&x9$sCsxIeInH{OB7_bDVXpCs` zk0neQ=672A4+yiv;}ktVRaxk=mSuF-afv$8-#A1ge%6S{i*tvDkfHo*PY7Y2%N;tu z2kO4bq29XEA4hmMt22`$><|qXaVR$ygH(v|MNgeX*c==gu#Z<%VZd-?7Ue@c+!&z+ zA-ugtEGySgtBd9lAghEvYNF)pf>6AE0VYgw5m`6wQKL>35lsm^95E;D^F=o@*+FTJ z7`rfi9s%ZsspTJN*X&N(n{*+Q(pFtkjf+;@QJbw{LjijUrexQqR&AEg0|!^ok>Sin z#8rm$U1zOHZ4--k^P`~FrQV{)I&5DBz=;l9x|w90W_Q@;t3~&olr|F#;xt0AuG@F< zNb`UQul;jIbo#$f!w9)iQWDtGw-F}$}A>V>8jlQj*`&R0@m%6ptG zx4d%G3lzSQX-b{vdQ(u+_j-#B>(l)X&tV>JcPNPvdblY`cy5JS5O)L)PubEZiaL=1 zcSBLqKWm0lI8y(T9t|`s*Zn`mEce8x+d;ywN9Xe`>K&i%1w}zvpDs;lPiVS;n72M% zX>&?ruK-}{)0HctDD9^CbeRk~`gG|j<E3>z+Nez~vRAije{P{l zEujwd)0caZT%LzoEs-wcQ`b@g5RVVNAQhXqBZO{)=0Ber@5XOC=Qg(t)9(cyjoZfY z*}AUBK6)n~a}gJ8r6gGgIU)^T0`OQq<@HX!p+K*4cqetQig_pBS)gy-dnZ+w^9cVG z@8k=4R+6SS&WmG#C3q)e7|?$KVakxX)Abte9v<&xB!5D1AqQ*z6}sYhCWUM>Udc$s zl@O>nk7Nh|%9*sEFcL^bFh)``h8v){cpoXN8fs9qrfIP;GlN1ZTtqup zs^0GU%;FRdv?mASoeMLqn)zX1$E5gS2%u1pg^!!}>I<}>L3G_Ly)uv56XrE3@{eFY zgo62dfl6s3<)Q4b6-l=I(V;dJIel8-0OWLJ0!aT|bffF3uuJxTBfz}CvYbTfh?Z#PS)NI{AAi`mIo3cKA=hiJZqgr@S0Dy|Rv=avSo;>n}$fwN|+WfW{lsMS&q z!nQ_CwS6#Tom~Pm_3}iufolBRXt{+gi}8h4b;R(G>)%{OPnz307?pn#l>VdMqSyL1 zzYoB`W_&Oz-L#@gPHJ}FX8a15Ta>rNh)>*_+;#!pwm#0|0XW|xGrShg>*G9`h7s~{ zlA1~Jaq8(fD2cnhawt-wkbV&88tfOkbdM4p649=%HLN9R+WsuMeO~Fy9 z**zZqC=Da`EHev4J=v)|m*~mv{8nvy2Pqd*RHw6~GoYr{@a{B8MN`)Y~@dil@~4C@}X>Z+XM2)Hwp&jY_@MR>by(hdr2-f$eDw z(nV#W){swxq+xAFMy*jJB1*~1r2AsrkM$OfR&~Abdo zPA~eO3x@np!I1e|o*`dG{UHGyxY?pZF8O!jnf8UIy7ll(y}o~VVSczphZzi$##Kv= zC4U4DR(+v4OZG(^KU&|9!$>`TF|Y5W68=zJGkuL(Z(c}! z58M}urZ&-UjNjG%x1V;*F^?|!Un1;Wgx{O~chxV{PxVVaj%%-J))yKTB$hFcxT&ZYRabM5pakNHoh--hTijLRW^guXt9p4o(NkNKDJ^>SR% z&=vg0mALx1(<4{$-&f;$$iIfZPv1n9D6YlVUH)~rf+9!p0qVLzecY%%Zc-maV0eUx zuH5vu@{c7&h)jF`MkM(KTo(N8p__+%y7Ab8|0t+}D2pFv7Nv)M{zlyBKaK}tT@H`v zHwglIKo1+QW~>}(udX#`>k~_dG}(Rx?=dH}Uv%W-%uPXd#qK=%fZZ`24-h8y(dB1! zS$P>Q+b_pu2VK5Gm#@?1Yggd%1YNGb3YQz{a{4v6oJ*HEx-{u>=vrJ}K^HoE-RC3Q zsSvl%^}DG~kI&_OD7)Y1q5u@q>T@J4xsQGFIxqOQDjL|KK6c`RCPIDOr9PgeKJHN; z_o|Qk@c~-gOCQJh&&G%U04|SWb$$1eKZdV>Q&t~$os}^E5tozoMX@2Z`8FI()0nBv z?S~L#J1BC2`jJqXL{jML;j zt;Ry7wa};z;V@Jjb6T4(&kWG9sMSV`Hbkf{FuGEmn}Sz2wj($=d0}x5L8|*}=*@j2 zJJAhE4nN6^0r*dH-~f)3-e3XEc8v#gCKeNd?zg$*8JMpH=spMr_qP&YZ9N_&Zjg)+ zLzWkELOr&+D)qU^+SI5wS^t79d(`7(O3TJX(j7NbQ)=F%bl!9Gu&Rz)EkTesGSI zLxeXEM}vX|<_b(<+)jE5vX4(dc1GK?JqS^`fE8k5W~pY8rGf_P!xmPLIX)RGJHY%2VFFU8zmt$2)jK(kroBgQ5dE;d$dy`-)D_j5rO%My^RY9vS+_ z&FrN{w4@9AQHm;x+G zFXT8~jQW~S71%f*EvM}1V()VM+J5V;f_;u>= zH?j}#^En3iZ9E(D#jE3j6GrP%M8qkB3&b~ z_(3H<%jvHu}=+Bof`Inem zTF%=F(jifze-kvE?B=C^3Bv zAtsxcj=FkxZ9@zXA8+V2Yl#2Gcbnyk^||)l1}@ogq`yvh^|^s&r3N=W!qO|=Osz$y zdcq?c@znGhxL}Y+#h~RfGeLgE?#e~IGRs{msVRT17(FD_k%|9)jp#<#lVF3@ew_ew zu$rZI2(0Y!-+s*)vI7{< zwOAJf`tIK1#zvsM9e{xfZrQ0MOgF78kTa4TZ|8*bZq*e%3?fu(wqAu8>EkJF7GOmi zwEbZoX&w;W1a1E*4I>n5M{-;RZIk7!<;3S#;YVJKho>PL&YL<5JaKW+d7a-XWhP)T zL1};;MJi&7u1D;WpBoqK{b2pf${oSx59r9s$=!fghTBN{iT9W1yw_*LNU2LPVL zP!R9nJb_a(BXcsl8Q*8IP1j2r$haJF%CUpUOl0zQ8b2sP@*%5k5dAV^< zZnPbDb5G}qx5SvnR{?N7Q`w<$n(D(%pmf)Og&+y%`W_8Bta|*52R(Fc2HCF4r8=v@8JF z2CU2VYgA681*|ihbqrXir&PfDONn|pV4c5pj^1XcHmd=4^@*^ruEs1~t7^<4|7+rG zXAD?>Ee%v15*G}4iN56-GVkQ34!M1*ma5@Ea^r>3%kAKqa2R?y&agDW=8W{fpP_JL z!-WvBmWP>a#3F-uGLXEhKyt?6FJ>UQ3LW>~LR|8jxHNUVIRElkGYAx?dn#Csf6MA%Viy$e5V_noH2r^W3cka33a(RRI58{asL@W}9+IG)Dk=$nw>c|@n47#pkn z1s8C8JmV%#?pS4o()3W}y?>2u&piki zLJt?ceIu3Tfqfo_9nwO#g1Qd_Z~}4_6vQ6`f~Uf&slp>~zf#aC!qyOZjQHjeZwFS{ zSVAKJc@~HH;2g3A@{1$T3cmCfV%rAjJ?aI;xlJt0&Z15HtJa!9U^O9y;xRp5hhumL_u~v;j@ldHPB0|kZH`;UB7KpM zU<=;#sZ&7&Xpj|*B)fX0#+wXWbc3FlS4C@ry#pP*dqw_fmFv21yTlsop!rX16l=xy z8buP)-MNa$L<0S<6rcrI>zn9?@+MMmwNrQRn?TgR*u)7xjv-HqLML)l4j@IM_-$k$ z^2{9rW$2JVi0CGb=rd+1B_vVlmsg{p>N@ro(!Z zJ^?>Hj}*!nvmNyA3Q$2@%(k3KX*TsKX8Vde*lx@csI9w?K&HXOKqmdnh=Lj$v6MQ< z?9th0swR$fNcICM!XtM`b|nQ^k|fFzl1+WhCwy%5p|-?rNcR11U)#^mXo(y0agsC) z`D9MgFfV9&3xacU#9I;VaH(KKS*6L(Me7m_8NmC zeR`t`8_++Bp}e%nP>M%fcOFVK2JQ$%T)#O#PVxl9{RY72^EWu0X(O(e7+4=8u0Pmc zWPG6a$jD;`Tg)az26iM^r?tB=BIA?pI^tT(pCu7!eTb%n1Fb(x-{?;hXieX>^tOT4 zAz7h}q&@Un;IV;ef4Bp!Zwy5`rxrvv@>hv28(n>+(JD?RpL|0E+QwO7|68CUVufWl zP|j5y3^&)GIO-=-`kSbFip%S-yUn$K?FcLWFp`%=@bv0i!|Wt!C}B?W=!+Eq-!pyj zGfZevU9<+#}B z&@h!`{i@)XRLL53r#yGZ?0mg}G8G6Bg*Ow?(Buzf$6OPR&L%mQQ37#_Dw*IR&UHsg z?P`UJb^rhDy?LA*S9LFL*^(@`ZFvKX_p)U?Eip6lhHZr9*p@6?mbF-tv5c`tt)3c9 zmwLL#-93`W#w;Ni8=8HRkOVLguni<3;TIOiK!A{69$O$JED6E9m*kg)JtV**B=Gy5 zbF1pssjd4~RnLt4vHmFa)N<~<=bm%!+3vaI3@)ic1t@Mo`&EbicTsS=T^onLmR!12 zx4SVjHBAoGhPz?j_k}9g$wGES=%%9?`08a#xtLB&Z8699buCH>rs(I{V#uJMg-NvD zAiB|?L`%WE&dj=+0JFbQvkv6Z;go2-r&!$RMC;uE3{=D?TGKM34_My=9nuP4zVS^G)?4!Me}X>#r1x zLrwi(Cct^9{|x)?Y8@q=nvLwq*T)56$oSv43mSNEL2`Z-Kn>EbW%mr0rhi5|i5dbu zOcH3x8bYrG>?3YShHAnox$qS{R%I?DzQRj+8oF|=o&U&_WP+Q>+DS}Qh!n{%5S@T6 zZ4tRbW&o@cu%(e4mKJFV*vx1>6R_zmm5qEkQ7w=UGl^Tbn zf*6b3OTcENOI0k8_>egPn{y|gO2E#QfXz5OdpU8zldY1sn}EHI_+<+&egZb#2_#_C zGlyA&GC7jh9F;&VH_$N(MV=~l+=+~P~z7DDbYv^M_RYa^gdwE z9%{DyCPZX`QniQJ5iukq2YX)n)NCxsY{0F;^FfKs(%gMVlxux`HiJ0uLnzMM32-o7 zSjq=jsp0t6v%=-Ey%N{7(zqOHnlk+Ul;K5EhM%6=pz?Md&uPP6ZzL{1oYGhlF0-Z% z)4&pKg8ov6^$fY?o+C5VZ|d-~du`SV%wX2^;g|Nglz4d`vDt*~yqTpCyB~R(1S$>} z!PQ{Wh=+TYeh#A6`72OGToQ}ytz7g6luEo#Ye4;`6T65;O7U867Gtw_yjj#O#HJRf z4%#ep=X#~eEp&SEf29Z*nQ|(-TmrgJKNp#@F#OOUzGDF@NL0#~2dLk*ur69V3X~)3_Vo1-* zGNkOOY`urH2vU!qXO0t-RIGn0~v`U8f%hJ(Glbs+XO2m|=hT+V3ITrDALk^8 zir$|b(_Il~j(b6f`q!ikB*ApbQ~mkDXmj1SEwq8rWB&EZ8eWFN)$t=$pxr|G-jqbD zK!={I%|Px=F-`A^;;pB*z@WPR+X23?)#oiafF%gr7_xDGhfv}vJrRNXYj`?1fy<&* zB{QFu%EE45^QY09ZcyFo#xbT}2|5*IT()xn7fO)dPss7*Q>q{jdxP%Xh02kx2zJwu zx%dS+!gbtm)Y{&lY8Q>#T{EbqF+PrZx^&*(LAwR_rA;Z$C?egmyrVAR6phL%@>kN! zzUNbF;|tmo!G2#5=#*xBf|Tsb6?C}BK1EcY6<7dKEldjZKZtJRo(!EK^(_L-8B&^` zAQt;ifxbhDZmT?At9DjfBO}&E`~Y82g=u)|JC$04>cCVw>V!-jQpv7b&k~Q)9+$xQTM%${Ipoy=@jYz0AQdhK1G@yYH1{AEI9!xoFcuH zuqq{lx+PfkxEqt(%D}2RHToC;Hd`ZunN_B#(JN^ffz)VPK~!pVK$F+0(LwZw^Qls? zpO_lm`>UG@C2lc^X^lsgdXx0&A2OL{paY#qN>akizvkLqI(_=@8N`6nr#BVL09rh5 zAi#OVVa!xvoRCdfgLsK0!VOB`X`elOYne|I=sT9~x(=X2YMpHYMr=~(VI9``ZVq4xj>Q;yalS(+Npvj!4W7=6W05MWc~J>LH5}l1+Lo|KG4@coXT}4G z^C1R?t=v6dB|P}73o1U1%DP}IUW5HA+p$UO_%l2}WC*^^dCcT6Lp6V`9t@B`A2O*dqDR%BO z-M@<|&O|Up=$@v3zUe-Tv+&c!;!rQ~pCrI}=zqXf6#llLfd`i)=Pm#>@CznaQRuNa zeFg0#>In2ONu(v~2)t~`bK(TE{U8OZ38&=3S7H?f1AK)S^E7njT0OtalVpOMh!i0v zDnyE87>M?#N^3-}kr@DMf2uT`!_p$npURBZ)1OLjDSzq(H{loiQ~6gue`>BV%gj+V z=0JLB;%xU>Md1<}C|6Oq)E_ecG8r=OOA#*Q@Q}ODsH2L4>(ouFq(JXk?t6i(sPt+I z?97%*Szxzb=4uMOo$RS<3c0E&Fb<#8)fCnf->k#MucknE0@W1gnZqnXo7tSt(}mL3 z9nN;Ad`gGYFv$Vxkl%Ds*HyUL{9rqjZfx6ztvjwMq`tyw9!!g2CYD%8c~9tbFC!{u8GA4N64E|{ z&T;@{hLrE}#Zkarr_aceag_xRDGJf)l@_|T@U3$lVLuxNMkXcL61+|g#R&FOf^K8V zZge=$a9gD_gWSUnC|qo}4pumYcPq}ZYuMI~R1v0j>fo{}0d6XaY(UGS2?BKxk77n~)>9C{`Oc6FA4WiPDJdtl+j!v#3g z@A>99F)6IE6X4CP_GzNOrx5e47u4{&vpkfrKDdPUKaFCpmu_LQ+&m8Og)KK9&H*ez!p0De^C3cs zr|U!{>_d1uPzlSjR29?kz5Hy3N!nrA`z>^)8`7}i&j~yuSpcl|d^B2G2T-7-^*abB z{YmSvb9l!FIQcr*+h4KTwJB7=ASXH{qQR9&hX=OpidC!fsejc24I6gmK0F$?nvGJs zT7zpI#|Bn$)L_SMu}d-JdM_TlP*ML?3|z|J1VPr9>-O*wPl^EkKY<4<*9()Y{y(A{ zxu-)Xvi%nUW-ptjeR5MCM!D)IZwvBhZrtcx^_2h&RImwqq!rr7OAobVkgX=?q2J>Dpx(ALhGUy!D$Gmx24WPVy=4cuQKMU zrvZ+vsC~M?dE4u;#uF6Dwj)kAb7r|9bisOB*1w@++89)+&{X^ zx~GX{8-e!bOk>>gtflBVe<;&mLsSs24q^GXhlZ`8_GD!mKT1fVKy9s7t+KCfTSGYi zS7`!6(v@^yQSDRmIeLJ!^I;3Wxfk?@><6CsJ;75Mr)w2EOFApPnV-UGqUW2!vt*^e zu2>vuO79ZjJd{4*tn_ykH1Oc!<6H@#g=D4oSccw?b`rG#dT6c<^vX*AlN6{~7i(jD zC1#}?;48drr=cs?I{8+fBoo|3)=6TbLZnEBf#|GsX?IBVG6P_pl`bvXu(U|aN@qsv znUzj&sTA#hr(c|v&cAx6XmhF_t2^xdBSGf-WO9vJ`drnR1CH6m+3qtd{TKd_f9VgI zf0+!KgT1Lk?w;o97$clkmX?_AziRQTednh06!`uQg(;nWkvTV=K|Gb4o+~$Ojut75N59JUJ2_z!d#gqtdpQZ!un`m z3G2H(!>W*6^{4sZ64TVMUUk4 zhX0~hOZpI{+;%DlaIhZd;8K42G_2y5HKgAiueDW)TrMg-VO@jTxh<5^t$N<`p;GzQ zW^3QoVNOLz}4#(Xp=rttm@Qy7=!?HX-yj8IBIcE2gYt9zvg z`;?nCJNQL?3S%#^B9a~K_n`m8VE+@D6C5GQ!c$Iu|9GtJYkKAc2m1G0ppm$Y5ZPC` zU=Ao9_?q3GP$bU0saYAv^3+FCus<5)17GG%VP2B0Qi0YSZwp14}3$6>>Ax^ z?nqf=&v$<5Hl zPTuwRUbGHT`x(UUFZO<1f*%#SbE)^^Io^-U@Z(Sok1qFqT;ctAE`GG9@#vxp{a*~5 z@43M53!L?L{snR$@5Q%YxvFE|-NDzqJ8kHyVe86qyImb?*Y=OKrz=%^o#nq`4PABB z9o|aho=C8azmsA8Thh=x8tTFl%Y&#)cKj_?vO7|M6`+1mUkg*eZjSaff2Ht_XEtOo z(9#$rSpiwD7*@`UcT-GGD>~rbx>R;GBL=_DUDO3%mkO&HZ(4->=;5^-S>DxlbFa{B zxB$C+%He)>OH9cF=2K#li~ef>U)aL_QU(@5!wOG)dYE#;sEEG7=+L(XO5Q$Ll)Pmg zP*T$CNFq|=-eI%^9|**JWUz?&<9R^Lp#@r0y;&$nX!B^dN8TH1S@Z9T3HZ`rC*bou z0nVGAEm!>|>t)~Yx9HUq8G7{)+Nh-Yvfqdol#=T9>K~Dj5v(cFoM*L2;$Yre7a0F; z28{nfBF4L?v}dNLo2|}R8^vNecg>(uOndG@*L*l~iJXXtrIV6MtnDfnn6_AzEYAik z!AR@5+(%lw33wcok;dkj+ER3SvH{>8&U^gL@KndTX}X>w<(|yzti-Dk%PyeRD5lva zC?wUg3rFc*%8{UUr`f9Px2@(r2PL@Fv3EF7mkcxBCr8JLRuBkk)@S!O8=kRJsh7O1 zMdNm(jRSe@wh9wfEHY}Wsmk;;ohQm+*IJ`v?}t}=3dfR8TAikA@kmZv`0fbSdpgjs zO=cMhNU|^bi6Sj}#b43Y$zu4RtHOgeyifS%u`wJ|+Zh{6-6X6{on!{nn}s*!auAGq zJ&N@dNVG_*Fz^(7BzYWu`-|LV@C0IR!DV`dk2lXwQL49pTX5HN1$jw4CU94tEzHk} zHkW^opr*>{*>#lEf-Dk9JnXtGhyb55U*{gq=C(f|dB-S^em}F(oqs=uzsx#nkD30-B-HqkWVF)w`Hv zBdnzMm?%YK?v9?GyO{o!2EhkS{2Tq^T}=F|_m&<`=Vrx-EfSH~Js?wU=YG30#_r|< zZMEz3smgwr25GE4JB4Wd4wTuq5eTVzRNA3(#_`ofsUkHZc=DP1# zY#CynFbbg3lbMlYjhFF+__z)ic?vxaE1jXotZ%ya#4Md=K1(KM$PzNSEv^AG=Vo_SX(#{|mFjFl~k*Cj~sRO{-F^qN+rPJh_yAV$r^s zNqef+p61f&oM(+90 zWh8DPz@)bX1O{YX|23hWtD*^Ikn(D4WW?Ia!3BgWDh(oU4mgxAvesKS;>PIcsCCiB z_+z784J^`op_B%lnEi_VsbaCBt3lNO7)W52i&TT6he^EAe>JG1fE<5WZpGBTxg11ih*O6$q~B8c;#xhl@$1;$Eo-sCM(F zP?B2juhyiJ?LWNq;Q-l+DM|w!S#?uvUpK_4YvfEAPmv4a`Cuj`yNI{VlIL6yx(d`z z1~H&2P#+~aC~lF_LhUgEoJXh)?LxuE%_!Kok)x`!bSwaET5V6;Rg`MPW<9l7O9t-y zD?veDC>9Hvfvh?j@ai}TjUkGp>N?JC7!-uq>e?n%}=)+5t z>{2fa^7v&zLkkLU=Qjb=ppKF^i2h~x&(VOH#S{^M|2HcLEdXiu3L)PNl3bVfkt(Fr z-7)~yjxlMkgvm6mybsTRPsbR&r5s}y@4_#3jPb90jM_Q$PT9CNqZ=^LjaUz0K^r@Cu?W3IH&`%w zFlF9vBSJ9KQu5?T+!AfB`<6xL0SwN#?`4WO|K_j6`*aj*Mdl^c0p4smOG(9?%mFOH z0q7IWuOE2?@<;K{@hiV=IxtTl@0eRfA*XX<1W%B6-Nek-qc;gYz+;0n z=VoVi&+P#=&hHn%hq9A)5`ugVH}d-xUzuIF`-%rIbj#lo1DBdf2D?Ff`3?(#r6&J3 z1P&I=!S@HE8@Z=KTQKhx-Yj@wH3}Qg;zLR$+Gn5Hsx&zlD z?gRpyN5su~?mpj6@(*u0RKvZ75^ZftDpu04ugdS7%* zS<@760kD})9ie!d`1z*zEbhsxi^ZX){PhGl59OcXQ~cQYgjEjK{|?0G(!G|)1!2go zinkOr@Ze(Pd=Em(zlqg)h;)jQ9#K z<7w#1wQg?XNixArM2Zj-6(U743`Bd0r5z&G%?yCGmsnc2VQG=(C1ytJ=_RJOl*{y; zM7``K=3n_-rn$x}3+<>e2deQT&UT+(;`h@)*-QL~{*d{X$&k6gpYRfghunRdFIm&- zzw5X9F8$8VA>ZSn@S|&(W-k5CAf77yo~!gbjFNo$ox@_6xn! zGl$uO>VrCSbfNlQ4wnU^P2>*mJ*Rwphtv2eozdYeNOEU7nZ03XP-^YahNPF+6fo^aDGy8|`v+df`c zhmAZHZmeT&iHxadG$v)!zOHw_JPO!ZM)w$_%Zvti>NPGMSTxdW;jgqd)GO`KKoj2* z13o?4uVMy#Y7}r_z$Fa$-OJ)<)Ol~x0|Ub5tu4*H$;%R z^{E0YZUO8r2Y9UVa}Eh%;nleXz`94{ac6egp6eb({g7U<2l(-!N~X~{83vR>uMGHC| zpRI0rFTPxn#Vhzf<@=euOpPgBo1n$De|70psV-U9-CdcQuA{D(q|2nYgf?-vIbEjB zzySW5A^vdIk@-`k+ za59O%3Th#)9tG6!tM-msyRrNnuxC-iYGMLM2Q{j8yF@DvFO9Um>_ta50-8FeVXx(} zdtmC-+J+Sr3*9)^#44$JT58QviyoHPS!)*^&|9DNYHPJeS?#64sf-gWOnmT427<_@oG6+1EFw^mP!z_qAv*Sz9y|zHb3AQ{j8MN2DVW znopCzXDZgEsRe)X>b9y64w1-CC5-Q{78XSJgb;W6bIy$)FIZ1D^8xcYO%q(-L&u_{ z|AWJf+l6RPn~1RcH_heX1~K9mSC?RY4K1*#Z;F}tO0l%67uhdI0S6Y@^D*#wHQCGCoYl}B@1NV|oZ|k! z!u|i3N2>d$^WU~>v6uOMe%YZn9eT~7ckE)#_zM(o|07Gb1d;C;nDMEIhZ!H{ukIOG z-#xMlX~gaDfnVZf)-p9m(94-Q0R$25Sh;(GB{)>Ff&X3d`>YKU~9gFO;Y`(j^-JEGv?K#!VQ-Pygfg?8A zo}7UrA~2ZtM0Az5bFF(wFcTuvUWrKZXu7nB6q|JUB3(XDmm}%HFY#-}jW?B_UF@>NnPZ&WCx zXQ1g4;4f#O=|X@o)XJCD?SpoGZp)JHQg(eflcz!%7ox;8&_t3Cfu^%!ecR20cI#lx zK4cPSI*sB?fdyj31Cl+w^t3o|p5YLQD&0gh&rv1*#Zjf*MMago!I%e?PTA>EOHyE8g8-^fkUBI3+DSB2J!+wD=n&I{fh)& zaTgFy_21(eCHh!!$?FMWQUDagC9jDB4sglSFvM`Q>~~;4Y^KN#JZdgE4C7R8c=y`X znYJpKq=lPX0UzgfW6$a&f=npq41v#TF2}i$ja@+@2E?}DZ7h>#t~sruXYk>5>?xeA zP^quh8&l{^Wbzqa*Em>fH5+6_;=`>JC@YbpQ8(>{wc67t!&KW>x4Ci?as?V~id~U+ zj{vnQDw^h2Z*t>WhBv#J2wY0aovtv1JP^5fu(sR|XC zsMcr3DX4~M7##tC)=Cuhvs={)#lOne?bvnwx=Sy)__EcO_X-^Zz@f22jW)TPxra@_ z7@tAy3Tn67oSL5DC}7K0%67Y?LyCX{*J|5>a~4Mr5F)T?2ma69v(x0ut>b_+Jy=X0 z`oS(xOu#m~vti>VYJJ15=X02Fm?DUnDZ(}eRfX#l-dBnmx;NdJBQ+0yDbBI3Hz_*F z1c1X0;NPuQ+CU-I#Ih04v|AIPuuyKa1wD(&rQz6}{zNIkpc5kK@ui0H1MMW~K2+S~&k>8uP1W1+;PVK3}7 zOLH_uyyaQ}e1@WCsnwu!kHNJSn43VN+{fjU?n`0oP1N?!wCr{3P~dLuCjQ-CtCyTx zw%#;4jpf|3taZro+22@aRmqp#;yZ_GvLCoPI=2^Z({22fz8xe8* z<$|EBxCllyvZGGb?oqYzi^3ji>05QakLlsg?tH~1 zNsCCKZXKi4@?wpmKsig%N!jxeDC29^C@co2V9gpeQB5*2D8YkL2bCYgH)Eb>)ka}q z9jvr!WQoC`q$Ek0ju59X?Kl^sM74J7FeN*%z1EUF!oSLEJGCi$HLRy*3!VyCFr$7# zk4o@_fkOnauhN;Eb&rxpML??tvkO)paa{{g$v(3?Ra8AK-8xxAqhykK78RLVZ2I8? zbvTOGmLSB_(yUjy*v1vJ!4XVfNpCspFO!a7(-~usZ>8bov zeAH^eW`zOnXQIj+KQ)D^X+MGag<(!sY-L>G1VeX|Q+$^!rAqJ&Xuk z1KIS-sNp<)GK|@jIaI6Htw|)wBl8}8L1rCy**9cdbD}-zZEXvh9$xsX*?HRQpi8sTRNrv1z`G)dNa=wZ zXpkRN@(jm##DaOx_0W7=mqc|!c+SBxsOO){wVASq|0a+3d>sLgNT3e!me@>38~l)vw4wrszulj z@_B!D>UrjqmW$!fMtg;MJB9(wl;I8S)EGuz#&&9sX%E||fwkOB!|^#YEc7>qi9y?_ z@r}vRY?^1HxVA{5*pY!Kw2c~B1$x`4F(eYUQPZSCK{l$}i=H;>K90R{v~tF)W3sV_ zsjAgE4yJOgT*R?pI;j2D2*0U4(50O=OjLSZZ6ZHZnZ?1Es9}J}6{2~tUpR?Sl^dbW z)he^l4QL@xkTMG?UJKg?SA^plu+#uf6*s{i!4f4P!g8U?BH%-8R7b)ELU}laGbWhl z*`E}^!&de-3bDY-y&E~1WKCQ5z-)Bw*C~vrVUGZE2N5qyheV(XIg^`Ur71(q+aC#I z85LO2KNz%)ag)Bi+pkf>=4#vhDg8~*wR5R$zsih|06CVIQtY(X1K5Do zw&yAPEWp3rIJM1a+ON$o7k%*-R@fd5lfjvOP$5SAO4@zzJk!F%Mbg3_XP|}tN;1Yp zonpu$tg5AvL_w;W+l#QO7KYwEQLnlqoUs0B1t!R>`!3A5oKY9%e`SUFNf4gu)=#5+p?RG) zY4)Pgi0z+DqoYJI2{amf7N*hQvk;9&T9>Q*W%Epnb zWbtI)-`(Wx;<6B%^e%59B_sv>eI@At!!c26lJa6ar_u?O{Rk$HHSzhb9=(byt;!1rJj&b)U{Cy=it)0^CpAQEr zyr%k1wW-1ngtE6+rLQ0<2tHiifX+b`be(su)3>zsW?vI~JK}ec@?P<@o#b3YfY5X| zwo;J0ci4l38lMOBuJbmwmanFr9GGUm#OW+5SXtOVA-++&2}F1H1|q%KkgpuM==jtO zl9cfObhE8W4s@ERQ_B1Ir)=y9p=>B*@=S4wgVB<-@q6Kmw@?6!*rGoKGX#Z8Z``$g z8~p^@x$G(J3c;WIunUCP0$8+Lhlq~cz5YCP$R?}Lme9$#%BO*S4lL>a;P7HHsXP59 z1Yptv9~8 zx8lBju}K$$xd|yJ-lhO8T6#(*f9Arv%m-Qq|Xr{%@mq_h~KLKs}kEq4rbagY;~%IM)-m;9v(zGhAjPS%W|yo57a>f}Cxjl$2LES)@No{|BSnjmy)6d9>abaJ$-lITl%5VDz#Da{nk<1{2s zlPLF%Nkl3>< z9g%!=Z**XOATPqM=k^?g-!WdBPfHxF?8L98bRucmvM$&(V2_!Hjc_igHw|wEG4u-* z^&a95C!t|5)VpCL{7zi=(cNiRn?TVF_e?hOuiDH79B3-6^yaA>jPx*6*b>mo!INNtK2ctI{EG#^<*MDS8j82UH$B~i z2bBX1q~=k@S~n+pHW8`+JB-x6pb6~$!{D)dhr;d?3xM6>opysN8nN%c+N{q^H7vdX zlJ!<+IK9=Horvb2hS6*WR^a<*gU9!s3g15-Jibj9M(5+uTb)0p%O`L_mBdfd?@!_4 zO1Wd{Z$4#J>b&7F-fb~5^zY%F4j)G3mzxYIT0PERNl#|G&QE3w54?M#Tdmr!-XBe? zbKkJMlKAOqb*a_Cx1e@*xC`a(DcaeryW!jh%tTIu3B0QN(+zlL+ZsaZK`=3g2WUNd zi+>Qz(CwJo?dXYr5Daxo-H8q*ZAH|lH*npLrw)S2br1~W@X2)$Ot~A+_b@Z5)@>yw zzZH)tzE+uWuIBS%m}hX42sUtt3==Wa?FB^6tLSnzUCyA(S141A!e`Di=uZ+z`VblV z^Z|!HdyqeQkY9h0Ukw~0!@!yI894u9;4GIII4AfLaEFED$=IIkP?^;M94F)4fINsT zOWLoP+d1cq0W&~JMg6z^)Oa66IPcQ0g{#6g>!QcXXqlx&PS4Y1b^(z&Pm|dJ5Qbr} z9;e9=FPWYuL*f&s$*ghLhF~S&_S!aA1YPT;aJY5FoV{?C#FrcXsC?2rhmMxOi=Pm-8<^W~NfqF*C8KGCy0TrjgbZ;NVd;52GHnM~L43xoi)T*8Mn>Q7i zv(M7|Y^=u2ne#d70!v~-%M&5AoETwl;TelQ7Q_3yEW`UYb@w~{5AT}>!~0=qcq^s! z@aDDb{3P_^a`mG3g7e=!p7YY{eI#)5Lvx%sD^~X4@t^xR_%6VkDT@($`LPe|Ul~{w z86hWB1R0^{3K{NAfs7R|#9VV~ysv5XqJI-)ECu+2krDP~q&WaIW}RnZ24OvMzV{D& z{PyI>NNW#cMm*W6k0`)|DH(oeEL zpK~to9=XH$G!2K-*8`$N$(u(BfIqzuFRSrwyg?9h!gq&!{Z^?kRQeDJyIze^QUIvJ znxChu7Sz7K5>z;nfeQO^+aEUTp_;8V0u7k0!Dy*FbY6v3HlWSOYVOv(g1UNL9x$U` ze`57ki4>-DUqU(k>#eK9>!{yqvH}}ki&yv^6>G4*Er|MNF`KgEiK<2RwRdZ@x$dKj zTpjf1U`{JQi$Ft|jH1#fxrCWBSro?szOY4cF9RE(hVatCBI8BHBO|hAzXV3TwT%E8)cSQJ;U$~4@nSx)6!o@L`7J&_&^uvl@_sF#4ie^CMpYED34XfCLn@mxO9)4o}KF+OGOj!#;)UPtuv4W#hSWLFoMCFEWU5brDUaVRpYoIfAS*6^&$8e}1JtgKY%v3EtSVtlh%I@NSM7 z_V12bw=`;Z&G0sF+WuYAFM1>&!~1=Eqb|4uRO2fUk_%19*+r4&{qq1gk@x9gQmg&* z{!+rGhXlp<>Xx9R=cTljVT79Juiz1yfC%!ua}+)|;Q945jQ)8(i2g9or(!>m=X-y( zu@Isblb6Oq>NP960aJd7y#s~3{ti8C>2O(8N zDMkk5Q`^Z}P%dxUC~cTP)i(s%P&dJbS8Y=+uNv>apl-#w)lzZPzgz7X-HIQo4M+Bt z@jFs9y7vToy_tlHne@*Si<^r!=X@B%r!4zpv0Q}xf7oscYzh@t-4eriI10Cy_o(b- z_xtr6MnopO4jnXeP$->_A`=0>!|4%cL4X!0Xi?_R;ye#a>CL&WLLL@Pj%fS|y5&j( z?PCZ`h_a8~Ah3%`>OZ3KfsJITxD`kuN)8oMRGY34<-kU)8Jy{4;Vs%MNqjh3+Dhlx z?xS;Wan!s@>1d()4&oy2<^(F~UA}I|uItxbddbC?;mj90wYC&Ic8c=J+c2!*S!Lv!SEfnprn7}thk`2~Un~QNKmLXXqR+gE4o0xar^G}`A#I|@xFqBIH3B?* zyds%D6)k~e3h)>#RmMT z?r!nlh}`*dEMy)y|4gvGw3|fJmo>BFg5c%Qzf;iAgIcPgW!jb9i`7@VN))+7q^;C{ zP3gX?+!H$Gm{UJW$7CrmF@jBwx)ZZuwkXEB|AKgQeumNYukCk(or}ey^9ukp!eL}l z>eFTp(fmn@!~cnz-okJrk=Y@9n?y#lwwkrWWZ+G*Oujq8kQ>1 zgA$;Z6&W4lYpiqeNf48>{G#*l3Bbl>M9z=+zaGV}2c7ru^}Td;iRe!$r9o3YnR7L2C6YeN9d^Zza`pSKrJ{W zMzuf2pL2g*|=DiVtQ&~Mlo>cqLMo*vcONd1VwVP4P`^pO% z(pF~wbvi02u!IX6aUnY*h;~*WQ!XJ1L>sG1xYHJ=az9;7+dn3e2`s>xU%s<~;8rO1@7)wk_4+P$RRxI9hWbY>cY{pbU`PU=vbv#TGe%*_8|D1*qC;sAN-9O^a zDb&P8uIYKe%#p?o>z`{3=20L#4Riu8rwKS->)8zZfic2e(XGWS(R!jpN$Z7<5`80U zFSIO8i-2Unkd~z~4KB>o*yNJ{y{xElxvI0CY)wZ1j(ec5d`f*YO$GspV!!9Bk z?OPEvkg$a1F07=SLx{0vn%K#&{$}4x-DCMRKSh@!dqnNDN8%Dk~byzPBFy_Q= zzXWZ2vN=fOvI15lkfUg&rNpTRB2b#wHsOU!S3DV}=y9qFxbDH-cTa(kc!{*!`wP*yAG&dr@ z5E%xr*r+aVr-H0ZY{>VcFQ^7Mi9>DZxD~I!BJ*V^P18>)$djk}v0~Att+~el7+7M{ zCz7L054F&ela*|{hI6$0%hUXFN?Qp^Qkvm%(2ur#kw<6(B51D~`stm9z%fh2*pN#RuI?`vQHK6RB8vjUD&Da zios!IVBthI?Cu$7FIZT4K^Uje>`)HZ!P>Y=>{4~leNn08(R?>9=H#qm=S0)<=>Tk| z^GE2JrggsQ`B+8IeCV{)1jQ49!*#{tP}BA01UL^}FIQVJyn(otv6qDQC~ZmUfAadr zqB&+K!mbo(CR`p|o}7PyTrx;3a@XSi7brr3ryqnDs5JEC68Sf9qb4|sun18|AuN(% zAll<8m2Rm(WdN)_p3qdgm>$Mdp?yCT}YUwwlt`}NzJ4Qzby(~Tm|&*=Bw%W922Ipzhi2K+A3 zkMH=9ERewAd7PgQMVnjvwtEZ?eGgm2`FWDsJB&^D-u!tpGRPWUe-g!Ok&e(00lb+~ zl;Q~e00WCu=-`wnCU}jouxGfx4JTh7EHeI5_5V%J7L}vAOV)e+R;-7=1*iS*483{? zZKRe`d?Q{^4kWi%p;I-xOG$#rj;ULsZ{N?*w?9biTlbXq%rsS?7;8^eTAjOQnmGJ< z&P!!Ia*6D+$wJ$csG zgkX?o0(*wbWSZmRFmhZ+XWXkzrKa}j0yCJ}r1Yb~I<7}VH~P|J(k4jTvTF!1+p?Of z$>h2f9?ZDHfldMSM=n)5M5zAAwQeyI1dGVgO->v*w{hsyez?AisWoy#u~^i8?2Q2I z*{KmfHa$#Yu4Fqt?8nwcMZAPkW`2EJF!UWMZ6@fwY4oD~*)QOcnt%v83{3smV>FC_ zyMUy8ia$Fz4Pkdd>MSJsvwMGaPA|F@^O6S7WN~*r4%)AGjq$v=Aaq@ks~AN8bw%Dw zCV*8AX3fhjhg@r9BVNLirChPR6IN}2tv4I{hrs2{)_AP}+qpejy6)}{mOslE$>Zu& zN|f$eJ5{-x)-1qE8gJAus+`mqA zXJ$sGv6B`YZ%{aA`ilq-dYIH||AHg5D>Ar+RX!4g`reebO}O8sGA%$J;SrmF2nrCV zh0pu1)<58X0H$lnSldzoU>*6Cp1v@drbRwkaqSuT zq_UPVO{rktLTu`s*W=Ve| z7r5X9A($Q^nlLj%^F%X$H`-kHy^DP-M-ZuAAR`jRJYLL^kNxmYj`-Kgk;8~qc;I|U zyte4uVirFhMQf44%s&Bm_##c?cc0JDD}(r*+pBExyT8lOxBT%t)n$|AA|-zJA)XbJ z)mZ~eh~LGqr}II=lt=cFuD=aW=QDm6JzpTmogBCOIl2_LEhZ=fy?EVOX;L@lz=8lW zl=1R*!j3OL!6g01>At+tJ7fTxtJMJnh)s}vLKTxyC2*>VOnkf2uGMF)sY;_Z%^5-C zqZS$bR=akOUGg`>AXRmIrm8}E6>9=^5O%%5y*ag}fg*yFi1s0UXt=SOv-@EO1&}eO z-fjnvsCPGcSEk@Y)fGyr71T4t?(g0e;aFHb83!oD?$T;-@}*8_!k4baremCk;gYD> zVTr&9*kNH}o2Q9x$+7&l@|_YY_&U+&2eH@ zJZste`J@sS0jRdX;(%(1Huae#sG;tLC{Qz~)TSCmYQwjM3Z#f|fb%DtQ_cN$!>)CB ztIv3i_Wh*9EVN!BY;}EG(EVt!=+&`{H2@53vh;|=F6f~awQ^GXk6no3I^0mSPR@pu zmNM|Qj#OOD<1+yfH26(Jo!8MY0@gk)j47ecAo9b$>r~t`7UQ<=^#013N8%SGoYu97 zl4G*FXUKSpBmO!PGC3U{r!a^CxrFZ{y7F}%$%rPj9dHS&)#DxloJYEzs8uSZNlEJ| z`dHA!Yl|J1c7nZ{XCnh@v=fX_Gv72JJhft75KjaS-&ZUS^~(Dw0nS4kr|aT+6nhOS zu^yGA)GuNgml*8)L_wntN_%Gyfc77kPAsw8L+XDNt$0grOaz)9C-HjnqRZGyNd@?7 z3RDv|$%8N1J%e>pVJz1o@faiBWTcTrg7~2jfskP!+AA*geYq550Ia>@(yk6OewtUD z*`}vgoZeDi@ngpEi@oCfYf*Z|Z^JQJV`K_oJ5ZggrWUsyXj?Alc%);4^pT$*@zz9| zM{>2hQbCxb1au(bw0lzIZSP%Wal||qYukB5DQ0?49$)#{(dN2;wAg*+F(~$YhY^?g zk$SS6dr_79zPYkQ>D@Xj@$T96k+pV7Mic z%jB8}Dqc9?1b4i0$R&QR)wI<(E6#Ih@VP210U0oDw?_q`S_A$Lcu7>H6W_m~*m;5b zB1FfH0;O`D%%BEnPvPM!5EQLlFAxJ-E5c#u7o`wJi+@+l%$Vpv?wQdB%L@rG8!Vc^ zNYn1yRd|Y5eLTQIa>0syLyT^^*wJZ|b_#%VrX>-Aa%!-*F$e=UhcH|Pb%-Ydhp#CX zhnhlOMS$~Ai11~mCnZIlobN1XSV0@i&_mf(0|>Y%Y1K<{QN9h2Gf|x;+~3IxLi=K9 z-sYQdy;9PGX1$w&Tt7=F^jGf!1=?Q_;5_8IOV@mM>q}3~)H^j4*0H9W?RE|4l?By> zHX<1~OnMl*HyT471UOyIg2Z9T!avdkJb{?vy2)R9`X7o#sg8Giiz&%O0SI!N^N096 z*+Ud5J^fEKjQ*MJ8{9diOT~Hj>3I^Nsjsd_>FK_w7&+>RlPm~4t=))%pJGV3im(<9 zU*`dv%tpj3Lp)N5Xvi=S?Uj*Al@tLP0Bf(z8PO^4VPGlzqsBkJ?Dq7^&|AtYv&zOV z_R8?D#p{(pq!mt?hKjH*Ca;X>*dVIeKb^0^QgR}wAVy%d)^j+2+{kihME{5Dran>#%GHWG!t(wq}lW) zXpj|Lc17`AWYXhyfH%`MBc3T;%6ba}i&StqA%sB>ZIN`)#1}cz5_u}f|G;4Jw0|D( zR9vN-mk$;hFH!SsnkoB+481bQly!TREmQWP41LR=DXY3{qOA1fzHGn}GG$|gymKRA zD$&(^37#&zt2rd&Ibrq_=vktxS$>f2Y8LOtmAMIENV)%>BZ$k$)qI8LYHr78yHP?N zd(PCkMI~OeQ2ILLCC&~;2-(kwf%K(gq;2PCql9ej!&q}rGyMMw#1!P&P1!jL%EM~QHvY4y1HcS+Oh?D3?OqCg?TUW*Tfg-B4!ck^D7 z>ZDygfG8}43buwI;T(HSN|k*mFh`-?eKtB%Dh;8!q1_r|nG)^?Ua(vIgj3+FReQQq zAy=@jT~~6&*O=couG+26juAa$ICQ>+canwMl>i#h8*VbbH{8+r?F~=uSiM<2z^K{R zY}QxP;ftNtj6G~stSYd*57_34^c468p7|Rp-`8Y(`_zFdAFeA3TZ$&ET8B;*9=Gi& z%n-CQ-V@NA!I?VV@jL6SO_h4v_LZV&IirYi>5*w4rst+&C8k~*u4Rdtur|=c{A)vh zr+nO=(pCl`q1S{xJVFx?!8O5Ih0l{i122L^;n%%WDes_R^uHzq(H~wDQn8=7CZv89 z5{TWi(`BAiT6(=KmW_LholakkcfLl8EZc_5m0m0d3_a(q3Cls*d8d5ReMLZ;tt;(y zh5Fukmg*js%g&>r{v8+WpZA*L)e|Yo<1IY+y-rsAeSNX$e*_&A%?LrQddXpskv+8|p-DwIsMvePzJZ=*K?dp;rCaUCva1{||=+-+3M5tRXVLzy* zBP=ss6H>u^+Tj_SZyn4d*r@DSDf{WYsHDfqAeDe78I>PjNSXZ%GZiO4R;sD{j6!qY z^5eye1>yOm$UhW|U@b+SQ21miGCO}X2^kbzj-)K1J`Grw9IvS98$9|96sl#3BFKVd ziA&^(vP2qClCdB!vqyP^=E!zKZ~xglC`8B-OE;RLmWYeh!+5$Lwl@BX@BjY z-3Wwl0G}0Eih0m|Tm7kmEjMi6T6ANRwf%_k=+?AyHMDi}Hm^0W(+Eh=LF4G7-R1+v z8whFO{Ds=o%#_ubnc4?Xh&6Ghh8p|O4cG1VpcI23oP1<=4%v(~+v5Imb##R`MwGYY zl%3EdcP}!YVGouvG%|cI$p53ol7E~_`ZT3Od_=SaizJMSsd=SciN?F2U4e6OoiE;z z3dd&!a^yOaK?=o9!x?=}Lt|)OxmwOc3p0S`i=T&Nu_7np>w}+&v-_NgO~nX2iQpT7 zTF6n2;OvrABJQ6DkGOODMBL1R%6KK0XNi!n+pY0De`}49@BcaYX*oZBS~4h}TK)YX zx^0%T6xl3A`qz9bo?@G?P(H;IF+-U8FqGpEa2H@d> zhLt1lAi4p#M>1L&ea=L6nsA?$6@<2!Xx<7T+zcG3clpW8TB(s_0IYZUJ%@4?tdq`6Yo=||DVFzl{jmrAnNMTFa*msPNTB!mB?h8SDH<61Z%w9Xb@@(YmM4Rir z=Wr;%q=>`ciW1qtH)1q_-rNjwFW>8;sO~kh&I?V38 z1B>kCD{hb4BZEc8@2dWr?os<-hF%%$QFD8hZI9ZYW$0V}J!-1UCQGe3RSo96kiXA> zF9UY_dNvCCc7|RVP?+1RY!vo?GxRM#g{dwNmcot=tkqi7|97Z%;&Szt_kuE^y_;f@ zKB;EBNSlcA;{hJ7NmJ={PKI6?(3ab)2yKx9ByqNsZwZWzWawLd+EQIEl(w<~OW0u> zqkTE|6Bj1#ux;Y$eD1J4Jy}I|i#Tq>%*O4k4Jf$Yj@mPmfyM2l4PZj4IClvF1rF)I zXydTAlh!|g0#Pg0A=PQwZY)YEjgp$pJ{44dYX+)+neueJT>bY7{x7&gi+m}Ep^C0% zaJN7RX0V7-h`|l9!rc{oAm*hmx*^>Pxx8I90?ghnO}r$^6AL01uv7M-z>z9^f?ls< zSKKhHh{CF^6vdTaa%ExGvw*^(;CHEhw(YxW=zqke*8^l#!C?=NtU_mjB?f5-?|+GtF4 zli-rV8#P{POcgE&o$GTSgK+xY^xM5sEw^TS{Ogs@S~~CDlNC|1;%(s*V_ zS~PRErR{dtBIHX76Y(O19wxQgzX;JA_{BK&Z86e+OKHnjNKHTlg^BY= z_}pL*=XYor{R@-eG=zmo>MSG*liptqU7NnI-=|+OKWT7tvGo^>=O;H?zd+g1mda_R zGN?Gp4Q0&RbVws|w~$xWRB2&22hO&(RkjTweXM0+-*?G7^liOGHl$Uq?Qh_ONId7a z0)F;LF^|5Dcgsm;KNC83@uZplOaM;Q8|Yzvre8{_m*?WJry%%L;{q8~A{069-{$DNE`n2|Q35C;)=P^Mj zWax#?>%AwdXwp$?vbSUgIBD({$0U|_Y}*CI<4Xm0X8u-!+DP5_j*TC zD06XLz%imi!Irzn`o7XN?wOsw%S3of0_9lJ?Ya4BQsDp9#o}LQSUixGgEZ~Z6wWv8 ziUc4*zv79&;iJXkP}A_c32+`7mgP&*bA!~oVqhODXkagJnvy^{b0*?Kp{#Qsx36YFA5Q|$jCz&!;k$+fCD`W;J=GSpH`56##CcMy9TTkISSwxG>rZk z>&M(VrBlbbk?47%0?#VsMds5f$TqEo42qU!_#YYL-KBiZ@I?8AFnorA=yX6CK44Dt zQ)n^(*6DyUvJ__Vw4)f=fzdM^kls@1fa?$77pDXAuSJ;-xT`irTekQ##^MqJZ^)Gp z80gX}z*gm1<|`s$uKO zal2g|YuEOVwWljpd!6OKWer_*74n)@dUIJxpB3Jx(i(g|QBH!h(ishPWQpYgRWR|l zkTrLv080|k>(EAOGTI1UP;ox$tC_fnqz$d|f$fa;wfnxso}(Bbn>jz6A33h`Sn-;h zn3%2-&oGXE~GlKAWgs(LdaSKINk@uRi2J>Nk z4+Yj$*xNZn?eP#-~@cV_TPVC*-Jk)4crf|#;22yE^qo@IPNji3w zcokhnRp$oTu0-{acocKQ(`RC#ceqGtH5pr5}lmVSJmc0NIXdA(n% zSmo=YB~ViTm0fQOk;aJCCv5~@j3o{akug=$WSicL3gat74+Tp9T?{lgOX})I8l@`~ zO23DefXKw^Mtx_BbuZ`-p*|Ku%oKFwE1_0695&=7OmmJq@4sZu$v{iGu#;jwlMcGw(p748 zw_Ln^TQPLFO6@I?B`he|)S48th6P^=(xCdF1*5X${Y%*n@VDqXtRf!YQbLRz89h!i zE|OEJ8QO6I#ez!yGX<*2G8@E~^Bn-~KhwD@yJw8C3_@57gs(EvO-Aa<6fF>l9|{o& z83v-`#nPiESCb5Yb-Y+Qk;9Ci7B6Np=ov4jw^Y1%XbQhLUd+E1WxV)i-(^-@v^Zb+ z7{5b&WW$DXQ$<`HS7LC z-q1jt`H4^n?HIo$Z*fo}GH_o=w5y4V%$zWJVun{nn_K)_Rs$$a3~g>KVqU!|ix!(X zB?i2HI~*rH+I`!5Ly>@gR}jFh(HZF#G&YHp?gDr$)20;*>AFX0W~C3vit1}y)qy>w^v1w-J=^vZzF++Kz0Y#FN(A)Kju0%zaM(7XJ!r8+%W+Bz<%MR|yb zAufK+d+rjKx+f6zlMIM5Ag&)}Bd(I?Hnf>p{cpKUr({PA`uGr$bjd6>Ek<7}oUc4%lU*yIYk;o6f4hN#1R{J~7I# zR8{elpl67DP65A~@G}mk3Bg5IX5gYHM+G6DP`vb6mm&m0KoLbGX$1=fi5U()5c6`g z=!WzxWpJEnNAflT%#LKu3}jjjvVzbd*O1hOgNR2c0}6+>@G0|j;)qrVmAD{ zVk+vzPKDmCGzq}KJbQ~Hb%5w$l1C-k^PHs)(92R<%0OxdSEA!=5WbklX96PV&^8PJ zI4`GR1h!+*Dw5*(4xm&!K3{cLh|U_V(uOz8a8vQrX^8p(eput_;}Gn z50hFgR`mR3N=qhk!zC;&dOpYFGXW74JzP=sx|Cd(t>JRWy+>K*E&BPKPjQyy2!J3qov0B z^-nEpCbO&w7r3L=f?^2(C+aBlaDD{E=_xH`7~jE_=s4>rr}FqrK;#h=XVNhG7ZgF{ zhXq9{?h^$?@2}2Cqf^1GX|QrJ>o4Y?S*O@7*AKH^TvB{ZJ2})xhidgY4o9?5!<33E zp!OKD);VRJ^3};+fpt^z%}v-mDg552%kbu6`9bshR_2EUn}i677y1?(&vJ^?#`qb_;`<72yA2GRwDbDK3Xhh zb++AOS$RWKB~8wJQ>93<6~?l7BIL{87K=koonIxud8jj#Zt3m-NiQiTzYzodenA7x zvACsVkoIuBeVeJtWDRzOwWjHR$qGW#G)-wCG@W6|&>5u9g|JRisWJdA`wNMTY=vnz zErXPuA3ZZj=`EE(dhRrSaRw>>T9g^2w;`Uu<%THzajXGTytqu#ZMo_WMLIUfjMCvq zMrow^a>G8v2nskcpEzDtAv!7Ym1ohYB{Sx^kY4MEV$9r{d9p<>i#FH&qs3m|CkDk{ z2tQH~XN5Os{xpP>@S<--^6nxq*r?DSiW$5)iqay}J+}h9*-q<}yu{5pfF)#E#88xT z1EIv5qKN3e2v6rT%i_G=obH~lbQgLSmu(Tl#9r1#w1`=RTH~@W0vJ-xw@V0Rz8rv? zvH$Fg3wGI^wnc)Re5xwBg1xD0`L|cl!)FL4=6*jCq<)X+Brl{rNxiQOiNjX}so6Uu z5QEuUm`sV+iEiYcAFcCu2{7yYns6bNk~1a37U>mCo@JEjTTR7S+0g>;pt3#TFPv#1 zTcJ~*wb~t=K`^eUnT%GCYNPRhr3BJ@tQK2!OOWilibaX`4!#|L6Qcq2P;;}Kh+@Nr zkEOJf!K~2HfDiHbOh5z;DASCE$7vV=?;uIyl#GQS^26T2RNN1~DKX+kX%p_{*YXBoo?n2d*XB4+(G{iFVFLN_1qu znzzC#sim?a#-(KH`L>{#rFRuNYV9jn0>Ea(8W9M@4}}PX3_H4a=Vi#dDdzC~QKa^CsjNU`BegjE&*7w2j*0gHyqUt6;yrwXfjMD^>M`VI zVmj9d3nOGHz2iN0*Lc1qkntCTMaG}0{+n)L{z`^k8SMUZdllaOx0D1&2xELpVC)|= z^ez9+Kh?`Fc>d_9 zvpXaKOv-stJw&=Ax%K=;&hRes&y_!m6TuF{(IYrG>la7c;Zq0#L7 z1UosJM}CUx01{Hnx*&M+c+6RnrIJC@X6v2o&BJ!FRWwx+Xjw2H`FWxn(oo1SJK8UB z4gqGrfMzGGz5V;huU5ntI->ig+EfkU9Yl7#(~Q@4Y6$hfdydVt*f^*nKE!0+Y7zC7 zd#Z=0uO#aumlum3?JvIsfD`@Y^e~BKl8yWD4nKV!w-~3sE!gy?lr}REg7%zm=8>9! z2zn1pJ?GnK7y-{Ytr#hu^WZduJ?E*jkmxz@{nfKgXjsfq8tlj#ZsIz>(0Gm_eh=dJ zoPLip8N`5G=l2sK48nE(asr%3&^?>h=qWcf72$F^@&U&}U?(Ap1kiqgHiC%}_w z%4RV7Qc%)w7K;t-QlH~FG~xCLB@sgBo077))c?3x9O|X>j|gxciaNb_8HrvMU8NUR z(9UNH8h234I~4#maH`Ah83_D8M?2oS8&lPl9w$kOJQ0d-xV1ia@lz^-sv7y8^?~_S^Tsep?;OSr+X)BTJ373 zUcp&z@Br4Em2tZ@ryq`}ha-W9w)1kdjDtE~!T%|qn7m9Gk#*{sRBD`i=pJKlne)T5 zk2vDKIcE)xy@~s6=SS)e^-X*&YS3l;v2Ny>;L8J&-nUZxH>c3y$zirMh`Fg~1`n?3#Ek`;>(tpdGqtt&(`Oz}IF30r&=V)9fYt9P%=NvTJt_p`|^WW#t-xgiY#pMC#JX|r_Rrqh~i9^o$_fA`L zT*`kx2iFIj%joyy)!VRcUXGvJoGWkzMXtktpsp*`e^;shu2%mMf#DS*x=P!*mT#67 zAu{c)CX&1WmlEO8*-Dq! z-GR#-T{hi`%NDxaIEKr1y8QNDTpps!+xFq|yL35i9GA1{a*2)06?AD%;?kiD9pdTm z*`HJ!&f$`Bl)vn7+B12L9db6$IM*vG*sT8Bg8wiTTh)Kt)qgju|8}YWZc+c;ivK{3 zd+5I-oZIl9b2~1eGUBf-OWLoP+d1cq;TGUk)PLJgO`wEO)}qch-vR1u@5`XwXw&Hh#0^Fuy36V~ z;j=!sWl48w2cwyDCV>knqq|EnL>sTT1VP%Bj+Z<{l&P&mPV1gNPy+*U=n+G{uZ z3srlqTAtRT9#`F-LWZh6zV@1}yD%er!8EblxIf`R*{RDX-4h6srCXDxZse&@v0p^8 zfxCZ@eu=d@!<^8Pq^5N?3bTwXs4d>x|V?iY5WA{yhW ze9id53W}PITU%?@R`U>@afv`mqd~h@cUH!0O&k|#BgL5133e>t_)KehW?#Klt(cRP7Ako*%fOuN~LXR0(Ju@iE}YFOg#>`gx{44ve}hZXL1OC zR&CrJEp6tKY=AI6L)}5_qGh-7Qgza9q0J6|bW5Xl5P#M>vjpba7E#csoaHYrma!q^ zQOM{7mA*PkOuj~$flB>Ii1R7}?5ccRyF`+0l!*2;VGjDZ*4idXIh}k?Gu><;3w@~F zK~W2+s||Z7ptuf`r;2H()+ymj6up9|8OPmm8%LLps}y#ZWIWkw?E@)VthSF@yC?A( zeL2G({93y`W4BA3MY^uq9Jkl)ou-D{dr?B8UY&u}W3JVaEdjyy&atZR?EO;#&2ZR#kur?OUQuq}H(=(f$Z2kkb(4AU?!0B^M9b`;&i z+p4HXiv;9E4Pe?$vnFc1Q`8ZfUrI(fO?wz|mHtvaj1mg4r&~9=4#XzS(9(eOx zDb(xy-U=cAyDR1NNiJWmCRKueM+*2P=J*I&jnDk(uBf9J+e~G@joc@9<$E9AR#KgY z0;XU!;Ln~6q$R{m+C+s7S81lknVL?Vm^mhHb&QIc?%BLa08*mbY)sVlud`gT7^+OQ zTSI$2vT#}A#PHjaLjEL$LJ|ou)RLO>3e-WDWQPD-HU5H7SK7aH9V?D(0wJ(8L`3&}GVLV%Qe$qs?L`_%ls_L*ap zlh3!ENb-$N&#oiu0J%t{tV}?oX;0RsCu>{_-2Grw8C#?Dfi(Ri+TA_KaG02(gH~Ya;VS0 zK-+tw)j(vA$oi)T`AG&JTx)O$6b*x?6Kh~bERPA+^|B5wq)m8ANsIoKeLhO3g zg;sG9rZ~yOc1A;8SYmk)mHfru0@!m?fF%jvb!a1A*>h#n2wqTRM}0M0ULy&at9)Q1 z(Y|(Hxln>2On-iu#Q9u^e9rAj%5sYOcwbE6wkTS98M9^QYv`o&bzI^DHj!EQEWOX` zOw24eTd50PoX826B3UW#bS%&s)>gsp;AKEt!hW10e8}P1mS9-bmN)~uS z8)RaB%N!>rr?@o$-puzIp%s1Hn8Uy#iTN-)NpgDFikvSNe$M8hcT*6^s|JgV`-?}0 ziGrpvn~+c5lNTecl`$eu=PEmAQYosla7mB?=i*Vf=W;#gyy!@d`>Y~xchZ#b88Ppr zU-akwbIt|cBX^1TG%+1#)&yjS5-@A%Gv9>_1w6Up$Y2zgt(EcdF}H5~m?G7l+sR0m zlwuBO>r6Jsq03y`a{-WFjz-&$Rd0SzAS$zZv$|*N<%p&e7V#&?bXnxO#=Rgo`O_(b zNl--c>>2w+w7KqYFA`lMZvOS^8eW1tx#*!gybCJ)JiG%c{5)CMej|#rUW$gv%JVgV zFKp%c>m0xmgl!DTIA11|c#2O%*glS@gAuk$%96b8p4*ds-7PymM{l}eb*mf4nBJb9 zRXst+ZQ2RoL<#hd5t8~7=;09Cd-#klL>mwd8=ADIYVB!qAPpfN01bj-YOp7<-RQuaIiKL{$YJ4IQyWM6G5h7s5&M9Y-gCq$-$D@4BOJLQAu5APF7#Xe71+?im# zzuHq`I9|e3ft1%)eAIl0t(=JV2A+(!8$~Qg4;=Fauz{ zA4XbmVH!=_55v>nb3Y8dr8bBB2mRvxF#N0c<`7OZWf8>gFk&CyDKVhH<|cItE?1k% zc=Y{P4K(lV}GZ6F)y8@35ye)ND@kA_3#~sA1n=RydoPR5#&2`_j zSe$5Lq}61;vfwBnpjDDkEyB3O^Y(}8>aPETf0*WI@P-H5vT1P^+CzB7}7#X0x_ z!&gfFGQx+?zNrzLuqUCr)2@so^SHqtHkAQaQ7*S_c4x!JO*kaDZVyx0%?bDw;O~Rx zOt+BhzOmJuZd)^rhFwLjFu5Mw!#anio7mVlhV#W+c5{ELf_$Fp&@lTVP|X{D!!~>p ztr}(Amxk^cqLL*;yEbna^0|e%;mw2S8k~VKor6~}p?i4$9`YHYi};C7;t!d@ag#v4 zT=bLpGcJ8Ds20&Gx~L_hqPxvv=nLkjtB7voo&jwT+)04hAkZuaVcEZ*ZoLxdp~^j* z8?Zrf@HRgrwgGX~shSU`%Tr1_ZBgkoJ$8t3!}Yy-94r<$+6~tN;6yhZJ=6k8&Pe}m zI9;E|i>Oq`d z(9GW=mU6Vot3Lh25yZX*;J2Kx+<&#$nb01*zh?T$FqxW)X)@=VinDm|{-anNYHI!= z0nS6s!O}I}qLc2&3w|NQ-HJoSuxxNKao&yr8hG=9oikWemZIxsHepbCWoOWmtROTs z(_|Jx%^4OK?bDMwu9UnP0BfI~G}^*co95GFBIxPUqqme#?|DRt?9=04`Fwi0#w=3{ z)tCeMhl#V@XN{X1XrNrDUL$c&xuCX0fudBA(2pQ=lft1b=W@X1-1#;ZiLlUQXtU4BLz z0e`|<+%_&(MQ7;YgZuzRVZ2H-{4%o%z3lvuF0}8-If^cn;p}i?G^O7;oV7G)j?K-bzK|v zr0GW+hlWzp#A?f}j1s7wV(Ho`zT;}L(kV?gscJ;IG6mbJ-LaYko<2uelumm!%D7f6 zY^$c-@PW!IWtfqx$-zuzBTz3!^@&TXjG{t@U29onXu4p$-n2^0 z;BcM<6e_3zqf_l8g_C1Rc+O#;ria(0E#+{8|pP9Px-rN{UR5fL$aswB*r}qWyU_a$vKH;ao}HY`@5q| z>8p1cxZTgGb>2mQITW=_`NSpr!$bPkV-k`&-zgt-zqtve+KKc*=7;QkC=X<>L%9`H zGV(YfmOINtu&b$dOvS=-W!Fdc+YKAFiimVU?}*lrGx`5#?_1z3DXP0c-dA2~5EOxC z7n}ih?(BkKToHs_7FJjmca=xf?Dov`%-r5P_YU{5!-~Ww%Iei<93N4L_=p&zd8kno zV>D5t^7&58!-Pa*Vtm9`4AE%fch0HquBxs_cXjujnO%pU&fJ~ud#dW3Q>RXyI{#BC zDvxLz3@@s+I3O&_%X8;qpC> z$@l%x5=ix4c@XAQ-A^4X5|l-9@C-}Rqx-AXBb}XiDAS`)kscMWJs&{bq!cW6 zoMdf~*`VV_#NNn9!2fA!%p~EW6`OEi#yCkX9Eh-HMFn$YiD@KsJ%;Xc6wJYTIUurn zf3iDO52pI#7Li>`${-;XKFs7s+b-3z#*XwT%ktWNP^SYun&%u`+zZmSN7{N5xJT+MPX66%|YLt-;$UyjHNl zGG=)BC~}_gY-=J2S_q4S4VB*nw+XUhSeiLP68W+mlf3Np{JFym1)3 zJV(F2{=7S>XJ3EbUBm91v{*i_BHfP^K_|XP7@X>qLUZ>krJVH~0UW`u7cGbM;+*^Y zINwxP4oT>SQ&lA4dvb9kMdvF=>r-*0@jS(mq)uK5dZVk6BzIU2$qXr#_(~oH% z5T_k0RhE85H_zmu>tB(E`Nkr{EM9Rbdzk5R7t2s_>5tuc;!^kG-9X;$U`3hVJOlps zh}aM-E`55q%=kq0%y9AKIcE)UfJ}u|TAP6p#k-T76_-YGS~j`x(p@MSD!lY9{Dl9E z3oqg4$jjx0mjrXdyxazUE!ot3#8fEU<#A<;z~M_q+e5K(izyg4#7J~mlOonCe*-W-OOb~a|Ox|IMc}V z?8y>4K+l$^deV(jH%d!|CwV^|2~(0cpJEu~z9Db*q~%9t%~i`Aj>>8PVPFMqw3XsW z_|P;@hK0&{fu&7@gJYYU9F_H48mS8jF_GRCmGvSVhJeb#C4`}}1lOJyNfO17MrB#0 zU_@nQf2$xW%SKpP&0SDg)6N2lc1RonfHU1K@)nWc^^bNCi6Nn~K8#vW-NM67+y{|x z857qOeFHqtsvek?tj8%A;g(98PF#d_h`Tl-w31FJPQhoZl?@$EQP#z0NTXZ~kD}Ko z-lf*-A~>yYSIa}L-`_;SW%OGDHnAHU%qtifRq-2A#Pt^y4N_cQ!q)-O3UFE(%goQ9 z6}RnTq>5ade^QhLx6&xgO0>Daa>H?2vezrSn*|7SoR++8OKYtSr$tJTiPOTj7-;GI zXTvALY0;-_&=O^?lTo55n3Tg_YRqyZl8spiR~n_A6Q^}44wP_OPfmtRpInAa$D`IE z4<1QD$}vhHv%$64dw6SNZ&pYcx1+X*`SRi~WL6bMZBfGMDr&0~YKwSyaHF=i;>6j4 zKhDLl(g^(E_lM)d{q#UUZPCj#Y4GLnO#FeF7~$pk15ZgpI$XhsU5J6c6^+$;S|O~K zaA=VU*=hk3OG38x013DCIqM$lZ6Fs{$QBwZfNWjh1lfYCkKyLyN-$feunhrFq|1~s z&xQeVrxf}!L&1%b&`Fcbi#h7E@L<7(y0 z!BAYj$Fie_cSB1c)m1RmL4wkgVJ&}Ntsd#@M2+dupOGFFSiU(Jim76OT`vbiDeC>s zqTS+PDA@wCopjQU4h*%{4ut)YmOyRG?6gkfBggbL?2@p%D-YAIbXiZA(KY z*%pOC;h>CR2-nr>c&3H2tiZ0NkKtDw4C)sajxQ+;>Zn_*@ydq;gF-%mJX5HV<%dC? z3~Y-+vdVqptj`4un$FIim{Y@Fk^^o;SfgPBjpE{K6uVzBy^`GM^D5GLF(yxEBFXx2 z^}`KfODVDu{xKh@+K?Xv zm2~qG&>tNPN?wNK2*;3MP*0%{%}$E>6vRPA!vZAKrLmCBNT}##mhqczR-5K)WlH`u z-?Oy?U2ZhgjKz{TqoLXsVkR%l0S$$Hb#uIUPJd+SI2vkF?d#y~m19Z_`k7?ADv+pi z^Q*ob{B-%EvV*?bJmcWpQ*4)YrhU7 za!k!XC%1i*p;3z{8-hmtGk(H<#?UDI9IXo+8YP$%=Em*DuO+8Gu$5bCXw>xr4k;fr z%If2Abkx^b6em37V_G?#_xI3Qoy!gNdtVg_5RQKIl@WJ&BLDYp2BpmsyH#bk9E zQ0mOgxf~&-HbAEb2JcJ{m0FugT8EVqn8WP-e@fHPYVXrQ+PxNt5^Oao2ccrL6ci;* zB|*QSqD~}f&@M%Nk9xw3(lx%r`Qro3&lok!o zvc3ihQ$&%^FARepKtQRfYI(zfQoDgLutE=%!iT2GVooz(knv{&eovJY%;tZV_P6^i zZJL%$%LL^>sl7B(7ZPG7yDL!YRvd-^l)@E+0i^^-p97^tF{FV~Rw)>PQrX`s2$ZrB zR@QSDpwzRR1r!-!o`R1v-7P2=k>Eh7twdr-K&khl7F4(Ta1-}ONVtrNnxI?wmAkIz17SC%c9?m`odEOlm`*U=^E)#^Z!vs44kN!qSEtS~zxoJ(?!MZS zbHwnu$rE7T+Tki^SOa58;}sMjYxoP7wz3trb)l3acb>Cgl!XuHOeLnGz(6>bQr;NT z98L}u3lQd5N;#~PHV!r{C9M~kSW0}00Sot{o)MOkK4k+72~9#4p91D+x2hSle00Ia zESzr`rJWN?`9d5hVJTmf44FQ;44JYktV150!myNZsxbz6LN+uddo#J>2VLq2?_<3M zj|3p^5kj5`RTxi6Bv$d1rSO!*!-E@7`Er~*FU22cV(9sF_`&g%_;5cx5b%`rGEE$O zIXne_U`ki`1pI-At0A4qVrW0a6M+?tr@X!do-#V=%tTba2iRB=QTc~J!qN9R0!o<$ z&Bdz^9UR`uO7*)oOHSy=_4+Xm{`$EV@H4z6>t#Mz?I+dQQD2Uu!iF z8;_0h)?rzCAj$ooRq-TFPXW2}%=3Rj!Xgq-Rs@K=fA>`BTC~B}@t&+Uxb1W$8Qe)2 z%LT6~1CImm-UGhI(tw*d;BWJO$Dac+bl{%(y>P)Giib~)I^CWoyo1u5fKo_PUK=jx z!0QKR{SIAt2G+;L4*>&AjH|@ISal5wNv}^r_4ei#=z7_a{<_SmadxAM|WQ18ndQ)M)s*34r`Fpw~l+F#bHT3aRXvW zUyV}{+0vwNZ#YP-^K&7wQvG}yXp$~>R_?RBFB%dQ>l)^2vdtn|ZnrzBq=5k#>#|tV zS}>OMc3t1H7LH|QO#YQk=di`TK8B*_gGhE(6NaNG<$r>_VJwtbno}sh@Z9 z_)RZKLw!e)p%#Z_We;@)z_LE#&J&mH_YVPiw>_RR<2fwr{X}etu&l2PmlCE3XrL=N^3nBks}nqjvkd3c^Q}WP81H|vL3`w_|F)Zg`cDKf#b3StHPYRz4)~x za17gsrN(95=z`0VIAK^yI5KOS!^)wzrxGql=U@IrVqeO?%o8A0yz*#3gR}{b8 ze}ivR2Ap-Q+T7p|4*>T>(gVIKr!5k zpod41eNGNFD+OtJBWe=%3#;lyl7*cYrG*)4x}5CmB$no~r@5lW2dtH3nzl`13wRmJ z1JnwnZj_b|&-R``!jvh?CmF_M4 zZ5n(Y+Z^RUtpSbHg@l;b>k8C*6%Iql>&1nH0ks6rp98f-F{FW7Rw)>PTG`(!2-LC> zRu*;_pjOveK+y(@LjiE6yG83F5*(of@DpXCzOk3M!n`H?vqHkjEQS7 zuO;yg@T9W(ORZEVpE+#K|wJo1+~yQVJnxNhB7^EI%0WhLhlMG5+D)S&PNCfiY zAM$jg!Uzl^v5LSbg}@*l9^43w>v8(*#2;5+RQz%}f7pEFA&1a0tx zehnn$3c)~I1rUr4xgi*hmfzWT<&G`pE3HPA9Jmweb#K=MeRFK4GtJZYZv}K9s^x9) z`&o;jWfK{G;B**VjT4Cz@TlH9i#M|%*CMJuSzr2utHEG4=ix>ns6@;W!bw1gWd>S2 z=lP2`u1WZqWV4NiP5B8_1f%bIz)lZSlyuj58QzhS2i~p@IrA7ompd7Gf*f}8R+Vu0 z7W^B7B*0)(5$PLGg*&z|3!e#!M#h&-55NEjE$9N+z=QJl_<18>q&M!~Iq5h34!(YI zmp-DNT(X;h2kjOh38os;(?KU_0oZ_u0E(f}>h=O3FbLCLC+PJd#TGyYKHWPBIA&;} zHw$k8t{pH4y>1O&i@+!oL2n@lTGaepqcuL~-vVnq5~M#xNO<^+*aZ*^qqfj!Hj!G- zZ?tOEr>AxL!T1)x*$wI*yP~V#4W|1|s_8!yvDJ@SkSKe5%!yTU zzV-W5*(5?w$Lt2DS=k)-D*P8&LBo$=8_~7E6o9I6LCL-OsHHcCeer1cJ!o!lShqK| zI5-M^j)5vH2DTvILqNOOEdMaH=V(2T1oAM!7sFEygJuz%Kh>TCVJ?QB0b+xr;12|B z8ytrHkauc#(BlQa(^|YEJmd&?y~g!4HboTWqa7@tBS*3BqOjuV>lY6`t(L5jO)(4X zKzJgt!d2Nk0e`1ap^k|rY0z1G^`hPoe-0KC;mKgb=3v_IHvz)Lfl$*>0D)OCFc956 zDN~kA8JZRazAv%tJMOc`Hcjpa1!WsF&aw#Q@b63!pM12$fEyQJO594dKi05CXw61% z4IBL~u*7RvU63`zp6;5B>{TokvIY(0t`?YE{09DG%{u)1T5rrFXi9XYAwB`?+3e4? zs2TchHwdQSYwW*k+pU1UO5fcHkI0U8z<9RjyjFj10)T0eRc&|b-nM?Xmyn8RD8JUi zUnXG5X!Wq31vXKqpJ?v^mFPv(u_FnsHQmOuaWw3|3pbq4dc}ssx&ed20nN98aMuHP z2iW-Dc(aWQ&@GKFC*?QiXZ@Jg1rZ^}o$J~Q@V$sV^Z1XkroZ6LwdbI^N`Ee)p^Pc| z0}gEpR<=%KqK`lk4;G&(uh))w6rjc?RMx;k7x%;S)=NFv)@U{6`g2jq7wD1vMgJE5 z#SQWoVX)>eGWChRi)$tOE^5Y>rau#vpV`Ntfw0t~7X-ij*muBL$NS%#?F4`kY?8vP zuV0vOVa%hFG5|4c_hFq~m~BkX(rOzo_lQ;man}=CHjZ8%Gzo{;=&nnBA6ZL_eJ(ne zO#qORTnHT<O@?fh-liDVIs06nK^7fg>}+xgD<48{_)8WWtrVR z`-1Sj@aeYLKfDwcUF))(_KpUJHKsNsS4j;{YBm6(?Kj6Jn(fIwV+$RB9+n<>uG`BE zj*H&jMQ<-cyyqq09fkjft_H=2W$%eP276W9+3D_6G=o!V4~t#`T&Vb(Lk|HL9sY}U z4f#;24|_g*LEf_St<1Y*S7pFas$#>^E(K7k{F%H@d6cCo!#*V}ic-a48N=dQp@~N^ zsg1;$I-#i>@WHj5s@H|j;YIB zty{RN>_yjP_bgcx(;L!X#fHQU=?Q#8N&}Spwb9ZqgS1QSN-rXb8z^ffJ}~b}Hv_RD z?Ml}&WkRvVyVA3AX@j(Du}M8`%51Sci`GXSl}(j8r$z@Su^EqHBeAAd_+~J7f!uiV zGL(~Gete|rQg|^4UkH{Ef|9q>FV@G|ix}f5vM3uYF)kMV0QQ&Q*iEDQy$*WN4S&S` zg56<%Q3oOSQf{8t*`XcX>M2mEQy}8u!FdXV3IVm*VTuHH{!2D!kge%_zd^~bLA?CKwN!j_x8mdi{UQ#6VUV7ukGMN3Bj5qo}P|9 z^9K}@S+AZ0aT}3&!1D?itDFBPS~2pkUIru_LzEdcw%!6#bv@ugQw0Y+8}lCUT(N1} z4O@0LW^VBJ23G}*nOUe^x*JTORs#8tI!;sR8jn0O-j&v%ccV^{CB6qgNoW5q>u@B! zJup&c;@_zf9^5>{VWug;Zxc9k5b?n9<+fm|(VrXJ z;kRZ2?}oq!*RJDjX?KE2A5KKhp{iUH?cS{C*C4nO_#KFx;HgTZ*YCjr4MbCX@BGJ& zKR#7Yit0$M!wOPR?g_&;GtD++RbY%R=wJ=6+CtRUdV4Cpv9^3cfwro}0t^#rx{s)8Nn1aA)B-38H&( zJPi($W`b_d>-J%X1mBp40d;EA{$vAoMU8;<1}k0(g~zB{$b-gScp*9rT4;BgQ+01U zbsU0i&?P8SR>OkGdl{uhYqHs&0-rf(!WXI1l|QxDhm$JkcL&ZF=vWGQ*~Nn>7VZLZ zY}*cP)BtwZ4AB3^zhhBm;OY#VUIAvVUK51d&|cOV#=D%7&Duuu;s=N6{x z5RM!VTI2piyWfMtG3Ug7H1pnX{O?0oRpyseW#oO)hgIXoH{9=#t^Hs$ue!zBW~}k^ zaZ9r<##&e7=k&P7kA619F_?Q21CKm_%}=WK%-~F3uSZX*+S)sRg}pG;-idlh-b@-R zV3S~}z1MvxBX+#6TL?7~hw*d?vbc;G*(9i1HnVF1oQYjv?7^FWAdypS=(`r3Q7V|7 zk+W&0p(l^%dnnJ9A6q(LQre;sBOI*T#!&P+DPqLs7gbx59T|=MuGvgybKp9_N!e6; zp+(zaIDMm~hO!`y9@S6to+K`Gu9nt6l<>V}Za_`XU z4Bn7)XB3x$(A7)RcF3u0nwElGJx#HO!>OM3ggn*L4Bfp7^h;OdLhib})g4k1wVTvk zDJ~Y*u$|cGWE1u@xKoP7sw5{ovq>JF0yvB#T+>o zS=(nJW?BFpimYK@-TWJVsv4O~USw@f?d#wJE7uO$wKpl5p%h*_-+i9Qt6UKR(t`I2 zmC?y=(V!G%%CKqV8onI6z_Pr-6?)(}DIPg^jBS3(%&@;I4g1a_!!BNuEqmDMIyc8d zn5Q)biApRjFCOTqT7`_g7{3tyJjK6s!5ngq;y+3}d5=3!TngU&0g!hKnJe~zmt=b< z5mT8Vb4z7L>N#UZ^hb#qpBXMQK3P38T)cA5Swr=oOodfin}rcMR{z=HZ2jcQY`=pt zqRMRF#!vXqxH21ljusVOnN2V>%m)wgYsmov7@wuC%oaFQX4Cpw)`f?cY5O&2PFo2} zwYqff>~|%`rrg>5zS(-4?H4;SoXTy7zfe>Uc@)OAvG^i!h}zuXFAh+jM-)!HNrU;7 zUghF-C{Fu%Fk|s5zPO#LGB?Z5aar6>2J)3HZjUHI%wW$ox)nYgSrYqQiaq}sOyMQ6 z=VZBAQMb{&Gd?Qq_Cy#%hKr~#@OEzAhID1#1kSOAP;7T89vaX~>XgumTqFs$Fpl970aQ!6KaLx8SzdNguEf7?1Z@JU(#>$GNvs0RS)Q_OH%Z+nEiqpC<$5GchZlU(V8r_XD%;ko zmN&d?TL^@K6*M^?;*HA375LCJhtg@cJXTz;Y}*ShZ5kXN+q~sv+nz@wbs-^QI9f-72D=3XtG4H zw$D{73trype$pTpL!;<1igT&;xJa?K?^Me}uFwCDgv;o2g~i$qc~Lc!R$NZP*TVqi z5&-)-79)JlL*OY^5a?l^VQ+CD4JZGy@^jLo0;KKCzDwH0}@~fE6Je?3{Xy)i*;N&U9lM z5JPc!GXRXUZKB_sYj@`X-qVxA{vpc1hvyQuQ)%84D;puda0`5*8Ex$qBer0MIEWBHTnoWO7phb6(vB4P(!L=L=l6#{oap*>WjNo3tJ(!r(FY zQ~<%++W_d5H{0%aU}6D~jMSF2*@se3u;+^lQh|O8n!m0_wf+d|HVKme=0dFUd*L#0 ze*$xm3ATp$-)tJNsp)rMQo&^MYZt8FGlx0L02l+%80deyNtJ{EkQYy}0BSuUUTnh! zkN29v-k=G|&XFi;-F^pPZt%uD&L2NI<-vLQt3bH!F|)xiYnZzUS<)~iv3?Yx#%g^4 zu63}+A;IJ@huVj_he_|D6VNASR=V@>MZoa4DraH(tBS z>wd3NUMH-^iMPsML_k){U&(C!>F~`~jrk!TgqGYK$|zd-9WZZfx&lNDTuDq6GWG_Wp+UJ$Pp-yr1nofH2XVC^QHx~D4q+4YK*nm zj>UA#a)gD+6y8g>0))HMk6_nm!Dq3gT|2>cMN2j337a)`cd2mxs8Jx(0EFr0C&ulW{d#2 zx+YcwElx}Gow}tfTELZ+UHOxGY5g#;V7c*DSAnLOB2LbDtLrSpOe=*0-U|Eb=6~?4 z|H$5Qywzs4uY>okRQqGq+$5t_0bAMO2D%v{?YjmAzAx=70+q*E(Va3-D~(9QDeOX= z@~c3tPPJKtI7ORcKh`&;L3fJ`x_AzK_Mp=#=*s}K+V9R2mt6GQfxO$UQZWo1X!U#| zHbkJ+n}^GcyQ*h~i#y6WYe>w`R9L08OJPLu;rM9ynB!qap9VklcWZ=a!lS`@SKmO! zS@lswgtPh>e!_poI4k@dEhZdiC0Lm#$r-Z_JP7<{DBu=w)uH)?Z(j~<9_jwqRUI|lPA zy|^tMzUoIRXS19emo@EsK)$jy?b{`Y8O*pwvBGa5OJZkBG2>r?r%PkT$zU^h)kx0C z9-*rq{$f}>tiGNeTy;*)W^~vpfop8>_$y>%zQrRQ>fWxyR>7e*rY>9?^fqnYLZyT1 zwH*Q0bn3#PUAr>{<>jF^B?eVT;O3VRIszNP`(H-n{lE<+sVDi<)B^qs+W7kOep`+= zo(eMH!Ow-y ze0K#>Jrjo^WW3{gz<^YO-_L8Zb&0cpqU{q; z*~gjg7TAkOa3IyWL}Exlszua-WI?Xb#Jvg$moaext?UGVjxEl1 zFOAa938gw22TD+?Q<5RmCzm19v8#2+gSD6%H3q8#CgYFc`ZtyhsG={yWtuF5pB7E_ zrQEP85{v8zgm=COhDdGyr8(Wm#7=DiZkEJOZ2}T* zOL!J`>TD2@D|QMkmMeCu`umb73Mx_nylDX~ilM@x8iOpkj; zDZF1M4Amzr!dyNK)n_feGO5^dVW^OU;M=7@LMseI^^e#|1BQwXpg@>Z=lVt%DrJtP z*u%3BiejizHfq^1RH^>BW2jOD;-o#6yrS@PxiM5qZyy8=(`BK`J(uGP!^BYS6mPLE zhM`K0F&Bm^^&Lv!HFQObp|Y|of6^{ts0{5cH-_qrJIoO$XAISdg_vojaKKPuU)}r< zp3ooJTaKYRRqbna7^<}5&F|ZYm56$DCp8oR$xJ;@6Tq|ug9gR636{P4Qx`I1W1!OQ zNc*lF7%JuaQaI#dmB(4poiZ3IjYz{MVi)4HUOk4&$k*rupAPCNuh#UYH0Y-k8FcX^ z`RqZb)6ACvL$%wTCocKs&jj*ryGq3{a17OrL~Mu{s#}K3j9&H3aB)XDXAQ~snF_14 z_DC2}<;nLc%Ozu|u0atIhU)eB3I7>msPJ>Nm~af0U}d8GX8c-mkOQW9#bc;a{IK~- zE*L5YvJy&0=e@o`Vrt5J&F_v8hRR^d#XbxNL-iiZAPhcI84T4QsLfS}B}fZ*m~M_J z8NuaAFK%%vdwg&+ygRBst#UTYxp7(3J^|z_Thl&Pf|$XKYZNQ|D6%AWwiGk|d+>B= z%s3fr0YjBzvPT%IZ$Td!hRX1rMGJpvYi#lOePm<4#UmZ+J{T}mKaz$o zn|XtU%oTh-c0v}^}FjPnF7qzvtxOh7D;YgU$vH1+a;O+s0p?XZUyx|zC zQ-CnALXV-shunV15;5naFQkxSN5{xBIVQmWEbV$XSlTQwX*q_fP9t?8A*Q^$VyG^_ zVF(y1Tn`wAO7QzRhDsDe8bf83f)PWN{jGu+DjQ*Csdm9oo#ZT_X#2!-^>L=V1@Xk0;1 zJ*Qe(aLma*(x3w3W-%z|)nG z4rMSv7h+uRU`0~F#1~UNGm%uMy|grv>d`>LZ7I(}QvDo+=8B|3i{*->LX^|yMkk=^ z^^4(d6OMhx@L)7-%1;K-ol9TXh9R%&*o`Qr$1eH7kAo`d-e9+>f;$0j? zytHpf!?|hr!-)`7%5YW@RI3Q8RRq=QjcWbLV9Lw9QB8*7>>0kl;HjJNtaTf7GKvHggHCDW0`RG8GeIbt@3A`& zbRE(HsH`l@pRvm-lz>_=@-QqZVSe{)%xL(<9t;Og zwcj!XgU?h3PIbH5+~AW3uG=HZC*G>T{7Nr$O9!gDTjg)&Y1Yw@xbAB=&XH;P8NlM1 zCAkyGSGK;rz63FYN!O@X_&Q`s>~tw6{dw?o=}bBqZw9P7JJ+O-U{xQ5UJfjNpB_}j z?!VG)`$WCfL8=6vF~Pq8nV48Q>k^WVeIE>vs!vP9mqQl@D`}fhN%-twvwciiJ}Gev zlx2BoPZXv(OW#Yi9zaj> zRsgKZSXQ17trSv4uFbzulmypi6lNvbTwr>TFtTo-g2kj+&EqRPV{tcM9g z3{k~M8{t&huS*B;k9aw#FPY`z@RPK36xfz>EY*oB;lW(aQxvSDJKk;gJCnh9G0v|7 zsaAnh8X(mgRVfqSuzn(g! zuvCxEZk3&YJzRiOMg5WyRlja&*0g9AMO5Jsje(S0$JN4893iSQ1@_B?sOnmTxqOJK zTP?jZsn~KMs*r==&!r$kD-2QfGVG*)B>D_QL9afPr9Q9$6bOat+}#LKrOdGudyI&x z3-ThW2=2-3Q#v{sz7R(Dti|wl`ejB^y)x(aGtST)=K;}VvmfAX-9lg75mdsL<8(YG z7lntzK~6m`H*!kq>Dxe~bciXr*Kz=1NQkNHFd}k85@jg{m=XpDK&dNYnb!rG*I9t4 zuE^ZfzBU2Z%AouSxTB^%wA$Cf z@2xZwLz&~cxf0tRSjy5@N{u;91{wI{_+2R$`E8YO|77pIbQ){rQlsjy0GABP#`m?*!_#n#D~r~kqEOPHrEC@B1AjCsP((R#r#Pl9cU za*&Zga`pm-c&RZ@&veB+2~Lx7Vc}4xr@HXgNKeE8XdSGpEYrjR;k3?V+{F$I2jH~Z zG6I9wQwHGlOtrbepBylbizp7kiAgVBONVD#P}!N~wz%MRyFk9OHLG2Mn88eIv?**M zOJX-lG1E7|)8U(GGRO?abXK0J9l@Ah2b~+3Jvcpz>9Khl(1Dl)MzJ;FCgfbcH6a~$ zJ{UkucT2;UqX`B}m@6uLfZI2w8+S>}0e^vGmR@t%A%`A<|Amtf1WTfAqYgR!wd?#2 zl%wheovyr{5g$k!m_L#FQ(9O&6Z$;H6IjVPJ(Gyo3+A z^^hepEb!7lS=uZxW%nKrL!k8Cf1r`NkPx%YUBOFV!(j;EC0qv>cu8>PIe1AFLmIqf zm4Xqxl>M!O;3XSjWo>o=Fa3qHfTBGSPm{-)?iP@XNO17d9})=%LwD4Upx5uTQdTbc zt7PIH^_%7i<)WEUuephPBoZ!T;+6osG{2nSrFjLsbZ)h>;Bb!-AnfL0D|(FLTxvZo z0$#eZS{`zJ-i(CH=yQeOrDs+&NO3s{e+*`(0`OACvT`HoQ31=swfX5qNpP!-!mLD_ z3oI`jyd=B3vNKbFFb6Nmd#tq9+Q3Vs1exF^e2amXeiJp3z)SQg8_7dS*yR0CR7*<7 zE;Z&)O0h;ZW+5PHly*+=(w#Wax1Rt%?n;JCpInAaC#BXQ4?H}Jg)^oYyu=a$Y{(`0 zhJajR-^dMHB7r3PamF{E5>^>ufh5ITXd`t-vfmY z_tOIbwnQ(}M8cQD0sg?$jqpwQ0}n_-I#ADH$RDtUj;0!0+uv@rJt&LnR&LPON@;+tUQDBCrDTXEXgwf zB8=(dg(?6`N4>Jr`KudF1XxmrvkF*R1uU%smR12vMF2~W8ot?zz(prPOKxstWZ5}j ziCgxFreX@ymObOkx_ie=5JiSh%HRH9X;aH_R+nAqim{D`_H?`A3NZ(Ckkj~9dTFzE;`JxnC z{FutYtWZlC^pQqj;YYCxaoVhcK03+3!zo&!n1^h5M;hqoiwv|l?kIbp>D29Iz#aXo zJ5OA4xW5ME-L`egROh&(eY3rl(u0Mpx%% zsoqZ!wJ$wis za$6xwWLWT__gmU5FhMzd=)E*j7ZPH=w<~<;UL1x1A3}T2;6s92&f!C%7}D?|s}zjz zq3mxJgb&#WE32;yeCQ3%0*ZDwJW(BIx?2b>BEjK9FD4R0f)D)wwIEr1yQVh6Oag(h_R_S`P~L1qW58mgf%XCKR1Yogdw{DLi$f(5D{e% zt%8V3fryBQ2RDf5Hk?S$#ve_byA3)fh(Sd7a6df|Kt%L1O(J|boWviPV-fDfA9&gk z(jf`P+CmJ`t!NO@^(8<=(a}RDg6J*4#*zr4HvtK^6*~(-^n4JMD}o43RS^WyHh-qo z==G<9O71)oKtT!NJP0D~%hKWZ$8a8yDZURsNsB}Q$DJdHKB5v{5(H5)&m&% zR0KivgW;R42<`J-Xvxiuj4V4x5OK>M(Ns)f+Op?B5Y72BuJ;`s{%W(YmIpy3HK`(q z@Ue^_I@Z#l$vG^FAi}{JgC)6+phGUF2tkx7r(Y%n(U}%uE+2yE980fEDyDPCmI6V9 z90WHm1(8`{2%;xoCk+T9Hh==*PL3erb1Xs-DRV5vo{A7eV4PM4f(SZN5J7}Pi1M^p z-igAx6@eh4Ztegr(xrULU6#WI!$uHo^JhvRh+tUx5k&BEk`F00t3?o5nUX&bHbD?c zEiN~L=vIq?c194r&_c{)?Hv$A*jG0nf+xR6Hj^WW7Sz60j37cSD~2F4>t~V(s@!6f z69|N)3n7T;i&AXy^(qImLM>$wL>hsGufs0Hxv^#h(KgYv$fHkkRONT1fxf-SK#L=Y zvIm;Z&t3)u(TCl6;*zL+FOYZJ)+tk+BZ%Hd#D<6<`m5nG;|tX@!^KJDoHb;vXDY1H zS_einoUC;)Q!;|+9Vi<@5d9cG;Xh*p5q^%=1&$yROiGkKj9*KRP+)^_U?7OlUdJi* zl5KNF5E&^+dH*_h@p4<|gjrNVtrNTN(rrc<9TFAc7t!2%^8ORw^8G@z8zt`I>~drdXdS6o=ax4-}^KoDgtFh@ey-8OcSjp5pSSWyyOn^BmRXmf#u zh9ih%e^<7`1qgElk-WD`Ypo4IL`sl}Ai}p8oaRZWiG(1cPuXx9%8w=l5k;+VLM3s7 zQe*C^K`{B;!azMIg6JtYP(l!0oeY^ixeS?(IITk#5k#;=u;llg2%_Zu+z28PhU^9i z=|6=LM3mjIiXbY5AR-$!#*zr4y+Fck#m+(y-3WqmMG&E>0tC@m zH<;`-+O6(5Cb2Zz{uEp+J>H%4n|@~;O29RPxuDexrpB+l;_^+~D?tsNNTiH7A@#9z zsQr4>Z!)pJg`XtjU%(;f$e`D#ga=bO3!!1P)$wk---0iDqN6xzF?W`i&;m zdZ`Eiz$%9!Dc(J*ek6`o0mb9Fi*HB5B0@*jLoMZ+R1eH`QKfksY1#raSF9Z#PVdz`J<1*PHKd z93PJ#*GX3OR?r*2WcRK(xo4E|@i8`nGIPIVVXl%teYR6)SYHmu{>yFty`@c)K=Wot zpK4*$VzhO=2R1oOG&p*gAgScu!RdB>$J|ce9>9hgA1X%C=Ry3}7qSA*x6`k|k)2?= z-)Ss{-^MN&GMicV3>zg|bX%v54>f3GYVgL)=FuE?Bal)S&1imh&ebw506RXVx*Tj) zxE%JgE=T9Y1{Mt`gZZ31cOXRFJM6Xk%w^fO$nMOLGM6tVKLIVwHRSGjqmxa)i=aVk zp?DeyI*_x;J$24Yew>Av$<8|DC1YRR z)=HjI7g;=>mprQWbx_46DNLiB4MIJo7ebCt`VNCN*$SO37<4L^=L?eSxK-s%mg`t1 z<5(k#@G9&=oJ*r*9G{?YOT4W>c`6O=h9ZM2o@JapxO5KJGGrOgx%0#&nX3Wh-69Ce z#N}DW0TCNwmhtVwWybTXXNHTz#yM-qY|B(wrM0y%qSy%?4Igtn%-qx9N1$~W!!zO0 z;LJ=LCTADlgfgM*;@`zj_|G`I7(YkWoo5#d=7YIdXXDqBFbufhOPyVOmBal6TCarX z6F(`FdFjFNx60Ty_>ZuyDYXloZR6*vvl0xa+Jv(zE5p#@Y?0uMp)&{ zm(TPHvvgU)Us3s$|KEMEfhl`SlvD?!X)OEu~eeim60dp3$KeLp-Mk}V~x$+Ck_ zwan8fFZe;|$UyO=^clgYS;*;ffdv*Y>wGWrB%gIo#};+Dz|Nq(G0qE zZ%5FAAf#MrxYw>xv0dD9YU19X1;`wzCnbfc1zuISF2|>SAq`)) zz6K+vU0b7NFbT%2bkoFy|8r^durx1E*6**pPSnBDLg0x*4@1I~IK=fHgMbH6*6%sh z@`h*qo(+V775c1Se8{bWERkVl{a#{ev%pm3S-(%Dk-Cr&le1j2exHoP5VC&JnzO85 z!CmHAzoHn@S-(~(7_)w}zf~~n*G5=bO*TK8hoq5>l2x{M-SYF#dp@B8*@dB}D8tw^|xPFI-kdtXI^6ql56ClIY5 z-#24v`2e)ywnY=YSkmVA6(zy78HHJiHWyf8c)qXf>B{!E0AZf*EAOAuT5HSqB_+tr z_r zGne;VU|-2x-Vq?-wi;*U@*V>can0pL69u`v^}MO4TPFhu=2eo+`!Gh!n9ZwsE}b54 zMb#$jx(Po?w!MJA&C_|esDuYW&Xa{A>AZ{&8Tq`=jkrZAy4}F(EDE;^HP6N_#XT8f>J$TZC z?BJdK&fZ{O-P?lshnOL}5KMF%y2(RbZJ%8@i-I(cPu(#tleV%&(PI z1HxtLlJPejddMN7q~<&A34fx|gkHV@L4iv;qc8_bOXjTwB+W4L?)7# zlIJEeqN$k3)N~zqCI|v7WRTPDib41d3%3*u!ig~kA>9@`_c(ea`n!B6_+m>FCQqX% z3IT^>+%V@lY7DtZj%UYunId`BW;#-BcVfeT{RYDE!~h^I9HHaS`BPIqo(<&eW`2`+L3KKARJO@O$ z(7z;M$*r(<+_pFx-p0@mF(yJf5XwSIychdsKuSdYrt>d$m2rM8lVoI5m;&*!SHiXt(dlXIgJ_dtilU_EfEyBKvk%EmF6t>IuX&dr0x zi2L^iP()qbPg$b!W^_nkj7zqXla7|r35~&q0&t8AVj1e-80@Wjx(#j0qIK~3Qx>Cz zfe&c85g9+V7;R@n#-YFM9UYU>PSW6E_rb8R}zccxM$EUU6VX_VCha zv&#U?*yzp^m;Bj_fV|sQOqstNm~lQ48zL}c$8ec(ZS~A>ao{*-4avlr3ahmC1F)!$ z$;4Ky7+aoYWX5ArD1^-D;3xcNjLg8#k(KAj48ejhhwDd@*@wNrQX?~-;(*LBI4B&O zacPcqAZ;Z@l!VsR=^_E%FGwx8E8~pZ)av>yH^OZEc z)GQrBI>oN zu#761PX^I=jBT<;7>&Pxt_)PKN)OUF-9}J{(h%6dWO+OCB{4%*OPvnC-mJk<_;F0` zd=aWquj!E*UK*(ZRea!_sT09E_WGR$Rtc^R!}|>2C3_s23dY@l_%*B*4cN)hahPahD_EGA7Pv-Uy{^RFC*j9e}yA z?Ip{<9qgf7@UO2{3S5JC0%1236R989U=-w1Yj6>mN4HuYa!sB`!euo1*!ihCo*rz0 zgUTQY@jd|Oj^{jo5sx4z;Uhm=BU31UM~Z^pQPDuf#U%8Ar~}kP?w-T4@*-%bkV0~u zetuCBT&Gc_mFRSV<%NSiWG`2CW(pAIU=Mj4meySx*n`v{6YPO+F|fyd_=&(C^eG$p zKsm9r@28LzPOBuCP-@I_kdTd8h$I@NofGWwsbt8XPKHdMT!u^slGY&)9@e02BOBTy zdL=j9gIJzy${A;PE>2;%2a#BXdz6BE5DyP-xW|`px_lmg{3(XJTj7oYOyA!*4`uf|?T$ayXhTW&pyQ1a z&8T{N7rxeP0%BuqqTOi)wFYGSclua~Uq*vmd)dy*k}OLW1X{XgCDER(N+9u63Wzod z!iHxdVG+F{%Nk-|cO7Hc8oWh*FnD#0hiP;YL`;n-v=1e^_cnqBlnnxAu(Cb;DXxs) z?RTbqK8wkj1_7Aow;deSq;B%gc9}k6UCIQc8O*Xlhy^jdvqVI1B# z{|WW^*?ILwhRe%$M;72676B^2h9^}r6sAv_`y5_r>5EC3^5PmUh;a=L>{nq8$SqKk zREGWFA`WYCAYU!2;co1j0oA~|UBEc%Y<7eLQf5wyDSXXMVK(yI|3F+UiaMy`{s$&T zmvZl{%Ta!b!MF?ubCB!)hp2lW1TE1)4rFP{TcROB4lX8dhbQRgy#Ij)l6C(B6JM$U zZ4RDw;Q4d#&PcVj+-QTZTTH1l+Thz3VkW!nfHuIsx~=Oxr#7;99BuG`+Sf|%e_$Hr zY!K=xy(oJB18ZL1E?9GVqc2F?uwSUW$=V#30UBsT5&j=`ASw49)=ZZc#{O;&Pb5sYGmuFoP!!ml=<*o*6C< z8|SPcBQ{fEmDc_a=Bi^xto8l}GD$MZ-~^Njp$wjZpYWeC$^bt{)}5ma1oOdMtglKY z4P5i3Mj5!=|G;c=%Eobwf%X0e?RTZDbDdlFEaa-eC^{ev)~5O_wmTevLEqAGgUeCI zn%}H8S4oj|CbiODgUD~egGjG1ONTBPsQk+EBwQAjJAiy;3(Jd25Hr|Pjk<&{M3%&! zjbcli@N`JFl&ofS|AS?oM%aRPK}QCPC#8oLoMs`XLly`uVAi>XJW0%t)jFr+pqFVg z`>8{ESb=~P@H9w)E6UI_Wc>e$G(36JY%o%}!jvoB^f2MRM;bi{cX`tNKO=Rcv=Dd( z;a?(Q${^%=jlsVIDBb^`s^tw&_x~yo23FAVpOWs65BaQ@B{HmZ{~uf0EHD*$y8jPp zq%I`H3{BT`{|9jxLb^X%YnJXWxWhc%Ulc<+-QOw&5}YpGKl@t+)BSCPmDSQE-T!Z$ z1*9ZP<4ku8Kt&{Yy8p+C#E{bc>vx$al#6CYz2+wFJS1Gk#O-DaG9G>{MYeylWOF5w z{V%On20StPVj%41>ni$-Vq9wdEt2g2%xZba_4p!t?!QH&^y%3J~V`{_^H1 zt-iK=f6|7`e1Ck4<@>)4KT*CveacRLr?f~)tDyjrlptAZ%yPJnjai848Ks>w-~W%3 zA-^XXGJSFxGMxxohdelu;ySi;fA&W1Y=2^SvQcJy;kj*vv;B$0YPNr=Y=7e6!JX}Y zA5NBg@y9zcoPH1d;MxB8a6df|vi<30nke{k_-6cpsRiNt@CP0ogmm73VXqLQWh*+{ zzu4stWCJpj{r?%*S2EfEAAyA1YMhnq|7Rc|*JOV*QIPDvA@Ai5J1707-`TYD`brZ1 zPh#Xepl8hbH@qXA68{3VoDA(x@snic3v8u$>i^GG!h_kIC5npN^N_GNBmMtDtk~Zr zSrGGZtJZA$013c?$x}hMF@v@EA)&G7?+Ks=%06#*eX_fEH(jtxHBs;`h+3nE*9Npb zpJh6B+x-r^Dgw^0;L-=Ev5(LIxb~slf{On=Z^7?+^Bt(}-)S`WdHpW50XgZtfUcE* z#K?|^y}&&8ss7yDK1LOL0dIKoL5Gqqp>BWOyR7SV`;)WlFwqin;i=5C*a;%mo5j&2 zV@tpYQOW1?-MJvANgn?@X1xi&caD_#KRA+cP|nsk9JwkJeWZnG0cHFT=mrbTVsGQ{ z+(!;@K}yrtCWZozDNk=a4n-ltJLLHc%uF9poMoy!&nDY0khW{KcHN>6O1Ac|#MS3@ z?Xk%0u_MAWS@kZmG-Xn~qIugmETdp&#r;)!q`ig@y7pN_$@-ERigqSu^jMN?2; zl+*IZRRwj0uX!(=ieK}u#V5tgCMX;mPBLnp@%M?eEHvh48@hVXVjr&q?a-wz$o-X9 z>LF#MUa>RwS)8*{`G_Djbz>}6``GK6=CnDgR#xQCQC+KPZ@KeS_gU5$nt;isYm&?u`WID@e8S+>^9c>wAdU5c62SG+btUu6ky;c;=k5hTN-6g;iRchY>mEUOhISRg;rh-;RQzWY!HkC@*v8qt_-vF+icxE}i^QQC6n4cC1Tllr)hJK+Xk*%Kz9tr9Q5#w<@3t1oqj+BSt7&AVttvVO@m8do0vR{^$r@T3kfm($Tf@g?FcO|%VHJ$V4iIxiXolF zYL$X9i#7XO1+!Rfgq0=GC5yG~EFdKd5NEnucq$^nvsj-&B!-m5`U%v6WGR#zOFdJHc z4-e+F*>DHWn(gqT8*V-lZ>6Wd?C;Xu^msu8J_~7rV2(q0HU7Y}h>(sjFhCY!Tx~_C z#_lXs2%F7#Oo7VGk6l0pP84wG`0CjM5^f7{R(|aDASKuQShPj%`LS2-*kaC)9aRbq zo=~rQyCQo!)0y6w>=EP|d!c3P8Ghh&7+j4LiK`sm2e&#z@mywIUy1rl)|Eb?m0yCC zR^SMwv_fEJ23pizwlW$vaN7}W#MICZxm|s_cGV<_vdhnZ6!r|}W z-&oEe3^pD9ec5$XOf=|1%I%Eb?{*tdQ?vuy$o3p;4}<2E*Pf0Od-wXyegO5IAu(#~gs7Aum!u@g*h+&$4~ z`A}hf&hPH&Ud;Y623)#icQO^C#PU;2bYy;h)xytoFnMrBMjsNR|1Yu?4F45d5i8~$ zD~?0%(KjtUGDvtd{2nd=hjn{Xi-V)!=NRy6F|di~Apk996Xsu_J;z1*NFWc;h{bU1 zFlhD|`q!M_Xf1|61Y(1u;19ih^TFcaFzkoC)xU!tFZi9-;vL~3N5JbfF2;DpqYyNO zLHPWR>O!Ny;-i5>>oV(X!Yr`i)2VUPi%d1XbPJgJy>N#E{Gvqx7J+UMcyxIHQ={wI zQ(X1t{h8om_O@P|A7djYGvT;5E6zb;Y88!Mlid}gQlE?siAsG!YD99s9%bp*F!cH) zXs@Ro-x`MBTC>qx6K%9$X0tvBWo zh6VgcfL1X`6+4a~QuJLgCR6Y=_TRPbRzP2+@9u<0%w=RwX{$ds0jRQQC2e==-nKpf z$D;2Vf31Zl69DUiJ7vI#VH0)w33dz$>HD$EiycX5t?4$NjiX`zUAWhy2(}qz7CQ7J5#wH`@VhUb{&We8&29-iBx4_>kZxpIrho*JzE;`M1P70O(uL zg6l;BuZ5Q$!1e%l5T^0Pf5&mQ+OV_O6D)vEz^PWd-)lAyVi<2(8VCTCMhh*+T=%@O z4bVIK4?DN5(Q3@~=UAtZ|MD08Tlg1~@6o8XfoLsX1hdhY$9}>0H%OA+mOLVjj;`H7 z1p+Nh#=oXLJq`bkT3;UzpPJrIk4)dbtp?#CVG&!M&8xE+?q*t@&1=B;9FVh_IR|XT zz7AGww-~07<^IPfLw$wW?Xxck-wU5^i+#9DVfnW@2x*UOa9Cq%1IH^K`+Us5)WxO- z$Kj1`9lyD2qS>C@vj}A!UIP2N@ZZ1((*-xE7jT;gMyhl-7ENEf{b^Th^x~BSuQ0-k0p>V5u6F ze88D%eL&sD@3A@wfWtnGJMUT(vPL4Qy?Rmbij%umM(ITomGr`(9-)O9t9K!9pCroW zTw?cmk$iS1%zl^bg@(5w3xtJi@YsA51c-hV5}!l=F+w zR$Y*1!aP`=E>6A>?9^lyWQTL1u5;i4I;~blmISQE{V-8Pw;>Ng9y^nG zYP7)Q{+6`7JoGKF6v_wviAgZXw+yacBciZ|U5LSCCS1KV!{mWSxGwn(X^@X9GRWe% z`s_ib!Hmm*s~>mgi3_UnJRtAp04fuko1o^{1j>2v0*oyFMZT7edyaKLH255DZPFAYejH4^uGV;CW(St1>Oj~F_LV9N5kDkB*thamtoaY14A1%&+ouP-37KV4tI%6(#^?v||VZ_N%<=>exrY7ao| zRBEcNV~T@d0f~qPo6bnS;Vj^Y1V^Z%WpNAhMI?BAf-ew>A=M|?SncHCCiU@1xQt0{ z3CaZ7P?F`8&Y>0>&1P&w*VQK5cqWAhQVWgVY}#jOOjFJl;6(N|rr;e2#DjI7ZpwT8~n-@sa68L-zwW8}+coGnm@dx{P8h7}dhrm;WFTg%vCg?2=qQyG@3Wh9* z9fWFJMNmU3nIZ)S!iy5fF1zeu6(G!u63DyA^i;4FB_M^#EJ}cH zF@*lT_=$=V(5GyKJ|Q;A(oysdXK4~G8PX|lf#RVUxzgh>>3S@|F52twO7f~US0EVp7hACU7c<5)<=Bh0AS8)VWsA6jiT~4(7t*LIj`lzAH z)bpRGPH5A`M`^{0|0sDe|E_W`nT!Tuxr8pi0p#6$8Ot%-KbIh82wiHFC;TU5i7|Bf zDR{a>q06XvsB!v6#Y2yNn=xkjP*L6DU}aQ1)JRqrr4)F=VojexCMA;`902pVRXR#} z!6pE5!(B=Y)dRjgX4K-HN(iU$y(?ot`3{EN*@A%bWG0X%7os4k{lkD~y!*LqRKDn8 zg=LF}Z+Vy~kC%7>qFkP^;bWz4loko!3#>)Lv=`u7j4ta9a-50>u+j?qBxY^B(aX^) zL#&WOhg(|>tfS}ALku7SK&jc7gUiTJpCfz@{4rKtP53Wm#m!dwiPiFkhyNZAgk$er z3IE|k(xg5G$VhXhXJ?INL@&j2?OrHVF;Tj zw9%F@peTm)Cdw*>&f#GDbz#8lZxt*vY9m}=$HK!Nk8>7~vZuqDUUE<85s4v%@m>nV zO%uvRGoyiX6ZaA%T*kzGfNgaWvxQMPSeeP5b#Yy0rm9XAY!E^-3yI{D?RE#w3vn&4 zjR1soWSuvHC|3B5c$&CIi--7LZv-vkNF4z=0HfU6@^Hn z;@1cv>@}uqadFZlAQ;<}Q6&$4cBw`bcY&F;UfE_1wNO=t!i&foHPHU1YPF0*fzCj} z!I6jJ1)hHqBU7+ zGg>5i{Do>I#Lekvk#HGvnkv{DL8A)Sp#9g11}b_qVE{xO0>h~x<@asA2JIA5NbVXu zP?Q8e;X{#DqSFN?ClB|^TP@k96d=sQz4CTEt-H2xFR4LhxEJ4I;oehz7d}zAmp+vX z_moI13fTA`~5Mn)!`PI;aZulei7wiuEi;=V1 z5Xs<3b|Lp7Yi6}}ZK>L|RFdc5tX+!=_N+xxF~1vLPIYTXnIe+zjiXAggCG5tFn1H@ayVB!yEC}A>mE%D|`n0fH`&5Vfdtb`{Itp za2Nau==t;u>hVH-1tBxc7>nW$Xy?CPErHu*6|KQOWY)L65!mBa8zOQQ`O5rs6o*rZ z+^qVxsNnkgwndp#s!nhoK6c9Uv0XVI?*~oR^Dzh~LF=v!r5enS8W+Ii<2x}0(p)3hp-AqDM9NqnSA8sP)m{bMV{w(2;U{UmEf81P z1BQg{%wC}q9!%v#M?iTluwoV~(C~>q zl;y=yPys1~^k6a;B$W3_N$TF#p0@zep!rT?&hIpu`)X8549|4}sNf6Pu^7b(Ci*kp zBs4qGz9p{11}awfF6(;T{^aaBjG9B5EexW?f<95JHLMs6!6+v zI+R+#zPjx!l~fU4YT<9yz7AfxdcZhNV?*`KNJk9ikf0pvTjK;W{6|a}DM{RC!*UE7$G(r%3jr3X+8_2jq#e=DZIQ_i1 z)qSzbwk)5+WeIu#kgseB`i&CA3|3d8HQ{Z@lGq1QtnM^C9g@{0`^t(VtjV6kQIhf7 zp+5t~^|BU4I4hgDF4b7z3p4Js$f(3#S&e%-|D=&s5TT1kSO}t3R1#qc+m*cEKa^Ni zIuM$~eGU*4$Mof05)(jQmM5S2<5D+D%YtX8d<+Rwb_$;=VEyvvGatBR5dN-Op7K2C zzXrmTf8z5Pd`SYOjl|lHPr7eRyqm7G3J~PjM{tk`Mg@l+bmj5g`^t=p$$o_Qxvz7ZKFkSw0_P3U)41%p=iWlHg2H{K20#*|L(6YFN;35*d z48li<#E|l*NAEFDL>JADdd*Gh*+{sINnPqn1hL0X`oGkTOD@L~s+9>(Ew~5>yZQ8r zKBHKdTAzy~vR+>;54m3NM8akCI$s%t8B71o3nb~TrV>!wLd|8Ci|bc-7!Y;Hc2&zD zWUOGwg4lsbuV6Ozlrs5K)Tj$jlqrH5Qppr4Fc6*>E4%EnhgEBGDdm1 zdyF#O1MO+7CPF!Q;|dD0DTAOm4qiZ%|EPF09UVy%%`VPxV)`rc!JztBTDU)o3Y&yg zN|KCCu(0Lb)eFcE5D*%WS937e*#D`C^rb6N~vx&64;tTaE4b-#cIr#IG2 z63jkYE()k|vB}m*d?3x(^WA4`8Go&=HaA$wvRh_PZL7+zDm}F;fP7`1+GQn(89X(O zwuDbcmKZ&?QFuChPwmlKPc54AlyTI6erS9&aT>xhYYE}FQe{f zdt&w4CidneT>S{p3Pg8w{HaDCDtF}c%W9He<}IgRcJK~bvhp2CM=JEo&PBp(HZpB& zOD(w>muU0H{W4j#nO`R8e`&vLKX#VF?;CzGGSJE@P zq?l(Gx1QTKd)*52&5{8W@XnO%BS{{a{@JnO>#~O?Kayte+oU;_Yxb7$(e7588?0;@ zF0+?*pUSW*y|fPic{f99iKo4{1Tlk`rqP%1J;)NHm-YsDI(#op>say0Pk!20p(h$Y zO`eRgr*^u|Q;P}ed^Ld!Y<0W~*;2??`}&na3@vUmkGFPZv{-mkaL){3YYz-R?U!M| zl9m64q#L=cye+!LV`q0FVbMqXn$(h;X;FMMS*4keCg^=>AMIz@S@O|-j-SX!qffV%Hg1KZQ2$J?Pi}bN)@D~tRv}(G(S%IJ<)dN znjdAnpogi=4PLu~JXwL?HY^5nNfTFdc!!GXRDLCTWeUz84X`fXX2gD$T-G}ZUU>?x% z$df!CkXn271Kb6|13bLH3D5nK8t<)CRT8*|5=wyJIp8FPdEkC1AxUMO2NghKN2=~U z4QqkS1-;q!lm~ZOcA-e^9tduE)9{Zrl;Nhv{9X-em_WR0zPZoq22Jp%@Gd_*d+eZd z6;)4($iTs2(1NcglaEg157<#i#`x)y7;_n8+dNO4m6dK{nG)}iMh}N@%Yy|8rEZiK z0#ERqLBf>a$>%Rv-~3pR<*#l3+-iBlF&(!8VPFN#Wd+lL54m-dC1OrlU4Ug!DAP9J zMeHTli2qrdii?&uO$)E3Di6nYyoyHZLPE@qb;WkP7Kb5VJ8)I9U^_%Hq%&i!QXs+U zupQaoDp=dzMz}y4D$ixV#aTc~qAt#K;}*?ku{kzlibxCzoAEi+g2Y{rCzOk3Mg!+2 z?tUa(#>Bns7QfT+_p!=nLd|+PCKK1JZ}#D4nu(yd5CpB-GuCh1@T|HQ5x|=FQ;oTx z)y3j?Q0rbQc|X#FN38UHZDguHH@9yWIzJ=c=)}JGg3BZ!fLWzC4yk8`8uIXG>?2f+ zr@_{+f_&0X_^aGg$#nfwwbJD?;~z*T3n&OL?TiYt)H9<9%H!wN@{rGvpCaKhGvq{6 z)Lpl9yiul*iJFd@mqN16M@3(hZ^eArJF77T;vyCP9t_d}z>)OKVWm0_`fYR=@S(}R zWpL?8##Na~BNlot)1eHL;*J&MQF=AEv8dGYStG%?a79@@agJ1CBnk|K<6PwJh`dM^ zAk5F-<;{B97}#(wG_NxABJnL2+x>OaTZ-+{r$VvaB-~VL%yQ8mHfEtRkWtz>>%Z^8 zfl@fTnGBgexeS@=3ZiK?4ta257i&<6mEYr7Q{>e}ZwOT?7Ja$u6VvwDi`br*fJL$= z7V^5CP*T=qBJt|&L}Imid#UQ}#KVKLdONGv9`K=IL38oyLkEW=vSKlug~IjRMtl$isV_S2 z8;g#kx#~|0F34LWdvBxL_nW&KlL6ccx*JTZ5Rl>J@n;MVM#HB3WbnxAIYDCqa??xF zCh3Ey+GKd&i=QO3?_zT!LG6K#GK>CxmGB_UdBRns47tGKjAG;`LosrZe-N5yHN#mU zWhxn7?=_~UJtz)7gEht%W*ZplhkVp_zc=59u>5qVJx8&5p;-v(Pjui?O}Oz5^sPM) zP$1YvZ}U4)P~6+mo(Ve85W8vf@($d?2}Q{-Yr!4%kTx;t?d*5<2Kz?3-ep_8Yy1g3 zG6=eXCy=kP-cUC{k;WGQY}D~4;4V8jK$vbcv7?XxMo^+D)Yo_J3MrcrWY5&k6- zrc=JCc)2{UVC$EvA9mxzL26ss;Z;-vA2+<~y!D`cpuwGB9ulM>zY~;VFDUf12bu~P zIn*W=PugI3u?AWPmGc>Cq{-$BOpm~u^XG9opvL+Xje_H;ZUCofP=X(zbCk_ZTDUGg zSnK$$8ESq#*4p2&eto@mJ^N}D$nw^cqQVpEH&<<#RCp@p&&+g!nMAemPdG$K7>5Bw zcR>a|%v-GBpVI7A9%*?bsq|NduhKQ$QUNM`+Y!HAJwdL?S^fpemr-F^UM+5~O*&UzlkFwDFiRmxN(Yc>nI2OL^Xn9JV zWNnbOcbwE4xv|54AI9$JH{J_<&?n>!j&8zo&<7_3vdSXv{yx0TxQhcbMn-JMNV;Y8 z;W~+dg!0}2QqQp)5`+k04@*I`f$=7g7w2@9;}kyKO&~%yobCe=z85Ed8JJc%Jow#^ zk~J95b1R6{$z90vqvrIz@?13fSEAJtCud>Bb8qTc`4WP4Y0NRK{iP*~;80qLEWL ziCu_uIF&m^enrnd@nRAEE7CAKMTS|t*nIXd(-qy9;dYTb+cVMeH1_8 zKjS+_@N?uS^E*ZabHW_9C*#)=FC8qdsjAZGki4Ot0+1jJt&+8H@OwtC%E?WwXH*xu zr1g^iTw+?vY0U2>jq0qo*mweDdClQ?KPLPaC1gSdOX^Y!DO+Aj+mxP2cK`1!!!YdG>K07yJecALs*H-e|^d;LzspMVqAk)2yN zjmQzXo2zIuS@PF;e7%n$FHzg@09pq>Kt7#%TeZ^Qn*3(cAs17lXfg_PsWrI>^y6dI z@{ljuA3?%pG`e<6ryeP4qIM6+8FD_xUz6_Qpn#Q>xjCe0-t|%F46`41wI-_z=v`e!KriamFk^Zb*mmnNR~T}N zfRwP5inz2?RPT71orx_Yla+obnXNUbENruWjdh)IMYjR6mKRHLki%16~&$`o$@SlQN?KB+{FDY5-wxn9wAt**q+7K zi-q^KZ%CT)-D*e2HRD?(lL8FlAp~U5Qfo$$fY>pAFeD8*5($^l5Ya@(i3$Y+Vy9O$ zNYNsP?*|E25D?3-%#VhyyKQllfY`}JNpNjOVOFBe1q?P1h{=AVY|RP~<^eHzhmqD= zTR@DIATuC_Z?S;bQ&AHsAV!~7WI*gjF@l4T;p#$S+bRo*VZVkM6uU5U_xk_Y`_ceO zsv_YToEe~zLqO0$Fgd#ix_h|AkwNAHMrL|&dSF1rrlu>qyK<_l+B&AEMHXEb1+CR} zne}EBFIewu)%9L4P!!Kyb-nTUmUU%!Jy-GgBI0G{%gC4SRldxuo*s7kM^<%ZX1sXu zBI3o17ZHyr!wq$VTkME9QTb%2-exnMhiqdvkLPiXO{mRv-nOr}#)vaQ56c2}jy+eU za*@ul8v(rC%wcej&E){5agHT0nYSBBqIHgy;O=}m$GUs31fNkL^BsVg&ON3|cHkiE zPp4v5?D1!G84?{KlkljFBi%y%VC5n^E3JzR`_**6nQ>4y>yU0 zU}!gkyh;bzPpP*yAfn4LTL;5FU?3KugbT{{tCCbD%=tcAJ!Fa--UAXcDRHU zZt<5$g-ySw!jYzN|1v^u8_4?AO} z9ZlH69&Zgb$4k{xBcfV|DhO~@=-|Hr^z)5-2B`4zb$d*ev%C+S09_2vWYd8T9D*Ol zy0pSuD*Q$dBEyq9rf)bgbgoY6w@+Q37CT49Xu&m+zPRs^qeP}iUEgL%AX?2NJ-`+- zi{7PlE}Zo;n14Hwcob>=N0n;cAMiIK?NY05E??ubh2!^kErhr@>#C(@th=TMS+^h6 zt8O2r0*-Y15a{-sc*RPYe)1OG4GUH$(jWE+AoKeG+I4$II;We2G!QpI);-S$yW}2v z&l`k(l)TTwKbJ4|?uCyL?+b9f#rq;$Z}sk@>zCkq`6BPj^v_q|dR-ty{{a68!$pqy zBL!nT9w6&g*uTPy$%X&?weA}cvgoFX)CrXouYL)X&cO1ZAvZ}j!b(+G^i!yvh^5wa zrs`EldY`U0TmD0R6YUzEUtNNN$XH+&DmBm6+f}IH48=hq23ADDPM2zxnKm4v1hIqw znNsEC3(XJf)b{XbT^B5i4!1$D!tEa!_nImqAQW>3*W8O09?swwjgD%)PTCs z6xloMY_3Dm)3VztRjLBeOryT5g1v-F(eQTPs)jqU>Uz#g4ro4S2C6h(82qm4-HWad zv;Rfe%B#2SAEBO%5KnnLUlp8C=f|DgomJUKH=K%o1hYb3%_CEbpOb}Ahni`FfM_*hl!&} zKVH(nqQ&(c9vntI+_x6aIGACurDaOdIx?%Iy-()six(Dl zTs=KkC3dJ*HR{PUib*o{IH8#Mu)-)_%u6<3z59Sgi!h^2R^OD&+8h>aIlRU2_BUZE2g=i`!OPFWOLYA?@pB3)mCuK3PKi3N1A7YWuI@s_%;4Z}Ifd*jhXT@Q#^iTF`3bT#cN@EvGwS z-ImUpLB$S??<9hEE94X0 zP+)zB6SV*AYCO%xZ49g!PC&wM9t@6cQ($^m!Dr-bzH)RMdZ{Y4@oF19I8n1?J-L+} zaPCAz7BK*Ug?G^Q3YG&gJg)7p)W-0={_DV^>fdn1=%uU9Irpry`@`o>MrDKuM4&fZ z-yH>qG>Nm)!p8;b*Y?BDak%H6bN2cD(5HZE&@*Zee;))b3GS;#WxQ3D#!O(;Xg^PO znlo-`Cw8zEQVQVWIX^Xb+-)||HVTnD*;yAUY3UckL>dW4Uj{1cShjXhiI!bxl}M~Deid3;VjKF1%2VF>Xe-8Pd$NQg;qfgi0d>tVC2ssZi^AIf$aqnbvQ0@$U2 zNT@p{svJk34>l4|OZuj^IXKU}lK{*dM{l5Wq@rVBqu?Qkg>d=SO88_%!!-A#h+J_! zgYroTUx`THQt!VZI_Abb-f`~+?)V=-s_Feg{DK&YU(`-<#Ch}bylmQ%+8=S4E8>u7 z`0$K4LQ~8c=-xm?!(KGc;j%mw7vC_S8ws~ zwOi?xTj}vz>Cs!;6e@-xV+5S!n1Ita0#19C1e|tQ5V(ihXhFvbH$W6kXRy z#dXkgJ7;NhBbcIdF2<3u3U=%ksfdzb8>xuO4WPC7ptr z(Cd(#J*pIZsbGcmV1R9c7yyWJ8xRgy@C_vvHc9S|_7v3Q$A{ysCYC)hk|X{3UQWER zy?p}eYgOi!!#sQ%i`MEacDQW9|4an$Gyu~r2P{rNMO^I+P-Wvzo`Cvl71z#dQ!2@T z8COQu3M&P7g>#56km=4)PRp5L?GEJ>)WHBJcDkwtE+0j^SJ{AnL?vR#J(>Z}a~f*G zn0X&Y6oQf_${Bb^#N~~5UA@h^_xUW{%YF)K_wL0Hn%fJfp#H#~CN?L|eFwnX8HON?I?PmH)v!nAysl+~0N>dLT6YcGQy1)-cNPeDDyLbLIcP``kq zbIM_GdCYs@g8v35q2hOcp(4xvL{y1zWW53bgoZSDC-oJoYX`lj2gkY2j4ihWpHXC`M~JBLj?9;b!@V4~2E-6=P!+ z2$vfh)0XYi%)0TZNFGhQ!GgsVb9FetC(&-@MB%*QrMFvG#E}nM)f=$!^JotW5oHno z@@K}>YuIRV#I>eH_PKYp+Fa+Z1#S+8W3WdWKnuV^xLPG;S9Np{XlY}z*FzwBLd>@T z_`)oND+pK*Erglg5~Er?F_bymaA;pw3n4+Qye&wQz+zWgy8!O?+(IB*KpfKhSgmIB z&*u0WK&YcG6gpCG1qBC>(}GGmha*A;!Pu*iF5xt8Wo`Tg1$IHe!|ap`!JQCHHtEv- z7i3;QSeSn*2Su5>4b0|q%Y%K*_V^Sgafnzh46(uGEJStJXKPK&Vu7CqW%v^PhuI$# zR}TO61&8^?l3n&TGHe=oB_nF8X(XL(w9icrg2`US=mAWoJKWczAXwiOVdyenUPo`R zQF#Z$BKN4sqEBx{z!aD*#S3N&edWWC9?V=^VGj0y_esqiB~j`!Kay==ZM}{8vU7BX z$VNY<0!_OxuL5%|==@CBYzD!M1iwwX%~n7>^>mT=f%23B75vC3`?+E%D~lz51^@#g zsb%G4V7w_+7az}f9%)EoZx$x~NHS>Wpn!k@Aw+BPXV%m28QRnsh$hLFg%ZC_J+%Q5 zP4BcVl=uVeMx;<8PB)@ZVq}dfPX>+-L%dL;aTI9al1>uo{?<8Jc$tlrsSU*fFxVT) z-r^^%$I1us&mi4GBYvDfq!;%qMI@~=P=@GY67{P})i#9b`U(FK#4O#yk>sjM(;arM ztW}=bhB5$kh=(1Y>XQ!!ET16zqP^e&Ars5|9~qU8d9PjyZP?i-k(B)-0kBr~@n(M6 zUxL)+eH1^j9-d)nD?<;Z%nwixZ9qh2-uor+5KrO0Rc3g5&xWupdc1{p8T4`pyOCbz zqvVgvypj4^neYDA`a+nR4W6mdTuR_@>%r3~fecuDB-A4x$*PKEl|!^%>^8Xkj>z-M z@5+jWta8Xr#Mors8=u-%RD{kzE;ksa+Bl^aBz-_;oC}-4m*fUVdufSoH6xAEyVVY+ z#9Hipp!x=soxP>>OmJVQfB!coUboom#yop*f2B6(-3iPmR`ys&A@2WM678qxhxmzg z<7Fz`Zr-CjM{#uRhN=?)K|2S9M>ZYK0ujH%a>ZE?;RW2Z7@*gZJP%9o$vquGJeW>S z!!3@t09w8_kUJWY0TIT|a~XAEkkapHyk|YiXcOY3AlzIra-b*?Iv=2T5oEQ&1ML|o z2?S4JejCc+aNlOESOob{qId*_bTr0G04|d8;|zo;Tq_10tc?Vzt@TE^QiI}2U|~Um zET%(2e$$|z6*Wi&Dg5O40Z6XK;}$C8r5#mwMQn5BV+*AN_dn+q(1rV-^U6U7ze3Uz zeMjF4{EvCT@V}#UhKb30*g$e6ZDYpxEF()yNR~NNu*^GIOTaP(cnp?M=^M5Uuw>iZ zjLXAGKFeCp-ACyq_!I&rFM;fBf|sDPe5M?&VbZ`F5y(W4;}`1V*v6mtuLwIhCDeSL z+9RXjdDp*PP}ieYs^!YG!_iB$S35!#`Aj5Nsoyl9?`wVs1fTcW_>!5D(Nf(^OnzxV z#70b_bo3qopy{psP87LBDtZqBKr0%mlaeTSWJtnElJG|f3I94aZxx{HBP%Uel&I{M zYfKb2+&@Za_6r!Dt<3#rji3ZW zcD`SMBG~MMDxkh0kEXq-S4D<7mZl0BzYq2zqt=alD}ciu$6W0M+lqK-Zz95&w!(;+ zN(xOI4oMU8qs6dIu$Jc2P8uT+9~4I5-S~}+K>C)? z2-F~E8ZFsv9N!Md*@F~&fuZMl6Z#I3V2*~*`e4mz3dTB*I8(4;j zZpmf)s+c9(zXb)0o}pMhYWo9X1JiJ#^O5RH;lx0OLDB28HrIL2 zLJuKLB61L$r=0B^>^cW?@NZ)4nfU!bbh%H%7`()WZplAd51mbx$sz!6HL~B|MG-XZ7-H=GNfu000Wh122{c+ z@utpjNgqy`E~KhzXe$F_$dIZE_0R@Hj-|C%!)`=Y);Q@H!YHHUkB3wlsZRrz6h_(o ztxJpIYo>Wk?J8D6_cbkf2x!CL3hVJxc7;$kXxF|b^&;b$E+h~Zs`0?BRDeE~lMw#O zX!mAh61xS032Uho-++MgD8*WYSHK6$be}juN|+rGBLUWkuLcJpSOV*xVLd=PS1M+_ zfP)q**+My5acC37V1Ry|s7!{cQs|@kZk&zD2Z|jN$XrhP+a!4T}lA$Bg(aVi)ZtZ3OEIpolIT;rPlgE=7 zrmM#jpAsI=Q{E5X$jeLL7No~>6un2&rOB~!1xn8s%RW(UuJhJ?!NnPHMCd?M ze4ESlV-^g?fRZOp8}l@-@|n2PGhNv8HkGp7A|h-Yo>u^Pm`-jxg9o52ULD{q7!Ces z?6o5URun5P{_^_lpKzj_=({*lL5DPXmRTt1qW#0@n&Pq=~AQh z%yu0Dj`u*R&=)|+lqXMu6e!!wAqLO!CNU~;H~QgWG>y<10VxK&IB!t`nb0o5Lt-GK zHyG7!%|Nw-(idmAS@g)3&t9GZD+@mJvC770Z_0pMem)Z@7s_YZfN6Fp5@rJLa-@`Y zhvHngJD)ogk2B5C{?^220jH#`2{z#ddlDy@048llMCc*(-T91_Kp&^izSy>=jAu`m zCLygH&g-G92e7*QBejB{s^-eb0fMMSXjcJ`UU3_Ja9~QK;=)D-Ms?AC2G<$AX@Y5= zFEIjeyFA0PBMfKRCyfxn6JKB?0iMvMSM+v&;KvM&+#@4h20ui=Ia3_d;>~nWln&Qwq1OyR`=uZRN!EILHTwJWO;tcF2sJM>-$ClRMsE+1};l7O% zj#wLz^A0no!nnymBGo;MbY|qAiycO}U-1wChEYr2ufUtSRfyhS6EFV|%QuOh3eIma zm2&h4^lfKQDRTefQ2^L(TR-X`vJ4IMj=^q3+(S4s8TK#y;fRxP31!s;;TggqrY719 z^@?OZR@%_aIJzt|COY2H8*H>M>J{ow$~D^F3V1!eJJ7oryJ0=rG@fy1pi%bdjilYG z?r*(Ds>d*2k(8NCS=@_ik}-v;Gd4!Azu1#o2LDS+FM}45)kS_S^k(W}LUo+F#EQ-t zsKNw8Q`IK;5*7>cO}v$%(TC+ka2BEYr#cR2N#gdoX_}!1#t^)I!ig>+nMR4;VB^p( zRygJ4^Gp&>&E$hO^G`lYqQnp_iJw>xUubA61DnXn<^|M48xYaS##a4wup8;sPn7&| z^<$*IR{eB;>uEh?c{ZdbRB|bgn)Q(S`X{bDGGHOAlKdj83X@^|Xu;>)()pgyf@?K4 z|A2QXztai#>zU>We`O>1rDBCrE?vHWfNhp8@zAE{ZD~{{p>}~dj~h>hrR7FzwhqOj zX2a=IDsoXgp|2k|Rm4KSUo1;-hefRQq4Gf_C`#mDH5zUcmKRVa0gEzHF{&USDz>%% zqKp{9q%U#8>I8nV0*M!uFtEdnjp7fA9Yr~be>bZfN(n$lm~RQlvhV-LVreKP;r9qQ zk0hMfbww@>5$*CptY;7s-=#S6gL(^Ko~Bg47>mWEdKe(BT~Omqdz*&nV^}H=7@*D< zoj7_K=_QuAOnu~_n0~Rj0O%D(E+e(#CYy;=8Eg%yX%8Wmw&5ftd;}FuA(}QrM`ZX2 z_sMc+Xa>MCe1vZR#5JlZe1sefUBgH4DG@%>M&70H5&E_u!$+P9=Fa%oc)L+8E_ftg z(YFwxUWSfrQudL;X2Zi2aFX)_NMN~NEzLCD)!Q0vh$kscPL5&qq}BbK*IeCi2q!r> zgc?k(Vp$vcooUb)+iSZ#p(HO&QO>tU?TM|(?*e-ilH#z5Sg0V|6b z2p_9#F%aL%fLs0;2!XQAglo@LhcfjlMKLaF2L;asj|gQde`ezLiwyL#h_ZPw8;33W zC;h5IXSG>yn2(jhVK{Gbsx6_P7{w0DfLneJ6DaqV!w%y!c0dU=nCqb6!Qc^}#loK% z!TK{0%!0*E2Jo;vwN+y0Wx&dU#eA&dEVh(vAx<{`H%7B{8L-RGWCH0znJgPHO(<7_ zCFZ>b66D6QQLcjq&dORbd~F~sPAzcP$$QXp5v*bTzC)VQz^SW*yIgc2fP=LJl+ zgN&pP;yPm;EO>Bxj>1TwdKN5wC>V>*8>ax0k~8jBt2^quIX7Fq$#{M`1J9?*%-;8m zbuoS(BM6M&-U+z+ONIvbG3X{^!?;La?M(=ne6^BwQI&7!TP%eJTs<}M2%L3-ljZ3* zut7aLRl!rIC~2_@!HBh%eV4Ra$i6gcbwdzT zbQt1JPU9%hz$Jynbbsr@TujXd&D5AO<=SL!zs!2jl%40>2t@iradvdw-*JY9f>Uo( z2VIH>cZu0iuMyIPM*asflU=HmDcM_UgP#goC2Iq`scW^@p^<+!v~45OK6gm1@CWL# z4Tz{#@a~4!ErR71f5=KJ_`?xbsOdr@kHxl%V-iU+A1m$NW*l9%?~^Jta-dhJp9+BO zoO^jj`}9nsO~MzS1B|k#oddeRwP8JY=fh|Yi|9zM&)8&OYBkqn@FQzk%{>`BSNO_c zkpue~^(sX$UQ#W=`JzyoqA@MX`M_Zz5WLdB*hNT8X*X&RQi7Ws4R;dOM`e+qGKj&; zr9LqOI1?4OT6P9v5iSt+Sgt@pi#CMWhzI4tAFB1}JM190kK0uN$~>}QtXP?nbH=qK zQyL2rZ|am#`Z;3>(w_HH{KWXKWoXMr!7FpbGpUC*Ao6I9UD%EEmSdFsajjvbzE*2= zf2%gnBEW{(gkCQ7a<%m^=TBki^NqWfD<$-vZLivU|=d?qk9 z{sXKH|M5x9)O0Rg@J8z))aZf?SjdRyzsYLw$aqh5q2-K1dNzURQQfkoAJ&VzjRg7R zm%hUT5U`E!Fdp$dIRSOaz@>*l$We6+1|2!OrAiLsS?Y~Go~H>)8{Oi}=8L{|NvYb5 z?I+G#t87j^rr1%CadbxkV7mpEKai4xaUkcLgR?{|pHnOiB`2SWfb($jqXj2}9*weR zU;_;3?Qo&;>20oeFDt08Ip)32Qh}Gn)VH2EN!T3;akqHe-tr(C@laqUTF)>*wNY?+ zNX5~!rdWnKOlp8NMD+AM{ktObM0ZPJrtAb@)OK{wIY>gfK$VU3+f<{`I z%Kj1o=TQJ>UWJp`hDHNa0QjyUX+Ky9V6HzF($p>?v|hgJ`5s)SPqqzIYX}NqUyMZjXg<9eOx;d=GB86Tu1Suf=Ypx4&OT$O+OU?c3metrj9>b9%z~ zrLvYypmWLiZPo-=L>qa$5Yf)i5g9GdH`Gby!r0ObfMv8ikF;KNKxb-xg%F{B{ac0avHnm~?C7ZgDa5n{pLgjG@)b$oZ{T(N-Y3-#67uWw$XL zYrM$#`NLzdxq?>iGA;dEgFe!z*gUcHzf_y+ymOz3rI+lyCk!{+HzMi}`-pzZ(G0Oo z!NxuSZ?^_C#6B-0U_FeeKdraKI7#4d8;p8x2COWCQGKl9!Kmq~SFX)~TmDc~fwIk{ zY|mA_iKxFe1HCN5owsM>uu2B3EI7=^O5w0n5%sefaLdnO0_EOvSdSv=|0V;$ELg0Q zjm7>x16CF+=3^CSv9uBOZ_9vPekK!07s_PWfN3J?6YMc>DN;%sQU4%VaPt{a?{u@I z{Q{|91gw+d>J{@hh^{}W8{niE`v`4BjP`#sgVrj>{;YL8#$H;O=_2hjyw6Pkf6X8f zhPZC>38EWopEc;kh<=TcWv@lu|BRu*eHA*Z-7q?Gzv15zFu5BgGlK#De=zEP*+=ac zMg|f~59I*>SQ~YZH?tv@y%bt%K^d34y?db?JJ^XT}7&T)n|Gcc137JUr$)CNS< z7i$}Je>`?0;)_L{Z-}~&4nsT^!Z-@rScvX#6&Q7IYRtw6@SU-8&*slSHoFzO4?@;^ z`vZY^SVi5B7AqrC8*CvN(ZoaH&HUORwgVWA!sfS_0Wf7~+eV~)?vPr+r5@XWh-wAz zOnBWQ>fXa{q}K}maKsgAx~Ti-^onFYR;l&BeboI+dxiRo0kEAq$uruwWg2bL=Y)vYJX+)X*p2jaM3nq-tzo3TR%>*BYp+J#o6yUpUjEs7m~*R_1s!#N^vCqF zYamk(Wf(%&5sQce#UH!_KWpttCjAr_YSU~rt&Umd@A(Xzuoe0>* zcNmYlclA;C;Qo%}K^cPX@j;uI`*~`UEv;`Vb_AsF=Gj?gNOCU@;(T*&mWcb;6iY+N z#jixbdAPXvi2HXJ)YlwyUQ)z;7YFOxiIc=CB_ZM-Z`)fPG$k6mR(Bhq&Xal2;pkZy z3W8!8<}axM-a8U@9N)3PlFy9&=h^c4W6~T{8cRpCq0Q=pRa{n^~oJZ~#W}yAD zkL$%O1DnVt#UlW4&m4P7p#4GEjr1n>pNWU{f%bS`t9(euWDc}9fzBn`f1o~P7&9r_ z$m4~Gc7~3~KzqK2PBK?apgj+_hzqkR(4ICGx(3?gQzFp*Qe;O8w5M+iGSFU>r7yz~ zJjI3B7f_ZS5$a`d{bo(%4${G@q&b#T=vtSadc$TdQL2-EXA{@;_KG-9EdA5f=Jt`g z^n#>8h?x>af0p$i1{n{%EKEPEk~`FCI+bk^blC*(c9X3k;JHq~dKgCklHL;IMFM}@ zF#6jwU}X`3>SGm;Kus4$|JDq+<&QrVDBH~C_FUDQF#1ntpqGWXeIgr&eKiAC798ed zrEplPF!~>4z%4(A36y)wVTT9#%y5(pFM*^Seh@qv%m`wEAPd&B3Hx^$C}zQ9zs|;E z2Yy1oa?wpR7Ch!-73Z;KoV0>&!H6Ra_>hWr(nIZA8W z;qH7!(raqd3uBCG)1MC`n-oJIF?fUMc};D41eO#xAEAVZvc86i9&B8uuTB5Dc-%a+ zsf(B&?n8{Q3_{tRsMMgiPpRqbaIwl79!OfQOiZ{9%u&W8so_a+lqo*answb;pId?& z;QnR<9wdq{l_0OVH0cIE<3XwLGTsq(YwRG?g^w>3;~n-S85|za{V7ne7Lb#5=)Qq901k^q2NueM>cift6k#5-x}J? zAU(UFDvl7Amrze_Kt#9ZY!e^$U^gPZah#|Pi4W0Xh=-#XM?o8o(*3Oh6CX^CDOQxt zaRa-o2Tch;X%dKsRpP_vk(r9CBrmnWX9cZ@sg%P<@TRU+eaX6b)P8IuHf7?&_YG~^ zh_ufgQY(CidTawCsujFD;dP6|haX}$(rbm!5^`Rggy|9=ev54t$0U+uK31vqzkTAv zLI2z%)RzKaJC|*q(eA@;SdTUdUwjTgn(GErzoXjytzINPm|D#>8GH(eU^jZXCxeGi z;=_}Rl_@!AJc(pVFrhMM;7u*xrq&?o5+Al1+Okpb${g`j>Y)vYJX+%_>_&R65hZ_I zYZ$4owH&*@wO11#Oz7oOFBe!3b8hvrpc5ZnRIEHnjqw5^v_@m#&HNf8P2$7r3@zCR zyP_{{r~cW1$fGY_kKIVGFQUYc>kA|8wfds_TRlsBFg2Y^7yOm=5NdQm1}tRa!%S9# zM@E;S3oU1K+0zL`kB%GoNwGpGeTVlWU>o0I+(~RG{4aJW!V_RjnGd*^;k%f{5mVWZ z8z{C_=Cb}xv7;bEpMRNEjwA=;K+ZP@XGwlI>XZ73%VsX{6^Z2JBM@*NPA)$AVW6PC z=9u@Ak{`M_Sx*7117CMS@&n$sw>)TC z3`4pAyLrA4C432EjPz%?dctE zqqsbXr{+IuAck8nQzC}0N<42MhJl|Q5eB5d*-(crTD0Q1dv4q_;EiMH&ZCov%3~>$ zA7PW&Hw@}WqfzrDLVQhauJgWq;!uIu_!v$WSSDi2!lC$0Y~bSeA?7ehq)Pjdj%#BnAtllK!Oi8hY&KDaxdah#{7l6Ai<@?oD! z4(Uvm;vl-SKUEV+fu0dki9nezBkjVCV^}by5A?hy66lFXZqLj#>bon`aOk$P)mQtD zQ2WkAqdrX`m>72#xJY)n)%tj)HP?rco8xY^x}(0^X;z-)#v(L(*bbAdV__^LDY#*v zldLqMeEYVt6KrxcqYbc0+=13ucjeZt8%DNmy2e>EI(p^i4WrKb4I`r)x557->z%7M zj;`B6|82R%8QrjE`BhV{QMZl!q zmS_fJ??i&GDz?MY2lfO6Olx7OuF#jWogaEPwLVy{$C+`nn2nu*wSKu}I@^1luVUyX z)L?d6bqDRKb`@3D_*AJ;8gIFcO0!iNcdBk}vNc7DE8sKrMDJjN4)D;=+FOdHm0Sm3 z4uAtUm$D&`H+32mpaNIJfAQ+-^~_hC|GH=@dOb(Tl;`R}01%yrV~|l;v|>(gSRc8$$lE zo6qxjMpvlKb>6ctct-gk8T_J;5-YJmrwm8!t{$n^++aj{Sqo;pO4lNNq!$BtyGg^~ zBfXG-^{^Jq(|b#ds|EhHwP3sqSXoq2@Ueft0DBDc5UAZb7FpcLu zL0NfELP}{p@29}s`SiS>oMJ-p{qC;>)RIamB+U?k*FD*>&sAZP&pkpU;lDeL@t2j) z{oIJpea3B!yR{b9I)KGp=+z>l0xBu&m?NdzbX$SS6$`#>AlNkdde#AMDP~y5ku8mj zmwkEi6GQu2Mj05|z2lnw07E190LgXc`w%d#GbLBUT&Q==e)M3rgB|*82h!*0o-1sK zm^XK=@7ndtg^bsyXG#q$ATn91)S4mB=W*J8wOA@jr|o?JSnIUKn>rh`S5DjiXJ|8n zKuf3XkEy3NAfoGkTc_;<*o}zO7PY*=X&W7exYO1+3c?BE-2a^09Da~v_qQJ3jc=Kv zHNmr)+!d$Az1HL6gOFzo-a{bLi}71<3E&LOl!w>DmrEL@X_&Vf&h7^N57QKF(%?P# z?qJy-ryq7^`W@UJ?yuHsll{(kz1}ESYOr6^9PZn&y9Lvq+`=h~ZRY7pZRK=nH_nMr z^rs0sJJFZcyA!2$wbjJUpZX3D!g88WTL`v&YNcv0Uxxe7s`6NZo#6AS_=yeM<3FPp zVH;WSX)YDVaR6AWIPhkE#Ssf1PMNZQuA%J=J(ddOEb6fhh^PYb{s2sx-ht?ykKIVG zK>Xpzma@O8S0wYX`reY{nOCVWV4t#oU9V7o+PseTSfHwp}lHT%ehpGGHO|@jjDvij;nRw3c)F z_1{e(dbEA{`eNl+E)!mhfNhou@d%D{*1O{nN>+s_9fC3{^_p&pOJxFu&A_MSOb{4< zzqeTG$Q`41W#wIp58%O*V7qO1RR*jqw(WeZvTfUyGvJng+fJZtGhG!La^*rq$)04`~JEcFiyJyUPAU`qmhhUjnH;X2dxhU>VcW~Dj@1*vP58QMN94?DQdr{tHu z=2X31h3z}nf$fa;xY)@nITNrB0(U8RHK$Ln4LY+^P#E1Am>#UHaA4m9U7ZnPjESdZ zS#`exI&6`YronaEbgL7?gw{CZ<3Lk-uWYFH$cyoC>>yLSFJ^sO&m88@JI5lohn{D#!z)Wxknym)yVr+I>Q}r?m zE8J_ilO=Ltpb7v%B)Nm#dH7eFA)o=o&IBBW&UC7xd-sD3r{9k5M3J-5`j-%6iT)*&KEvDglP=8&JUD>S>v{uJ8x4|& zUK~AZishOl))CQdda5V{l!rnTLWYh=uQ<2&xlNVb z)jo|>BYP@BAwkABF~+m0RBwr^~8ggr8jP=IC zLG|fr@SM7k4FO@HWiI~v8176peVq*%pNBJ;88XRY-&Ht*m%qXYQ;WC_$%|Ww_q_;S2n$zBmSy#^_rPF>+e`&=(a{Jv4;L|is(JZLk22O6ET~)2b)cn}v?DqYag*ZA zYjBee0M41XPBQMPSwTo2A&y%ijH{SL2Gh$o9pv(lYgf*e834=WA2&hb3~E~btpdVy zFOQ2)iRIt*_>Go-^ld>d|DK^()niqtJXYKqaJ1MpAYs?bh2VvUx8+Qfe26GjMl47l&%4 zRvn9;f`#s00q7;I5Oq8oEE6q+M_DUI2qx_724hC6wc<@|t=Nn$7Mnd^EpkcU>)0@r zat9+TpICFP=k{?$A(-y(8Flu;qVD|+f!xC*7j^GNz+{d~Ndr4C{i5#i>*`SD0g~Ds z2rsGBCZ$-RL#DZtGkw>m8B^X}Y_Fv~{AmE3$)uL{FcL1OJ^U^L(c^{OkBgUr&A>$Ys8-@IYXNPnbYT({jn)t#K_>r}!QnM-pG zfVZ1+lnu{chZ~+(5-_D6;NdZn24qvRjIJvxZkvwv>I_&}q+|J5#nZ8t2^}4fR=CxI9~ndaLk9fvr(_AVZ44ZHc{~_5!D9tY z;|YK1iUoZ#1C0&>XHm&}t_ZAnp7^+#K79AiL!mzTST@f3at5p{ILpT>&ROZ|bAB%a zZuz-Npj;?dWdo*3^h>ZVylqG+tuu5r+?`KnXmX@X%(x&w=$`?zBtK|^K^M3{lOtsq z@TBa&2!(_r>dB0`th}EW1m4ePa9txQ*-=$;=()+p7Wel4WJm7oCMTr*N0{Cb{$*GYfa z(gnp*R_3yu3xI);WJxQzYNp#vW$>eXs}7XRDn&NWx{x275{WVlz${j2&Q zIJ8Gn=?Za=9KN@}k(9XtnX zEu0;RdGO;??)Xj!4aHnr$h3!v)@}5acECX!7?!#Nj+~qg)-7svPi1w?GG~>$YgWX84Y@+0kD;p#AwaUi$R=g1231)fXgVya~Hk=-mk&%}ifh@9T@}_nN}ED~8`AqxkW$I0EW&hB^(tui}-Wzf>&s z?*znz%_pgUu%Q0E&=S!6gB*341{vqL-Fu(R53XSR(K$FoiPQK%pCLGDe_SkSe-6k9 zO8!7lk_5YH!-G(%m8LB$)#|VPU;$`9aWVNtY;>wWt35%h2FXDOiGF{V`fa11eHH%! zkb4FL(6CEd$OYSnh-6nnfMwk1G3U4`-`l&#ci?-SjZB#XJo}fZe-(P zGUrD2u>`^*2qVn8VCGl&E0cni_v)n}1INl$^dJJZSw+Y7==ag81^*KkZK=3^(H5!$ z)1XunFj7GUz%m$2R4ni^y{aD$zwUQd(+~bxomlBb#Qs#>CKRoo!h_ZwC~;qzZchiN ztAlM!DOti)?!RoqHiWV*G^k1Uuv$<6b)qs!2D7_++;t(Ds(;<4t@s+A(G_3?kYuTu zrZbBrryvArauU9TnN|bJS>R_`_nfQs4DU0ZSYIqpBw03x3bl4IYYArAI1^k_%$Rce zJO$ZXRohvasg+i5Yqa5?FsQ>2ba-$`T5fAZerHqVFOXgA z9K(51$sSaj>-@vMkV+<)BaBv1f(wVN1~3?#UWOGO`~~Zg^(-QHmI8P?W5p20w3vV? zVTHY^U4CM333I&Yi*2yn$_!Xpgf#hBWeaIqodLJ}Ax#2hn`zgc!w!ikSSgh8P`PE| zso(*zPzioy>h!7%l(G=It=V|1oB=Bf-tw_hcnfDOPO~NS6Qfuo18(_wOQ76a-YPB# z^FT~FlcFvoBoSVopE0Wy z9I5HgTo??ZF2h>u;8`bQQk(}H4YrKM=Gnc<*#9dT*xwMZ9lA>QL0esn;C+lBFoJvM zn1G)$G`N2ug9k>sy?%s%$?YYX7tHgXMpeExa(ciRg+FyUVZaZn^kb$3=l6+q)3CEn z9QDzL>UnUENW+0pDEKlC$1M-{tr;J8XCTaqwkrnVW6jl&gBRrD!RPvol$F;%x@|q) zShwZMk!}6KB%wx99TCSocvM(+>TM=mi@#{UurdgjjHUV`3?htKax4|z)GgH0$5Jux zCN)IAu>KuWZ2x2=)lmT0Zpj$+gIbo^@*acTh(uE1#9;{Aj1oT{NoAzHHj=9QTel}4 zMvz-hAfiL;zzxDF@UH-Af!!4G6|z_5ca)moKaiZ@D@hOh!?&1By|FP;{4EQ)>+yTy z`V87n1|$4d2+k)Vaw4&odVJsWLZNi*;=$o;#3(UAfn2|I|E*~2+MS_8|jrvbQt2w#5f9CWzzkv{r1W2$JY$m#rkQ&P2)fwf4xd49l@zZm6{8&AyaT%5ttJY zcRkan&(z__Bi9)zjr2o^O9N~B_66q~L1YSeEu4YMWDO2OgZuPU#Nn^t(m?Zxmc&ntncit=%SKXtPLRU>HtL}bh&;mnZtO;S zVULnOF6>6?YlXf0TU)wuHq75$c$=O8?#9m*e6BaOpGzs+W<8D?rH}y&8F=`stQLpd zuEzCN&h6?S2%}{!Pq7Lkp9j24`JGM}VwfWE@K?o3qFiYH4+6GXXvS@?@(n@tb#Wlw zs)%Dm>vZoYYU+165}>BgM1!H;ZUpHa}j`XVbi_F4p-hhv|76(%NbXf(jw9U2N% zE}YTnkmnAMw}6C2tjLGq)ummfN)=DY@Xz@SJ8w9!EN&S0$tJns7`?&Bx2st4$yITa zxW-2BT8P%6hvTM0!<}fA8W4Q5$J>qFNH17*LQdG!N!h=6Uu(dV33*mz`b#;SjP9lu zG8kG?;H%bjS0*du{6YjiLq}v>Am2V9NeoMLWdJPW0{PBTT*OUrf#ksG8W)I9iMYTI zARAF!Abneqae<@aP;xqWthmU)%W_2qMo{WyY@k{oCepB9m@wjnIOR0v>g=3%?S&_| z+}*8JPJd|!6yk;B*!wRUbS^Br&GE5jWpb=JQyOKnxhW!-nqXDmg+Ws2RFEp`r=Y_x=-62!a)q7|gi; z{Wq~r$L}j)USeB-GjQ+{BgG@W1bA4w@+<;!{!Cn~p=qK|P~l=(vhkrDz%+3rU57@Q z6YmBj<};2&jrd>;Pi4GLhCxh-Bz7c9muWNW-LOn&a@( z_!Q^#p0&b6XE1~47IRtgBtJfRlN)5Jb;DALqQ;}GGhl^Y<_#fPZA?H^n9C@DOU|-+nHmqo; zN>E^DJOZX4HpBV}SU+y*_V@LTPSxAhvUqa3U2RonVDU>W1@6jbUmpOE9wr$Bk0(w- zjEV(lI9nIr3D1znE@2NFF6>fy?l?*X*})gqDDs+JY>p%kgziOGnj^3NhLDo{N2s znx@0a03pN$WDd5mNOtf)5NY_AFFc-CECrJ|^FYCwHxUIh=uNrv{cJG^v4ED&DK_k< zWc#0-;_YxS$gz~_4aTRh>OGZxK7CnHR90+N!+C_>X??(xpIZ$g;=KSX5z?k2O>k0> zd^VWNilD4ZBV^GAK_9I!CG;h_%vm1<62QOxtTPgKfCn>Jf-TxBjSw) zj|z>b-e$b^>0)^;Nhdy1Nc1NJ%?i+oCq-3QGEGAo#P#97VSl6g@N^YeI$ijkVkwuT z3l9;L`zBE?moEGlLHxKbJV~$3;*6(g!V|l`8x8{L!4%Ik&irNX>Faame-%Yv8zqxU z3;GQ3)vO3gEhwbV20?=s^ywzFURLb!s6Zqrj= znx#TOc_>67Wax<8Vdg$Su8=bTmOISc?Hm_;(+)GSLDwB-d`j#v-+|v~hnc=D$Q|aV zhOV{Z_LuWjo(U1^_DY9hTg{2{Tr?ry>!*N=bU{$q|nvdt%P59!+Chs z)#TwEbmshj(0>})nU3!?LS&5Z%nT+6p&}!{GmZ8kd0g8M#miQgEZW-<`Ug1M^MnCmYxU}eEvK2~w&S|+ykInjb28Pz%&@XOC$ z0_{TCD;qFPkXM3b?A?R5MPPC&t-TxW&S#L9S}Z7H7*mMX+hJsrLcAi2k08KHjTj4o zC53lIC?TAJ?`38eO!et&1Z~?IERmoLJ{;WYw3`_CF*A1stjmVC!69@_tiTUPMK#^( z#4tTFF3P1uJwxboiul#oR#9)7U{dt{3{sRTuxr8B2Mrk|2)Ok*f)NBbV(-)(x|gBB zJxduJXVQ^;4+17fvJ?iiakqn`Jh2Q%>d=ue30B!hfwS7kFClVAF_j5r1S6#|lW7VL zXT$Ri9Q2T( zr3|dLE8KDUU+SL?h^Rx`as$BoBX%Q_z=gAj!SNp@emwu*NP8Ntq?E7jZ%xb-+cWkx zp`{oDhA0}}1uwVtzHdFeJ_s2x^&J9{{*1^w11~_LCTY0OY**kE849w75+bFln3&PJ zm#Swa0M@D=yg5Ir=Q2Y}8Tuzx&j#wB4Tz}f@s5Dk)9q% ziYW2pio!^Ht)l4u)^R32Wx{HLl}lK6TaQU@VVx$oTpD3LyHCh9W_*a3W-HYy9t;gt zPq7>WR4aqPc8Y4pkak?J!0M(iTyDae#~|-1U557-D-Y5zxSMFNk$1c~Kl1(qLrXTo zs>u6ysed*g^2q!B*p2k^9wmNU-i@@^%6s>>o}ribLRg)t3==xJRK};RhgG98GGHM~ zlzl7fib%#ap?fB0T+?U7qN+C~%1-^7UIo}ll}~=@mpTan+xVqof%ct^p+6Q@faGn( zx?>`<52{O3#-ML;HBlQ^OXKLT?I(5arxlX+4NFi9EqF~b+%RUJO7!~4O9}AdIcg!2 z=|rt4sZQq?OIf*2KL-HkEIx*VGv8d9CH!`@SQ<+1yaEB|;m%mNrJoRDE<(oNVTyFB zppNF4+zb(xAfAmuw-ao#mW zkdpJGYXm7iB_c>)jl4(^r1Wh;Mvz_u`w3K_2*V%8YOoY9E|PR4SEV8av0g@$4k;0( zO7jCXca{hQ_!H7^uY`DK2Nfzn? z*px^gg0W%Lh4W=lo19FpO&1QUfx0AR2THEN5+D>A zV)lYyGC}zj>mtp?T?Hjokj1{M#KhSD4tS5Si6ylH>GOf z}0#^+qR%QLX@jn}36K2X(Zxcvytn~={-ZQzFMMaZyG5ZJtVUZtgQ>$zm*(#jmxg^@K zw&FJQ5O5w1`}p-3yGgD>ra=8bk22S9U7uzg^B2YTTDm`Ops~t8ILR?cxcTOoEH1rQ z7fVAqH@^Y_=i!`QX4Jo{pk7C(0`D>anm(#Un^E6oN_ZQz63oa68TEKurwR0PGEEl- zf9PioP;JB{54|{g7L%x;SgtALABgBSJyoU}O6{tmy9Ka{>LNPp-vl(qU8o+444Q*^Xgrzm09OV8-p-CZSuLctQr zqnBzwNBa%R|s6rnUI*XdZ z35!s;9^8v~Fjc#ik&;^;8dYlwp{2zdE-&_V1u7VA3!@G&+TQWhPBJud50YFBmJu+m z2BnPQGDe#g7x&bz2@L~h0GXUTwVV8txqO*{4TxH+1m(cNV~cXZ91fAwy5iYtkqtPO zH4^!qvGTKvrIPfv?gqfY+D^$>!<$kU@v+gb?BW?~OH>UZequd*siCb5!YaM3FQy*a zfQT*`ZN06xVK*Y)R-97|-qtAjKvL;TMUu`pFJu9(qNQv!+(A z$>l&IxJ^Hm$pz)15QUJTBhr`3ZFW9|WB@FEseIKL7kra1m4v3NFBP8>zSQl=iR4SA zZwu0wx*ej3rYX2|rVi;}&ElM>n{qi(V`%l#dwP!I(}*?hpM^O{L0YRv>NVF8U3z%z zW$rIf?lRRiW3RgMI83W*bDeiCbcd-z-oOQ?cuF57&Q^>JTQC-CZPDP!#bAXRk1mbh zrzt4-k&WRCRH7E?DSaM*FU(VV69My-Xj`;~iO(g$;sjZO&jhzc_>}mG5#zPJCB~}- z{h{r`sgrJKnzocqKXBm5CwnxT|5%F%6jHYLC!Hct9(Rt-vBr?`ogf z1{Q*-5+_Uq;R_Fa=Cpu@qXJ3WVpt~>mZ{W4t*d^ag8PTFmyv7bXdcoR1p<(-Xomum z$)7OdaZ@ydr7fN7`|4yXcgdoW~j8V5_4}?wknVW03pvHQ&3k<JifL;{mij(g2LjZ8Fv{&5ecvIJ^eqkSXrymp$E+B+3G~~}rOiwYinL$jYTm3}p zsSSvz@4(irej0Wo;#S8Q!{Anr4ny3nZX5-zTfO^RXKbpZ=V3NRCfLdxZWD%lko6cT zeh-xQoPLjA5r`f+)t^x;e@jJoEdtJ?=+3}78vNy?xzMK$=0Fn@n=nxW%gIEx*tsZM zy~#MKUMw}FOTC((laQeE%}H5Y>YZX~C^_m@1e}MXdh1fZqo96A)x7sa09uGky^F%X z9oh-z-2|69-nO54%`Wv17+_|d7H#RJbE&7IR<5b#RYY)`ekxN7%0nRvAwx%`OPw3+ z+)~Z}Si02t>M}0)CYL%1O;?vXJ|$f0|AF7grB2`Sxzuy@`4#V0;QtEFahkDC~UH8tn`Hth2MhFzv_HeKF{_@EjNJ&^G(4|uo0Go43N%23C#0$*K^ zSzQC2<)s}E091ly$u3x%K)rW#{8j6vvfJ1rZw`r@Ly?=V_dIC%x;@^_^dV$o>U^HR|df;fs_?BuDltXXe2#=!wc%{;Ia z;SYE}gU`zsdH+ctZC`H30AcUv@Y9I*AYK0puHG-;;@24eHT}Ai2>ToQ{#&~KFI|5} z*Wbg{dk8OofXn5Jy+4YNKf%X{_h-5;T87^j!}an5yaVuKsrLx+v4n0drRy@d-r^ky z*Qttk5PWzCV{jrGw`=TybQtR7H=58J`JB)3Eyt@ z&ZO&EaD|4>rhm?XtM?Rq%xq1Gwu#@o|y( zxLAB3gTW)nbfu=ZmVO)%j7Yq<7+La9Ad_uxedOjX9^SaM?cE4mft*DTlK|qw9(_Yu z^F9I(B-X0G!G9AW00#JQ;K5AP5}l=$=5)Qh=N6xBKMe1Yw0B;-ur_h{83ja%Q1oGF zUWQb8HC`@w4_sE`<)-(-<*)E^{`=taB)t3>FAw15-1o!fiFmpBgK&8vULO1~Tz-j{ z?H`BB)A4fOC*krnyqxlBxU9g-z-QqygqJtm4VSy{GII}H+IU(0Ik>FF%LDhquo#9%H8e2L+oSk!bUAzIscw6h5@&cD#mD9F0Ry^Od~6XPPZb}d z;^Rv3u^m2ur?1A3Mcy^=;av+C;8m2;%NI9q-m?{W6Mh1CCGoN4SPehLf;{C32W0GB zeAygSlBiZ{JDpakF$s&dlLAezD)W=@ID=ZfyaXlIyOs z0fgPoR%dC|-Q`yIT)w!oqy@d%<4plAxTfzw{3UF=T)x;Bk`Z_UTNwx9jd*22!U_5( z!jqlzn&NFi2+>@Fc z174Ni=`0r@9Uo@Xkr?o`v*|&$RNe-Z6_f1>sytUpm{IJ54KnbM@YijT-VwaEr| zTpfeZ+RHGw;pT+50|EQy7@a}RM;l1~pT{v~zxwlw7cJU01)5^r<_()i9e)5u-I8;~ z)LfHjy45Yg$p-LG6Gx%k2D8#14Hz0{CU~q7KGp{=B&zu_J5{f`QJ652r9tpCjaT99 zqFvxWhmoX%iz;+7%Nn?iK6U(gq~3sHnt;e~-!}NS*=|gf;GmTtf?aS$X;-OIE$x6t zK&iks))d%_R0x@xD8p+2FnAT1U~;N8*jE8C5EnlV!Vgt>@I)9at=y`EiR|FL)>LJD zXU%OkhaGIW4%jqgyMvBw6ntc5Kwz#90Zc=v{ZthyqyQb7@Dwm@vjmE)(wZA|;BXkK z0n~1|gMekD@+=I@uQ~yzL!qD<*lLDgp25E9%5LEEYH1FdExR+VsX^GMYqfxn19*h6 z|62s|a9_yUG0D36bNh$+;WNzPD5FuZe`p_066_mj17faj_kNx@NVN1!Xvxly^KG-A z!F(c|M{@4*VJdS^Oeu9%jNpC)>^p!qo~TT&a#oGk%kHY{`*)CmHs&kGX8-j8#}A0j z#3SM_af7)QKKoq4< z>bJtvVzjV>cCHj3M3SX&c#>V1V4OW0ZCW^U0HQ`*r(B<{kwXd2K0*uYdYB_!=fbI0 zYo@tsB~`;4o-RSLJ9l`z4l`e^GTv?uyX}>}1+jANnoZj_t{dI3W^C(*H6v>_T{F6I zbnJ@Dt{FS?%yY)hJnO8LWw$xrsLbH}e9`q|F$Q>?2^T&tZ#ImJcUR1gzka^@;YZ&g z)i}EEFrcerqom4xoh6tJv!}C!n(+P!I@-CaH^Z~XXRbTLH3rfgI4I^d>0Hw@1_{{1 zu5V!b;HJW1`UJ7fyl=Bjj0j1(MIy>qIQa)B6NLJB}QoWm73$7FbBZWS&k zAutYdQz5V>c$LmA^}M06S+3 zT0hAO&u;)HO|2hk?I{U>vX$-CVH>+DJAze3dr@4+t(rTPAxBu(OC>5z6OxY|elMg+2kIH%8Mn;)HNYwd|H;xr6yEbh8N~4M)&RG^TDqy6dcs^v2W~8kHVx-#4rbNtTC1v1Kvv><*Lf+YBAhSU7o-D_^2E z*Ll~zV5CGxB3K@Qyu_!gcm_f|i7ijl>ktL865k%s2(az00qGeamu_+{^xUav2?%uX4oALfbHhsXzGP+hTYNFjYx(a&PpP~4%ZdF2KjEd0}&mDc!r&E z6lma4wwSZ6`&$F48JL+$CcuiBzyiIw_dcpc$#?S`V#N$&EbEM+q}#aweJs}C zDvz+ZpFs2|y>3&n%q>;iMg*Kk#npuc6a@H)T>PMP9XQ)bu~9~`(1pW&=#$3>rXZ>) zYG06X5u7J1rs*IE$^mntA8siI#Z85^9@-1hQ-@<%kcB`t1bo}IPO%fND|VE~P9WZT z8UVIaK|Xs*4#$C>Zw}9r_V=t}X(%~;76Iqsbe80m>X_l^8%!0xq@YelCmOFGfLi4E zMUk_Za9#whWMW0h&9`I)A-Nd`vk-31F!9KoHE#cMGbaOJnX|@MgK@4k<*X4Cbj?}A zr$o-$C-EEQtkJjb30$zshrzRa?i3*b5Wv8qHiSM8GSp}gLT`bfl?+RRh;tib zNaiFEi2d1Txw6lQh7Zr|vmoE>TPQ&PikEwEd44}FR~$WkgUJ88R`on#%L)HP}8Pe8|WdsRluEc%I%mesY*nbE-6Y63F2XHUCG(dZh#vZB4W{*OsOQ`zM5`BcG=K$ zrP;*5bU)q|zc%NZkgS2RZn#wl8-bYLfiCIR6x3S@Q)&iEkV!JxZ25^NK7i(mzR7AG zCQ+w8jx7d>BO*f1PgU_-n8myl%(4Tt%Fd2CXWht#(Ut2qjgrronnd)&+!=C-W6n*) zDK3I{2|uU<*VqM#F~fo5O?bEdPg8;kz@W;fq3xGJ075^wcLoBErgL$L06*jH2Wwoe zujeTqKr3&Lb_rgVgue?d;mK~C5&G1v=GR|Cm5ryDV9<11Qdml zEgAJt;q_Y$EdhIekat46BXISLfj#%L;zD9Y##{Tx2i3uXQWZQDcx$neoiqjY3CZ3< zlAU2%`v7VS@{kDSkijc*hhE{V%8J%&LbUkg8dGdok0id0IS@}n3sT9-?b3KNbNX7t zFqTUC+GD!4DdvVF`eQh8_IZ|}N!?IqO;c6U*^Y>>saX~R_;HjQ1nX$$4BZ8~>sWa~CaWxHVP%yZ9=rLu))w4Ww$h6QST z)Lvp3H6^ue%sREru3K!r@Kdaq@$qs4wmKe5o7r|{`ph?z;qk;$l!R&njz zv2e7Bjzh!j0VNaFn4`tHKb(}v*0Xt$S@Y+sB<$w%&Xb3lFk;?$h(eH1q2!?+lPq(* z`?`l%SJ!9hYW6JD?p=+i_3VW#)Ti0g#3l>%DgbY{MXN}=%tGBtz~Wh`e^*)rK4&>8wIiTMfgzkS9d$+OiJoVp zUV>vo*{FYu-|*ic8x_C%bA-%Bjc6BP)g6hig|j6rBj!6Bb$cX%vRgJP*ZIk+5cbgg zTvX$+pJ_m`{KF*sat|Y3%)U%-NS&VClW6n3Nkn~{0e_8klP3}NF15MN+ZVin5*>zM zMFesZpRR(0(Lmq!E(`TjDjB;ODK@jz#{qm{v($%k0MqE>1TOMEgd_=!CPg2=0q*u# zACugbHMeSetdut1=Q=_ zNiJRd-KbdP9vhjD@+a&c<)cVZM5paOlw5jDv9yuNrAGo_AO$Tzl;l#pDHRnTkzOU2 zo?&P+gM`ZD(gEtJ4TxyYk8N`45OyPyT#D0;NG^>m4P;i4g{P>#qElP3Dt63da$Yk(zvHmaH@{~|HNCA^8cM$Z8w8w(?^$kUzEsn@ z3hHEZ+VL(1parCwcA0+O2(8#HJAJ(=x%rN)Af)!j!7PNEGfYD=)s$Pq+~~;wSf-lt zWnY|YO{u2D1YJ{2@hOpN`fdD1siyR;d)_5w*-#)QdDU3HO|Cw352xsJ#0{z)?Ubpe z{~mVvfw0T;&8Ew=BWvt(=dt9mOqFRW9u1b>qDVuUL{l1q&?z7&C1c<-Cz=w7{fVZz z5>1JQ5AQ_NU!eH>7hc|tL0Rv>%MbDLJ-En}Q+(`JdgKH?- z3=;8vh8NtQ@n~BIJ%b)P6nl_@TKqwIS7k~?CA|@ZZFkK?J@$LKGf|HQ5Oy)q;W0QxChrzd^c82+>=cs@?GbwjzvgD^Kgzu88`g0;FWvWg<4jPVxy#quA6TT(q5B9;yPG#C1p-gVf|MXct%pn!IrX;B( z1|(D)AZc~V!P5%+&N*}EG-c@$7~ubU)jv!zY{+%sghj|{J?oq&ICSDF4Zf%1F_zKTv7r&v->a=RT$UoL%QTgnDfsYn*}>=tQ;7Kwg>pl8AzvO zKpr1tKpGnsR>7nDlOE#Z_FO~bI&(2=E+lqT>sCp%m+i@sJ3?#_cOAJG;vvZmIK~$h zFsbjU`Yg@_!J&RQ-N1Rt+){+|Y-I_B_<4VLfMd1o!n`o-j!(}{48z>8vRrA-z$vyX z*ImALueDMmfkZ(RYH@xgqVVK9{>t4m`kl6iY2cur*HF^lH!4Or<| zEXhDiI^=J4kV=&ado^bYDF}vLEc>T(vCNsu)KIahjqgAtHK~oF0~s8nGEq^=*pVq^ z>>fH(8zo4%6P;FRC)i53IKoOO4(dlJSK=?A!|EY}&MXuJfu$3b7s03HGx#6A24zQJ zVFndg(7Y2dMeq}zZai6a`{;)not+I;X3Oqm!*%gAYA`uroM1@>D>kgCjip-JP;lE3 z1%yN)mo`1Oi^{u*)2L&ss)tXvm^^;6AbB(_m>#WRoS0l`v+7o-$f`@2+s4H3W=*jx z;)FImR#y3TdN4t#sfNP6Nxr)%&3TX}oc{%QE-6x)Pv6{I)uT+jYj8G3&s*qtvr5I& z_p;kDNBTF1H7F%!=^06uKDfMJ)8^hz)BBS_J6WgcE&IN`Gt?qY4{^0KXk}K3uRUd& z-tX0pcRrHRzZztTBqjYC*v{ruS_2pjCk2`c?5X%!l1~T_PRd_3w8Yl*oy<_!ba82ZfMlQTr6@?20U%&7R%Yy|eLjiM^2B_hfsT*yK$- z3BcR=D-I8Gf_)4gU=?{P4R!y~qr|h>j7a<8Rq~14??nGyGhO3_ru1pwW&p-|uPJ$gMNV zSl(BXO*@C2nKqIeFf}I*|zc=ZBFEw;PrLJ=b< zKGn@%X5d{ag}ZK%TAWY$MgU*f4EMSmz%)udfx*1jB1r<1OHt~#z}@*&>ZHC!n&8PA zea4xJ6#qSdWk+lGB_|4=ngV=MreK6#V)}R?5-`+q#_1!znQ}*%j~81I>+)~9|ih%Q|IFD=(VVm?I$FK93P1};EbKDP+zPE^VnxZ#&(8`%ax)HQA>5o{x{-;6-0J1VO$NX+v5>D4<6LV> zEF>oAnplWWiNwNB;5SMvq;K7`?8rGsiG}2_LxBpNBDwm^9jl_x5$~&Zv{NP)elhIw zePNgBn@yK#6WQ41&I#yq9l}{~C=AOnonuMQ$3uN&Opy63OB#&On;>W=0iF z69$18`|||%=Lw1&Nyg`=tLzxsdl~p##!Ih2z|lNG&iLR_jBkJ>W&v8}30~0q?)Z6v zN_Y0>3GUAmeE8&KvY5jCd4fI86MRbV)s~;rcL}s)XCV5nMwurlHMuc*S#x4v>kvOD5N~mx?}VWt-Tas}6A(M4^@F6^fA-|q_?duR z$L9Z1Cg2T*!Q6Y9fX_2vrDL(Zl?jLx1k){+v9!Q40dGSjHJN~-0~tJ-NtUgj38=_e zj6B+euEEp^U7(n<=5PIF%Ee_6530|W03OqmEKQOMPs?5v^m*;$0*+kk75 z0#`Y@+!N5FWUO`Q!axtkdfOw>g!c*FgtV&*f)UlHlfZ)_pqI6km|$fjL;CpLlhm&5 z?cAz=G3a0G+^X*yfa#REMQ#=1YG)$I;C^2v%G|22sJM3iZtrW0B#sP&QkA5s)6#J{ zThDaTzQkN5zfj55%~g^oB`RTby#GNIg7{n|CF)33ws^Ob9$;NubicLNGf#|r_b$ex z!}mfW)G_unu}OqF62RLn$P|f|iBN|TupTBt4fmE9rx#BQ8&gkGRuePdm0^|Ez5o(y z88d%sDvieTo({lqq44(+{D%Jqc~AJ=SN$^YDWXXH2w$e$z{H>Lyr(VJc~8m4i_CCZ zpNftNvkglsNHPhpKpJZ{hb(fLPE+-DwCUcYF-;k8*BB^yRD4-&u8?C^Lqj*)ilp19 z%Skpq1I=H4(oHJqy4f2x6VD9*zOadBHU}_`u1(+^Zx@mzuzwU?I|g@qsB1~9igYBZ zJolXg_*^MGa*mA~?4 z9dYyX+5%b#19@Y4LfmV67b62-vul)GD*x&}q`Cw@yonJ4_+jrP?tGM?k$XI3)bEE7 zFh%`JQ9uXfK9sog)naKQ6L;n(wE_Qrmy2DBUY-dL+yp2OV-@KhAd1p(pG?YBP z2?6Kf@dA@~$^~^YI>mT@0M%1K@=lkj=6d3z4BAF=^L1H4NKK7{SqL|0m~v$D4!3-{ zfs+BSOy1#3tT@-2l6Qy+x+d@7QzCii<;aPYyhGo*XR=VJG9~Yjhl&L)=j!u)%sVLh z9C0CPM>}Qm&Kt3#Z$2C@Zwk9i-)y=}8&ULKT#)Fq7KpU;hm`S4iuWV;^lUf(^tVoChFkLTj@q5QHLHTfx(BpJ$S+R z2k%b2;GTs?TOH_8^Ux8upc8er=19~5UC=cz=W9U1oOwB41`u{eVz<1U_rM_8=H;N8 zg1nq3q|M72!5ZSDZfRY+(SYNX3Q5m7o`5<4)$zeLwRt*So@HCtzd-&c75tz0jZFj@ zEFzh(^It09PAz4WM3#h|7}2}r?R-Iyb4?3Q6l%daLR-eMw7h>9v?vqrpHozJcFa-n z`70Xrc6l0}qG#)qjnWJhoOd?C!9I;rtKOLFTUUouy-L*~0c>-<>{hE-X?}FB*>b0y zfh)FbTDN8M=n6Wc$Uh~5mX)PuaN?IdPVCCdoe?@Ys8sEXv^eL8CzTlO zl{7PmbBa!fD@i%x>NcC-1RCx!_!` zSvXYBjUVA6ws9&={jn{xv$MlH>gDm_()e(D=Sn=6tKArPn=31DQbY~Z0i5r((k)NB zWw-}tcePfYf6n>mu2c_hxiAk>d;kXx1E|DlZ;YMTlD|WO&l1jTIoE)fjZvVAMG*K{Fmh+DJhdfbQ^lU!vL4aYL~DyKWLUZ;X~aV`(iJ0+Hd_1K6w%tG zn#LkpGi%iL-=?%Mf*6;isBHxqt5^x;Z63v~D5>5=ai5naiaP<->wv40LU%aY+)V6I zH22mKZbn-Nbt~P2;OFk~2`uUBQr_g|{GcHXw|RE>dO!|)#^5`5TBB=}C1?aR!Ze}hWZZjoAf zBEu5~(R)3j5JW~Pk>QWkN+PF%;W^gfcW3Ev_5(AzcQ_uUw-@5X@3yCjO}O5t0KAZ4vSxxL>SB6zuyAgV18M`=SrSEvW_-} z_znLJ;>Gd1KX1r*@rZg6R`gBy+U_NAL3bN0Gv+&9{23PU;uiLh3?Co0BCmeNVu7Ja zCh6jzL`fMlNz+?fLs}gl#h^Dq<&QOVL1O~t2`YcI+Fa*@`;rwC9g$#J1u_($#pW;8 z{7jXi-7FZJ$!ie67dCkfe^&?3Fi%QYgN5I{A(AT7yMa=oBspQ)aJ--6b z>lm!L)n~wRQdxj2AzI9 zM*@S>T9s)RKJgG-*vl$`at}}31*d6We|z1avuj-}eyvjoDw+s3_!*I+pfw#@@QgrA zDMoz_BQT#eG%7chJ9^(&q=EsjV)Oy!x_2VqYYdIt!z4rIb|PR3nUk`IcGx}?`To3O zX(J=wZvwzTisZ<5yeTykACX=~zQ4lIW(HxEk?(&;J+%Q54NJ6*e18>oBNF+Jvy6y* zk1QHwpbtVuzE2T|9!0)? z6}cds>bXGKaHfy7RB>NIz zDm5yl9aWc(uviy{!Q(f+v-+cA$4bTx|A06w!*I*EVI1!H=JPC3@QZ%hBYyv5UVbky z3jWarbuv2LcyEUe77zvBW!iZZpl-L=^fiy<=EJgrklc)eSqL|0n0{mwJhy_mZq5K$ zM#1y-U0h3>qTq=Mx<Kb{(bMrVg1Z%$)5ga7Ws4TwxM#q_o43-9NL)NU zOd^C2dmHeAktE*Lc)>jykG6Ku`{$w4a6!k#KP^*SJZXn$2vgVi_`d>D=8TVjE`YF` zv%AH|kHcWu#>b1Ttj@V<5%I4UQS0Ejt(B^C%}O%}TR+bkATTQ&_^ss3wEsVQ zUjin_Q5|f_I_#10ecPC}WP4}L?nttHu~-IMvTR{XGL~%17-coP)4MzE*_rhmlGaAS z5Dq(;9N;C%Pk=xm;YdgVfe^wG;D>}e%DsK)w^q=R-LTPJLLoAYK^QXWgCi&dB}J#xGiwe!hy+XV%0j}GoETR z9mt)ZcPiDXDM+}jx19#1+|QMp;8bqA&DIEH=1$f+70j3y*VHy^CAcr?nKC+hdvLjX zhKIruUrj}u4Ewj?z!YRzDcrW4u)v9DM+fpaCE^2v2S=U~5dgKzoH@wjE;p$_ zqtKplotrw%#vE3Sh=L3v@f~iZ+L;}_qgtNG42~>aM^vhJ~&u zRPx>p0=avesv^o`DS{hSe6aiKMD4Vo$2%w+Q8bFf~ORlhhPh)4UR> zC@guCuQs=^2UJgVt7#0QY`m>eu7HwUoUD~wcm^A2&8?X#6m^Hy1~Isxkm#9-Z!U$u zH?)E%7A?thS}zNK<&iEQ+7~0iQ^B{AjJP<@-FIP%GwL&2)=FQ_2RAy_SR_N?-p5x$0 z-NZnBI18xRtAu)kYUfuUfhwWbq{m5`MC(_=@ae3%0JrNZpa9e zt=t}>LLXK96IERkUi9;#e5T>2>slvOMAsli7yE3;z?fk!L%D1F-m9ZjND4|DWk>-^ zJ2DkMH?e6X6Pht=qtoAS#DU4jsF@7)sH3RD=Q;V}MpyXU1p@;r!Yh36qSie5iVUj4 zrxEkcsI4=G3Uq}}jUY`kgqd=kw!-Ir1jDHC!Hq;z_!vsRuJAFJ!LIO$U4_UBpWaVp ztni5&IIyp$sqopIdV!=A*16)y>FIoQatK}F^9&kdKovf3Mk?@4InGdNC{xZ_i@4vz zf%_40b)g-o1S>y_=3o_4MCuO2BCC+D(wK548l5^sCkyB=$MT;UXjN+J4Wu;aa$#0f z6II>w^Lf48R~4d4zUTpf#QrYvld~vAh{O@t# ze&{^M%ARlL1f;pmcrSuMbExd;vEBR!yd|B@XDYl@67ug^htSlFiEHLpXe5SM*$s?6V2~T#6jK7XIjyF7VKd~JkgI2CFTz&2bL6lhEv*Y(*@JfG+rAB6L^D+1{2_L(PTgyj27AGXXK9=SPBM=PPj;=-KyWdk^El zW-SpXaBvsC`o!ao8-Bq8mVZuy?x-^{e}`Y_eqmd)F^ek-hnpO9CtB6EJ670(3#`b3 zmNbq&A;-|IjZV9DICBi^$0neZ%$ceJoiwab3XO@D+dM#Lq_j%T4Nxf4nVf+tGJ}ZA z&ix%c;05>rPD_Duo=(f1>eL*OZQZCfrst8+kOr~PXB3WaX}bma3!k*ElPP*{vf$36 zxau{y4Ef2cH^LN!Lax_WcJhBEya`tI&o~fzRqgoFN1rGw$aArtIAAe3@kja6QJ9>N z=dJt!(NPB3^Ddw~5sMO}n85~p9S%XBp#XXRM%HP)%AXdOfYy6<0`J%?a#2)aPOH&! z(;fiy*8o72BnXt_oUF=m_?twCXVnn>%8NZd7c+d+VrDJ9K~N&S0Le;k^!h$Y&$~Tj|iZaoPf8{W9nw;}}yP-*8pCv2jCbrafEhtI+0~ zF}M#D+HB2pu90OmKZu!96gh-N;KIsk#;~j=8=8YfG>AJ`ZL2J#yIB;`WP3}#B{M6& z4l|4>nGv(kAnC#c@F@v7;iWqppn-`hVx(iydj<;e=bd_^?Hp`0?{gra14Y4DpI>(m zigT}Yxf*Fx81tEM-8z&=K%G8x2LL^4vQdL{5vnSNF0f@Nmxe>M+;Xc5*PwtO_=h?J zU}ajlZRzeyW>#$9JQo%(O6sQJ1JiYGZBVC0ESp8rS`&K^v~AS755vFv7P>A5k3MahyBwMjVFbXt|psh8qO*CyQ_oNM=`M@kTsI8iLTV#RULg985Zb4dfGNEi2{ zX>RrHD=xs>PA0RLthTQ zuKVZ`(HPho>pj!nSQf7~=zoI9>ZLxU*-!ophRA)(MKbgni4SfNqQuA0yLE|=xeRuRPwXm0miY93Dr1RH+`xhDIZcVr zvr;dRG+%VmIC6SASCeNxB`x5{RQMdu>D|6M z&_{vK+wxr@UEuSFL|19VPk_2{kr$h~vlRGzI$s>>jrRYUdTciT3U5hg1xixX)ch}5htRSb7c&=X&amm|0w1pXa*3Q_U|rzD%`}^8;|hF; z2znOy;9a8H6BhWaLqMs( z=Mo=e`jiG_ibuwR+&vflh>7ZZ=+5-zJ+uH^4KVU*Gne;J?$fdIp1#U^2!~JX@}5y- zp3Cvi$>>U21AlaR4_AbVQG}$_^pZvY#Ma82>3Q!aQ*?SE* zzXwOaGMy$IiGo>w7(|0~KB&BDLVXWpyi(E5LCE=o(?(|DfK*X6Aw3eS1Pw+9lW5rdgu$ZlV_lIR z3q0rfq2TiR3X=EjVOHMKT_rHcsdEKll@I!G%%B;F@mnwrL5w(C<-&XaQNECjedCrP zgPy8WW1o*pVb(Bleg=67vu6KK%wSPMEk)KW&NZDJ(+OhIU8b{UzZ#rt z_cxb<)Ci?YKieXZJv)?;*10m2_$jvgpYSc%q|+(y{bbUHERnYwr=U_#0-3aDgm4%K zJoF9*cD*1;mhV%vQ8V3KZsK4$U} z+Dbo3w+{qg*L}lMRX9xSD>DZ8!QP4%FAMh-LG1bdpNPduvje>hhR71`d4^X?!`TZ4NJ{6a3VzdK}3=- zp<+e4?O?hnG$j@t;FO8W^~zp1GZpjwY*O5`jw0r;ihVN&06pnPmpl;*^d5!_SfC@5 z>H2qU8htN`PLTNw4vdRq@GFR#qbbw%Kk~(m&UF1Z7#L6yp6QAgHRtjb8C0h0Ph#Gg zfiZQa>wgiXX@)S9kkV$l{uIG5GF?&ficD8S57wEk<}%osuCc2Snd#d5sf?MfaRUdo zz%-ezUrN0|QuylZDdhBY?kPEh&UF104Kbih*K58V%}{A5Q_fn8xGQnseni|W#7<8^ zMeI@EZxj1DXqo~&kX7^d<%XExe@?CA6XLu6~oK95^a0(L4VslECtXVf-9BPi4 zz=8YWn3LuzC5(}5YvM`hs$sxmpk{=&c_cy2pJBxEKu&;~o0fMv44NWymQOFm_H_W> zlZhZTO}DZRp`|}AX)ZLKVH?xAvs|0zN>he`b?z*;qiouZ%bg`M=$SiVTd=UP$ysfLS%^LmkNQ;`SVbe9d<`IKnj)V6;{DZLwk3tyeAoI|# zwxly-cW26s6&#N#P(AZwzlI2$$e{o0-SaCjM7j;QSAOhAVU^P6$D%AspC5bk9owSw zV~c@am8X`a$CtyZ;McbZ^EHfF&*bZZstJ1$nyIZ&>3+}4O{PLA2N zqTN2`+LoK`>Qr?S%+V2N9<19|W7a*0o%)+@xmJaI+)4R7W%J^XqtMqA#y$r_(;z zC_u|kFm>siSxDstAfOW{+1yiTMc663Z#r7w=ZTeTgA46bP#{tGc)*>{!ek^ZJH&^( zJZ88I1gTSmah}Texsuk3zc?iv^EMpwe7Nft1CGu8(I1lpaqwr*>UE~E=K9q_%yQ8X zA_;nB8pB4AHq&@d%yRV1G-mI!GL7*XU-{?8yef)hn?VCnk(w!k|#Y8;Nw`(yBF$0fQ? z=`jai_U4?Lv&Zc@K9y5;9Yh+y!J%;He0UN7rd9kVBOX5LwkPCUFaT<^Wa{ihw1Xc zaRaddsEple*VD7ubY(wyj8<k9 zUwtUbX!tZ3K888b9ogzml{+;kH!Gt83a#ly8+)l#BbghHC`LHx9%YKfKc=Uu(6yIQ zjZc6;5{@q|cup4!^jWb$&pd&Fz4vX<4D`W*1OKfRRg`PToV5bxaoCvFj)-f7l-AlY zaVy;pH;o^HyXi}3%i0n89V&*B#~w{pn^41tsKYM*pz_mz{s{AGgaeTyK#gew ztcTDcKqgh>2#&K8j14ghoWyRpB#angCe=H$6K>Oy8*-yra&~l}lu^t&`tLfp1p7IZ zJ31f|@f9Wd3*r#Yv@R%tIs7tOD<6cz6K28Y>dg9ML;;7ORlw$J zRwu+EX#u4LsNNrC?QFHK=HWOS*i3d*>($xLtS}u7Q*^dGU569cDy}g~SrHAqed7i- zH(aqD0D13G4i~_=X2|VhB&={4_3tqfmY7*eBrLW8A)CJfvN@gG(@2be+d0sYVP@CN z3%x&qPlwfB{R|NFv0H(?^LCG~RyOKD%tU1D4o>op zqr!J;k-Ypu)}^xd9qGE%r@`u5u@Ak&s zYdWu&-bj|^KMjt!gdLhbr?{B!Qfpngli`5h2DLi6iMuz|O2 z0Eh-qB1PJZdE(0yE)3PBz8yc|S5=papCu%^F4d4F0<GQ&eUMUcR-tOrI~e*bjWM~J6t)3|Ora?7Gpyu$F|Zq) z9x`v!z0wW4f$asKjDaX}!^^%Gd^GsF?(gSUx|**}60#)9-~rCDH?37-wbWt_P&|J* zh{Rq>N}9duUt##%_NssGW3UME9703h=Mg1JX$pwv{|#3MDV|9Xiwf4uLM*OOIwC24 z{P(~n3{}`dIrpUy^@JU(TTJ$nu(DPIQDR5<2x2bTj$r3CP49*rBq__y#G~>AxTVXJ zZ3-`H-w;M2+nB-xZt{uwLbX0w>xj02VmlBa8yUAW9#kZ+kJDM&B!=OKUE|fhiF{GYy7G6Q3;85j%oYtW+o4 z!_MfavlTu-TTRR&fv{K`(iV^z%54$Ffds)eX7gcgUemq5Q*Fv1806R$S~KN2NZE7o z0Sfk2L<|gqTgXSQGema``P@?U_Jgc24QYFaB1f$Hkx~2A`QlX9>0SW?0}AQQ%bg;3 zuHeNe9<#Ft^ugE%EhtwYw*6h0-Xwlv5Z)T|t_=LF>vL}*2-6H9_k#4?4i)n%EyVDSU^FDNwPKt zHkAggPrbl$2wmZYk|mv+PY$8$doQ3N22|hsVx%HpC&*Exz7PlQN2JybVuIK?lbkFL zb+B5iDIq!n`N|lR!hjSO1lu}Gbqe|rL+(hkaiCg(d$4l1QJ<<#`?6FBti^sg6Ij2V z@0#eEi${r)(g>^oJ>#-2Ha%yl!u^wcai~>=KgNOkq3cybM^M|A>~+1&+8{q1Gymuf zGHMI_WXx!3$idvdy!|jJPr7_W=dO9^%c9%C4w!b^3thQcC*Q#k1xkUicd$70^d<5? zNH0x;lK_h#h2+8_8355myf)Q?Py z*%ZW{&x}#>^#m~R!jqY#l>Mryt~ zi)3Hfd~Y|*D8gsC#w0i8td!07B8Lt0QW`iBqWdgFlF#Iz07S>FY%k@eEl>yvXOV~; zWYF!YVzJSj#Z=d_bF(VQyhCIfZ^MF2pA(3ZGmXH={<&=WeBX^C`>=E{N$}cxm}A?| z!Al;ol=m=Pz)~I=x8eP48htN`wgu`qFxdi{icw`v>^9siq^(oD5v4Nt3dwc29dfau z@YkV>=s<)Mc52mGILrs>8QtaB@2cHUq#NS?v!r;mlzvIRxY6#v7s9|wdk?t(@S^5% zz9P}qjqUzBL19fHLfG#5XU3Sn74yyvjH%s#ze$j$8NxK9(z*d(jbIo?6w2rrH=wx; zwh?O}Cw?EQ!Y2F*y3=*lhcM(X=m6og2$_W+XQLHMK3Pe&?!*ux7@G;kOKN!S~bZYIXV zn?3r36^Gs${DYMN9u*W|5~@eJtLW49$QAs5k;tjJgLkuNJh@%`b1VD-9f^!1avl#RNEXx6OYK4($CK{zi_0mEZ(O-dgnh8&qPt zg!e}9nLAr*<(36*+>H$E{|wG9AFzKE9M}N60AT+vbPEa<;ctn$kb=}n*lvRT!+Qse zwr^o)_wqO75D%rp+-c#S!DRz;HN&=T4AmHNvVd&4>f$t8ZbPzq1Jc?nE+oCz#6W(&WrN;a5bfYNEkSeINztKB{T>wQ*ZU1iMcUln zJ;xS^N(b^@AfBy%5ip>&pZT)S4%cXv^4xjhsG4qay ziuBbB@UmDz6}AcL9+xPBnHTL!7)<9=ChKu|zCufob(EadJukJKJxz#5T;_BZxT&?1 zS2Hjs7rDXFyMZZBz)n3nNjtU5hLP64zE`!-#(N!gZ;WdqUbVnIHic>-Np7pJXgW6? zDr3^Qty;v~$W)8F)01haKSZvE)~NOb2R2lT3xZ*ly;nijE+x^3Z6&a|VbiB_jkY$( zpNHeJAh?Hnir$K(Y!B4-UFVagxMVn_psTKfyX<}LJoLGnnsS?NeG(#nxCPN(i5t#- zflb7^=%oYw%ax9&$w2IPu&ZK=JP|C!5opWWkEQ_y{Pq(V5M`X5h26`=+AS;?zz%y* zawQw}N!b17=oD;(uIg@Sx&)h^wlmgbb6?bfZXA5;*FUYS4 z;41|sXQ1OcL^gGigLC`8PdX8Xg#ByN{x9gTZ3d(6rc+fnkTQMkObg%A7A47khMQs1N~IwzvQ=aLD;0|5{ZSRj7%2!VKR)Gpcw z)IE1#zTD?V?bLh<|9pfn^s7ruU*K4YBS$-`$-|am@kmc6#AtIwZZ}*bhK2)E=d*gjW|T&lPeo$2D*?KC%3 zYiB{ZhUZG9(%NCa&GR~E7kY#6WuPDWKl4GR){fF`I0~L(?>tDvjvo&jW8vtap&n|M z(8ENNgfVHJCA@dI;E%t~xx=N*JDunU+PFAq2&@S!p<-;7y|R?nW_&#>x3G( zzbfe#vqz)ct@4rptQ#U}B<;m9ecmygK2D1X|BC&deP`Mf3 zWsKT%+npvHvIM^};js4@Q3WaU7*VAsD&aK{it`U(CrKA#4YV25t*5n|yiAN9kds!l zc<&A1c-;*=ga?lR#~MbFXj#(47C_M89*?HRUMFDFlS`TUq=-`+{01mcfsZcab^(t- z6P7hR+i6b1DFM*&o}R<1eRUt5769jT6Q{{LTP0_!JQzZps|Mcm`2sisRAR3S-2lKJ zE{lSYM}<&#rl5UMqd8Buu}n@ze}i#HwM{~xpv~jDX&8f$BQHF>DePd1rVHM0w6CEX z4BF8GKzK+S&1C-UedaNgq8ANulo_R5uUP)WXuoxYEgomFh3OSz5&UB76~7AZ-H^Rr zXb@Y08pY;s?DfHZe{#zgt%i&(f1Ptf1zbPC5J`X-5X0WMLX&~MH zfIjs>-n-dpb>OIr;&4biGu5dOPPW)H1Kz+IM3$T#ckbRJPT!ygMHO?W2e!mpI1?au z!6M5hM?z6D4(1T^xOb>pAIIm0_MzwNrrUSlJhth|jaLl$d-OVFdTVsQozld-)9AG4 zI$Et!!@|$@xL0nv;_4xQNii`%M(@MlQIe5!aI#&~`UY-kvHz`eT61psKGd4pKBiz? z6lHZ69Goqv?J_a7MOQtboKiTVl~c6~zBHlcB_MgREMh&x41Js^AP zj%PtxEVQA(?eqHfd44;TUx--(ZjxxA5jrJ;W2lF-Qxd)i1#wFml{~lHs@6bp#T^6A zHG!^JRKAQdg2n?h9c9~pbu`Oj&_Ve*)FAsPjn$W#-PCI z>zrc@>hlpGWAF@W>bs}HUOoVQ_Zi{)x9xT4o-e{dM$~Fl#ztE9u^#GPQ-w6{%^ar0 zcwO=^zRRfD z>A*`j-(0GD1dgu(97l(XQsh#_E*9ic1vuy;*hCaT2GbLQTx8y_0;{+yNyQboE;A9#;-7W+)xkf{!9RDyA6;63k3Q_-V~@}ykI?Op(5*(X1r1J#J2W_bqQNPphz2Jw z6%Ov9H0tDESP?9!$XY6}Em%*X(pRDcM$amXUjm@hsYGVJ7G=afjCh+!;|u9kWr3U! zUL8=5tPVht2h{BH{KP8k(%>nO zjP=Igz};K=DGE?vQ4xShl0P1FB+FCV{jaUn=_+iSj$1!a1zQ=9>l0bO;w%ogHSA16 zsu1`}DT@mn3!Rp5T7Y8*vW=^^&r~5Xck(_sJ$l5Ee$@6%v(cHJL5~x*T!qx-if{!% zPO#eqpQ`H=x7@aU7&DHHd!4y?NH2yYU^3^+HO%+`mxx?=5yk~m9-Ff&7i-H%J`xjj zz=bMcD%dc|sozd-v3k1xEF*%E_`8FY=%-U$P>a{1-Ro0nfMllPp1Gu6o%jEu}uxJ7Y@$@PNSfL+601RgaUwuK#4a12zd~Z3$5qB_cqekgg7O0T@s(7cTc&jr!#R zG!P3E&S`cgRj+1vQ(4Iek|J~9taF?GI?L3;jj2(^g985;TpyqMy#>DAbWc!dW&z#q z3dB7h_KPvYW?-sEeXAJf3q(U1YLJ{tshWdcZ4O#2#;n#8-P41V;^WRvuKWSw%-oaL z7zD=W@T2tT?JJf4`-Js03#U{0*MbSpQu&YjQLnU0(K-2GxmjO$*gFmimbwfTQkl@X z`&yu!EF`T-C0C?pO^)o?1;5P7fLkTl+FxWM)D_6;e9*H22{|fOm*Syrq{Et^Z%i*; z*sc%U@SQ}Ij!vJf*u1aYsG@Q_lt0f zgFGS%`!HduIHa7!>kX|IqH?%fuZL>!ae2KYek$SP*ch!jG)#wYi!?ED5dv*^xr7^V zamqhdPV6E_;QfNh1b%kHQl&FnV=`AXU!4_!eajx&yBsq7_JF1%O$bv#3Mf@*7lBqp z#*x;);5Z(#T2Kx0H)K470!=8)WsypaFrz3QD>7a{!>P7I^skWdq(!DnLP3k_G+{1H zh;Md4(}Q$EI1UI>;K){k6cq^kw;+X%v`1xe$wvyUIVe2EBo$E7DkN0!A3C3iXVFlB zNDZ_u6g;4Q3TjeHsR4?BP1Utx8bAy6xN4nBZG;Z6Lza?`k{JonGl?1yUHg5LPwJge zz}G>`l(b*ONBRYtEJLYlyHO|;>8pj&6)_MjFOy^_1%>3fQ7_~|&b_ZK1@CNf*97~b9^8@Y4xQy zA0UcLL$on^^NV1x_;RG6-h6>7U>~IvZY_{O>ICbN^!9PS*gg!7>0XmjNbwaIkj!{x z`h|_lZ3~qd-Rr{yMshiu91%HbU~&1CG@Yv*ZsofYy?F`!CGp=4Tvof`{ zw*#FGKwG;wnYPybK5op)31d%sdy z)0qIRd3HS{8JC-oi91F6oif)CSM{abxly(JT zfOFCZVtBs~HRPi)!={nw(m2y11?Q`bvrCdJVhV8IWO?kaNKXKq3s+0Z;B)wVPPpl= zz{-?`uKyPA-2g!M(nQ3n_OCbk&OwRU_gY9OCZ&EKblx$jyL#Gf%mEh#a+{0`ESrIL z@lLb4;C&qz+j}Waks4!t96muuAad21gz#%ij_;T!D2~T++O38nWT5RYIA^Xp2Lgv= zhXcJ1V5<^~!*-9zyG&`m{QnL_nvX<4V%gr^U%32o$z2e*kV2873}Bo2(mXW0p+l0U zz=S9vMh(EM77;%b&F(~_aUa;Rg>rp9B%EM~SKHaY#+aSY8060Mxs{Q~nSjh3J(^lx zo(cmid3jMhp17342cu@x$Hs73%&>iJ3?`s=sEr}VrDn?&hn$=^x)i|&7Dw;>1&H{O z3Tkk3iDF(*j8uhQAWG>h&-r@eTt#>6D55S&I^?}WlWwgx(KzI`hV~5?X6H~bEzcF( z)ppI@ycUjPQr&5wQWGwh;9`p&2hSlYDK|H(74RZLtPRrpA;Z41d1&&`5RSxd-MxK_ zbr=2;xb3Ezdw^Ux*3I}k{M3RbBAd5?ngzw6@B)#RDyK8FrPGAE&3233$7kl>5`5el zx*PgE;=?8=>NoSn_-6cWso%#IWr-|`xnErml4k(c$EFBA4eVE_d(Sni5UmD^!G?X1 zoKopPatlPN(Z~={cciAssQZYt6;Q=*xn-vcPlLHQiJ^01709VkTr=WKN+zIAK42D9 z{P4H%-T%T;m=P1Jx8=Jzgk_UFGh(@Hwf8J+2$q{@JMUf4nY??d zKh&rgO6lLE*HSR=#;}=*HkRmGf=&G0Fj80oThV(zztVjR%wA4;%qgwkhRGmq%Z&Vx zE1@(8eFLBzWeiN;>H3(1gyc5qmxI+xduGhJX2S+5*t(qTU?fhYJ+xBYLvv7w3ihWc zj6*}U*{Rp@vau66n4krB=wGm!}Q=U*$UU9mGDW? z1%9XipYey5v>x6EzYFxbNMcqP^=82Br!5RVXAvN_BA?zNoSW&J-8(3(b5-wweA!M% zQV+nu=~6=FdSTDkz$)nl45p_SyT?~68-bSKjaHJq!F!U8?RtM?Iq=6%rpK9xUxKsk`c3XefjLHH_;A$l^#zROiz%H&F<(f)v1CIf zP&sq80N{{h@nO2@ zVSRuD4Mto=gHfD-2Kxq%NZe0*&9CCC@Y4Wl3c?O+NP0*^ck1>=t5uzVE(v7dIdE#I z+r$!lX!+cLBJ~+;M1*ZLaQ~)TN`*bDO*9-J3Rwf*udE*PBcAxOiP zBUn1;%-~)MXUv(eWs2p;aS^yE@)I@FNFljBkzz?+$iKpcO()1!f`;za7H(bEUD2MO za~Hgsb71#bftX*o^$afOQu-c=gZqL6P^0x6S$Q@RmoX?RmpbYLM5Xs`kaXrHMS@5 z5lt!GXKC^;2PDg4d(UT(KJ(?hQujLsvQ+GW`uKQaDDq0h-6irfdiX$8=R8B(wYXlEZmB% z@hjakB+=lisAcobMRKNx-oXI9G+#jPLo1Uc|JvZdo(3NKfZHCRXDS$!8(vZx*wEy_ zZ9q>FnZl+66YYbrkx~Pzmi9gn?EMeN5Va`?Pu>)9QW)k!5cMQN$L;gCZ#Q$0h105_ zuW=*xhQZHYrd#ushxuDB`RWGHF>$pH6L&rz~d;$oQY~3_A)qvNR1?u@1`r|n*G}p zhz;KFySrp&C6-O#@^i3i1F%g-!&fSxpRSg;4d|rCg_yV$-=1te6vcb;{c6o^)q3a9 z`W@xTUAy_7#jY@#|8BlCulKEQ1qU|vtxW)!E%r~obD~pkch+xpC#vPT#j^HA2E_ja z-<7uzyGoD)hbn||ztZYdpdPPM87~2qgBN=+|Jxwd8|VKPFGv&;afr633p9H z!{E*w^ni2uZ*o6%kUK|#b)gt>f<8kke?chJ&X(J6yL0#W_MKa9yL0PJpoNHpqjsV^Cd-kp(q1!Mxmt>sS}o6^Roi9DRxf!&w+@Yr$x}2 z%`B_8xs^tA#j1Y@6rg@0lmW{jje+rjoZVq7*L_sKs2p$Xmqwb*$B2v6&Kg5 ziP!pSMBTZjAcGlIh{FsYN|t3){0J}TC}8iNlK z_LOJfi+w`_%bfB=LjPFGQ(q}hgu^Fh%F~Ujjyvw~LeZN>DP6%oKabk^gZO70zdjfL zd>y}j7606gU-!Tto$iE>K0=Q@LXSK`w?9I+8jVzGaPs5R;1oro!O5ng!O70X!97&m z2axn+G*T@l&T{#g%69rC#6FioecNUf^L`jCLF?%ku(tgO z)Hofkgh#OF&@mX=t3ay;^M%f+vjvZ&x6gQwy_0F5MYf@q(GYAZ-~g*~y zi}*3K_;6WayQQexMe)6iIHu$1!M4NV%IM4tVM;U%OpyyOm~09!K2nbC$m7!+!Meu0 z!i4ae|58d;&O-Qv;J}^+HYBld?{7iA$etO|VO>I@3g97bg(n*ziIS?XwNaEYUqqWi6ukp`fM` z7~YrXj_g0o?g;4xmP)Aaz4O>=4Q92t;5jeIM$sElG3iSC(!t)1*5T{S-RNRYw;^Q1 z=X+_)db+@M!PResNT=Q4vBf7 z>+yrp;7)v}T>{D?=H|yhXTkPmkknN$bEX!Dc%l*HnVjnbg>dBgqA7f65-P&TWsmzG%P>o?(M;bhZPvKgD~YYT^g_dcHk^rTtgtT`NpBk1TbK^!!lDRAS1vl3j{C|RIJPBtpgYy`|@P|w^$?qmmhKR{bU)${??OkK7DRyMZMnxn&W z)<3HQAE5u`PT5jRHDFL3q>SNk9X(26UEN#+>Hk z6C-FV_dWAHxMyBx?gT|~1U)c%B9a|m=x$7OW65~QLc$$aEA}6VP!@{bNBEWQ8OD25 z&s{~KMemZ!n9|X`;@<1lVUhcoGemF?T|eSnhhE6>R&^Ts1i>L?V~&4|Gj#p+(1Spj z1JakblAhzz=N&Q9$17P=Smvk^h0uiWY%6(h%wQ1)gf|B7D98139)%kOjp1B_q4PMc zD^QQN&L8ZLgLCcv%8}PZ8STmaA0+iBEYi6w86orKO8O96)4vJg$*1**H7$CdgXwzz z2!Gtrl?^P*$MJqr8bX%E`wUJ&s6v2>$1GGZ|Cq94dU($MH49K*$4P!8IZ$6n0n~Rb zpjL_9&tJbE^|=1uJ+2cz)SzsAf0!N>-U%o7;MpJhpnngBPiNx?h~tO;VBhLvFz;NL zG~^MG@%bHp$e#2Tu*82KCZY0kir$4Vs`q606G7=0!=>(}iMVyadmbF-0>-K zE|=h^vwkeUzGT6>OkI+Id>8>CXSBg2f|K5g15gMaEfZjzVR+Us5_~JR7|_G_z@c;) zAH+jgFqIiQw1CS}cw*762F2Rw6h+%Fwp_zjY;^3MIP!rF)h-E*AK@H137)9)+@o_vtXnedlEDl~p&rGb3#oXC|V&LG^3TR|w ziCDvYwxr%1s+w`|`J#KtRWl0YNsoj7!k~_3??os0b7LEk{+SWz^=zs5TqC#E?7Prd z@O9naSXvs7kLm@z-ygZH@y;N^dZ|8Xw#H|}@VRY`JNg(bVrvYc7w}+e)f^ z^{HD_jt`cp;|xUGm9jGpZL%SOgj^nB+hwXJnUMK;Hr+%*CRAsah|#;?QWqU!wH{>P z!)k4g(1N@hBQ6xZoB5S);r4Q~3_BQ9MRBFZyucRWQ8tUd7hxMrNPzciI56pdnod#I zyPHqh*Y#{wZ|~`F@TeraVx>CS9)@x+lMZE1Xwgkwc;?G(aW;&Or4uD%q@JA^SW@GF z>sCg(G44IKM7Nx=YsQ@7_MO{yt=~B8+*$XV3xfh|_9(=R6{uW*&;+z4Y?kX#=m%L^ znfekI3J(?vYn$#g46t_0!7sIPdwjNv--^)Zur@rRek&j1zcuR9!5isE>rOalquCyB zS7%)uK*Ys{ouPZ+ztJ5#Mz?Mq!goN2jh^>lYyNR+d(5UnKhL<(l&rnhm^HQR8?U%? z?HTwP8UjGW{=@hxOvf0P{iI-^dkcl7N)Vei9T|$CbHLZ z2vFJ1U3+dCb0~I=VMu5*3%eTZoib}1-6GC(tuX;9XS1N%K@VGqM?&kbY3N+rfygCn z77)>vCojNOIlA%M4P)?sX{|Rt4d<2sbHiajwc#;mPqPDA!c%@~8Ad_*-f9dZx7HSD zBh2BPx!G`Z{G^^9l`l04Lt9+pBYyt6&$D?3xT^x(HwM8xZ(;s9#Lmr3RFK zla`{lpDPm3qMUS8uJ@=Pna=a3e0832U*~xP3=Ap`xsjGTMIM5{i&{J9nwFjXtF@wo z7L+Sc%5oURPYlBM#k?!RevebF5BL!NIYF3a2s1mkyL@hbp}PjsbwP)zRVSOIp#9`Mil5L2DfNCzfFcjQiT-87DX>oqw$ge0 zp+~K-QS6%8IRZat7)b+APWhq_`elrq9?O@Ud`r#i;=pDqHAgt`(l;+)uHn6Z2??UM zZVHEVIAQv!{+(-{;`b0e)wmGyL?V5ahDe~Z(tY82tG*P_UFnjkJSgoTLVv~k0bBSF z{uUlpCz?_o=7)vjT07l#e&?w&@ z2c|iAV9tvL<_xAn2~CcJg2Kbl_6QX825~?h8ayBun1BR=YtM&tZ^-C-f%qq+1B~|# z(BeffKx_PRr;AXrmLDGBxWFHnQL-?2u%9fzj+o+U0f#Z4@ma85rb`*Vf>W6T@jHVD z;wcOWTO+(eng>y)LBK4CQQW=nqke1Fd4VR+*6baF2lrwD?jOUOg63oQk}x=J7}YX{ zs*#N{oCLKNoP2VxQ#TuGB;7)*?cc<(@R7k|VV%Ij2L%>v`{fi1Vh+O@Fm+)J!UyTr z=gatag9qSJ6M&o~jzo$i4I3%T4s$fXceZL@9X!zTpn5UEoPd`65Fx{s@3X}${J_Be z@!-LhO^73=cruTk@I^WuNYoFm5X)H-=fs~3++=%dtbo0m?eYnOJuyPIdsgUx94(;G zy^1Ri>cxCBb_3>i6p)i$u5-J}jYtDO=F{2EU-!2&rQ)Xa-KCI1xqmUPpfT z3@+BY{KzHdqopg+l3v;y{2_ih>nyJGhu}$n+=H9}Lq&gJp8F|m?c2~Ci%f|XR(sL= zTez#cN~FCngx8A9%+p=o@0|hzz7k33jsB-M!KX*OH`Cv@;9rThzrgwr?JK8cq!f6} z3G|bd2UG)aD>S^PEE*B;>a!BynV2+@s*0e*-#^HDfahR}qpAnsuPttcJR*UC5jf)$ zGDG2ntBD4jW!&1l6ApeGaq5tov3Y2A9&fyj%+{e12ehp5%G~Cw{HFTFKxNy>{6&0o zvM(|L^e5>BP|?d?S@1`}*L7dL#BzshTq=(B?D~T1`&&=7N=47E*(>OQ)lHsVw-iK+Gz^HIYcMuM@)4;C4ZEdnyu z7@|XAq!^%+RpKsngV2rCj|?UMHCUAVNG$22Ph|-t-DR8k)Zjat)d~N@_ARzsMN#c< z!#iRt#a|9L2(?Jg%Ic8SU4inLPfYy8=5}_5x&2|}+`4D9I&*jm;&^KoGO_RPKm(H2 zg4(~AL!ym20}Ftu6}+6F)I*tUvgG9eVxoVd5$~#BE#aX8RpwR%?U6DOLHeEMMq&HNNB6XE$Rj-%;b*@O_dC2 zNm#eo1B$RY|F0V2!rnoR}W>FRsSR7E#>Y5m=P@ATjkjdrjhMi@ zpK5!QSUqBe-^h>vD;!lCSsZ9>lYT`y+;%;!~g!RGj z-gjd7g`)SNh%14d)qAv!=M;BOmTToE{vxb?EE&8D`V%*d->BZwct|!hMt-SKdtsX+ zf+ZQIX~=>h<^@LnpU)TNx-{b-U|_&-cxeV+G<;P|=TBamajK0~E-HeT8RXxInL`F* z(1#2Jn%FP=mLeDxFZR!LuVM0Z4mHPpk?|eI%dte(KU>^vYHzZq&ZG_Y0|4CxUx3%;LSimi(!#inh)jLVr!4 zxkK+3x_a_fUaRkL;Z&%))yK>Km960Q$1RKGU*pYa^ zCB@csm`EvuXwU@xK-M8NLF0PnLeLrZ2c441gALrvpJ8B~lF8##HsLOdguEy`Z#`2o z(LX0rGT(uuNGX~0X-TGJ-bu%#j2q3l%e8S#tn4#6^I14Xy5!8LnG7;b^D<-qOK=QK zFy->x$XP2vM)E59HYU72g%qQ+b6LbALM-%?hWWAJ>$-1TVriJs_*DV;Ktkqnh*vA@ z^YiIa9sQwu{)gbn`)9G*!jp$hl!0JGQ{$| zGD2*`wFS`G2}heS5Onr^hK`)_6nqm;Nfsgm|5vsig=MM5c-(quReLoKOsckKF3{DY zGZbvY4_ZnpGmnVB=|YZ83s^#uziLhiR9|n@JN2r6z#B0WE7zOTZ8`=ResjMKSsWAw##yg3()jPhg%}TyE@U1e#z}l?j%8gCLac1ScfSBHuet4HKD_?-0 z$gHGKOVX^|DcT%>0yYj?Obw12?9-mylHQ&SOkvRs$-tY7a)b2klAs}ZTHqmHc9EtL za-9jOS0Ys`p6U4O!Pj+PyTnY#5R58=EnqXQmMi2V-7dxp++bJY1#S=uq8gVi*4u*E z%d-aWtuTB#RV1b~=*@i$7LijQLOkA^5G87P0+RS;aCLF)=_i}^bO;5}i9vq@)3FTc z5dKsa^iyJo3`?#zkReQ(M-e+dcc(F(_nrh5V|NG{j5+p_9_0Z-a2PgapW)dwa7?VQ zoQELg3~XaKg$29JQy{2tr32MywHn+dZvyk$Hy$V-pU%<-rGK)~tiwS!DmpI@DiR}? z3O6{udC+oZ%X1FAg>3mr=xm6_Ha3`d%ab$e`77apgZiZfwCOSN-x>xVgZVkFP7~Y# zbt)0SnL=STdII1rojI`M-HP9;p6rpmrzXY@G|!ZvL+8vVHinq2`aB~&t}$iRDN)5g zdbSI}f}dk}i18|KReq(DJ!9n9Gx9-(3Oavs#SyjXj;w za~uo|$f7MjaKr>&jCyPGI)>E}CBB9t^b7SXqmuJt-k5=B5BU8|&L%k14AFs^3g z7@0k|?Z()-<|5dcJ+W&*m<-EZ@BP#*xe+*9z_=F&l%wAEul7>?1W=exH4G#?prq*2 zkpEiNS!hF^i(}5p88D;`d9G^NA~DX8F9EssHstXxVaSi;Co<&e(~>mgZxt$VyCF_y z>(h#VW>za+y?>A<{7_I$SFbG!EYRU}F*f|k99dja+ZP$XA3{>_^?Odu5z@Awz;8SF zx+PbMYU5Jbh5^%kjj=dB%5C#K^d{Sc550*t2X=+6+^+^vnWriLOE7#oc^zZQzqF6R zB24)ZO7dQUC{fE5ki`wSx;UmhE04FyiR}14g1K0Byv?S{h-c;Te6TPJ-oSw{AMQt_ z_#B?bg74l(uLI*9%-Km{NTW$>+UT8nyIKS5eztrFk1BNN35VoW0c>BettV$(ILS>~ z$$FG>({*MVvyExD?lwAF&laleqQ052)t@nRB@&2n0WuxZUTST|I4P-P%mvN7lOf?q znVg?uv*>#%w8{B#9GFZ_%`Ip}Mb_Kf(QH>BkH}mc)PU8Kd$27;kPj3SIN4PIJ4KA?X(Hb?J!5enX?pg4 z>h|0Toh@YC1Ol6S8WZ%NQ!iw|1VzcwrwRI3S!bb5P%fT1Q)R%AHbJ?rV2j8&6ZE9x zlbE1*moPy$<0mpf=~I6uXkReD6^;(IB$W3V{4G+E6f{>9nG`E0Yvooex>4@4e2{PT zL8eb>Kt2KIgBzBw;oBg0*Pw+R4P#c23}+;< z`Qa>hq){&z)urkg2v7Oif@_Xhyur_flm1vat=4df^pVI(7gXE}v=VeB8a@a)1Re|R zC%DRPKLG4(r(K??xgsqO0Ko&AMTE-{3Jkz051MY&eH}&wy^f(0Fr68dj6r6CbnFX< z3=HDiDF!o~8^$rfAn)aTuKVEdocHdA*+!*Pb4O7!g;r!3#UE7qVaqL#399bOY70hO zcv$lEdyuCop!bXY=6~1|Db3A~RT`7xNGIgz|Ybp7>k zD4*DYi^9tybr&XA-Vh^KyplDAWmZ!z_|69VgP6ghgwz z*ZG6JHaOSrE0>O73DB&spL(CLNbd6FjGzcY&_kLB**bqPh&!KGBG$R+eGaDW{UiJd zKV%}XR3FFtDJeK)sk{&16qL#yIG`Y)Y%-@w;3@;|ud@J`{fL6zz}e>jl+uY5wdTRT z|Eev!LXI7#u&Z_V4L&=A8h+{#eHUu}=VBg5h%uPJDp|3-tPb5);r0X@UOs z5w{U)tZNKIKN&2B{&Nv9bc(fSMdB#(M#56yD#O!RE7BW+DJbbQ7=F-{v`TE{k?66n z3$~IEF=UJm78%3&Bg6Jn#A&u#;zz{%dWy!t+kOk!KsiH--i4S>^kn!GvEy6}m%77= zch3dydCQLjCE8nuq}n?HN;qV=&XQ-s zCtxDbMS3Tr|2s0!e@q8v-{?IW6g@#CyBG$5NOHF*-vhgB_cozYIK{-wVC$z&xeZq8 zM5pb7X%?M+W6&qL0PJC;ZWC&uaa>rYYH|xrDKJXwc?=L>*yvsxQEqxJ)dP$)53q&d zlZjM;vulaX;Oo5o_#3If$A@fbvv4(?DD+5>p^Ov44aHpdY|EZi3#3I~(C^z-7?U{- z-Xk!VfIu{+FKE5NU`!_EHxHb#tKwyKSf@8#zPRIi)asyo4D=;dKe zt9+~x;6ItYX)%?LE7_Y9QFa`RTKU+B16x~4nDTMP4gR9ZX!^Z=$iz+y@V4ThDx4Cp zh@2J}mup?ya{{~{jU;4_W*S-#)nr=?1R}Pu>|PFYf+zMRej*XpkyUz`Gx%1icEE(sZ)~o@5*1Yw&h| zm*(_405#~9!PgmT&?zCz_zHL;2Q}y^wi;xwU92J$z@buw-UhRaQH4$sg77yO)TvaV zt98S-a2K-=2Ue6s_?WW}!YJj>7!ZjlB~Czx?Hi{FbiI?kX)#r&PqH`n4Wm|_K86D) zP@PWRsq$BDX1(`p@6Es9c!|6>_K0jvzmyZa{b)?~1XHL>kL5J|7*Ea_f+Rl=Zwe7k zX;c{`fyiAuj#I)^89A-LWC+MKL9NPgw&TPfp=`uWTdOi${Ml>(LO){kqW2wuFOe#P zHwsnetX1%dR2llTBvqN)L{K^}4W^H9vUvnGyZ!0m%X`f7_~Zb4-T9_9pMKw+Db?bM@giFh;i8Z-JcU|{iq%iyyT&ydViCC#qrSS z75@Ww*oz?^wQnIt^EgjXp9ilDkvC~H4_xiYO*W1x!ZZ&#t-BZ|GEGox9-PBCok!>f zanshC2bXa+#e*D=7`^B{AK*)*dEkvg^Y~r-M4AVET9TT_j`496*W=@{jbM6ZlR*3* zYMLsLk#b{p=ZTuhAiXBH*jB%KY4-8~E3Kt_f*O)XCG^is>b;+_4X5;oU8|oyF@GL> zUHA1%HyOXAap|X^9|c+3pABNUXHe+`NKZ(ZrTsTBd^!QEGeG73@w% zw7)f241H}8Fm#IVXcLu1KD*o5{gF3PNIGzpiHDV|VGBuT=A_B@Uk1Yunv#?;q7*|L zJ@$3Niu#cu_X#(DW8BSM=9)m1c)Mr3J+$ZqeG$VW;v2Hy5gxSGxeO`WA}WH6o^ zwYSQ{iZ%m&LyT3uF-mi_dw$eFVSSkl3PLpb>3lJ$8}3ZPz<@AXzd+Adyci{klQ-Pasgn#&{WF8~c`@&dP!2;yi`?{e z>z#RmG|dowSk>OoBN&EFjeXV81>fV93GbMV|uegt~1y_7Bh=93>)D2za-ex3}N!T_cD0A zyQb+*xrgRz)yZmm;gRlY_$t!hv6z8wZF19TnuZaSl>s}D5q{t*lNlGD5G}dVFucT^mY3(kz>yje zUhH39p3HH}`Q5(Apxzks{tQrS?Wjahrx~IjNx2EZNG>VOC9$=m*cFMC1ihciC0!`) zHGN5lvr;ct-xA^`5ruV%mFi@h#6gAtsNcgYC=8VQgUJB(BV&S@e3?MAeuc0aVGQBL z{#l;~6Nx@U;(~``-j#+&0}9at1Yw#X`eF0uBN)lq+(f_4=CRn1Wb@unU73l989Bzi zq%S5fr(UcGCeJX7_xc9bbFwNUI)NSCG?8J(IP0Bauj1^^th3Mo)-5nZ6a%N>2#I7J zVCCL7+aDFz>68qNRU(iWU7?3}iRkL5k)bHMN}rZwboHKEqg)xsBbUd$R-@iuj8$}^ z@FT6aWRJA+Sq(DYI&8ag`Kzf70-+|RAKSH7KQ@7Z^j+E35CSEEF{$-cB&7&{L+aja z--#J4inUVoX2ZFrlOH;;Ah}idX8Uq*uH82;;czgg9@SePEEGEkf3kh2>4LE@GFn)1 zVl*v8EMGqX`H&Uxj>jpepiba)loOHfiD!IU$vzt;7q72s5qS6nYqN7 zDl8gjkgkZveUV8R;MC;Jm)cuY!(-?KUB}6kb^z%+xSc|4XmJjyTR%X3a2?!VovA7` zP{veK=$+hx=FZTAxdG9rrXw1;ww$7SsC1XxYPmJ%cDG5@G4)Ak(%h)PF)VI#*tf}q z;d5lBz!+~!2F8o=h5Ko(N1>b-6!lDo5TK~2CN9MkU0lp?Ei<~!3v6BXvS}nr+=|og zbsYCj9GK#`nwiiEm-G;oz2_E=JI>!D3>QV&L2m_gLN7Px9b{!ZoR@fsn9F7(*)Dww zI&_O$ zTiWC8>a2?ch`!px&d@#Z-{_7Vqg%HQ;XB-VrRP1^Okw^pMM@s}`GH3I(JQ;>D)1fbbg~;@tw= zl7~?sw^S+tiXVi34j1+zvi&2C;8`5VTonKXmj!PFlEX8^#&K=t8t^Nwj9j#%XLYW+ za`9K^u%v3g)5y_A(pPU-e53&-q9`z_RgkM65)%oNM;k7$IRXS2hRdUeWv|_|_|&)W zC_>Mo?>C2)%ODtXG7NvF02{wE{dYEB{Z|K`sxUC9yX1`sWZ~h(NKaj4vmiUIBw66; zg)#4n@C3za_&UD)e1b5|5N6;>9FLVe6X!(;h7ou|CqPX0or!)s@Dz*v$iP$VQ&tIK z_m;e@6h-NRkn$UrF~RHeB@y2^_nwUdig7lT{;&||egDT$(P4Tymp#bSgx)sz zxyp8ufw_M30+!ab_al%kW?M=Q{Ku>%`~m+H7819b#1(ao+eG?Wh!tgBjCeAURpk$r zz`FA94Y#uR<$$&2UpDo7rNHAwRJZWo5bFzn#{WQ(5Ff?AZvti++?~ztcdLOyW`O4tePxf1UT&$m^!E_}U z<_ZMBc(rtwMuYK#!Gj^2xJ7_*MhJOvIL?9DE72GY$nrw8sguTbkU{@2-BPw!>j6mg zf@na>hoS*Fb?|`5?pG0jT#|&1`4Wu)IC?JF9-OP5}OLtk->v1Tkb@FdRC}d<5Bsj1jI-SWdD92fWlb1Zm+2m2`k?1(9z7SMG0jL(AgGGl%46{39{ zh(m)1;$jAbWyN&2NWDBtClBc3sEeC%3(&t6*a5Yxx5wod2M_-`0sl+jO+hQJdr27J zHqem(qC$pQ0%l}V-E8QUbPFxNia&EI_^rWX;ZlKx-w;@^x$P7SVh+O@Fm>VVfDba< z$^m%u-~kvi0mw-NNu)^9u#wVR1if$YU=K6uwWqiOIgu~cipL-NJxfx4V(`;^YV0&m zPyu;9)e|0sxni826VpEpe!8RPbaNsmDQ6-!i<7yJf+GT)U1FcdTpE%Smb2?ygGb2* zfszQv!6v4w$kYh*yu>6R6VLieoD(bWAyaDqEKawg+R@Z;Z4D) zLid6g9B`1H0!tgj7p*s?nsC6Lv}WMO?Ug2AIkAC6RyZ4YU;A%61ap`}eevL-zS^Yp zoS>F&H|Z+2#dPnT57@NMW z#-4?d3|lqrM={+qc!;hO5Zw-M3K1*4X{J2*DLx~1ipjK(#^9%UL+mtHlJ>zVdL^kI zT=X0s{6x2y6U|BVNHU7x>*b(bv6wgh!0hOk4Ib=m0_=z>p1C$8>y1zPTo5|eO<`i_ zw+9c(EesS}44oM!h7>3PJ*c;N{IJ~{Yl?uwme zQYrNL!B6zr=0tOnLXwQaS={>`mL#*x8>=hOw+9dPZUMEJVNOuX41qv4kEHHo^M$94Ixj4onwaNs_Qn7Y?CCOoLtf#V{|Z9GUqbXY3aYVeC|6#HQs zjd{+MRlt{h7>1`S^Tm^vE6kc*lwC4A7&oHp=mcpx}Z6c2AmO_-!vs((@CAy{jFC<6mmO`JFWVe*< zt?~i4zaA-mca-aKW2nx}R7;d-IqlZnCRB4mT_;qGSDTIctXqd-Ot`6Jm(JrX2H6v3 zbJz=ubLIBTh^(>QJoK#HyLJw#uj3*tWL3LHUQ_UyJC{Hj<(dVsCr$AU=p zdn0|k!(RN!4k4T+$IV6>v(@wK>rl+ve1?8B+Q{f{>W|AD` z&FVfuZPqo0zO$c{TAHTe#M5DTa9pJ&x=S+5Dh1KWS=mIl0{175I`I?3*cBP()<40C zDd$RX*#?W~FBGy(dLKa6R69}NZEuFFi`QT1%rKorb`{zUD;hL4x+234*lj+|8fga)(@sx>A_7X-%veXcpJcB5II zhISrxxZHw1A=Rnsq}0YNmqK2HGOl=T2Chid<>zS8wZvNA!_WY09o5@spsjuGXS3ku zUX*$jvl!Y_QOAKTDo6Pq+1e+EBU(12`sfsQx0{fDL#>MUfCG&hW%+D?E;Vwb9jtMHSvVPL=oHIj;W*&@Xa z9@t%bXMJlo*NamxlGKOw!7VSOA(9{5@~g5Jm(SM4#vFC_s%Z{yG-tte9>LmG=x?=s z%BeTns;w8C%1j;gMx2T}RqoW<4*Y^{h*Dv<(CM*V7!3;T_?j+WDim(MX%~J_JQ5TW z%2Z=+3H2jepMOGXOXrw~Yqy|9#b*U_!$k#NjC$)JM8&sb-j{~YB?)O!@eP79%@C%j z@ctAYPwrWUrlhGvgwYmw?cc> zfW6DEBdweAB`w-kNk#Th#E|*BQWysu`JnvS2}-Ap(uP$ij5^l7I!qa6GBV;#E|lHgGY+Y&Uj901`H@4cheBI^3h#wbD$K=Vi8Mq@RaN^s7N14bM>wFbM2CQ>bEGx}96@D5wH@sBJH(QMz zYyw>SOvCy2VdWYn+;mu_) z7k%F0l{{JQTU^>Wl?LRDU}Q{|oj9uM1p6I9hR9^CgGc9ppu*r9bcw51%FRll1WJW8 zK}DFXVed4BPZ0`hkwMKci?MN$@iU zJCk>RfnvqiM>(%#P!oKm&D(|plLa7MmG8+aUY-XW8>Uo=&BA}r&P;+wd)2sRZtp~K zUbWW%WZj-#HM~oB)&2!PkynjAElIE1ZCakuF|C=3DZnOa&onB-3*8&~a;c$U9i%_) zybz;K2y>-N6a#0Bu9gT=cZg_^|0`p%AL4?iW3qnSX5S0GuKPPn+igZG>^lqsKC|U; z+N9D?AB1f8!wW_4F#Nl3!HZE0wC6%<+uy-FQ#wRD1V!HQrz(jR#_Zn&q%NM%;+zPI zlu5T|!c;>X7C!YUZ$%7YOO)u;TLXN7qi-`ZO695;)vgNgOzglaUCT2;ZV8c&;1OrD>t+NNz zbAyaAW6nP{vpKt@Ps)^g*Vxk*|Aa1RBePc6J#grUHiDE51cntHz*(+UAAkco0l_Fc zuo<6k*}zkf!e4E*5!tv-H)3NiWvzi_cCgx>k=B`d*f*m5qvyaiO6HWm{74J3>xDYDIIm<|(9QYEJ%0=G zo{9sLLA6SV_$};BAOY=+sL!ef$m#iw&JgK`=V*XI@Le>4_3k-!55rjBds5iiNMrX- zcvHxVeE5kV`V@-=IecSk@YGm>U9W=1sDf6h1zN)0f#>LYgI{Bra5g2@*bZ+zy^p<$ zqvIKX1)m2ABk6WNj+jG(M~v)yAAy+NAluQ=Y_HN_#%E3b|52O(@%n52KkL|rO!{{XK$$9WhV*Cu=Q5`5j zBPNr-Qnv;hp&?d^%LilAQ&YL z=+}t}^8FoL?lZ{unXE%-+Qp^Ig?2MAp$_tK2M5>XG7PNa0Nm|m(`cA$P`DtA-oFE4 zddC6qE)fSP_+$Wh`#nZCag-%?oTfUdCq8_i|`Umbnc%8gsP(4Zx8Lmeb1|MIVFUFmlWAWc}NxkkN$uW!1Q5eQww8%LZ8kj@Uh4aBaP#RhupimR>~ zfe#?)kxY~>1OOuS%jq@Cb<~oYjag>{ZXg>sY{0b|-QZktCH#NY24~~dAYV4YXZ-&P z_Jc1ZA2b`fz4?{~N(DT$yNA#JDo$5*)OS zujt(q=<|a@SNM#)v$0^$>~mo^1^SNxPw4-%_bzaDRn@^bc_#ye5FotakYI8HGXn__ zaDYf4JVU}G;U%Txotc}Nd$@D&c<-Hrh-vYKq+Z*qqg5+a@P!Z5`qiq%XGQC)wYBw8 zEB;&TOF>0j{7|(0)>`{@*52owdtNsT{=@IbnVa+2d#~qSd#$zCj&yC?xHHv%*m%ut z#&%EjYS>Rg!|9wBLALY137@AZMfFPrBQ@KRwMtZWwCSZ z^=unFWA|g01D|LY1lQ_mRHRIs)vI;?_mBa}(KBDDUCt0N%~(v(JxyhG@5j10Vyt!w z(P*Xx3MT)EMT-2@*XO}u>U}GXk%!A2u~LaX%Cd88Wbd3aPl3DeAiv*!{OzEY)2k8(7lFcbc25GL=rV5;r zlbaS;#G02ZN$Jc-CQ^@u2_Af0-*r70`<=aqe}#a*+gNX2HSeH<4tR;k@t`K2174y7ULxB|#B|*O zp~3w_2VAR=8H1k01FqEw*DB8<{&4Rny<;LKJ==8O2>#nboW8dGekg00DUFWxj2X)h z_Z~MV3*3ALdJ0*eE#-c1K63jZ8~WFKKlD@Lht6H}*3hkoZ0P^o`=PIj9r|Gr(FC#b zbDpxn|G4*qe@<}l1=-M&4Q;zLL+d6z{hg^DuyO%tPNcY>ny`yPN9HSZhQu*5BD_I| zPy~Z*c%F<5Fw!}k5YW_NQ@#1y4H+fNJv-`%LLGZ1NOU+f92q3Shf(gtUId9wi|H?e z`_cr7))16wn#kj=??*6_d+UQFu)X!M6o~ZJcmHZ_a?WK6D6ZvP;=D99g(Ac`!zfHu z?zd)DDrVmRCQ{|xH}I;gqcHmhc(xi31Z2RF**CzG9PNy;xP1c@^6FYY2;UO>2JS>D zqJ0DOYgXnTQdymtZOX z&a&jJhfEjEAcLd}cIDYy@P}@9o%hV*1T+hEI!)UtJ9H=`l_G$fS z>^>lQ_Db+7Bd zO+7h?74R$^9~0Tf8S1%dm1cz@iL7%ho`sW%;Kd&>ga9u-BReDJ92t~|++;C3BmM`$ zqn!~(3USGN6Hn?hZiD+O&-~VaTYG8CXzb~ zpC?n$OE{mB5SPW&sx$TZoQS(JU{3?&!*k=(6=r2fviw(dli{<9e4?!cE?8-JRU*TP zb44J7_`^vp$A?k9CKu=Vh&L|J;ueGOcVha=0HG1+I|;%xO#}tnzYIQ4k>7h4f{|RH zgXp&fIu`qp0^R+q!IbRF$Q0LnF2Np2O{NIJ&M*q&HaslrD2&?>t&E&*!>6fn#0Ific=#8vbBE7K{x|R*VdZEr635}IwJ({$>er+2 zQybPLzs8?*mTs$5$0tT$H{9h|=akPD_CuzS9!He%QD_Wgkf7UPU~)0!HXHzN6@X`_ z5B$>(u#`9;viL4;Ra3hJTd=88gcren!1FGuyQ=LyU}1@U$FM6_Z;wOE3)cs_P_ON8 z=!@-9>_>!6&SGJ|6-a(Dp4b8V_(V-$GE!h@P(QXI4hfO#`9MGA8h)q4p28mgjfRx5 z*DqZz$irURM-X78Q^WWT*y|HqMzr+!yrO*P4B@01K#>kT_P{DJXp6niWW2MW+JXjW z?vYcfO3;wtfX7J-Uv zRx7QU+dy|c2n}}56j(k##V8LwY7XeUZS9$|RGhb$JMdn-PN)7#D!;S z_hiXGbv5IW&iY#~ScSW&hrBg}nKc{xy$i-Ft9qRy(7dtaGxP;cY1{Ri@}i{EACHg1ht@furbn}cKix8s@JbL zXwE_SpZ{4j`PsrFN*kp(_E-)t+p)*5Q-e$~w*1E)iy_;Kt~e{h5ls`WZV2+&Cu|=Q zoX!*gYPCYxhzj)Z?RTzxUa zsPeOy7;K^Jm94Re1c0uSiPPHv;8A%XO8yC02joP!L`-9+z@tv|(Qek-V#a^*Tyi+9 z!e&R2VpKfv2lxyBdH0OJT0N5HiwV*PCP6V%o`IifCj;osftQZlKs2?-* zCYwwWoy0xcZBD^mk1_CpyLz(*+-}K;mspxCiy6{LU~xP$-LAl*@bbhqGGD0;TB8YF zBy!Af#z?V9Jk0J(*{$E>MxeiJ1;}}@c#iWWgH(co9ZWp1j4SZg>8#kax&l zUl5Wjw*4vfvwya8~8Y#hvBPNjKA zMVt#%WVtB|%jt-%Hpaawq)nA;4X9OyXJ%oFQ?;p1)oPpLj7|NxMlDb$lABlirANkr z{R};cI55r~VBC|25Q_vM*0P>}5SI75dzqLa)ph8N&6ZmPi7d6!IVzMEE->p80CRiqfssXRB7q6xAQzak5&*NO_rSO5FE#m6LX}wH1JKSE@M|pwJ&F8 zTkX%?YZX$%8_an4``&|nk^nnmi1X2$;u19XLw3jIbb;Cz&B!pLB=%xxI(_ zw4k6C1hrg(Ig9etRKL3S@b?S&ov{|M5o&&W&s2qr^ZXrni>ajHVqr9!pMDD)rp-@g z3PzP=ZGP(TY<-(X4Qxd^NFxh%ddj3=P3}1oIb9Nu92OnZYH^1g)-4PHnFeUm(z#%9A7BP`W75*O zpV($}@Qp{bUh-cG@O75xkVbTxHohn_(;vWJl$lPy(xhoqM1y5Z^eEbM!+51VY~miH za5_kAQ48}bojq-be8g5`i1%ETHQwWnr)d*b7Xzf0juSXZ{|9i$3Xg*Lm+OO~M-tL#|FkvvakMl;ImjIz*sj!1zC5jg*Ah!VxfPH!KBr|IIeX;WYVQQT9yszg}@W7#np^&!)jp!a3d_BzhL|W#%c02o7UykU3e_nZYbyqIWQxQJ0PPbT*X6X zO?$ct2U6d zl<5eejBcB%&&F9pFw_c$5n!mObzG^ZXMGN`VI-RP;|OCGb*E#)WVRbw3R%>dtwRM= zv{<7jU#}!X=(H)m)h;*NC_D0|npNCw?|SAj^D&=R%6wY6vRL$)&F_~&!@v~OxwH8l zA4W-2^3CsyENqC*^j#*uza7(KgnbytCT0u#tpsP9CUPvX{TCn@fdw{BC!(eWCSFSA zViwpzBG_BtV`)HS3p?Vf`&Y{xW@UtkYrvVqyE{N>%}+ZnE>2Adi7r#U;(63W^6C|* zDRCX);tHFaKw3p^sl}r)5}VKvd;^j^U1D4uCmV@Auf37j_r>&>M%*No zjl@1caHeS@D6xJEK2K4!;z0x>xx@yEU`uQ)4I(AB`&UPV@hcPBxHfVL?H{D3MTF31 z7=@`!aY5Em81Eoj3z3enIQb**AStjCHIc$tT6DcIwv{y?=Rb9qQSb?9JW77kh=N4F zF_V6T4W}`aEVuW~7ehWQ9&#LZEbv&hDGsw%CyARBeRa%jwLUeCmG@{}GF+x@_v&9G z;!tutL>Y}I*al4pC)3IVcM7z;os@A3XWi1hGrfV0%EXd~o!1+|MAg1NdT$-Rr#ry{ z1h|^n1}CXc3|v}n;R(M@sBVrOs<+DW)Ai1$^g+m*XE|?TC)*p--8(tk`IJ5j8_z&E zETWs6U>=KsWxxf7z6b$kARHQjvTohD;Lvvr93=y8#@r_vhd=pe4BWGN z5ANZy;0n5h&wBB5IEOz+I}9P4dXJDJViB^I=$_^4QbhX~+I z_7%rKo`x7oZtFctj*dl%pk)%Xkz*jmcMRa$dk^rju>ecbg{y&hgg@gO#w!{O0kCAi}g{oLBzpDzfk94<`>Kyshv zXJO3gGA^W-$uRDxvNmBD7wJ|A<7SXRlcdL^rhH+Np<$Dx$K(4pgT~d4C5Lv`+OhbS z$k2NVS&%aH=+~^w(7UZ#uePh@TD4UPBXKS8W3~b~D z+6L?7VZ@@noln zb5j!IRG&&sJUww&VJV6MoQdVr!3?pW6rxfT9dGMNN}<0AsoAoYQ<201E)H5kBmq#axmdw#lFgD=6szUwfk zWb{(}Mb;qw%47}t8X0IJ^rk}B4tdg}W{p-MhTxT14MAr(N$o#92c@v3Zm|T_>0Fsm z!*Cc8oJU%(>^5d|OWxGMc)h2i(uy&%4tF}?Vi@wAN!}kbc}OIAc}%K5a=Xia)|_Ux zVX^TiYgKk@$IxI1YSrZ9SW@Sz6oizdRn&5AtwVw>s@I%tAK`D22Ih|#)j#Z#K{I@m zzD-dq^#jm+I@M~-0mtZiFE!>ET}OmSPb8LNUnXRQzQJ(z<=*1#3;O|QOSE!{#8k*D zgrC5DhLuNqiriF;SkGqrD;4>#81Hoj4bD|Q6w^igv?=k_#ZSU+PL~BKdx) z=eu*N(Eup;3}f)JnXf@Fl-ol3VKZ?J&Wuu8LTC~t;O_pagiO@^dGsat6V|ve} zIIbd?(=?Gsaa@C7Bv%|kg4l{9mL8Fcqx)B9XJT$fthi2cDS~yWi4~y;GK|7(^u8>s zIx=ab=roB8pU0W~W~2A|tfMe#q}(&beL@*9WD*Csi`VuJ#ifywwca&x0N)ac1Al@7 zMTrCSD^uct4h`mlnV&!>U=AEp7fEfIEFn)P4nJFOVvqkm1e9_m-mgKXUui(5Bc0J# z7YTA_sWyTs*lZs~9`c+WPA=qaVuNsfK8z=ia&tCttokaLYsO(P0fSk42}^#BKk4X- zJj{^RcbNiu2vNlQ)exsq^-_D>u4~PH%xyRT&;S5rZQ;E6VAzYi1I&d>#JPW7W5kDI z1h_4Cx>Xs2Qe|GN-N2e<@XlDd4Y7+xy1u7P(j4py?`O1GDYv1y5jp^? zOsoSb0fv#e6K4y{qF*A zOl;oPo+(R(J1i6~AL*<>A|~V6O7Z2O6t9_X*GSEgCIfxgl0{l}SA>UltlAo#ZV6Y- zbgMjGQL8DXjCM}fNAY}B*r3tgqaG^Uc~j-l+uOl`$rcy9+K>dBti1sl-#Cdm_hE*ONt+ZNL zI|fx_wT@a=l=T{i$a7Ovm4RNN%w?rn#gk=sH=4Dv{yrLZwLV&#hT2LLQU)-vmQ1ZW zSw)rJZVY+Xj6z`=?~>_e6O=9NUD#eJdsl*E`;ta|6z()dPpINAF1IK4K+q8S@Wv`r z?Fma8AE3%Cp$eM@e%h;P;0bIvm^;js2Z*g*SEUVNd+8nJ$*EdpsIPAmaKHEm%3gE2 zPK-=EJK7k7$O^FKNCn=hjKV>*WPg~KDza!2N(Cr@vR9qj)1GM5&$wzDen8cuZH;zi zq|vy22zsKk9r4&hO3P3ZK8Qbt$16}HiRd;cb+=cYoB|K6itL!L;jk7sHL(v{hDNbH zDYz(HV1j|!Q-OFg8D%hVFvLJXOpnU3qXd!3hNqCykhccx8ac!rAmAcLrR7aE8@sC5 zoG3{PhyYtqWTN|E}d)y;>&gU=Pec%U)d|D#O~v9kY!;O@fp!p%)96dNg8nGdP1G}{CNelS?~5k=^Rf=>EqYkz zXKljNI5GNPa->kJ89)tdQ`#|(NnH5K{~=uYpCuIyoQF^=!;%-w%WhUK9Q0G__RgSe zHgr=M2aTj$yO&aI3OhpfQ6kSItUs$`fqaNlSF>rNv;Ni#R<*$p9`e=@q-!?zdl$gs zc67K^9UlfK=V)cf)311IHg3F4Y0i=map@;#68T2prYLu>KWGhMj;C4_4Z^=!V{eOT zEJ_rIppSA~*k%A;5CVx~jf@3^HsRPnt8`;C?pQl_JySk2&24%cg#Q&_?tpi{b4pi^ z<+MrgKBL`7TzqJrj-Xx1{}v3=|2AC0V=oT+zl`sbat%Sh|7SP^wGYI%kEqh&iUdK7 z&t(DThd8*$k^}Qd3SjI*p8AZ)E3&!U{1%Fr)Cgai+~>$kAO6jv5~WgiV0n%&FSqA0HTz;uDZ^< zGyaRA)Hv9=tMEX|&m&1_Gu7cI!7u#h-824b^+=jy52KLL7Kwm%5Gv#~*no~yf5p;R#?jaWx z4xGZTm~W7KQ4Y|{AdF%e?b$~!rfyfDL~GIH26BWk5o*6lC7{=Nv&TXcD(DCXC#ay_ ztZ~l27*iJ@owBP9DCNr2C%(d3=ZvIZ4T^3;mpmL&PSF%go`tdtWy4uUo_`)9R35=B z%o+IsW3M5Gc0QO0_R3S4VuRbAe=6Q1TXj*0<+Bc+rkg!|ngnrv6cZy(k)5TIoQg1J zx-=<09feZ4)7ak%eLIt9V7P*F&tfp8nLImJ$UGdH3}xI!gqmUEsEfDYyt0Dm49J9?ayidDb{mt7|pc*BsQF2+Gphs>=}RY z$wtD`7FjM0 zG4s3}*3TF_W*VTG=ebmI-j0}wp2ru(JiiHl(L7JT zX5~D8!7vnXsJ4fPW6N<$MXUl zc$FF}ILNiHw+MJe@d${}wV|5aU^61f6(T481foPSsMFhZ@HCwT-ANea3OMnW*(ym| z+3$hQ18zK{YgEa=<@SeRHM|1=3NO@lgjg%57~8uD_f)WC8e2^TA28kdF*ZCtuV=8! zjm`QIY?y3TgA$Ne+f`+<>^>QhepgCfPHD%8^vf&v7gac@)JMxxEsEl`JmnJY_iBwg zIYgy<)VM*_T1S#wO+jw40~Ok5m{vC#mjAw3ESoY1UxS7LsUpbkm3WXH9~#!nlb$yda|Ai~l zK_8WnDm!(>^P;6H4SPy3jVzx44M)l{KFlx6%t1ilx%CjwiRmc=d`5!T6MSi!2uiU3 zYv6(u#m~+~Fp^7f5c#$Q$KpOxg1di}#BUbYN-nuPHZ?UOlo)c3 z(63qP9Jx>>U{$htN7g6yj_8hh=^jxT=YzU8SW`%IvgBmkF41qPcZA^=xXg4FY?E3cb(sR#{D7zoT+uEb0WxGgLSJcgdbz-m<6yD+MnnIzmu;D!Xb~sm=BaJ&W8^yMZ|3io0a2ML<4}BPS+I?z9m*f z+wm8zi0Id>ToGN;scv?=9UP#DM)S{MITYM68~T!cCUxjbL@@S*5$k0x z_KFNN|1LD2PN_R9LlbDeGe=_)an=y#@n3`}QRH&8?I=9$`C{|v2 zUGjEMRAE=0u79WZi`5!sD0kZG@1re&w09BA_^~S10u*KPlpzl{XfeCCPYIY?IY!T&5aOzKMF;x7po8K`Z_#Rzmdy05zlYs$qq!+L+#VVQC&;-c2U~6iA27;3=8mfC6dH2~nptiBCpJv0O{1KV%dH(tCJn^)ZhSCcT6m?a@uZ3i zwpQBZ&7f|@2^M8>eg$NxtNXG-GgNS)nx@h}qRW}$zVe`=hJD_0k|AG7UkPeL^D@?8 z9aF)^ekiQE8_vzdn%AwVY8&e*qBBt`=}NF*jD3I(Ghi55*b_#VgH{G7u-v-P1e5RD?-UR<>1S1fHMx!UjeGnvy z9fXdhNn{YZ`&Yj|%fyGVLEP{&Xm;ae`313mhWW*KSx~d(^s@Y0)=?NQOUQJh6?X;< z87~Vrooy8!=Vdt!n7+H01>X{0mRs=`d0FV!tn{*M#I^7gRKKmavpHDKO66b?Jtg(6 zbY3+pTm^E_WXGW)^BKPW*He7S|2%)vIWD-ylUNpiV%$4@h9rDu2|i%jWEvSwuLk+F z7NH9A#KT|cb~g(twFN}k@#id5w3Hd2wkyYeZhLX;=QKa5n~WwM7fD)wMbIS8CV_jP z`E=8LjPK^~))8(kp1_q+^`q=F7&`aCFzG-7!M4hp?^kXY;h-6*j*pv4OTv2t&K5YJ z2A`WnK;IBFQ=U|<3{lI0k0IctPMaYQ&^Vl8AeQ2y-a6Ew8k+_ukSHG?wqf>JFkU94 zA7PY9q&VX|GG^UBi46-@7d-G`)>Askl^kYF7|u|_gb8q6r12(?vFaKq`YH~V&awJy z{6!`V{mNv*_!=2FdG@Ao(M2sd7^F4^)k&cMSvEuFoaBZ~ps%E+jMn`rtOq5igA6!0 zifT%ngdJl;91{G5TM_&b6Ni6iOqxg>^4JlNy4`hN{mff@LF(%1%CRK+3>`FnZEGUz z9owP^dxxxw-~&dbU%P12+*N>O@e61^oqme3ES}8KScGK}!ZrSXBT6DIi$~yT&n*jM z95DVN+v3Dk%(mbXsH}?>+PVld5Ecvy04wH}{|}*0VqZA9h&L~W`jlgEh*EPBj(LKb z);qz2I4V=AgbFcb9Y@M|7#>DzpmN4UW3qwAy1=PUeLAp%;URKNQpl*iXNnGJVJGDc zdOP^nSiw<*h5F!YDpsjWGzJX~^h^edR+?N%agvke`7H7=v{9N;s*0JlVS(n4d91qq1C|ChUpT` z6^TrzSvmsMc@MH3?IvMesz;xG_N_6Uq}P$>7d3p*%AziRNZ>hHc*)h*r{l!%7D71Dei1Ywbmns6o7up7q6uZ8!Z#4*daViHS1deXoOp=P><bJ1*!%&RG&yvlDG zUye60Kt@SXGzTF%PE8pw~|WTnV`R=cf2 z;QeVZr;sM_k?vE*hquIxJp;x}_STJru{2HO$=DwH zgK3%w3b|j0&r{S1dIy4$T*!muwS_#Ex{*R2_f;+-zdJP^BZNG|C`^T)rCCQ|GA+^8 zjSSYudCN_OpI=fFDN^Wl5dda!>bp!5zK<-V154cMOT)$z{l>`uXKXl)k#8r@-?F0# zhnj((8?8>QAu0AFw-}M>9>{&^+g*iY&6*Xcmxw2n(T6hP2KpK;cWTDiPEoFX$Deg` z>aipp%Ign02%=E%pQM!=6F4(%-&|X!|D5s1{}#(1VZMqL!dLM$30rcH*_xy%W>S#& zD~5$-&nZ+&!u%aa3oIN8J*5lHOUW}42Z6{8iZ3kUAc^x75hsH}FkX)TE|!zb0`I3; z$7ZxNDy#jirCIq5#-r>BxkpKm&m{{cTlV8%^6W=+Gxaj<(d@6MWX@K*+-wiC6YK3$ z6_Q3K-i1U=XV2!zZ@k~_u5x zT|8+~iLxpdgFmnww?ujxw&Dn@>EqCRI;$xrq46U*8jDD13}F-h&k!Y%361x{)1D_Z z9;)*Z1;bD#<0H^>V3&jxJe9(D82cnFcQF8$AkJG6P%V-Wf{5B1;p8rMt|fIRwm^(d zH*pJ_&RwJeFiO%IjR^yZ=;q^vti^$x-pTT!iLF2HXII0Cpv0rJ2YBK>tX;>ZRm%R0Oa4m z8BoO{g|h>~MUs0lYj+IltW3A2;lOn`EM08k$M5RXlOwP%NCq)0cR+~&icku+ujuNK zZY;?tYPR+;w;3xhTOE|)+*ma(=R=_3xTqvPH_C%|EQEM`f1#2gByL<8>|L`WSV9Pi zniFGE4$X=HIW^~s;7MwtM?S~%V`!QIa3iAUVZ(Vubn_07DK)1A#1GTpn-u98*<*Z> zeJFuyhMBHcF`8T3W88~m5EauTB5EA#Unl3;)H9`lzlZN{E399E0Pq2a-u z*l->mJhTQ%`~qoaZPXTeyi3LUh=KY$1%Vp$t)wkYYK<=#v_g9`CNljZVyFyi!Lar2 ztW6k|ic~FxtuxFG#>v7>EIt`#XxKPexQTAFZ=92*1BmHfFazHbPL>bjFLJWbuY69H zTrj@|4p_G=3;)mXUgVlgl;4s&Y!{5ypoIHOC3Jy0vB&?k2Kh4@Wcrl`DMkiP0R>>H4t3n1B+`I9*9 z<0vT$P?p?+z~VIShJ$1d$kmfIwbVv3FHpW8%ag;BQ)+Cr2Tc|&M-yRdr8RN!bhQT6 z5^--FG^~m#_63?T+t^?+i=R*3AzQzb9_h*uG?zb;S0!Es&#UToTH;s2lF zfU)EwF6ZQ7NxfhXu-{M^j{-}6g3FSYGV4r_PH7SfG}I~sk-l8Tp|(EonG)zMsJ5V` znR{gP@FA2QR5YCz<@H{w0Sr#<85(Phw%Scxk-`eK`;evTjX+W1Wd$At|6ymXK8`g!v9#5e!ExpVsxILDh0-03bxUY7t3M z_uxj=iKvGyO3C({rBxu!-fSoYx-$>(Qs>e1WKsTTY+i` zr>#H#)RZWXR)#$NinnItMwl=~1)-Ag zGsp>_DU4&+M9*RVpf!X!o@!Av2>)h{of6Yn)Py($eZ>062jB(4q&U`eCamKlU!@y6 z${lOxWzU@EFg&ZRH~%YEp{|wPIiJ%f$p?&p8(gGl*@z%u$^RAxF}@9#a7)sm!I$xU zN^B3IfqxDTK^d^lAzWmjIs4#+-A1<=IGeM8^FtioW68mJBn3G3nc!FBn1>6}9g6lP z=OArS;Z$^^-tz5mSm;Y+{<0?w!Ou^R;57BaZiMCw3yNJ&jXAhER`{x6hPO4g!c@sY z)sbP}sMm#R41a|oui0DV)djq-JDpD>b1viqg@3bA-IZZfZ-qW$b@*%H1tIcsRNv>u zVrM>1k$hm{78~2|XBgWDBFEM_qBT7=)quEtYZ77?FPv_)A>6P}+LLo3sWCWYd)b=m zY&vrSK?D~rr_BN;}Og6ZU_Y^IyL zW(`Lj-eB1JT!wMwXE-t3-ZI=Wnt1}2r^1BGZn8c$8L8?m!D{RYL)>>WAT9-)eLEYQ z{V>C*Qm~mEmCa_!blX!I#+IMe#E=VRwQP+=q@8rN5S`wZ0UnhjvE-is894rlaEY)@ zPk~3BQ@YyKGyaR`9s~<#e-*ZO8Ip=JO^z+WFZ}1-GyZDzNKPQ;T+V<=D`u4CjMm^g zNuE#A*ks&%;D&=jSm?wBZyRj+9jol50$JpG1H)2o28N&>70ha4jVp5UVGT_zoR2S( z|BeEK+NcR^54J*q`@MIjR8B%{7w2!)&aGLs?h_nxJOdRtq;S{KL$GY=TpU<`K#2+P z@>ZuNs+49qEF;En@(ui3IF|Jy)hoBbDK;|Qu7E>kL-Owi1O0_MXE@x#nct7Nz!hP- zvesf-8x4q#}*@&(RYExc8B3uCfNBmz&IQo7#OIebxoQaw>C)lfQyYu9l6DK+~x7+H*(mG%GbW)P=Qv)5o24@SKL#bTtHDNC`^ zaZDIo#@uTW@C9A$l}F(ec#Jzkrde>lXS`8(>x`}5&7e-iR%unPtZ(-Y)>8-rrBS(@ zShmUq_ROzxKZWBZmHTP@MJktm&03XvndR-utZj!5GtOHu?99erb{9~shlEJR*Wil+RO>NXwc11r*QyTIltO(B#uKAZ zWf{T0V{pbORCg~3n4x1;EVt59niGS;fy5gq6#$BK0``CGYE;KadG?hmcMM`0kI}EP zE`ZFFQT8k@@>>uIu6t)VRCclVZ+?m-2x#pdkaTrp-5WM1GVzS{1w=a)FttG zxvC`w-|+>(mnR`t4J??6OY7O!S&q0zFf)ka&Bqip?3k6<;i9J_p{Ed)*WDN}3A;$@ z$QeIQBB<_)#UpZ92QdU>8lcJL<>JK!Il@qh8@5?_ausW{J4_`Jt(W|@0ADA`$`fA{ zX3#bGi_9SUmB|b;(|&K5p;nC|!&l#CdTxTr3uo~j`25D)?mC@WkdtJ1!er+Brlqp{u8Vsu z))Aymlge@@G@nl2I(btjiC{N1Hj7eO{;0Red!2wcZ7Rze# z9;dR*ISmZNlxw*ZZ1(GHY<5_NQKeurIVzjYlBKeom|<-BSxpSNP*%&m1>H8dgpv0HjzPmzgSx zaiJCAun8UxpgbOA@&_L}52UveM$+9X9V|tF5r92m6qqQM0;X2S7&Hw0M)Y^eL*v6JMej#C$##RcDX_V; z(`RtZmzco^4BEXh{YI@kV)$(ry1&TX^&)~cO%pl%asKZj7=hA*s6NE5cubI!E;Hkc z3zEVvw+N6O%^-2AH~!c`ODv2La>!e3!@_z3b`N?R>Pl#Jr|Q-Q>A z#eol_dQG7?42Bh&gre#TJYdj%Ii}wc}q28msxJ$_9DiZDCyVSeqQqhY}W0dxuRGojn+5<8cyfp%%e4qK`@eQjUWkZ ztr1IsNUhQRD>y*~&R1zc$;aLa0wZnQkaB65UlyfdGK|6;W^rrQQJA1AF2N$>hoKHo zDa__Di_5c)!bDCtLlaRVpFz=>$SGf0+iT6ZDo8YEcP%xIZ;7z!IEo*IP3c#@uxSRa zFfjAYGy>+pj+;noC#-_hMnEZHZd!v(ztVtAH79W8uR}^U$eqP15^I+|VNYHLZDgv0 zghhjr*Fidb(>N5R9LH@zmgO!cv5@CX5xpEyRh%7uyUyTviQ90XG|eRdq?PH?`O8gp zudJcbRZH9DHtcLs)rHVWf_bjELkbdCWr?D)H(qH#VU2dRT=Pa6)Ag}(a}U-(s(225 zlrIJLWR1eXS%A1cNPopFEQvt%!tRNRIM-#Xsi~wZ|Kj_X)^}B#jXIvUSFYhp)*h_i z1b`T`yw;_u7LyFx(Cm*eC9^gQhY05$V3wpci`I9mS!6hDSSIAzVw|*k(eLMt_q#($ zUdPD&c1F6VBM?}4z6(_}I;(3%qp*R#6Zj~swh^Z~PvYp&zPc+mX^o@AKS7Zr7br;G zxiB(o*?oP`={7WpCl(=}fqj7if2MXum;BH3C!MuUZzZK9p_<$H_%LeKeklALSg!4# zqDFrcqft^9HTq^uV^QiUMNuOhYov`5YLPl2c~jKr%kEe^Z<}2TC4@(H1k9;;)Srg= z`BFdKr))xc%*A522`Nt%q!6O{Kg1!Zz@SqFDa8C@p3;!#48UJx0WkYk*6sk>$z&_S z6^Wv-Tj6N2`ar$n)a-HJpq0J3%`kLWe|iHpMbQ6XXg-~*#1VRv4Yr6HbF#q}D-|4# z66Xzp5`CMYWKC~TvT8q|WNvjV5*fi~ga*995b(U-BH;Yu5nwMelhrJW$Y1Cx#ZGUZ z2Q`y2f8q2L3ZEC{cp7yY73CO4I^jQ6Q4ahq-8iNwM?k|0+xD-p0lj90#X<6-9M`Kd z9Kzv;{=TwUbG-6K}a$BrXz5t1`Ad?{1Z(_q_CCrZ){@w-5n(th_ z2{xR$UX3bjNu$V&TCJ3!TJ(5z7q}`QC{y;m_7hI=y zIK=KDfvI2m{gfZWwb!9auiRF0Sqg3Kwqte`gss}SByyoivAcHtCJm9~ZQX76)oQ-Y zBM+wM$~+rz-{W@IdCzQL`)Oh*KNG0jS+^K?*u`wO^(geXxy3#Yetz|)>D z2FUEEB7L3Xq7}c)Z$5GW(v(76C4oJHD$)6b=*Ge_o&%T=bN;&+x5TV1o|%m2Re%Yz z^x<=D1_RY(JbTzMWjq^{fc<1|SJzHvzkrPA82 zdwLA2^4H)z5%F7;M66C$yk@yRUQw|@X*MWh*G)MxE+l62n%m4)-B>KHO_I?NGz_Q} z>dGr|-vvI5qHyvQ#l;Gt3K^m|bDKfBJ*LkLTxAlCt|ds*G!aZRN_p^?e*=OMNHjvV zA@Z67eg%`)93+FCXcS8YB3xKrbN8>FmzTF0-QxOl)OyS$B3C{pnfct*bdyb(WahJ} ziR8)5m&1aF;!s`*bC*dGls)_j(SL~MLxdg*r^?8GOO&gsmtk2$$^bqVr*_1hLaKVO zWJ2F&xP28ek9IQU*0e_YUnvk1F8%m0s@LSwKOfP?p%k|mgl~)KD~-rX(i^G2mmo~j zL{RGe3HUrkQu6%>MsleSqTiPKSnNkiefO`<&cw)!SaF@?67`p-CRT1yAApKU!7Su5 z9C}6vHwCgVN9AGK;M$jSwL6`6xBb6`ywM9G{(HhxJXqk2s)#4072nJVfgZg-sz&U!z$ja}s@bG+S4 zG_e#3+-#S5@Q!-wB)YJNG%L{^MzTp4hedj{tI&M9D4B6MN_}V2TPoC;Kb`Biy>zAhNXPi*f6^wP3eiUujP_>##AbISo4=aaW{> zw}WV(fvgQqiAHm*S_gNfhnouQ%?WKhg;}m=tQ`Ucx6MT60}SNc4h)kh@@!S%f)n1y z&;pzgRcf}BqSkD%LJ3>11s^c#e2xtxH+767|1;PyIr5DV^xBb+W{X$a3CC6nza9LO zeD)$!MMw)7eQFkP*YZi`!tWJ}Gvku`4m2F;kjIBcb#O{0U(GKd>?rt!ttRg=zWA@0 z-ZCskj8pCjf-y}K!L@u^SNxL*Mqn+EYCpymA0&XimXF1MxJz)D)5PoN==M12vJ{$$lEmS3yaI`75ocCbQU1KO@!|dx z){A0#%K)Ph)(Z*7G))AB)n5#sr|_U(j9?@e)*u0FVU5Lqq_B4X>NsTF2u5Yn8rM`V zX+1SHNg|{*!zhf??eDVc4C8b|10ko=?UO?7T+9n<>D+*le>s2BStM;}KL6>vjDoK~ zZq%kapKsGhghaowj9!Wjr?HHzWZBMTJLC$0EP9!3pzM7-;gM_{xjGox)7J-uP#{7H zXYjPV5YLW(?-G{stMTXG&mVLyP1$jLza{?xtNp=r?Q<%o{g@H^zG8{}ZU9V>_!GdQ zVs$K!|GAgs*Z&v?-Qe6N_KJ8U3JWgkB?jY%i-l1y#C!we!D4OmL4q-ZkbD&JMwRFU znlk99`=U|*=B&ediyqb+dVoWM_jOsvW)v#wmHn+y4;Bj5bI&+oPZ%HmN3l3GiuGTy z;XI0U1$PyJwj60RYC#t`l$8kE>MW%2Fza)kQ1z>Vz|LV|b(|5VFt?r}_7adfl`!#P z)MOdGI2B%2#4$(J@-w4bOQTitplUu1DtzJ;#(s4c_nf!1wZN6tPFl$+inc|twz1T zsOP2mqMmXq3O^r_# zEOH{5b0IZeVf#*)YWL2R{Jo-nRg6Q+M6IN5`w5gC5msafqWmdDo*IIqT5f@-`!im3 zY$R{WJqIs=0fh#tG$*PERV63?@ z<34h4fKwvbCyXp_V#6qoEdCp@VG_rA5dc4aJTtmG-@UW1&x8L~!mecSYBcw(^h(<) zadYjEckMM--*Wji+e(9jgKPWcd!u*28zL$+t*ZgMaB#{}JM4YJ&&2?uKhfHist0i?tQ;IP2>a__-dBG@k)44XMZz}V9T zjBocI4Cy6{0ON=d&gXC(4dejn=mN;U_a2Z#W9fl_#1ljS(v2ej-FrX|iv{HPfby{Q z3#ZJO!Hp>tO0DF2bNqoxq%WL@Z$QQ8#i3=DUKutoOq_Dt4I11@LbvZ$9{w z82alr`nlRYsrO(V9R$l+YQ!vQq_zGSSU$pI@kW#ZvXZ1Kms7B%%Kabw$~F@Aa;Vq$ z9_nKS)MA7MK`jjr#~3amX-bFxn02M^GBbEfvFJ0t>npHf@?D#S8QNGk@d##goamBG zwB+(2T+}L$)GEO(i+VqkC@4iM16Uz!va`UsG!@b!!`^Qdi#_88y#*Rhmp<&cL6HDC z-Jq9J6DiX5Sd4^mAA7=ZxTjbg8V=lr4d>y&Ww`n$@1oo~tJn#AYq4>YCHh0ItA4*A zP=jHBlnG>=z}SMZ0QAblurnNNwk|2`&w?L!G z6L>pKl;_Ck1}&SVBWCp-+|2O8ubYLMwy8jz{{ zHmYX5<;DiNb2uzJWF0o?gtg1bhrg2fcnCN-!5PG{7z!EyXE5xeo~D8c1EaNat5s<^ zgE<~w#hfMmsyE=7mt%(Y*|DnNN=v&~+hP@9`JGb)xDohClui zy!7GaV7wfn?;VQ2mg40wyez}Z;c%I_)?W^Pw)scU^+>$6**^;Y_*cw>%L=-EG+mFO z>#=k_j;_bk^#r<}2v>o_ljz?kFvUuXoeg5fquOBZ1aJk1H#GlW{cg}!c`}{NMx(=?;(R%vF zS#b5Q!dK3wf1d-_d;AUfd*ULjoOmw$+~%JLS2!bO2>$Gy@h=d6Hi|zNi9Z+9pOXJH zO7T;8*)b0;*Wu;gkA%zj@$!)q;PPR-d}%dYzJQnC!78zL;^n{avnSv(?Qae=w~w0I zN6qY`Cichs^x3{?3WOnVQs)n&5K!lfe+j>?#mg4FybmuQ!pk}6FCN0ndw&g= z58~zFgJ1+-!pm#sz~v2iY0QO78!rUHO$gDQc-e)QKgP@3@G?0cE=|1r8ZUDfz~%LL zc{5&~vk)$);pHQE`3t;!Z!uiHkC*ox0+$cqynO6vxO@^Xi;u&5czG>e{s=EbfR7rRHtjd*#32bVv_%jhX^nZV2KE8+4&ygY)JNAYs+ zbKr76UWmwaaL*H~;h&G;Wf`1g>K}!d=a%5I5ic*t%Ran(4KM$I7d*MyrvsmnL44Bq zcszywHoRb6WS`0@V^K7pYN_GQI-fS=Va(FUQ0KINx!~3-#h)$k2l#rc_;Zc;bDj9J zUHrL0{J9DKfYjWKe-83*fj|DOa6#w6^)vo3{JafV@0z2vt{Vj{7rhv*+)%IFF;y9b zLv0`#wbiQPf)w`Rz_kH^!Wx{J<29PFldW8DRk5(nVBZcr1E&hR*s5)>4ACpv$%f^2 zDtENKk;-U!n$G!K)ACvkuQkzVwyiyE<2~yW3dsh0Wy`UX*8}ePY@{dY45p^BR!@M2 zQ_f`zYL#7;+RT*|Nw?bsbO&a!%U@ZwPnI<9KuA0EvmQ7>S2^ zMdEV{Ch;jGdaX5>Zx9lc(Py;uj@kMqrs3n zAjM%){Hk7&_@07Ed{!3{ADD{+Mjlht@9Gta-(E0@1LoFsOVBcZC3+8xx%GYcXJ9A6 z&F_UpDyz;1o7l&|dfwS=OybcXaK_^RxlAy77mvTz)n<1#YPH60w4B9}A>KeA{HJoH z@S9;gO=RVeC+~Ui-%9Wmf!WP((gWCyJUm&&Cnd1RYbuEfpW%Ni>3R8%=;yFOGQI(N zA*O{^yWDIKx1p>qb|Omht@YO20{;zc-8!&&^BS4JB}N2es?^6)y-)Fm-PN)7L?jsW z%0#6)KGB9Gtx!y~rfSvp@K|LEn(<0dN@}gh1;b(O4GeK5o@zHN{7fzA@K*C0z8atk z{uBRONyKjkz~`UPJG3vX1wB)lQvO1)dwkhspW(mozdPa9-aheLTyF~wnP9`^7>pro zfI--SNC(lzl|y}bT#Ca(tTO6Pz9sV!&UEMKO8gxmUvSE zw6cz5gc{Gy;qhj93TYl7L8^AK!`mQD&qTJ~4#MsKDPBH>mpS0$u-&3@XDD?Jp*1iF z6~=65?vZ+8?i^4Sd{ybA8exf&Rk#6$0Dny{J`b$q+?Cu{do_D}so>dTl`#-PXOFx4 zi1Y{iG3W(i2Eu>zip2j~Fo`#GA@Sb|={`VWhs1Nw0!0|1^>Vq~{kwB#so@zSfU}?-hz{@Y*a1_Zz@05N4R1=y@ytM zSRttav>oQy>v~#O?)2)7wkWpM?~PSW27m?LReG&m>) z1No})RdHU@?kb!j3=mf9qcu20Z47?UCvB)>EbvmQ+%f2Fzw(lPPs6mfAIls=J_xj5 z_IAOT0E^USsWLb|=hfiZMf5P?dI~ zvD=$0*Y}7qv=jn%LcQjiKmmAA4eEuLltzOmDz~AtDd?|KryLo?_NCjez1-7d34BQm z2aG+688wi01MjM#2~>m2Sh6Xg36E%op3C(y$i}RplN6FNcN*HlzuM(0mYs%nl+56p zP0ZfhS%t6z1S9&r-4j(nFi{Fqb_Pbu#P=AekWFBS0vmyZ(8g$0Y(*KVw0Bp4euk-N z6SX)@i+X7ddRGR{+d3OZIXwyEnW{8BOl=vWMy&?K$$Ze+Xrl>en`+ddF!negajf5i zJlRUU-y5kx8Extf7*mYmO!{p7Ip_3a$fa@ziV_GZox~0RBKOPTiSzy_ICCZ{k#%RD ziLg`X1)aqB-}HA9+|Gz#wyK~xV}YCSF^Gc7Q*$> z%9u*M5F1GD0kpJ6QW>(Zp95Rb@IT>qH=AExQ51^x_Rbq&OPtyYGbbQLDU2KopEst* zXQjTY+HBM(!HYADxb2G5`_tppM&(-zN99XkH(;@-ydga*?VP@D-1&+8nEZI*m^=bj zSH)s-YkEw|e9Nx9_|5zn{QJT&_$ch?EEa>?(qj;cP?pjE*cF9O`J*Snym}l?X1wl$9-o|RAA+$6$MGCtF02CF3s(vK!s-^CTEZIEV~x?) z86u(nj7(S?Y_{4nF!hgf3_W^8e`z%_mDhZkUSc1WM{>`$ztf|xG2!+ z+o|j*!PmDVis>+s^=`xdI=n{}K6k%GGH4pw5(m?zsZ0y=DNh?fjrDb zwmDS?GmIol5pr%zB~>RlvIO#VjaF^JYRB=fGSGJv3%Zf3>)eI|a&<_ET%ENEVy_qm zt~p`@Rs$#$;O9C9##6|yCz)Dc=ooQFT{I`iLa-b^fR2yD>=4-H7SOMs z;!isF!rTPGNw^G*qrt$Lm8- zcfJm%n~7VruWQIV_e>c>RqQ02S1Q6$9TdzZF)d9*gsMe>Z+k<_&DtC&Rv9o{% zGSis{BZ2F5vpVBnf-3r}06Od-TGI!=@kUEdk)MS7LVr&o#Vlbv0?_$47Sb-x4;!Dm zifEAW-b;$*y{|xhBnL4DXCWo2=2gem+r_8+mjTwHF3Ky!pC1EOI|~I1$s@cc&J$Cm zET7By+6*APzjbzhofFVL!ZZkNbb*>v(n#v{04VndRt992$o8|D~S+itG3K!7+C zM8C#Jdw;Q{HCpzqZo>gBdvu7Fedi9a1xR^%H*CEcDxZ?R&?ZOA!{i$j?O0RAlV%54 zKVYl?TEN5A2e~J(!?QZt7M6*uP^Oefz)+E0?7?Im(D$Qlu$v&kjM9!8(09`^M4lyM zW+eZROPQi)l4Atha~_D9Nql=ExhY~IK@l`dlmXzA!Lep}ceSA=6L&5dl2Zv};GCIj z3Yd>As5xM>JqO?ocMkXz;+oF^P_Qh`vcL~lY_vk)_;vfS(}z08aQuOHct8k=qwMHS zuI%)inH3#MeR4&2oU7<=kV^-y>f&Bxoc}Mya=uY^-*X!dC_B$pb~m2~F7q8?iT1*2 z^uud?XVyxXFBx1ck@9ma9(S?S-zT!%$PA+30My$WtyRIi@@QLr%Ns!r2Q|CE@_LcV z=tFd0EW!jr>y^PGYhv1K>52Mhy^ZLWfE9@?*%q@1wdBwR89 z`H9QNMNbW~N#Pd_C@5A}C$kFNKkf4EkX>9WgEoU)5+{6&m&c4T!lo|yKZgE0^IGk(na(1(4geWuD*j90E;tWDOj)1Gwvc^&3G|oF zTJJ1`<{_{#<1e2F-7cYjp`U!lzYZGfEP@+U)w44X#}QVYe|NcApSj0B2%IFH*!tSi z;q(YVVoA@IbwaHmO<`&!59AWVT};Wv(cNA@#MQu&qY3jc%h7N_4Dq^z1fanD9l%(D zvp%7Bx%4ShIgcv_P4(m}l#{|ZchlGy6~ispvQFhb?vI3aPsrT8`El--Hj#akP2|woG`6r4_glZ1EHxO5+~E<$c+3qdE{*cHTM3 zoxlb>_I`+VOycF`I6nrI%gpG2>KND==3Rf>B)P5>j>kM^9gsa12;6Uq` zp@+n*10t}%e?oZnA4D!$4dZJ0KNELwkm8OD9v?gJ-ed++)a}6W1i6kUARPW?9#4P_ z21W@oUAg6}!wQHIiTB=*EcqV1yaieDO?deyynGukO?=S6%RBILA6(241=z?vJ~ptA zKHf(k?xTC9$ET;cP4x~)1ALB1vPUcyx z8;j|uZo{2&4^o_ru|j!GB6JA{;W!SO6+5okd<`s-V5-It7v$qik%_~Q74;Is*}QWL z#hJ1F=VHSmO-YzC9Equn?4?1bXf(M|Z9in-9a$`Rh9wSn8}<#zO8~t44vjFPliSLj zMc`O#R^ikoJhbCMXs~mJh*X|W{&F%VPqirA3Gi?0*|B z;odffKwrl9Y2h0}Ais=5peY5>@jVM2hgx_G`WLNd46vyzfc+2$`dD(n9!UY%6Bc00 zh+jnLmDGf$=g$+r`K!cll1=P($xwE8dX)K#;r!!RNq<_S=%vtnIs@2Yq$hP_zmuae z{}>oFEQ(%<{?(u8CcE;c?fCF7fI%qVOUXY0TJ=waON3OM0*^Xtkm?Dfd&Yn9TspyP z6}H+$%AAV7-i5#LpLfG*QazHOJdB`Fv?U-?Lhd%=XWE7aF;f3W3P%Glonc-A6%!it zq!9qFEDxiLP%wzXi;%y7x#ne3uNYl1TTeu7DHs7127*Wpc8Tc^aH{c0;||?9eIq)j z98nl0W;(zaG2sjI+QkR(DWomb$6AAZ5NRv7L7|UKw=umHWl{?x3C=HOGY&-JLPjjm z$8mUI8sdG7jdCx=^s-`hPtrn!9$>J82t9s06QRy^z&F6)vJ{t0!XajYB3ux{7{hoW zMQ452W7H$)ymSF-PbpSL8Ku%9bV_Oxk7nK0ex{6FQi4rET3WsD~?(Gk7L7R zFvucTe*rguAQwjHv=k@4%Y*rXMuxb>Ap3f;keM^yzlIHy1~)JwWH)ihIt%bj5zQWs z%9iJSGbr#2ZrJ~8u~2AX4$x{P1uBmQaP-z zW*wF}>RWK0V;KCdh(U)r_2jS~1La{4OO9Ek48u0Vw&|mmSBu-37#NafrFS0=`IRvkIFN%~4^8qD5-CJVNMa%+-#yOzVW; z@Riblo8E+Y z0%bx+D{vk!xE4kmum_g$-m`4%OfH_wNR~)0;wFZ$$)-;*#|G9@@63W7V5jj3bt~&R zH;l$CxC$G#=CDw+U?&_*W|+p>MC{*&%}Ar*doV+Vt^b4%aDixuQE;Rn=z^(Jow-wc zLQ|#0`N*hq=yg#LXQm^^<-Z10&^`WZacZXp@$2vxu8O7Zpv)<<8-@!SwQM+y?+y`s zcPsQ1qHnvK0>;QeIu~Z-$YEX15Rhqr#@yku#W_5K5mZ955t+C~w|O1rv53}7{uIF1 zS)!Nk5ea}3d+0^~U57!BZ$Om1TmO0he(m$$L)Z7>Rnq#?=uRZ$rdf^<@HPGc| zOxr(LDw{ItBH?B&Mft6%#~Cd#|uwNW&VRN6JNgm4K8CnMfhwpNrk zP>15gJol^{J(GYhF|s9+fV4K%GQl8UU_I?mo9YqPb8Z-oP4yjYIDt(yAH`4G;kHTj zBWxv+NhR80^!r&su;sC+BzVaUs-F}z=oo`)xnR1-pr;VEn#Q0)B1hT|ak3ERHIl>n z7DGU$0UCpf3l?YZ2$Lsn*v6pZD&1yun64sPFZl;OH=#j=FA9TdHU1)lihj*XgX${S zF(vkz7GP9u#JMNEmrD(ymxk41-HFyqmT`3|bW}_Q1e8-|a47 zU>zAEXdB>*0t~Db+`uyU(*ak}_F>!osIDv_C*rldIT&%UT7aL4u?Kn*`s=l-!i1Qde&InUDm43IN@yFOe zvd+q#&{K%!OJf5e7er3?al#U21Ib~HGX!KBps|6t9emfao`*rF-zqM`hCUiu5<5f%yJzxSk(EQvp)^; z-(B=-Z*K%O)1*N@3eBg}m@#RP-^goWclnPXN)!nlt@#Cbn$8YSnFbk%J6p!O zVK6e*7edJ(*I3stNn^c374&XYn-DaYme#60z$TM20J*Rezlf;NtD+bazKC?BzH9YK zrd$yPA23yP6kxy%FOe#Wn@o){xf~lNW741m_}ETOGQ03BS6Sx;xXuWwU$3;ClIYiZ z0|OLTSEpBEh#qq=<=K_m2OOR|=jBPYyK09)`fdyIg#yK#dDKnDIM0jeFG}mhn7 z77BYhI%A>XVsu zfWe3+ii&!{Kpf7MLonsmf?| zXB9q`*%k1T%oy(*f{j|`N!jKQ>f)KT}r<7uE&!X!q?dfK{rL{h3 zZGD%K;=kAca+AU=qo2TrX&G&#Kh-jN1rr}F<{YS~ml%xm&kt&w+%TF|!yITh-K6BK z8W2s9wsW#o!;h$m6#Q|p;15sa9tQ*D>=7ZGc_IQ}$Jas~}EjbFr(5@eD> zq$C3%W^K)tHOFa&hRxcVn?trV#I3D217f4O{m+S1cu4!%c-hH)wLEya)Az4JM$r~J=k*9t&a?7< zrQ2QSfmyrqwkQ&)ar4ZrzwdW3SmgTqPoVj9rcO*S@69upqy2BsI;oJc!*=pV$ZN>UjQ{?A@Xv>m6rEZEAlskx)Ez}SqcRe zwyHrwA%K__`Tks3&*p(L<@*&zj6}+}t0{&i_Onl=%1|`JN6acY#Ue;AhgpPF-(~dp zXV!midYHw}BiJx4evCkZnoS;S-d6VN)00zsq#H_}U@Lu5!F}98c?|VW(E^)W2}L)~ zaQf3?acY(uKZb_W%~Z~E1Idzex$&K>qcF>jFUDXf*K&jFdYk`ZmK$OhbJtMbaTfqr z(+1Sz@fR&O=+~@VZrq@)<(61);5wmz^~O~>*BgP+BwcWH-ZQ&R<{(I9n867EDax6g z7GXsNn(e+gIx>vhTz*>ZtYgHbsPq;P>%E2LAqHy*Y` z3SdWAp@WDnE%U(4QN?)dGG#X(2j@HPtU?7w3NzxoV9GgC7!v}8ArVA)iN!!*Emeno zVBede>?h;9O9&7XM zZg;aZvx4JH+cJ)sd1M%&H2&?RxY)N#zMUg?xYM|9nG!ETo-^ux%0+jPmg!$W^PsX` zcRJrHFy}%(O87S$)mJl&>aEa6Y>o8S!V6+5k)yIs*6hq(cP1Ye-eBYUPKI%PAaY!t zBU;l_Q;lYOxHVaBwqH2ifV{F9RT#@0qbY`)#_JMe-v2pKBqE9yIyIZdBFy^`k@Y`< zn2I#-?}exP%e=SJ4=t&s^uwoNIF4O!=|pAFTj__axiCvUfC#~SZ$r!^vE<$K!&gg1 zAGG9|(Md;{P{N_8?k>|5BSIt6Dh5kmBsf83CuKup`2rCJ$6Iu)d@%3v`mNh9)u-%= zjE>jXV{=X7OrxV_vW<_4?)(dbXiqeag-U}oC3V`L|5n54g1~cFPoVwm66PNg3nUNM zGJFR2N^qn%tdx)p;vpuMD$J_t=8ESuwfbbv-B6zg|BY2!?Q$K?5En}?*&LD#>ZG=J zSAd+@J}^ajS{xG~@1-1)76qZw%O(E-tD^MU3K=qIDfofdY3-rzvMI%Wdp}1xl9tVrX zW0)Mt3f-p@9@ETJQZ_$|w4pssf)r_HPT9nL(d1nr$ZIqFty%_qCx0&YFIK&B0Wh~2 z?XE7Cc40EGKp_4KfuzJTaDDHPCZu6UAsx_U6wr$dySEjK-7v|JCH0?A*v%ywfj0|nQMGNfmtdN;X|BgPk=i>|mG>#)~y@?qhVB+O>93c}4#}WP#jwAe)&2glW z0gj_waPy;$1l)o1k0M)_4l{XvUig_!P&W9@8tgyTVAHQOVADa1n9!hCur|mge-O%7 zcb1}?ctDy_aLl81a<+J`_Tj+uGCz-6%n|A&Z+yyVyTlg^^;<;kg9 z#X6)@-(~9Ny@)8ij-Y-u+!<8E?JyLfyWj0L95|hGSuZ@0bUJ6L>*<`r5Qbwp*K|9U zQ@t5>9AyZ68gV^xuAU|7n&c!-Idmxg6J0`4zB4GB4Rw>of|>jnk3(f2rLlgm9&j)2 zpEEZ9$>l{utF&iqem|zMD2YjN#wLz6QV)i%C5>lAnw{p1&2PD5?c9|&!9uZ3;=?u7 z2a3&? zrW}AcO~eoVT#O_kFYpfhh5uBCe&TPbm`$mwfEEzu(mycG1lCbhW`^s}{TMs&a=cQn zG-+$OP?>=Z;@cY|4LIeq^1|r~IQClo-tLL&=!6HyUe`oghj6XJv72Q&Md*8#ajJ4)k$2bE#Z!SHLA)Mn53ds2y$Wf*!}|oKJN8QNLKQmYQ=;>>R63R_ZO- zmu_wDefEOERMRa;|Kbd4y?&oP^R{5v8yTD-{^^U$P@Vu-WgJ*Umq1o^j13c@YdUar zmp)VzKGlaNx;%eQrpEPrLuxf+8;sgDhK1bACrxdC92+JxLHaQ#;09nhYIA*xZ3D^9 z&Ah8v$jpX;z1T2q7%(s*WcIn4^Mf4VxVz`UQ%+90!-(_RVnGNaj&!B{J`pFvf($j< z<&0ozZy{RJ+5NH!Q~KB7Qx5AzS%+mZ_yyZJGiuEIEr(@XX=YfGl^xa5n_Q&JLLwqv z*B8>#X6Ix^AIl`B*rr-R4>~=DuBkcvTxq1pB@ao;P^$*3M6Ul8l!RcFgphBU==?Q) zkZu;sv$pt>+g(5dh8>OhFnp2Dr1Qx#qoXm=B=hNL%wr|JLnvp=Ipa|4gy2nv^!7+b#GRsplL;x44 z0!m^^RX_tPCv!;Tp#_auifS0g$M0;p1X3?G=Iqxq}m91lwqAi00 zyb$e)#u#|<*Cn-FbcO6*njS0Ew5frz{Q8ywlCnnsZAi~_dMS_faf{nsXWujJB{y_5 z-s1h|U~Ri7>E{S$(1T>^<}owk^AZ151j{0baU>9O152Ye;Afw8vsx`xDaBk zgkmgp|4s;c@0}_6d*Lq>!tA~_Hq+#dtP?R!21XKTJ0#sf^eJqg5`G{-ewG-KLj36Z|*a?q)3o!}pjAdT1Qmq11)eb9;Y}{ha*Y>L#Pi6E3Q{Q6|mA z|2Q;X*u?*zIU0+Y`a(Fx{|`h-00=`rNoY!8$ST4N`bb#Icfgl}h4v{fjPf}th7HSd%orT*-b_&>g4Y^`FH^DyX z_LB9Cin;m4q}CgLk=siKp(o&y#HsZ!*k8yKiT1tkj>+jI#p2yK6%F2H?CT=Jdj{Dz z+ffARoHbbYWrx|0VumHz;dH?c&&KU2({Y-4R%OzRxf~Zb#uscLMG}W?nbAyKP7Lpa%Ox8f^NN25d^eX8{VE)FuC6NFMAg zYRO$6_C6H-Ajbw2*so!C+c^x~ENcG?7d8ip7t{tA@xsf5i|iHjM|g784wxTr zaBStkhLL&cR*jv7t;Te7v@#=__`w3HpPx3Gf#{UuA+UEb5u0MgR z|1-GAb19#sySTMwoBwnA{eS8D6kUHo*I&Zbe;O~pg3FdU{;$QK|A9Z-{QsrvK@0Ks z9Jp?o>(9kM3;cQF&wP5cfUXPSdXK*dt`k*%G5qnD;H3{Q2jk@seeY2GwG=Oh;bj?K z4u{Lcwf=JWv&}z(u1Dgn&HhpF$G>78TvpKSqv?7KU5};fadbVNt|!p-M7RnZo<#pX z8UO9!T|bk7*kj?i2Gr0WSnjI5k_iEx$3oY>5!xG1gg7ZNZkM znR_JTK7@>ms-bgtUUwvlGFEE9+D(n-VB)PE{5w@eUMxuo13_=W1&EDJcv*2CT#m=f zyYTWpyllY3de6rTo>A=6(Z+bdm`~@DVX1SUDx_mkKc8v=V*L-F%7!43eA1Mt3KL@- zU(Sf}JMv;&YU|{vR_a~4q6Cil_AFq0Om+7uLmo4vd`hgs=!{Q69duUt=;NC9FBklO zrTDW2{(z)x6@RV~f36dMwu?VEh(9;MACSYF@ei~LfBakFvKO`}TtDLv!%t|ZEdGqb zpKbn__{UEAM}QwX%UYGuHYS3fam{plYPt6hHDMB&+ zM^6I5StMIfhe?x2316Q;@YBdyG-&!o(sp@5+K)9xTW5%Q=nNaw!Dg#H1N2J1tMf>S zByYgmjMeEeQOU~d3V(&IbPwI+z|+;g8*_B9+3(rsHta9KdxXsesX$%+|JZx;06D5^ ze?0pnlZ5PnY|vyNnS@LS0%3^|$OeSTW(ER^vFYiq%ygxvd*~&L2#BnsEg}qxyW$Fh zAh>V1ps2WuqCWNco;wPNPuzvyIrmo8t*U#g`Yzo)^WN_}f83s`u0C~^&pqed{X*z^ z+72!$X_w((J6NCqf!sfRQS?AS%%gd38YAW+p0H2MDIjKOf>!MlJ8>74G#T$q^rvAx z2JW2#du5g@rD~=ENA*?9I4vIK&F$*XtxDuzD@~Z|2mNmacsOAl!rh(VIrwclK{QhA zwV~>e6&dC90r(2~K+{A|$;5^N{DP!{?J%_-9W;9xR5tP>KM|*6mV8wLM$3tP#eBYa zu*_-|=|=ruEJpwut9T2VK!det8QP~(-x0(LK;xXrflQ$G8ax~*I1rx54WP9N8rs{j zM>SC#vD(X25(BD(!!Xk5per)&sCfTa&E7#ZG3q2~SzEXOyf8|Qg?>IGjz1jPNwcR1cy}yz8{(7f5r#awm>jpN zJ@{57fu;ux5R_?(XPV#(-qs4SCK50NU#ukA908Dm^34bVE%>tgTOsAxWbmbN5;n+h zED=?DLAv<#6=Y||r4-mp*Cpt60{)W8B>C>jRn8-B6^5rSCAaXYE8sEb3IC70ugHUY z9TFi^1PCoXGnY-Bv_8N>m}10>mclO!@js+&v_qGjKeqn=PI`aJ`;`q%NqLt>ATJzV z&N#Ug31ikp(=;}hEw4@K%8_7l4yFo7bbZYP45XLny^m%VD!e8>tvWyl}xiC;J3dDcV z)`mnLayCraNOkk}QXq{>lFDrYZ@;m4C_%f0a4!#-uSNFlz)FglUo?J>*cgK!om^xN z5)Ag3dfA(XCK-xm0$~?L=Qm6*0c7DTqIho*vd*B$nnr}t(1!uCE)(QmM2{q?&t+gP zWe{9$cSbsEr!%l;%wfFYfDL*yd=oec#=QMH!cMA|YVw=iOo8`+ra9*sF^JHx9z*k5 zADXu{(h9-!6<^b2M6aWWKB@VLR;hyavUX^jEr-Hst9=?>a;QVWar0b9t^BBruSFKf zR({f^aF0PKY`X^8yVcuu6@byCLc{=;YN> zTL3R{x=^VOG2K?@(E1w$5J(Xot@yFi{LE#SCOTp83JeXW0zi|}X)yL#MOdy}IxPM+ za|rH}Q``bS%HZSt?QF#3*@)-Qgt-e<3!9_@YHs6rsq<7J^i;T|`F~kZ3NC8#n*ps& z7)RL>fv2$lIrCz#QAw;9NGM#l*Iipee$!C?L)UK}r&Yv_q#;|E05wEnMfupuFK z02oN4$-uaf0^_@cTMdELfpPn|F>nAW{Nb#`3?zuP-H^^5^00BJYp__(1%|6(B)L?~ zWkVQQmFUYIfH^3T$7HR(5^nkl=S1Zy)vOf_pTDC@qu>MX1Q`heXI$n`5HiojSVcpF z3^M;DMxc()F5>P;Dqmq5}-j%fISpWi-|<7h12CLS38ed61cqzlfdZ7( zQf}DZfjz5V2R30E0`?-48)c^(?K5znTI*KCMX*;H+Gr|px1R!HwMkSQXB|Sn(=i=X zDF2?YA#1*F=g`8I;8!v0@PeJ;p?8vwWcl84Za$9_Ua1S=z72$$kHpkC75zFU+wb+1 zKfn`a4eahTq;%n)s%y?ImgxQ$Zu;SL?LsQ-PPBmxCNN1iFgb#3Wdai@4#H6jI7uSi zo+*|}R(Y^k$YOsvW-*7|{$jycnb+KM`qGbzVkqdezQ{}JwY?kCk^X4R3p8xRTt0H{ z=GNyoO0fpYF&#$yX)6>Jp1Kxi{;=oJobsBXUNBgtz;NL?^Is#2U@&kWu;9>UMUB-CD_C*`mpr`5sk3CjnpVG(H2`OpWD}%?!A)*W^j0ghrowYD(;4ffubz8p zP}ocSAC%E?H*Xrf)(h6@zsFQFds%4p%`DFHo@q%pcYJsnyE!@`)Np;rD5)1zUW*_}MSCUkvr==zk%* zNz=)$c*kvSl?Sa%ZXf1?u$pN((8Sda_&yj2*MFbVn@%=)Qx8m?Qk3iz^Y>kBDQL0_ zO{Z%)BA;8K>Kd&Jt!DJ9E;Z56cDnDQpj3Mw+D`XN0s-%W5)tTPy1^ziBKuWW^xt`UHLqXR=Gn zeT4SFPQVug+ZR_fHbY@4|3Q}W_iqj)Mfgnv$5z-5o@{T2YiUwcrabIj6d0DMExHhL zjffn_RhT=AIquPbRJX=R#q~v~H_YD@Ltdk4#`+(SZ+^EwiT=TtfL58BS<@NXd68SD zMkS^E`nmlrOfFrUhX(@ekD}6}W(Z6q9D2Vc-6~^G3f8VqHP&jZc72>!jn?WF;gtBl zU-3q95*}m@X++h-1|aquG31R9>zDm>#m2;czv7Nu7W5NZ^&O{*26Z*OoYs{O6T@l9 z&*nLNh}u59kkD#L^T@+{sHtr~iRO-}E08#Nzom6$O%RTMYAjw@U3r@7i@a2~t{{yj z)|ClcqRDGug?V?s>}%Y*Qnw)-QA^^K(4bm!C9NgDCnnR7ylyRlxYDwQfQR>RT{#ZT z9aC3;L+`h=uACgKD=Qj{7gkr60b#eJR=2JojV9KW7sQa)Kn$xZe%ZaaBH5J_QDfp% z(V!Z06|FH#iQzQlm#Hx=Ys`A657(GW(daQX1~~M7OKZ$2!5VW}V^PCu%wD2+vrG(W zG_l5%V#sSChSeCq?4cS{w+Ahv#>AB45uM~-5Rs6H61b@;KP;WR7SCv$2q2 zwdGNwdZXHcB$`-TejY87vgR0Cmw8}g}?4}{VRF!E}uXtpY8FOx( zD#JBk#&v~SFcXnPGnQ$M1Hx_#Ml--5i74J0&@pyo40#R6uqxvh-K#Q^1DX+0CQcO% zsxq&nRpz;-RTv7V8E@eo!q=I%=x$$(zvcr6X~qR;*v$NGt8?b zl4xR;+!;gOs7m@pH_!Rvw9ug1=!~4LB_`7lJsiMP*pga%jo5tQn_W9$FX$vV99?)JM2CJty z24=%dzAik9q6=4Wbdl3s!i&@J8G0NAS>@q86T?RQaWilZOPGz$+HAUiS-A_&xJq~7 zruA@q&Sco0Gjw2HXKk+YBpkJa&nD=z?64p!PCka`1hjSt5(q-E{`HldQVDGaC$xmVN zQ7j(B;yzqaa}O3D#LEvr!A`@&pWbBS&xXiPhREYX=-*m%I@!)61G9kG#K};H5c`63jdq<6o}-k{74|18=~ACnNi22T#Zp|zP$*Vl z7u9{RT{ay1ly#>S(2)2W5KwLMyMNn0vO4IOKtgSOacyGWI$-68yT{fhkdr#>eh@t9 zG-?w-9t$3E-nRpuz_&yl;D$b~+FLuuJJoDgzF4WiO4ilr=Tn2uRrGmo3g@0p$Gv3} z?hCwFPHYkSE-?RU(s_U;(xEU0|HFXnEq+zWdARk%<9WihJtjxOxv~Y7M^1>Nr>DW; zr{Ol_CF5a_rwy=W9;`pcgP<^e=5RrL8V(AA1(dD{68owJa&!=^num3kgQenuT$awG zzwA7#h_6nZ*V!xV}x5F(}lijy3ZQ! z-|Xn>1Kz?@zmm2!w2lV+a-8+sK(K+Q#6(bFcW)q{?jhbs&0Ar!8JQ+BI) z+Gs&{e^|}r@$adfqSx!;!oE~s) zQHqK)Ppu8t#KOjt!+VE2?R$Y>?F6dU7ZA@~Pp|e~FlYbf9pDP6rTbGNs|Mq`-EhV~ zg^aJ;4pzWW3Gp@2Ndp^%I@dNn&4%HzVz@?ZRY%&S?*&jb6@~s>gta>DF9pA;b@<-X ziR_b3lvTL(P8qiUx6V50MDG~LPW!lJ0Tk5MTzY0l#X3}3msn18uzdZh#F=>dVXB<# zOTpfo8Eaj_dnB=Z{d#C^xC5!g(@iA53%a-)VqBb^46!ga;Zmeypl}^A09Kcz|LLc~xtib0<%Bc*I`G^ICh=$hw694jmT(e)G`~jE<8)zL%L%L&^Ol zV9R&$`tj1Q2wQgAj{~dr523Jx5s)*-*YJ6gBM8i4--#^HF+gn9y*{Jp$TKUEOwk0GJvi`{}NU#I<-&=00~KX9M1|5g7H;tqU24JhdmbtT!8 zkEm0N|LG~^i$Gqj4b8#kS&!I5gczrlsXmwL>ZOxY%w+c|_YqoI*zJH?{?UmuL* zt2U=x9mJEFQ{@3T0qyc?u>z?LbaIgf$2e$=``J~=W9wo|kC=TFR0x;9r#-mV^>WJCJW3Z>T11Ua;#ySrFTYNtJhnF`D+soXq z95p|TVvvy)pJS$azdB%TaMml}w?4plDQsuBC#AMwCp}Fa4lQB57bpSUaf+VaOwVW^ zNLMhO&gXi`S(q6>LUHhLDAYB8UI56)qDC6mk>xd*Mq{!;jd^rHVlZZN()vxQRIZS# zq*9$L5+oZ|$kHMCuk;tQkl&v!0d{|0m2}@KO!R}IhgvuCiT0ibRPm@UYAWWuJO+ic)pSG#TWPpr+g=CHJ;7;oGJqTQtkUe5*EB6d#6Z2KFJ~p%!St)>s_4k!EGJ`62?HE8LL+ zmZ|yVrNMoD04gz=n!fY&{Y|Gm%q@BQ%KkbM^^@5a($?IBEESrSK>B(Xj)F4?3+XEP?Psor8SZZHfi;ZWQv7(LAwt0iB5YdHIw;{7hz z)b-sD_e3G?&44ndZ&h#WD)jtK0rCx21{cDmvX6*_ zK~SaaKOjCL6Nbm&+g2nD^MwA)$r!pot)Yy;=cC+|;Yc9~QO@8KnTGSnQ3qc1jLR89 zbGK>_?Sjx(hI86kvj9gUYbB6 z$^Af;?GIF>rl*)${&k}-#bhQFrkL}DHgWxWtFp|ic}+Gl%e(@}tGU&fo|uD#7?)*E zpIPHC`(XO*aMA%RYcAiA*@0bRms8&`LMIPSZ^fZjDGdL&V(7(M=Yadszn)r$Z?xNbJu# z;nMwiOyWs?#O0pGbopqo{k6Fs_k# zF7!9!iN0}$1h$Z4^2`bJZT=LK-U`&iKLu)sR6Xpp^#_oj;$K%AofZ-%mM}|<>fK9+ z!c+73C&CF6{{+dG*zJIQrd;5Ui&FMc87iI# zSS!+{nc+I=bj+;)?n0Rot#)pbG&}r5QGVo;kw&rK2P%$AcU*rDxJ$ZP4I8bPjHF@q zdEWB6-ds@g9dGyz{s3JG$zB`^ZX(2f$>lDsdu^b;tU+*id8Ax@k?P=j0uA8LD^>^I zq*jTzydr2`npgNRV4PQMMP^A}aRL5E@(S{wUS8oT1M&)$<`E}%a1J4r+c(iLlDac! z>@04G95cSy6Z;ZRZ1SIq*kq|rV9Yoya&0=MFkM(Va7Au-ffD`No9Gz7*#lWQ8w9Y; zmRZ5F)QD+a!t9tWIVL3j-#!IK`xFoz{@>iEz}=Z3jn(9(Se%BldryIa?LB~B4v{Zz zs@hk=sKAx5%#1utst7)8C$YeFWcDRk;7n$lOn}B|Ha3}^gX3p58Fs_24V(0cVAQrT z*pKRc2zK%N5XdiEth-gg4WM4btqQIM5{e$8&Q=8(FreyI1?a-6z17-en9`HR-CQ7B zhJ&zd3yRu=Y%Wt7z6}-*?1o7{m0Tqclll=zo%l#TxaPo{Lhh_+y4cFYN_mo!;OcwK zq;k7pY5ewdp$f~>cfm5-va=+CrcLkB)#-j<1hTA&^_gnln9l6)D;2ASY~a-oD8ITk z1vYmmR0n!tjqBdw?g`E+OxxjQO?_VGZz>K9qzl=^HrQJtu@yHb*au4l1AKj6nJ@bx z_z5sHKE%*WDTWHL;HFxF-35w;#Lfd&=|Ijp7+~mI+6+w$F*K$=L&t6^`WfmX7)roR zNMNgE*MK( z<2jz@Nbt1nq6-t7diF%|bdo7gVN*`7&(nP52{!Dwpl9cfD89}%#J<;h5fnA{(=Qt&qRRhQd6!bhPXPRK36l)kc^+8 z3(XlZ6k=vdeP-q`M#M4jpe{q*ZJ`*rpguPXJ$KauI}oHxJ~ajW)b+Ydp&JE{!1;u+ z^?94IVSCT+D28q`V~BTBE9)~fe`C+io-K*Z)?lSSim!K?@)dSeYON+-6$ z{!I*E0TbS5%30V|t*X!2f{p1s?j==+wa=Kc7Isxf)n{$q##|v?I-EFf_qkCTd(@Pz zu&~(C}ymVC=O?ta@Zc?a9Vve9!)sBI0qR~T@4;% z%HPxwe~Xm(+nxqcR;t-ZFWqIz-?R{aN7mVQlG7vJ^g7|A`pS7YfL$s9pY$leU9eu$(5n2GL?g!YNPmittnq~LVO)j zpRd_mQy|!4daDsnA%2do&kt*(?1AVA+k`~e@B=1%O%SwE+9Y^$65LJI5^OmPOI;#( z`-B;9d~;<&ecl#qzG%ayopEW09WBOP(Vt?P1zi_)HQJ=rLzKp`_ zdJVLueqqX0xXCi9K37Y~;X$M^RnMr;n6ejcy3DH2-h!RGH}tHni?`=ZSqnE?rq*Ze zDAI7Rr?lzY4YKPAkX?t{D#z95Y@XxOVuJW0Q?|k_lV$R3#RTycrfh}VA}7~pYc>}F zf}!a&Bc4K`X=#0aCT}^E9vH-7OFHw2jx=u3<)V9Bs0VLeeHNx|h4Cub&6|v>1=#4( zW@BuKjbrMwu?PoX1A}L9e8(o-ggm62v@Tbj-IKc^N{5UzTZ%Q@EUF9)aZCmjR@7y! zdvZu&%jOlemx^(Ben+t95zm zo)pr~vGv&z9xXs?*BiC@m=ffpT5Hc23w_~v2RKiF4))`)y-kMNaiH8LW864GZIi)e z91ph1I4+LD+GO+;M?Y;cYKh~HHW@F(AwHW7%XQ#?WH1bevurX1g#$=78T7&N8k>x< z;24Qb#x-zo!X|?XI4WS14t?y3w@LRo_JP}^-x_u}MmT*@R6p0F2%?iMSXrZ4%@#M%g5;U}Ug~M@R2$6UT}U(k8wQ zosvyl3Hkt=R9~!vHmNy?e4Bt4u~&tIJc=3LM3v9L`D3EJ4(%^Qd;v41U`k1C7R+CP zU7IT@T=h;5hq`T8NGNpLf$>zBkAfI#(~D}8$?+D2bbk0Iw&_34)2X$m3z`0636~(i zN(^V313RnWK~$O2Oht#phfwQer=AZI5_Y7X@17W8fZ)dRvHPV@0wX{JZkWtHV!Nl? z9|796X}Lls51n>6#~Dto`YPU=Jdi$=#gU-l?s2uYOnMM!wG8j5P3X%PdxwW=llpVn ztW|*jraQm(ZcL^Vd#vp6_TP-JwNnRFEaVTv!|kQ?LEwXI-EMyuUgT)wF8G(uiMr!a>tcF5faOt^5TS4EmQx+*;Y@71U@QB$>^19FY1 z8aP`lR5i%N68m!yBDhNOPhI7)O7b^CBD#`9Y0%bG;1QePXqiM0nJQH+1?QD5+0i5= z)@F3zi8ftyh8Dioo2}zZ4Vm*<2#gpypCffiu&OavmjtVz)Vf9$^jTeuAs0|VNg~v` z3Mw;yaZiJAhN1~8>o-M}wMW;Stg`MRBqA$oXJqQ2TU)1QN>;jJr3Rpt7HIQSo2A0q zv<~`Ca`+^xr@pRCR!>XjDlO`gVD&UltuIn_Euwl3#%|HdZjp1zaQz1K2ix_`Z{ z;uxH7(eKUMZo*~SJR9zy93`%EYRhiYUbq%y7>8g=g;y-jrge{>F=vl5ngNp_U z#>IABL7ZHHbd|I;SMbl|7cMPWxU(@iDT*e{6@DVh6^?|r8YZA~35l3op`p!RBA$16 zn7to1&J8zz3wY1h{2i;^{Otx!Mz?;8@E)%9`|oLP>vslix}HeY6BV>Obu*?}bahA~ zqK9^Sv*1*l4NV+Ga~Eta4-P-mKaC^46go zIT;Pkhk!0=SQGE>hQ3@`@eYRAQHup-eTlojI9E_Ri=DkfjhJFago9nttnQs+DH)d3 z-M*VycE38ObISX3gDK}|;FPn33>InLh}}jkRP`%Uc1W-wVG$CIY^uZ~W4@zH+KNe0 zb%xOKHsDFE`-Vfuo0T;qi;fLS=nzTEBjgTsZY2?NyE5ewN63+$&R`8Dw04CMdDI*t zUr|<#EJQZyLBuaEkC88_vnz>_FDO$Uaf}@0VFb29DO-6lNd9IHl4q55BMXvEdLRkN z%cJB^>ikNgf^jiRx3W1+cQUu3bxn80Mfiit zwN6}RP)cDd{s~blen1zZEZ?>XiI`S=0~=WMfQQ{yAC5@-+fJ`-miB6G(C0~B=WD6@ z7Jaf7P0d`DL%JkbCAooGqtQB_hO@sDJ#el}CN%5q!KP_`dI!uOOLvu>mj?7N= zS9uJ|_v(^py8fs14CZrm-z`7vA8(rS+dInM8v~jb^z=Wbt2U9J?IMRr+&q2^ z=qh-81gs>8al3R?%qqopT@qm{X}C$|X=&BeAi=n3(-p+=v?qc)iu4VUeZShHF7-E< zsx=6BD45XCLdAE7omj;m(p4ja)D470YjhdkkxsUt*+#Y#6YmT6L1i5~QH71Md_Y-Y z;&8~BskWZ=ZD8i>Y>Sp;|HH76v)Nq|^YO5t4y(+z?^kD4vTNf#@g{HRG_QD*FBfPc z*=JQ!{lx+70nO%c`f{j?>xbqr_`bSsg)_~080<2G0WUn?=k;B6<|TpgEoI7FpV!w3 ziAWFJ@NwB=q7VcEBB{+uoeR-gA#3pTnj+UBgR4uqB4nr4p49Tr{5%_geD_OGJJR=4P? zjDh|&x+J8vuHF7xfKi^N)NX}H?CiB+-<5zNKGrlt9M=)vMx9lTa#C0|1bwX^*3~dG z(uW9%NY50RccqwOL(mY|v52x2X=IJ$%XheF=Weid6^GK72L=_~}O+&!Hlqqvb z_1`Io8W{fKq0-4i1-2V6lwto5D~0Qmg_CC2m;+{Y(*Uzs(MKdj0`st0rOvRV<5;0g zIRZ8sO&Hb+qV7wB1j{16rHg;Y1r3u%T+j?sg9PJ(HX}4hFkPHyq6=sdlD$4!*CJFr zXJAO#0f-|!N-1n0E)_KpZ_uqMEDgJskcdpfqJwnf^RVgLsukva1Nra=l-0}SVDDGf zm86Agr-=P)zFJA9ox>_pco7tjOT^xz&Y+|}y;Il54e#VUDxia83W8~_l1hcrukV{% z`@8DO6!wdA_0hish2@XsWW2RKN%=7PEp<*M&Hi;|%3K)zDj^Zs7Hc>@mImLQsfAOjaHvd(?TA#7K`a9**l_7Je z+@P!^S*V<=6^b~KdBj|+&axz8UZG5RG$JN$`o~Aj5%Zw3lA4d0fXF;z?pJ475;6BG zQyy`|EZ}{NXu8KQ%#reQW#z~sC1Soy(w#T!-R`$|K}7byg)2a*8tL5l2WUtu5C{Yi)C+ z^eHPz7AbmZEhjRMn5;U>l88wwQyy`|921N@uy^tRX$c9J?Z3esFT=_zlEq8JNNAl@ zB_uG9me;8>EQywzl_`%nT0(gWbiw8J9VU1Q#h{1Hk@9(E^~fScFHi9a%cJD8>dZ=_ zZ~7 zQ|DI_DaR^PjzEfrGh+UX&Wz9?!Ti}PbVt*W3z+jlPPJ*>oR`^~tpcnRKOA+)Von+4 zVmF3j2`9OnD4OK5PZterl1qk=h@9jSIlkTaIWDst6>s(yP6ph_tCcnEAfGJ^y-8VJ zl18eX9Nl*V2eBYpputfk6oroh*c;m**x(yoFFCcH|bJZD?H1sBA%3M4;N0$VPM-*;Gkzl?#7u1Ovaq(AOSL(E- z$Z4Rhi%0V@9>JL`7xe7h5!If011MH)Gj(xHLeYdVX`3h}4eOed#iZ8}66!vz@$IR0 zaAJ;@199mS%Btn!(npo`Bx#-6iScm>j?=Nr#RA4AS2Qj@J*du{q}#eb-nP*TLK+^R zaNNmJfM8a1C|3Q#+~7Y~*Qqd8an-RF(*cLEiZ{4GUOsgFRGnW*4E$J`G8eiYCnO?! zRvHc#Tv_6RCAzUa^Ac5$%ejT=K%x=pDvy#gRoy~-X49_Ds3bhvlqpBRLn9$znGJPR z8YEc%?7g};XI#)wXvD?MCR{*Eo1AXmy3A%lPo`MOrwiG{j!oNlZHP*4E>*5-;_!*m z36q-_i;|m5bfL+Tn~MmE(U9CscQs8E9msF4RMsx%$X=$bDoF#?PK|bCWd}Q{LI%!e zPX+~aSY(5d2h~}WbYT@uBR4#5Eefc>@6kgE&il+Q{%&=33KJZzO4fYG>V!ua<1FqM zm(OqBsm`vX_1~sUnG0ZV)+ND02gRUK=(yaR3+nESxY%vN1q85#(0*-=za?9g&AqTc zm)T!{(}|*D*PlS3Ml{S(Fk$TK7salpb=AmX*B=Op*61>RAC)o9R{OSrQE?Wy)MO^AbX$b-gvqVqk--PDP90ZU-LKf-)B{ZdKNlxXHsikBB{w zp?5DSg&R+39yqU6XIc_CHD$^Xz|qJaSsF~8nFa~gkF$md(mMDaD}rxyuj4m?JwxO^ zs%$D*MVA z(Sck*+wFwbw%umnuqw7FoMR~honi}KtXj{+l>}uHHroz}nr-vpt!k|h2av4UHiwXC zQ7TW`z(;Oyb|y=pLN}(%R$@~=T@Ic>bb7P&Sv#u3-5IS5LS$DjyuT|$-tXI#d!lGl z?zQIHUK6iv`|gQj#;mwz_{!l(D0+ zrb||#GEC}6tquMy<>1Id`;?0STGMicOuh;mTfugsaPKs{H+dj^C~FN?`iHy6*4i@Z zK|C*Hct>qQU%uEod{b>we=ZACE{BI|)16;?Hzw0V=&kH;E)dZ^3>@1N;immE_^*4aeGqT#(p4~XOH{!|ZfP~OQ3JPqrLYgWkA$-c zdJy)9;oWNCTGEXG>=Es(hqTMt6dgeD5S%`@cet~=t$U(qSM&qAR$)%2tV@E0tU6ZF z=~y6US+sRvFmDY2Qmrg;NKqdCtxYq{;tt4XTpoy1VrB}NN3b9In{;){%<~39A~FUv z)hj(M@Ji3N$SeIN-YYGmUg;yc3T9r3D!2h&NrMFAf`)nx608=^G|>g5Y*SjBvXRr! zoFfl*!V1{~IqP5`ZTlaPrxE@Z?+ijMk5jK3?K@^Zy$Q!wqL4xWqYIa9-C%;BdFA2pnS?En%cz7^$%=URr zR4$9RT@~_Tzj8%Qfz9UX-JnZ?dE@oeLXFN;=Xwn^W{_Z-y1!|*n8#XY%qW2*2+r=| z;oh&SOy*H7T@qn?XaramqiLnnAi=nxzE6V$5M?7z${|95qL3P)#o%SY_@C24t2WPZ5fFX}8yLg0UtDLeRNUi^=QL}VV_ zaI759VTIq5K7^VTFHudpIe)PXNT_wA%leCmlZ<6i!wb*jr$e22N&F;~DUU+@@cYw; z@UzDpKRwEdY7u^T;d%V*QfFQgKiiclk2rpoaQ=twSs%j9wdS~ag|dQVaT75oMAq*x zp?SPqsm`<{US6h5dBpK@9ETTf#2q43CPZ)=W%u3CDHSkGUX9R&tjqP5lvrg-)o#Aw*iUf zq{tD|UR8Wf#Af~z)OnUf%UET~BaW7%IkfmD(S^LsY36u2MOj0#US_LVjPgm%`hvp`1Q814h(Mn)f~5fR<@BW zZVe+Plh^?Tn~m~}I?s}beM*@!huBtQ<(O!!@SD3I_fq4g+p$2RIZd~1W{%DSOvEnl zN2@a~iJC>qlp|21;iQ(KEA|o+ky9%oM^76+v*HNUFB@nNgr4h_)$3rM&8v8&vaTd86tyj3 z*_l@{P%b4yqH!_iYIWu$y~WGp?c30aknvL~I)X|NY}FUalkYP(`aSA;6;7$(s%6yH zgwaM9$jfKPcd7F$iG%klQ|6+^y9kL$kI?Y>6pKTE@%4U%kn$7YOl|Hm=N^8ftRGqT z5V1XB3{rf8@(}rfI-`;h`JOW62#9E81uU_k4oiasODqoS3c|RcVbO?-7n^ValSo&# zHocj@v1ez`mc(XUOBt2rEKjM{GjSzB(S%vf2Sr)Vaqw2PHh_ammgO8vNQ{OoXD(4Q z(Q-ttvsGEioHILDS!0rRsxybQw_Ge+DY6_lDU{RUlr^q5sdFmn&Cby@dBellQjsS7 zJNSiyS=rqFgX&rprafFet;G*u)w91}YCf_JsB+s6rs z(Gc6_5k-TZLCq1t?dQr`=7QT#l~pEbs9MC~wN9o^om<&Tr*avKhBr=BF24O(omokr z_PD0m8y?>}gjV;v`cQytzf85JaTsU=5^5=-EC%Acg(WcH7o3lA6Vw@(#KTx+%3O?l zP8qBY2^QlhDvhGcW9D2?muSSrM@+bY7`LjmF>b-ebiR_yBp^~1RJ5naK5P+85KhpQ;-Owv+OdyczNj^HTeg*kG` z3G1-S+Hsewvn%P>3YwO0c$_;UtHn271E`{ ziSu@!8`YHi0|?ZJrW^_;jB-B|MY-SUs*y#xU+a=!ec!*(C4s;OV@}sHrp{wkZcnc7;`9OQd@I-2Ux~8nk?F=*6(tl}_17Y+&V{$CwKN=G!>l@skQfcQ%VJ*J z5$*Idl$Fh8FsCYOPMpDT_Nv9tZ?!T52lu7QxxUmvz*MTAfGQa)IhW3ytj@b+>^e~s z3>xk-emH(*oJRbSJ(SdB%#m@Kx^{(04UddVW0M+nWcc;KXE=M+<&Z?li)-5b^>wxgIEs}?_d-zufo zreMG1U|@`qn~RHIQ|DaL<2|B@goek(6)`~Yhl5a9{D(O#{;IBAVOZp0@uK*!s0a(c z7Wkm}XLTtgA@YneWiBW_rAvYZMG91-aP+V_7u0bYaq%7#E+8njw>Bs)CqWTfiiO<1 zTqa$p$OOhMy^RTsD623qj@t&!L;FVD0G@S*ZiKfQwi(YRBt}hO3^dRq0%M=DuDQUN zRaTrhFmmRS35;Be5dveB+?>hN>YPh@y_aetp*evuLLvT;5DJX1Gl#{^>dF-cMjjRt zfl&b#el75U@zv^5NJ8W$Wy)M&yk3_C3yc(~Mj`1^b1takG~(h+6D}YyCR-aAoz|k2 zF3^a$IahM_`9?=gH;@l3ruhlT*NE04$|($rGetr1N4i>Nt;HV@5~Cp~E+CBrP&qai zLE#Z0@i}Epb0P7c%4!pbM9x_CdQnNE03@W1#jFdeWVGa5Q2d)Z?~)$xSxqD~JSdW^ zbh`)${$LOaiJckM3dq6Ycp#ycV#>mzP8X^&Ec|-lgW^(kIV2%+j51{|C@$6|!Gae<%z-WDbT;t7}%+ zGUUOqyMC9c3>f_4^U?1U>g-DbOQve-9)kQfcIZys@epzY|E z;3{P;bAfM#vdYAPk26%AbuTpVfpjTo1k$L-iOPk%W$MgIdbSQtvo}2Ck$xAfV*#uC z9eya@?J>tdkGfig@s7tp{JIwj4EP1-Bi$}_#wGEvU70c$=`PSE!6F?+rBRGYm~%m0 zq7fHkO}Kzaw`jy7-S#vL4OZZI=%`5dP7tjTtvnP_80prDBHi0`70M#rn+b_g73o0P z5ly@=Dr=dGbe~gJnK;sMhLVnS1L;05(gj83BHd@ynU(ZxpVTya^CDe96@G^wigZt! zW8evOwF)C0j{(_87l{GC;C!U}jXL9!c=)9JT+ zxPVA^WNRbc%=5Nv+_W<)ww-P@Cbpqa!q|4cD7LMIw;HzM)({e-A-2sR3XX_sFILts z7u7CSR+c!baVDy*iS4WEvwAbdWLP*Zj$NqEo}}M;p{9u&9>G#T6;u6>+8BYWDT;f5)z{!Xw9S=j)+>%C@YwYT2Co! zOB}U08`VyU^kE7hg8v z0z%jEtqol>x9{A%wI`~%wGRy2h{%OP2_sil6uC0GaAJ|`GD2cBM6MY`!4ZM$CT0C{ zUhH~hWr@8QXQDdIt$|`TS5Ah7bJ$~ZLSCuPo}}NpTGPZ04_iw@O7J`KP}F+B+}`)8 zD^%Fr;_V&Z+!ET`FDf6i?onq|()M>LQ|4mUdv!^$Xh9KZ6fItE&INUKMqKPQ;R0gT z+}6gdc|GLFiNvO!JyC({-yl&V0vAdq3|u8q;QEKI9$Db}DWl(ZN@H(bX zRmWWLS_~u_k%Dt(s=Xk#)kQafOJ&Ljk|HU&D7HYIPf1TUpHNn}cf+IDu>wW--FqmK zZ8bOkx#~(4Ml#;`@rR_v8{aQ8AJR6d^DGI3bCfA_A?++(5-g-qI2r|$Ip$nYCuqdQ zpLJa^>HzE5^4=O86+#ci1Bp1^9O8cCU7L<|;Y4@x1De1}Xjkk9TkK*d2F)g48!TD67 z(Drk45d2hKxx&!KgCKr8Qzx`VfIuKRAK`wi&blNn9#^K!MYzWZiO6MC%}R=b0P-DM z6++JRepMIExsP@r(TI$gM~+ld6onk0%sgb;)OnVK%mii15s=ZyC0J5K9hwFSwq5Dn zy4Yu2&@gJm#j8!YfTUKsc#;myjFxe#^-A9;cbtx|6>UCM?K^Bv$%t!2u2if<}wN!C+r(m+gDULG%xs`D#}m#-*O9&x-Z7UCsW z%H*vOQl2wM%0HF$Ba4)?bdf?NEv(%GCUX9Iwu+Bu+>P3^f<%`n3?8`0kWlCqMW zYWRW4u;tW2+?w|b${LfjQ=Rj$4=@NNg>pKavZnV#>YPe?vrosHyoF8gr6N`MhnGX~ z>}hiV{6Sr@ zRmsMk_~A|^^q}ZGem1GIE{UIWlqpBxMLXg4R?ntW4}9}e%Yn_Qhm~ucxXPed!j$@MQA+(fT}-l+`es5RGNq2ruXLvKkh2pP zZs;vnO6g1`;plW@x@;vj<FpE7j2(l2dx!07AXA2qYw5@J-owM89i zhnFro)uO8xcm;yW6_QcaOEWocDfn<=-2xeEaT+W5%q&^O-yC3<%c0 z+0IfiuYeD{dnLWRntljXF=;Sef#d2LA1T-3P_X;J@x^wE6R>u7a7P zq6#*0RCiMweF5eX3Qh6A_OaqG-VdS(e?e;j=TH(`4y6YM(GLDIx&I8WR~w9x2fu^) zthe8Om*uh$0RK21{LkpxhIyW+bV;yKR>wBlF6!v5Xovy8D|Di8h6)PuSQ6PfR#_^>+5k`VZiGGzy!%!_}JkZ5K1D5*)zH3+76g;4VwU{Nh2=KRGk zl@%rHFLsHi6Ud?_orUeHt$pcgzLJ7=TY8|(TIDU@id=07)_Q1ql zzeB*8n>Pl|EFhtlQOg2nt2uBSsd>a4q0Y4=Vx}rn9&yAh<`4s`&oik^wUiIxWrI0h z)+_5r7B3OYKV%(^Co_+h7pU_riI&rqDUUc>mWt7m%^k2xFs(Ebo)K9v$IO0ZEy-dg z;+SC&buUf&Q+#7;^FocK#cpM#27eEq6Wo61Ejw7)b>W7K7nPMTE!^tb5;B}Wdgx;&HCs_zJ zzzYRr=h5>nb>1b>^A2UoBaR-vm5zS=KssLy$F3ikqvm_c`jJJAVJqE}nMcdF)p?dg z%QuuMk2qTR(FWfdzmS(1UocLQ#{h}uq{xP&4L+%P#Qa;?t~E)-{6m@Yh$DvgFC}ZR zRJ38#GlZ8D&GFLJG`tx47f)s$Ei2V|mPE^PWy&Lt7Cx6L*J)AhHAl^hmGvYWl?-zk zPIewW7pwCwiJl9UDUUdM_!bqXK~an9Rpt=7QCV5C5Hf60i50-(=sI-)Byn_&GUXA+ z5kKY$O9lo=$If6eSE!Ujk?UjT0Q#`9mSh2BIOZ9WoJY=w)H#<#&Igq#M<7RIS}&U! zOs5rUkYIDlt|QZmS~sU`A=k51w(|Ru*fANH+WSXy+&-ynBU#)UW?W2S2NY}y>J#cb zOCt6+%9J_8wi+wPL}P_?UhY)1-@7n0-KQrgG8)3>BM0&5`PiOQL43 zGUW)=XgDe6=je2K4HC@HS-R6FofQymEnWe!F`cjEGKo#q5-t!dN3DQ(i8AWNJ`Tkb zu7LRRHmDQ!jkpGod8rraqJph}*h5G}uU(2-(x1GSFCVZ1XpKk@ojoJAoykHGwM6ld6xvm+m$JEk>)MBBv_=O&@_rPC37yQb2Q?j z$Ak-5@i(Eh@ovH9i#BZPsT=P82c%M4ULy9PD4j6eJthiwf7I0_3wKWv5~Cs9&EH&2 zXUg%>Zr-4(nz?8<8%Q)Fm*y;0+YmdBpGE1sU>6}P7wcxIb1UiArV+~OhHrSRJ5H<% zzq=2Gy0gtuaHhImg`ti|L44Pd3<~^`^MURRb z>K2W-ctY1XI}N+ltqpWXZ`r+JZQ|ne0XS#p>c=mMs0h_-d0R!tx}+IcaO53xo~%vveLwf31_N0IX%o9Uz<7z z^5K$7iY9lxdz9o{@O!U1?~<w zSBTsU``F7H69G{$VFdi6C;}c0Z&ho%IH+V1a1kLf8Y19q;`%_x5j~rmlvT_HzjKuJ zB@TX^m1<{5_&E?QDUgv1b7!e@De1-5X&SrXVJ^Yz!SC5a5pKZT^0vB8g%OUoe8k~X zPMP=3-e|mjsJt6pKbtGpgJg|p)}e&Lp!S?7sC`6NpDd_7KuC;+ptgW$8?pB zab>lMV;g6zTKr1L0>UX(wqUuQGjJCzG8gI|Q)gPz$$du?0u2v!%Olm{_y3`YH=(3j z^Ef<=1rlnxp)4NaXHzQR!LI;506y0=Z2VK1G8X{WttOOX>1jFX~0e>Tt`ZB<)w{Rx;%EYZ|`cA@4Y`F8uC36z|?_ zj)FVX^(t)ParLzpKY}NN0>9*Zpu1h2b4f(ps!W*+bg$JV!2%t{rBR5n%(!fJzMI=xnF}&jcDYdaKbpZP!#8Wp{q(3=YCE|jD|RO1S&eB*K%@M zRlQt%n+PNtk;!uws+}0yYgsOqtz<|vE}V^1XHL?2J+EoshKIAoK^^#=c_@snF*o*V zb$trM7;o$|RgLWzl#g1g)ESjD{0e2tT+~{oOM*o$3O}QG@h@E`$GD(Q&WMYjns5P8 z>$uiNt$B1UO=45eo~Y?2SAumL5wcJ+VaVzfg{+t9Vv2>VgM`Fr2w8KemO;r8aqI2M zI_BcmTa*P>RHl3&DUy;4VQ*CDQ__>YUen$U4`Ig&6ybO8p*Z$c zbK`$mU8%x2#v4C=O=GO9J6@%9Oc~_8DCgESOL@8U>Tv%(7Q6X(^r73UQ$-Hs8u&{T|u#g8PR4@M)ZAMC9;g@yM#n! zMid<(brzL`&cb$d8gUl(Uz?>;{}I?UN<|!jJwbE?_Mgpl{!F~i8+*VkK@>Xzd(NK$ zV4)+h=i|K=9D#i#yvK2h> zpx_bMoUsB&U{B~49D)5JT@5oM?I9#0qe4?X)TU>7549cdwZKE|fcM0Bs25QWRnb*2 z^H5a54e(GJBp4So_-l}0b@5xe;SjliJZ@=g^SH@d4w186f|dD!232MhMwq?r7G-bu z>B5NB(|hXF(?*A{V>gwobR}2lOH}%CrFCDflFlc#6b|G{#lisYgA`Z+{GDd$wRUVr z#^Iz3IO)n#PP#0{$*}#<1!KqT9q#NNCrabKX|DW7bxE+=^A%kZtPWEM7}epsOt^qL zJg>ENc-q!N8DIxze8D3B0N&aUG$w08frRz=GEqHlgSQ&?OHUvqBI9jzD@->Jo#W^b ztMYcM+@IUkp9`pRMYB{{o7<72_JenK4dA;6;oV+s9V@D>%gj~Wp-Y0*)&#XulvCBt zI~V$lao*+)+Y+5S2NB!p{EC20wl~ct3;Z_e%ck>PMTY~wVFV3=3v{*0V%T|9tDk{< zV8u1VR}OdD8Q2!Ff3uy15AffO>|!Ntur^#8T|5{}0SZmi?c|Pw&ii~A7sjOh=F05X zCBaZ`QF}z8T-W1F-Igm<53Syw&g|?7p!(LPX?|Kq9^ctDkj@l+&8D%C5eT6CT3yvK zDA#mJgte~`&RIr4E0hKa#s&3s8YCDOG^A;eU|fvVRj1RoIHt9E$s!D-iA_a_Zlx;S zfv797DW5Kvt)Q=Yyg`UZ`GjdoL6oLErmIbc@9z*28fl7lXq<{V-B``#!mTFw8W{m~)Ed8QZ=}8#9#l=Ox$(p!frMI~EFL4_ zU|(CqX4qjunSxX5VJibnp_1g6ddy+$kvj}C4YNHWrc(b{sH>j&pIOl-3v~Mn@tff6U`O)I_>U>I?`~}LC9Xzt=cRC>vS@#=` zjm3U!q_bIa_(`5@>lQ-D<-nQR-~{Ij3d;JC^##6tOr;SLl$OWIesyjoani3$dBkzD z%#Rb|SyR4lw{$**Y7ZgiZRUu1v$CdS5!0<6J(5v!^VqpVoo`9(+^$S{#IbXXA3Np2 zJcOTgA)A7;^783S`1H|7%|Y`OWfjSSX0rxpIDvVzd`X>QNwj=HnevFEB@mIQ@+!qt z)*7sY{mb9Xq4KP0}Z?K>A_$S|8H}|{HL;tWD#?L zelSUfh2}8x6Lq#FG4ms3$|H^$E(&Feg?+icK)yHQu(5NQ1|-yyG+C&aL?K634k1(2 zxs^o7BxTAYj*x|6uM*L*f2KJ~&QR8lEJ}QbEh>i~S6;rEe5yLXk~le8nevF^#6M3H zn~X{9+)wQ*6$eswxmXBw+2+jAvQJq@vS`_A5PpJE^O(t~b1jLP%akdPIA*x$Q-(uv zLP&YNIZ|#@){HDt&Ne^_%F5&87Ij`F@$njE$|H`C#o^ck9khK`QQ%L$XpWN4DeFfT zCB9=3l%o%mn8(Uz)H#;K$|sd6k2qEq2(Tgm${)>v@}#nIWP!5Lz?}e4P+T4*PpGpi ziIU$aQyy`Y93?sF}B8r=jc#@1_{<h4hRLuZNHJYKG>}3YIJn>EekE5#B&ZjD{h? zIIZ8WtaYd2uo1$0m31X+xYMJP8_%M&qdFM^mct|)AG}+gNlDl9zIZ#gaD4FSpc1%# z?dykeITKwn{$q2yKd!D)$#KG%;h%WBb0Tv%cubvXNgRAfnKBoGzDY>5Zn&@`1eiXn zl41(Zq|4!+m9{I4v)l^>U>KA=ehrVz&RlV9GthG zOXqWC%ZDGL>QL%?iaCHzQa6O8+v(8_H_2%Ec_1a#`IiLJ3Cfg5+ygBQ0m*4Wc=fd$ z!cW>9KQC3*l5DyXGY0JmBurP5oY*{UE>&k+5;m78Q;vX*Mw5fJT4)-jL4viN-mU9M z85cBZH{zmMZKt+PFpp{IG0luSr`2MmQrfkK9LMdR%Idv)d{?fYA0$_{hPVgHJdXkB}!-33A}8}On>zudT4 zvj|8ur&+T~x^^c)EDiuisWT=CfO*Q4M;rjNT>!Wc2bSJsNGn~zyk9`**V zcsv}osIw;thmFdVM;s1wTsXj-;gZz{BQ_yC95Tm4Raq^vcsNj%eRx&*sRhTO$>&2jN9WxdGa;uJMpPyu;Jd|jPENl1KEnevE3V!j87{$e$sO_5cy zAy7PT4vK#%Yep6nrz(KLCn67vzpJw-35&ldQyy_x%NUD(VWJ{ zY6U!?Y&;N_sq-cYgbroO5kS!B-eWz4v|B@i1Z(zwO1I_AxS-u-MqD(jpK|hctCGeu z!~#w1f->r5UDyov&J{eYt!-RXIFp1t2p2 zDr1Pu0TRtgL1TARq>;f35y`NW96DyI^C^jr>B^Kx9368!bhsVFp|;5;b6}jKtQJ|{ z5z~P&;G_%;7_NYP1LZ7r1|<=(PMLB9A~f=P)-<50j0OqTK)FHJ@i8uFmTbgDvl=L~ zHn_e0S*M*IaE{k2*8y1o&+hR0;jB$`y-S@{Nl)~Sc!RgFIkTA4gSY*0DE55M-1gsA zSEyvO#&HD$_NIC_MTXk9aBDUTLtD0nBxXq z#$0Wj$o^YdOS1lAyP3a81|{c_^AB~-C6V)2Wy&LtoJBlxoaN0SH`8SfnUz4IIc=YF z4IvY`qIHb8J>!DrSw>vYq*sFkBU;K-XmZhxI}SD({O5H^G~Fr-d8=Ghwi38pGEgyo-!!`{64<3$wz>!lKFbIew*OXFt;{mN(j_5n z8J%6SNrgF@H%(V!LzWJcr1Jsu%y@-r+d(oG)RqX$11GwWu^M2)XCT2^nrXn6T5{>+ zQ_Mh92#LsG(b&V%NhoZCxp1W%>@aNKdg|CQwQ0FRCST23F#3S^-hlVw4@)1aP3q5O zvsPhvs5agCwRdB3p*qlOm8|S=H$>e^t^!nxh5TW7w!M@-=)L<6c#oruyC#kqV;_d| zI_;CzjvZsa4F2mrjjnuOuB%{{VNnGeWmq&~XpmrB(40Vn1gnQv=vHMX&s*;1dADEj z-7(}(bYf~`|ABTrpF!&R9$0YY!ptI(q^UH)pq+e(_VrB0135*i7Yn4TO!M1!;_Tr8_U#r zmBdGfGUXA+2kAv(_;6>&gvLc)WR8$M%DQPbLR?vS57MK~t0Y2pDN`PCguv`lUp_{* z!z!fMVdJTC;C zpPK{cr^@0 zMyG(lJXYG&8J5J#1ZBz*SkdUCX5HMh%SM9)YpK6Qw^7HqpuK}eTwFo8i0m)W?!;~D zNe>L>tzhr%PUV^)>-jqC_TH8qenQ>0f^p()x(H*P=35Dg=)tb2F?k(z$M@(7?NC;> zgHwlChwY%Ul4MO8-Z;(|#2gzYU2HjAu|C=Xb*?1cjva5&7WUCDaHLPt0mxKwUyAA_ zxZ>`u<~Dwlx;7U>ICeOQ??7i?ZfNJKi=#&^iN@Nl~sLJ92G zfFHvS*+-PMB3t*vyNN~D{g}z?5392$35U-sQyy_REOg<}XBDgx9{=Jvix4dSY7UD( zD{Ds<7U4tLV_*>$lTS^bQD;*U9#1J#j(~?oM#qvu8mTl$u++3qR}jVp&47%!psA?_ z3C0DTyr4mX>Eb0OX*$e0KFOVp(wa#qb9YuNgVhSoI^GQ3UWp4~nRPHR*m13D01#JG z6ihf1$=aNb zN6(uJ??BCqyZE|aJ%yT)#eJlNtXn3Ki5;6L^T*S(nq5C8KJ%Z1Gs*mY5JeZ4!!CMoqB~<5H!Z` z(^Vn!8~5mv2wOoTj<8TfE0+cd#zj_F5XJ@dp+;P6G2sFN;<2p_h-BVcVpqOc!To6h zIR7h1qSh1=M?#cH7zy7iiiCgG)gMFjGlWEIB4K>@(o`HkA<7MP^)0wgRku#OXI)J5 zfrMJhAZeajcnkYM2OV^37`d`aWMY^rn!_CHX_}+XoMbCvCZQZ@+=fQsc;k{eJdOsu z_I9Y32Rr@4r zHPu@z=0ngJ1g6y7E9U|RlvN|^0>WJi^`YU3$z#J-XHyazeae(aAvQ7t>A?^--fE7G zHz}*8$=E3@cL}acq#;!n-iqLVPW!4}_04_?kH^9#PhcEG*WB_Ccuc zGEhPu5f7_#D2a&AD^rd@ghm5_wJ~S{qd|hTbf)VH!nmM0vJn?g>1OK4MYXqDn^7rd zQZP&hQx@q;#4Cq8?M`SdbdR+s;>S394Sr0tXW~bjJqAA}*z@sYynQ0QdTt!~ZU$b> zv{%sY=FpGH^pWTBk@5CIyqaX6KyOZ=9}DnfhCP;Et;CP<_IUcSihdl0A7kz5^lBXa zXr~`Z`tfi2hH3O_5&bxless`}(kMZ^d z`mvgRBLF~L5Wek{e0arQj?m}nn^A19K%9^eYsg@Dems}g>I z31au8YV8O#OWDfM0n{=aKipZH2iIiV($!mGU3og6r%U+YtNzX1W3L~!&w$-0u%qaP zVS6wAcO3kCmGf`+*c*rKJKc+MHx5^8vpkAh4w1PBX*q7_8!e9|BVqCqc=(`FNnFvJo?gSzeyMd9aou58t z3?)C2F!}afke3a$j&S zh_;t_6tLTyZctoa9g?{X$ensAkZbF119BHT{}OUnxEDyyKD-A70j;;;i_7*E?drE;Z1Z4 z{+n%h6P<+r=48ByF2jFw3f@Eq;=kFBH_@H=Z%)OV=v@3ar{PU>HU68^@g_PR|IH)t zCb}X2%^7$Tos$3NOuUIM%71ef-b9Dxzd0LkqWkjSoP#&7_SqIHoZW_Xx((|SnDc!1 z0&SajFNkgD{+SVjhp8FS7rJklfF{Q`pl9^oB(_CA>Ay*Ai(b=zlh_u0sQ)IhEqYY{ zO=4U0ul}3Fw&-pBH;HZ0_xf)V+g{_-#6-}<`7b7#03QIt54jhpiF@4(qKUN^F=FsA z6&eGa`-X|GCNSLjZxT&l@blj!n!r%#zezNKfzf}HXyRHQ*OP$jvtLNK23G@&X50(l zx>{T7c^7Q>robn9dylLpcl^7Ngq`GM@H!8|n)dF=#ECsl|3xqIPx>!9hGSru5gtIt zZQpk4Sl||&4cs8yOgcDrOeeiUCD|7oV%MMw`z>(DtouD^!F~`9b8xRg0rpj}cdC00 zvfH=Awo>jj0HA8$9(W~MY8V)zkARbdpQK<+*u92V`ok7U=%I6U^#CfzO^d;Wg9KBq zA1*r)7lI0lxV4!OgexTr;~d$Rfka1=9PNc9>7%$+!pE`rBo?2>;>4|$MzM52O8}V!-JS>v2 z;A7~Ji327MmpEABP>BO24wE=Y;t+`gBo2=_IO5QV10xQLI4I(fhyx-Hhd3CEWHk6P z^bjOFA|AlT8gF9_x3NasSc7e>u{PFF8*8LR5+3|1Vux7Mf~ZQix=6wPYbC36Pbq59bs+JRl6LD&^qhFzhF*cI9cuQ1`gh1dwMFk`)i z7>iw@)z}r9k6oc1*%j7qc7+DTD>U#e#Io!P!!f%;2hOh0=9zhBfp*D+pC@UL$meiG6d$u?L zyMAWzR2Qg8wXqrUF||~L4$$)9f!-qQqjM^dtxf8oSGNs2vpx>OUN1Xp)5^JC$nEt&P}9No9`54tp~EKV(mV z5@Nwr@&Qs$M8ySUo(Lwi4iV<48fxB7LC7%L8VF$f96qpp4j<^Q_QIFGn`-USPi#cg2i)KY&i*vUt{sa8YtGC0>!*jp(tW8bQ%<6)yub)-vz}Dy z(Hk#?2i}Lp)|WtW%U&qXdnpv%DJb5285D2tg<@eAic>5o2K%Adu^)=l2cTFp2*oXz z;~TKSgftgb;MNK(K8?kM1NbHSZT#}Zhu~H}7XO68BB34czwipUmBQjrP*^0|xb+kk*Ss3G}z0O0+bZ-HBH!D996@IHnDyl>qG zx5`*d8pit=6!8B1*Tb#ju=p4h7D-L;{x9x;ThCx|-5c>f1`53Y^*6(ufB(i^alwq3Hb}K7k$_G>^SW_~6io;F~vKamE8syy8J9 zPWvzvzrteeN1?dk<4`>PDJU*^2#Rlg0gB@vhGNB+p?LQrP+a~MDAs=!iYFe0;w#^T z;(>2NanJXlX#YMG{Xf9BV~Y)6`@|37*59yr^^fpA#yz}0{wHv278dV@!XjB5-v8~- z;MQNT82V4VkFgN%KlER4>l;{H_TP9PqaxlP{3YDF3X564!uuE>@&0+gfm;`0@mnY? zk`dzl^-sX9ZCLy#6c$Mm@&5P!0JnaD#epaBK1NTx-|H-Y8H&57LGisKpm=fy6pLp;QJVurVjdJpEZXNo@rfg$n6eOx+pu_gF%-8f zfnv?kP<#Q4-N!)jh6EJZW1+||h2m#eyzO`>#xI9r78dI|p|~E4Z)0)U3Mf8)0u*1y z;ytUN*pY5jEWWfJii^&M;@ePIq*oG1W3MEV9y|}exeAN3&WGarSfsW>@jEE2YPB}b z#xMrq1VS4G-8Q;kRUouY7)Zk=J-&yg_ovG#>+&iI;PmGh--bwd8zRwdhy=GG61#>- z*YgmGTtg&84Ut$hL;}YU2@^vkC=3zrKSX@}5OL)YdI@E8u4iO(aL_F#c@t;G) zTMiLtIYeCJ5OIV<#O)0cCpSb~+7NMIL&RMT5$7~ST+tA5JVV6I3=w}aL_Eb1@diW0 z84QuSIYesW5UF=Vq?QelIyFRU&=9FFL!@>Lk-9KMKtDtA6@>6XMlmw0pcG6y7qOmT;dzFh?k00Sic~kJ`9BI^cNV!0f!3anD#%8hk{|^ENLpq&G4FS#dOvxZS{s5{FE0i1InN7botw9M49a2(GMFk zfC=fwqpmK96gT3#hL^kVI?w!F0L!Wsc*nbey!}B>p2fmjYXq^`usSaUqC;Ld{4Y0iV zB%u6#C@5v-tQ1)GD5prbfS>VSA^8Iyh^?F-B&P|tDvN8@nC^2b_;Mn7pU4V^+<2g zQ4sFUgPedT%kw5E;2RD>Yn)nG`wc=@Nz`)_HuaxA!+nDmI#GszgCvxn2cq^j&U7iC zt)rdXz+kaN6%^3?Pl2qxZoNxei|dj#SSn&SR)F#aK-3=gC~IjP`oLmr`fhx~PtJCE z7rWLv{s88H(9MW~i2%|2AAq#|q75#6ExkiM%I!N$ga~LS2W0K9c}_ABX;bKZEaxg- z;KR-$`Y&PV?v; z7t2$hRm8;JWeCSh?C-#DeYPXxb6nB_%wU8}IRsF!^Q__pJv(;=1#NbcCQebcf529orDf z+jarvb9!9L(Yc5WWiAyYuQ>6A@QU9-L6I+RmtZZDdIcAD$vggz?^xrB5uFsqzeC^} z3He<>*}l`$KkJ|HcY5t=8@qMvJ1&KS1p{%qEv5st;s0yx+T-LZs`P3g zlaTj&l1R8Q0Y)%QkcWzbCYih-lY~qjxGRi3)18^V%uEkG(y3L>*9qsDL1d zsGy4|t_T}JcQLR$6eJ*miXcdoMN!nlv?>ejutZ}(*Ur|-=@zKOtIzt(Z`2fR+;*jp5a6(0t}ac!C*xuVp|V8-8$cD8e^;@HzP#Yu?`XUG)J z_)?0p3>5y)3{Uc;yk4H_V}0Q|5gPL^!>Ws_{KMm_KIj*&om||xqFr+(H?(@o6(9Wz z$L9g>kIre1)x&y6Ri^<$H4`lUy!=0pDses_R7ZiuZ|l-j!>in}9!e;RK=+S7T~n+W zmf{lnDIsYAzJF+sCK+BiVp9d7csJ1fxqX^qcom@PoI$9L1dD&}8JcR(x}lLv{R#F<4ct?T05xL`FAYvmS=mHZj2 zj+HV<6!^Od|5{nYCl3-+;1jBy;Ep&GxbHLBP97u%xb6ML{yeNBeOPD-)X0@&fB9DY zST&}88bcVF#jR^vmo^hFu2TW-B=85%)`d=Oc(s6&hKxe;SCYKTkR;oo9S!v7vuy=z zP7idzeNX-g+Z-JvPhyi$lond^*_9pnxEcieG-6+Hj#fkJ$5p8z$YC;ek|u=b59B%1 z@En%bXxp>h0|g!>a8$ufU;g@!I;uz>;cHbmFqy^jZ#88I`T)^e&eO_hsXvod(38|5 zObzFP=>vx8$TX&WN6!{Gqr-aF794zP>&h28yNsQN`y>1n=Q~f(Mt|DX#U zb)|klU_*_8WtOg6bWBTjYnrlz=mR8byjUyil%eK2jVMV~Liz|v4=|*)RaK>C9Y9t6 z2{@tdx3;PxU{Zn_^-74QUjm|6FRfoyLm*00m5|;-(q9_VqiesPe709rt6ZU^PB!VD zn!8E;pIqjsE4?8~&58r6mkv3rS92j@Y9~~$km~-5R#)A>g&Kx z(uDA2J_(-9hNn(V^kmJ}2JW%**L`|lGyxQ&iI!|bk()g#L)D91Wz75hQhH`O?Kp*2K#!X!D5nx6kM@C))~xky9dC zQYi)bP9p!_ASc^J17r+sd$B1x7~RfeF(3Y{Q_N)ZzLPwI;q2;s!rHaq?Iqricj|(s zHX)Ur7+z9Q1^eSy1N&}+o%%wtkE~!Uz})WXf9D#fq^U1dQfFG$G_P!pzfeJYl4y5a ztIL`CLKD%FN-4xNu-Km@s5zHV8(@B;g5!X9#? zE_~|jBq)3p*c5|+Fm1gaOn2R&nd(t88P=d``<*u z(6BVMB}wW`D>34V6|_f**8LS-+~(BEN}MQKiav#4^GzVQ>C2iR)qazhUF=Tk#X*#O z$LaY}dof!wLn(p36Uct!%^E({Mv?+wD0RRSXV5hZa1${7%M5Vxs&ddZR|kei!d!s| zaKg|#3H>(%o!WaPLnqWM$@JJ;fP9*Ho2gc(GYkFYY&Q)qMx)#x@6WjvKXqE2LKvBi zf``vjE?(6H_yhuf`Rn>srCOb80Vj1~Lh?T(8GV~3Nge3bOCmQu^>*lYC_FPk;h+39 z&6C<84T)!j-OiZH5n(fQQ+h6 zRe-M|@EbqVsz{#A)CnA0XcLC_+yREizNHzG`{a5VVhe3Taqc%kafqQvt~W!ba2DEx z=U7nq4;Y^0#jkpKsxPz&*RRMm|4yy82xtbpM&VHAS)^rrvT0MXrF2P57=@W3v$b9vuGidogp=>E5NYl`7@Jqe>7A$b7!{&f#)lHrvj zwzMl0w*%e3=21;Cyth(yX;-Lj1&jZe$28UODqM^zUg1VR4!%u4)qKP2RjVu|OTjw9 z;lE_Y2g%D{L8A?pzwimbsdLjncrMca*%SD&VNjA>Ior|CPhwafJP+#ceag{?JzSLwo%2aT$utwQ zsx}0C;vRs%__WqWYUOaUSOq*u7eaIciJme<$vXpsQdm>CS%GL%LHeV21Qql6Gmc_X z-(+=2V+Ds%S*>=cLro6V>!jNKtX5Ox}bo zu>aLxIy!n!T?ody9B)Db`XE7Xd|qoK*_PmF12+2v(4=w;LECd6_>3V~ke2ISoEPYl zb@WK%;UQ@M)L%K}PaUkpkTR=@jn(w3ZAduIA;-qwXmzA^=tJO0(vI*={5AMi7{1hQ zrC7@L9~13X#0${TFF2Y>?N%I=%$jwJT92u!5&>UN@C7ewm85nn^?)boLWo`<(LshN zdHYgO6}kIHHxBWEbofh-3X-=kg%W3EzfJ6Lf?%CQtobkN5-0C3s*aUZK*4>6xYG^p zA!$uP!H4bC^VtUOL+a26HQ7!bWX(bZgWE(qwZJ|{*t>tPOPo3?ONUJ=yik;10mW^G zqMpKs?9}v9;7{B;P#T}TPf6}vqzxJ>Av12xCt4>46v;cl_ z8J>qCXtxsWBzS;O8;5O$trsn3U6M>5^Cn<-{#|R*_IP!}iXFy`x^!P6;9mi*|1Eg3 zP48qFe--8mWdsjU10D(245M9#-1gso2I|7yD$J3PdPYT zf}1338IfXql5RNK;D$rt?}LsMJ{-q6`y2(lNcSGcoA+uzT+z&jln__JHo69}b?v=O zoT%w2N@l6mZA(d8s^nRx>%awG*G7UahYSoXLYI1!sND&UEZX3xJK=Ya(s{SGiXp?(qe7dk7KG2uNg192zJE1b(8tlIk&Hz!Q(OLM`ck?XzLXS4^$%PP4%!iIl#Z+& zlS>`Ei{6^vn5k*j?W1}!h2FwIAq(qkKExK>8>f~Wgl-gFLYZ|L^T)G z8WYRy|35{R&ztvSXDQK!l~n8YAYG`!RIhbG;>;3M-NliryPXcNesG8`r=99l$$GG`4Zwcw0JwjWJ3GP>%Zcd>tiV=)D4w}I6I3U3-AQ>ke1 zbowa!iNUj{i)-R_70cbZHW{lq#eSNIm&5Cs%At(-6T7(RJBdSGOW$dCm?~#?zeF?F zlOM>^mg!_F7bnUBOpRA*=~@Dsxpp~S)`k7E~&r!A(3A?QkU4yn)d}c zxx@Jq-TfU8cYjK$*2c9@6c`QhGz-d+n`3a*4pK}BTuUF;JP22Zh}*@pn` z?=jjsl)$#t2Oipt0U-Dv{^x?xDLowe8G1IfJ;QZYr&k$&hS+FVzv4|qK@>^rO0&{5v+5FbqX#VSNe*K zL=*E8#)_#;GWh-#0NsTj1sYLXZBWLLi#v6l71YOwx*9%bhl472AqEvjP)`G(|Aaxc zC)lV}b7zS2G8_ej4JiWnTLPY_HCpyNE|N=A{2o00Ui?(Xv=npY?)=iY|J1JLu4XBn ze?DWczLZW-jVDbTdW8)&P9SaQP8%vNyy)A|hW?igHGZ^g=%Y5&xSz72du*uj<77jB zYeS8DA{+V#8!E0}=*`E5j=0#AS3C#Mp^FV&XhYw^7C_ekHuU{ARL+d^#Jde$YD485 zHP3?E(A73njurEGv<=;4L&uSq$AoR@M{KA$6>CEaHq;yhwV@>&YR)~{&}}x<9QCuI z7uZm9Wk zF>L7lHdJzv%U&mPe~AXgJr#=y5@XR%N2 zVMIjj>3n2&wmsi1-peba@X1&Aclh51Ygcn+T;M*tyNErn`N7Jhw)KG@TTB<$mWo^H zJR8@rR7R?Z@SLuO4c&v4{a4CWAQum|Up!bD#lvUvKQeOG0`p&2v;SRC0mA78)3&2j(!O#j6Oq(5M>6(iR8j$$tFsY}qxB^W9s=4Tmm{1OJW4wT9r0}Mj!>BuTC zw)A+hrDrd;6#w)7ePfYodT{rpw~A4$GiszB(^1OPn$MAfx{$@6F&ar6IpgKGir>*t zyw8ncys#Yc#s;@xg#qU=4{iWrPLUB3@w_IiweY`p1UdLF6NJOzGjXkiBOS^cx-`=( z>YF!}2lsc(KvI-99A%A;g4B~#YR`^))%`R6Tqc~P5_%iWlo%TJe>Vp&>RqfFuE`<%z<>E*?NnZ%4fk!ZV{$`j3sIo~fOgdg5Z$ z0g#Ez{+Oy%W@@jgp14hoU`#dsFP-Ev)46j!l22W)U6Hye{V^Ny!VYKmu-^v6o4|b9 zH!S_a1QyS}3$#Ot-++{f@n_iAiG=M~1@&-i8@;JYx*~aI*opzd#f-B=;-DVRaQVET z+UoQVN_sb+p1DgJ>1SgvSa+VgjPm%jCg%PBh%tL*D4vVQa{Gs35~wc0`w)vd#j3>% zf0w3M)r3B2qp8w)K&YBdU+x@DG@FSgwyOQw4%5UC6W2kY5uthH6s8DeZ@mOU6;sWt zut{~QJuK8z^B!z+Dg0sm$iK{m&tiUNnRu-jPG(D?I>Ht_%kZev#G&dks8Begu7xrI z9`#F3QkibA*@C1K=w2_vI$a!^;bRRiaZWOshc7!D$)<}RIZqtPMN&7a)EJz4I6v&9 zmznxy=OBHfN{{iWhf~23gqi9Lg_i^&)A`o(05MZJF7pyG{LLSOo_SZAe;p%FTU_YP zmd^69J2OHytzCs+1EiBzN!t#Tl(Ywm(=d2kq7NSBf6T!U>%#I2fN@~lkys=j^SBuw zzKraDNEE01r2I4$A+rn^K#i!FBPdO-y;2tWt$YXC|bD<;KJ5Uu{>>00L z3hYA#8}6x0n(FvLzTuZi0h{9&jwZw!@?gd0oACwI9HEHh+f({5xXM+M11d(88@2<~ zQ_3))%KuRWagHEjh??_~Gbv`5v*DnpGDq+>F>1B^h0t)06FW!Bn1F2(2;v5omio6`#RE1-)Q|GxT*cwJkUO# z{mPq+IXNi3eVg)WpB$9PY8qb$Ni_rMtEGzd_Tg{5r1rmo)Uj`d`c{WhaR_l1ChPts(Ll$f0tJvzk~QF=>7nhlDBz z$|)xKv{ot8OgVy+tQRqU9`z#iBIkap>7|jUYmy?kV}?7nAeJJcvU4HCxd$v7%J@0lwGL1L3SSLnoD)ZJcavwB9|T(4HgH@-8N$cF#9H2ZL{GM(sN<|B>=@WpA#cfctZ8Mu*<#fUTlZkYli4e0 zTe52L2KEwFX2fIy!kfVI4_rj`U{UiB&Z4(cjo%58AG9R9Zn5IOsl+T*1rXa zHF4e+OASVAV-}#RnW48)nT|~s5yLb3#yCNol#}&>PlkH{J>Jzgs2IP=bd%SkQ)IqF!N~XMpjxwe z3&~fPAaY1b&6!5m7PLBvc`IRKVTeCYG{>G@jPPy%)%CeAEm&oR6+1lBjAD* z1W!`%F1{14H9@e)2)L32!7q$}OGXepX9Qdtg5cLiz@;AueoMhbf^tCzg5Mbd7iuVQ z7G)sV%NVlE!8H^JUNZu&jX>}xBj7>^1b;CCE_p!UE^|Qe55|xM1Fl>^@RrN8fJ+e& z>}LdAQh>l+Fo0k*W0-XS2wa0d1mhXQtN=hT$p~nehhVA^(BKZi3?raD9Rk;84#C?P z!|a`b;2;WQy9|xj5WJm&DO57;(hwX>fiX8j&_sbTA470B1;!u@fou7NU?F1|(=G%@ z83Ap!5FBd+G{QpgUL&AI6$0003c(4CVT_>=EHVNbIw5E_0@^VlSZ)L~Q9|I_A|Y7C z7-pjm1ZyZT#zF|zQDDq~5Nx2p*!3Vdg#u%xgTS@KL2xQ#81otgAECh5${^^Vz?iy- zL4mPPK~SI|!xu%P5(M287=sW5MGA~X2Z9m>vUi3?83@W07%K||TPZL$6bQCaAe&-n zA%Wnd6d2nF1g?z(f{!zXF3+I0j+)ja+%|Y-j3e5Zr0(Tw;!FL$LOs*hsCs7c5pE1n*2!eZ!fKwg_b{PR@ zFAzLn1e}CG;Lb51c#tv76aa#UjDQ1s2p*xp4Amic+z2=nhu{e#;NTj9r;LC@X9%7# z0*;d*_$38q01UyejDRCs2wpG(4qqX7$p|<=h2Rw<;7}BTy+**HCj_q<0SA~6xPwUu z-e3$fDum!oBjD%`f`1qR2Wk+!f84f{kfDv%R4+P_kfI}My z+yM;)lNrN|Qy`dT1RQ`s&}al4WI!<62soC2U=9VcSLn18DbSmQD*F%QOFi7`Q?Bec zP|Ou&ztGXBzbE|*!XS`sK=S=RRqZ;#gP(Rh_%X(VA6Pv2NyLL+H9Yv~!h;_hJot&h zgC7<=_&LFY9}ztG>A-{E2RzuLmJA*p~2M?Z<h9w=Z>)x>2Okn&pU4ZVdknhUt8SGHd@`8`OveXvR1&yGr?+0qd@ zN0sTrUJg``?*&n*{T-D_9675^8XHxge*wA_*5e31_M_m?4Xkq)6P=L0sy8M`dC#jF(&H1h!{Mg+Tz)H#gAWi8 z0W;hHva>=-*fck+C)?KtOAAxYc0&XX*Xx+@MmHSBo)BduvC0uv)=LFNJKar;?ILQz N2Htp(&TP3o^Z(1>2mb&7 literal 1722997 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 cwYu!m)WcrM~9mrWi? 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%0D)YkDlUMALsbPnoK016ZA5=5pj4`2h(Vd8 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 diff --git a/docs/html/.doctrees/sections/Dataloaders/lut/abstractLUT.doctree b/docs/html/.doctrees/sections/Dataloaders/lut/abstractLUT.doctree index 87cb2d420d9d920ebb761fd230e302acf580d612..07ff0f5e4a0def8ae869b272610fe26523d35c01 100644 GIT binary patch delta 4668 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 diff --git a/docs/html/.doctrees/sections/Dataloaders/scalar/abstractScalar.doctree b/docs/html/.doctrees/sections/Dataloaders/scalar/abstractScalar.doctree index e503557bc56fda3e0b0fc08a75e8d9e42c1c50bb..89bcefe460aea9d6958a1030a1cee6810ef819ec 100644 GIT binary patch delta 6150 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 delta 8734 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 E7fI(c{Qv*} diff --git a/docs/html/.doctrees/sections/Dataloaders/vector/abstractVector.doctree b/docs/html/.doctrees/sections/Dataloaders/vector/abstractVector.doctree index baa8429f53860e088f6acf1d172bf63cb9a1718a..784320825d2acb2bf2e798e415c934b549781362 100644 GIT binary patch delta 6282 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 xVmD6-F4|LO~ diff --git a/docs/html/.doctrees/sections/Mesh_Construction/Mesh_construction_classes.doctree b/docs/html/.doctrees/sections/Mesh_Construction/Mesh_construction_classes.doctree index dc294653c77556c3f10a3e87b0c7e08ae406e076..ee85b2d9de7fe9f6f309b270434267564f1a9bdc 100644 GIT binary patch delta 6863 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 PHPqJog~1b%ro#UPq{(D> delta 6586 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 diff --git a/docs/html/_static/documentation_options.js b/docs/html/_static/documentation_options.js index c8b0f661..a88fb686 100644 --- a/docs/html/_static/documentation_options.js +++ b/docs/html/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.1.6', + VERSION: '2.0.8', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/html/genindex.html b/docs/html/genindex.html index 7376b6ba..003335d6 100644 --- a/docs/html/genindex.html +++ b/docs/html/genindex.html @@ -3,7 +3,7 @@ - Index — meshiphi 1.1.6 documentation + Index — meshiphi 2.0.8 documentation @@ -14,7 +14,7 @@ - + @@ -328,12 +328,6 @@

G

-
  • get_dp_from_coord() (meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader method) - -
  • get_hom_condition() (meshiphi.dataloaders.dataloader_interface.DataLoaderInterface method)
      @@ -349,8 +343,6 @@

      G

    • get_neighbour_case() (meshiphi.mesh_generation.neighbour_graph.NeighbourGraph method)
    • get_range_end() (meshiphi.mesh_validation.mesh_validator.MeshValidator method) -
    • -
    • get_val_from_coord() (meshiphi.dataloaders.lut.abstract_lut.LutDataLoader method)
    • get_value() (meshiphi.dataloaders.dataloader_interface.DataLoaderInterface method) @@ -1116,7 +1108,7 @@

      V


      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/index.html b/docs/html/index.html index 433cb9c8..6437c636 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -4,7 +4,7 @@ - Welcome to the MeshiPhi Manual Pages — meshiphi 1.1.6 documentation + Welcome to the MeshiPhi Manual Pages — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -162,7 +162,7 @@

      Welcome to the MeshiPhi Manual Pages -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/objects.inv b/docs/html/objects.inv index c710f0dbb17f70363aefa122676e38a0c3991210..ca2b08d83cc29ce357999b3e25ea8ee3e16bcca3 100644 GIT binary patch delta 5282 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

      dZX_2 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 B1rY!M diff --git a/docs/html/py-modindex.html b/docs/html/py-modindex.html index bc616cc3..9f36a14f 100644 --- a/docs/html/py-modindex.html +++ b/docs/html/py-modindex.html @@ -3,7 +3,7 @@ - Python Module Index — meshiphi 1.1.6 documentation + Python Module Index — meshiphi 2.0.8 documentation @@ -14,7 +14,7 @@ - + @@ -341,7 +341,7 @@

      Python Module Index


      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/search.html b/docs/html/search.html index 484c3ae1..b6beaa51 100644 --- a/docs/html/search.html +++ b/docs/html/search.html @@ -3,7 +3,7 @@ - Search — meshiphi 1.1.6 documentation + Search — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -99,7 +99,7 @@
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js index 27fca3a9..455e6bef 100644 --- a/docs/html/searchindex.js +++ b/docs/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index", "sections/Code_overview", "sections/Command_line_interface", "sections/Configuration/Configuration_overview", "sections/Configuration/Mesh_construction_config", "sections/Dataloaders/AddingDataloaders", "sections/Dataloaders/DataLoaderInterface", "sections/Dataloaders/Factory", "sections/Dataloaders/lut/abstractLUT", "sections/Dataloaders/lut/implemented/Density", "sections/Dataloaders/lut/implemented/LutCSV", "sections/Dataloaders/lut/implemented/LutGeoJSON", "sections/Dataloaders/lut/implemented/Scotland_NCMPA", "sections/Dataloaders/lut/implemented/Thickness", "sections/Dataloaders/lut/index", "sections/Dataloaders/overview", "sections/Dataloaders/scalar/abstractScalar", "sections/Dataloaders/scalar/implemented/AMSR", "sections/Dataloaders/scalar/implemented/BSOSEDepth", "sections/Dataloaders/scalar/implemented/BSOSESeaIce", "sections/Dataloaders/scalar/implemented/BalticSeaIce", "sections/Dataloaders/scalar/implemented/BinaryGRF", "sections/Dataloaders/scalar/implemented/ECMWFSigWaveHeight", "sections/Dataloaders/scalar/implemented/ERA5MaxWaveHeight", "sections/Dataloaders/scalar/implemented/ERA5SigWaveHeight", "sections/Dataloaders/scalar/implemented/ERA5WaveDirection", "sections/Dataloaders/scalar/implemented/ERA5WavePeriod", "sections/Dataloaders/scalar/implemented/ERA5WindDirection", "sections/Dataloaders/scalar/implemented/ERA5WindMagnitude", "sections/Dataloaders/scalar/implemented/GEBCO", "sections/Dataloaders/scalar/implemented/IceNet", "sections/Dataloaders/scalar/implemented/MODIS", "sections/Dataloaders/scalar/implemented/ScalarCSV", "sections/Dataloaders/scalar/implemented/ScalarGRF", "sections/Dataloaders/scalar/implemented/Shape", "sections/Dataloaders/scalar/implemented/visual_iced", "sections/Dataloaders/scalar/index", "sections/Dataloaders/vector/abstractVector", "sections/Dataloaders/vector/implemented/BalticCurrent", "sections/Dataloaders/vector/implemented/DUACS", "sections/Dataloaders/vector/implemented/ERA5WaveDirection", "sections/Dataloaders/vector/implemented/ERA5Wind", "sections/Dataloaders/vector/implemented/NorthSeaCurrent", "sections/Dataloaders/vector/implemented/ORAS5Current", "sections/Dataloaders/vector/implemented/SOSE", "sections/Dataloaders/vector/implemented/VectorCSV", "sections/Dataloaders/vector/implemented/VectorGRF", "sections/Dataloaders/vector/index", "sections/Examples", "sections/Installation", "sections/Mesh_Construction/Mesh_construction_classes", "sections/Mesh_Construction/Mesh_construction_overview", "sections/Mesh_Construction/Mesh_validation", "sections/Outputs", "sections/Plotting/mesh_plotting"], "filenames": ["index.rst", "sections/Code_overview.rst", "sections/Command_line_interface.rst", "sections/Configuration/Configuration_overview.rst", "sections/Configuration/Mesh_construction_config.rst", "sections/Dataloaders/AddingDataloaders.rst", "sections/Dataloaders/DataLoaderInterface.rst", "sections/Dataloaders/Factory.rst", "sections/Dataloaders/lut/abstractLUT.rst", "sections/Dataloaders/lut/implemented/Density.rst", "sections/Dataloaders/lut/implemented/LutCSV.rst", "sections/Dataloaders/lut/implemented/LutGeoJSON.rst", "sections/Dataloaders/lut/implemented/Scotland_NCMPA.rst", "sections/Dataloaders/lut/implemented/Thickness.rst", "sections/Dataloaders/lut/index.rst", "sections/Dataloaders/overview.rst", "sections/Dataloaders/scalar/abstractScalar.rst", "sections/Dataloaders/scalar/implemented/AMSR.rst", "sections/Dataloaders/scalar/implemented/BSOSEDepth.rst", "sections/Dataloaders/scalar/implemented/BSOSESeaIce.rst", "sections/Dataloaders/scalar/implemented/BalticSeaIce.rst", "sections/Dataloaders/scalar/implemented/BinaryGRF.rst", "sections/Dataloaders/scalar/implemented/ECMWFSigWaveHeight.rst", "sections/Dataloaders/scalar/implemented/ERA5MaxWaveHeight.rst", "sections/Dataloaders/scalar/implemented/ERA5SigWaveHeight.rst", "sections/Dataloaders/scalar/implemented/ERA5WaveDirection.rst", "sections/Dataloaders/scalar/implemented/ERA5WavePeriod.rst", "sections/Dataloaders/scalar/implemented/ERA5WindDirection.rst", "sections/Dataloaders/scalar/implemented/ERA5WindMagnitude.rst", "sections/Dataloaders/scalar/implemented/GEBCO.rst", "sections/Dataloaders/scalar/implemented/IceNet.rst", "sections/Dataloaders/scalar/implemented/MODIS.rst", "sections/Dataloaders/scalar/implemented/ScalarCSV.rst", "sections/Dataloaders/scalar/implemented/ScalarGRF.rst", "sections/Dataloaders/scalar/implemented/Shape.rst", "sections/Dataloaders/scalar/implemented/visual_iced.rst", "sections/Dataloaders/scalar/index.rst", "sections/Dataloaders/vector/abstractVector.rst", "sections/Dataloaders/vector/implemented/BalticCurrent.rst", "sections/Dataloaders/vector/implemented/DUACS.rst", "sections/Dataloaders/vector/implemented/ERA5WaveDirection.rst", "sections/Dataloaders/vector/implemented/ERA5Wind.rst", "sections/Dataloaders/vector/implemented/NorthSeaCurrent.rst", "sections/Dataloaders/vector/implemented/ORAS5Current.rst", "sections/Dataloaders/vector/implemented/SOSE.rst", "sections/Dataloaders/vector/implemented/VectorCSV.rst", "sections/Dataloaders/vector/implemented/VectorGRF.rst", "sections/Dataloaders/vector/index.rst", "sections/Examples.rst", "sections/Installation.rst", "sections/Mesh_Construction/Mesh_construction_classes.rst", "sections/Mesh_Construction/Mesh_construction_overview.rst", "sections/Mesh_Construction/Mesh_validation.rst", "sections/Outputs.rst", "sections/Plotting/mesh_plotting.rst"], "titles": ["Welcome to the MeshiPhi Manual Pages", "4. Background", "3. Command Line Interface", "5. Configuration Overview", "5.1. Configuration - Mesh Construction", "7.6. Adding New Dataloaders", "7.1. Dataloader Interface", "7.2. Dataloader Factory", "7.5.1.1. Abstract Look Up Table Dataloader", "7.5.3.1. Density Dataloader", "7.5.3.2. LUT CSV Dataloader", "7.5.3.3. LUT GeoJSON Dataloader", "7.5.3.4. Scotland NCMPA Dataloader", "7.5.3.5. Thickness Dataloader", "7.5. LUT Dataloaders", "7. Dataloader Overview", "7.3.1.1. Abstract Scalar Dataloader", "7.3.3.1. AMSR Dataloader", "7.3.3.2. BSOSE Depth Dataloader", "7.3.3.3. BSOSE Sea Ice Dataloader", "7.3.3.4. Baltic Sea Ice Dataloader", "7.3.3.5. Binary GRF Dataloader", "7.3.3.6. ECMWFSigWaveHeight Dataloader", "7.3.3.7. ERA5 Maximum Wave Height Dataloader", "7.3.3.8. ERA5 Significant Wave Height Dataloader", "7.3.3.9. ERA5 Mean Wave Direction Dataloader", "7.3.3.10. ERA5 Mean Wave Period Dataloader", "7.3.3.11. ERA5 Wind Direction Dataloader", "7.3.3.12. ERA5 Wind Magnitude Dataloader", "7.3.3.13. GEBCO Dataloader", "7.3.3.14. IceNet Dataloader", "7.3.3.15. MODIS Dataloader", "7.3.3.16. Scalar CSV Dataloader", "7.3.3.17. Scalar GRF Dataloader", "7.3.3.18. Shape Dataloader", "7.3.3.19. Visual_iced Dataloader", "7.3. Scalar Dataloaders", "7.4.1.1. Abstract Vector Dataloader", "7.4.3.1. Baltic Currents Dataloader", "7.4.3.2. DUACS Currents Dataloader", "7.4.3.3. ERA5 Wave Direction Dataloader", "7.4.3.4. ERA5 Wind Dataloader", "7.4.3.5. North Sea Currents Dataloader", "7.4.3.6. ORAS5 Currents Dataloader", "7.4.3.7. SOSE Currents Dataloader", "7.4.3.8. Vector CSV Dataloader", "7.4.3.9. Vector GRF Dataloader", "7.4. Vector Dataloaders", "2. Examples", "1. Installation", "8.4.1. Mesh Construction - Classes", "8. Methods - Mesh Construction", "8.4.2. Mesh Validation", "6. Outputs - Data Types", "9. Mesh Plotting"], "terms": {"i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53], "tool": [0, 1, 30], "discretis": [0, 1, 4], "environment": [0, 1, 3, 4, 5, 15, 50, 54], "data": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52], "non": [0, 1, 4, 50], "uniform": [0, 1, 4, 50, 52], "resolut": [0, 1, 2, 4, 23, 24, 25, 26, 27, 28, 31, 34, 40, 41, 48, 50], "base": [0, 2, 4, 5, 7, 9, 12, 13, 15, 17, 20, 50, 52], "varianc": 0, "thi": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 15, 16, 17, 18, 19, 21, 22, 32, 33, 34, 36, 37, 38, 40, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], "softwar": [0, 1, 2, 3, 49], "packag": [0, 1, 2, 3, 48, 49, 50], "ha": [0, 2, 7, 9, 10, 11, 12, 13, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 49, 50, 53], "been": [0, 2, 7, 15, 18, 19, 30, 44, 53], "develop": [0, 1, 30, 31, 35, 39, 48], "british": [0, 30, 35], "antarct": [0, 9, 13, 30, 35], "survei": [0, 30, 35], "ba": [0, 2, 48], "initi": [0, 4, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 51, 52], "part": [0, 39, 53], "rout": [0, 2, 3], "plan": [0, 2], "research": [0, 17, 22, 30], "vessel": [0, 3, 50], "rr": 0, "sir": 0, "david": 0, "attenborough": 0, "though": 50, "can": [0, 1, 2, 3, 7, 8, 10, 12, 15, 16, 17, 18, 19, 20, 22, 29, 31, 33, 34, 36, 37, 38, 39, 43, 44, 46, 47, 48, 49, 50, 51, 53], "appli": [0, 4, 35, 53], "ani": [0, 2, 4, 8, 10, 11, 16, 32, 37, 45, 48, 50], "geospati": [0, 50], "The": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 46, 47, 48, 50, 51, 54], "written": [0, 3, 7], "python": [0, 1, 3, 48, 49], "open": [0, 3, 5, 14, 35, 36, 47, 48, 50, 53], "sourc": [0, 2, 7, 10, 11, 32, 34, 35, 36, 45, 47, 48, 49, 50, 52], "contain": [0, 2, 4, 8, 11, 15, 16, 21, 33, 34, 37, 46, 50, 52, 54], "limit": [0, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50], "plot": [0, 1, 2, 4, 48], "function": [0, 1, 4, 5, 8, 14, 15, 16, 17, 36, 37, 47, 48, 50, 54], "which": [0, 1, 2, 4, 6, 15, 16, 18, 21, 35, 37, 40, 43, 48, 50, 52], "describ": [0, 50, 51], "mesh": [0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 14, 15, 16, 32, 34, 36, 37, 45, 47, 48], "section": [0, 1, 2, 3, 4, 48, 49, 50, 51, 53], "For": [0, 7, 15, 33, 46, 50, 51, 53], "extend": 0, "we": [0, 1, 3, 15, 35, 49, 50, 51], "recommend": [0, 49], "us": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 18, 19, 21, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 40, 41, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54], "geoplot": [0, 48, 54], "also": [0, 1, 2, 3, 4, 17, 37, 48, 54], "avail": [0, 2, 4, 7, 8, 9, 13, 16, 17, 18, 19, 23, 24, 25, 26, 27, 28, 29, 30, 37, 38, 39, 40, 41, 42, 43, 44], "follow": [0, 2, 4, 5, 7, 8, 15, 16, 33, 37, 46, 48, 49, 50, 51, 53], "github": [0, 2, 3, 4, 49], "repositori": [0, 49], "more": [0, 14, 15, 16, 18, 19, 36, 37, 42, 44, 47, 50, 51], "inform": [0, 1, 4, 23, 24, 25, 26, 27, 28, 31, 40, 41, 42, 48, 50], "project": [0, 2, 8, 15, 16, 18, 19, 36, 37, 44, 47, 50], "pleas": [0, 51], "visit": 0, "amop": 0, "websit": [0, 18, 19, 23, 24, 25, 26, 27, 28, 30, 31, 39, 40, 41, 43, 44], "our": [0, 50], "codebas": [0, 1], "ongo": 0, "yet": [0, 33, 46], "complet": [0, 8, 11, 16, 33, 34, 37, 46], "contact": 0, "content": 0, "instal": [0, 48], "gdal": 0, "option": [0, 2, 3, 4, 5, 7, 8, 15, 50], "exampl": [0, 1, 2, 3, 4, 5, 15, 50, 53], "creat": [0, 5, 7, 9, 12, 13, 14, 15, 33, 34, 36, 46, 47, 50], "digit": [0, 2], "environ": [0, 2, 4, 49, 50, 51], "command": [0, 3, 48], "line": [0, 3, 4, 36, 47, 48, 50], "interfac": [0, 5, 15, 48], "create_mesh": [0, 48], "export_mesh": 0, "rebuild_mesh": 0, "plot_mesh": 0, "background": 0, "code": [0, 2, 6, 15, 48, 50], "structur": [0, 3, 9, 50], "configur": [0, 1, 2, 48, 50, 51, 53], "overview": [0, 1, 50], "construct": [0, 1, 2, 3, 10, 11, 15, 32, 34, 45, 48, 52, 53], "config": [0, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53], "valid": [0, 51], "output": [0, 1, 2, 4, 15, 16, 35, 36, 37, 47, 48], "type": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 50, 52, 54], "json": [0, 2, 3, 4, 5, 7, 48, 50, 54], "file": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 50, 52, 54], "dataload": [0, 1, 50], "factori": [0, 5, 15, 34, 47], "scalar": [0, 4, 5, 7, 8, 10, 11, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 35, 37, 46, 47], "vector": [0, 4, 7, 15, 33, 38, 39, 40, 41, 42, 43, 44, 48, 50], "lut": [0, 7, 8, 9, 12, 13, 15], "ad": [0, 4, 15, 48, 50], "new": [0, 14, 15, 18, 19, 36, 37, 44, 47, 50], "method": [0, 1, 5, 6, 7, 8, 14, 15, 16, 34, 36, 37, 47, 48, 50], "design": [0, 10, 11, 32, 34, 45], "case": [0, 4, 8, 15, 16, 37, 50], "addit": [0, 1, 11, 17, 39, 48], "aim": 1, "manual": 1, "provid": [1, 2, 3, 7, 8, 11, 12, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 50, 52, 54], "user": [1, 2, 3, 5, 8, 14, 15, 16, 36, 37, 47, 54], "all": [1, 4, 6, 7, 8, 16, 23, 24, 25, 26, 27, 28, 36, 37, 40, 41, 47, 50, 52], "thei": [1, 3, 4, 15, 36, 47, 51], "need": [1, 5, 6, 7, 8, 14, 15, 16, 35, 36, 37, 47, 48], "run": [1, 48, 50], "set": [1, 2, 5, 7, 8, 11, 16, 21, 33, 34, 36, 37, 46, 47, 50], "hope": 1, "suppli": [1, 3], "each": [1, 2, 4, 5, 7, 8, 15, 16, 35, 37, 50, 51, 52, 53], "allow": [1, 2, 3, 4, 7, 16, 37, 49, 54], "understand": [1, 17], "throughout": [1, 51], "separ": [1, 4, 5, 15, 47], "stage": [1, 2], "broken": [1, 46], "down": [1, 15, 46], "1": [1, 4, 5, 13, 16, 20, 21, 31, 33, 34, 35, 36, 37, 50, 53], "read": [1, 3, 5, 6, 7, 8, 10, 15, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 38, 39, 40, 41, 42, 43, 44, 45], "differ": [1, 14, 17, 21, 37, 39, 43, 47], "dataset": [1, 4, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47], "outlin": [1, 3, 49, 50, 51], "form": [1, 4, 6, 8, 16, 33, 34, 37, 46, 48, 50, 53], "input": [1, 3, 7, 50, 51], "should": [1, 4, 5, 8, 11, 15, 16, 37, 48, 50, 52], "take": [1, 4, 10, 11, 13, 32, 40, 45, 51, 52], "tip": 1, "pre": [1, 49, 50], "process": [1, 2, 4, 15, 39, 52], "your": [1, 15], "2": [1, 13, 16, 30, 31, 37, 50, 53], "gener": [1, 3, 4, 5, 6, 7, 8, 9, 13, 15, 16, 18, 19, 21, 23, 24, 25, 26, 27, 28, 29, 33, 34, 35, 37, 40, 41, 42, 44, 46, 50, 51, 52, 53], "represent": [1, 4, 50, 52, 53], "condit": [1, 4, 6, 7, 8, 15, 16, 37, 50, 53], "In": [1, 3, 4, 6, 7, 15, 33, 35, 46, 49, 50], "class": [1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 51, 52, 54], "ar": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 33, 34, 35, 36, 37, 38, 40, 41, 42, 46, 47, 49, 50, 53], "defin": [1, 4, 5, 7, 8, 14, 15, 16, 17, 32, 33, 34, 36, 37, 45, 46, 47, 50], "give": [1, 4, 39, 40], "dynam": [1, 39], "split": [1, 8, 15, 16, 48, 50], "finer": 1, "region": [1, 8, 10, 11, 13, 14, 50], "spatial": [1, 4, 15, 23, 24, 25, 26, 27, 28, 40, 41, 50, 52, 53], "vari": 1, "make": [1, 3, 4, 15], "found": [1, 2, 3, 8, 16, 31, 53], "document": [1, 2, 3, 21, 48, 50, 53], "produc": [1, 2, 7, 15, 17, 20, 22, 23, 24, 25, 26, 27, 28, 33, 40, 41, 46, 48, 50, 54], "an": [1, 2, 3, 4, 5, 7, 8, 13, 14, 15, 18, 19, 23, 24, 25, 26, 27, 28, 30, 34, 36, 37, 40, 47, 48, 49, 50, 51, 52, 53], "main": [4, 15, 50, 51], "have": [1, 4, 7, 8, 10, 15, 16, 36, 37, 47, 52, 53], "seri": [16, 37, 50], "interact": [1, 6, 48, 51, 54], "map": [1, 13, 30, 35, 37, 48, 50], "static": [1, 7, 54], "figur": [1, 4, 51], "featur": 50, "These": [1, 3, 4, 15, 35], "later": 1, "meshiphi": [2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53, 54], "cli": [2, 48], "entri": [2, 5, 7, 8, 16, 37, 43, 48, 53], "point": [2, 3, 4, 16, 37, 48, 50], "build": [2, 4, 5, 50, 52], "from": [0, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 53, 54], "hetrogen": [], "collect": [2, 50], "mai": [4, 5, 6, 7, 15, 18, 19, 44, 47, 48, 50, 53], "export": [2, 49, 50, 53], "varieti": 2, "format": [2, 5, 8, 14, 15, 16, 18, 19, 36, 37, 44, 47, 48, 50, 51], "other": [2, 4, 6, 16, 18, 19, 22, 29, 38, 39, 44, 50, 51], "system": [2, 4, 16, 30, 37, 39, 42, 43, 49], "gi": 2, "directli": 2, "polarrout": 2, "": [2, 3, 4, 8, 15, 16, 17, 29, 31, 35, 37, 50, 51, 52, 53], "optin": [], "through": [2, 3, 6, 8, 48, 50], "perform": [3, 4, 5, 7, 8, 10, 11, 16, 32, 37, 45, 50], "model": [4, 9, 18, 19, 42, 44, 50], "planner": [], "posit": [2, 53], "argument": [2, 3], "A": [2, 4, 9, 13, 48, 50, 51, 53], "detail": [2, 4, 5, 14, 15, 36, 47, 50, 51], "how": [2, 4, 5, 6, 14, 15, 17, 23, 24, 25, 26, 27, 28, 36, 40, 41, 47, 48, 50, 51], "parsabl": [2, 50], "requir": [2, 4, 5, 7, 8, 11, 14, 15, 16, 33, 34, 36, 37, 46, 47, 49], "There": [2, 4, 15], "directori": [2, 3], "environment_config": [2, 3, 4, 48], "grf_exampl": [2, 4, 48], "v": [2, 9, 40], "verbos": 2, "log": [2, 36, 47], "o": 2, "locat": [2, 4, 7, 50], "return": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52], "explain": 2, "onc": [2, 50, 53], "built": [2, 54], "output_loc": 2, "output_format": 2, "save": [2, 8, 11, 14, 16, 36, 37, 46, 47, 48, 50, 53, 54], "support": [2, 4, 8, 35, 50], "default": [2, 4, 7, 8, 10, 11, 16, 21, 33, 34, 36, 37, 46, 47, 50], "geo": [2, 50, 52], "polygon": [2, 8, 10, 11, 13, 14, 50], "cell": [2, 4, 35, 50], "geojson": [2, 12, 14, 15, 50], "tif": [2, 50], "rasteris": 2, "png": 2, "format_conf": 2, "data_nam": [2, 4, 5, 6, 8, 10, 11, 16, 21, 33, 37, 46, 47, 50], "elev": [2, 4, 18, 29, 48, 50], "sampling_resolut": [2, 50], "150": [2, 50], "3031": [2, 50], "color_conf": 2, "path": [2, 3, 50, 52], "txt": 2, "where": [2, 4, 8, 15, 16, 31, 37, 42, 50, 51, 53], "variabl": [2, 4, 8, 9, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "name": [2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 54], "layer": [2, 38], "list": [2, 4, 7, 8, 10, 11, 16, 37, 48, 50, 53], "two": [2, 7, 10, 15, 37, 46, 49, 50], "valu": [2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 33, 34, 35, 36, 37, 38, 43, 46, 47, 50, 52, 53, 54], "first": [2, 46, 50], "being": [2, 8, 11, 15, 16, 30, 33, 34, 36, 37, 46, 47, 50], "x": [2, 36, 37, 46, 47, 53], "second": [2, 46], "y": [2, 36, 37, 46, 47, 53], "string": [2, 3, 4, 10, 37, 47, 50, 52, 53], "epsg": [2, 4, 8, 15, 16, 36, 37, 47, 50], "color": [2, 50], "text": [2, 50], "scheme": 2, "when": [2, 4, 6, 8, 11, 14, 15, 16, 36, 37, 47, 49, 50], "0": [2, 4, 5, 21, 33, 34, 35, 36, 46, 50], "240": [2, 50], "250": [2, 50], "160": [2, 50], "30": [2, 4, 50], "230": [2, 50], "220": [2, 50], "170": [2, 50], "60": [2, 50], "100": [2, 4, 35, 50], "4": [2, 4, 13, 37, 50, 53], "column": [2, 8, 10, 11, 15, 16, 17, 21, 32, 33, 36, 37, 45, 46, 47, 50], "per": [2, 13, 15, 21, 33, 46, 50], "correspond": [2, 37, 50, 53], "red": [2, 50], "green": [2, 50], "blue": [2, 4, 50], "between": [2, 4, 16, 21, 34, 35, 37, 50, 52], "255": [2, 50], "onli": [2, 4, 5, 6, 7, 11, 15, 17, 21, 35, 49], "specifi": [2, 4, 8, 10, 11, 13, 16, 19, 21, 33, 37, 52, 53], "you": [2, 5, 7, 49], "want": [2, 7, 8], "singl": [2, 4, 7, 8, 15, 16, 35], "rebuild": 2, "origin": [2, 37, 50], "store": [2, 4, 6, 7, 8, 15, 16, 37, 47, 50], "within": [2, 3, 4, 6, 7, 8, 9, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53], "primarili": [2, 10, 11, 32, 34, 45], "debug": [2, 5, 34, 36, 47], "updat": [2, 17, 37, 49, 50], "old": [2, 37], "older": 2, "version": [2, 49], "reappli": [], "simul": [9, 12, 13, 30, 34], "were": [9, 13, 37], "visualis": [2, 48], "librari": [2, 35], "relev": [2, 37], "page": [2, 4, 5, 14, 15, 21, 33, 36, 46, 47], "qgi": 2, "common": [2, 4, 15, 29, 49], "standard": [3, 14, 36, 47, 50], "portion": 4, "pass": [3, 7, 17, 50], "script": [], "descript": [3, 22, 52, 53], "At": 7, "major": [], "templat": [3, 15], "schema": 3, "check": [3, 4, 16, 37, 50], "correct": [3, 7, 34], "keyword": [3, 4, 11], "datatyp": 3, "well": [34, 54], "waypoint": 3, "csv": [11, 14, 15, 36, 47], "rudimentari": 3, "ensur": [3, 15, 33], "sens": [3, 15], "e": [3, 4, 5, 15, 16, 37, 39, 47, 50], "g": [3, 4, 5, 16, 37, 47, 50], "start_tim": [3, 4, 50], "befor": [3, 4, 5, 33, 52], "end_tim": [3, 4, 50], "config_valid": 3, "flexi_json_input": 3, "flexibl": [3, 7, 15], "If": [3, 4, 5, 8, 16, 19, 37, 50], "pars": [3, 8, 16], "assum": [3, 5, 37, 49], "dict": [3, 4, 6, 7, 8, 11, 13, 16, 17, 33, 34, 37, 46, 50, 52], "alreadi": [3, 36, 47], "load": [3, 5, 10, 11, 15, 17, 32, 33, 34, 35, 36, 45, 46, 47, 48, 50, 53], "paramet": [3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 52], "str": [3, 6, 7, 8, 16, 37, 50, 54], "translat": [3, 7, 17], "rais": [3, 8, 16, 19, 37], "typeerror": 3, "neither": 3, "nor": 3, "wrong": [3, 36, 47], "dictionari": [3, 4, 5, 6, 7, 8, 11, 16, 17, 33, 34, 37, 46, 50], "validate_mesh_config": 3, "tri": 3, "filenam": [3, 54], "incorrect": 3, "must": [3, 4, 7, 8, 10, 14, 15, 16, 21, 33, 34, 36, 37, 46, 47], "filenotfounderror": 3, "could": [3, 16, 37], "validationerror": 3, "malform": 3, "validate_route_config": 3, "validate_vessel_config": 3, "validate_waypoint": 3, "_summary_": 3, "pd": [3, 8, 9, 10, 11, 12, 13, 16, 30, 32, 33, 37, 45, 46, 48], "datafram": [3, 8, 9, 10, 11, 12, 13, 14, 15, 16, 21, 30, 32, 33, 36, 37, 45, 46, 47, 48], "_description_": 3, "assertionerror": [3, 8], "below": [4, 5, 16, 21, 36, 37, 47, 49, 51], "full": 4, "gaussian": [4, 33, 46], "random": [4, 21, 33, 46], "field": [4, 33, 37, 46], "sic": [4, 17, 18, 19, 20, 22, 30, 31, 35, 48, 50], "thick": [4, 7, 9, 12, 14, 38], "densiti": [4, 7, 13, 14, 15, 37], "uc": [4, 38, 39, 42, 43, 44, 46, 47], "vc": [4, 38, 39, 42, 43, 44, 46, 47], "current": [4, 8, 15, 16, 17, 37, 47, 48, 50], "u10": [4, 41], "v10": [4, 41], "wind": [4, 15, 36, 47, 48], "includ": [4, 8, 15, 16, 22, 23, 24, 25, 26, 27, 28, 33, 34, 36, 37, 38, 40, 41, 43, 46, 47, 48, 49, 50], "real": [4, 15, 33, 39, 46, 50], "lat_min": [4, 50], "lat_max": [4, 50], "10": [4, 13, 33, 46, 49, 52, 54], "long_min": [4, 50], "long_max": [4, 50], "2017": 4, "02": 4, "01": 4, "04": 4, "cell_width": [4, 50], "cell_height": [4, 50], "data_sourc": [4, 50], "loader": [4, 7, 21, 33, 46, 47, 50], "scalar_grf": [4, 7, 33], "param": [4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52, 54], "min": [4, 8, 16, 21, 33, 34, 37, 46, 50], "max": [4, 8, 16, 21, 33, 34, 37, 46, 50], "seed": [4, 21, 33, 46], "16": 4, "offset": [4, 33], "5": [4, 5, 7, 13, 21, 43, 50], "splitting_condit": [4, 5, 50], "threshold": [4, 5, 16, 21, 33, 37], "75": 4, "upper_bound": [4, 5, 16], "lower_bound": [4, 5, 16], "dataloader_nam": 4, "downsample_factor": [4, 16, 37], "aggregate_typ": 4, "mean": [4, 8, 16, 17, 18, 19, 36, 37, 38, 39, 40, 43, 44, 50], "min_dp": [4, 7, 50], "in_proj": [4, 16, 17, 36, 37, 47], "4326": [4, 8, 15, 16, 36, 37, 47, 50], "out_proj": [4, 16, 17, 36, 37, 47], "x_col": [4, 16, 17, 36, 37, 47], "lat": [4, 8, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52], "y_col": [4, 16, 17, 36, 37, 47], "long": [4, 8, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52], "size": [4, 16, 21, 33, 34, 37, 46], "512": [4, 21, 33, 46], "alpha": [4, 21, 33, 46], "3": [4, 13, 21, 33, 46, 49, 50, 53], "binari": [4, 33, 35, 36, 46, 49], "fals": [4, 8, 16, 21, 33, 37, 48], "multipli": [4, 33], "50": 4, "65": 4, "44": 4, "850": 4, "1000": 4, "40": 4, "vector_grf": [4, 7, 46], "21": 4, "vec_x": [4, 46], "vec_i": [4, 46], "split_depth": [4, 50], "6": [4, 13, 30], "minimum_datapoint": [4, 50], "here": [4, 12, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 38, 39, 40, 41, 42, 43, 44], "dictat": [4, 15], "titl": [4, 10, 48], "mesh_info": [4, 50], "three": [4, 15], "primari": 4, "discret": [4, 50, 51], "definit": 4, "bound": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52], "tempor": [4, 15, 23, 24, 25, 26, 27, 28, 35, 40, 41, 50], "interest": 4, "start": [3, 4, 33, 34, 46, 50, 51], "shape": [4, 8, 9, 10, 12, 14, 33, 36, 46], "grid": [4, 20, 23, 24, 25, 26, 27, 28, 39, 40, 41, 50], "box": [4, 50], "further": [4, 48], "given": [4, 13, 16, 35, 50, 53, 54], "float": [4, 8, 13, 16, 37, 50, 52, 53], "degre": [4, 40, 53], "minimum": [4, 7, 16, 21, 33, 37, 46], "longitud": [4, 8, 15, 16, 37, 50, 53], "edg": [4, 8, 53], "maximum": [4, 21, 33, 36, 46, 50], "latitud": [4, 8, 15, 16, 37, 50, 53], "yyyi": [4, 50], "mm": [4, 50], "dd": [4, 50], "datetim": 4, "time": [4, 7, 8, 15, 16, 32, 34, 36, 37, 39, 42, 45, 47, 50], "averag": [4, 30, 37], "end": [4, 52], "width": 4, "prior": [4, 48], "height": [4, 22, 25, 26, 27, 28, 36, 38, 40, 41], "refer": [4, 16, 37, 51], "todai": 4, "starttim": 4, "endtim": 4, "item": 4, "repres": [4, 35, 50, 52, 53], "add": [4, 5, 7, 15, 36, 37, 47, 49, 50, 52], "see": [4, 5, 21, 33, 46, 50, 51], "abstractscalardataload": 4, "doc": [4, 14, 36, 47], "about": [4, 23, 24, 25, 26, 27, 28, 40, 41, 50, 51], "value_fill_typ": [4, 50], "determin": [4, 6, 36, 37, 47, 50], "action": [4, 5, 7], "taken": [4, 9, 13, 15, 22], "cellbox": [4, 16, 34, 37, 48, 52], "possibl": [4, 8, 15, 16], "either": [4, 8, 15, 16, 37, 47, 48], "parent": [4, 50], "impli": 4, "assign": [4, 10, 11, 50], "zero": 4, "nan": [4, 8, 10, 11, 16, 37], "aggreg": [4, 6, 8, 16, 35, 37, 50, 52], "By": 4, "place": [4, 51, 52], "calcul": [4, 8, 16, 17, 37, 40, 50, 52], "chang": [4, 8, 16, 37], "count": [4, 8, 16, 37], "abov": [4, 16, 21, 37], "sub": 4, "divid": 4, "datapoint": [4, 7, 8, 15, 16, 21, 33, 34, 37, 46], "homogen": [4, 6, 7, 8, 16, 37, 50], "upperbound": [4, 16], "percentag": [4, 8, 16, 19, 37], "normalis": [4, 33], "deem": [4, 16], "greater": 4, "than": [4, 15, 16, 37], "lowerbound": [4, 16], "less": [4, 16, 37], "curl": [4, 37], "f": [4, 47, 48, 50, 53], "order": [4, 15], "refin": 4, "done": 4, "select": [4, 7, 8, 16, 34, 37], "divis": 4, "whenev": 4, "inhomogen": 4, "respect": [4, 39], "specif": [4, 7, 8, 15, 16, 37, 50], "characterist": [4, 37], "ocean": [4, 15, 17, 18, 19, 23, 24, 25, 26, 27, 28, 29, 39, 40, 41, 42, 43, 44, 50], "depth": [4, 36, 38, 42, 43, 50, 51], "insid": [4, 50, 51], "illustr": [4, 51], "graphic": [4, 50, 53], "decis": 4, "shown": [4, 5], "histogram": 4, "arbitrari": 4, "orang": 4, "denot": 4, "formula": 4, "black": 4, "ub": 4, "upper": [4, 8, 16, 37], "lb": 4, "lower": [4, 8, 16, 37], "To": [4, 7, 15], "probabl": 4, "distribut": [4, 9, 13, 21, 33, 46, 48, 50], "henc": 4, "area": [4, 12, 15, 38], "under": [4, 5, 7, 52], "curv": 4, "decim": [4, 8, 16, 37, 52], "fraction": [4, 8, 16, 19, 37], "total": [4, 38], "would": [4, 5, 14, 36, 47, 49, 52], "show": [4, 6, 20, 48], "decid": 4, "clr": [4, 8, 16, 37, 50], "hom": [4, 16, 50], "het": [4, 8, 16, 37, 50], "fourth": 4, "trigger": [4, 37], "number": [4, 16, 21, 23, 24, 25, 26, 27, 28, 33, 37, 40, 41, 46, 50, 52], "do": [4, 5, 50], "extrem": 4, "alwai": [4, 15], "imagin": 4, "similar": [4, 47], "entir": [4, 31, 33], "both": [1, 4, 7, 15, 22], "colour": [4, 54], "across": 4, "meshbuild": [4, 5, 48, 51], "subject": 4, "satisfi": 4, "abl": 4, "implement": [5, 6, 15, 22, 33, 46, 50], "object": [5, 8, 13, 15, 16, 17, 36, 37, 47, 48, 50, 52, 53, 54], "workflow": 5, "choos": 5, "appropri": [5, 7], "import_data": [5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47], "add_default_param": [5, 8, 11, 15, 16, 17, 33, 34, 36, 37, 46, 47], "abstractscalar": [5, 6, 15, 36, 47], "abstractvector": [5, 6, 14, 15, 47], "py": [5, 7], "instruct": [5, 15, 23, 24, 25, 26, 27, 28, 40, 41, 49], "so": [5, 9, 13, 15, 36, 47, 49, 50], "after": [5, 50, 52], "readi": 5, "go": 5, "It": [0, 5, 10, 11, 17, 19, 21, 23, 24, 25, 26, 27, 28, 29, 32, 34, 40, 41, 44, 45, 49, 50, 51], "purpos": 5, "__name__": 5, "__main__": 5, "test": [5, 10, 11, 15, 17, 32, 34, 45, 50], "its": [5, 22, 48, 50, 52], "deploi": 5, "wish": 5, "modifi": 5, "repo": 5, "one": [5, 7, 8, 15, 16, 22, 37, 43, 49], "call": [5, 6, 7, 8, 16, 37, 51], "add_dataload": [5, 50], "re": 5, "work": [5, 14, 15, 18, 19, 36, 44, 47, 49], "out": [5, 8], "jupyt": [5, 50], "basic": 5, "step": [5, 16, 37, 49], "import": [5, 7, 8, 10, 11, 14, 16, 35, 36, 37, 47, 48, 50, 53], "abstract": [5, 6, 11, 17, 33, 34, 46, 50], "abstract_scalar": [5, 16], "scalardataload": [5, 16, 36, 47, 50], "up": [5, 14, 15, 23, 24, 25, 26, 27, 28, 40, 41], "same": [5, 8, 15, 16, 21, 37, 48, 50], "wai": [5, 50, 52], "exist": [5, 15, 37, 49, 50], "mydataload": [5, 36, 47, 50], "def": [5, 7, 36, 47], "self": [5, 7, 8, 15, 16, 36, 37, 47, 50, 52], "len": [5, 36], "xr": [5, 8, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 31, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 47], "open_dataset": [5, 36, 47], "els": [5, 36, 50], "open_mfdataset": [5, 36, 47], "trim": [5, 8, 15, 16, 37], "boundari": [5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 53], "trim_datapoint": [5, 8, 16, 37], "initialis": [5, 7, 8, 16, 37, 48, 50], "path_to_file_1": [5, 7], "path_to_file_2": [5, 7], "popul": 5, "mani": [5, 16, 37, 43, 50], "my_data": 5, "9": [5, 13, 49], "r": [5, 48, 50, 53], "fp": 5, "mesh_build": [5, 48, 50], "env_mesh": [5, 52], "build_environmental_mesh": [5, 48, 50], "from_json": 5, "builder": 5, "regener": 5, "modified_build": 5, "modified_mesh": 5, "oper": [6, 8, 16, 20, 22, 37, 39, 49], "get_hom_condit": [6, 8, 16, 37], "get_valu": [6, 8, 13, 15, 16, 37], "realist": [6, 33, 46], "dataloader_interfac": 6, "dataloaderinterfac": 6, "intern": [6, 8, 15, 16, 18, 19, 30, 37, 44], "retriev": [6, 7, 8, 15, 16, 37], "splitting_cond": [6, 8, 16, 37], "heterogen": [2, 6], "agg_typ": [6, 8, 16, 37], "np": 6, "float64": 6, "off": 7, "get_dataload": 7, "veri": 7, "least": [7, 8], "those": [7, 50], "third": 7, "dataloader_requir": 7, "myscalardataload": 7, "mandatori": 7, "folder": [7, 17, 22], "get": [7, 49, 50, 52], "kei": [7, 8, 14, 16, 17, 37, 47], "statement": 7, "dataloaderfactori": 7, "myscalar": 7, "altern": [7, 15], "individu": [7, 37], "path_to_data_fil": 7, "path_to_fold": 7, "trail": 7, "quickli": 7, "scalar_csv": [7, 32], "binary_grf": [7, 21], "amsr": [7, 36], "bsose_s": [7, 19], "bsose_depth": [7, 18], "baltic_s": [7, 20], "gebco": [7, 36], "icenet": [7, 36], "modi": [7, 35, 36], "circl": [7, 34], "squar": [7, 34, 52], "gradient": [7, 34], "checkerboard": [7, 34], "vector_csv": [7, 45], "baltic_curr": [7, 38], "era5_wind": [7, 41], "northsea_curr": [7, 42], "oras5_curr": [7, 43], "sose": [7, 18, 19, 47], "duacs_curr": [7, 39], "era5_wave_height": 7, "era5_wave_direct": [7, 40], "space": [7, 52], "int": [7, 13, 21, 33, 46, 50, 52], "translate_file_input": 7, "abstract_lut": 8, "lutdataload": [8, 14], "lookup": 8, "__init__": [8, 13, 15, 16, 33, 37, 46, 50, 52, 54], "larg": [8, 15, 16, 23, 24, 25, 26, 27, 28, 37, 40, 41], "scale": [8, 16, 37], "downsampl": [8, 15, 16, 37], "reproject": [8, 15, 16, 17, 36, 37, 47], "renam": [8, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 47], "scope": [8, 16, 37], "ingest": [8, 16, 18, 19, 37, 44], "uniqu": [8, 11, 16, 37], "upon": [8, 16, 37], "mercat": [8, 15, 16, 37], "geometri": [8, 10, 11, 13, 50, 53], "gpd": 8, "valueerror": [8, 16, 19, 37], "li": [8, 16], "overload": [8, 16, 37], "extra": [8, 16, 37], "attribut": [8, 11, 16, 17, 33, 34, 37, 46, 47, 50, 52], "calculate_coverag": [8, 16, 37], "none": [8, 16, 21, 33, 37, 46, 50], "cover": [8, 16, 23, 24, 25, 26, 27, 28, 37, 40, 41], "compar": [8, 16, 37, 52], "against": [8, 16, 37, 52], "lookupt": 8, "get_data_col_nam": [8, 16, 37], "multipl": [8, 15, 16, 37], "t": [8, 16, 33, 36, 37, 47], "datarang": [8, 16, 37], "analys": [8, 16, 37], "boolean": [8, 54], "true": [8, 16, 21, 37, 50, 53], "goe": [8, 50], "homogenieti": [8, 16, 37], "condtion": [8, 16, 37], "get_val_from_coord": 8, "return_coord": [8, 16, 37], "extract": [8, 16, 22, 37, 50], "kwarg": [8, 16, 37], "coordin": [8, 9, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50], "search": [8, 16, 37], "flag": [8, 21, 33, 37], "whether": [8, 16, 37], "coord": 8, "optionali": 8, "associ": [8, 10, 14, 50], "skipna": [8, 16, 37], "aggregation_typ": [8, 16, 37], "accept": [8, 16, 37], "median": [8, 16, 37], "std": [8, 16, 37], "bool": [8, 16, 37, 50], "propog": [8, 16, 37], "aggregated_valu": [8, 16, 37], "even": [8, 16, 37], "scratch": [8, 16, 37], "set_data_col_nam": [8, 16, 37], "new_nam": [8, 16, 37], "replac": [8, 16, 37, 50], "verify_data": 8, "verifi": 8, "multipolygon": 8, "paper": [9, 13], "sea": [9, 12, 13, 15, 17, 18, 30, 35, 36, 38, 39, 43, 47, 48, 50], "ic": [9, 12, 13, 15, 17, 18, 30, 35, 36, 38, 43, 48, 50], "worbi": [9, 13], "p": [9, 13], "et": [9, 13, 30], "al": [9, 13, 30], "took": 9, "princip": 9, "properti": 9, "strength": 9, "buynitskii": 9, "k": 9, "download": [9, 12, 13, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 31, 38, 39, 40, 41, 42, 43, 44], "densitydataload": 9, "scientif": [9, 12, 13], "literatur": [9, 12, 13], "date": [9, 12, 13], "density_df": 9, "cast": [10, 11, 15, 16, 32, 34, 37, 45, 48], "wa": [0, 10, 11, 32, 34, 39, 42, 45], "dummi": [10, 11, 32, 45], "As": [10, 18, 19, 32, 34, 44, 45, 54], "wkt": 10, "just": [10, 15], "lut_csv": 10, "lutcsv": 10, "outsid": [10, 11], "numpi": [10, 11, 52], "exclusion_df": [10, 11, 12], "lut_geojson": 11, "lutgeojson": 11, "over": [11, 16, 20], "regular": [11, 36, 47], "dummy_data": [11, 34], "scottish": 12, "govern": [12, 50], "natur": 12, "conserv": 12, "marin": [12, 15, 39], "protect": [12, 15], "scotland_ncmpa": 12, "scotlandncmpa": 12, "exclus": [12, 15], "zone": [12, 15], "around": [12, 21], "thicknessdataload": 13, "value_dict": 13, "season": [13, 20, 30], "su": 13, "au": 13, "wi": 13, "7": [13, 22], "8": [13, 49], "sp": 13, "11": 13, "12": 13, "storag": [13, 50], "integ": [13, 52], "month": [13, 30], "account": 13, "hemispher": [13, 17], "jan": 13, "dec": 13, "thickness_df": 13, "look": [14, 15], "tabl": [14, 15], "hold": [14, 17, 36, 47], "most": [14, 36, 47], "manipul": [14, 16, 36, 37, 47, 48], "what": [14, 36, 47], "almost": [14, 47], "ident": [14, 47], "geopanda": [14, 15], "scotland": 14, "ncmpa": 14, "discuss": [15, 50], "respons": 15, "transform": [15, 16, 35, 37, 50], "raw": 15, "interpret": [3, 15, 48], "reduc": [15, 16, 23, 24, 25, 26, 27, 28, 37, 40, 41], "comput": [15, 39], "resourc": [15, 29], "typic": 15, "netcdf": [15, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 35, 36, 38, 39, 40, 41, 42, 43, 44, 47], "howev": 15, "whatev": 15, "panda": [15, 17, 36, 47], "xarrai": [15, 34, 36, 47], "uml": [15, 51], "diagram": [15, 51], "subsystem": 15, "bathymetri": 15, "concentr": [15, 17, 18, 19, 20, 30, 35, 38, 48, 50], "etc": 15, "while": 15, "error": 15, "cut": 15, "correctli": 15, "multi": [15, 39, 51], "dimension": 15, "compon": [15, 37, 38, 40, 46, 47], "dimens": [15, 34, 37, 52], "n": [15, 16, 37, 52], "rigor": 15, "prefer": 15, "weather": [15, 22, 23, 24, 25, 26, 27, 28, 40, 41, 43], "localis": 15, "link": [15, 22], "categori": 15, "generalis": 15, "via": 15, "extens": [15, 18, 19], "dask": 15, "own": 15, "utilis": 15, "much": 15, "memori": 15, "consumpt": 15, "shapefil": 15, "otherwis": 15, "applic": [16, 37], "extent": [16, 37], "easili": [16, 18, 19, 36, 37, 44, 47], "factor": [16, 37], "m": [16, 37], "bin": [16, 37, 49], "get_dp_from_coord": [16, 37], "Will": [16, 37], "chosen": [16, 37], "becaus": [16, 37], "bad": [16, 37], "data_point": [16, 52], "split_lock": 16, "proport": 16, "higher": [16, 49, 52], "ignor": [16, 37], "happen": [16, 37], "pyproj": [16, 17, 37], "cr": [16, 37], "final": [16, 37, 46, 50], "shouldn": [16, 37], "advanc": [17, 22], "microwav": 17, "scan": 17, "radiomet": 17, "publicli": [17, 18, 19, 29, 30, 43, 44], "earth": [17, 23, 24, 25, 26, 27, 28, 29, 31, 40, 41], "univers": 17, "bremen": 17, "standalon": 17, "independ": 17, "due": 17, "issu": 17, "depend": 17, "caus": 17, "regress": [17, 50], "rectifi": 17, "soon": 17, "amsrdataload": 17, "turn": 17, "pair": 17, "drop": 17, "unnecessari": 17, "polar_stereograph": 17, "z": 17, "b": [18, 19], "biogeochem": [18, 19], "southern": [18, 19, 44], "state": [18, 19, 22, 44], "estim": [18, 19, 23, 24, 25, 26, 27, 28, 39, 40, 41, 43, 44], "solut": [18, 19], "host": [18, 19], "amongst": [18, 19, 29, 39, 44], "product": [18, 19, 23, 24, 25, 26, 27, 28, 31, 38, 39, 40, 41, 44], "Their": [18, 42], "led": [18, 19, 30, 44], "mazloff": [18, 19, 44], "scripp": [18, 19, 44], "institut": [18, 19, 20, 22, 30, 38, 44], "oceanographi": [18, 19, 42, 44], "best": [18, 19, 44], "fit": [18, 19, 39, 44], "observ": [18, 19, 30, 44], "quantit": [18, 19, 44], "climatologi": [18, 19, 44], "note": [18, 19, 33, 44, 46, 50], "collat": [18, 19, 44], "bsosedepthdataload": 18, "bsose_sea_ic": 19, "bsoseseaicedataload": 19, "unit": [19, 40], "finnish": [20, 38], "meteorolog": [20, 22, 38], "fmi": [20, 38], "webpag": [20, 38], "servic": [20, 22, 39], "chart": [20, 29], "daili": [20, 38], "basi": 20, "dure": 20, "km": 20, "baltic_sea_ic": 20, "balticseaicedataload": 20, "instead": 21, "consist": [21, 53], "land": [21, 23, 24, 25, 26, 27, 28, 40, 41], "mask": [21, 33, 46], "axi": [21, 33, 46], "power": [21, 33, 46], "law": [21, 33, 46], "momentum": [21, 33, 46], "ecmwf": [22, 23, 24, 25, 26, 27, 28, 40, 41, 43], "european": [22, 23, 24, 25, 26, 27, 28, 39, 40, 41, 43], "centr": [22, 23, 24, 25, 26, 27, 28, 34, 40, 41, 42, 43], "medium": [22, 23, 24, 25, 26, 27, 28, 40, 41, 43], "rang": [22, 23, 24, 25, 26, 27, 28, 35, 40, 41, 43, 50, 52], "forecast": [22, 23, 24, 25, 26, 27, 28, 30, 40, 41, 43], "24": 22, "global": [22, 23, 24, 25, 26, 27, 28, 39, 40, 41, 43, 50], "numer": [22, 50], "predict": 22, "member": [22, 43], "co": 22, "broader": 22, "commun": 22, "largest": 22, "supercomput": 22, "facil": 22, "archiv": 22, "world": [22, 33, 46, 50], "strateg": 22, "activ": 22, "deliv": 22, "train": [22, 30], "assist": 22, "wmo": 22, "programm": 22, "ecmwf_sig_wave_height": 22, "grib2": 22, "ecmwfsigwaveheightdataload": 22, "signific": [22, 36], "wave": [22, 27, 28, 36, 47], "swh": [22, 24], "famili": [23, 24, 25, 26, 27, 28, 40, 41], "fifth": [23, 24, 25, 26, 27, 28, 40, 41], "atmospher": [23, 24, 25, 26, 27, 28, 40, 41], "reanalysi": [23, 24, 25, 26, 27, 28, 38, 39, 40, 41, 43], "climat": [23, 24, 25, 26, 27, 28, 30, 40, 41], "period": [23, 24, 25, 27, 28, 36, 40, 41], "januari": [23, 24, 25, 26, 27, 28, 40, 41], "1950": [23, 24, 25, 26, 27, 28, 40, 41], "present": [23, 24, 25, 26, 27, 28, 40, 41], "hourli": [23, 24, 25, 26, 27, 28, 40, 41], "30km": [23, 24, 25, 26, 27, 28, 40, 41], "resolv": [23, 24, 25, 26, 27, 28, 40, 41], "137": [23, 24, 25, 26, 27, 28, 40, 41], "level": [23, 24, 25, 26, 27, 28, 39, 40, 41], "surfac": [23, 24, 25, 26, 27, 28, 31, 38, 40, 41], "80km": [23, 24, 25, 26, 27, 28, 40, 41], "uncertainti": [23, 24, 25, 26, 27, 28, 40, 41], "era5_max_wave_height": 23, "era5maxwaveheightdataload": 23, "hmax": 23, "era5_sig_wave_height": 24, "era5sigwaveheightdataload": 24, "era5_wave_dir": 25, "era5_mean_wave_direct": 25, "era5meanwavedirdataload": 25, "mwd": [25, 40], "era5_wave_period": 26, "era5waveperioddataload": 26, "mwp": 26, "era5_wind_dir": 27, "era5winddirdataload": 27, "wind_dir": 27, "era5_wind_mag": 28, "era5windmagdataload": 28, "wind_mag": 28, "bathymetr": [29, 50], "scientist": 29, "gebcodataload": 29, "probabilist": 30, "deep": 30, "learn": 30, "team": 30, "alan": 30, "ture": 30, "andersson": 30, "2021": 30, "next": 30, "monthli": [30, 38, 43], "v1": 30, "v2": 30, "icenetdataload": 30, "moder": 31, "imag": [31, 35, 49, 50], "spectroradiomet": 31, "satellit": [31, 35, 39], "born": 31, "instrument": 31, "nasa": 31, "view": 31, "everi": [31, 38], "dai": 31, "acquir": 31, "36": 31, "spectral": 31, "band": 31, "group": 31, "wavelength": 31, "modisdataload": 31, "scalarcsvdataload": 32, "potenti": [32, 45], "head": [32, 45, 49], "artifici": [33, 46], "somewhat": [33, 46], "isn": 33, "cap": 33, "skew": 33, "outlier": 33, "randomis": 33, "actual": [33, 52], "actual_min": 33, "actual_max": 33, "scalargrfdataload": 33, "known": 34, "shapedataload": 34, "gen_checkerboard": 34, "pattern": 34, "gen_circl": 34, "radiu": 34, "gen_gradi": 34, "direct": [34, 36, 37, 47, 50], "act": 34, "like": [34, 50], "simpli": 34, "enact": 34, "data_xr": 34, "tiff": [35, 49], "martin": 35, "roger": 35, "ai": 35, "lab": 35, "water": 35, "combin": 35, "sar": 35, "imageri": 35, "continu": 35, "visualiceddataload": 35, "visual_ic": 35, "import_from_nc": 35, "xarray_dataset": 35, "import_from_tiff": 35, "simpl": [36, 47], "my": [36, 47], "aren": [36, 47], "lon": [36, 47], "trim_data": [36, 47], "sometim": [36, 47], "constant": [36, 47], "super": [36, 47], "3412": [36, 47], "strictli": [36, 47], "speak": [36, 47], "necessari": [36, 47, 49], "becom": [36, 47], "skip": [36, 47], "now": [36, 47], "bsose": [36, 42], "baltic": [36, 47], "grf": [4, 36, 47, 48], "ecmwfsigwaveheight": 36, "era5": [36, 47], "magnitud": [36, 37, 46], "visual_": 36, "abstract_vector": 37, "vectordataload": [37, 47, 50], "add_mag_dir": 37, "easier": 37, "cartesian": 37, "data_name_list": 37, "_magnitud": 37, "_direct": 37, "calc_curl": 37, "collaps": 37, "collap": 37, "calc_diverg": 37, "diverg": 37, "div": 37, "calc_dmag": 37, "dmag": 37, "mag": 37, "mean_vector": 37, "calc_reynolds_numb": 37, "approxim": 37, "reynold": 37, "veloc": 37, "AND": 37, "viscos": 37, "OF": 37, "seawat": 37, "AT": 37, "c": 37, "WILL": 37, "minor": 37, "rework": 37, "TO": 37, "fluid": 37, "length": [37, 52], "append": 37, "comma": [37, 47], "seper": 37, "get_data_col_name_list": 37, "namesk": 37, "exceed": 37, "name_dict": 37, "old_nam": 37, "set_data_col_name_list": 37, "cmem": 38, "physic": 38, "whole": 38, "inclus": 38, "transit": 38, "north": [38, 40, 47, 50, 53], "hour": 38, "salin": 38, "temperatur": 38, "horizont": 38, "mix": 38, "bottom": 38, "balticcurrentdataload": 38, "copernicu": [38, 39], "mission": 39, "altimet": 39, "cne": 39, "cl": 39, "anomali": 39, "sla": 39, "twenti": 39, "year": 39, "1993": 39, "2012": 39, "optim": [2, 39], "interpol": 39, "merg": 39, "l3": 39, "along": [39, 50], "track": 39, "measur": 39, "absolut": 39, "topographi": 39, "geostroph": 39, "Near": 39, "duacscurrentdataload": 39, "deriv": 39, "come": [40, 50], "angl": 40, "convert": [40, 50], "u": 40, "era5_wave_direction_vector": 40, "era5wavedirectionload": 40, "uw": 40, "vw": 40, "era5winddataload": 41, "atlant": 42, "proudman": 42, "oceanograph": 42, "laboratori": 42, "coastal": 42, "polcom": 42, "uk": 42, "nation": 42, "liverpool": 42, "north_sea_curr": 42, "northseacurrentdataload": 42, "prepar": 43, "ocean5": 43, "analysi": 43, "compris": 43, "ensembl": 43, "publish": 43, "catalogu": 43, "oras5currentdataload": 43, "sosedataload": 44, "vectorcsvdataload": 45, "vectorgrfdataload": 46, "itself": 47, "duac": 47, "oras5": 47, "termin": 48, "increas": 48, "alter": 48, "mesh_gener": [48, 50], "cg": 48, "to_json": [48, 50, 53], "pip": [48, 49], "bas_geoplot": 48, "ipython": [48, 50], "notebook": [48, 50], "mesh_json": [48, 50, 53, 54], "mp": 48, "meshgrid": 48, "predefin": 48, "cx": [48, 50, 53], "expect": 48, "git": 49, "clone": 49, "http": 49, "com": 49, "antarctica": 49, "cd": 49, "steer": 49, "clear": 49, "trivial": 49, "problem": 49, "With": 49, "said": 49, "variou": 49, "virtual": 49, "pipwin": 49, "easi": 49, "fiona": 49, "ubuntu": 49, "debian": 49, "sudo": 49, "apt": 49, "ppa": 49, "ubuntugi": 49, "libgdal": 49, "dev": 49, "cplus_include_path": 49, "usr": 49, "c_include_path": 49, "fedora": 49, "dnf": 49, "devel": 49, "homebrew": 49, "brew": 49, "modul": [50, 51], "behind": 50, "environmentalmesh": 50, "usag": 50, "execut": 50, "respos": 50, "longtitud": 50, "180": 50, "j_grid": 50, "java": 50, "cellgrid": 50, "evironment": 50, "nonunifrom": 50, "neighbour": 50, "graph": 50, "split_and_replac": 50, "smaller": 50, "four": 50, "corner": 50, "surround": 50, "split_to_depth": 50, "until": 50, "reach": 50, "mutabl": 50, "environment_mesh": 50, "agg_cellbox": 50, "neighbour_graph": 50, "conatin": [50, 52], "classmethod": 50, "load_from_json": 50, "env": [50, 52], "ex": 50, "format_param": 50, "local": 50, "to_geojson": 50, "params_fil": 50, "doe": 50, "them": 50, "connect": 50, "togeth": 50, "cellgird": 50, "parseabl": 50, "adjac": [50, 53], "to_tif": 50, "geotif": 50, "folow": 50, "fuel": 50, "pixel": 50, "2d": 50, "arrai": [50, 52], "sampl": [50, 52], "geotiff": 50, "espg": 50, "colour_conf": 50, "update_cellbox": 50, "index": [50, 53], "certain": [50, 51], "perf": 50, "metric": 50, "encod": 50, "grid_width": 50, "relationship": 50, "id": [50, 53], "id_1": [50, 53], "id_n": [50, 53], "get_neighbour_cas": 50, "cellbox_a": 50, "cellbox_b": 50, "touch": 50, "destin": 50, "east": [50, 53], "south": [50, 53], "west": [50, 53], "initialise_neighbour_graph": 50, "update_neighbour": 50, "cellbox_indx": 50, "new_neighbours_indx": 50, "remov": [50, 53], "neighbour_map": 50, "new_neighbour_indx": 50, "cellbox_index": 50, "hous": 50, "access": [50, 52, 53], "intend": 50, "represnt": 50, "enabl": 50, "newli": 50, "logtitut": 50, "encapsul": 50, "set_data_sourc": 50, "spit": 50, "set_par": 50, "bigger": 50, "conain": 50, "got": 50, "should_split": 50, "stop_index": 50, "get_hom_cond": 50, "mixtur": 50, "stop": 50, "deprec": 50, "switch": 50, "breadth": 50, "result": 50, "start_id": 50, "represenst": 50, "usuallli": 50, "uniformli": 50, "among": 50, "data_load": 50, "spliiting_condit": 50, "datasourc": 50, "assoc": 50, "indic": 50, "fill": [50, 52], "void": 50, "value_fill_tyep": 50, "aggregated_cellbox": 50, "agg_data": 50, "aggrgat": 50, "agg": 50, "contains_point": 50, "cy": [50, 53], "dcx": [50, 53], "dcy": [50, 53], "agg_value_1": 50, "agg_value_n": 50, "cell_json": 50, "compos": 51, "seen": 51, "depict": 51, "sequenc": [51, 52], "client": 51, "build_environment_mesh": 51, "event": 51, "explan": 51, "todo": 52, "mesh_valid": 52, "meshvalid": 52, "mesh_config_fil": 52, "conf": 52, "vlaidat": 52, "validation_length": 52, "legnth": 52, "wil": 52, "incur": 52, "cost": 52, "cellboox": 52, "environmentmesh": 52, "get_range_end": 52, "clacul": 52, "get_value_from_data": 52, "get_values_from_mesh": 52, "find": 52, "arg": 52, "validate_mesh": 52, "number_of_sampl": 52, "agg_valu": 52, "rmse": 52, "distanc": [52, 53], "actaul": 52, "d": 52, "sobol": 52, "highli": 52, "guarante": 52, "better": 52, "coverag": 52, "generate_sampl": 52, "equal": 52, "fall": 52, "pipelin": [], "stream": [], "vehicl": [2, 53], "understood": 53, "value_1": 53, "value_n": 53, "centroid": 53, "dxy": 53, "longer": 53, "inaccess": 53, "remain": 53, "mesh_plott": 54, "synthet": 4, "pypi": 49, "meshplott": [0, 54], "mesh_plot": 54, "figscal": 54, "matplotlib": 54, "cartopi": 54, "plot_bool": 54, "value_nam": 54, "plot_cmap": 54, "colourmap": 54, "core": 1, "although": 0, "travel": 2, "arcgi": 2, "_": []}, "objects": {"meshiphi.config_validation": [[3, 0, 0, "-", "config_validator"]], "meshiphi.config_validation.config_validator": [[3, 1, 1, "", "flexi_json_input"], [3, 1, 1, "", "validate_mesh_config"], [3, 1, 1, "", "validate_route_config"], [3, 1, 1, "", "validate_vessel_config"], [3, 1, 1, "", "validate_waypoints"]], "meshiphi.dataloaders": [[6, 0, 0, "-", "dataloader_interface"], [7, 0, 0, "-", "factory"]], "meshiphi.dataloaders.dataloader_interface": [[6, 2, 1, "", "DataLoaderInterface"]], "meshiphi.dataloaders.dataloader_interface.DataLoaderInterface": [[6, 3, 1, "", "get_hom_condition"], [6, 3, 1, "", "get_value"]], "meshiphi.dataloaders.factory": [[7, 2, 1, "", "DataLoaderFactory"]], "meshiphi.dataloaders.factory.DataLoaderFactory": [[7, 3, 1, "", "get_dataloader"], [7, 3, 1, "", "translate_file_input"]], "meshiphi.dataloaders.lut": [[8, 0, 0, "-", "abstract_lut"], [9, 0, 0, "-", "density"], [10, 0, 0, "-", "lut_csv"], [11, 0, 0, "-", "lut_geojson"], [12, 0, 0, "-", "scotland_ncmpa"], [13, 0, 0, "-", "thickness"]], "meshiphi.dataloaders.lut.abstract_lut": [[8, 2, 1, "", "LutDataLoader"]], "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader": [[8, 3, 1, "", "__init__"], [8, 3, 1, "", "add_default_params"], [8, 3, 1, "", "calculate_coverage"], [8, 3, 1, "", "downsample"], [8, 3, 1, "", "get_data_col_name"], [8, 3, 1, "", "get_hom_condition"], [8, 3, 1, "", "get_val_from_coord"], [8, 3, 1, "", "get_value"], [8, 3, 1, "", "import_data"], [8, 3, 1, "", "reproject"], [8, 3, 1, "", "set_data_col_name"], [8, 3, 1, "", "trim_datapoints"], [8, 3, 1, "", "verify_data"]], "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.self": [[8, 4, 1, "", "data"], [8, 4, 1, "", "data_name"]], "meshiphi.dataloaders.lut.density": [[9, 2, 1, "", "DensityDataLoader"]], "meshiphi.dataloaders.lut.density.DensityDataLoader": [[9, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.lut_csv": [[10, 2, 1, "", "LutCSV"]], "meshiphi.dataloaders.lut.lut_csv.LutCSV": [[10, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.lut_geojson": [[11, 2, 1, "", "LutGeoJSON"]], "meshiphi.dataloaders.lut.lut_geojson.LutGeoJSON": [[11, 3, 1, "", "add_default_params"], [11, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.scotland_ncmpa": [[12, 2, 1, "", "ScotlandNCMPA"]], "meshiphi.dataloaders.lut.scotland_ncmpa.ScotlandNCMPA": [[12, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.thickness": [[13, 2, 1, "", "ThicknessDataLoader"]], "meshiphi.dataloaders.lut.thickness.ThicknessDataLoader": [[13, 2, 1, "", "Region"], [13, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.thickness.ThicknessDataLoader.Region": [[13, 3, 1, "", "__init__"], [13, 3, 1, "", "get_value"]], "meshiphi.dataloaders.scalar": [[16, 0, 0, "-", "abstract_scalar"], [17, 0, 0, "-", "amsr"], [20, 0, 0, "-", "baltic_sea_ice"], [18, 0, 0, "-", "bsose_depth"], [19, 0, 0, "-", "bsose_sea_ice"], [22, 0, 0, "-", "ecmwf_sig_wave_height"], [23, 0, 0, "-", "era5_max_wave_height"], [25, 0, 0, "-", "era5_mean_wave_direction"], [24, 0, 0, "-", "era5_sig_wave_height"], [26, 0, 0, "-", "era5_wave_period"], [27, 0, 0, "-", "era5_wind_dir"], [28, 0, 0, "-", "era5_wind_mag"], [29, 0, 0, "-", "gebco"], [30, 0, 0, "-", "icenet"], [31, 0, 0, "-", "modis"], [32, 0, 0, "-", "scalar_csv"], [33, 0, 0, "-", "scalar_grf"], [34, 0, 0, "-", "shape"], [35, 0, 0, "-", "visual_iced"]], "meshiphi.dataloaders.scalar.abstract_scalar": [[16, 2, 1, "", "ScalarDataLoader"]], "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader": [[16, 3, 1, "", "__init__"], [16, 3, 1, "", "add_default_params"], [16, 3, 1, "", "calculate_coverage"], [16, 3, 1, "", "downsample"], [16, 3, 1, "", "get_data_col_name"], [16, 3, 1, "", "get_dp_from_coord"], [16, 3, 1, "", "get_hom_condition"], [16, 3, 1, "", "get_value"], [16, 3, 1, "", "import_data"], [16, 3, 1, "", "reproject"], [16, 3, 1, "", "set_data_col_name"], [16, 3, 1, "", "trim_datapoints"]], "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.self": [[16, 4, 1, "", "data"], [16, 4, 1, "", "data_name"]], "meshiphi.dataloaders.scalar.amsr": [[17, 2, 1, "", "AMSRDataLoader"]], "meshiphi.dataloaders.scalar.amsr.AMSRDataLoader": [[17, 3, 1, "", "add_default_params"], [17, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.baltic_sea_ice": [[20, 2, 1, "", "BalticSeaIceDataLoader"]], "meshiphi.dataloaders.scalar.baltic_sea_ice.BalticSeaIceDataLoader": [[20, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.bsose_depth": [[18, 2, 1, "", "BSOSEDepthDataLoader"]], "meshiphi.dataloaders.scalar.bsose_depth.BSOSEDepthDataLoader": [[18, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.bsose_sea_ice": [[19, 2, 1, "", "BSOSESeaIceDataLoader"]], "meshiphi.dataloaders.scalar.bsose_sea_ice.BSOSESeaIceDataLoader": [[19, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.ecmwf_sig_wave_height": [[22, 2, 1, "", "ECMWFSigWaveHeightDataLoader"]], "meshiphi.dataloaders.scalar.ecmwf_sig_wave_height.ECMWFSigWaveHeightDataLoader": [[22, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_max_wave_height": [[23, 2, 1, "", "ERA5MaxWaveHeightDataLoader"]], "meshiphi.dataloaders.scalar.era5_max_wave_height.ERA5MaxWaveHeightDataLoader": [[23, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_mean_wave_direction": [[25, 2, 1, "", "ERA5MeanWaveDirDataLoader"]], "meshiphi.dataloaders.scalar.era5_mean_wave_direction.ERA5MeanWaveDirDataLoader": [[25, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_sig_wave_height": [[24, 2, 1, "", "ERA5SigWaveHeightDataLoader"]], "meshiphi.dataloaders.scalar.era5_sig_wave_height.ERA5SigWaveHeightDataLoader": [[24, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_wave_period": [[26, 2, 1, "", "ERA5WavePeriodDataLoader"]], "meshiphi.dataloaders.scalar.era5_wave_period.ERA5WavePeriodDataLoader": [[26, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_wind_dir": [[27, 2, 1, "", "ERA5WindDirDataLoader"]], "meshiphi.dataloaders.scalar.era5_wind_dir.ERA5WindDirDataLoader": [[27, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_wind_mag": [[28, 2, 1, "", "ERA5WindMagDataLoader"]], "meshiphi.dataloaders.scalar.era5_wind_mag.ERA5WindMagDataLoader": [[28, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.gebco": [[29, 2, 1, "", "GEBCODataLoader"]], "meshiphi.dataloaders.scalar.gebco.GEBCODataLoader": [[29, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.icenet": [[30, 2, 1, "", "IceNetDataLoader"]], "meshiphi.dataloaders.scalar.icenet.IceNetDataLoader": [[30, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.modis": [[31, 2, 1, "", "MODISDataLoader"]], "meshiphi.dataloaders.scalar.modis.MODISDataLoader": [[31, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.scalar_csv": [[32, 2, 1, "", "ScalarCSVDataLoader"]], "meshiphi.dataloaders.scalar.scalar_csv.ScalarCSVDataLoader": [[32, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.scalar_grf": [[33, 2, 1, "", "ScalarGRFDataLoader"]], "meshiphi.dataloaders.scalar.scalar_grf.ScalarGRFDataLoader": [[33, 3, 1, "", "add_default_params"], [33, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.shape": [[34, 2, 1, "", "ShapeDataLoader"]], "meshiphi.dataloaders.scalar.shape.ShapeDataLoader": [[34, 3, 1, "", "add_default_params"], [34, 3, 1, "", "gen_checkerboard"], [34, 3, 1, "", "gen_circle"], [34, 3, 1, "", "gen_gradient"], [34, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.visual_iced": [[35, 2, 1, "", "VisualIcedDataLoader"]], "meshiphi.dataloaders.scalar.visual_iced.VisualIcedDataLoader": [[35, 3, 1, "", "import_data"], [35, 3, 1, "", "import_from_nc"], [35, 3, 1, "", "import_from_tiff"]], "meshiphi.dataloaders.vector": [[37, 0, 0, "-", "abstract_vector"], [38, 0, 0, "-", "baltic_current"], [39, 0, 0, "-", "duacs_current"], [40, 0, 0, "-", "era5_wave_direction_vector"], [41, 0, 0, "-", "era5_wind"], [42, 0, 0, "-", "north_sea_current"], [43, 0, 0, "-", "oras5_current"], [44, 0, 0, "-", "sose"], [45, 0, 0, "-", "vector_csv"], [46, 0, 0, "-", "vector_grf"]], "meshiphi.dataloaders.vector.abstract_vector": [[37, 2, 1, "", "VectorDataLoader"]], "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader": [[37, 3, 1, "", "__init__"], [37, 3, 1, "", "add_default_params"], [37, 3, 1, "", "add_mag_dir"], [37, 3, 1, "", "calc_curl"], [37, 3, 1, "", "calc_divergence"], [37, 3, 1, "", "calc_dmag"], [37, 3, 1, "", "calc_reynolds_number"], [37, 3, 1, "", "calculate_coverage"], [37, 3, 1, "", "downsample"], [37, 3, 1, "", "get_data_col_name"], [37, 3, 1, "", "get_data_col_name_list"], [37, 3, 1, "", "get_dp_from_coord"], [37, 3, 1, "", "get_hom_condition"], [37, 3, 1, "", "get_value"], [37, 3, 1, "", "import_data"], [37, 3, 1, "", "reproject"], [37, 3, 1, "", "set_data_col_name"], [37, 3, 1, "", "set_data_col_name_list"], [37, 3, 1, "", "trim_datapoints"]], "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.self": [[37, 4, 1, "", "data"], [37, 4, 1, "", "data_name"]], "meshiphi.dataloaders.vector.baltic_current": [[38, 2, 1, "", "BalticCurrentDataLoader"]], "meshiphi.dataloaders.vector.baltic_current.BalticCurrentDataLoader": [[38, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.duacs_current": [[39, 2, 1, "", "DuacsCurrentDataLoader"]], "meshiphi.dataloaders.vector.duacs_current.DuacsCurrentDataLoader": [[39, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.era5_wave_direction_vector": [[40, 2, 1, "", "ERA5WaveDirectionLoader"]], "meshiphi.dataloaders.vector.era5_wave_direction_vector.ERA5WaveDirectionLoader": [[40, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.era5_wind": [[41, 2, 1, "", "ERA5WindDataLoader"]], "meshiphi.dataloaders.vector.era5_wind.ERA5WindDataLoader": [[41, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.north_sea_current": [[42, 2, 1, "", "NorthSeaCurrentDataLoader"]], "meshiphi.dataloaders.vector.north_sea_current.NorthSeaCurrentDataLoader": [[42, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.oras5_current": [[43, 2, 1, "", "ORAS5CurrentDataLoader"]], "meshiphi.dataloaders.vector.oras5_current.ORAS5CurrentDataLoader": [[43, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.sose": [[44, 2, 1, "", "SOSEDataLoader"]], "meshiphi.dataloaders.vector.sose.SOSEDataLoader": [[44, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.vector_csv": [[45, 2, 1, "", "VectorCSVDataLoader"]], "meshiphi.dataloaders.vector.vector_csv.VectorCSVDataLoader": [[45, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.vector_grf": [[46, 2, 1, "", "VectorGRFDataLoader"]], "meshiphi.dataloaders.vector.vector_grf.VectorGRFDataLoader": [[46, 3, 1, "", "add_default_params"], [46, 3, 1, "", "import_data"]], "meshiphi.mesh_generation": [[50, 0, 0, "-", "aggregated_cellbox"], [50, 0, 0, "-", "cellbox"], [50, 0, 0, "-", "environment_mesh"], [50, 0, 0, "-", "mesh_builder"], [50, 0, 0, "-", "metadata"], [50, 0, 0, "-", "neighbour_graph"]], "meshiphi.mesh_generation.aggregated_cellbox": [[50, 2, 1, "", "AggregatedCellBox"]], "meshiphi.mesh_generation.aggregated_cellbox.AggregatedCellBox": [[50, 3, 1, "", "__init__"], [50, 3, 1, "", "contains_point"], [50, 3, 1, "", "to_json"]], "meshiphi.mesh_generation.cellbox": [[50, 2, 1, "", "CellBox"]], "meshiphi.mesh_generation.cellbox.CellBox": [[50, 4, 1, "", "Bounds"], [50, 3, 1, "", "__init__"], [50, 3, 1, "", "aggregate"], [50, 4, 1, "", "id"], [50, 3, 1, "", "set_data_source"], [50, 3, 1, "", "set_parent"], [50, 3, 1, "", "should_split"], [50, 3, 1, "", "split"]], "meshiphi.mesh_generation.environment_mesh": [[50, 2, 1, "", "EnvironmentMesh"]], "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh": [[50, 3, 1, "", "__init__"], [50, 4, 1, "", "agg_cellboxes"], [50, 4, 1, "", "bounds"], [50, 4, 1, "", "config"], [50, 3, 1, "", "load_from_json"], [50, 4, 1, "", "neighbour_graph"], [50, 3, 1, "", "save"], [50, 3, 1, "", "to_geojson"], [50, 3, 1, "", "to_json"], [50, 3, 1, "", "to_tif"], [50, 3, 1, "", "update_cellbox"]], "meshiphi.mesh_generation.mesh_builder": [[50, 2, 1, "", "MeshBuilder"]], "meshiphi.mesh_generation.mesh_builder.MeshBuilder": [[50, 3, 1, "", "__init__"], [50, 3, 1, "", "add_dataloader"], [50, 3, 1, "", "build_environmental_mesh"], [50, 3, 1, "", "split_and_replace"], [50, 3, 1, "", "split_to_depth"]], "meshiphi.mesh_generation.metadata": [[50, 2, 1, "", "Metadata"]], "meshiphi.mesh_generation.metadata.Metadata": [[50, 3, 1, "", "__init__"], [50, 4, 1, "", "data_loader"], [50, 4, 1, "", "splitting_conditions"], [50, 4, 1, "", "value_fill_type"]], "meshiphi.mesh_generation.neighbour_graph": [[50, 2, 1, "", "NeighbourGraph"]], "meshiphi.mesh_generation.neighbour_graph.NeighbourGraph": [[50, 3, 1, "", "get_neighbour_case"], [50, 3, 1, "", "initialise_neighbour_graph"], [50, 4, 1, "", "neighbour_graph"], [50, 3, 1, "", "update_neighbours"]], "meshiphi.mesh_plotting": [[54, 0, 0, "-", "mesh_plotter"]], "meshiphi.mesh_plotting.mesh_plotter": [[54, 2, 1, "", "MeshPlotter"]], "meshiphi.mesh_plotting.mesh_plotter.MeshPlotter": [[54, 3, 1, "", "__init__"], [54, 3, 1, "", "plot_bool"], [54, 3, 1, "", "plot_cmap"], [54, 3, 1, "", "save"]], "meshiphi.mesh_validation": [[52, 0, 0, "-", "mesh_validator"], [52, 0, 0, "-", "sampler"]], "meshiphi.mesh_validation.mesh_validator": [[52, 2, 1, "", "MeshValidator"]], "meshiphi.mesh_validation.mesh_validator.MeshValidator": [[52, 3, 1, "", "__init__"], [52, 4, 1, "", "env_mesh"], [52, 3, 1, "", "get_range_end"], [52, 3, 1, "", "get_value_from_data"], [52, 3, 1, "", "get_values_from_mesh"], [52, 4, 1, "", "mesh"], [52, 3, 1, "", "validate_mesh"], [52, 4, 1, "", "validation_length"]], "meshiphi.mesh_validation.sampler": [[52, 2, 1, "", "Sampler"]], "meshiphi.mesh_validation.sampler.Sampler": [[52, 3, 1, "", "__init__"], [52, 3, 1, "", "generate_samples"], [52, 4, 1, "", "number_of_samples"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"welcom": 0, "meshiphi": [0, 49], "manual": 0, "page": 0, "background": 1, "code": 1, "structur": 1, "command": 2, "line": 2, "interfac": [2, 6], "create_mesh": 2, "export_mesh": 2, "rebuild_mesh": 2, "plot_mesh": 2, "geoplot": 2, "configur": [3, 4], "overview": [3, 15, 51], "config": 3, "valid": [3, 52], "mesh": [4, 50, 51, 52, 53, 54], "construct": [4, 50, 51], "region": 4, "data": [4, 53], "sourc": 4, "split": 4, "ad": [5, 7], "new": [5, 7], "dataload": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47], "repositori": 5, "within": 5, "ipython": 5, "notebook": 5, "factori": 7, "exampl": [7, 14, 36, 47, 48], "object": 7, "abstract": [8, 14, 15, 16, 36, 37, 47], "look": 8, "up": 8, "tabl": 8, "densiti": 9, "lut": [10, 11, 14], "csv": [10, 32, 45], "geojson": 11, "scotland": 12, "ncmpa": 12, "thick": 13, "base": [14, 36, 47], "class": [14, 36, 47, 50], "implement": [14, 36, 47], "section": 15, "type": [15, 53], "scalar": [16, 32, 33, 36], "amsr": 17, "bsose": [18, 19], "depth": 18, "sea": [19, 20, 42], "ic": [19, 20], "baltic": [20, 38], "binari": 21, "grf": [21, 33, 46], "ecmwfsigwaveheight": 22, "era5": [23, 24, 25, 26, 27, 28, 40, 41], "maximum": 23, "wave": [23, 24, 25, 26, 40], "height": [23, 24], "signific": 24, "mean": [25, 26], "direct": [25, 27, 40], "period": 26, "wind": [27, 28, 41], "magnitud": 28, "gebco": 29, "icenet": 30, "modi": 31, "shape": 34, "visual_": 35, "vector": [37, 45, 46, 47], "current": [38, 39, 42, 43, 44], "duac": 39, "north": 42, "oras5": 43, "sose": 44, "creat": 48, "digit": 48, "environ": 48, "instal": 49, "gdal": 49, "option": 49, "window": 49, "linux": 49, "maco": 49, "meshbuild": 50, "environmentmesh": 50, "neighbourgraph": 50, "cellbox": [50, 53], "metadata": 50, "aggregatedcellbox": 50, "method": 51, "design": 51, "us": 51, "case": 51, "addit": 51, "sampler": 52, "output": 53, "The": 53, "json": 53, "file": 53, "neighbour_graph": 53, "plot": 54}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 58}, "alltitles": {"LUT Dataloaders": [[14, "lut-dataloaders"]], "Abstract LUT Base Class": [[14, "abstract-lut-base-class"]], "LUT Dataloader Examples": [[14, "lut-dataloader-examples"]], "Implemented LUT Dataloaders": [[14, "implemented-lut-dataloaders"]], "Binary GRF Dataloader": [[21, "binary-grf-dataloader"]], "Scalar Dataloaders": [[36, "scalar-dataloaders"]], "Abstract Scalar Base Class": [[36, "abstract-scalar-base-class"]], "Scalar Dataloader Examples": [[36, "scalar-dataloader-examples"]], "Implemented Scalar Dataloaders": [[36, "implemented-scalar-dataloaders"]], "Vector Dataloaders": [[47, "vector-dataloaders"]], "Abstract Vector Base Class": [[47, "abstract-vector-base-class"]], "Vector Dataloader Examples": [[47, "vector-dataloader-examples"]], "Implemented Vector Dataloaders": [[47, "implemented-vector-dataloaders"]], "Methods - Mesh Construction": [[51, "methods-mesh-construction"]], "Mesh Construction - Overview": [[51, "id1"]], "Mesh Construction Design": [[51, "mesh-construction-design"]], "Mesh Construction Use case": [[51, "mesh-construction-use-case"]], "Mesh Construction - Additional": [[51, "mesh-construction-additional"]], "Configuration - Mesh Construction": [[4, "configuration-mesh-construction"]], "Region": [[4, "region"]], "Data Sources": [[4, "data-sources"]], "Splitting": [[4, "splitting"]], "Installation": [[49, "installation"]], "Installing MeshiPhi": [[49, "installing-meshiphi"]], "Installing GDAL (Optional)": [[49, "installing-gdal-optional"]], "Windows": [[49, "windows"]], "Linux/MacOS": [[49, "linux-macos"]], "Configuration Overview": [[3, "configuration-overview"]], "Config Validation": [[3, "config-validation"]], "Dataloader Interface": [[6, "dataloader-interface"]], "Dataloader Factory": [[7, "dataloader-factory"]], "Adding New Dataloader to Factory": [[7, "adding-new-dataloader-to-factory"]], "Example": [[7, "example"]], "Dataloader Factory Object": [[7, "module-meshiphi.dataloaders.factory"]], "Abstract Look Up Table Dataloader": [[8, "module-meshiphi.dataloaders.lut.abstract_lut"]], "Density Dataloader": [[9, "density-dataloader"]], "LUT CSV Dataloader": [[10, "lut-csv-dataloader"]], "LUT GeoJSON Dataloader": [[11, "lut-geojson-dataloader"]], "Scotland NCMPA Dataloader": [[12, "scotland-ncmpa-dataloader"]], "Thickness Dataloader": [[13, "thickness-dataloader"]], "Abstract Scalar Dataloader": [[16, "module-meshiphi.dataloaders.scalar.abstract_scalar"]], "AMSR Dataloader": [[17, "amsr-dataloader"]], "BSOSE Depth Dataloader": [[18, "bsose-depth-dataloader"]], "BSOSE Sea Ice Dataloader": [[19, "bsose-sea-ice-dataloader"]], "Baltic Sea Ice Dataloader": [[20, "baltic-sea-ice-dataloader"]], "ECMWFSigWaveHeight Dataloader": [[22, "ecmwfsigwaveheight-dataloader"]], "ERA5 Maximum Wave Height Dataloader": [[23, "era5-maximum-wave-height-dataloader"]], "ERA5 Significant Wave Height Dataloader": [[24, "era5-significant-wave-height-dataloader"]], "ERA5 Mean Wave Direction Dataloader": [[25, "era5-mean-wave-direction-dataloader"]], "ERA5 Mean Wave Period Dataloader": [[26, "era5-mean-wave-period-dataloader"]], "ERA5 Wind Direction Dataloader": [[27, "era5-wind-direction-dataloader"]], "ERA5 Wind Magnitude Dataloader": [[28, "era5-wind-magnitude-dataloader"]], "GEBCO Dataloader": [[29, "gebco-dataloader"]], "IceNet Dataloader": [[30, "icenet-dataloader"]], "MODIS Dataloader": [[31, "modis-dataloader"]], "Scalar CSV Dataloader": [[32, "scalar-csv-dataloader"]], "Scalar GRF Dataloader": [[33, "scalar-grf-dataloader"]], "Shape Dataloader": [[34, "shape-dataloader"]], "Visual_iced Dataloader": [[35, "visual-iced-dataloader"]], "Abstract Vector Dataloader": [[37, "module-meshiphi.dataloaders.vector.abstract_vector"]], "Baltic Currents Dataloader": [[38, "baltic-currents-dataloader"]], "DUACS Currents Dataloader": [[39, "duacs-currents-dataloader"]], "ERA5 Wave Direction Dataloader": [[40, "era5-wave-direction-dataloader"]], "ERA5 Wind Dataloader": [[41, "era5-wind-dataloader"]], "North Sea Currents Dataloader": [[42, "north-sea-currents-dataloader"]], "ORAS5 Currents Dataloader": [[43, "oras5-currents-dataloader"]], "SOSE Currents Dataloader": [[44, "sose-currents-dataloader"]], "Vector CSV Dataloader": [[45, "vector-csv-dataloader"]], "Vector GRF Dataloader": [[46, "vector-grf-dataloader"]], "Mesh Construction - Classes": [[50, "mesh-construction-classes"]], "MeshBuilder": [[50, "meshbuilder"]], "EnvironmentMesh": [[50, "environmentmesh"]], "NeighbourGraph": [[50, "neighbourgraph"]], "CellBox": [[50, "cellbox"]], "MetaData": [[50, "metadata"]], "AggregatedCellBox": [[50, "aggregatedcellbox"]], "Mesh Validation": [[52, "mesh-validation"]], "Mesh Validator": [[52, "module-meshiphi.mesh_validation.mesh_validator"]], "Sampler": [[52, "module-meshiphi.mesh_validation.sampler"]], "Mesh Plotting": [[54, "mesh-plotting"]], "Background": [[1, "background"]], "Code Structure": [[1, "code-structure"]], "Command Line Interface": [[2, "command-line-interface"]], "create_mesh": [[2, "create-mesh"]], "export_mesh": [[2, "export-mesh"]], "rebuild_mesh": [[2, "rebuild-mesh"]], "plot_mesh (GeoPlot)": [[2, "plot-mesh-geoplot"]], "Outputs - Data Types": [[53, "outputs-data-types"]], "The Mesh.json file": [[53, "the-mesh-json-file"]], "cellboxes": [[53, "cellboxes"]], "neighbour_graph": [[53, "neighbour-graph"]], "Welcome to the MeshiPhi Manual Pages": [[0, "welcome-to-the-meshiphi-manual-pages"]], "Examples": [[48, "examples"]], "Creating the Digital Environment.": [[48, "creating-the-digital-environment"]], "Adding New Dataloaders": [[5, "adding-new-dataloaders"]], "Adding to the repository": [[5, "adding-to-the-repository"]], "Adding within iPython Notebooks": [[5, "adding-within-ipython-notebooks"]], "Dataloader Overview": [[15, "dataloader-overview"]], "Section Overview": [[15, "section-overview"]], "Dataloader Types": [[15, "dataloader-types"]], "Abstract Dataloaders": [[15, "abstract-dataloaders"]]}, "indexentries": {}}) \ No newline at end of file +Search.setIndex({"docnames": ["index", "sections/Code_overview", "sections/Command_line_interface", "sections/Configuration/Configuration_overview", "sections/Configuration/Mesh_construction_config", "sections/Dataloaders/AddingDataloaders", "sections/Dataloaders/DataLoaderInterface", "sections/Dataloaders/Factory", "sections/Dataloaders/lut/abstractLUT", "sections/Dataloaders/lut/implemented/Density", "sections/Dataloaders/lut/implemented/LutCSV", "sections/Dataloaders/lut/implemented/LutGeoJSON", "sections/Dataloaders/lut/implemented/Scotland_NCMPA", "sections/Dataloaders/lut/implemented/Thickness", "sections/Dataloaders/lut/index", "sections/Dataloaders/overview", "sections/Dataloaders/scalar/abstractScalar", "sections/Dataloaders/scalar/implemented/AMSR", "sections/Dataloaders/scalar/implemented/BSOSEDepth", "sections/Dataloaders/scalar/implemented/BSOSESeaIce", "sections/Dataloaders/scalar/implemented/BalticSeaIce", "sections/Dataloaders/scalar/implemented/BinaryGRF", "sections/Dataloaders/scalar/implemented/ECMWFSigWaveHeight", "sections/Dataloaders/scalar/implemented/ERA5MaxWaveHeight", "sections/Dataloaders/scalar/implemented/ERA5SigWaveHeight", "sections/Dataloaders/scalar/implemented/ERA5WaveDirection", "sections/Dataloaders/scalar/implemented/ERA5WavePeriod", "sections/Dataloaders/scalar/implemented/ERA5WindDirection", "sections/Dataloaders/scalar/implemented/ERA5WindMagnitude", "sections/Dataloaders/scalar/implemented/GEBCO", "sections/Dataloaders/scalar/implemented/IceNet", "sections/Dataloaders/scalar/implemented/MODIS", "sections/Dataloaders/scalar/implemented/ScalarCSV", "sections/Dataloaders/scalar/implemented/ScalarGRF", "sections/Dataloaders/scalar/implemented/Shape", "sections/Dataloaders/scalar/implemented/visual_iced", "sections/Dataloaders/scalar/index", "sections/Dataloaders/vector/abstractVector", "sections/Dataloaders/vector/implemented/BalticCurrent", "sections/Dataloaders/vector/implemented/DUACS", "sections/Dataloaders/vector/implemented/ERA5WaveDirection", "sections/Dataloaders/vector/implemented/ERA5Wind", "sections/Dataloaders/vector/implemented/NorthSeaCurrent", "sections/Dataloaders/vector/implemented/ORAS5Current", "sections/Dataloaders/vector/implemented/SOSE", "sections/Dataloaders/vector/implemented/VectorCSV", "sections/Dataloaders/vector/implemented/VectorGRF", "sections/Dataloaders/vector/index", "sections/Examples", "sections/Installation", "sections/Mesh_Construction/Mesh_construction_classes", "sections/Mesh_Construction/Mesh_construction_overview", "sections/Mesh_Construction/Mesh_validation", "sections/Outputs", "sections/Plotting/mesh_plotting"], "filenames": ["index.rst", "sections/Code_overview.rst", "sections/Command_line_interface.rst", "sections/Configuration/Configuration_overview.rst", "sections/Configuration/Mesh_construction_config.rst", "sections/Dataloaders/AddingDataloaders.rst", "sections/Dataloaders/DataLoaderInterface.rst", "sections/Dataloaders/Factory.rst", "sections/Dataloaders/lut/abstractLUT.rst", "sections/Dataloaders/lut/implemented/Density.rst", "sections/Dataloaders/lut/implemented/LutCSV.rst", "sections/Dataloaders/lut/implemented/LutGeoJSON.rst", "sections/Dataloaders/lut/implemented/Scotland_NCMPA.rst", "sections/Dataloaders/lut/implemented/Thickness.rst", "sections/Dataloaders/lut/index.rst", "sections/Dataloaders/overview.rst", "sections/Dataloaders/scalar/abstractScalar.rst", "sections/Dataloaders/scalar/implemented/AMSR.rst", "sections/Dataloaders/scalar/implemented/BSOSEDepth.rst", "sections/Dataloaders/scalar/implemented/BSOSESeaIce.rst", "sections/Dataloaders/scalar/implemented/BalticSeaIce.rst", "sections/Dataloaders/scalar/implemented/BinaryGRF.rst", "sections/Dataloaders/scalar/implemented/ECMWFSigWaveHeight.rst", "sections/Dataloaders/scalar/implemented/ERA5MaxWaveHeight.rst", "sections/Dataloaders/scalar/implemented/ERA5SigWaveHeight.rst", "sections/Dataloaders/scalar/implemented/ERA5WaveDirection.rst", "sections/Dataloaders/scalar/implemented/ERA5WavePeriod.rst", "sections/Dataloaders/scalar/implemented/ERA5WindDirection.rst", "sections/Dataloaders/scalar/implemented/ERA5WindMagnitude.rst", "sections/Dataloaders/scalar/implemented/GEBCO.rst", "sections/Dataloaders/scalar/implemented/IceNet.rst", "sections/Dataloaders/scalar/implemented/MODIS.rst", "sections/Dataloaders/scalar/implemented/ScalarCSV.rst", "sections/Dataloaders/scalar/implemented/ScalarGRF.rst", "sections/Dataloaders/scalar/implemented/Shape.rst", "sections/Dataloaders/scalar/implemented/visual_iced.rst", "sections/Dataloaders/scalar/index.rst", "sections/Dataloaders/vector/abstractVector.rst", "sections/Dataloaders/vector/implemented/BalticCurrent.rst", "sections/Dataloaders/vector/implemented/DUACS.rst", "sections/Dataloaders/vector/implemented/ERA5WaveDirection.rst", "sections/Dataloaders/vector/implemented/ERA5Wind.rst", "sections/Dataloaders/vector/implemented/NorthSeaCurrent.rst", "sections/Dataloaders/vector/implemented/ORAS5Current.rst", "sections/Dataloaders/vector/implemented/SOSE.rst", "sections/Dataloaders/vector/implemented/VectorCSV.rst", "sections/Dataloaders/vector/implemented/VectorGRF.rst", "sections/Dataloaders/vector/index.rst", "sections/Examples.rst", "sections/Installation.rst", "sections/Mesh_Construction/Mesh_construction_classes.rst", "sections/Mesh_Construction/Mesh_construction_overview.rst", "sections/Mesh_Construction/Mesh_validation.rst", "sections/Outputs.rst", "sections/Plotting/mesh_plotting.rst"], "titles": ["Welcome to the MeshiPhi Manual Pages", "4. Background", "3. Command Line Interface", "5. Configuration Overview", "5.1. Configuration - Mesh Construction", "7.6. Adding New Dataloaders", "7.1. Dataloader Interface", "7.2. Dataloader Factory", "7.5.1.1. Abstract Look Up Table Dataloader", "7.5.3.1. Density Dataloader", "7.5.3.2. LUT CSV Dataloader", "7.5.3.3. LUT GeoJSON Dataloader", "7.5.3.4. Scotland NCMPA Dataloader", "7.5.3.5. Thickness Dataloader", "7.5. LUT Dataloaders", "7. Dataloader Overview", "7.3.1.1. Abstract Scalar Dataloader", "7.3.3.1. AMSR Dataloader", "7.3.3.2. BSOSE Depth Dataloader", "7.3.3.3. BSOSE Sea Ice Dataloader", "7.3.3.4. Baltic Sea Ice Dataloader", "7.3.3.5. Binary GRF Dataloader", "7.3.3.6. ECMWFSigWaveHeight Dataloader", "7.3.3.7. ERA5 Maximum Wave Height Dataloader", "7.3.3.8. ERA5 Significant Wave Height Dataloader", "7.3.3.9. ERA5 Mean Wave Direction Dataloader", "7.3.3.10. ERA5 Mean Wave Period Dataloader", "7.3.3.11. ERA5 Wind Direction Dataloader", "7.3.3.12. ERA5 Wind Magnitude Dataloader", "7.3.3.13. GEBCO Dataloader", "7.3.3.14. IceNet Dataloader", "7.3.3.15. MODIS Dataloader", "7.3.3.16. Scalar CSV Dataloader", "7.3.3.17. Scalar GRF Dataloader", "7.3.3.18. Shape Dataloader", "7.3.3.19. Visual_iced Dataloader", "7.3. Scalar Dataloaders", "7.4.1.1. Abstract Vector Dataloader", "7.4.3.1. Baltic Currents Dataloader", "7.4.3.2. DUACS Currents Dataloader", "7.4.3.3. ERA5 Wave Direction Dataloader", "7.4.3.4. ERA5 Wind Dataloader", "7.4.3.5. North Sea Currents Dataloader", "7.4.3.6. ORAS5 Currents Dataloader", "7.4.3.7. SOSE Currents Dataloader", "7.4.3.8. Vector CSV Dataloader", "7.4.3.9. Vector GRF Dataloader", "7.4. Vector Dataloaders", "2. Examples", "1. Installation", "8.4.1. Mesh Construction - Classes", "8. Methods - Mesh Construction", "8.4.2. Mesh Validation", "6. Outputs - Data Types", "9. Mesh Plotting"], "terms": {"i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53], "tool": [0, 1, 30], "discretis": [0, 1, 4], "environment": [0, 1, 3, 4, 5, 15, 50, 54], "data": [0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52], "non": [0, 1, 4, 50], "uniform": [0, 1, 4, 50, 52], "resolut": [0, 1, 2, 4, 23, 24, 25, 26, 27, 28, 31, 34, 40, 41, 48, 50], "base": [0, 2, 4, 5, 7, 9, 12, 13, 15, 17, 20, 50, 52], "varianc": 0, "thi": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 15, 16, 17, 18, 19, 21, 22, 32, 33, 34, 36, 37, 38, 40, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], "softwar": [0, 1, 2, 3, 49], "packag": [0, 1, 2, 3, 48, 49, 50], "ha": [0, 2, 7, 9, 10, 11, 12, 13, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 49, 50, 53], "been": [0, 2, 7, 15, 18, 19, 30, 44, 53], "develop": [0, 1, 30, 31, 35, 39, 48], "british": [0, 30, 35], "antarct": [0, 9, 13, 30, 35], "survei": [0, 30, 35], "ba": [0, 2, 48], "initi": [0, 4, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 51, 52], "part": [0, 39, 53], "rout": [0, 2, 3], "plan": [0, 2], "research": [0, 17, 22, 30], "vessel": [0, 3, 50], "rr": 0, "sir": 0, "david": 0, "attenborough": 0, "though": 50, "can": [0, 1, 2, 3, 7, 8, 10, 12, 15, 16, 17, 18, 19, 20, 22, 29, 31, 33, 34, 36, 37, 38, 39, 43, 44, 46, 47, 48, 49, 50, 51, 53], "appli": [0, 4, 35, 53], "ani": [0, 2, 4, 8, 10, 11, 16, 32, 37, 45, 48, 50], "geospati": [0, 50], "The": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 46, 47, 48, 50, 51, 54], "written": [0, 3, 7], "python": [0, 1, 3, 48, 49], "open": [0, 3, 5, 14, 35, 36, 47, 48, 50, 53], "sourc": [0, 2, 7, 10, 11, 32, 34, 35, 36, 45, 47, 48, 49, 50, 52], "contain": [0, 2, 4, 8, 11, 15, 16, 21, 33, 34, 37, 46, 50, 52, 54], "limit": [0, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50], "plot": [0, 1, 2, 4, 48], "function": [0, 1, 4, 5, 8, 14, 15, 16, 17, 36, 37, 47, 48, 50, 54], "which": [0, 1, 2, 4, 6, 15, 16, 18, 21, 35, 37, 40, 43, 48, 50, 52], "describ": [0, 50, 51], "mesh": [0, 1, 2, 3, 5, 6, 7, 8, 10, 11, 14, 15, 16, 32, 34, 36, 37, 45, 47, 48], "section": [0, 1, 2, 3, 4, 48, 49, 50, 51, 53], "For": [0, 7, 15, 33, 46, 50, 51, 53], "extend": 0, "we": [0, 1, 3, 15, 35, 49, 50, 51], "recommend": [0, 49], "us": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 18, 19, 21, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 37, 40, 41, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54], "geoplot": [0, 48, 54], "also": [0, 1, 2, 3, 4, 17, 37, 48, 54], "avail": [0, 2, 4, 7, 8, 9, 13, 16, 17, 18, 19, 23, 24, 25, 26, 27, 28, 29, 30, 37, 38, 39, 40, 41, 42, 43, 44], "follow": [0, 2, 4, 5, 7, 8, 15, 16, 33, 37, 46, 48, 49, 50, 51, 53], "github": [0, 2, 3, 4, 49], "repositori": [0, 49], "more": [0, 14, 15, 16, 18, 19, 36, 37, 42, 44, 47, 50, 51], "inform": [0, 1, 4, 23, 24, 25, 26, 27, 28, 31, 40, 41, 42, 48, 50], "project": [0, 2, 8, 15, 16, 18, 19, 36, 37, 44, 47, 50], "pleas": [0, 51], "visit": 0, "amop": 0, "websit": [0, 18, 19, 23, 24, 25, 26, 27, 28, 30, 31, 39, 40, 41, 43, 44], "our": [0, 50], "codebas": [0, 1], "ongo": 0, "yet": [0, 33, 46], "complet": [0, 8, 11, 16, 33, 34, 37, 46], "contact": 0, "content": 0, "instal": [0, 48], "gdal": 0, "option": [0, 2, 3, 4, 5, 7, 8, 15, 50], "exampl": [0, 1, 2, 3, 4, 5, 15, 50, 53], "creat": [0, 5, 7, 9, 12, 13, 14, 15, 33, 34, 36, 46, 47, 50], "digit": [0, 2], "environ": [0, 2, 4, 49, 50, 51], "command": [0, 3, 48], "line": [0, 3, 4, 36, 47, 48, 50], "interfac": [0, 5, 15, 48], "create_mesh": [0, 48], "export_mesh": 0, "rebuild_mesh": 0, "plot_mesh": 0, "background": 0, "code": [0, 2, 6, 15, 48, 50], "structur": [0, 3, 9, 50], "configur": [0, 1, 2, 48, 50, 51, 53], "overview": [0, 1, 50], "construct": [0, 1, 2, 3, 10, 11, 15, 32, 34, 45, 48, 52, 53], "config": [0, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 52, 53], "valid": [0, 51], "output": [0, 1, 2, 4, 15, 16, 35, 36, 37, 47, 48], "type": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 50, 52, 54], "json": [0, 2, 3, 4, 5, 7, 48, 50, 54], "file": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 50, 52, 54], "dataload": [0, 1, 50], "factori": [0, 5, 15, 34, 47], "scalar": [0, 4, 5, 7, 8, 10, 11, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 34, 35, 37, 46, 47], "vector": [0, 4, 7, 15, 33, 38, 39, 40, 41, 42, 43, 44, 48, 50], "lut": [0, 7, 8, 9, 12, 13, 15], "ad": [0, 4, 15, 48, 50], "new": [0, 14, 15, 18, 19, 36, 37, 44, 47, 50], "method": [0, 1, 5, 6, 7, 8, 14, 15, 16, 34, 36, 37, 47, 48, 50], "design": [0, 10, 11, 32, 34, 45], "case": [0, 4, 8, 15, 16, 37, 50], "addit": [0, 1, 11, 17, 39, 48], "aim": 1, "manual": 1, "provid": [1, 2, 3, 7, 8, 11, 12, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 50, 52, 54], "user": [1, 2, 3, 5, 8, 14, 15, 16, 36, 37, 47, 54], "all": [1, 4, 6, 7, 8, 16, 23, 24, 25, 26, 27, 28, 36, 37, 40, 41, 47, 50, 52], "thei": [1, 3, 4, 15, 36, 47, 51], "need": [1, 5, 6, 7, 8, 14, 15, 16, 35, 36, 37, 47, 48], "run": [1, 48, 50], "set": [1, 2, 5, 7, 8, 11, 16, 21, 33, 34, 36, 37, 46, 47, 50], "hope": 1, "suppli": [1, 3], "each": [1, 2, 4, 5, 7, 8, 15, 16, 35, 37, 50, 51, 52, 53], "allow": [1, 2, 3, 4, 7, 16, 37, 49, 54], "understand": [1, 17], "throughout": [1, 51], "separ": [1, 4, 5, 15, 47], "stage": [1, 2], "broken": [1, 46], "down": [1, 15, 46], "1": [1, 4, 5, 13, 16, 20, 21, 31, 33, 34, 35, 36, 37, 50, 53], "read": [1, 3, 5, 6, 7, 8, 10, 15, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 38, 39, 40, 41, 42, 43, 44, 45], "differ": [1, 14, 17, 21, 37, 39, 43, 47], "dataset": [1, 4, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47], "outlin": [1, 3, 49, 50, 51], "form": [1, 4, 6, 8, 16, 33, 34, 37, 46, 48, 50, 53], "input": [1, 3, 7, 50, 51], "should": [1, 4, 5, 8, 11, 15, 16, 37, 48, 50, 52], "take": [1, 4, 10, 11, 13, 32, 40, 45, 51, 52], "tip": 1, "pre": [1, 49, 50], "process": [1, 2, 4, 15, 39, 52], "your": [1, 15], "2": [1, 13, 16, 30, 31, 37, 50, 53], "gener": [1, 3, 4, 5, 6, 7, 8, 9, 13, 15, 16, 18, 19, 21, 23, 24, 25, 26, 27, 28, 29, 33, 34, 35, 37, 40, 41, 42, 44, 46, 50, 51, 52, 53], "represent": [1, 4, 50, 52, 53], "condit": [1, 4, 6, 7, 8, 15, 16, 37, 50, 53], "In": [1, 3, 4, 6, 7, 15, 33, 35, 46, 49, 50], "class": [1, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 51, 52, 54], "ar": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 14, 15, 16, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 33, 34, 35, 36, 37, 38, 40, 41, 42, 46, 47, 49, 50, 53], "defin": [1, 4, 5, 7, 8, 14, 15, 16, 17, 32, 33, 34, 36, 37, 45, 46, 47, 50], "give": [1, 4, 39, 40], "dynam": [1, 39], "split": [1, 8, 15, 16, 48, 50], "finer": 1, "region": [1, 8, 10, 11, 13, 14, 50], "spatial": [1, 4, 15, 23, 24, 25, 26, 27, 28, 40, 41, 50, 52, 53], "vari": 1, "make": [1, 3, 4, 15], "found": [1, 2, 3, 8, 16, 31, 53], "document": [1, 2, 3, 21, 48, 50, 53], "produc": [1, 2, 7, 15, 17, 20, 22, 23, 24, 25, 26, 27, 28, 33, 40, 41, 46, 48, 50, 54], "an": [1, 2, 3, 4, 5, 7, 8, 13, 14, 15, 18, 19, 23, 24, 25, 26, 27, 28, 30, 34, 36, 37, 40, 47, 48, 49, 50, 51, 52, 53], "main": [4, 15, 50, 51], "have": [1, 4, 7, 8, 10, 15, 16, 36, 37, 47, 52, 53], "seri": 50, "interact": [1, 6, 48, 51, 54], "map": [1, 13, 30, 35, 37, 48, 50], "static": [1, 7, 54], "figur": [1, 4, 51], "featur": 50, "These": [1, 3, 4, 15, 35], "later": 1, "meshiphi": [2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53, 54], "cli": [2, 48], "entri": [2, 5, 7, 43, 48, 53], "point": [2, 3, 4, 16, 37, 48, 50], "build": [2, 4, 5, 50, 52], "from": [0, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 53, 54], "hetrogen": [], "collect": [2, 50], "mai": [4, 5, 6, 7, 15, 18, 19, 44, 47, 48, 50, 53], "export": [2, 49, 50, 53], "varieti": 2, "format": [2, 5, 8, 14, 15, 16, 18, 19, 36, 37, 44, 47, 48, 50, 51], "other": [2, 4, 6, 16, 18, 19, 22, 29, 38, 39, 44, 50, 51], "system": [2, 4, 16, 30, 37, 39, 42, 43, 49], "gi": 2, "directli": 2, "polarrout": 2, "": [2, 3, 4, 8, 15, 16, 17, 29, 31, 35, 37, 50, 51, 52, 53], "optin": [], "through": [2, 3, 6, 8, 48, 50], "perform": [3, 4, 5, 7, 8, 10, 11, 16, 32, 37, 45, 50], "model": [4, 9, 18, 19, 42, 44, 50], "planner": [], "posit": [2, 53], "argument": [2, 3], "A": [2, 4, 9, 13, 48, 50, 51, 53], "detail": [2, 4, 5, 14, 15, 36, 47, 50, 51], "how": [2, 4, 5, 6, 14, 15, 17, 23, 24, 25, 26, 27, 28, 36, 40, 41, 47, 48, 50, 51], "parsabl": [2, 50], "requir": [2, 4, 5, 7, 8, 11, 14, 15, 16, 33, 34, 36, 37, 46, 47, 49], "There": [2, 4, 15], "directori": [2, 3], "environment_config": [2, 3, 4, 48], "grf_exampl": [2, 4, 48], "v": [2, 9, 40], "verbos": 2, "log": [2, 36, 47], "o": 2, "locat": [2, 4, 7, 50], "return": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52], "explain": 2, "onc": [2, 50, 53], "built": [2, 54], "output_loc": 2, "output_format": 2, "save": [2, 8, 11, 14, 16, 36, 37, 46, 47, 48, 50, 53, 54], "support": [2, 4, 8, 35, 50], "default": [2, 4, 7, 8, 10, 11, 16, 21, 33, 34, 36, 37, 46, 47, 50], "geo": [2, 50, 52], "polygon": [2, 8, 10, 11, 13, 14, 50], "cell": [2, 4, 35, 50], "geojson": [2, 12, 14, 15, 50], "tif": [2, 50], "rasteris": 2, "png": 2, "format_conf": 2, "data_nam": [2, 4, 5, 6, 8, 10, 11, 16, 21, 33, 37, 46, 47, 50], "elev": [2, 4, 18, 29, 48, 50], "sampling_resolut": [2, 50], "150": [2, 50], "3031": [2, 50], "color_conf": 2, "path": [2, 3, 50, 52], "txt": 2, "where": [2, 4, 8, 15, 16, 31, 37, 42, 50, 51, 53], "variabl": [2, 4, 8, 9, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46], "name": [2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 54], "layer": [2, 38], "list": [2, 4, 7, 8, 10, 11, 16, 37, 48, 50, 53], "two": [2, 7, 10, 15, 37, 46, 49, 50], "valu": [2, 3, 4, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 33, 34, 35, 36, 37, 38, 43, 46, 47, 50, 52, 53, 54], "first": [2, 46, 50], "being": [2, 8, 11, 15, 16, 30, 33, 34, 36, 37, 46, 47, 50], "x": [2, 36, 37, 46, 47, 53], "second": [2, 46], "y": [2, 36, 37, 46, 47, 53], "string": [2, 3, 4, 10, 37, 47, 50, 52, 53], "epsg": [2, 4, 8, 15, 16, 36, 37, 47, 50], "color": [2, 50], "text": [2, 50], "scheme": 2, "when": [2, 4, 6, 8, 11, 14, 15, 16, 36, 37, 47, 49, 50], "0": [2, 4, 5, 21, 33, 34, 35, 36, 46, 50], "240": [2, 50], "250": [2, 50], "160": [2, 50], "30": [2, 4, 50], "230": [2, 50], "220": [2, 50], "170": [2, 50], "60": [2, 50], "100": [2, 4, 35, 50], "4": [2, 4, 13, 37, 50, 53], "column": [2, 8, 10, 11, 15, 16, 17, 21, 32, 33, 36, 37, 45, 46, 47, 50], "per": [2, 13, 15, 21, 33, 46, 50], "correspond": [2, 37, 50, 53], "red": [2, 50], "green": [2, 50], "blue": [2, 4, 50], "between": [2, 4, 16, 21, 34, 35, 37, 50, 52], "255": [2, 50], "onli": [2, 4, 5, 6, 7, 11, 15, 17, 21, 35, 49], "specifi": [2, 4, 10, 11, 13, 19, 21, 33, 52, 53], "you": [2, 5, 7, 49], "want": [2, 7, 8], "singl": [2, 4, 7, 8, 15, 16, 35], "rebuild": 2, "origin": [2, 37, 50], "store": [2, 4, 6, 7, 8, 15, 16, 37, 47, 50], "within": [2, 3, 4, 6, 7, 8, 9, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 52, 53], "primarili": [2, 10, 11, 32, 34, 45], "debug": [2, 5, 34, 36, 47], "updat": [2, 17, 37, 49, 50], "old": [2, 37], "older": 2, "version": [2, 49], "reappli": [], "simul": [9, 12, 13, 30, 34], "were": [9, 13, 37], "visualis": [2, 48], "librari": [2, 35], "relev": [2, 37], "page": [2, 4, 5, 14, 15, 21, 33, 36, 46, 47], "qgi": 2, "common": [2, 4, 15, 29, 49], "standard": [3, 14, 36, 47, 50], "portion": 4, "pass": [3, 7, 17, 50], "script": [], "descript": [3, 22, 52, 53], "At": 7, "major": [], "templat": [3, 15], "schema": 3, "check": [3, 4, 16, 37, 50], "correct": [3, 7, 34], "keyword": [3, 4, 11], "datatyp": 3, "well": [34, 54], "waypoint": 3, "csv": [11, 14, 15, 36, 47], "rudimentari": 3, "ensur": [3, 15, 33], "sens": [3, 15], "e": [3, 4, 5, 15, 39, 47, 50], "g": [3, 4, 5, 47, 50], "start_tim": [3, 4, 50], "befor": [3, 4, 5, 33, 52], "end_tim": [3, 4, 50], "config_valid": 3, "flexi_json_input": 3, "flexibl": [3, 7, 15], "If": [3, 4, 5, 8, 16, 19, 37, 50], "pars": [3, 8, 16], "assum": [3, 5, 37, 49], "dict": [3, 4, 6, 7, 8, 11, 13, 16, 17, 33, 34, 37, 46, 50, 52], "alreadi": [3, 36, 47], "load": [3, 5, 10, 11, 15, 17, 32, 33, 34, 35, 36, 45, 46, 47, 48, 50, 53], "paramet": [3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 52], "str": [3, 6, 7, 8, 16, 37, 50, 54], "translat": [3, 7, 17], "rais": [3, 8, 16, 19, 37], "typeerror": 3, "neither": 3, "nor": 3, "wrong": [3, 36, 47], "dictionari": [3, 4, 5, 6, 7, 8, 11, 16, 17, 33, 34, 37, 46, 50], "validate_mesh_config": 3, "tri": 3, "filenam": [3, 54], "incorrect": 3, "must": [3, 4, 7, 8, 10, 14, 15, 16, 21, 33, 34, 36, 37, 46, 47], "filenotfounderror": 3, "could": 3, "validationerror": 3, "malform": 3, "validate_route_config": 3, "validate_vessel_config": 3, "validate_waypoint": 3, "_summary_": 3, "pd": [3, 8, 9, 10, 11, 12, 13, 16, 30, 32, 33, 37, 45, 46, 48], "datafram": [3, 8, 9, 10, 11, 12, 13, 14, 15, 16, 21, 30, 32, 33, 36, 37, 45, 46, 47, 48], "_description_": 3, "assertionerror": [3, 8], "below": [4, 5, 16, 21, 36, 37, 47, 49, 51], "full": 4, "gaussian": [4, 33, 46], "random": [4, 21, 33, 46], "field": [4, 33, 37, 46], "sic": [4, 17, 18, 19, 20, 22, 30, 31, 35, 48, 50], "thick": [4, 7, 9, 12, 14, 38], "densiti": [4, 7, 13, 14, 15, 37], "uc": [4, 38, 39, 42, 43, 44, 46, 47], "vc": [4, 38, 39, 42, 43, 44, 46, 47], "current": [4, 8, 15, 16, 17, 37, 47, 48, 50], "u10": [4, 41], "v10": [4, 41], "wind": [4, 15, 36, 47, 48], "includ": [4, 8, 15, 16, 22, 23, 24, 25, 26, 27, 28, 33, 34, 36, 37, 38, 40, 41, 43, 46, 47, 48, 49, 50], "real": [4, 15, 33, 39, 46, 50], "lat_min": [4, 50], "lat_max": [4, 50], "10": [4, 13, 33, 46, 49, 52, 54], "long_min": [4, 50], "long_max": [4, 50], "2017": 4, "02": 4, "01": 4, "04": 4, "cell_width": [4, 50], "cell_height": [4, 50], "data_sourc": [4, 50], "loader": [4, 7, 21, 33, 46, 47, 50], "scalar_grf": [4, 7, 33], "param": [4, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52, 54], "min": [4, 8, 16, 21, 33, 34, 37, 46, 50], "max": [4, 8, 16, 21, 33, 34, 37, 46, 50], "seed": [4, 21, 33, 46], "16": 4, "offset": [4, 33], "5": [4, 5, 7, 13, 21, 43, 50], "splitting_condit": [4, 5, 50], "threshold": [4, 5, 16, 21, 33, 37], "75": 4, "upper_bound": [4, 5, 16], "lower_bound": [4, 5, 16], "dataloader_nam": 4, "downsample_factor": [4, 16, 37], "aggregate_typ": 4, "mean": [4, 8, 16, 17, 18, 19, 36, 37, 38, 39, 40, 43, 44, 50], "min_dp": [4, 7, 50], "in_proj": [4, 16, 17, 36, 37, 47], "4326": [4, 8, 15, 16, 36, 37, 47, 50], "out_proj": [4, 16, 17, 36, 37, 47], "x_col": [4, 16, 17, 36, 37, 47], "lat": [4, 8, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52], "y_col": [4, 16, 17, 36, 37, 47], "long": [4, 8, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52], "size": [4, 16, 21, 33, 34, 37, 46], "512": [4, 21, 33, 46], "alpha": [4, 21, 33, 46], "3": [4, 13, 21, 33, 46, 49, 50, 53], "binari": [4, 33, 35, 36, 46, 49], "fals": [4, 8, 16, 21, 33, 37, 48], "multipli": [4, 33], "50": 4, "65": 4, "44": 4, "850": 4, "1000": 4, "40": 4, "vector_grf": [4, 7, 46], "21": 4, "vec_x": [4, 46], "vec_i": [4, 46], "split_depth": [4, 50], "6": [4, 13, 30], "minimum_datapoint": [4, 50], "here": [4, 12, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 38, 39, 40, 41, 42, 43, 44], "dictat": [4, 15], "titl": [4, 10, 48], "mesh_info": [4, 50], "three": [4, 15], "primari": 4, "discret": [4, 50, 51], "definit": 4, "bound": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 52], "tempor": [4, 15, 23, 24, 25, 26, 27, 28, 35, 40, 41, 50], "interest": 4, "start": [3, 4, 33, 34, 46, 50, 51], "shape": [4, 8, 9, 10, 12, 14, 33, 36, 46], "grid": [4, 20, 23, 24, 25, 26, 27, 28, 39, 40, 41, 50], "box": [4, 50], "further": [4, 48], "given": [4, 13, 16, 35, 50, 53, 54], "float": [4, 8, 13, 16, 37, 50, 52, 53], "degre": [4, 40, 53], "minimum": [4, 7, 16, 21, 33, 37, 46], "longitud": [4, 15, 50, 53], "edg": [4, 8, 53], "maximum": [4, 21, 33, 36, 46, 50], "latitud": [4, 15, 50, 53], "yyyi": [4, 50], "mm": [4, 50], "dd": [4, 50], "datetim": 4, "time": [4, 7, 8, 15, 16, 32, 34, 36, 37, 39, 42, 45, 47, 50], "averag": [4, 30, 37], "end": [4, 52], "width": 4, "prior": [4, 48], "height": [4, 22, 25, 26, 27, 28, 36, 38, 40, 41], "refer": [4, 16, 37, 51], "todai": 4, "starttim": 4, "endtim": 4, "item": 4, "repres": [4, 35, 50, 52, 53], "add": [4, 5, 7, 15, 36, 37, 47, 49, 50, 52], "see": [4, 5, 21, 33, 46, 50, 51], "abstractscalardataload": 4, "doc": [4, 14, 36, 47], "about": [4, 23, 24, 25, 26, 27, 28, 40, 41, 50, 51], "value_fill_typ": [4, 50], "determin": [4, 6, 36, 37, 47, 50], "action": [4, 5, 7], "taken": [4, 9, 13, 15, 22], "cellbox": [4, 16, 34, 37, 48, 52], "possibl": [4, 8, 15, 16], "either": [4, 15, 16, 37, 47, 48], "parent": [4, 50], "impli": 4, "assign": [4, 10, 11, 50], "zero": 4, "nan": [4, 8, 10, 11, 16, 37], "aggreg": [4, 6, 8, 16, 35, 37, 50, 52], "By": 4, "place": [4, 51, 52], "calcul": [4, 8, 16, 17, 37, 40, 50, 52], "chang": [4, 8, 16, 37], "count": [4, 8, 16, 37], "abov": [4, 16, 21, 37], "sub": 4, "divid": 4, "datapoint": [4, 7, 8, 15, 16, 21, 33, 34, 37, 46], "homogen": [4, 6, 7, 8, 16, 37, 50], "upperbound": [4, 16], "percentag": [4, 8, 16, 19, 37], "normalis": [4, 33], "deem": [4, 16], "greater": 4, "than": [4, 15, 16, 37], "lowerbound": [4, 16], "less": [4, 16, 37], "curl": [4, 37], "f": [4, 47, 48, 50, 53], "order": [4, 15], "refin": 4, "done": 4, "select": [4, 7, 8, 16, 34, 37], "divis": 4, "whenev": 4, "inhomogen": 4, "respect": [4, 39], "specif": [4, 7, 8, 15, 16, 37, 50], "characterist": [4, 37], "ocean": [4, 15, 17, 18, 19, 23, 24, 25, 26, 27, 28, 29, 39, 40, 41, 42, 43, 44, 50], "depth": [4, 36, 38, 42, 43, 50, 51], "insid": [4, 50, 51], "illustr": [4, 51], "graphic": [4, 50, 53], "decis": 4, "shown": [4, 5], "histogram": 4, "arbitrari": 4, "orang": 4, "denot": 4, "formula": 4, "black": 4, "ub": 4, "upper": [4, 8, 16, 37], "lb": 4, "lower": [4, 8, 16, 37], "To": [4, 7, 15], "probabl": 4, "distribut": [4, 9, 13, 21, 33, 46, 48, 50], "henc": 4, "area": [4, 12, 15, 38], "under": [4, 5, 7, 52], "curv": 4, "decim": [4, 8, 16, 37, 52], "fraction": [4, 8, 16, 19, 37], "total": [4, 38], "would": [4, 5, 14, 36, 47, 49, 52], "show": [4, 6, 20, 48], "decid": 4, "clr": [4, 8, 16, 37, 50], "hom": [4, 16, 50], "het": [4, 8, 16, 37, 50], "fourth": 4, "trigger": [4, 37], "number": [4, 16, 21, 23, 24, 25, 26, 27, 28, 33, 37, 40, 41, 46, 50, 52], "do": [4, 5, 50], "extrem": 4, "alwai": [4, 15], "imagin": 4, "similar": [4, 47], "entir": [4, 31, 33], "both": [1, 4, 7, 15, 22], "colour": [4, 54], "across": 4, "meshbuild": [4, 5, 48, 51], "subject": 4, "satisfi": 4, "abl": 4, "implement": [5, 6, 15, 22, 33, 46, 50], "object": [5, 8, 13, 15, 16, 17, 36, 37, 47, 48, 50, 52, 53, 54], "workflow": 5, "choos": 5, "appropri": [5, 7], "import_data": [5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47], "add_default_param": [5, 8, 11, 15, 16, 17, 33, 34, 36, 37, 46, 47], "abstractscalar": [5, 6, 15, 36, 47], "abstractvector": [5, 6, 14, 15, 47], "py": [5, 7], "instruct": [5, 15, 23, 24, 25, 26, 27, 28, 40, 41, 49], "so": [5, 9, 13, 15, 36, 47, 49, 50], "after": [5, 50, 52], "readi": 5, "go": 5, "It": [0, 5, 10, 11, 17, 19, 21, 23, 24, 25, 26, 27, 28, 29, 32, 34, 40, 41, 44, 45, 49, 50, 51], "purpos": 5, "__name__": 5, "__main__": 5, "test": [5, 10, 11, 15, 17, 32, 34, 45, 50], "its": [5, 22, 48, 50, 52], "deploi": 5, "wish": 5, "modifi": 5, "repo": 5, "one": [5, 7, 15, 22, 43, 49], "call": [5, 6, 7, 8, 16, 37, 51], "add_dataload": [5, 50], "re": 5, "work": [5, 14, 15, 18, 19, 36, 44, 47, 49], "out": [5, 8], "jupyt": [5, 50], "basic": 5, "step": [5, 49], "import": [5, 7, 8, 10, 11, 14, 16, 35, 36, 37, 47, 48, 50, 53], "abstract": [5, 6, 11, 17, 33, 34, 46, 50], "abstract_scalar": [5, 16], "scalardataload": [5, 16, 36, 47, 50], "up": [5, 14, 15, 23, 24, 25, 26, 27, 28, 40, 41], "same": [5, 8, 15, 16, 21, 37, 48, 50], "wai": [5, 50, 52], "exist": [5, 15, 37, 49, 50], "mydataload": [5, 36, 47, 50], "def": [5, 7, 36, 47], "self": [5, 7, 8, 15, 16, 36, 37, 47, 50, 52], "len": [5, 36], "xr": [5, 8, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 31, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 47], "open_dataset": [5, 36, 47], "els": [5, 36, 50], "open_mfdataset": [5, 36, 47], "trim": [5, 8, 15, 16, 37], "boundari": [5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 53], "trim_datapoint": [5, 8, 16, 37], "initialis": [5, 7, 8, 16, 37, 48, 50], "path_to_file_1": [5, 7], "path_to_file_2": [5, 7], "popul": 5, "mani": [5, 43, 50], "my_data": 5, "9": [5, 13, 49], "r": [5, 48, 50, 53], "fp": 5, "mesh_build": [5, 48, 50], "env_mesh": [5, 52], "build_environmental_mesh": [5, 48, 50], "from_json": 5, "builder": 5, "regener": 5, "modified_build": 5, "modified_mesh": 5, "oper": [6, 8, 16, 20, 22, 37, 39, 49], "get_hom_condit": [6, 8, 16, 37], "get_valu": [6, 8, 13, 15, 16, 37], "realist": [6, 33, 46], "dataloader_interfac": 6, "dataloaderinterfac": 6, "intern": [6, 8, 15, 16, 18, 19, 30, 37, 44], "retriev": [6, 7, 8, 15, 16, 37], "splitting_cond": [6, 8, 16, 37], "heterogen": [2, 6], "agg_typ": [6, 8, 16, 37], "np": 6, "float64": 6, "off": 7, "get_dataload": 7, "veri": 7, "least": [7, 8], "those": [7, 50], "third": 7, "dataloader_requir": 7, "myscalardataload": 7, "mandatori": 7, "folder": [7, 17, 22], "get": [7, 49, 50, 52], "kei": [7, 8, 14, 16, 17, 37, 47], "statement": 7, "dataloaderfactori": 7, "myscalar": 7, "altern": [7, 15], "individu": [7, 37], "path_to_data_fil": 7, "path_to_fold": 7, "trail": 7, "quickli": 7, "scalar_csv": [7, 32], "binary_grf": [7, 21], "amsr": [7, 36], "bsose_s": [7, 19], "bsose_depth": [7, 18], "baltic_s": [7, 20], "gebco": [7, 36], "icenet": [7, 36], "modi": [7, 35, 36], "circl": [7, 34], "squar": [7, 34, 52], "gradient": [7, 34], "checkerboard": [7, 34], "vector_csv": [7, 45], "baltic_curr": [7, 38], "era5_wind": [7, 41], "northsea_curr": [7, 42], "oras5_curr": [7, 43], "sose": [7, 18, 19, 47], "duacs_curr": [7, 39], "era5_wave_height": 7, "era5_wave_direct": [7, 40], "space": [7, 52], "int": [7, 13, 21, 33, 46, 50, 52], "translate_file_input": 7, "abstract_lut": 8, "lutdataload": [8, 14], "lookup": 8, "__init__": [8, 13, 15, 16, 33, 37, 46, 50, 52, 54], "larg": [8, 15, 16, 23, 24, 25, 26, 27, 28, 37, 40, 41], "scale": [8, 16, 37], "downsampl": [8, 15, 16, 37], "reproject": [8, 15, 16, 17, 36, 37, 47], "renam": [8, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 47], "scope": [8, 16, 37], "ingest": [8, 16, 18, 19, 37, 44], "uniqu": [8, 11, 16, 37], "upon": [8, 16, 37], "mercat": [8, 15, 16, 37], "geometri": [8, 10, 11, 13, 50, 53], "gpd": 8, "valueerror": [8, 16, 19, 37], "li": [8, 16], "overload": [8, 16, 37], "extra": [8, 16, 37], "attribut": [8, 11, 16, 17, 33, 34, 37, 46, 47, 50, 52], "calculate_coverag": [8, 16, 37], "none": [8, 16, 21, 33, 37, 46, 50], "cover": [8, 16, 23, 24, 25, 26, 27, 28, 37, 40, 41], "compar": [8, 16, 37, 52], "against": [8, 16, 37, 52], "lookupt": 8, "get_data_col_nam": [8, 16, 37], "multipl": [8, 15, 16, 37], "t": [8, 16, 33, 36, 37, 47], "datarang": [8, 16, 37], "analys": [8, 16, 37], "boolean": [8, 54], "true": [8, 16, 21, 37, 50, 53], "goe": [8, 50], "homogenieti": [8, 16, 37], "condtion": [8, 16, 37], "get_val_from_coord": [], "return_coord": [], "extract": [22, 50], "kwarg": [], "coordin": [8, 9, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50], "search": [], "flag": [21, 33, 37], "whether": [8, 16, 37], "coord": [], "optionali": [], "associ": [10, 14, 50], "skipna": [8, 16, 37], "aggregation_typ": [8, 16, 37], "accept": [8, 16, 37], "median": [8, 16, 37], "std": [8, 16, 37], "bool": [8, 16, 37, 50], "propog": [8, 16, 37], "aggregated_valu": [8, 16, 37], "even": [8, 16, 37], "scratch": [8, 16, 37], "set_data_col_nam": [8, 16, 37], "new_nam": [8, 16, 37], "replac": [8, 16, 37, 50], "verify_data": 8, "verifi": 8, "multipolygon": 8, "paper": [9, 13], "sea": [9, 12, 13, 15, 17, 18, 30, 35, 36, 38, 39, 43, 47, 48, 50], "ic": [9, 12, 13, 15, 17, 18, 30, 35, 36, 38, 43, 48, 50], "worbi": [9, 13], "p": [9, 13], "et": [9, 13, 30], "al": [9, 13, 30], "took": 9, "princip": 9, "properti": 9, "strength": 9, "buynitskii": 9, "k": 9, "download": [9, 12, 13, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 31, 38, 39, 40, 41, 42, 43, 44], "densitydataload": 9, "scientif": [9, 12, 13], "literatur": [9, 12, 13], "date": [9, 12, 13], "density_df": 9, "cast": [10, 11, 15, 16, 32, 34, 37, 45, 48], "wa": [0, 10, 11, 32, 34, 39, 42, 45], "dummi": [10, 11, 32, 45], "As": [10, 18, 19, 32, 34, 44, 45, 54], "wkt": 10, "just": [10, 15], "lut_csv": 10, "lutcsv": 10, "outsid": [10, 11], "numpi": [10, 11, 52], "exclusion_df": [10, 11, 12], "lut_geojson": 11, "lutgeojson": 11, "over": [11, 16, 20], "regular": [11, 36, 47], "dummy_data": [11, 34], "scottish": 12, "govern": [12, 50], "natur": 12, "conserv": 12, "marin": [12, 15, 39], "protect": [12, 15], "scotland_ncmpa": 12, "scotlandncmpa": 12, "exclus": [12, 15], "zone": [12, 15], "around": [12, 21], "thicknessdataload": 13, "value_dict": 13, "season": [13, 20, 30], "su": 13, "au": 13, "wi": 13, "7": [13, 22], "8": [13, 49], "sp": 13, "11": 13, "12": 13, "storag": [13, 50], "integ": [13, 52], "month": [13, 30], "account": 13, "hemispher": [13, 17], "jan": 13, "dec": 13, "thickness_df": 13, "look": [14, 15], "tabl": [14, 15], "hold": [14, 17, 36, 47], "most": [14, 36, 47], "manipul": [14, 16, 36, 37, 47, 48], "what": [14, 36, 47], "almost": [14, 47], "ident": [14, 47], "geopanda": [14, 15], "scotland": 14, "ncmpa": 14, "discuss": [15, 50], "respons": 15, "transform": [15, 16, 35, 37, 50], "raw": 15, "interpret": [3, 15, 48], "reduc": [15, 16, 23, 24, 25, 26, 27, 28, 37, 40, 41], "comput": [15, 39], "resourc": [15, 29], "typic": 15, "netcdf": [15, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 35, 36, 38, 39, 40, 41, 42, 43, 44, 47], "howev": 15, "whatev": 15, "panda": [15, 17, 36, 47], "xarrai": [15, 34, 36, 47], "uml": [15, 51], "diagram": [15, 51], "subsystem": 15, "bathymetri": 15, "concentr": [15, 17, 18, 19, 20, 30, 35, 38, 48, 50], "etc": 15, "while": 15, "error": 15, "cut": 15, "correctli": 15, "multi": [15, 39, 51], "dimension": 15, "compon": [15, 37, 38, 40, 46, 47], "dimens": [15, 34, 37, 52], "n": [15, 16, 37, 52], "rigor": 15, "prefer": 15, "weather": [15, 22, 23, 24, 25, 26, 27, 28, 40, 41, 43], "localis": 15, "link": [15, 22], "categori": 15, "generalis": 15, "via": 15, "extens": [15, 18, 19], "dask": 15, "own": 15, "utilis": 15, "much": 15, "memori": 15, "consumpt": 15, "shapefil": 15, "otherwis": 15, "applic": [16, 37], "extent": [16, 37], "easili": [16, 18, 19, 36, 37, 44, 47], "factor": [16, 37], "m": [16, 37], "bin": [16, 37, 49], "get_dp_from_coord": [], "Will": [], "chosen": [], "becaus": [], "bad": [], "data_point": [16, 52], "split_lock": 16, "proport": 16, "higher": [16, 49, 52], "ignor": [16, 37], "happen": [16, 37], "pyproj": [16, 17, 37], "cr": [16, 37], "final": [16, 37, 46, 50], "shouldn": [16, 37], "advanc": [17, 22], "microwav": 17, "scan": 17, "radiomet": 17, "publicli": [17, 18, 19, 29, 30, 43, 44], "earth": [17, 23, 24, 25, 26, 27, 28, 29, 31, 40, 41], "univers": 17, "bremen": 17, "standalon": 17, "independ": 17, "due": 17, "issu": 17, "depend": 17, "caus": 17, "regress": [17, 50], "rectifi": 17, "soon": 17, "amsrdataload": 17, "turn": 17, "pair": 17, "drop": 17, "unnecessari": 17, "polar_stereograph": 17, "z": 17, "b": [18, 19], "biogeochem": [18, 19], "southern": [18, 19, 44], "state": [18, 19, 22, 44], "estim": [18, 19, 23, 24, 25, 26, 27, 28, 39, 40, 41, 43, 44], "solut": [18, 19], "host": [18, 19], "amongst": [18, 19, 29, 39, 44], "product": [18, 19, 23, 24, 25, 26, 27, 28, 31, 38, 39, 40, 41, 44], "Their": [18, 42], "led": [18, 19, 30, 44], "mazloff": [18, 19, 44], "scripp": [18, 19, 44], "institut": [18, 19, 20, 22, 30, 38, 44], "oceanographi": [18, 19, 42, 44], "best": [18, 19, 44], "fit": [18, 19, 39, 44], "observ": [18, 19, 30, 44], "quantit": [18, 19, 44], "climatologi": [18, 19, 44], "note": [18, 19, 33, 44, 46, 50], "collat": [18, 19, 44], "bsosedepthdataload": 18, "bsose_sea_ic": 19, "bsoseseaicedataload": 19, "unit": [19, 40], "finnish": [20, 38], "meteorolog": [20, 22, 38], "fmi": [20, 38], "webpag": [20, 38], "servic": [20, 22, 39], "chart": [20, 29], "daili": [20, 38], "basi": 20, "dure": 20, "km": 20, "baltic_sea_ic": 20, "balticseaicedataload": 20, "instead": 21, "consist": [21, 53], "land": [21, 23, 24, 25, 26, 27, 28, 40, 41], "mask": [21, 33, 46], "axi": [21, 33, 46], "power": [21, 33, 46], "law": [21, 33, 46], "momentum": [21, 33, 46], "ecmwf": [22, 23, 24, 25, 26, 27, 28, 40, 41, 43], "european": [22, 23, 24, 25, 26, 27, 28, 39, 40, 41, 43], "centr": [22, 23, 24, 25, 26, 27, 28, 34, 40, 41, 42, 43], "medium": [22, 23, 24, 25, 26, 27, 28, 40, 41, 43], "rang": [22, 23, 24, 25, 26, 27, 28, 35, 40, 41, 43, 50, 52], "forecast": [22, 23, 24, 25, 26, 27, 28, 30, 40, 41, 43], "24": 22, "global": [22, 23, 24, 25, 26, 27, 28, 39, 40, 41, 43, 50], "numer": [22, 50], "predict": 22, "member": [22, 43], "co": 22, "broader": 22, "commun": 22, "largest": 22, "supercomput": 22, "facil": 22, "archiv": 22, "world": [22, 33, 46, 50], "strateg": 22, "activ": 22, "deliv": 22, "train": [22, 30], "assist": 22, "wmo": 22, "programm": 22, "ecmwf_sig_wave_height": 22, "grib2": 22, "ecmwfsigwaveheightdataload": 22, "signific": [22, 36], "wave": [22, 27, 28, 36, 47], "swh": [22, 24], "famili": [23, 24, 25, 26, 27, 28, 40, 41], "fifth": [23, 24, 25, 26, 27, 28, 40, 41], "atmospher": [23, 24, 25, 26, 27, 28, 40, 41], "reanalysi": [23, 24, 25, 26, 27, 28, 38, 39, 40, 41, 43], "climat": [23, 24, 25, 26, 27, 28, 30, 40, 41], "period": [23, 24, 25, 27, 28, 36, 40, 41], "januari": [23, 24, 25, 26, 27, 28, 40, 41], "1950": [23, 24, 25, 26, 27, 28, 40, 41], "present": [23, 24, 25, 26, 27, 28, 40, 41], "hourli": [23, 24, 25, 26, 27, 28, 40, 41], "30km": [23, 24, 25, 26, 27, 28, 40, 41], "resolv": [23, 24, 25, 26, 27, 28, 40, 41], "137": [23, 24, 25, 26, 27, 28, 40, 41], "level": [23, 24, 25, 26, 27, 28, 39, 40, 41], "surfac": [23, 24, 25, 26, 27, 28, 31, 38, 40, 41], "80km": [23, 24, 25, 26, 27, 28, 40, 41], "uncertainti": [23, 24, 25, 26, 27, 28, 40, 41], "era5_max_wave_height": 23, "era5maxwaveheightdataload": 23, "hmax": 23, "era5_sig_wave_height": 24, "era5sigwaveheightdataload": 24, "era5_wave_dir": 25, "era5_mean_wave_direct": 25, "era5meanwavedirdataload": 25, "mwd": [25, 40], "era5_wave_period": 26, "era5waveperioddataload": 26, "mwp": 26, "era5_wind_dir": 27, "era5winddirdataload": 27, "wind_dir": 27, "era5_wind_mag": 28, "era5windmagdataload": 28, "wind_mag": 28, "bathymetr": [29, 50], "scientist": 29, "gebcodataload": 29, "probabilist": 30, "deep": 30, "learn": 30, "team": 30, "alan": 30, "ture": 30, "andersson": 30, "2021": 30, "next": 30, "monthli": [30, 38, 43], "v1": 30, "v2": 30, "icenetdataload": 30, "moder": 31, "imag": [31, 35, 49, 50], "spectroradiomet": 31, "satellit": [31, 35, 39], "born": 31, "instrument": 31, "nasa": 31, "view": 31, "everi": [31, 38], "dai": 31, "acquir": 31, "36": 31, "spectral": 31, "band": 31, "group": 31, "wavelength": 31, "modisdataload": 31, "scalarcsvdataload": 32, "potenti": [32, 45], "head": [32, 45, 49], "artifici": [33, 46], "somewhat": [33, 46], "isn": 33, "cap": 33, "skew": 33, "outlier": 33, "randomis": 33, "actual": [33, 52], "actual_min": 33, "actual_max": 33, "scalargrfdataload": 33, "known": 34, "shapedataload": 34, "gen_checkerboard": 34, "pattern": 34, "gen_circl": 34, "radiu": 34, "gen_gradi": 34, "direct": [34, 36, 37, 47, 50], "act": 34, "like": [34, 50], "simpli": 34, "enact": 34, "data_xr": 34, "tiff": [35, 49], "martin": 35, "roger": 35, "ai": 35, "lab": 35, "water": 35, "combin": 35, "sar": 35, "imageri": 35, "continu": 35, "visualiceddataload": 35, "visual_ic": 35, "import_from_nc": 35, "xarray_dataset": 35, "import_from_tiff": 35, "simpl": [36, 47], "my": [36, 47], "aren": [36, 47], "lon": [36, 47], "trim_data": [36, 47], "sometim": [36, 47], "constant": [36, 47], "super": [36, 47], "3412": [36, 47], "strictli": [36, 47], "speak": [36, 47], "necessari": [36, 47, 49], "becom": [36, 47], "skip": [36, 47], "now": [36, 47], "bsose": [36, 42], "baltic": [36, 47], "grf": [4, 36, 47, 48], "ecmwfsigwaveheight": 36, "era5": [36, 47], "magnitud": [36, 37, 46], "visual_": 36, "abstract_vector": 37, "vectordataload": [37, 47, 50], "add_mag_dir": 37, "easier": 37, "cartesian": 37, "data_name_list": 37, "_magnitud": 37, "_direct": 37, "calc_curl": 37, "collaps": 37, "collap": 37, "calc_diverg": 37, "diverg": 37, "div": 37, "calc_dmag": 37, "dmag": 37, "mag": 37, "mean_vector": 37, "calc_reynolds_numb": 37, "approxim": 37, "reynold": 37, "veloc": 37, "AND": 37, "viscos": 37, "OF": 37, "seawat": 37, "AT": 37, "c": 37, "WILL": 37, "minor": 37, "rework": 37, "TO": 37, "fluid": 37, "length": [37, 52], "append": 37, "comma": [37, 47], "seper": 37, "get_data_col_name_list": 37, "namesk": 37, "exceed": 37, "name_dict": 37, "old_nam": 37, "set_data_col_name_list": 37, "cmem": 38, "physic": 38, "whole": 38, "inclus": 38, "transit": 38, "north": [38, 40, 47, 50, 53], "hour": 38, "salin": 38, "temperatur": 38, "horizont": 38, "mix": 38, "bottom": 38, "balticcurrentdataload": 38, "copernicu": [38, 39], "mission": 39, "altimet": 39, "cne": 39, "cl": 39, "anomali": 39, "sla": 39, "twenti": 39, "year": 39, "1993": 39, "2012": 39, "optim": [2, 39], "interpol": 39, "merg": 39, "l3": 39, "along": [39, 50], "track": 39, "measur": 39, "absolut": 39, "topographi": 39, "geostroph": 39, "Near": 39, "duacscurrentdataload": 39, "deriv": 39, "come": [40, 50], "angl": 40, "convert": [40, 50], "u": 40, "era5_wave_direction_vector": 40, "era5wavedirectionload": 40, "uw": 40, "vw": 40, "era5winddataload": 41, "atlant": 42, "proudman": 42, "oceanograph": 42, "laboratori": 42, "coastal": 42, "polcom": 42, "uk": 42, "nation": 42, "liverpool": 42, "north_sea_curr": 42, "northseacurrentdataload": 42, "prepar": 43, "ocean5": 43, "analysi": 43, "compris": 43, "ensembl": 43, "publish": 43, "catalogu": 43, "oras5currentdataload": 43, "sosedataload": 44, "vectorcsvdataload": 45, "vectorgrfdataload": 46, "itself": 47, "duac": 47, "oras5": 47, "termin": 48, "increas": 48, "alter": 48, "mesh_gener": [48, 50], "cg": 48, "to_json": [48, 50, 53], "pip": [48, 49], "bas_geoplot": 48, "ipython": [48, 50], "notebook": [48, 50], "mesh_json": [48, 50, 53, 54], "mp": 48, "meshgrid": 48, "predefin": 48, "cx": [48, 50, 53], "expect": 48, "git": 49, "clone": 49, "http": 49, "com": 49, "antarctica": 49, "cd": 49, "steer": 49, "clear": 49, "trivial": 49, "problem": 49, "With": 49, "said": 49, "variou": 49, "virtual": 49, "pipwin": 49, "easi": 49, "fiona": 49, "ubuntu": 49, "debian": 49, "sudo": 49, "apt": 49, "ppa": 49, "ubuntugi": 49, "libgdal": 49, "dev": 49, "cplus_include_path": 49, "usr": 49, "c_include_path": 49, "fedora": 49, "dnf": 49, "devel": 49, "homebrew": 49, "brew": 49, "modul": [50, 51], "behind": 50, "environmentalmesh": 50, "usag": 50, "execut": 50, "respos": 50, "longtitud": 50, "180": 50, "j_grid": 50, "java": 50, "cellgrid": 50, "evironment": 50, "nonunifrom": 50, "neighbour": 50, "graph": 50, "split_and_replac": 50, "smaller": 50, "four": 50, "corner": 50, "surround": 50, "split_to_depth": 50, "until": 50, "reach": 50, "mutabl": 50, "environment_mesh": 50, "agg_cellbox": 50, "neighbour_graph": 50, "conatin": [50, 52], "classmethod": 50, "load_from_json": 50, "env": [50, 52], "ex": 50, "format_param": 50, "local": 50, "to_geojson": 50, "params_fil": 50, "doe": 50, "them": 50, "connect": 50, "togeth": 50, "cellgird": 50, "parseabl": 50, "adjac": [50, 53], "to_tif": 50, "geotif": 50, "folow": 50, "fuel": 50, "pixel": 50, "2d": 50, "arrai": [50, 52], "sampl": [50, 52], "geotiff": 50, "espg": 50, "colour_conf": 50, "update_cellbox": 50, "index": [50, 53], "certain": [50, 51], "perf": 50, "metric": 50, "encod": 50, "grid_width": 50, "relationship": 50, "id": [50, 53], "id_1": [50, 53], "id_n": [50, 53], "get_neighbour_cas": 50, "cellbox_a": 50, "cellbox_b": 50, "touch": 50, "destin": 50, "east": [50, 53], "south": [50, 53], "west": [50, 53], "initialise_neighbour_graph": 50, "update_neighbour": 50, "cellbox_indx": 50, "new_neighbours_indx": 50, "remov": [50, 53], "neighbour_map": 50, "new_neighbour_indx": 50, "cellbox_index": 50, "hous": 50, "access": [50, 52, 53], "intend": 50, "represnt": 50, "enabl": 50, "newli": 50, "logtitut": 50, "encapsul": 50, "set_data_sourc": 50, "spit": 50, "set_par": 50, "bigger": 50, "conain": 50, "got": 50, "should_split": 50, "stop_index": 50, "get_hom_cond": 50, "mixtur": 50, "stop": 50, "deprec": 50, "switch": 50, "breadth": 50, "result": 50, "start_id": 50, "represenst": 50, "usuallli": 50, "uniformli": 50, "among": 50, "data_load": 50, "spliiting_condit": [], "datasourc": 50, "assoc": 50, "indic": 50, "fill": [50, 52], "void": 50, "value_fill_tyep": 50, "aggregated_cellbox": 50, "agg_data": 50, "aggrgat": 50, "agg": 50, "contains_point": 50, "cy": [50, 53], "dcx": [50, 53], "dcy": [50, 53], "agg_value_1": 50, "agg_value_n": 50, "cell_json": 50, "compos": 51, "seen": 51, "depict": 51, "sequenc": [51, 52], "client": 51, "build_environment_mesh": 51, "event": 51, "explan": 51, "todo": 52, "mesh_valid": 52, "meshvalid": 52, "mesh_config_fil": 52, "conf": 52, "vlaidat": 52, "validation_length": 52, "legnth": 52, "wil": 52, "incur": 52, "cost": 52, "cellboox": 52, "environmentmesh": 52, "get_range_end": 52, "clacul": 52, "get_value_from_data": 52, "get_values_from_mesh": 52, "find": 52, "arg": 52, "validate_mesh": 52, "number_of_sampl": 52, "agg_valu": 52, "rmse": 52, "distanc": [52, 53], "actaul": 52, "d": 52, "sobol": 52, "highli": 52, "guarante": 52, "better": 52, "coverag": 52, "generate_sampl": 52, "equal": 52, "fall": 52, "pipelin": [], "stream": [], "vehicl": [2, 53], "understood": 53, "value_1": 53, "value_n": 53, "centroid": 53, "dxy": 53, "longer": 53, "inaccess": 53, "remain": 53, "mesh_plott": 54, "synthet": 4, "pypi": 49, "meshplott": [0, 54], "mesh_plot": 54, "figscal": 54, "matplotlib": 54, "cartopi": 54, "plot_bool": 54, "value_nam": 54, "plot_cmap": 54, "colourmap": 54, "core": 1, "although": 0, "travel": 2, "arcgi": 2, "_": [], "data_subset": 50}, "objects": {"meshiphi.config_validation": [[3, 0, 0, "-", "config_validator"]], "meshiphi.config_validation.config_validator": [[3, 1, 1, "", "flexi_json_input"], [3, 1, 1, "", "validate_mesh_config"], [3, 1, 1, "", "validate_route_config"], [3, 1, 1, "", "validate_vessel_config"], [3, 1, 1, "", "validate_waypoints"]], "meshiphi.dataloaders": [[6, 0, 0, "-", "dataloader_interface"], [7, 0, 0, "-", "factory"]], "meshiphi.dataloaders.dataloader_interface": [[6, 2, 1, "", "DataLoaderInterface"]], "meshiphi.dataloaders.dataloader_interface.DataLoaderInterface": [[6, 3, 1, "", "get_hom_condition"], [6, 3, 1, "", "get_value"]], "meshiphi.dataloaders.factory": [[7, 2, 1, "", "DataLoaderFactory"]], "meshiphi.dataloaders.factory.DataLoaderFactory": [[7, 3, 1, "", "get_dataloader"], [7, 3, 1, "", "translate_file_input"]], "meshiphi.dataloaders.lut": [[8, 0, 0, "-", "abstract_lut"], [9, 0, 0, "-", "density"], [10, 0, 0, "-", "lut_csv"], [11, 0, 0, "-", "lut_geojson"], [12, 0, 0, "-", "scotland_ncmpa"], [13, 0, 0, "-", "thickness"]], "meshiphi.dataloaders.lut.abstract_lut": [[8, 2, 1, "", "LutDataLoader"]], "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader": [[8, 3, 1, "", "__init__"], [8, 3, 1, "", "add_default_params"], [8, 3, 1, "", "calculate_coverage"], [8, 3, 1, "", "downsample"], [8, 3, 1, "", "get_data_col_name"], [8, 3, 1, "", "get_hom_condition"], [8, 3, 1, "", "get_value"], [8, 3, 1, "", "import_data"], [8, 3, 1, "", "reproject"], [8, 3, 1, "", "set_data_col_name"], [8, 3, 1, "", "trim_datapoints"], [8, 3, 1, "", "verify_data"]], "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.self": [[8, 4, 1, "", "data"], [8, 4, 1, "", "data_name"]], "meshiphi.dataloaders.lut.density": [[9, 2, 1, "", "DensityDataLoader"]], "meshiphi.dataloaders.lut.density.DensityDataLoader": [[9, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.lut_csv": [[10, 2, 1, "", "LutCSV"]], "meshiphi.dataloaders.lut.lut_csv.LutCSV": [[10, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.lut_geojson": [[11, 2, 1, "", "LutGeoJSON"]], "meshiphi.dataloaders.lut.lut_geojson.LutGeoJSON": [[11, 3, 1, "", "add_default_params"], [11, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.scotland_ncmpa": [[12, 2, 1, "", "ScotlandNCMPA"]], "meshiphi.dataloaders.lut.scotland_ncmpa.ScotlandNCMPA": [[12, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.thickness": [[13, 2, 1, "", "ThicknessDataLoader"]], "meshiphi.dataloaders.lut.thickness.ThicknessDataLoader": [[13, 2, 1, "", "Region"], [13, 3, 1, "", "import_data"]], "meshiphi.dataloaders.lut.thickness.ThicknessDataLoader.Region": [[13, 3, 1, "", "__init__"], [13, 3, 1, "", "get_value"]], "meshiphi.dataloaders.scalar": [[16, 0, 0, "-", "abstract_scalar"], [17, 0, 0, "-", "amsr"], [20, 0, 0, "-", "baltic_sea_ice"], [18, 0, 0, "-", "bsose_depth"], [19, 0, 0, "-", "bsose_sea_ice"], [22, 0, 0, "-", "ecmwf_sig_wave_height"], [23, 0, 0, "-", "era5_max_wave_height"], [25, 0, 0, "-", "era5_mean_wave_direction"], [24, 0, 0, "-", "era5_sig_wave_height"], [26, 0, 0, "-", "era5_wave_period"], [27, 0, 0, "-", "era5_wind_dir"], [28, 0, 0, "-", "era5_wind_mag"], [29, 0, 0, "-", "gebco"], [30, 0, 0, "-", "icenet"], [31, 0, 0, "-", "modis"], [32, 0, 0, "-", "scalar_csv"], [33, 0, 0, "-", "scalar_grf"], [34, 0, 0, "-", "shape"], [35, 0, 0, "-", "visual_iced"]], "meshiphi.dataloaders.scalar.abstract_scalar": [[16, 2, 1, "", "ScalarDataLoader"]], "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader": [[16, 3, 1, "", "__init__"], [16, 3, 1, "", "add_default_params"], [16, 3, 1, "", "calculate_coverage"], [16, 3, 1, "", "downsample"], [16, 3, 1, "", "get_data_col_name"], [16, 3, 1, "", "get_hom_condition"], [16, 3, 1, "", "get_value"], [16, 3, 1, "", "import_data"], [16, 3, 1, "", "reproject"], [16, 3, 1, "", "set_data_col_name"], [16, 3, 1, "", "trim_datapoints"]], "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.self": [[16, 4, 1, "", "data"], [16, 4, 1, "", "data_name"]], "meshiphi.dataloaders.scalar.amsr": [[17, 2, 1, "", "AMSRDataLoader"]], "meshiphi.dataloaders.scalar.amsr.AMSRDataLoader": [[17, 3, 1, "", "add_default_params"], [17, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.baltic_sea_ice": [[20, 2, 1, "", "BalticSeaIceDataLoader"]], "meshiphi.dataloaders.scalar.baltic_sea_ice.BalticSeaIceDataLoader": [[20, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.bsose_depth": [[18, 2, 1, "", "BSOSEDepthDataLoader"]], "meshiphi.dataloaders.scalar.bsose_depth.BSOSEDepthDataLoader": [[18, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.bsose_sea_ice": [[19, 2, 1, "", "BSOSESeaIceDataLoader"]], "meshiphi.dataloaders.scalar.bsose_sea_ice.BSOSESeaIceDataLoader": [[19, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.ecmwf_sig_wave_height": [[22, 2, 1, "", "ECMWFSigWaveHeightDataLoader"]], "meshiphi.dataloaders.scalar.ecmwf_sig_wave_height.ECMWFSigWaveHeightDataLoader": [[22, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_max_wave_height": [[23, 2, 1, "", "ERA5MaxWaveHeightDataLoader"]], "meshiphi.dataloaders.scalar.era5_max_wave_height.ERA5MaxWaveHeightDataLoader": [[23, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_mean_wave_direction": [[25, 2, 1, "", "ERA5MeanWaveDirDataLoader"]], "meshiphi.dataloaders.scalar.era5_mean_wave_direction.ERA5MeanWaveDirDataLoader": [[25, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_sig_wave_height": [[24, 2, 1, "", "ERA5SigWaveHeightDataLoader"]], "meshiphi.dataloaders.scalar.era5_sig_wave_height.ERA5SigWaveHeightDataLoader": [[24, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_wave_period": [[26, 2, 1, "", "ERA5WavePeriodDataLoader"]], "meshiphi.dataloaders.scalar.era5_wave_period.ERA5WavePeriodDataLoader": [[26, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_wind_dir": [[27, 2, 1, "", "ERA5WindDirDataLoader"]], "meshiphi.dataloaders.scalar.era5_wind_dir.ERA5WindDirDataLoader": [[27, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.era5_wind_mag": [[28, 2, 1, "", "ERA5WindMagDataLoader"]], "meshiphi.dataloaders.scalar.era5_wind_mag.ERA5WindMagDataLoader": [[28, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.gebco": [[29, 2, 1, "", "GEBCODataLoader"]], "meshiphi.dataloaders.scalar.gebco.GEBCODataLoader": [[29, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.icenet": [[30, 2, 1, "", "IceNetDataLoader"]], "meshiphi.dataloaders.scalar.icenet.IceNetDataLoader": [[30, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.modis": [[31, 2, 1, "", "MODISDataLoader"]], "meshiphi.dataloaders.scalar.modis.MODISDataLoader": [[31, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.scalar_csv": [[32, 2, 1, "", "ScalarCSVDataLoader"]], "meshiphi.dataloaders.scalar.scalar_csv.ScalarCSVDataLoader": [[32, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.scalar_grf": [[33, 2, 1, "", "ScalarGRFDataLoader"]], "meshiphi.dataloaders.scalar.scalar_grf.ScalarGRFDataLoader": [[33, 3, 1, "", "add_default_params"], [33, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.shape": [[34, 2, 1, "", "ShapeDataLoader"]], "meshiphi.dataloaders.scalar.shape.ShapeDataLoader": [[34, 3, 1, "", "add_default_params"], [34, 3, 1, "", "gen_checkerboard"], [34, 3, 1, "", "gen_circle"], [34, 3, 1, "", "gen_gradient"], [34, 3, 1, "", "import_data"]], "meshiphi.dataloaders.scalar.visual_iced": [[35, 2, 1, "", "VisualIcedDataLoader"]], "meshiphi.dataloaders.scalar.visual_iced.VisualIcedDataLoader": [[35, 3, 1, "", "import_data"], [35, 3, 1, "", "import_from_nc"], [35, 3, 1, "", "import_from_tiff"]], "meshiphi.dataloaders.vector": [[37, 0, 0, "-", "abstract_vector"], [38, 0, 0, "-", "baltic_current"], [39, 0, 0, "-", "duacs_current"], [40, 0, 0, "-", "era5_wave_direction_vector"], [41, 0, 0, "-", "era5_wind"], [42, 0, 0, "-", "north_sea_current"], [43, 0, 0, "-", "oras5_current"], [44, 0, 0, "-", "sose"], [45, 0, 0, "-", "vector_csv"], [46, 0, 0, "-", "vector_grf"]], "meshiphi.dataloaders.vector.abstract_vector": [[37, 2, 1, "", "VectorDataLoader"]], "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader": [[37, 3, 1, "", "__init__"], [37, 3, 1, "", "add_default_params"], [37, 3, 1, "", "add_mag_dir"], [37, 3, 1, "", "calc_curl"], [37, 3, 1, "", "calc_divergence"], [37, 3, 1, "", "calc_dmag"], [37, 3, 1, "", "calc_reynolds_number"], [37, 3, 1, "", "calculate_coverage"], [37, 3, 1, "", "downsample"], [37, 3, 1, "", "get_data_col_name"], [37, 3, 1, "", "get_data_col_name_list"], [37, 3, 1, "", "get_hom_condition"], [37, 3, 1, "", "get_value"], [37, 3, 1, "", "import_data"], [37, 3, 1, "", "reproject"], [37, 3, 1, "", "set_data_col_name"], [37, 3, 1, "", "set_data_col_name_list"], [37, 3, 1, "", "trim_datapoints"]], "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.self": [[37, 4, 1, "", "data"], [37, 4, 1, "", "data_name"]], "meshiphi.dataloaders.vector.baltic_current": [[38, 2, 1, "", "BalticCurrentDataLoader"]], "meshiphi.dataloaders.vector.baltic_current.BalticCurrentDataLoader": [[38, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.duacs_current": [[39, 2, 1, "", "DuacsCurrentDataLoader"]], "meshiphi.dataloaders.vector.duacs_current.DuacsCurrentDataLoader": [[39, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.era5_wave_direction_vector": [[40, 2, 1, "", "ERA5WaveDirectionLoader"]], "meshiphi.dataloaders.vector.era5_wave_direction_vector.ERA5WaveDirectionLoader": [[40, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.era5_wind": [[41, 2, 1, "", "ERA5WindDataLoader"]], "meshiphi.dataloaders.vector.era5_wind.ERA5WindDataLoader": [[41, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.north_sea_current": [[42, 2, 1, "", "NorthSeaCurrentDataLoader"]], "meshiphi.dataloaders.vector.north_sea_current.NorthSeaCurrentDataLoader": [[42, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.oras5_current": [[43, 2, 1, "", "ORAS5CurrentDataLoader"]], "meshiphi.dataloaders.vector.oras5_current.ORAS5CurrentDataLoader": [[43, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.sose": [[44, 2, 1, "", "SOSEDataLoader"]], "meshiphi.dataloaders.vector.sose.SOSEDataLoader": [[44, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.vector_csv": [[45, 2, 1, "", "VectorCSVDataLoader"]], "meshiphi.dataloaders.vector.vector_csv.VectorCSVDataLoader": [[45, 3, 1, "", "import_data"]], "meshiphi.dataloaders.vector.vector_grf": [[46, 2, 1, "", "VectorGRFDataLoader"]], "meshiphi.dataloaders.vector.vector_grf.VectorGRFDataLoader": [[46, 3, 1, "", "add_default_params"], [46, 3, 1, "", "import_data"]], "meshiphi.mesh_generation": [[50, 0, 0, "-", "aggregated_cellbox"], [50, 0, 0, "-", "cellbox"], [50, 0, 0, "-", "environment_mesh"], [50, 0, 0, "-", "mesh_builder"], [50, 0, 0, "-", "metadata"], [50, 0, 0, "-", "neighbour_graph"]], "meshiphi.mesh_generation.aggregated_cellbox": [[50, 2, 1, "", "AggregatedCellBox"]], "meshiphi.mesh_generation.aggregated_cellbox.AggregatedCellBox": [[50, 3, 1, "", "__init__"], [50, 3, 1, "", "contains_point"], [50, 3, 1, "", "to_json"]], "meshiphi.mesh_generation.cellbox": [[50, 2, 1, "", "CellBox"]], "meshiphi.mesh_generation.cellbox.CellBox": [[50, 4, 1, "", "Bounds"], [50, 3, 1, "", "__init__"], [50, 3, 1, "", "aggregate"], [50, 4, 1, "", "id"], [50, 3, 1, "", "set_data_source"], [50, 3, 1, "", "set_parent"], [50, 3, 1, "", "should_split"], [50, 3, 1, "", "split"]], "meshiphi.mesh_generation.environment_mesh": [[50, 2, 1, "", "EnvironmentMesh"]], "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh": [[50, 3, 1, "", "__init__"], [50, 4, 1, "", "agg_cellboxes"], [50, 4, 1, "", "bounds"], [50, 4, 1, "", "config"], [50, 3, 1, "", "load_from_json"], [50, 4, 1, "", "neighbour_graph"], [50, 3, 1, "", "save"], [50, 3, 1, "", "to_geojson"], [50, 3, 1, "", "to_json"], [50, 3, 1, "", "to_tif"], [50, 3, 1, "", "update_cellbox"]], "meshiphi.mesh_generation.mesh_builder": [[50, 2, 1, "", "MeshBuilder"]], "meshiphi.mesh_generation.mesh_builder.MeshBuilder": [[50, 3, 1, "", "__init__"], [50, 3, 1, "", "add_dataloader"], [50, 3, 1, "", "build_environmental_mesh"], [50, 3, 1, "", "split_and_replace"], [50, 3, 1, "", "split_to_depth"]], "meshiphi.mesh_generation.metadata": [[50, 2, 1, "", "Metadata"]], "meshiphi.mesh_generation.metadata.Metadata": [[50, 3, 1, "", "__init__"], [50, 4, 1, "", "data_loader"], [50, 4, 1, "", "splitting_conditions"], [50, 4, 1, "", "value_fill_type"]], "meshiphi.mesh_generation.neighbour_graph": [[50, 2, 1, "", "NeighbourGraph"]], "meshiphi.mesh_generation.neighbour_graph.NeighbourGraph": [[50, 3, 1, "", "get_neighbour_case"], [50, 3, 1, "", "initialise_neighbour_graph"], [50, 4, 1, "", "neighbour_graph"], [50, 3, 1, "", "update_neighbours"]], "meshiphi.mesh_plotting": [[54, 0, 0, "-", "mesh_plotter"]], "meshiphi.mesh_plotting.mesh_plotter": [[54, 2, 1, "", "MeshPlotter"]], "meshiphi.mesh_plotting.mesh_plotter.MeshPlotter": [[54, 3, 1, "", "__init__"], [54, 3, 1, "", "plot_bool"], [54, 3, 1, "", "plot_cmap"], [54, 3, 1, "", "save"]], "meshiphi.mesh_validation": [[52, 0, 0, "-", "mesh_validator"], [52, 0, 0, "-", "sampler"]], "meshiphi.mesh_validation.mesh_validator": [[52, 2, 1, "", "MeshValidator"]], "meshiphi.mesh_validation.mesh_validator.MeshValidator": [[52, 3, 1, "", "__init__"], [52, 4, 1, "", "env_mesh"], [52, 3, 1, "", "get_range_end"], [52, 3, 1, "", "get_value_from_data"], [52, 3, 1, "", "get_values_from_mesh"], [52, 4, 1, "", "mesh"], [52, 3, 1, "", "validate_mesh"], [52, 4, 1, "", "validation_length"]], "meshiphi.mesh_validation.sampler": [[52, 2, 1, "", "Sampler"]], "meshiphi.mesh_validation.sampler.Sampler": [[52, 3, 1, "", "__init__"], [52, 3, 1, "", "generate_samples"], [52, 4, 1, "", "number_of_samples"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"]}, "titleterms": {"welcom": 0, "meshiphi": [0, 49], "manual": 0, "page": 0, "background": 1, "code": 1, "structur": 1, "command": 2, "line": 2, "interfac": [2, 6], "create_mesh": 2, "export_mesh": 2, "rebuild_mesh": 2, "plot_mesh": 2, "geoplot": 2, "configur": [3, 4], "overview": [3, 15, 51], "config": 3, "valid": [3, 52], "mesh": [4, 50, 51, 52, 53, 54], "construct": [4, 50, 51], "region": 4, "data": [4, 53], "sourc": 4, "split": 4, "ad": [5, 7], "new": [5, 7], "dataload": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47], "repositori": 5, "within": 5, "ipython": 5, "notebook": 5, "factori": 7, "exampl": [7, 14, 36, 47, 48], "object": 7, "abstract": [8, 14, 15, 16, 36, 37, 47], "look": 8, "up": 8, "tabl": 8, "densiti": 9, "lut": [10, 11, 14], "csv": [10, 32, 45], "geojson": 11, "scotland": 12, "ncmpa": 12, "thick": 13, "base": [14, 36, 47], "class": [14, 36, 47, 50], "implement": [14, 36, 47], "section": 15, "type": [15, 53], "scalar": [16, 32, 33, 36], "amsr": 17, "bsose": [18, 19], "depth": 18, "sea": [19, 20, 42], "ic": [19, 20], "baltic": [20, 38], "binari": 21, "grf": [21, 33, 46], "ecmwfsigwaveheight": 22, "era5": [23, 24, 25, 26, 27, 28, 40, 41], "maximum": 23, "wave": [23, 24, 25, 26, 40], "height": [23, 24], "signific": 24, "mean": [25, 26], "direct": [25, 27, 40], "period": 26, "wind": [27, 28, 41], "magnitud": 28, "gebco": 29, "icenet": 30, "modi": 31, "shape": 34, "visual_": 35, "vector": [37, 45, 46, 47], "current": [38, 39, 42, 43, 44], "duac": 39, "north": 42, "oras5": 43, "sose": 44, "creat": 48, "digit": 48, "environ": 48, "instal": 49, "gdal": 49, "option": 49, "window": 49, "linux": 49, "maco": 49, "meshbuild": 50, "environmentmesh": 50, "neighbourgraph": 50, "cellbox": [50, 53], "metadata": 50, "aggregatedcellbox": 50, "method": 51, "design": 51, "us": 51, "case": 51, "addit": 51, "sampler": 52, "output": 53, "The": 53, "json": 53, "file": 53, "neighbour_graph": 53, "plot": 54}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 58}, "alltitles": {"Welcome to the MeshiPhi Manual Pages": [[0, "welcome-to-the-meshiphi-manual-pages"]], "Background": [[1, "background"]], "Code Structure": [[1, "code-structure"]], "Command Line Interface": [[2, "command-line-interface"]], "create_mesh": [[2, "create-mesh"]], "export_mesh": [[2, "export-mesh"]], "rebuild_mesh": [[2, "rebuild-mesh"]], "plot_mesh (GeoPlot)": [[2, "plot-mesh-geoplot"]], "Configuration Overview": [[3, "configuration-overview"]], "Config Validation": [[3, "config-validation"]], "Configuration - Mesh Construction": [[4, "configuration-mesh-construction"]], "Region": [[4, "region"]], "Data Sources": [[4, "data-sources"]], "Splitting": [[4, "splitting"]], "Adding New Dataloaders": [[5, "adding-new-dataloaders"]], "Adding to the repository": [[5, "adding-to-the-repository"]], "Adding within iPython Notebooks": [[5, "adding-within-ipython-notebooks"]], "Dataloader Interface": [[6, "dataloader-interface"]], "Dataloader Factory": [[7, "dataloader-factory"]], "Adding New Dataloader to Factory": [[7, "adding-new-dataloader-to-factory"]], "Example": [[7, "example"]], "Dataloader Factory Object": [[7, "module-meshiphi.dataloaders.factory"]], "Abstract Look Up Table Dataloader": [[8, "module-meshiphi.dataloaders.lut.abstract_lut"]], "Density Dataloader": [[9, "density-dataloader"]], "LUT CSV Dataloader": [[10, "lut-csv-dataloader"]], "LUT GeoJSON Dataloader": [[11, "lut-geojson-dataloader"]], "Scotland NCMPA Dataloader": [[12, "scotland-ncmpa-dataloader"]], "Thickness Dataloader": [[13, "thickness-dataloader"]], "LUT Dataloaders": [[14, "lut-dataloaders"]], "Abstract LUT Base Class": [[14, "abstract-lut-base-class"]], "LUT Dataloader Examples": [[14, "lut-dataloader-examples"]], "Implemented LUT Dataloaders": [[14, "implemented-lut-dataloaders"]], "Dataloader Overview": [[15, "dataloader-overview"]], "Section Overview": [[15, "section-overview"]], "Dataloader Types": [[15, "dataloader-types"]], "Abstract Dataloaders": [[15, "abstract-dataloaders"]], "Abstract Scalar Dataloader": [[16, "module-meshiphi.dataloaders.scalar.abstract_scalar"]], "AMSR Dataloader": [[17, "amsr-dataloader"]], "BSOSE Depth Dataloader": [[18, "bsose-depth-dataloader"]], "BSOSE Sea Ice Dataloader": [[19, "bsose-sea-ice-dataloader"]], "Baltic Sea Ice Dataloader": [[20, "baltic-sea-ice-dataloader"]], "Binary GRF Dataloader": [[21, "binary-grf-dataloader"]], "ECMWFSigWaveHeight Dataloader": [[22, "ecmwfsigwaveheight-dataloader"]], "ERA5 Maximum Wave Height Dataloader": [[23, "era5-maximum-wave-height-dataloader"]], "ERA5 Significant Wave Height Dataloader": [[24, "era5-significant-wave-height-dataloader"]], "ERA5 Mean Wave Direction Dataloader": [[25, "era5-mean-wave-direction-dataloader"]], "ERA5 Mean Wave Period Dataloader": [[26, "era5-mean-wave-period-dataloader"]], "ERA5 Wind Direction Dataloader": [[27, "era5-wind-direction-dataloader"]], "ERA5 Wind Magnitude Dataloader": [[28, "era5-wind-magnitude-dataloader"]], "GEBCO Dataloader": [[29, "gebco-dataloader"]], "IceNet Dataloader": [[30, "icenet-dataloader"]], "MODIS Dataloader": [[31, "modis-dataloader"]], "Scalar CSV Dataloader": [[32, "scalar-csv-dataloader"]], "Scalar GRF Dataloader": [[33, "scalar-grf-dataloader"]], "Shape Dataloader": [[34, "shape-dataloader"]], "Visual_iced Dataloader": [[35, "visual-iced-dataloader"]], "Scalar Dataloaders": [[36, "scalar-dataloaders"]], "Abstract Scalar Base Class": [[36, "abstract-scalar-base-class"]], "Scalar Dataloader Examples": [[36, "scalar-dataloader-examples"]], "Implemented Scalar Dataloaders": [[36, "implemented-scalar-dataloaders"]], "Abstract Vector Dataloader": [[37, "module-meshiphi.dataloaders.vector.abstract_vector"]], "Baltic Currents Dataloader": [[38, "baltic-currents-dataloader"]], "DUACS Currents Dataloader": [[39, "duacs-currents-dataloader"]], "ERA5 Wave Direction Dataloader": [[40, "era5-wave-direction-dataloader"]], "ERA5 Wind Dataloader": [[41, "era5-wind-dataloader"]], "North Sea Currents Dataloader": [[42, "north-sea-currents-dataloader"]], "ORAS5 Currents Dataloader": [[43, "oras5-currents-dataloader"]], "SOSE Currents Dataloader": [[44, "sose-currents-dataloader"]], "Vector CSV Dataloader": [[45, "vector-csv-dataloader"]], "Vector GRF Dataloader": [[46, "vector-grf-dataloader"]], "Vector Dataloaders": [[47, "vector-dataloaders"]], "Abstract Vector Base Class": [[47, "abstract-vector-base-class"]], "Vector Dataloader Examples": [[47, "vector-dataloader-examples"]], "Implemented Vector Dataloaders": [[47, "implemented-vector-dataloaders"]], "Examples": [[48, "examples"]], "Creating the Digital Environment.": [[48, "creating-the-digital-environment"]], "Installation": [[49, "installation"]], "Installing MeshiPhi": [[49, "installing-meshiphi"]], "Installing GDAL (Optional)": [[49, "installing-gdal-optional"]], "Windows": [[49, "windows"]], "Linux/MacOS": [[49, "linux-macos"]], "Mesh Construction - Classes": [[50, "mesh-construction-classes"]], "MeshBuilder": [[50, "meshbuilder"]], "EnvironmentMesh": [[50, "environmentmesh"]], "NeighbourGraph": [[50, "neighbourgraph"]], "CellBox": [[50, "cellbox"]], "MetaData": [[50, "metadata"]], "AggregatedCellBox": [[50, "aggregatedcellbox"]], "Methods - Mesh Construction": [[51, "methods-mesh-construction"]], "Mesh Construction - Overview": [[51, "id1"]], "Mesh Construction Design": [[51, "mesh-construction-design"]], "Mesh Construction Use case": [[51, "mesh-construction-use-case"]], "Mesh Construction - Additional": [[51, "mesh-construction-additional"]], "Mesh Validation": [[52, "mesh-validation"]], "Mesh Validator": [[52, "module-meshiphi.mesh_validation.mesh_validator"]], "Sampler": [[52, "module-meshiphi.mesh_validation.sampler"]], "Outputs - Data Types": [[53, "outputs-data-types"]], "The Mesh.json file": [[53, "the-mesh-json-file"]], "cellboxes": [[53, "cellboxes"]], "neighbour_graph": [[53, "neighbour-graph"]], "Mesh Plotting": [[54, "mesh-plotting"]]}, "indexentries": {"flexi_json_input() (in module meshiphi.config_validation.config_validator)": [[3, "meshiphi.config_validation.config_validator.flexi_json_input"]], "meshiphi.config_validation.config_validator": [[3, "module-meshiphi.config_validation.config_validator"]], "module": [[3, "module-meshiphi.config_validation.config_validator"], [6, "module-meshiphi.dataloaders.dataloader_interface"], [7, "module-meshiphi.dataloaders.factory"], [8, "module-meshiphi.dataloaders.lut.abstract_lut"], [9, "module-meshiphi.dataloaders.lut.density"], [10, "module-meshiphi.dataloaders.lut.lut_csv"], [11, "module-meshiphi.dataloaders.lut.lut_geojson"], [12, "module-meshiphi.dataloaders.lut.scotland_ncmpa"], [13, "module-meshiphi.dataloaders.lut.thickness"], [16, "module-meshiphi.dataloaders.scalar.abstract_scalar"], [17, "module-meshiphi.dataloaders.scalar.amsr"], [18, "module-meshiphi.dataloaders.scalar.bsose_depth"], [19, "module-meshiphi.dataloaders.scalar.bsose_sea_ice"], [20, "module-meshiphi.dataloaders.scalar.baltic_sea_ice"], [22, "module-meshiphi.dataloaders.scalar.ecmwf_sig_wave_height"], [23, "module-meshiphi.dataloaders.scalar.era5_max_wave_height"], [24, "module-meshiphi.dataloaders.scalar.era5_sig_wave_height"], [25, "module-meshiphi.dataloaders.scalar.era5_mean_wave_direction"], [26, "module-meshiphi.dataloaders.scalar.era5_wave_period"], [27, "module-meshiphi.dataloaders.scalar.era5_wind_dir"], [28, "module-meshiphi.dataloaders.scalar.era5_wind_mag"], [29, "module-meshiphi.dataloaders.scalar.gebco"], [30, "module-meshiphi.dataloaders.scalar.icenet"], [31, "module-meshiphi.dataloaders.scalar.modis"], [32, "module-meshiphi.dataloaders.scalar.scalar_csv"], [33, "module-meshiphi.dataloaders.scalar.scalar_grf"], [34, "module-meshiphi.dataloaders.scalar.shape"], [35, "module-meshiphi.dataloaders.scalar.visual_iced"], [37, "module-meshiphi.dataloaders.vector.abstract_vector"], [38, "module-meshiphi.dataloaders.vector.baltic_current"], [39, "module-meshiphi.dataloaders.vector.duacs_current"], [40, "module-meshiphi.dataloaders.vector.era5_wave_direction_vector"], [41, "module-meshiphi.dataloaders.vector.era5_wind"], [42, "module-meshiphi.dataloaders.vector.north_sea_current"], [43, "module-meshiphi.dataloaders.vector.oras5_current"], [44, "module-meshiphi.dataloaders.vector.sose"], [45, "module-meshiphi.dataloaders.vector.vector_csv"], [46, "module-meshiphi.dataloaders.vector.vector_grf"], [50, "module-meshiphi.mesh_generation.aggregated_cellbox"], [50, "module-meshiphi.mesh_generation.cellbox"], [50, "module-meshiphi.mesh_generation.environment_mesh"], [50, "module-meshiphi.mesh_generation.mesh_builder"], [50, "module-meshiphi.mesh_generation.metadata"], [50, "module-meshiphi.mesh_generation.neighbour_graph"], [52, "module-meshiphi.mesh_validation.mesh_validator"], [52, "module-meshiphi.mesh_validation.sampler"], [54, "module-meshiphi.mesh_plotting.mesh_plotter"]], "validate_mesh_config() (in module meshiphi.config_validation.config_validator)": [[3, "meshiphi.config_validation.config_validator.validate_mesh_config"]], "validate_route_config() (in module meshiphi.config_validation.config_validator)": [[3, "meshiphi.config_validation.config_validator.validate_route_config"]], "validate_vessel_config() (in module meshiphi.config_validation.config_validator)": [[3, "meshiphi.config_validation.config_validator.validate_vessel_config"]], "validate_waypoints() (in module meshiphi.config_validation.config_validator)": [[3, "meshiphi.config_validation.config_validator.validate_waypoints"]], "dataloaderinterface (class in meshiphi.dataloaders.dataloader_interface)": [[6, "meshiphi.dataloaders.dataloader_interface.DataLoaderInterface"]], "get_hom_condition() (meshiphi.dataloaders.dataloader_interface.dataloaderinterface method)": [[6, "meshiphi.dataloaders.dataloader_interface.DataLoaderInterface.get_hom_condition"]], "get_value() (meshiphi.dataloaders.dataloader_interface.dataloaderinterface method)": [[6, "meshiphi.dataloaders.dataloader_interface.DataLoaderInterface.get_value"]], "meshiphi.dataloaders.dataloader_interface": [[6, "module-meshiphi.dataloaders.dataloader_interface"]], "dataloaderfactory (class in meshiphi.dataloaders.factory)": [[7, "meshiphi.dataloaders.factory.DataLoaderFactory"]], "get_dataloader() (meshiphi.dataloaders.factory.dataloaderfactory static method)": [[7, "meshiphi.dataloaders.factory.DataLoaderFactory.get_dataloader"]], "meshiphi.dataloaders.factory": [[7, "module-meshiphi.dataloaders.factory"]], "translate_file_input() (meshiphi.dataloaders.factory.dataloaderfactory static method)": [[7, "meshiphi.dataloaders.factory.DataLoaderFactory.translate_file_input"]], "lutdataloader (class in meshiphi.dataloaders.lut.abstract_lut)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader"]], "__init__() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.__init__"]], "add_default_params() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.add_default_params"]], "calculate_coverage() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.calculate_coverage"]], "data (meshiphi.dataloaders.lut.abstract_lut.lutdataloader.self attribute)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.self.data"]], "data_name (meshiphi.dataloaders.lut.abstract_lut.lutdataloader.self attribute)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.self.data_name"]], "downsample() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.downsample"]], "get_data_col_name() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.get_data_col_name"]], "get_hom_condition() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.get_hom_condition"]], "get_value() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.get_value"]], "import_data() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.import_data"]], "meshiphi.dataloaders.lut.abstract_lut": [[8, "module-meshiphi.dataloaders.lut.abstract_lut"]], "reproject() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.reproject"]], "set_data_col_name() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.set_data_col_name"]], "trim_datapoints() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.trim_datapoints"]], "verify_data() (meshiphi.dataloaders.lut.abstract_lut.lutdataloader method)": [[8, "meshiphi.dataloaders.lut.abstract_lut.LutDataLoader.verify_data"]], "densitydataloader (class in meshiphi.dataloaders.lut.density)": [[9, "meshiphi.dataloaders.lut.density.DensityDataLoader"]], "import_data() (meshiphi.dataloaders.lut.density.densitydataloader method)": [[9, "meshiphi.dataloaders.lut.density.DensityDataLoader.import_data"]], "meshiphi.dataloaders.lut.density": [[9, "module-meshiphi.dataloaders.lut.density"]], "lutcsv (class in meshiphi.dataloaders.lut.lut_csv)": [[10, "meshiphi.dataloaders.lut.lut_csv.LutCSV"]], "import_data() (meshiphi.dataloaders.lut.lut_csv.lutcsv method)": [[10, "meshiphi.dataloaders.lut.lut_csv.LutCSV.import_data"]], "meshiphi.dataloaders.lut.lut_csv": [[10, "module-meshiphi.dataloaders.lut.lut_csv"]], "lutgeojson (class in meshiphi.dataloaders.lut.lut_geojson)": [[11, "meshiphi.dataloaders.lut.lut_geojson.LutGeoJSON"]], "add_default_params() (meshiphi.dataloaders.lut.lut_geojson.lutgeojson method)": [[11, "meshiphi.dataloaders.lut.lut_geojson.LutGeoJSON.add_default_params"]], "import_data() (meshiphi.dataloaders.lut.lut_geojson.lutgeojson method)": [[11, "meshiphi.dataloaders.lut.lut_geojson.LutGeoJSON.import_data"]], "meshiphi.dataloaders.lut.lut_geojson": [[11, "module-meshiphi.dataloaders.lut.lut_geojson"]], "scotlandncmpa (class in meshiphi.dataloaders.lut.scotland_ncmpa)": [[12, "meshiphi.dataloaders.lut.scotland_ncmpa.ScotlandNCMPA"]], "import_data() (meshiphi.dataloaders.lut.scotland_ncmpa.scotlandncmpa method)": [[12, "meshiphi.dataloaders.lut.scotland_ncmpa.ScotlandNCMPA.import_data"]], "meshiphi.dataloaders.lut.scotland_ncmpa": [[12, "module-meshiphi.dataloaders.lut.scotland_ncmpa"]], "thicknessdataloader (class in meshiphi.dataloaders.lut.thickness)": [[13, "meshiphi.dataloaders.lut.thickness.ThicknessDataLoader"]], "thicknessdataloader.region (class in meshiphi.dataloaders.lut.thickness)": [[13, "meshiphi.dataloaders.lut.thickness.ThicknessDataLoader.Region"]], "__init__() (meshiphi.dataloaders.lut.thickness.thicknessdataloader.region method)": [[13, "meshiphi.dataloaders.lut.thickness.ThicknessDataLoader.Region.__init__"]], "get_value() (meshiphi.dataloaders.lut.thickness.thicknessdataloader.region method)": [[13, "meshiphi.dataloaders.lut.thickness.ThicknessDataLoader.Region.get_value"]], "import_data() (meshiphi.dataloaders.lut.thickness.thicknessdataloader method)": [[13, "meshiphi.dataloaders.lut.thickness.ThicknessDataLoader.import_data"]], "meshiphi.dataloaders.lut.thickness": [[13, "module-meshiphi.dataloaders.lut.thickness"]], "scalardataloader (class in meshiphi.dataloaders.scalar.abstract_scalar)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader"]], "__init__() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.__init__"]], "add_default_params() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.add_default_params"]], "calculate_coverage() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.calculate_coverage"]], "data (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader.self attribute)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.self.data"]], "data_name (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader.self attribute)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.self.data_name"]], "downsample() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.downsample"]], "get_data_col_name() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.get_data_col_name"]], "get_hom_condition() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.get_hom_condition"]], "get_value() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.get_value"]], "import_data() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.import_data"]], "meshiphi.dataloaders.scalar.abstract_scalar": [[16, "module-meshiphi.dataloaders.scalar.abstract_scalar"]], "reproject() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.reproject"]], "set_data_col_name() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.set_data_col_name"]], "trim_datapoints() (meshiphi.dataloaders.scalar.abstract_scalar.scalardataloader method)": [[16, "meshiphi.dataloaders.scalar.abstract_scalar.ScalarDataLoader.trim_datapoints"]], "amsrdataloader (class in meshiphi.dataloaders.scalar.amsr)": [[17, "meshiphi.dataloaders.scalar.amsr.AMSRDataLoader"]], "add_default_params() (meshiphi.dataloaders.scalar.amsr.amsrdataloader method)": [[17, "meshiphi.dataloaders.scalar.amsr.AMSRDataLoader.add_default_params"]], "import_data() (meshiphi.dataloaders.scalar.amsr.amsrdataloader method)": [[17, "meshiphi.dataloaders.scalar.amsr.AMSRDataLoader.import_data"]], "meshiphi.dataloaders.scalar.amsr": [[17, "module-meshiphi.dataloaders.scalar.amsr"]], "bsosedepthdataloader (class in meshiphi.dataloaders.scalar.bsose_depth)": [[18, "meshiphi.dataloaders.scalar.bsose_depth.BSOSEDepthDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.bsose_depth.bsosedepthdataloader method)": [[18, "meshiphi.dataloaders.scalar.bsose_depth.BSOSEDepthDataLoader.import_data"]], "meshiphi.dataloaders.scalar.bsose_depth": [[18, "module-meshiphi.dataloaders.scalar.bsose_depth"]], "bsoseseaicedataloader (class in meshiphi.dataloaders.scalar.bsose_sea_ice)": [[19, "meshiphi.dataloaders.scalar.bsose_sea_ice.BSOSESeaIceDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.bsose_sea_ice.bsoseseaicedataloader method)": [[19, "meshiphi.dataloaders.scalar.bsose_sea_ice.BSOSESeaIceDataLoader.import_data"]], "meshiphi.dataloaders.scalar.bsose_sea_ice": [[19, "module-meshiphi.dataloaders.scalar.bsose_sea_ice"]], "balticseaicedataloader (class in meshiphi.dataloaders.scalar.baltic_sea_ice)": [[20, "meshiphi.dataloaders.scalar.baltic_sea_ice.BalticSeaIceDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.baltic_sea_ice.balticseaicedataloader method)": [[20, "meshiphi.dataloaders.scalar.baltic_sea_ice.BalticSeaIceDataLoader.import_data"]], "meshiphi.dataloaders.scalar.baltic_sea_ice": [[20, "module-meshiphi.dataloaders.scalar.baltic_sea_ice"]], "ecmwfsigwaveheightdataloader (class in meshiphi.dataloaders.scalar.ecmwf_sig_wave_height)": [[22, "meshiphi.dataloaders.scalar.ecmwf_sig_wave_height.ECMWFSigWaveHeightDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.ecmwf_sig_wave_height.ecmwfsigwaveheightdataloader method)": [[22, "meshiphi.dataloaders.scalar.ecmwf_sig_wave_height.ECMWFSigWaveHeightDataLoader.import_data"]], "meshiphi.dataloaders.scalar.ecmwf_sig_wave_height": [[22, "module-meshiphi.dataloaders.scalar.ecmwf_sig_wave_height"]], "era5maxwaveheightdataloader (class in meshiphi.dataloaders.scalar.era5_max_wave_height)": [[23, "meshiphi.dataloaders.scalar.era5_max_wave_height.ERA5MaxWaveHeightDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.era5_max_wave_height.era5maxwaveheightdataloader method)": [[23, "meshiphi.dataloaders.scalar.era5_max_wave_height.ERA5MaxWaveHeightDataLoader.import_data"]], "meshiphi.dataloaders.scalar.era5_max_wave_height": [[23, "module-meshiphi.dataloaders.scalar.era5_max_wave_height"]], "era5sigwaveheightdataloader (class in meshiphi.dataloaders.scalar.era5_sig_wave_height)": [[24, "meshiphi.dataloaders.scalar.era5_sig_wave_height.ERA5SigWaveHeightDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.era5_sig_wave_height.era5sigwaveheightdataloader method)": [[24, "meshiphi.dataloaders.scalar.era5_sig_wave_height.ERA5SigWaveHeightDataLoader.import_data"]], "meshiphi.dataloaders.scalar.era5_sig_wave_height": [[24, "module-meshiphi.dataloaders.scalar.era5_sig_wave_height"]], "era5meanwavedirdataloader (class in meshiphi.dataloaders.scalar.era5_mean_wave_direction)": [[25, "meshiphi.dataloaders.scalar.era5_mean_wave_direction.ERA5MeanWaveDirDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.era5_mean_wave_direction.era5meanwavedirdataloader method)": [[25, "meshiphi.dataloaders.scalar.era5_mean_wave_direction.ERA5MeanWaveDirDataLoader.import_data"]], "meshiphi.dataloaders.scalar.era5_mean_wave_direction": [[25, "module-meshiphi.dataloaders.scalar.era5_mean_wave_direction"]], "era5waveperioddataloader (class in meshiphi.dataloaders.scalar.era5_wave_period)": [[26, "meshiphi.dataloaders.scalar.era5_wave_period.ERA5WavePeriodDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.era5_wave_period.era5waveperioddataloader method)": [[26, "meshiphi.dataloaders.scalar.era5_wave_period.ERA5WavePeriodDataLoader.import_data"]], "meshiphi.dataloaders.scalar.era5_wave_period": [[26, "module-meshiphi.dataloaders.scalar.era5_wave_period"]], "era5winddirdataloader (class in meshiphi.dataloaders.scalar.era5_wind_dir)": [[27, "meshiphi.dataloaders.scalar.era5_wind_dir.ERA5WindDirDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.era5_wind_dir.era5winddirdataloader method)": [[27, "meshiphi.dataloaders.scalar.era5_wind_dir.ERA5WindDirDataLoader.import_data"]], "meshiphi.dataloaders.scalar.era5_wind_dir": [[27, "module-meshiphi.dataloaders.scalar.era5_wind_dir"]], "era5windmagdataloader (class in meshiphi.dataloaders.scalar.era5_wind_mag)": [[28, "meshiphi.dataloaders.scalar.era5_wind_mag.ERA5WindMagDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.era5_wind_mag.era5windmagdataloader method)": [[28, "meshiphi.dataloaders.scalar.era5_wind_mag.ERA5WindMagDataLoader.import_data"]], "meshiphi.dataloaders.scalar.era5_wind_mag": [[28, "module-meshiphi.dataloaders.scalar.era5_wind_mag"]], "gebcodataloader (class in meshiphi.dataloaders.scalar.gebco)": [[29, "meshiphi.dataloaders.scalar.gebco.GEBCODataLoader"]], "import_data() (meshiphi.dataloaders.scalar.gebco.gebcodataloader method)": [[29, "meshiphi.dataloaders.scalar.gebco.GEBCODataLoader.import_data"]], "meshiphi.dataloaders.scalar.gebco": [[29, "module-meshiphi.dataloaders.scalar.gebco"]], "icenetdataloader (class in meshiphi.dataloaders.scalar.icenet)": [[30, "meshiphi.dataloaders.scalar.icenet.IceNetDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.icenet.icenetdataloader method)": [[30, "meshiphi.dataloaders.scalar.icenet.IceNetDataLoader.import_data"]], "meshiphi.dataloaders.scalar.icenet": [[30, "module-meshiphi.dataloaders.scalar.icenet"]], "modisdataloader (class in meshiphi.dataloaders.scalar.modis)": [[31, "meshiphi.dataloaders.scalar.modis.MODISDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.modis.modisdataloader method)": [[31, "meshiphi.dataloaders.scalar.modis.MODISDataLoader.import_data"]], "meshiphi.dataloaders.scalar.modis": [[31, "module-meshiphi.dataloaders.scalar.modis"]], "scalarcsvdataloader (class in meshiphi.dataloaders.scalar.scalar_csv)": [[32, "meshiphi.dataloaders.scalar.scalar_csv.ScalarCSVDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.scalar_csv.scalarcsvdataloader method)": [[32, "meshiphi.dataloaders.scalar.scalar_csv.ScalarCSVDataLoader.import_data"]], "meshiphi.dataloaders.scalar.scalar_csv": [[32, "module-meshiphi.dataloaders.scalar.scalar_csv"]], "scalargrfdataloader (class in meshiphi.dataloaders.scalar.scalar_grf)": [[33, "meshiphi.dataloaders.scalar.scalar_grf.ScalarGRFDataLoader"]], "add_default_params() (meshiphi.dataloaders.scalar.scalar_grf.scalargrfdataloader method)": [[33, "meshiphi.dataloaders.scalar.scalar_grf.ScalarGRFDataLoader.add_default_params"]], "import_data() (meshiphi.dataloaders.scalar.scalar_grf.scalargrfdataloader method)": [[33, "meshiphi.dataloaders.scalar.scalar_grf.ScalarGRFDataLoader.import_data"]], "meshiphi.dataloaders.scalar.scalar_grf": [[33, "module-meshiphi.dataloaders.scalar.scalar_grf"]], "shapedataloader (class in meshiphi.dataloaders.scalar.shape)": [[34, "meshiphi.dataloaders.scalar.shape.ShapeDataLoader"]], "add_default_params() (meshiphi.dataloaders.scalar.shape.shapedataloader method)": [[34, "meshiphi.dataloaders.scalar.shape.ShapeDataLoader.add_default_params"]], "gen_checkerboard() (meshiphi.dataloaders.scalar.shape.shapedataloader method)": [[34, "meshiphi.dataloaders.scalar.shape.ShapeDataLoader.gen_checkerboard"]], "gen_circle() (meshiphi.dataloaders.scalar.shape.shapedataloader method)": [[34, "meshiphi.dataloaders.scalar.shape.ShapeDataLoader.gen_circle"]], "gen_gradient() (meshiphi.dataloaders.scalar.shape.shapedataloader method)": [[34, "meshiphi.dataloaders.scalar.shape.ShapeDataLoader.gen_gradient"]], "import_data() (meshiphi.dataloaders.scalar.shape.shapedataloader method)": [[34, "meshiphi.dataloaders.scalar.shape.ShapeDataLoader.import_data"]], "meshiphi.dataloaders.scalar.shape": [[34, "module-meshiphi.dataloaders.scalar.shape"]], "visualiceddataloader (class in meshiphi.dataloaders.scalar.visual_iced)": [[35, "meshiphi.dataloaders.scalar.visual_iced.VisualIcedDataLoader"]], "import_data() (meshiphi.dataloaders.scalar.visual_iced.visualiceddataloader method)": [[35, "meshiphi.dataloaders.scalar.visual_iced.VisualIcedDataLoader.import_data"]], "import_from_nc() (meshiphi.dataloaders.scalar.visual_iced.visualiceddataloader method)": [[35, "meshiphi.dataloaders.scalar.visual_iced.VisualIcedDataLoader.import_from_nc"]], "import_from_tiff() (meshiphi.dataloaders.scalar.visual_iced.visualiceddataloader method)": [[35, "meshiphi.dataloaders.scalar.visual_iced.VisualIcedDataLoader.import_from_tiff"]], "meshiphi.dataloaders.scalar.visual_iced": [[35, "module-meshiphi.dataloaders.scalar.visual_iced"]], "vectordataloader (class in meshiphi.dataloaders.vector.abstract_vector)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader"]], "__init__() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.__init__"]], "add_default_params() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.add_default_params"]], "add_mag_dir() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.add_mag_dir"]], "calc_curl() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.calc_curl"]], "calc_divergence() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.calc_divergence"]], "calc_dmag() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.calc_dmag"]], "calc_reynolds_number() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.calc_reynolds_number"]], "calculate_coverage() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.calculate_coverage"]], "data (meshiphi.dataloaders.vector.abstract_vector.vectordataloader.self attribute)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.self.data"]], "data_name (meshiphi.dataloaders.vector.abstract_vector.vectordataloader.self attribute)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.self.data_name"]], "downsample() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.downsample"]], "get_data_col_name() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.get_data_col_name"]], "get_data_col_name_list() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.get_data_col_name_list"]], "get_hom_condition() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.get_hom_condition"]], "get_value() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.get_value"]], "import_data() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.import_data"]], "meshiphi.dataloaders.vector.abstract_vector": [[37, "module-meshiphi.dataloaders.vector.abstract_vector"]], "reproject() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.reproject"]], "set_data_col_name() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.set_data_col_name"]], "set_data_col_name_list() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.set_data_col_name_list"]], "trim_datapoints() (meshiphi.dataloaders.vector.abstract_vector.vectordataloader method)": [[37, "meshiphi.dataloaders.vector.abstract_vector.VectorDataLoader.trim_datapoints"]], "balticcurrentdataloader (class in meshiphi.dataloaders.vector.baltic_current)": [[38, "meshiphi.dataloaders.vector.baltic_current.BalticCurrentDataLoader"]], "import_data() (meshiphi.dataloaders.vector.baltic_current.balticcurrentdataloader method)": [[38, "meshiphi.dataloaders.vector.baltic_current.BalticCurrentDataLoader.import_data"]], "meshiphi.dataloaders.vector.baltic_current": [[38, "module-meshiphi.dataloaders.vector.baltic_current"]], "duacscurrentdataloader (class in meshiphi.dataloaders.vector.duacs_current)": [[39, "meshiphi.dataloaders.vector.duacs_current.DuacsCurrentDataLoader"]], "import_data() (meshiphi.dataloaders.vector.duacs_current.duacscurrentdataloader method)": [[39, "meshiphi.dataloaders.vector.duacs_current.DuacsCurrentDataLoader.import_data"]], "meshiphi.dataloaders.vector.duacs_current": [[39, "module-meshiphi.dataloaders.vector.duacs_current"]], "era5wavedirectionloader (class in meshiphi.dataloaders.vector.era5_wave_direction_vector)": [[40, "meshiphi.dataloaders.vector.era5_wave_direction_vector.ERA5WaveDirectionLoader"]], "import_data() (meshiphi.dataloaders.vector.era5_wave_direction_vector.era5wavedirectionloader method)": [[40, "meshiphi.dataloaders.vector.era5_wave_direction_vector.ERA5WaveDirectionLoader.import_data"]], "meshiphi.dataloaders.vector.era5_wave_direction_vector": [[40, "module-meshiphi.dataloaders.vector.era5_wave_direction_vector"]], "era5winddataloader (class in meshiphi.dataloaders.vector.era5_wind)": [[41, "meshiphi.dataloaders.vector.era5_wind.ERA5WindDataLoader"]], "import_data() (meshiphi.dataloaders.vector.era5_wind.era5winddataloader method)": [[41, "meshiphi.dataloaders.vector.era5_wind.ERA5WindDataLoader.import_data"]], "meshiphi.dataloaders.vector.era5_wind": [[41, "module-meshiphi.dataloaders.vector.era5_wind"]], "northseacurrentdataloader (class in meshiphi.dataloaders.vector.north_sea_current)": [[42, "meshiphi.dataloaders.vector.north_sea_current.NorthSeaCurrentDataLoader"]], "import_data() (meshiphi.dataloaders.vector.north_sea_current.northseacurrentdataloader method)": [[42, "meshiphi.dataloaders.vector.north_sea_current.NorthSeaCurrentDataLoader.import_data"]], "meshiphi.dataloaders.vector.north_sea_current": [[42, "module-meshiphi.dataloaders.vector.north_sea_current"]], "oras5currentdataloader (class in meshiphi.dataloaders.vector.oras5_current)": [[43, "meshiphi.dataloaders.vector.oras5_current.ORAS5CurrentDataLoader"]], "import_data() (meshiphi.dataloaders.vector.oras5_current.oras5currentdataloader method)": [[43, "meshiphi.dataloaders.vector.oras5_current.ORAS5CurrentDataLoader.import_data"]], "meshiphi.dataloaders.vector.oras5_current": [[43, "module-meshiphi.dataloaders.vector.oras5_current"]], "sosedataloader (class in meshiphi.dataloaders.vector.sose)": [[44, "meshiphi.dataloaders.vector.sose.SOSEDataLoader"]], "import_data() (meshiphi.dataloaders.vector.sose.sosedataloader method)": [[44, "meshiphi.dataloaders.vector.sose.SOSEDataLoader.import_data"]], "meshiphi.dataloaders.vector.sose": [[44, "module-meshiphi.dataloaders.vector.sose"]], "vectorcsvdataloader (class in meshiphi.dataloaders.vector.vector_csv)": [[45, "meshiphi.dataloaders.vector.vector_csv.VectorCSVDataLoader"]], "import_data() (meshiphi.dataloaders.vector.vector_csv.vectorcsvdataloader method)": [[45, "meshiphi.dataloaders.vector.vector_csv.VectorCSVDataLoader.import_data"]], "meshiphi.dataloaders.vector.vector_csv": [[45, "module-meshiphi.dataloaders.vector.vector_csv"]], "vectorgrfdataloader (class in meshiphi.dataloaders.vector.vector_grf)": [[46, "meshiphi.dataloaders.vector.vector_grf.VectorGRFDataLoader"]], "add_default_params() (meshiphi.dataloaders.vector.vector_grf.vectorgrfdataloader method)": [[46, "meshiphi.dataloaders.vector.vector_grf.VectorGRFDataLoader.add_default_params"]], "import_data() (meshiphi.dataloaders.vector.vector_grf.vectorgrfdataloader method)": [[46, "meshiphi.dataloaders.vector.vector_grf.VectorGRFDataLoader.import_data"]], "meshiphi.dataloaders.vector.vector_grf": [[46, "module-meshiphi.dataloaders.vector.vector_grf"]], "aggregatedcellbox (class in meshiphi.mesh_generation.aggregated_cellbox)": [[50, "meshiphi.mesh_generation.aggregated_cellbox.AggregatedCellBox"]], "bounds (meshiphi.mesh_generation.cellbox.cellbox attribute)": [[50, "meshiphi.mesh_generation.cellbox.CellBox.Bounds"]], "cellbox (class in meshiphi.mesh_generation.cellbox)": [[50, "meshiphi.mesh_generation.cellbox.CellBox"]], "environmentmesh (class in meshiphi.mesh_generation.environment_mesh)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh"]], "meshbuilder (class in meshiphi.mesh_generation.mesh_builder)": [[50, "meshiphi.mesh_generation.mesh_builder.MeshBuilder"]], "metadata (class in meshiphi.mesh_generation.metadata)": [[50, "meshiphi.mesh_generation.metadata.Metadata"]], "neighbourgraph (class in meshiphi.mesh_generation.neighbour_graph)": [[50, "meshiphi.mesh_generation.neighbour_graph.NeighbourGraph"]], "__init__() (meshiphi.mesh_generation.aggregated_cellbox.aggregatedcellbox method)": [[50, "meshiphi.mesh_generation.aggregated_cellbox.AggregatedCellBox.__init__"]], "__init__() (meshiphi.mesh_generation.cellbox.cellbox method)": [[50, "meshiphi.mesh_generation.cellbox.CellBox.__init__"]], "__init__() (meshiphi.mesh_generation.environment_mesh.environmentmesh method)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.__init__"]], "__init__() (meshiphi.mesh_generation.mesh_builder.meshbuilder method)": [[50, "meshiphi.mesh_generation.mesh_builder.MeshBuilder.__init__"]], "__init__() (meshiphi.mesh_generation.metadata.metadata method)": [[50, "meshiphi.mesh_generation.metadata.Metadata.__init__"]], "add_dataloader() (meshiphi.mesh_generation.mesh_builder.meshbuilder method)": [[50, "meshiphi.mesh_generation.mesh_builder.MeshBuilder.add_dataloader"]], "agg_cellboxes (meshiphi.mesh_generation.environment_mesh.environmentmesh attribute)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.agg_cellboxes"]], "aggregate() (meshiphi.mesh_generation.cellbox.cellbox method)": [[50, "meshiphi.mesh_generation.cellbox.CellBox.aggregate"]], "bounds (meshiphi.mesh_generation.environment_mesh.environmentmesh attribute)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.bounds"]], "build_environmental_mesh() (meshiphi.mesh_generation.mesh_builder.meshbuilder method)": [[50, "meshiphi.mesh_generation.mesh_builder.MeshBuilder.build_environmental_mesh"]], "config (meshiphi.mesh_generation.environment_mesh.environmentmesh attribute)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.config"]], "contains_point() (meshiphi.mesh_generation.aggregated_cellbox.aggregatedcellbox method)": [[50, "meshiphi.mesh_generation.aggregated_cellbox.AggregatedCellBox.contains_point"]], "data_loader (meshiphi.mesh_generation.metadata.metadata attribute)": [[50, "meshiphi.mesh_generation.metadata.Metadata.data_loader"]], "get_neighbour_case() (meshiphi.mesh_generation.neighbour_graph.neighbourgraph method)": [[50, "meshiphi.mesh_generation.neighbour_graph.NeighbourGraph.get_neighbour_case"]], "id (meshiphi.mesh_generation.cellbox.cellbox attribute)": [[50, "meshiphi.mesh_generation.cellbox.CellBox.id"]], "initialise_neighbour_graph() (meshiphi.mesh_generation.neighbour_graph.neighbourgraph method)": [[50, "meshiphi.mesh_generation.neighbour_graph.NeighbourGraph.initialise_neighbour_graph"]], "load_from_json() (meshiphi.mesh_generation.environment_mesh.environmentmesh class method)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.load_from_json"]], "meshiphi.mesh_generation.aggregated_cellbox": [[50, "module-meshiphi.mesh_generation.aggregated_cellbox"]], "meshiphi.mesh_generation.cellbox": [[50, "module-meshiphi.mesh_generation.cellbox"]], "meshiphi.mesh_generation.environment_mesh": [[50, "module-meshiphi.mesh_generation.environment_mesh"]], "meshiphi.mesh_generation.mesh_builder": [[50, "module-meshiphi.mesh_generation.mesh_builder"]], "meshiphi.mesh_generation.metadata": [[50, "module-meshiphi.mesh_generation.metadata"]], "meshiphi.mesh_generation.neighbour_graph": [[50, "module-meshiphi.mesh_generation.neighbour_graph"]], "neighbour_graph (meshiphi.mesh_generation.environment_mesh.environmentmesh attribute)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.neighbour_graph"]], "neighbour_graph (meshiphi.mesh_generation.neighbour_graph.neighbourgraph attribute)": [[50, "meshiphi.mesh_generation.neighbour_graph.NeighbourGraph.neighbour_graph"]], "save() (meshiphi.mesh_generation.environment_mesh.environmentmesh method)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.save"]], "set_data_source() (meshiphi.mesh_generation.cellbox.cellbox method)": [[50, "meshiphi.mesh_generation.cellbox.CellBox.set_data_source"]], "set_parent() (meshiphi.mesh_generation.cellbox.cellbox method)": [[50, "meshiphi.mesh_generation.cellbox.CellBox.set_parent"]], "should_split() (meshiphi.mesh_generation.cellbox.cellbox method)": [[50, "meshiphi.mesh_generation.cellbox.CellBox.should_split"]], "split() (meshiphi.mesh_generation.cellbox.cellbox method)": [[50, "meshiphi.mesh_generation.cellbox.CellBox.split"]], "split_and_replace() (meshiphi.mesh_generation.mesh_builder.meshbuilder method)": [[50, "meshiphi.mesh_generation.mesh_builder.MeshBuilder.split_and_replace"]], "split_to_depth() (meshiphi.mesh_generation.mesh_builder.meshbuilder method)": [[50, "meshiphi.mesh_generation.mesh_builder.MeshBuilder.split_to_depth"]], "splitting_conditions (meshiphi.mesh_generation.metadata.metadata attribute)": [[50, "meshiphi.mesh_generation.metadata.Metadata.splitting_conditions"]], "to_geojson() (meshiphi.mesh_generation.environment_mesh.environmentmesh method)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.to_geojson"]], "to_json() (meshiphi.mesh_generation.aggregated_cellbox.aggregatedcellbox method)": [[50, "meshiphi.mesh_generation.aggregated_cellbox.AggregatedCellBox.to_json"]], "to_json() (meshiphi.mesh_generation.environment_mesh.environmentmesh method)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.to_json"]], "to_tif() (meshiphi.mesh_generation.environment_mesh.environmentmesh method)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.to_tif"]], "update_cellbox() (meshiphi.mesh_generation.environment_mesh.environmentmesh method)": [[50, "meshiphi.mesh_generation.environment_mesh.EnvironmentMesh.update_cellbox"]], "update_neighbours() (meshiphi.mesh_generation.neighbour_graph.neighbourgraph method)": [[50, "meshiphi.mesh_generation.neighbour_graph.NeighbourGraph.update_neighbours"]], "value_fill_type (meshiphi.mesh_generation.metadata.metadata attribute)": [[50, "meshiphi.mesh_generation.metadata.Metadata.value_fill_type"]], "meshvalidator (class in meshiphi.mesh_validation.mesh_validator)": [[52, "meshiphi.mesh_validation.mesh_validator.MeshValidator"]], "sampler (class in meshiphi.mesh_validation.sampler)": [[52, "meshiphi.mesh_validation.sampler.Sampler"]], "__init__() (meshiphi.mesh_validation.mesh_validator.meshvalidator method)": [[52, "meshiphi.mesh_validation.mesh_validator.MeshValidator.__init__"]], "__init__() (meshiphi.mesh_validation.sampler.sampler method)": [[52, "meshiphi.mesh_validation.sampler.Sampler.__init__"]], "env_mesh (meshiphi.mesh_validation.mesh_validator.meshvalidator attribute)": [[52, "meshiphi.mesh_validation.mesh_validator.MeshValidator.env_mesh"]], "generate_samples() (meshiphi.mesh_validation.sampler.sampler method)": [[52, "meshiphi.mesh_validation.sampler.Sampler.generate_samples"]], "get_range_end() (meshiphi.mesh_validation.mesh_validator.meshvalidator method)": [[52, "meshiphi.mesh_validation.mesh_validator.MeshValidator.get_range_end"]], "get_value_from_data() (meshiphi.mesh_validation.mesh_validator.meshvalidator method)": [[52, "meshiphi.mesh_validation.mesh_validator.MeshValidator.get_value_from_data"]], "get_values_from_mesh() (meshiphi.mesh_validation.mesh_validator.meshvalidator method)": [[52, "meshiphi.mesh_validation.mesh_validator.MeshValidator.get_values_from_mesh"]], "mesh (meshiphi.mesh_validation.mesh_validator.meshvalidator attribute)": [[52, "meshiphi.mesh_validation.mesh_validator.MeshValidator.mesh"]], "meshiphi.mesh_validation.mesh_validator": [[52, "module-meshiphi.mesh_validation.mesh_validator"]], "meshiphi.mesh_validation.sampler": [[52, "module-meshiphi.mesh_validation.sampler"]], "number_of_samples (meshiphi.mesh_validation.sampler.sampler attribute)": [[52, "meshiphi.mesh_validation.sampler.Sampler.number_of_samples"]], "validate_mesh() (meshiphi.mesh_validation.mesh_validator.meshvalidator method)": [[52, "meshiphi.mesh_validation.mesh_validator.MeshValidator.validate_mesh"]], "validation_length (meshiphi.mesh_validation.mesh_validator.meshvalidator attribute)": [[52, "meshiphi.mesh_validation.mesh_validator.MeshValidator.validation_length"]], "meshplotter (class in meshiphi.mesh_plotting.mesh_plotter)": [[54, "meshiphi.mesh_plotting.mesh_plotter.MeshPlotter"]], "__init__() (meshiphi.mesh_plotting.mesh_plotter.meshplotter method)": [[54, "meshiphi.mesh_plotting.mesh_plotter.MeshPlotter.__init__"]], "meshiphi.mesh_plotting.mesh_plotter": [[54, "module-meshiphi.mesh_plotting.mesh_plotter"]], "plot_bool() (meshiphi.mesh_plotting.mesh_plotter.meshplotter method)": [[54, "meshiphi.mesh_plotting.mesh_plotter.MeshPlotter.plot_bool"]], "plot_cmap() (meshiphi.mesh_plotting.mesh_plotter.meshplotter method)": [[54, "meshiphi.mesh_plotting.mesh_plotter.MeshPlotter.plot_cmap"]], "save() (meshiphi.mesh_plotting.mesh_plotter.meshplotter method)": [[54, "meshiphi.mesh_plotting.mesh_plotter.MeshPlotter.save"]]}}) \ No newline at end of file diff --git a/docs/html/sections/Code_overview.html b/docs/html/sections/Code_overview.html index de2a6c0f..366f1d32 100644 --- a/docs/html/sections/Code_overview.html +++ b/docs/html/sections/Code_overview.html @@ -4,7 +4,7 @@ - 4. Background — meshiphi 1.1.6 documentation + 4. Background — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -116,7 +116,7 @@

      4.1. Code Structure
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Command_line_interface.html b/docs/html/sections/Command_line_interface.html index 30ba68f1..ba862639 100644 --- a/docs/html/sections/Command_line_interface.html +++ b/docs/html/sections/Command_line_interface.html @@ -4,7 +4,7 @@ - 3. Command Line Interface — meshiphi 1.1.6 documentation + 3. Command Line Interface — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -214,7 +214,7 @@

      3.4. plot_mesh (GeoPlot) -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Configuration/Configuration_overview.html b/docs/html/sections/Configuration/Configuration_overview.html index 3a01cdf2..ba6028f4 100644 --- a/docs/html/sections/Configuration/Configuration_overview.html +++ b/docs/html/sections/Configuration/Configuration_overview.html @@ -4,7 +4,7 @@ - 5. Configuration Overview — meshiphi 1.1.6 documentation + 5. Configuration Overview — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -223,7 +223,7 @@

      5.2. Config Validation -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Configuration/Mesh_construction_config.html b/docs/html/sections/Configuration/Mesh_construction_config.html index 862ef8d0..240207a1 100644 --- a/docs/html/sections/Configuration/Mesh_construction_config.html +++ b/docs/html/sections/Configuration/Mesh_construction_config.html @@ -4,7 +4,7 @@ - 5.1. Configuration - Mesh Construction — meshiphi 1.1.6 documentation + 5.1. Configuration - Mesh Construction — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -498,7 +498,7 @@

      5.1.3. Splitting
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/AddingDataloaders.html b/docs/html/sections/Dataloaders/AddingDataloaders.html index 790b7b22..eae2feac 100644 --- a/docs/html/sections/Dataloaders/AddingDataloaders.html +++ b/docs/html/sections/Dataloaders/AddingDataloaders.html @@ -4,7 +4,7 @@ - 7.6. Adding New Dataloaders — meshiphi 1.1.6 documentation + 7.6. Adding New Dataloaders — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -197,7 +197,7 @@

      7.6.2. Adding within iPython Notebooks
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/DataLoaderInterface.html b/docs/html/sections/Dataloaders/DataLoaderInterface.html index da8872fc..38ff7895 100644 --- a/docs/html/sections/Dataloaders/DataLoaderInterface.html +++ b/docs/html/sections/Dataloaders/DataLoaderInterface.html @@ -4,7 +4,7 @@ - 7.1. Dataloader Interface — meshiphi 1.1.6 documentation + 7.1. Dataloader Interface — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -138,7 +138,7 @@
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/Factory.html b/docs/html/sections/Dataloaders/Factory.html index 24ead29d..7f7693a0 100644 --- a/docs/html/sections/Dataloaders/Factory.html +++ b/docs/html/sections/Dataloaders/Factory.html @@ -4,7 +4,7 @@ - 7.2. Dataloader Factory — meshiphi 1.1.6 documentation + 7.2. Dataloader Factory — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -221,7 +221,7 @@

      7.2.2. Example
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/lut/abstractLUT.html b/docs/html/sections/Dataloaders/lut/abstractLUT.html index df952db3..afb16f55 100644 --- a/docs/html/sections/Dataloaders/lut/abstractLUT.html +++ b/docs/html/sections/Dataloaders/lut/abstractLUT.html @@ -4,7 +4,7 @@ - 7.5.1.1. Abstract Look Up Table Dataloader — meshiphi 1.1.6 documentation + 7.5.1.1. Abstract Look Up Table Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -219,7 +219,7 @@
      -get_hom_condition(bounds, splitting_conds)
      +get_hom_condition(bounds, splitting_conds, data=None)

      Retrieves homogeneity condition of data within boundary.

      @@ -250,32 +250,9 @@
      -
      -
      -get_val_from_coord(long=None, lat=None, return_coords=False)
      -

      Extracts value from self.data with lat and long specified in kwargs.

      -
      -
      Parameters:
      -
        -
      • long (float) – Longitude coordinate to search for

      • -
      • lat (float) – Latitude coordinate to search for

      • -
      • return_coords (boolean) – Flag for whether to return coordinates with the value or not

      • -
      -
      -
      Returns:
      -

      Either with one entry (the value at the coords), -Optionaly with coordinates associated with it if -return_coords = True

      -
      -
      Return type:
      -

      pd.DataFrame

      -
      -
      -
      -
      -get_value(bounds, agg_type=None, skipna=False)
      +get_value(bounds, agg_type=None, skipna=False, data=None)

      Retrieve aggregated value from within bounds

      Parameters:
      @@ -396,7 +373,7 @@
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/lut/implemented/Density.html b/docs/html/sections/Dataloaders/lut/implemented/Density.html index 3c19cedf..5f5c9358 100644 --- a/docs/html/sections/Dataloaders/lut/implemented/Density.html +++ b/docs/html/sections/Dataloaders/lut/implemented/Density.html @@ -4,7 +4,7 @@ - 7.5.3.1. Density Dataloader — meshiphi 1.1.6 documentation + 7.5.3.1. Density Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -148,7 +148,7 @@

      7.5.3.1. Density Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/lut/implemented/LutCSV.html b/docs/html/sections/Dataloaders/lut/implemented/LutCSV.html index 9c9412d2..dc9872bc 100644 --- a/docs/html/sections/Dataloaders/lut/implemented/LutCSV.html +++ b/docs/html/sections/Dataloaders/lut/implemented/LutCSV.html @@ -4,7 +4,7 @@ - 7.5.3.2. LUT CSV Dataloader — meshiphi 1.1.6 documentation + 7.5.3.2. LUT CSV Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -150,7 +150,7 @@

      7.5.3.2. LUT CSV Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/lut/implemented/LutGeoJSON.html b/docs/html/sections/Dataloaders/lut/implemented/LutGeoJSON.html index f8836f0a..a6b71a3c 100644 --- a/docs/html/sections/Dataloaders/lut/implemented/LutGeoJSON.html +++ b/docs/html/sections/Dataloaders/lut/implemented/LutGeoJSON.html @@ -4,7 +4,7 @@ - 7.5.3.3. LUT GeoJSON Dataloader — meshiphi 1.1.6 documentation + 7.5.3.3. LUT GeoJSON Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -169,7 +169,7 @@

      7.5.3.3. LUT GeoJSON Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/lut/implemented/Scotland_NCMPA.html b/docs/html/sections/Dataloaders/lut/implemented/Scotland_NCMPA.html index b5ce7e51..80c76cb0 100644 --- a/docs/html/sections/Dataloaders/lut/implemented/Scotland_NCMPA.html +++ b/docs/html/sections/Dataloaders/lut/implemented/Scotland_NCMPA.html @@ -4,7 +4,7 @@ - 7.5.3.4. Scotland NCMPA Dataloader — meshiphi 1.1.6 documentation + 7.5.3.4. Scotland NCMPA Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -146,7 +146,7 @@

      7.5.3.4. Scotland NCMPA Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/lut/implemented/Thickness.html b/docs/html/sections/Dataloaders/lut/implemented/Thickness.html index ed7d98ae..942fc287 100644 --- a/docs/html/sections/Dataloaders/lut/implemented/Thickness.html +++ b/docs/html/sections/Dataloaders/lut/implemented/Thickness.html @@ -4,7 +4,7 @@ - 7.5.3.5. Thickness Dataloader — meshiphi 1.1.6 documentation + 7.5.3.5. Thickness Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -178,7 +178,7 @@

      7.5.3.5. Thickness Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/lut/index.html b/docs/html/sections/Dataloaders/lut/index.html index 10a84619..69980a43 100644 --- a/docs/html/sections/Dataloaders/lut/index.html +++ b/docs/html/sections/Dataloaders/lut/index.html @@ -4,7 +4,7 @@ - 7.5. LUT Dataloaders — meshiphi 1.1.6 documentation + 7.5. LUT Dataloaders — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -154,7 +154,7 @@

      7.5.3. Implemented LUT Dataloaders
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/overview.html b/docs/html/sections/Dataloaders/overview.html index 96d61e11..b8b678eb 100644 --- a/docs/html/sections/Dataloaders/overview.html +++ b/docs/html/sections/Dataloaders/overview.html @@ -4,7 +4,7 @@ - 7. Dataloader Overview — meshiphi 1.1.6 documentation + 7. Dataloader Overview — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -185,7 +185,7 @@

      7.7.2. Abstract Dataloaders -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/abstractScalar.html b/docs/html/sections/Dataloaders/scalar/abstractScalar.html index 5374ab70..1bc6eade 100644 --- a/docs/html/sections/Dataloaders/scalar/abstractScalar.html +++ b/docs/html/sections/Dataloaders/scalar/abstractScalar.html @@ -4,7 +4,7 @@ - 7.3.1.1. Abstract Scalar Dataloader — meshiphi 1.1.6 documentation + 7.3.1.1. Abstract Scalar Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -234,35 +234,9 @@

      -
      -
      -get_dp_from_coord(long=None, lat=None, return_coords=False)
      -

      Extracts datapoint from self.data with lat and long specified in kwargs. -self.data can be pd.DataFrame or xr.Dataset. Will return multiple values -if one set of coordinates have multiple entries (e.g. time series data)

      -
      -
      Parameters:
      -
        -
      • long (float) – Longitude coordinate to search for

      • -
      • lat (float) – Latitude coordinate to search for

      • -
      -
      -
      Returns:
      -

      -
      Column of data values with chosen lat/long. Could be many

      datapoints because either bad data or multiple time steps

      -
      -
      -

      -
      -
      Return type:
      -

      pd.Series

      -
      -
      -
      -
      -get_hom_condition(bounds, splitting_conds)
      +get_hom_condition(bounds, splitting_conds, data=None)

      Retrieves homogeneity condition of data within boundary.

      @@ -310,7 +284,7 @@
      -get_value(bounds, agg_type=None, skipna=True)
      +get_value(bounds, data=None, agg_type=None, skipna=True)

      Retrieve aggregated value from within bounds

      Parameters:
      @@ -444,7 +418,7 @@
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/AMSR.html b/docs/html/sections/Dataloaders/scalar/implemented/AMSR.html index e8ed3b5a..7fcc3e04 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/AMSR.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/AMSR.html @@ -4,7 +4,7 @@ - 7.3.3.1. AMSR Dataloader — meshiphi 1.1.6 documentation + 7.3.3.1. AMSR Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -187,7 +187,7 @@

      7.3.3.1. AMSR Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/BSOSEDepth.html b/docs/html/sections/Dataloaders/scalar/implemented/BSOSEDepth.html index 23f253c6..094b09b1 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/BSOSEDepth.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/BSOSEDepth.html @@ -4,7 +4,7 @@ - 7.3.3.2. BSOSE Depth Dataloader — meshiphi 1.1.6 documentation + 7.3.3.2. BSOSE Depth Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -171,7 +171,7 @@

      7.3.3.2. BSOSE Depth Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/BSOSESeaIce.html b/docs/html/sections/Dataloaders/scalar/implemented/BSOSESeaIce.html index 700ad110..2a6e35e9 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/BSOSESeaIce.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/BSOSESeaIce.html @@ -4,7 +4,7 @@ - 7.3.3.3. BSOSE Sea Ice Dataloader — meshiphi 1.1.6 documentation + 7.3.3.3. BSOSE Sea Ice Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -174,7 +174,7 @@

      7.3.3.3. BSOSE Sea Ice Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/BalticSeaIce.html b/docs/html/sections/Dataloaders/scalar/implemented/BalticSeaIce.html index b26f3cc1..16c39341 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/BalticSeaIce.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/BalticSeaIce.html @@ -4,7 +4,7 @@ - 7.3.3.4. Baltic Sea Ice Dataloader — meshiphi 1.1.6 documentation + 7.3.3.4. Baltic Sea Ice Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -165,7 +165,7 @@

      7.3.3.4. Baltic Sea Ice Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/BinaryGRF.html b/docs/html/sections/Dataloaders/scalar/implemented/BinaryGRF.html index b72f7365..5353723b 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/BinaryGRF.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/BinaryGRF.html @@ -4,7 +4,7 @@ - 7.3.3.5. Binary GRF Dataloader — meshiphi 1.1.6 documentation + 7.3.3.5. Binary GRF Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -160,7 +160,7 @@
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/ECMWFSigWaveHeight.html b/docs/html/sections/Dataloaders/scalar/implemented/ECMWFSigWaveHeight.html index 97e77d98..cc340163 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/ECMWFSigWaveHeight.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/ECMWFSigWaveHeight.html @@ -4,7 +4,7 @@ - 7.3.3.6. ECMWFSigWaveHeight Dataloader — meshiphi 1.1.6 documentation + 7.3.3.6. ECMWFSigWaveHeight Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -167,7 +167,7 @@

      7.3.3.6. ECMWFSigWaveHeight Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/ERA5MaxWaveHeight.html b/docs/html/sections/Dataloaders/scalar/implemented/ERA5MaxWaveHeight.html index 1d6bb66f..a5324eda 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/ERA5MaxWaveHeight.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/ERA5MaxWaveHeight.html @@ -4,7 +4,7 @@ - 7.3.3.7. ERA5 Maximum Wave Height Dataloader — meshiphi 1.1.6 documentation + 7.3.3.7. ERA5 Maximum Wave Height Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -169,7 +169,7 @@

      7.3.3.7. ERA5 Maximum Wave Height Datalo
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/ERA5SigWaveHeight.html b/docs/html/sections/Dataloaders/scalar/implemented/ERA5SigWaveHeight.html index 43d930a2..2b344504 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/ERA5SigWaveHeight.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/ERA5SigWaveHeight.html @@ -4,7 +4,7 @@ - 7.3.3.8. ERA5 Significant Wave Height Dataloader — meshiphi 1.1.6 documentation + 7.3.3.8. ERA5 Significant Wave Height Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -169,7 +169,7 @@

      7.3.3.8. ERA5 Significant Wave Height Da
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/ERA5WaveDirection.html b/docs/html/sections/Dataloaders/scalar/implemented/ERA5WaveDirection.html index 924d129c..ae82bba6 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/ERA5WaveDirection.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/ERA5WaveDirection.html @@ -4,7 +4,7 @@ - 7.3.3.9. ERA5 Mean Wave Direction Dataloader — meshiphi 1.1.6 documentation + 7.3.3.9. ERA5 Mean Wave Direction Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -169,7 +169,7 @@

      7.3.3.9. ERA5 Mean Wave Direction Datalo
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/ERA5WavePeriod.html b/docs/html/sections/Dataloaders/scalar/implemented/ERA5WavePeriod.html index 97245aa5..386855ba 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/ERA5WavePeriod.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/ERA5WavePeriod.html @@ -4,7 +4,7 @@ - 7.3.3.10. ERA5 Mean Wave Period Dataloader — meshiphi 1.1.6 documentation + 7.3.3.10. ERA5 Mean Wave Period Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -169,7 +169,7 @@

      7.3.3.10. ERA5 Mean Wave Period Dataload
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/ERA5WindDirection.html b/docs/html/sections/Dataloaders/scalar/implemented/ERA5WindDirection.html index b99a0558..10a38bbe 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/ERA5WindDirection.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/ERA5WindDirection.html @@ -4,7 +4,7 @@ - 7.3.3.11. ERA5 Wind Direction Dataloader — meshiphi 1.1.6 documentation + 7.3.3.11. ERA5 Wind Direction Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -169,7 +169,7 @@

      7.3.3.11. ERA5 Wind Direction Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/ERA5WindMagnitude.html b/docs/html/sections/Dataloaders/scalar/implemented/ERA5WindMagnitude.html index 75eda1a1..2135c4c0 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/ERA5WindMagnitude.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/ERA5WindMagnitude.html @@ -4,7 +4,7 @@ - 7.3.3.12. ERA5 Wind Magnitude Dataloader — meshiphi 1.1.6 documentation + 7.3.3.12. ERA5 Wind Magnitude Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -169,7 +169,7 @@

      7.3.3.12. ERA5 Wind Magnitude Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/GEBCO.html b/docs/html/sections/Dataloaders/scalar/implemented/GEBCO.html index 790d17ef..9b9cc073 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/GEBCO.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/GEBCO.html @@ -4,7 +4,7 @@ - 7.3.3.13. GEBCO Dataloader — meshiphi 1.1.6 documentation + 7.3.3.13. GEBCO Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -161,7 +161,7 @@

      7.3.3.13. GEBCO Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/IceNet.html b/docs/html/sections/Dataloaders/scalar/implemented/IceNet.html index 820ff55b..471b0066 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/IceNet.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/IceNet.html @@ -4,7 +4,7 @@ - 7.3.3.14. IceNet Dataloader — meshiphi 1.1.6 documentation + 7.3.3.14. IceNet Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -169,7 +169,7 @@

      7.3.3.14. IceNet Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/MODIS.html b/docs/html/sections/Dataloaders/scalar/implemented/MODIS.html index 1a849bc3..5f474dae 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/MODIS.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/MODIS.html @@ -4,7 +4,7 @@ - 7.3.3.15. MODIS Dataloader — meshiphi 1.1.6 documentation + 7.3.3.15. MODIS Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -166,7 +166,7 @@

      7.3.3.15. MODIS Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/ScalarCSV.html b/docs/html/sections/Dataloaders/scalar/implemented/ScalarCSV.html index 60ad75cd..8052d3d7 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/ScalarCSV.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/ScalarCSV.html @@ -4,7 +4,7 @@ - 7.3.3.16. Scalar CSV Dataloader — meshiphi 1.1.6 documentation + 7.3.3.16. Scalar CSV Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -161,7 +161,7 @@

      7.3.3.16. Scalar CSV Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/ScalarGRF.html b/docs/html/sections/Dataloaders/scalar/implemented/ScalarGRF.html index 751af80d..2ed14bfe 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/ScalarGRF.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/ScalarGRF.html @@ -4,7 +4,7 @@ - 7.3.3.17. Scalar GRF Dataloader — meshiphi 1.1.6 documentation + 7.3.3.17. Scalar GRF Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -213,7 +213,7 @@
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/Shape.html b/docs/html/sections/Dataloaders/scalar/implemented/Shape.html index 872a9c64..5a75364d 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/Shape.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/Shape.html @@ -4,7 +4,7 @@ - 7.3.3.18. Shape Dataloader — meshiphi 1.1.6 documentation + 7.3.3.18. Shape Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -212,7 +212,7 @@

      7.3.3.18. Shape Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/implemented/visual_iced.html b/docs/html/sections/Dataloaders/scalar/implemented/visual_iced.html index dc2a9807..76be4686 100644 --- a/docs/html/sections/Dataloaders/scalar/implemented/visual_iced.html +++ b/docs/html/sections/Dataloaders/scalar/implemented/visual_iced.html @@ -4,7 +4,7 @@ - 7.3.3.19. Visual_iced Dataloader — meshiphi 1.1.6 documentation + 7.3.3.19. Visual_iced Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -203,7 +203,7 @@

      7.3.3.19. Visual_iced Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/scalar/index.html b/docs/html/sections/Dataloaders/scalar/index.html index be50740a..c1ebadac 100644 --- a/docs/html/sections/Dataloaders/scalar/index.html +++ b/docs/html/sections/Dataloaders/scalar/index.html @@ -4,7 +4,7 @@ - 7.3. Scalar Dataloaders — meshiphi 1.1.6 documentation + 7.3. Scalar Dataloaders — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -228,7 +228,7 @@

      7.3.3. Implemented Scalar Dataloaders
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/abstractVector.html b/docs/html/sections/Dataloaders/vector/abstractVector.html index 975168e9..d58708ce 100644 --- a/docs/html/sections/Dataloaders/vector/abstractVector.html +++ b/docs/html/sections/Dataloaders/vector/abstractVector.html @@ -4,7 +4,7 @@ - 7.4.1.1. Abstract Vector Dataloader — meshiphi 1.1.6 documentation + 7.4.1.1. Abstract Vector Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -374,32 +374,9 @@

      -
      -
      -get_dp_from_coord(long=None, lat=None, return_coords=False)
      -

      Extracts datapoint from self.data with lat and long specified in kwargs. -self.data can be pd.DataFrame or xr.Dataset. Will return multiple values -if one set of coordinates have multiple entries (e.g. time series data)

      -
      -
      Parameters:
      -
        -
      • long (float) – Longitude coordinate to search for

      • -
      • lat (float) – Latitude coordinate to search for

      • -
      -
      -
      Returns:
      -

      Column of data values with chosen lat/long. Could be many -datapoints because either bad data or multiple time steps

      -
      -
      Return type:
      -

      pd.Dataframe

      -
      -
      -
      -
      -get_hom_condition(bounds, splitting_conds, agg_type='MEAN')
      +get_hom_condition(bounds, splitting_conds, agg_type='MEAN', data=None)

      Retrieves homogeneity condition of data within boundary.

      Parameters:
      @@ -431,7 +408,7 @@
      -get_value(bounds, agg_type=None, skipna=True)
      +get_value(bounds, agg_type=None, skipna=True, data=None)

      Retrieve aggregated value from within bounds

      Parameters:
      @@ -584,7 +561,7 @@
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/implemented/BalticCurrent.html b/docs/html/sections/Dataloaders/vector/implemented/BalticCurrent.html index 10b88b99..fb745adf 100644 --- a/docs/html/sections/Dataloaders/vector/implemented/BalticCurrent.html +++ b/docs/html/sections/Dataloaders/vector/implemented/BalticCurrent.html @@ -4,7 +4,7 @@ - 7.4.3.1. Baltic Currents Dataloader — meshiphi 1.1.6 documentation + 7.4.3.1. Baltic Currents Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -159,7 +159,7 @@

      7.4.3.1. Baltic Currents Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/implemented/DUACS.html b/docs/html/sections/Dataloaders/vector/implemented/DUACS.html index acde91d4..0ffb5765 100644 --- a/docs/html/sections/Dataloaders/vector/implemented/DUACS.html +++ b/docs/html/sections/Dataloaders/vector/implemented/DUACS.html @@ -4,7 +4,7 @@ - 7.4.3.2. DUACS Currents Dataloader — meshiphi 1.1.6 documentation + 7.4.3.2. DUACS Currents Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -160,7 +160,7 @@

      7.4.3.2. DUACS Currents Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/implemented/ERA5WaveDirection.html b/docs/html/sections/Dataloaders/vector/implemented/ERA5WaveDirection.html index 41720028..60e05e09 100644 --- a/docs/html/sections/Dataloaders/vector/implemented/ERA5WaveDirection.html +++ b/docs/html/sections/Dataloaders/vector/implemented/ERA5WaveDirection.html @@ -4,7 +4,7 @@ - 7.4.3.3. ERA5 Wave Direction Dataloader — meshiphi 1.1.6 documentation + 7.4.3.3. ERA5 Wave Direction Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -162,7 +162,7 @@

      7.4.3.3. ERA5 Wave Direction Dataloader<
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/implemented/ERA5Wind.html b/docs/html/sections/Dataloaders/vector/implemented/ERA5Wind.html index ef055c70..08ae4a55 100644 --- a/docs/html/sections/Dataloaders/vector/implemented/ERA5Wind.html +++ b/docs/html/sections/Dataloaders/vector/implemented/ERA5Wind.html @@ -4,7 +4,7 @@ - 7.4.3.4. ERA5 Wind Dataloader — meshiphi 1.1.6 documentation + 7.4.3.4. ERA5 Wind Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -159,7 +159,7 @@

      7.4.3.4. ERA5 Wind Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/implemented/NorthSeaCurrent.html b/docs/html/sections/Dataloaders/vector/implemented/NorthSeaCurrent.html index e7de7ae9..94895fcc 100644 --- a/docs/html/sections/Dataloaders/vector/implemented/NorthSeaCurrent.html +++ b/docs/html/sections/Dataloaders/vector/implemented/NorthSeaCurrent.html @@ -4,7 +4,7 @@ - 7.4.3.5. North Sea Currents Dataloader — meshiphi 1.1.6 documentation + 7.4.3.5. North Sea Currents Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -153,7 +153,7 @@

      7.4.3.5. North Sea Currents Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/implemented/ORAS5Current.html b/docs/html/sections/Dataloaders/vector/implemented/ORAS5Current.html index 5d16c023..a962e53f 100644 --- a/docs/html/sections/Dataloaders/vector/implemented/ORAS5Current.html +++ b/docs/html/sections/Dataloaders/vector/implemented/ORAS5Current.html @@ -4,7 +4,7 @@ - 7.4.3.6. ORAS5 Currents Dataloader — meshiphi 1.1.6 documentation + 7.4.3.6. ORAS5 Currents Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -159,7 +159,7 @@

      7.4.3.6. ORAS5 Currents Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/implemented/SOSE.html b/docs/html/sections/Dataloaders/vector/implemented/SOSE.html index 70b772f2..0a0149af 100644 --- a/docs/html/sections/Dataloaders/vector/implemented/SOSE.html +++ b/docs/html/sections/Dataloaders/vector/implemented/SOSE.html @@ -4,7 +4,7 @@ - 7.4.3.7. SOSE Currents Dataloader — meshiphi 1.1.6 documentation + 7.4.3.7. SOSE Currents Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -159,7 +159,7 @@

      7.4.3.7. SOSE Currents Dataloader
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/implemented/VectorCSV.html b/docs/html/sections/Dataloaders/vector/implemented/VectorCSV.html index 1fc0e8e1..60af1f47 100644 --- a/docs/html/sections/Dataloaders/vector/implemented/VectorCSV.html +++ b/docs/html/sections/Dataloaders/vector/implemented/VectorCSV.html @@ -4,7 +4,7 @@ - 7.4.3.8. Vector CSV Dataloader — meshiphi 1.1.6 documentation + 7.4.3.8. Vector CSV Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -151,7 +151,7 @@

      7.4.3.8. Vector CSV Dataloader -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/implemented/VectorGRF.html b/docs/html/sections/Dataloaders/vector/implemented/VectorGRF.html index dfc330fc..c5b8f16a 100644 --- a/docs/html/sections/Dataloaders/vector/implemented/VectorGRF.html +++ b/docs/html/sections/Dataloaders/vector/implemented/VectorGRF.html @@ -4,7 +4,7 @@ - 7.4.3.9. Vector GRF Dataloader — meshiphi 1.1.6 documentation + 7.4.3.9. Vector GRF Dataloader — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -195,7 +195,7 @@
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with Sphinx using a diff --git a/docs/html/sections/Dataloaders/vector/index.html b/docs/html/sections/Dataloaders/vector/index.html index c335cfab..4d0426e7 100644 --- a/docs/html/sections/Dataloaders/vector/index.html +++ b/docs/html/sections/Dataloaders/vector/index.html @@ -4,7 +4,7 @@ - 7.4. Vector Dataloaders — meshiphi 1.1.6 documentation + 7.4. Vector Dataloaders — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -213,7 +213,7 @@

      7.4.3. Implemented Vector Dataloaders
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Examples.html b/docs/html/sections/Examples.html index a1d348c6..fbd89c7b 100644 --- a/docs/html/sections/Examples.html +++ b/docs/html/sections/Examples.html @@ -4,7 +4,7 @@ - 2. Examples — meshiphi 1.1.6 documentation + 2. Examples — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -153,7 +153,7 @@

      2.1. Creating the Digital Environment.
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Installation.html b/docs/html/sections/Installation.html index 8bf3b17c..8b90e405 100644 --- a/docs/html/sections/Installation.html +++ b/docs/html/sections/Installation.html @@ -4,7 +4,7 @@ - 1. Installation — meshiphi 1.1.6 documentation + 1. Installation — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -165,7 +165,7 @@

      1.2.2. Linux/MacOS
      -

      © Copyright 2022-2023, BAS AI Lab.

      +

      © Copyright 2021-, BAS AI Lab.

      Built with
      Sphinx using a diff --git a/docs/html/sections/Mesh_Construction/Mesh_construction_classes.html b/docs/html/sections/Mesh_Construction/Mesh_construction_classes.html index 19b0c64f..1733251a 100644 --- a/docs/html/sections/Mesh_Construction/Mesh_construction_classes.html +++ b/docs/html/sections/Mesh_Construction/Mesh_construction_classes.html @@ -4,7 +4,7 @@ - 8.4.1. Mesh Construction - Classes — meshiphi 1.1.6 documentation + 8.4.1. Mesh Construction - Classes — meshiphi 2.0.8 documentation @@ -15,7 +15,7 @@ - + @@ -594,7 +594,8 @@

      8.4.1.3. NeighbourGraph
      update_neighbours(cellbox_indx, new_neighbours_indx, direction, cellboxes)
      -

      method that updates the neighbour of a certain cellbox in a specific direction. It removes cellbox_indx from the neighbour_map of its neighbours in a specific direction and add new_neighbour_indx

      +

      method that updates the neighbour of a certain cellbox in a specific direction. +It removes cellbox_indx from the neighbour_map of its neighbours in a specific direction and add new_neighbour_indx

      Parameters:

  • get_dataloader() (meshiphi.dataloaders.factory.DataLoaderFactory static method)