From a14b4e3d399a06fe8d2389b4d309004c1cd3c7a8 Mon Sep 17 00:00:00 2001 From: hvrai Date: Tue, 12 Sep 2023 00:09:16 +0530 Subject: [PATCH 01/12] Fixing integration tests --- ads/feature_store/dataset.py | 5 +- .../spark/spark_execution.py | 20 ++-- ads/feature_store/statistics.py | 110 +++++++++++++++++- tests/integration/feature_store/test_base.py | 4 +- .../feature_store/test_dataset_complex.py | 4 +- 5 files changed, 123 insertions(+), 20 deletions(-) diff --git a/ads/feature_store/dataset.py b/ads/feature_store/dataset.py index 565d91ef1..4275d3e37 100644 --- a/ads/feature_store/dataset.py +++ b/ads/feature_store/dataset.py @@ -865,10 +865,11 @@ def _update_from_oci_dataset_model(self, oci_dataset: OCIDataset) -> "Dataset": features_list.append(output_feature) value = {self.CONST_ITEMS: features_list} - else: + elif infra_attr == self.CONST_FEATURE_GROUP: value = getattr(self.oci_dataset, dsc_attr) + else: + value = dataset_details[infra_attr] self.set_spec(infra_attr, value) - return self def materialise( diff --git a/ads/feature_store/execution_strategy/spark/spark_execution.py b/ads/feature_store/execution_strategy/spark/spark_execution.py index 687c8b496..caa74dd46 100644 --- a/ads/feature_store/execution_strategy/spark/spark_execution.py +++ b/ads/feature_store/execution_strategy/spark/spark_execution.py @@ -1,7 +1,5 @@ #!/usr/bin/env python # -*- coding: utf-8; -*- -import json - # Copyright (c) 2023 Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ @@ -29,8 +27,6 @@ raise from ads.feature_store.common.enums import ( - FeatureStoreJobType, - LifecycleState, EntityType, ExpectationType, ) @@ -47,6 +43,11 @@ from ads.feature_store.feature_statistics.statistics_service import StatisticsService from ads.feature_store.common.utils.utility import validate_input_feature_details +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ads.feature_store.feature_group import FeatureGroup + from ads.feature_store.dataset import Dataset logger = logging.getLogger(__name__) @@ -76,7 +77,10 @@ def __init__(self, metastore_id: str = None): self._jvm = self._spark_context._jvm def ingest_feature_definition( - self, feature_group, feature_group_job: FeatureGroupJob, dataframe + self, + feature_group: "FeatureGroup", + feature_group_job: FeatureGroupJob, + dataframe, ): try: self._save_offline_dataframe(dataframe, feature_group, feature_group_job) @@ -90,7 +94,7 @@ def ingest_dataset(self, dataset, dataset_job: DatasetJob): raise SparkExecutionException(e).with_traceback(e.__traceback__) def delete_feature_definition( - self, feature_group, feature_group_job: FeatureGroupJob + self, feature_group: "FeatureGroup", feature_group_job: FeatureGroupJob ): """ Deletes a feature definition from the system. @@ -122,7 +126,7 @@ def delete_feature_definition( output_details=output_details, ) - def delete_dataset(self, dataset, dataset_job: DatasetJob): + def delete_dataset(self, dataset: "Dataset", dataset_job: DatasetJob): """ Deletes a dataset from the system. @@ -154,7 +158,7 @@ def delete_dataset(self, dataset, dataset_job: DatasetJob): ) @staticmethod - def _validate_expectation(expectation_type, validation_output): + def _validate_expectation(expectation_type, validation_output: dict): """ Validates the expectation based on the given expectation type and the validation output. diff --git a/ads/feature_store/statistics.py b/ads/feature_store/statistics.py index 2ce0589c7..e4d8cffba 100644 --- a/ads/feature_store/statistics.py +++ b/ads/feature_store/statistics.py @@ -1,10 +1,83 @@ -import pandas as pd -from typing import Dict -from copy import deepcopy +import matplotlib.figure +from matplotlib.gridspec import GridSpec +from matplotlib.figure import Figure from ads.feature_store.response.response_builder import ResponseBuilder -from ads.jobs.builders.base import Builder -from ads.common import utils + +import matplotlib.pyplot as plt +import matplotlib.font_manager as fm +import json + + +def add_plots_for_stat(fig: Figure, feature: str, stat: dict): + freq_dist = stat.get(Statistics.CONST_FREQUENCY_DISTRIBUTION) + top_k = stat.get(Statistics.CONST_TOP_K_FREQUENT) + probability = stat.get(Statistics.CONST_PROBABILITY_DISTRIBUTION) + + def subplot_generator(): + plot_count = 0 + if stat.get(Statistics.CONST_FREQUENCY_DISTRIBUTION) is not None: + plot_count += 1 + # if stat.get(Statistics.CONST_TOP_K_FREQUENT) is not None: + # plot_count += 1 + if stat.get(Statistics.CONST_PROBABILITY_DISTRIBUTION) is not None: + plot_count += 1 + + for i in range(0, plot_count): + yield fig.add_subplot(1, plot_count, i + 1) + + subplots = subplot_generator() + if freq_dist is not None: + axs = next(subplots) + fig.suptitle(feature, fontproperties=fm.FontProperties(weight="bold")) + axs.hist( + x=freq_dist.get("bins"), + weights=freq_dist.get("frequency"), + cumulative=False, + color="teal", + mouseover=True, + animated=True, + ) + + axs.set_xlabel( + "Bins", fontdict={"fontproperties": fm.FontProperties(size="xx-small")} + ) + axs.set_ylabel( + "Frequency", fontdict={"fontproperties": fm.FontProperties(size="xx-small")} + ) + axs.set_title( + "Frequency Distribution", + fontdict={"fontproperties": fm.FontProperties(size="small")}, + ) + axs.set_xticks(freq_dist.get("bins")) + if probability is not None: + axs = next(subplots) + fig.suptitle(feature, fontproperties=fm.FontProperties(weight="bold")) + axs.bar( + probability.get("bins"), + probability.get("density"), + color="teal", + mouseover=True, + animated=True, + ) + axs.set_xlabel( + "Bins", fontdict={"fontproperties": fm.FontProperties(size="xx-small")} + ) + axs.set_ylabel( + "Density", fontdict={"fontproperties": fm.FontProperties(size="xx-small")} + ) + axs.set_title( + "Probability Distribution", + fontdict={"fontproperties": fm.FontProperties(size="small")}, + ) + axs.set_xticks(probability.get("bins")) + + +def subfigure_generator(count: int, fig: Figure): + rows = count + subfigs = fig.subfigures(rows, 1) + for i in range(0, rows): + yield subfigs[i] class Statistics(ResponseBuilder): @@ -12,6 +85,10 @@ class Statistics(ResponseBuilder): Represents statistical information. """ + CONST_FREQUENCY_DISTRIBUTION = "FrequencyDistribution" + CONST_PROBABILITY_DISTRIBUTION = "ProbabilityDistribution" + CONST_TOP_K_FREQUENT = "TopKFrequentElements" + @property def kind(self) -> str: """ @@ -23,3 +100,26 @@ def kind(self) -> str: The kind of the statistics object, which is always "statistics". """ return "statistics" + + def to_viz(self): + if self.content is not None: + stats: dict = json.loads(self.content) + fig: Figure = plt.figure(figsize=(20, 20), dpi=150) + plt.subplots_adjust(hspace=3) + + stats = { + feature: stat + for feature, stat in stats.items() + if Statistics.__graph_exists__(stat) + } + subfigures = subfigure_generator(len(stats), fig) + for feature, stat in stats.items(): + sub_figure = next(subfigures) + add_plots_for_stat(sub_figure, feature, stat) + + @staticmethod + def __graph_exists__(stat: dict): + return ( + stat.get(Statistics.CONST_FREQUENCY_DISTRIBUTION) != None + or stat.get(Statistics.CONST_PROBABILITY_DISTRIBUTION) != None + ) diff --git a/tests/integration/feature_store/test_base.py b/tests/integration/feature_store/test_base.py index 4055db46d..6ea257e86 100644 --- a/tests/integration/feature_store/test_base.py +++ b/tests/integration/feature_store/test_base.py @@ -22,8 +22,8 @@ client_kwargs = dict( - retry_strategy=oci.retry.NoneRetryStrategy, - service_endpoint=os.getenv("service_endpoint"), + retry_strategy=oci.retry.NoneRetryStrategy(), + fs_service_endpoint=os.getenv("service_endpoint"), ) ads.set_auth(client_kwargs=client_kwargs) diff --git a/tests/integration/feature_store/test_dataset_complex.py b/tests/integration/feature_store/test_dataset_complex.py index 26d1fe99b..315a87ffa 100644 --- a/tests/integration/feature_store/test_dataset_complex.py +++ b/tests/integration/feature_store/test_dataset_complex.py @@ -70,8 +70,6 @@ def test_manual_dataset( ).create() assert len(dataset_resource.feature_groups) == 1 assert dataset_resource.feature_groups[0].id == feature_group.id - assert dataset_resource.get_spec( - Dataset.CONST_FEATURE_GROUP - ).is_manual_association + assert dataset_resource.is_manual_association dataset_resource.delete() return dataset_resource From 4efa382e57fc6732ea621249bd3a4197bd7aeef5 Mon Sep 17 00:00:00 2001 From: hvrai Date: Tue, 19 Sep 2023 08:34:47 +0530 Subject: [PATCH 02/12] stats representation via plotly in to_viz interface --- ads/feature_store/dataset.py | 4 - ads/feature_store/feature_group.py | 8 +- ads/feature_store/feature_stat.py | 236 +++++++++++++++++++++++++++++ ads/feature_store/statistics.py | 105 +------------ setup.py | 3 +- 5 files changed, 246 insertions(+), 110 deletions(-) create mode 100644 ads/feature_store/feature_stat.py diff --git a/ads/feature_store/dataset.py b/ads/feature_store/dataset.py index 4275d3e37..d69111e78 100644 --- a/ads/feature_store/dataset.py +++ b/ads/feature_store/dataset.py @@ -1207,10 +1207,6 @@ def to_dict(self) -> Dict: for key, value in spec.items(): if hasattr(value, "to_dict"): value = value.to_dict() - if hasattr(value, "attribute_map"): - value = self.oci_dataset.client.base_client.sanitize_for_serialization( - value - ) spec[key] = value return { diff --git a/ads/feature_store/feature_group.py b/ads/feature_store/feature_group.py index 888c7cafb..328d77d23 100644 --- a/ads/feature_store/feature_group.py +++ b/ads/feature_store/feature_group.py @@ -244,8 +244,8 @@ def name(self) -> str: return self.get_spec(self.CONST_NAME) @name.setter - def name(self, name: str) -> "FeatureGroup": - return self.with_name(name) + def name(self, name: str): + self.with_name(name) def with_name(self, name: str) -> "FeatureGroup": """Sets the name. @@ -338,7 +338,7 @@ def transformation_kwargs(self, value: Dict): self.with_transformation_kwargs(value) def with_transformation_kwargs( - self, transformation_kwargs: Dict = {} + self, transformation_kwargs: Dict = () ) -> "FeatureGroup": """Sets the primary keys of the feature group. @@ -604,7 +604,6 @@ def with_statistics_config( FeatureGroup The FeatureGroup instance (self). """ - statistics_config_in = None if isinstance(statistics_config, StatisticsConfig): statistics_config_in = statistics_config elif isinstance(statistics_config, bool): @@ -1108,7 +1107,6 @@ def restore(self, version_number: int = None, timestamp: datetime = None): f"RESTORE TABLE {target_table} TO VERSION AS OF {version_number}" ) else: - iso_timestamp = timestamp.isoformat(" ", "seconds").__str__() sql_query = f"RESTORE TABLE {target_table} TO TIMESTAMP AS OF {timestamp}" restore_output = self.spark_engine.sql(sql_query) diff --git a/ads/feature_store/feature_stat.py b/ads/feature_store/feature_stat.py new file mode 100644 index 000000000..30d677d6a --- /dev/null +++ b/ads/feature_store/feature_stat.py @@ -0,0 +1,236 @@ +import json +from abc import abstractmethod + +from ads.feature_store.common.utils.utility import none_type_safe_json_loads +from plotly.graph_objs import Figure +from typing import List +import plotly +import plotly.graph_objects as go +from plotly.subplots import make_subplots + + +class FeatureStat: + @abstractmethod + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): + pass + + @classmethod + @abstractmethod + def from_json(cls, json_dict: dict): + pass + + @staticmethod + def get_x_y_str_axes(xaxis: int, yaxis: int) -> (): + return ( + ("xaxis" + str(xaxis + 1)), + ("yaxis" + str(yaxis + 1)), + ("x" + str(xaxis + 1)), + ("y" + str(yaxis + 1)), + ) + + +class FrequencyDistribution(FeatureStat): + CONST_FREQUENCY = "frequency" + CONST_BINS = "bins" + CONST_FREQUENCY_DISTRIBUTION_TITLE = "Frequency Distribution" + + def __init__(self, frequency: List, bins: List): + self.frequency = frequency + self.bins = bins + + @classmethod + def from_json(cls, json_dict: dict) -> "FrequencyDistribution": + if json_dict is not None: + return FrequencyDistribution( + frequency=json_dict.get(FrequencyDistribution.CONST_FREQUENCY), + bins=json_dict.get(FrequencyDistribution.CONST_BINS), + ) + else: + return None + + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): + xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) + if ( + type(self.frequency) == list + and type(self.bins) == list + and 0 < len(self.frequency) == len(self.bins) > 0 + ): + fig.add_bar( + x=self.bins, y=self.frequency, xaxis=x_str, yaxis=y_str, name="" + ) + fig.layout.annotations[xaxis].text = self.CONST_FREQUENCY_DISTRIBUTION_TITLE + fig.layout[xaxis_str]["title"] = "Bins" + fig.layout[yaxis_str]["title"] = "Frequency" + + +class ProbabilityDistribution(FeatureStat): + CONST_DENSITY = "density" + CONST_BINS = "bins" + CONST_PROBABILITY_DISTRIBUTION_TITLE = "Probability Distribution" + + def __init__(self, density: List, bins: List): + self.density = density + self.bins = bins + + @classmethod + def from_json(cls, json_dict: dict): + if json_dict is not None: + return cls( + density=json_dict.get(ProbabilityDistribution.CONST_DENSITY), + bins=json_dict.get(ProbabilityDistribution.CONST_BINS), + ) + else: + return None + + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): + xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) + if ( + type(self.density) == list + and type(self.bins) == list + and 0 < len(self.density) == len(self.bins) > 0 + ): + fig.add_bar( + x=self.bins, + y=self.density, + xaxis=x_str, + yaxis=y_str, + name="", + ) + fig.layout.annotations[xaxis].text = self.CONST_PROBABILITY_DISTRIBUTION_TITLE + fig.layout[xaxis_str]["title"] = "Bins" + fig.layout[yaxis_str]["title"] = "Density" + + return go.Bar(x=self.bins, y=self.density) + + +class TopKFrequentElements(FeatureStat): + CONST_VALUE = "value" + CONST_TOP_K_FREQUENT_TITLE = "Top K Frequent Elements" + + class TopKFrequentElement: + CONST_VALUE = "value" + CONST_ESTIMATE = "estimate" + CONST_LOWER_BOUND = "lower_bound" + CONST_UPPER_BOUND = "upper_bound" + + def __init__( + self, value: str, estimate: int, lower_bound: int, upper_bound: int + ): + self.value = value + self.estimate = estimate + self.lower_bound = lower_bound + self.upper_bound = upper_bound + + @classmethod + def from_json(cls, json_dict: dict): + if json_dict is not None: + return cls( + value=json_dict.get(cls.CONST_VALUE), + estimate=json_dict.get(cls.CONST_ESTIMATE), + lower_bound=json_dict.get(cls.CONST_LOWER_BOUND), + upper_bound=json_dict.get(cls.CONST_UPPER_BOUND), + ) + + else: + return None + + def __init__(self, elements: List[TopKFrequentElement]): + self.elements = elements + + @classmethod + def from_json(cls, json_dict: dict): + if json_dict is not None and json_dict.get(cls.CONST_VALUE) is not None: + elements = json_dict.get(cls.CONST_VALUE) + return cls( + [cls.TopKFrequentElement.from_json(element) for element in elements] + ) + else: + return None + + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): + xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) + if type(self.elements) == list and len(self.elements) > 0: + x_axis = [element.value for element in self.elements] + y_axis = [element.estimate for element in self.elements] + fig.add_bar(x=x_axis, y=y_axis, xaxis=x_str, yaxis=y_str, name="") + fig.layout.annotations[xaxis].text = self.CONST_TOP_K_FREQUENT_TITLE + fig.layout[yaxis_str]["title"] = "Count" + fig.layout[xaxis_str]["title"] = "Element" + + +class FeatureStatistics: + CONST_FREQUENCY_DISTRIBUTION = "FrequencyDistribution" + CONST_TITLE_FORMAT = "{}" + CONST_PLOT_FORMAT = "{}_plot" + CONST_PROBABILITY_DISTRIBUTION = "ProbabilityDistribution" + CONST_TOP_K_FREQUENT = "TopKFrequentElements" + + def __init__( + self, + feature_name: str, + top_k_frequent_elements: TopKFrequentElements, + frequency_distribution: FrequencyDistribution, + probability_distribution: ProbabilityDistribution, + ): + self.feature_name: str = feature_name + self.top_k_frequent_elements = top_k_frequent_elements + self.frequency_distribution = frequency_distribution + self.probability_distribution = probability_distribution + + @classmethod + def from_json(cls, feature_name: str, json_dict: dict) -> "FeatureStatistics": + if json_dict is not None: + return cls( + feature_name, + TopKFrequentElements.from_json(json_dict.get(cls.CONST_TOP_K_FREQUENT)), + FrequencyDistribution.from_json( + json_dict.get(cls.CONST_FREQUENCY_DISTRIBUTION) + ), + ProbabilityDistribution.from_json( + json_dict.get(cls.CONST_PROBABILITY_DISTRIBUTION) + ), + ) + else: + return None + + @property + def __stat_count__(self): + graph_count = 0 + if self.top_k_frequent_elements is not None: + graph_count += 1 + if self.probability_distribution is not None: + graph_count += 1 + if self.frequency_distribution is not None: + graph_count += 1 + return graph_count + + @property + def __feature_stat_objects__(self) -> List[FeatureStat]: + return [ + stat + for stat in [ + self.top_k_frequent_elements, + self.frequency_distribution, + self.probability_distribution, + ] + if stat is not None + ] + + def to_viz(self): + graph_count = len(self.__feature_stat_objects__) + if graph_count > 0: + fig = make_subplots(cols=graph_count, column_titles=["title"] * graph_count) + index = 0 + for stat in [ + stat for stat in self.__feature_stat_objects__ if stat is not None + ]: + stat.add_to_figure(fig, index, index) + index += 1 + fig.layout.title = self.CONST_TITLE_FORMAT.format(self.feature_name) + fig.update_layout(title_font_size=20) + fig.update_layout(title_x=0.5) + fig.update_layout(showlegend=False) + plotly.offline.iplot( + fig, + filename=self.CONST_PLOT_FORMAT.format(self.feature_name), + ) diff --git a/ads/feature_store/statistics.py b/ads/feature_store/statistics.py index e4d8cffba..d23e7be43 100644 --- a/ads/feature_store/statistics.py +++ b/ads/feature_store/statistics.py @@ -1,94 +1,13 @@ -import matplotlib.figure -from matplotlib.gridspec import GridSpec -from matplotlib.figure import Figure - +from ads.feature_store.feature_stat import FeatureStatistics from ads.feature_store.response.response_builder import ResponseBuilder - -import matplotlib.pyplot as plt -import matplotlib.font_manager as fm import json -def add_plots_for_stat(fig: Figure, feature: str, stat: dict): - freq_dist = stat.get(Statistics.CONST_FREQUENCY_DISTRIBUTION) - top_k = stat.get(Statistics.CONST_TOP_K_FREQUENT) - probability = stat.get(Statistics.CONST_PROBABILITY_DISTRIBUTION) - - def subplot_generator(): - plot_count = 0 - if stat.get(Statistics.CONST_FREQUENCY_DISTRIBUTION) is not None: - plot_count += 1 - # if stat.get(Statistics.CONST_TOP_K_FREQUENT) is not None: - # plot_count += 1 - if stat.get(Statistics.CONST_PROBABILITY_DISTRIBUTION) is not None: - plot_count += 1 - - for i in range(0, plot_count): - yield fig.add_subplot(1, plot_count, i + 1) - - subplots = subplot_generator() - if freq_dist is not None: - axs = next(subplots) - fig.suptitle(feature, fontproperties=fm.FontProperties(weight="bold")) - axs.hist( - x=freq_dist.get("bins"), - weights=freq_dist.get("frequency"), - cumulative=False, - color="teal", - mouseover=True, - animated=True, - ) - - axs.set_xlabel( - "Bins", fontdict={"fontproperties": fm.FontProperties(size="xx-small")} - ) - axs.set_ylabel( - "Frequency", fontdict={"fontproperties": fm.FontProperties(size="xx-small")} - ) - axs.set_title( - "Frequency Distribution", - fontdict={"fontproperties": fm.FontProperties(size="small")}, - ) - axs.set_xticks(freq_dist.get("bins")) - if probability is not None: - axs = next(subplots) - fig.suptitle(feature, fontproperties=fm.FontProperties(weight="bold")) - axs.bar( - probability.get("bins"), - probability.get("density"), - color="teal", - mouseover=True, - animated=True, - ) - axs.set_xlabel( - "Bins", fontdict={"fontproperties": fm.FontProperties(size="xx-small")} - ) - axs.set_ylabel( - "Density", fontdict={"fontproperties": fm.FontProperties(size="xx-small")} - ) - axs.set_title( - "Probability Distribution", - fontdict={"fontproperties": fm.FontProperties(size="small")}, - ) - axs.set_xticks(probability.get("bins")) - - -def subfigure_generator(count: int, fig: Figure): - rows = count - subfigs = fig.subfigures(rows, 1) - for i in range(0, rows): - yield subfigs[i] - - class Statistics(ResponseBuilder): """ Represents statistical information. """ - CONST_FREQUENCY_DISTRIBUTION = "FrequencyDistribution" - CONST_PROBABILITY_DISTRIBUTION = "ProbabilityDistribution" - CONST_TOP_K_FREQUENT = "TopKFrequentElements" - @property def kind(self) -> str: """ @@ -104,22 +23,8 @@ def kind(self) -> str: def to_viz(self): if self.content is not None: stats: dict = json.loads(self.content) - fig: Figure = plt.figure(figsize=(20, 20), dpi=150) - plt.subplots_adjust(hspace=3) - - stats = { - feature: stat + [ + FeatureStatistics.from_json(feature, stat).to_viz() for feature, stat in stats.items() - if Statistics.__graph_exists__(stat) - } - subfigures = subfigure_generator(len(stats), fig) - for feature, stat in stats.items(): - sub_figure = next(subfigures) - add_plots_for_stat(sub_figure, feature, stat) - - @staticmethod - def __graph_exists__(stat: dict): - return ( - stat.get(Statistics.CONST_FREQUENCY_DISTRIBUTION) != None - or stat.get(Statistics.CONST_PROBABILITY_DISTRIBUTION) != None - ) + if FeatureStatistics.from_json(feature, stat) is not None + ] diff --git a/setup.py b/setup.py index 51bb24561..379f97f01 100644 --- a/setup.py +++ b/setup.py @@ -76,7 +76,8 @@ "pyspark>=3.0.0", "delta-spark", "great-expectations==0.15.39", - "pyarrow" + "pyarrow", + "plotly" ], "mlm_insights": ["mlm_insights==0.1.0.dev1"], } From 671c6be0d4b9ab2b11b78d710af1f1b54056cc49 Mon Sep 17 00:00:00 2001 From: hvrai Date: Tue, 19 Sep 2023 10:06:43 +0530 Subject: [PATCH 03/12] Addressing review comments --- ads/feature_store/dataset.py | 18 +++++++++++------- ads/feature_store/feature_stat.py | 21 ++++++++++++++------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/ads/feature_store/dataset.py b/ads/feature_store/dataset.py index d69111e78..396199dab 100644 --- a/ads/feature_store/dataset.py +++ b/ads/feature_store/dataset.py @@ -164,7 +164,7 @@ def __init__(self, spec: Dict = None, **kwargs) -> None: self.oci_dataset = self._to_oci_dataset(**kwargs) self.lineage = OCILineage(**kwargs) - def _to_oci_dataset(self, **kwargs): + def _to_oci_dataset(self, **kwargs) -> OCIDataset: """Creates an `OCIDataset` instance from the `Dataset`. kwargs @@ -235,8 +235,8 @@ def name(self) -> str: return self.get_spec(self.CONST_NAME) @name.setter - def name(self, name: str) -> "Dataset": - return self.with_name(name) + def name(self, name: str): + self.with_name(name) def with_name(self, name: str) -> "Dataset": """Sets the name. @@ -865,8 +865,6 @@ def _update_from_oci_dataset_model(self, oci_dataset: OCIDataset) -> "Dataset": features_list.append(output_feature) value = {self.CONST_ITEMS: features_list} - elif infra_attr == self.CONST_FEATURE_GROUP: - value = getattr(self.oci_dataset, dsc_attr) else: value = dataset_details[infra_attr] self.set_spec(infra_attr, value) @@ -1207,8 +1205,14 @@ def to_dict(self) -> Dict: for key, value in spec.items(): if hasattr(value, "to_dict"): value = value.to_dict() - spec[key] = value - + if key == self.CONST_FEATURE_GROUP: + spec[ + key + ] = self.oci_dataset.client.base_client.sanitize_for_serialization( + value + ) + else: + spec[key] = value return { "kind": self.kind, "type": self.type, diff --git a/ads/feature_store/feature_stat.py b/ads/feature_store/feature_stat.py index 30d677d6a..80906c300 100644 --- a/ads/feature_store/feature_stat.py +++ b/ads/feature_store/feature_stat.py @@ -1,12 +1,19 @@ -import json from abc import abstractmethod -from ads.feature_store.common.utils.utility import none_type_safe_json_loads -from plotly.graph_objs import Figure +from ads.common.decorator.runtime_dependency import OptionalDependency + from typing import List -import plotly -import plotly.graph_objects as go -from plotly.subplots import make_subplots + +try: + import plotly + from plotly.graph_objs import Figure + import plotly.graph_objects as go + from plotly.subplots import make_subplots +except ModuleNotFoundError: + raise ModuleNotFoundError( + f"The `plotly` module was not found. Please run `pip install " + f"{OptionalDependency.FEATURE_STORE}`." + ) class FeatureStat: @@ -229,7 +236,7 @@ def to_viz(self): fig.layout.title = self.CONST_TITLE_FORMAT.format(self.feature_name) fig.update_layout(title_font_size=20) fig.update_layout(title_x=0.5) - fig.update_layout(showlegend=False) + # fig.update_layout(showlegend=False) plotly.offline.iplot( fig, filename=self.CONST_PLOT_FORMAT.format(self.feature_name), From 6fb41b3bf5d56c9e3dc46755aee8527b9dd9835e Mon Sep 17 00:00:00 2001 From: hvrai Date: Tue, 19 Sep 2023 10:07:33 +0530 Subject: [PATCH 04/12] fixing minor typo --- ads/feature_store/feature_stat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ads/feature_store/feature_stat.py b/ads/feature_store/feature_stat.py index 80906c300..8039c56d0 100644 --- a/ads/feature_store/feature_stat.py +++ b/ads/feature_store/feature_stat.py @@ -236,7 +236,7 @@ def to_viz(self): fig.layout.title = self.CONST_TITLE_FORMAT.format(self.feature_name) fig.update_layout(title_font_size=20) fig.update_layout(title_x=0.5) - # fig.update_layout(showlegend=False) + fig.update_layout(showlegend=False) plotly.offline.iplot( fig, filename=self.CONST_PLOT_FORMAT.format(self.feature_name), From 5ab800513d8342fe6853f16b47421cdc460d755e Mon Sep 17 00:00:00 2001 From: hvrai Date: Tue, 19 Sep 2023 10:58:01 +0530 Subject: [PATCH 05/12] Making top k in horizontal orientation --- ads/feature_store/feature_stat.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ads/feature_store/feature_stat.py b/ads/feature_store/feature_stat.py index 8039c56d0..6be7cd7f7 100644 --- a/ads/feature_store/feature_stat.py +++ b/ads/feature_store/feature_stat.py @@ -137,7 +137,6 @@ def from_json(cls, json_dict: dict): lower_bound=json_dict.get(cls.CONST_LOWER_BOUND), upper_bound=json_dict.get(cls.CONST_UPPER_BOUND), ) - else: return None @@ -157,12 +156,14 @@ def from_json(cls, json_dict: dict): def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) if type(self.elements) == list and len(self.elements) > 0: - x_axis = [element.value for element in self.elements] - y_axis = [element.estimate for element in self.elements] - fig.add_bar(x=x_axis, y=y_axis, xaxis=x_str, yaxis=y_str, name="") + y_axis = [element.value for element in self.elements] + x_axis = [element.estimate for element in self.elements] + fig.add_bar( + x=x_axis, y=y_axis, xaxis=x_str, yaxis=y_str, name="", orientation="h" + ) fig.layout.annotations[xaxis].text = self.CONST_TOP_K_FREQUENT_TITLE - fig.layout[yaxis_str]["title"] = "Count" - fig.layout[xaxis_str]["title"] = "Element" + fig.layout[yaxis_str]["title"] = "Element" + fig.layout[xaxis_str]["title"] = "Count" class FeatureStatistics: From 7c6815880fc77e7036bb29a08c595833bed38de5 Mon Sep 17 00:00:00 2001 From: hvrai Date: Tue, 19 Sep 2023 14:22:34 +0530 Subject: [PATCH 06/12] Adding box plot. Feature filter and refactoring files --- ads/feature_store/feature_stat.py | 244 ------------------ ads/feature_store/statistics/__init__.py | 0 .../statistics/charts/__init__.py | 0 .../charts/abstract_feature_stat.py | 35 +++ .../statistics/charts/box_plot.py | 96 +++++++ .../charts/frequency_distribution.py | 50 ++++ .../charts/probability_distribution.py | 54 ++++ .../charts/top_k_frequent_elements.py | 75 ++++++ ads/feature_store/statistics/feature_stat.py | 99 +++++++ .../statistics/generic_feature_value.py | 20 ++ .../{ => statistics}/statistics.py | 12 +- 11 files changed, 439 insertions(+), 246 deletions(-) delete mode 100644 ads/feature_store/feature_stat.py create mode 100644 ads/feature_store/statistics/__init__.py create mode 100644 ads/feature_store/statistics/charts/__init__.py create mode 100644 ads/feature_store/statistics/charts/abstract_feature_stat.py create mode 100644 ads/feature_store/statistics/charts/box_plot.py create mode 100644 ads/feature_store/statistics/charts/frequency_distribution.py create mode 100644 ads/feature_store/statistics/charts/probability_distribution.py create mode 100644 ads/feature_store/statistics/charts/top_k_frequent_elements.py create mode 100644 ads/feature_store/statistics/feature_stat.py create mode 100644 ads/feature_store/statistics/generic_feature_value.py rename ads/feature_store/{ => statistics}/statistics.py (63%) diff --git a/ads/feature_store/feature_stat.py b/ads/feature_store/feature_stat.py deleted file mode 100644 index 6be7cd7f7..000000000 --- a/ads/feature_store/feature_stat.py +++ /dev/null @@ -1,244 +0,0 @@ -from abc import abstractmethod - -from ads.common.decorator.runtime_dependency import OptionalDependency - -from typing import List - -try: - import plotly - from plotly.graph_objs import Figure - import plotly.graph_objects as go - from plotly.subplots import make_subplots -except ModuleNotFoundError: - raise ModuleNotFoundError( - f"The `plotly` module was not found. Please run `pip install " - f"{OptionalDependency.FEATURE_STORE}`." - ) - - -class FeatureStat: - @abstractmethod - def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): - pass - - @classmethod - @abstractmethod - def from_json(cls, json_dict: dict): - pass - - @staticmethod - def get_x_y_str_axes(xaxis: int, yaxis: int) -> (): - return ( - ("xaxis" + str(xaxis + 1)), - ("yaxis" + str(yaxis + 1)), - ("x" + str(xaxis + 1)), - ("y" + str(yaxis + 1)), - ) - - -class FrequencyDistribution(FeatureStat): - CONST_FREQUENCY = "frequency" - CONST_BINS = "bins" - CONST_FREQUENCY_DISTRIBUTION_TITLE = "Frequency Distribution" - - def __init__(self, frequency: List, bins: List): - self.frequency = frequency - self.bins = bins - - @classmethod - def from_json(cls, json_dict: dict) -> "FrequencyDistribution": - if json_dict is not None: - return FrequencyDistribution( - frequency=json_dict.get(FrequencyDistribution.CONST_FREQUENCY), - bins=json_dict.get(FrequencyDistribution.CONST_BINS), - ) - else: - return None - - def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): - xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) - if ( - type(self.frequency) == list - and type(self.bins) == list - and 0 < len(self.frequency) == len(self.bins) > 0 - ): - fig.add_bar( - x=self.bins, y=self.frequency, xaxis=x_str, yaxis=y_str, name="" - ) - fig.layout.annotations[xaxis].text = self.CONST_FREQUENCY_DISTRIBUTION_TITLE - fig.layout[xaxis_str]["title"] = "Bins" - fig.layout[yaxis_str]["title"] = "Frequency" - - -class ProbabilityDistribution(FeatureStat): - CONST_DENSITY = "density" - CONST_BINS = "bins" - CONST_PROBABILITY_DISTRIBUTION_TITLE = "Probability Distribution" - - def __init__(self, density: List, bins: List): - self.density = density - self.bins = bins - - @classmethod - def from_json(cls, json_dict: dict): - if json_dict is not None: - return cls( - density=json_dict.get(ProbabilityDistribution.CONST_DENSITY), - bins=json_dict.get(ProbabilityDistribution.CONST_BINS), - ) - else: - return None - - def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): - xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) - if ( - type(self.density) == list - and type(self.bins) == list - and 0 < len(self.density) == len(self.bins) > 0 - ): - fig.add_bar( - x=self.bins, - y=self.density, - xaxis=x_str, - yaxis=y_str, - name="", - ) - fig.layout.annotations[xaxis].text = self.CONST_PROBABILITY_DISTRIBUTION_TITLE - fig.layout[xaxis_str]["title"] = "Bins" - fig.layout[yaxis_str]["title"] = "Density" - - return go.Bar(x=self.bins, y=self.density) - - -class TopKFrequentElements(FeatureStat): - CONST_VALUE = "value" - CONST_TOP_K_FREQUENT_TITLE = "Top K Frequent Elements" - - class TopKFrequentElement: - CONST_VALUE = "value" - CONST_ESTIMATE = "estimate" - CONST_LOWER_BOUND = "lower_bound" - CONST_UPPER_BOUND = "upper_bound" - - def __init__( - self, value: str, estimate: int, lower_bound: int, upper_bound: int - ): - self.value = value - self.estimate = estimate - self.lower_bound = lower_bound - self.upper_bound = upper_bound - - @classmethod - def from_json(cls, json_dict: dict): - if json_dict is not None: - return cls( - value=json_dict.get(cls.CONST_VALUE), - estimate=json_dict.get(cls.CONST_ESTIMATE), - lower_bound=json_dict.get(cls.CONST_LOWER_BOUND), - upper_bound=json_dict.get(cls.CONST_UPPER_BOUND), - ) - else: - return None - - def __init__(self, elements: List[TopKFrequentElement]): - self.elements = elements - - @classmethod - def from_json(cls, json_dict: dict): - if json_dict is not None and json_dict.get(cls.CONST_VALUE) is not None: - elements = json_dict.get(cls.CONST_VALUE) - return cls( - [cls.TopKFrequentElement.from_json(element) for element in elements] - ) - else: - return None - - def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): - xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) - if type(self.elements) == list and len(self.elements) > 0: - y_axis = [element.value for element in self.elements] - x_axis = [element.estimate for element in self.elements] - fig.add_bar( - x=x_axis, y=y_axis, xaxis=x_str, yaxis=y_str, name="", orientation="h" - ) - fig.layout.annotations[xaxis].text = self.CONST_TOP_K_FREQUENT_TITLE - fig.layout[yaxis_str]["title"] = "Element" - fig.layout[xaxis_str]["title"] = "Count" - - -class FeatureStatistics: - CONST_FREQUENCY_DISTRIBUTION = "FrequencyDistribution" - CONST_TITLE_FORMAT = "{}" - CONST_PLOT_FORMAT = "{}_plot" - CONST_PROBABILITY_DISTRIBUTION = "ProbabilityDistribution" - CONST_TOP_K_FREQUENT = "TopKFrequentElements" - - def __init__( - self, - feature_name: str, - top_k_frequent_elements: TopKFrequentElements, - frequency_distribution: FrequencyDistribution, - probability_distribution: ProbabilityDistribution, - ): - self.feature_name: str = feature_name - self.top_k_frequent_elements = top_k_frequent_elements - self.frequency_distribution = frequency_distribution - self.probability_distribution = probability_distribution - - @classmethod - def from_json(cls, feature_name: str, json_dict: dict) -> "FeatureStatistics": - if json_dict is not None: - return cls( - feature_name, - TopKFrequentElements.from_json(json_dict.get(cls.CONST_TOP_K_FREQUENT)), - FrequencyDistribution.from_json( - json_dict.get(cls.CONST_FREQUENCY_DISTRIBUTION) - ), - ProbabilityDistribution.from_json( - json_dict.get(cls.CONST_PROBABILITY_DISTRIBUTION) - ), - ) - else: - return None - - @property - def __stat_count__(self): - graph_count = 0 - if self.top_k_frequent_elements is not None: - graph_count += 1 - if self.probability_distribution is not None: - graph_count += 1 - if self.frequency_distribution is not None: - graph_count += 1 - return graph_count - - @property - def __feature_stat_objects__(self) -> List[FeatureStat]: - return [ - stat - for stat in [ - self.top_k_frequent_elements, - self.frequency_distribution, - self.probability_distribution, - ] - if stat is not None - ] - - def to_viz(self): - graph_count = len(self.__feature_stat_objects__) - if graph_count > 0: - fig = make_subplots(cols=graph_count, column_titles=["title"] * graph_count) - index = 0 - for stat in [ - stat for stat in self.__feature_stat_objects__ if stat is not None - ]: - stat.add_to_figure(fig, index, index) - index += 1 - fig.layout.title = self.CONST_TITLE_FORMAT.format(self.feature_name) - fig.update_layout(title_font_size=20) - fig.update_layout(title_x=0.5) - fig.update_layout(showlegend=False) - plotly.offline.iplot( - fig, - filename=self.CONST_PLOT_FORMAT.format(self.feature_name), - ) diff --git a/ads/feature_store/statistics/__init__.py b/ads/feature_store/statistics/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ads/feature_store/statistics/charts/__init__.py b/ads/feature_store/statistics/charts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ads/feature_store/statistics/charts/abstract_feature_stat.py b/ads/feature_store/statistics/charts/abstract_feature_stat.py new file mode 100644 index 000000000..cc9d18ee2 --- /dev/null +++ b/ads/feature_store/statistics/charts/abstract_feature_stat.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# -*- coding: utf-8; -*- +# Copyright (c) 2023 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ +from abc import abstractmethod + +from ads.common.decorator.runtime_dependency import OptionalDependency + +try: + from plotly.graph_objs import Figure +except ModuleNotFoundError: + raise ModuleNotFoundError( + f"The `plotly` module was not found. Please run `pip install " + f"{OptionalDependency.FEATURE_STORE}`." + ) + + +class AbsFeatureStat: + @abstractmethod + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): + pass + + @classmethod + @abstractmethod + def from_json(cls, json_dict: dict): + pass + + @staticmethod + def get_x_y_str_axes(xaxis: int, yaxis: int) -> (): + return ( + ("xaxis" + str(xaxis + 1)), + ("yaxis" + str(yaxis + 1)), + ("x" + str(xaxis + 1)), + ("y" + str(yaxis + 1)), + ) diff --git a/ads/feature_store/statistics/charts/box_plot.py b/ads/feature_store/statistics/charts/box_plot.py new file mode 100644 index 000000000..770ee22a8 --- /dev/null +++ b/ads/feature_store/statistics/charts/box_plot.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# -*- coding: utf-8; -*- +# Copyright (c) 2023 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ + +from ads.common.decorator.runtime_dependency import OptionalDependency +from ads.feature_store.statistics.charts.abstract_feature_stat import AbsFeatureStat +from ads.feature_store.statistics.generic_feature_value import GenericFeatureValue + +try: + from plotly.graph_objs import Figure +except ModuleNotFoundError: + raise ModuleNotFoundError( + f"The `plotly` module was not found. Please run `pip install " + f"{OptionalDependency.FEATURE_STORE}`." + ) + + +class BoxPlot(AbsFeatureStat): + CONST_MIN = "Min" + CONST_MAX = "Max" + CONST_QUARTILES = "Quartiles" + CONST_SD = "StandardDeviation" + CONST_MEAN = "Mean" + CONST_BOX_PLOT_TITLE = "Box Plot" + + class Quartiles: + CONST_Q1 = "q1" + CONST_Q2 = "q2" + CONST_Q3 = "q3" + + def __init__(self, q1: float, q2: float, q3: float): + self.q1 = q1 + self.q2 = q2 + self.q3 = q3 + + @classmethod + def from_json(cls, json_dict: dict) -> "BoxPlot.Quartiles": + if json_dict is not None: + return cls( + json_dict.get(cls.CONST_Q1), + json_dict.get(cls.CONST_Q2), + json_dict.get(cls.CONST_Q3), + ) + else: + return None + + def __init__( + self, + mean: float, + median: float, + sd: float, + q1: float, + q3: float, + min: float, + max: float, + ): + self.mean = mean + self.median = median + self.q1 = q1 + self.q3 = q3 + self.sd = sd + self.min = min + self.max = max + + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): + xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) + fig.add_box( + mean=[self.mean], + median=[self.median], + q1=[self.q1], + q3=[self.q3], + sd=[self.sd], + upperfence=[self.max], + lowerfence=[self.min], + xaxis=x_str, + yaxis=y_str, + ) + fig.layout.annotations[xaxis].text = self.CONST_BOX_PLOT_TITLE + fig.layout[yaxis_str]["title"] = "Values" + + @classmethod + def from_json(cls, json_dict: dict) -> "BoxPlot": + if type(json_dict) is dict and json_dict.get(cls.CONST_QUARTILES) is not None: + quartiles = cls.Quartiles.from_json(json_dict.get(cls.CONST_QUARTILES)) + return cls( + mean=GenericFeatureValue.from_json(json_dict.get(cls.CONST_MEAN)).val, + median=quartiles.q2, + sd=GenericFeatureValue.from_json(json_dict.get(cls.CONST_SD)).val, + q1=quartiles.q1, + q3=quartiles.q3, + min=GenericFeatureValue.from_json(json_dict.get(cls.CONST_MIN)).val, + max=GenericFeatureValue.from_json(json_dict.get(cls.CONST_MAX)).val, + ) + else: + return None diff --git a/ads/feature_store/statistics/charts/frequency_distribution.py b/ads/feature_store/statistics/charts/frequency_distribution.py new file mode 100644 index 000000000..fb2995a04 --- /dev/null +++ b/ads/feature_store/statistics/charts/frequency_distribution.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# -*- coding: utf-8; -*- +# Copyright (c) 2023 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ + +from typing import List +from ads.common.decorator.runtime_dependency import OptionalDependency +from ads.feature_store.statistics.charts.abstract_feature_stat import AbsFeatureStat + +try: + from plotly.graph_objs import Figure +except ModuleNotFoundError: + raise ModuleNotFoundError( + f"The `plotly` module was not found. Please run `pip install " + f"{OptionalDependency.FEATURE_STORE}`." + ) + + +class FrequencyDistribution(AbsFeatureStat): + CONST_FREQUENCY = "frequency" + CONST_BINS = "bins" + CONST_FREQUENCY_DISTRIBUTION_TITLE = "Frequency Distribution" + + def __init__(self, frequency: List, bins: List): + self.frequency = frequency + self.bins = bins + + @classmethod + def from_json(cls, json_dict: dict) -> "FrequencyDistribution": + if json_dict is not None: + return FrequencyDistribution( + frequency=json_dict.get(cls.CONST_FREQUENCY), + bins=json_dict.get(cls.CONST_BINS), + ) + else: + return None + + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): + xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) + if ( + type(self.frequency) == list + and type(self.bins) == list + and 0 < len(self.frequency) == len(self.bins) > 0 + ): + fig.add_bar( + x=self.bins, y=self.frequency, xaxis=x_str, yaxis=y_str, name="" + ) + fig.layout.annotations[xaxis].text = self.CONST_FREQUENCY_DISTRIBUTION_TITLE + fig.layout[xaxis_str]["title"] = "Bins" + fig.layout[yaxis_str]["title"] = "Frequency" diff --git a/ads/feature_store/statistics/charts/probability_distribution.py b/ads/feature_store/statistics/charts/probability_distribution.py new file mode 100644 index 000000000..b403038a3 --- /dev/null +++ b/ads/feature_store/statistics/charts/probability_distribution.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# -*- coding: utf-8; -*- +# Copyright (c) 2023 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ +from typing import List + +from ads.common.decorator.runtime_dependency import OptionalDependency +from ads.feature_store.statistics.charts.abstract_feature_stat import AbsFeatureStat + +try: + from plotly.graph_objs import Figure +except ModuleNotFoundError: + raise ModuleNotFoundError( + f"The `plotly` module was not found. Please run `pip install " + f"{OptionalDependency.FEATURE_STORE}`." + ) + + +class ProbabilityDistribution(AbsFeatureStat): + CONST_DENSITY = "density" + CONST_BINS = "bins" + CONST_PROBABILITY_DISTRIBUTION_TITLE = "Probability Distribution" + + def __init__(self, density: List, bins: List): + self.density = density + self.bins = bins + + @classmethod + def from_json(cls, json_dict: dict): + if json_dict is not None: + return cls( + density=json_dict.get(ProbabilityDistribution.CONST_DENSITY), + bins=json_dict.get(ProbabilityDistribution.CONST_BINS), + ) + else: + return None + + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): + xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) + if ( + type(self.density) == list + and type(self.bins) == list + and 0 < len(self.density) == len(self.bins) > 0 + ): + fig.add_bar( + x=self.bins, + y=self.density, + xaxis=x_str, + yaxis=y_str, + name="", + ) + fig.layout.annotations[xaxis].text = self.CONST_PROBABILITY_DISTRIBUTION_TITLE + fig.layout[xaxis_str]["title"] = "Bins" + fig.layout[yaxis_str]["title"] = "Density" diff --git a/ads/feature_store/statistics/charts/top_k_frequent_elements.py b/ads/feature_store/statistics/charts/top_k_frequent_elements.py new file mode 100644 index 000000000..c71b23717 --- /dev/null +++ b/ads/feature_store/statistics/charts/top_k_frequent_elements.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +# -*- coding: utf-8; -*- +# Copyright (c) 2023 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ +from typing import List + +from ads.common.decorator.runtime_dependency import OptionalDependency + +from ads.feature_store.statistics.charts.abstract_feature_stat import AbsFeatureStat + +try: + from plotly.graph_objs import Figure +except ModuleNotFoundError: + raise ModuleNotFoundError( + f"The `plotly` module was not found. Please run `pip install " + f"{OptionalDependency.FEATURE_STORE}`." + ) + + +class TopKFrequentElements(AbsFeatureStat): + CONST_VALUE = "value" + CONST_TOP_K_FREQUENT_TITLE = "Top K Frequent Elements" + + class TopKFrequentElement: + CONST_VALUE = "value" + CONST_ESTIMATE = "estimate" + CONST_LOWER_BOUND = "lower_bound" + CONST_UPPER_BOUND = "upper_bound" + + def __init__( + self, value: str, estimate: int, lower_bound: int, upper_bound: int + ): + self.value = value + self.estimate = estimate + self.lower_bound = lower_bound + self.upper_bound = upper_bound + + @classmethod + def from_json( + cls, json_dict: dict + ) -> "TopKFrequentElements.TopKFrequentElement": + if json_dict is not None: + return cls( + value=json_dict.get(cls.CONST_VALUE), + estimate=json_dict.get(cls.CONST_ESTIMATE), + lower_bound=json_dict.get(cls.CONST_LOWER_BOUND), + upper_bound=json_dict.get(cls.CONST_UPPER_BOUND), + ) + else: + return None + + def __init__(self, elements: List[TopKFrequentElement]): + self.elements = elements + + @classmethod + def from_json(cls, json_dict: dict) -> "TopKFrequentElements": + if json_dict is not None and json_dict.get(cls.CONST_VALUE) is not None: + elements = json_dict.get(cls.CONST_VALUE) + return cls( + [cls.TopKFrequentElement.from_json(element) for element in elements] + ) + else: + return None + + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): + xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) + if type(self.elements) == list and len(self.elements) > 0: + y_axis = [element.value for element in self.elements] + x_axis = [element.estimate for element in self.elements] + fig.add_bar( + x=x_axis, y=y_axis, xaxis=x_str, yaxis=y_str, name="", orientation="h" + ) + fig.layout.annotations[xaxis].text = self.CONST_TOP_K_FREQUENT_TITLE + fig.layout[yaxis_str]["title"] = "Element" + fig.layout[xaxis_str]["title"] = "Count" diff --git a/ads/feature_store/statistics/feature_stat.py b/ads/feature_store/statistics/feature_stat.py new file mode 100644 index 000000000..2f272a600 --- /dev/null +++ b/ads/feature_store/statistics/feature_stat.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# -*- coding: utf-8; -*- +# Copyright (c) 2023 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ + +from ads.common.decorator.runtime_dependency import OptionalDependency +from typing import List +from ads.feature_store.statistics.charts.abstract_feature_stat import AbsFeatureStat +from ads.feature_store.statistics.charts.box_plot import BoxPlot +from ads.feature_store.statistics.charts.frequency_distribution import ( + FrequencyDistribution, +) +from ads.feature_store.statistics.charts.probability_distribution import ( + ProbabilityDistribution, +) +from ads.feature_store.statistics.charts.top_k_frequent_elements import ( + TopKFrequentElements, +) + +try: + import plotly + from plotly.graph_objs import Figure + import plotly.graph_objects as go + from plotly.subplots import make_subplots +except ModuleNotFoundError: + raise ModuleNotFoundError( + f"The `plotly` module was not found. Please run `pip install " + f"{OptionalDependency.FEATURE_STORE}`." + ) + + +class FeatureStatistics: + CONST_FREQUENCY_DISTRIBUTION = "FrequencyDistribution" + CONST_TITLE_FORMAT = "{}" + CONST_PLOT_FORMAT = "{}_plot" + CONST_PROBABILITY_DISTRIBUTION = "ProbabilityDistribution" + CONST_TOP_K_FREQUENT = "TopKFrequentElements" + + def __init__( + self, + feature_name: str, + top_k_frequent_elements: TopKFrequentElements, + frequency_distribution: FrequencyDistribution, + probability_distribution: ProbabilityDistribution, + box_plot: BoxPlot, + ): + self.feature_name: str = feature_name + self.top_k_frequent_elements = top_k_frequent_elements + self.frequency_distribution = frequency_distribution + self.probability_distribution = probability_distribution + self.box_plot = box_plot + + @classmethod + def from_json(cls, feature_name: str, json_dict: dict) -> "FeatureStatistics": + if json_dict is not None: + return cls( + feature_name, + TopKFrequentElements.from_json(json_dict.get(cls.CONST_TOP_K_FREQUENT)), + FrequencyDistribution.from_json( + json_dict.get(cls.CONST_FREQUENCY_DISTRIBUTION) + ), + ProbabilityDistribution.from_json( + json_dict.get(cls.CONST_PROBABILITY_DISTRIBUTION) + ), + BoxPlot.from_json(json_dict), + ) + else: + return None + + @property + def __feature_stat_objects__(self) -> List[AbsFeatureStat]: + return [ + stat + for stat in [ + self.top_k_frequent_elements, + self.frequency_distribution, + self.probability_distribution, + self.box_plot, + ] + if stat is not None + ] + + def to_viz(self): + graph_count = len(self.__feature_stat_objects__) + if graph_count > 0: + fig = make_subplots(cols=graph_count, column_titles=["title"] * graph_count) + for idx, stat in enumerate( + [stat for stat in self.__feature_stat_objects__ if stat is not None] + ): + stat.add_to_figure(fig, idx, idx) + + fig.layout.title = self.CONST_TITLE_FORMAT.format(self.feature_name) + fig.update_layout(title_font_size=20) + fig.update_layout(title_x=0.5) + fig.update_layout(showlegend=False) + plotly.offline.iplot( + fig, + filename=self.CONST_PLOT_FORMAT.format(self.feature_name), + ) diff --git a/ads/feature_store/statistics/generic_feature_value.py b/ads/feature_store/statistics/generic_feature_value.py new file mode 100644 index 000000000..f8fb2933c --- /dev/null +++ b/ads/feature_store/statistics/generic_feature_value.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# -*- coding: utf-8; -*- + + +# Copyright (c) 2023 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ +class GenericFeatureValue: + CONST_VALUE = "value" + + def __init__(self, val: any): + self.val = val + + @classmethod + def from_json(cls, json_dict: dict) -> "GenericFeatureValue": + if json_dict is not None: + return GenericFeatureValue( + val=json_dict.get(cls.CONST_VALUE), + ) + else: + return None diff --git a/ads/feature_store/statistics.py b/ads/feature_store/statistics/statistics.py similarity index 63% rename from ads/feature_store/statistics.py rename to ads/feature_store/statistics/statistics.py index d23e7be43..d7e325114 100644 --- a/ads/feature_store/statistics.py +++ b/ads/feature_store/statistics/statistics.py @@ -1,4 +1,11 @@ -from ads.feature_store.feature_stat import FeatureStatistics +#!/usr/bin/env python +# -*- coding: utf-8; -*- +from typing import List + +# Copyright (c) 2023 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ + +from ads.feature_store.statistics.feature_stat import FeatureStatistics from ads.feature_store.response.response_builder import ResponseBuilder import json @@ -20,11 +27,12 @@ def kind(self) -> str: """ return "statistics" - def to_viz(self): + def to_viz(self, feature_list: List[str] = None): if self.content is not None: stats: dict = json.loads(self.content) [ FeatureStatistics.from_json(feature, stat).to_viz() for feature, stat in stats.items() if FeatureStatistics.from_json(feature, stat) is not None + and (feature_list is None or feature in feature_list) ] From 366347377a0910c37fa4f5c89c5a643c36313363 Mon Sep 17 00:00:00 2001 From: hvrai Date: Tue, 19 Sep 2023 14:31:32 +0530 Subject: [PATCH 07/12] alignment fix --- ads/feature_store/statistics/statistics.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ads/feature_store/statistics/statistics.py b/ads/feature_store/statistics/statistics.py index d7e325114..12d6797ea 100644 --- a/ads/feature_store/statistics/statistics.py +++ b/ads/feature_store/statistics/statistics.py @@ -1,10 +1,9 @@ #!/usr/bin/env python # -*- coding: utf-8; -*- -from typing import List - # Copyright (c) 2023 Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ +from typing import List from ads.feature_store.statistics.feature_stat import FeatureStatistics from ads.feature_store.response.response_builder import ResponseBuilder import json From b6247c9f18dc194162f649683fba978243f87f9f Mon Sep 17 00:00:00 2001 From: hvrai Date: Wed, 20 Sep 2023 12:01:42 +0530 Subject: [PATCH 08/12] adding boxplot, fixing alignment issues and supporting per feature statistic visualisation --- ads/feature_store/dataset.py | 2 +- ads/feature_store/feature_group.py | 2 +- .../statistics/charts/box_plot.py | 40 +++++++++++++++---- ads/feature_store/statistics/feature_stat.py | 23 +++++++---- ads/feature_store/statistics/statistics.py | 3 +- 5 files changed, 50 insertions(+), 20 deletions(-) diff --git a/ads/feature_store/dataset.py b/ads/feature_store/dataset.py index 396199dab..834cbc170 100644 --- a/ads/feature_store/dataset.py +++ b/ads/feature_store/dataset.py @@ -38,7 +38,7 @@ from ads.feature_store.feature_group_expectation import Expectation from ads.feature_store.feature_option_details import FeatureOptionDetails from ads.feature_store.service.oci_dataset import OCIDataset -from ads.feature_store.statistics import Statistics +from ads.feature_store.statistics.statistics import Statistics from ads.feature_store.statistics_config import StatisticsConfig from ads.feature_store.service.oci_lineage import OCILineage from ads.feature_store.model_details import ModelDetails diff --git a/ads/feature_store/feature_group.py b/ads/feature_store/feature_group.py index 328d77d23..c11fc34a9 100644 --- a/ads/feature_store/feature_group.py +++ b/ads/feature_store/feature_group.py @@ -44,7 +44,7 @@ from ads.feature_store.service.oci_feature_group import OCIFeatureGroup from ads.feature_store.service.oci_feature_group_job import OCIFeatureGroupJob from ads.feature_store.service.oci_lineage import OCILineage -from ads.feature_store.statistics import Statistics +from ads.feature_store.statistics.statistics import Statistics from ads.feature_store.statistics_config import StatisticsConfig from ads.feature_store.validation_output import ValidationOutput diff --git a/ads/feature_store/statistics/charts/box_plot.py b/ads/feature_store/statistics/charts/box_plot.py index 770ee22a8..666d3cbe8 100644 --- a/ads/feature_store/statistics/charts/box_plot.py +++ b/ads/feature_store/statistics/charts/box_plot.py @@ -2,9 +2,13 @@ # -*- coding: utf-8; -*- # Copyright (c) 2023 Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ +from typing import List from ads.common.decorator.runtime_dependency import OptionalDependency from ads.feature_store.statistics.charts.abstract_feature_stat import AbsFeatureStat +from ads.feature_store.statistics.charts.frequency_distribution import ( + FrequencyDistribution, +) from ads.feature_store.statistics.generic_feature_value import GenericFeatureValue try: @@ -23,6 +27,8 @@ class BoxPlot(AbsFeatureStat): CONST_SD = "StandardDeviation" CONST_MEAN = "Mean" CONST_BOX_PLOT_TITLE = "Box Plot" + CONST_IQR = "IQR" + CONST_FREQUENCY_DISTRIBUTION = "FrequencyDistribution" class Quartiles: CONST_Q1 = "q1" @@ -52,16 +58,15 @@ def __init__( sd: float, q1: float, q3: float, - min: float, - max: float, + boxpoints: List[float], ): self.mean = mean self.median = median self.q1 = q1 self.q3 = q3 self.sd = sd - self.min = min - self.max = max + self.iqr = self.q3 - self.q1 + self.boxpoints = boxpoints def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) @@ -71,14 +76,30 @@ def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): q1=[self.q1], q3=[self.q3], sd=[self.sd], - upperfence=[self.max], - lowerfence=[self.min], + y=[self.boxpoints], + upperfence=[self.q3 + 1.5 * self.iqr], + lowerfence=[self.q1 - 1.5 * self.iqr], xaxis=x_str, yaxis=y_str, + name="", + jitter=0, ) fig.layout.annotations[xaxis].text = self.CONST_BOX_PLOT_TITLE fig.layout[yaxis_str]["title"] = "Values" + @staticmethod + def get_boxpoints_from_frequency_distribution( + frequency_distribution: FrequencyDistribution, + ) -> List[float]: + boxpoints = [] + if frequency_distribution is not None: + for frequency, bin in zip( + frequency_distribution.frequency, frequency_distribution.bins + ): + boxpoints.extend([bin] * frequency) + + return boxpoints + @classmethod def from_json(cls, json_dict: dict) -> "BoxPlot": if type(json_dict) is dict and json_dict.get(cls.CONST_QUARTILES) is not None: @@ -89,8 +110,11 @@ def from_json(cls, json_dict: dict) -> "BoxPlot": sd=GenericFeatureValue.from_json(json_dict.get(cls.CONST_SD)).val, q1=quartiles.q1, q3=quartiles.q3, - min=GenericFeatureValue.from_json(json_dict.get(cls.CONST_MIN)).val, - max=GenericFeatureValue.from_json(json_dict.get(cls.CONST_MAX)).val, + boxpoints=cls.get_boxpoints_from_frequency_distribution( + FrequencyDistribution.from_json( + json_dict.get(cls.CONST_FREQUENCY_DISTRIBUTION) + ) + ), ) else: return None diff --git a/ads/feature_store/statistics/feature_stat.py b/ads/feature_store/statistics/feature_stat.py index 2f272a600..f8562bcb4 100644 --- a/ads/feature_store/statistics/feature_stat.py +++ b/ads/feature_store/statistics/feature_stat.py @@ -39,10 +39,10 @@ class FeatureStatistics: def __init__( self, feature_name: str, - top_k_frequent_elements: TopKFrequentElements, - frequency_distribution: FrequencyDistribution, - probability_distribution: ProbabilityDistribution, - box_plot: BoxPlot, + top_k_frequent_elements: TopKFrequentElements = None, + frequency_distribution: FrequencyDistribution = None, + probability_distribution: ProbabilityDistribution = None, + box_plot: BoxPlot = None, ): self.feature_name: str = feature_name self.top_k_frequent_elements = top_k_frequent_elements @@ -65,7 +65,7 @@ def from_json(cls, feature_name: str, json_dict: dict) -> "FeatureStatistics": BoxPlot.from_json(json_dict), ) else: - return None + return cls(feature_name) @property def __feature_stat_objects__(self) -> List[AbsFeatureStat]: @@ -81,11 +81,18 @@ def __feature_stat_objects__(self) -> List[AbsFeatureStat]: ] def to_viz(self): + # TODO: make it generic + def next_graph_position_generator(): + yield 1 + yield 0 + yield 2 + graph_count = len(self.__feature_stat_objects__) if graph_count > 0: - fig = make_subplots(cols=graph_count, column_titles=["title"] * graph_count) - for idx, stat in enumerate( - [stat for stat in self.__feature_stat_objects__ if stat is not None] + fig = make_subplots(cols=3, column_titles=[" "] * 3) + for idx, stat in zip( + next_graph_position_generator(), + [stat for stat in self.__feature_stat_objects__ if stat is not None], ): stat.add_to_figure(fig, idx, idx) diff --git a/ads/feature_store/statistics/statistics.py b/ads/feature_store/statistics/statistics.py index 12d6797ea..fc84c5796 100644 --- a/ads/feature_store/statistics/statistics.py +++ b/ads/feature_store/statistics/statistics.py @@ -32,6 +32,5 @@ def to_viz(self, feature_list: List[str] = None): [ FeatureStatistics.from_json(feature, stat).to_viz() for feature, stat in stats.items() - if FeatureStatistics.from_json(feature, stat) is not None - and (feature_list is None or feature in feature_list) + if (feature_list is None or feature in feature_list) ] From b2952bd36e707efcd4d858ab32f5eb4a2afda372 Mon Sep 17 00:00:00 2001 From: hvrai Date: Wed, 20 Sep 2023 16:12:27 +0530 Subject: [PATCH 09/12] Adding checks for missing data --- .../charts/abstract_feature_stat.py | 26 ++++++- .../statistics/charts/box_plot.py | 76 +++++++++---------- .../charts/frequency_distribution.py | 22 ++++-- .../charts/probability_distribution.py | 22 ++++-- .../charts/top_k_frequent_elements.py | 32 ++++---- ads/feature_store/statistics/feature_stat.py | 30 ++++++-- .../statistics/generic_feature_value.py | 9 +-- ads/feature_store/statistics/statistics.py | 3 +- 8 files changed, 131 insertions(+), 89 deletions(-) diff --git a/ads/feature_store/statistics/charts/abstract_feature_stat.py b/ads/feature_store/statistics/charts/abstract_feature_stat.py index cc9d18ee2..814929b80 100644 --- a/ads/feature_store/statistics/charts/abstract_feature_stat.py +++ b/ads/feature_store/statistics/charts/abstract_feature_stat.py @@ -3,6 +3,7 @@ # Copyright (c) 2023 Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ from abc import abstractmethod +from typing import Union from ads.common.decorator.runtime_dependency import OptionalDependency @@ -16,13 +17,24 @@ class AbsFeatureStat: + class ValidationFailedException(Exception): + def __init__(self): + pass + + def __init__(self): + self.__validate__() + + @abstractmethod + def __validate__(self): + pass + @abstractmethod def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): pass @classmethod @abstractmethod - def from_json(cls, json_dict: dict): + def __from_json__(cls, json_dict: dict): pass @staticmethod @@ -33,3 +45,15 @@ def get_x_y_str_axes(xaxis: int, yaxis: int) -> (): ("x" + str(xaxis + 1)), ("y" + str(yaxis + 1)), ) + + @classmethod + def from_json( + cls, json_dict: dict, ignore_errors: bool = False + ) -> Union["AbsFeatureStat", None]: + try: + return cls.__from_json__(json_dict=json_dict) + except Exception as e: + if ignore_errors: + return None + else: + raise e diff --git a/ads/feature_store/statistics/charts/box_plot.py b/ads/feature_store/statistics/charts/box_plot.py index 666d3cbe8..9a07e69e6 100644 --- a/ads/feature_store/statistics/charts/box_plot.py +++ b/ads/feature_store/statistics/charts/box_plot.py @@ -28,7 +28,7 @@ class BoxPlot(AbsFeatureStat): CONST_MEAN = "Mean" CONST_BOX_PLOT_TITLE = "Box Plot" CONST_IQR = "IQR" - CONST_FREQUENCY_DISTRIBUTION = "FrequencyDistribution" + CONST_BOX_POINTS = "box_points" class Quartiles: CONST_Q1 = "q1" @@ -42,14 +42,11 @@ def __init__(self, q1: float, q2: float, q3: float): @classmethod def from_json(cls, json_dict: dict) -> "BoxPlot.Quartiles": - if json_dict is not None: - return cls( - json_dict.get(cls.CONST_Q1), - json_dict.get(cls.CONST_Q2), - json_dict.get(cls.CONST_Q3), - ) - else: - return None + return cls( + json_dict.get(cls.CONST_Q1), + json_dict.get(cls.CONST_Q2), + json_dict.get(cls.CONST_Q3), + ) def __init__( self, @@ -58,7 +55,7 @@ def __init__( sd: float, q1: float, q3: float, - boxpoints: List[float], + box_points: List[float], ): self.mean = mean self.median = median @@ -66,17 +63,20 @@ def __init__( self.q3 = q3 self.sd = sd self.iqr = self.q3 - self.q1 - self.boxpoints = boxpoints + self.box_points = box_points + super().__init__() def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) fig.add_box( + notched=False, + boxmean=False, mean=[self.mean], median=[self.median], q1=[self.q1], q3=[self.q3], sd=[self.sd], - y=[self.boxpoints], + y=[self.box_points], upperfence=[self.q3 + 1.5 * self.iqr], lowerfence=[self.q1 - 1.5 * self.iqr], xaxis=x_str, @@ -88,33 +88,33 @@ def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): fig.layout[yaxis_str]["title"] = "Values" @staticmethod - def get_boxpoints_from_frequency_distribution( + def get_box_points_from_frequency_distribution( frequency_distribution: FrequencyDistribution, ) -> List[float]: - boxpoints = [] - if frequency_distribution is not None: - for frequency, bin in zip( - frequency_distribution.frequency, frequency_distribution.bins - ): - boxpoints.extend([bin] * frequency) - - return boxpoints + # box_points = [] + if ( + frequency_distribution is not None + and frequency_distribution.frequency is not None + and frequency_distribution.bins is not None + ): + return [ + bin_dist + for frequency, bin_dist in zip( + frequency_distribution.frequency, frequency_distribution.bins + ) + if frequency > 0 + ] + else: + return [] @classmethod - def from_json(cls, json_dict: dict) -> "BoxPlot": - if type(json_dict) is dict and json_dict.get(cls.CONST_QUARTILES) is not None: - quartiles = cls.Quartiles.from_json(json_dict.get(cls.CONST_QUARTILES)) - return cls( - mean=GenericFeatureValue.from_json(json_dict.get(cls.CONST_MEAN)).val, - median=quartiles.q2, - sd=GenericFeatureValue.from_json(json_dict.get(cls.CONST_SD)).val, - q1=quartiles.q1, - q3=quartiles.q3, - boxpoints=cls.get_boxpoints_from_frequency_distribution( - FrequencyDistribution.from_json( - json_dict.get(cls.CONST_FREQUENCY_DISTRIBUTION) - ) - ), - ) - else: - return None + def __from_json__(cls, json_dict: dict) -> "BoxPlot": + quartiles = cls.Quartiles.from_json(json_dict.get(cls.CONST_QUARTILES)) + return cls( + mean=GenericFeatureValue.from_json(json_dict.get(cls.CONST_MEAN)).val, + median=quartiles.q2, + sd=GenericFeatureValue.from_json(json_dict.get(cls.CONST_SD)).val, + q1=quartiles.q1, + q3=quartiles.q3, + box_points=json_dict.get(cls.CONST_BOX_POINTS), + ) diff --git a/ads/feature_store/statistics/charts/frequency_distribution.py b/ads/feature_store/statistics/charts/frequency_distribution.py index fb2995a04..697c4ff72 100644 --- a/ads/feature_store/statistics/charts/frequency_distribution.py +++ b/ads/feature_store/statistics/charts/frequency_distribution.py @@ -21,19 +21,25 @@ class FrequencyDistribution(AbsFeatureStat): CONST_BINS = "bins" CONST_FREQUENCY_DISTRIBUTION_TITLE = "Frequency Distribution" + def __validate__(self): + if not ( + type(self.frequency) == list + and type(self.bins) == list + and 0 < len(self.frequency) == len(self.bins) > 0 + ): + raise self.ValidationFailedException() + def __init__(self, frequency: List, bins: List): self.frequency = frequency self.bins = bins + super().__init__() @classmethod - def from_json(cls, json_dict: dict) -> "FrequencyDistribution": - if json_dict is not None: - return FrequencyDistribution( - frequency=json_dict.get(cls.CONST_FREQUENCY), - bins=json_dict.get(cls.CONST_BINS), - ) - else: - return None + def __from_json__(cls, json_dict: dict) -> "FrequencyDistribution": + return FrequencyDistribution( + frequency=json_dict.get(cls.CONST_FREQUENCY), + bins=json_dict.get(cls.CONST_BINS), + ) def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) diff --git a/ads/feature_store/statistics/charts/probability_distribution.py b/ads/feature_store/statistics/charts/probability_distribution.py index b403038a3..d64be76fa 100644 --- a/ads/feature_store/statistics/charts/probability_distribution.py +++ b/ads/feature_store/statistics/charts/probability_distribution.py @@ -17,6 +17,14 @@ class ProbabilityDistribution(AbsFeatureStat): + def __validate__(self): + if not ( + type(self.density) == list + and type(self.bins) == list + and 0 < len(self.density) == len(self.bins) > 0 + ): + raise self.ValidationFailedException() + CONST_DENSITY = "density" CONST_BINS = "bins" CONST_PROBABILITY_DISTRIBUTION_TITLE = "Probability Distribution" @@ -24,16 +32,14 @@ class ProbabilityDistribution(AbsFeatureStat): def __init__(self, density: List, bins: List): self.density = density self.bins = bins + super().__init__() @classmethod - def from_json(cls, json_dict: dict): - if json_dict is not None: - return cls( - density=json_dict.get(ProbabilityDistribution.CONST_DENSITY), - bins=json_dict.get(ProbabilityDistribution.CONST_BINS), - ) - else: - return None + def __from_json__(cls, json_dict: dict) -> "ProbabilityDistribution": + return cls( + density=json_dict.get(ProbabilityDistribution.CONST_DENSITY), + bins=json_dict.get(ProbabilityDistribution.CONST_BINS), + ) def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) diff --git a/ads/feature_store/statistics/charts/top_k_frequent_elements.py b/ads/feature_store/statistics/charts/top_k_frequent_elements.py index c71b23717..d68840890 100644 --- a/ads/feature_store/statistics/charts/top_k_frequent_elements.py +++ b/ads/feature_store/statistics/charts/top_k_frequent_elements.py @@ -3,7 +3,6 @@ # Copyright (c) 2023 Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ from typing import List - from ads.common.decorator.runtime_dependency import OptionalDependency from ads.feature_store.statistics.charts.abstract_feature_stat import AbsFeatureStat @@ -18,6 +17,10 @@ class TopKFrequentElements(AbsFeatureStat): + def __validate__(self): + if not (type(self.elements) == list and len(self.elements) > 0): + raise self.ValidationFailedException + CONST_VALUE = "value" CONST_TOP_K_FREQUENT_TITLE = "Top K Frequent Elements" @@ -39,28 +42,21 @@ def __init__( def from_json( cls, json_dict: dict ) -> "TopKFrequentElements.TopKFrequentElement": - if json_dict is not None: - return cls( - value=json_dict.get(cls.CONST_VALUE), - estimate=json_dict.get(cls.CONST_ESTIMATE), - lower_bound=json_dict.get(cls.CONST_LOWER_BOUND), - upper_bound=json_dict.get(cls.CONST_UPPER_BOUND), - ) - else: - return None + return cls( + value=json_dict.get(cls.CONST_VALUE), + estimate=json_dict.get(cls.CONST_ESTIMATE), + lower_bound=json_dict.get(cls.CONST_LOWER_BOUND), + upper_bound=json_dict.get(cls.CONST_UPPER_BOUND), + ) def __init__(self, elements: List[TopKFrequentElement]): self.elements = elements + super().__init__() @classmethod - def from_json(cls, json_dict: dict) -> "TopKFrequentElements": - if json_dict is not None and json_dict.get(cls.CONST_VALUE) is not None: - elements = json_dict.get(cls.CONST_VALUE) - return cls( - [cls.TopKFrequentElement.from_json(element) for element in elements] - ) - else: - return None + def __from_json__(cls, json_dict: dict) -> "TopKFrequentElements": + elements = json_dict.get(cls.CONST_VALUE) + return cls([cls.TopKFrequentElement.from_json(element) for element in elements]) def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) diff --git a/ads/feature_store/statistics/feature_stat.py b/ads/feature_store/statistics/feature_stat.py index f8562bcb4..27a7e9647 100644 --- a/ads/feature_store/statistics/feature_stat.py +++ b/ads/feature_store/statistics/feature_stat.py @@ -53,16 +53,27 @@ def __init__( @classmethod def from_json(cls, feature_name: str, json_dict: dict) -> "FeatureStatistics": if json_dict is not None: + frequency_distribution = FrequencyDistribution.from_json( + json_dict.get(cls.CONST_FREQUENCY_DISTRIBUTION), ignore_errors=True + ) + + # inject box points for boxplot creation + json_dict[ + BoxPlot.CONST_BOX_POINTS + ] = BoxPlot.get_box_points_from_frequency_distribution( + frequency_distribution + ) return cls( feature_name, - TopKFrequentElements.from_json(json_dict.get(cls.CONST_TOP_K_FREQUENT)), - FrequencyDistribution.from_json( - json_dict.get(cls.CONST_FREQUENCY_DISTRIBUTION) + TopKFrequentElements.from_json( + json_dict.get(cls.CONST_TOP_K_FREQUENT), ignore_errors=True ), + frequency_distribution, ProbabilityDistribution.from_json( - json_dict.get(cls.CONST_PROBABILITY_DISTRIBUTION) + json_dict.get(cls.CONST_PROBABILITY_DISTRIBUTION), + ignore_errors=True, ), - BoxPlot.from_json(json_dict), + BoxPlot.from_json(json_dict, ignore_errors=True), ) else: return cls(feature_name) @@ -72,10 +83,10 @@ def __feature_stat_objects__(self) -> List[AbsFeatureStat]: return [ stat for stat in [ + self.box_plot, self.top_k_frequent_elements, self.frequency_distribution, self.probability_distribution, - self.box_plot, ] if stat is not None ] @@ -87,8 +98,7 @@ def next_graph_position_generator(): yield 0 yield 2 - graph_count = len(self.__feature_stat_objects__) - if graph_count > 0: + if len(self.__feature_stat_objects__) > 0: fig = make_subplots(cols=3, column_titles=[" "] * 3) for idx, stat in zip( next_graph_position_generator(), @@ -104,3 +114,7 @@ def next_graph_position_generator(): fig, filename=self.CONST_PLOT_FORMAT.format(self.feature_name), ) + else: + print( + f"No statistical information for feature {self.feature_name} can be visualised" + ) diff --git a/ads/feature_store/statistics/generic_feature_value.py b/ads/feature_store/statistics/generic_feature_value.py index f8fb2933c..6b52e3001 100644 --- a/ads/feature_store/statistics/generic_feature_value.py +++ b/ads/feature_store/statistics/generic_feature_value.py @@ -12,9 +12,6 @@ def __init__(self, val: any): @classmethod def from_json(cls, json_dict: dict) -> "GenericFeatureValue": - if json_dict is not None: - return GenericFeatureValue( - val=json_dict.get(cls.CONST_VALUE), - ) - else: - return None + return GenericFeatureValue( + val=json_dict.get(cls.CONST_VALUE), + ) diff --git a/ads/feature_store/statistics/statistics.py b/ads/feature_store/statistics/statistics.py index fc84c5796..8fee043f3 100644 --- a/ads/feature_store/statistics/statistics.py +++ b/ads/feature_store/statistics/statistics.py @@ -28,9 +28,8 @@ def kind(self) -> str: def to_viz(self, feature_list: List[str] = None): if self.content is not None: - stats: dict = json.loads(self.content) [ FeatureStatistics.from_json(feature, stat).to_viz() - for feature, stat in stats.items() + for feature, stat in json.loads(self.content).items() if (feature_list is None or feature in feature_list) ] From 96e8ed429ee651a8c8fda66e9e79d0f5e2d14f27 Mon Sep 17 00:00:00 2001 From: hvrai Date: Wed, 20 Sep 2023 17:24:36 +0530 Subject: [PATCH 10/12] Addressing review comments --- THIRD_PARTY_LICENSES.txt | 6 ++++++ ads/feature_store/statistics/charts/box_plot.py | 10 ++++++++++ ads/feature_store/statistics/statistics.py | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/THIRD_PARTY_LICENSES.txt b/THIRD_PARTY_LICENSES.txt index 404fedace..d81f2bdd5 100644 --- a/THIRD_PARTY_LICENSES.txt +++ b/THIRD_PARTY_LICENSES.txt @@ -229,6 +229,12 @@ pandavro * Source code: https://github.com/ynqa/pandavro * Project home: https://github.com/ynqa/pandavro +plotly +* Copyright (c) 2016-2018 Plotly, Inc +* License: MIT License +* Source code: https://github.com/plotly/plotly.py +* Project home: https://plotly.com/ + protobuf * Copyright 2008 Google Inc. All rights reserved. * License: Google Protobuf License diff --git a/ads/feature_store/statistics/charts/box_plot.py b/ads/feature_store/statistics/charts/box_plot.py index 9a07e69e6..0923a8412 100644 --- a/ads/feature_store/statistics/charts/box_plot.py +++ b/ads/feature_store/statistics/charts/box_plot.py @@ -66,6 +66,16 @@ def __init__( self.box_points = box_points super().__init__() + def __validate__(self): + if ( + self.q1 is None + or self.q3 is None + or self.iqr is None + or type(self.box_points) is not list + or len(self.box_points) == 0 + ): + return self.ValidationFailedException() + def add_to_figure(self, fig: Figure, xaxis: int, yaxis: int): xaxis_str, yaxis_str, x_str, y_str = self.get_x_y_str_axes(xaxis, yaxis) fig.add_box( diff --git a/ads/feature_store/statistics/statistics.py b/ads/feature_store/statistics/statistics.py index 8fee043f3..f8b09ff0c 100644 --- a/ads/feature_store/statistics/statistics.py +++ b/ads/feature_store/statistics/statistics.py @@ -27,6 +27,12 @@ def kind(self) -> str: return "statistics" def to_viz(self, feature_list: List[str] = None): + """Visualises statistics inside notebook + Parameters + ---------- + feature_list: (str, optional). Defaults to `None`. + The specific features of the FeatureGroup or Dataset we want to visualise + """ if self.content is not None: [ FeatureStatistics.from_json(feature, stat).to_viz() From 61a1d5146f4d3f0ee14f1758d235c97cbc20a35a Mon Sep 17 00:00:00 2001 From: hvrai Date: Thu, 21 Sep 2023 18:58:57 +0530 Subject: [PATCH 11/12] adding docs --- ads/feature_store/docs/source/dataset.rst | 8 ++++++++ ads/feature_store/docs/source/feature_group.rst | 7 +++++++ .../source/figures/dataset_statistics_viz.png | Bin 0 -> 45707 bytes .../figures/feature_group_statistics_viz.png | Bin 0 -> 31011 bytes 4 files changed, 15 insertions(+) create mode 100644 ads/feature_store/docs/source/figures/dataset_statistics_viz.png create mode 100644 ads/feature_store/docs/source/figures/feature_group_statistics_viz.png diff --git a/ads/feature_store/docs/source/dataset.rst b/ads/feature_store/docs/source/dataset.rst index 42f65f4fa..0fe9700af 100644 --- a/ads/feature_store/docs/source/dataset.rst +++ b/ads/feature_store/docs/source/dataset.rst @@ -220,6 +220,14 @@ The ``get_statistics()`` method takes the following optional parameter: .. image:: figures/dataset_statistics.png +.. code-block:: python3 + + # Fetch and visualize stats for a dataset job + df = dataset.get_statistics(job_id).to_viz() + +.. image:: figures/dataset_statistics_viz.png + + .. seealso:: :ref:`Statistics` diff --git a/ads/feature_store/docs/source/feature_group.rst b/ads/feature_store/docs/source/feature_group.rst index c1d05fe99..860280336 100644 --- a/ads/feature_store/docs/source/feature_group.rst +++ b/ads/feature_store/docs/source/feature_group.rst @@ -254,6 +254,13 @@ The ``get_statistics()`` method takes the following optional parameter: .. image:: figures/stats_1.png +.. code-block:: python3 + + # Fetch and visualize stats for a dataset job + df = feature_group.get_statistics(job_id).to_viz() + +.. image:: figures/feature_group_statistics_viz.png + .. seealso:: :ref:`Statistics` diff --git a/ads/feature_store/docs/source/figures/dataset_statistics_viz.png b/ads/feature_store/docs/source/figures/dataset_statistics_viz.png new file mode 100644 index 0000000000000000000000000000000000000000..2e151fd1d715d1f31a913fe4c9646348100d630b GIT binary patch literal 45707 zcmeFZbySq!_b>_~ih_hRNJ+PJhxE`LQqmyZJ*X(%DcvC5T_Ppj3_a2f(mBI@P(PpV z_qXm{?|ScD_s@6MFwe|$_Bm&tvwQF75Ui{y{p=~xQv?KrXCN5~RRn~`^auzK8c`kr zcTlsRlL429&SD^S6yW89Vj2YeCUlY1c2To8cX2mzGDEPiv$r*4b~bS`GqZEHw0Ai~ zY8M88nD2qaoy?3}tnBT`)vavJ5Y#PQ$=TV+)yy2o*FJjr&ehwK(O%-kP=WrwceGo*&b}J9gTr^G zOQs>pqa^wDmR4*oaarmgZsw%=g_TLUMZHRMqwz@f9y+WWTnAq6P zFO%c{?coyh^pQVT*{)mpf8gK6|8JvGG(}}*ZcYR2jC4u8%eJa8{Bji=uUC$>)#dvf zoZMM}aM#Ue-z^>NZ5zG|j&2Q1x|>zscIUaJ_xJPDtoA4h@mYQp7_-b ztDg6*LOQ#MGgpUb!rO^m$8y&d8wogc^c1`GCYSFvp#5d~3t5aePf-UB&c^ukwcU)A z5?l|5wC*k~;zus~*0m~^-6N4Itozuf(d4o`+)3p|nj1=n1Ee!dcjfMS&;4#=!)6q5 zkn7`xd!O-Cn`=L97BT2pLD$z=I&l&{m`Y?GQAE!4*i>Yn%h1J}_+T;j>j!T_x;xu| zw_Z;H1gd?WijWab09qjJ?9;&py|E&M}BmSBZjrfxLW$X zy{+Xx2k1wTqG0EO38~(~1KtM1A#GZ*Cre@o=j)r*CEoT4F2WhqA`L^;8r^&A<{Sz2Z1 z4)d<6iH>>BEqF{oMti>O}OK{li>m4V%+M+N#TXT-$#vbsDm_eLZbvgQSV;4bX7CD=3;733;*^oRO}( z>QQtIzd3Y1pS8dyB{k4I?<9jqwcoC@;=&(AQunN`H(e&&Dv9k9LHw@P6B`ejcF`H_ zr;2b#gf8^L=PZSPO1tQAX0U{AOn`SXic05!Pu`Q@N(ngXuAla5r z3QF=NW3BCFBVfJ|?u*F$)sl8BA77fQ3^@M#uLE8az!){YE@-<4gvg>Wsqp)m3vN$o zYuel&I^JD!Ab2urR=HkVyZG#~x+tcIdlc{@B)hbKErE`J&m`xF0?I#@F82AoZ-flj=Gw+>0`JoFl9QJkRF3=Ns{|rOu zjpp4bl=3(m^?u&8C2;7Y=xDQcL+xEnjh@9CD>Va;Wn?058||zXjbcq4T->9p%?wBb z#y>g;YV#~RJDULqfaI@CQ)6lT<+?Xp9T-h1T?K}D@w*@BX~GYh58188sdgacN&p9W ztVK(sU|?9R{fPEC?xUS7H_Y%n*aSw?-7v**iBJF@tBQwCJTMernIPNX|YL2hAxj* zi^EzoEy;M4u7UWOp+KY3@xLooD#r*cxXQLE_-RPXCZUgUE=TWF7 z9#;QAeK(TBz8YD@a(% z8wtKcWaK_rJ6pzg=(tFJP+@C9;h%AZ!RIMCS*#T~iS;CPoT{dO#?Z%4h?VKb%PJKl zxbVv?rt_AM#s|r5sgcwBbwTj#dxBHx7Zh@2Cl8)sGC1QnlQ`_dzt591%nv5E-noM(l9@)MujV#v`k9!lJ8}c57|z zL87K>Si4eg?NJM-7=_RZ3YAu`sCF-f?x&KH2$R;BU&mTgsPrVx1r8H@(K#bB4Kfia zR8*A9H%62VT19;yU|~(7KBLB5LV4dhJB#Dn7*B&A2Pcs-oC{5r+~yQqeLLQC$Ai2PTgvL9)7E(NFw;Pr2O5n_X~x)gT*%gm{v*7_H&{te0V6{zDcCVP*!Ck zeh^B5BZOt|N-*^Ht}M$6Dy&>is&I2*2BTa>x859u<}gU#Tr5>vD8Yd>Pg~Zu{*{OA zl=5SFMcnB!{Q-PKpAPCoJ=IlfIQ*i0qQ%oW-D`)QMj=_^6~V(ylirAyqaNai4-nIR z&voF}kanleXFR`VOd^lIqq1TW5%u5Qj@-r7I`7v)Vq#*%K%ggghj%cM=@K3BoAZ57 zK=)lum4myH@%6r)@6RL7RGFccx1JMC6e!VRqC};p4w@zEOI;i+ZZEY8_}-kG0pcMY z=IeF+D47R+{Z5r--Mz3_=hk!kY1?CXRY(R+&Bjhy!O1zT?$shxi{r{d4lJsDxOvt-$2#Wg6#2%igM7l5D z86`T)K~iBe%MQMohdO<2Xy8p?(f8`2GSgraKHngUX-Xe1Z5=T_C1(6`y|lS7TYuc8 zFt7G~w%MM{(DZQmbSt2x)ex{-FiFf zmoGn#j*h-t75=#gF?f^-bB<+n707FuV^*nO`@;e%`X^&kKgr4@2#MbMa@RZQQnh= zuLgNfc3V4aIW4D4N)-J!hUn&qN}_TXt}-Gm$6?tF*l`HRyFAYqH^&*;%Lm6!?GJ83 zEuEIHI2*ToxD~!ggl6$fZIP~=%jotP_Vs79si83J1=oB8QX}f5v zp4>CN2CP+!nuR5z(Rp+FYuUd%fA}>fZftB!+Sfl)1pZ~I)f;IvM;b%3^bPX2gT-dg zt*pSAT5J6Idiw&ca)YV5YOk|*_XMl5hYAbd-8$FV%!&a#y**io?RVKp)^OagURV+xLrk~KXU7Z*bxLOs+ zs4Rb&%u}Wlv!lG3MmY4P9o&D0U-z84L}2jV|8>-~d~jz+M=ym$R_Hd~+j6@)THp3@oGs7<( zXsp;n>jWZ<D!PX070|majuk()x#zYbd0$q$C>8*O#TVlsgi-coY07HN1+Z0}Z0D5~~&XTVq zL3dNMU0vj24^3^PWZkIw8h{3-@xSw_Tm53pN}t8Vrn!_6X!v6^-Bzc;i`YM-upxv4 z6Gh$Y-1PP94kL?6lH&1(qVm|uGnXa3rq8nj?YVwj^GBo=&2L#d4Gns#dG6jn`rscP z7!aVUt$pb#4xba#tT zbk=S|8Z|dC?D#tDps-xft>>OWQ_I{i%EUW}5xDxZ~`KiJabT_s?$0Ve|3Wq8C6N88bwF$<*$DN*hc5_>34~i<36~I*Vdz zS|rowPSavD8)N2l#^XNDYSR~(ZS}CKJu41@i8?h*2;8lmW+b+aVyTv4gt+eqRE$<> zL2`0q7*M5)uzRJw09a=i-r3@#1Xn zn%+$@93LO|mpys-0B2tWzr2Mu-Q(ln;9%9rre8VzVF{i7?8$IQso8okiK3D096!Q2 z4sK#;#Y4;SuZRL}5GKc3mWGrDO@)S=5N)DBEmN_REaS-dtf;hjF@sWr$F)Os!zVy#{^m$Tt}i%s#110sc0X&Vq4tW-GBjoW^J?+qP&+4Z{r zQ%L+Sv}o;)CpPMf+7_oh9uQ>2Cb-{yO#OVv@3hJl*4p=ZvwC&kQ(0B)JheW!W$XJ> zDA~}VV@(y13fZP6_=kyj)L{C}ZbxI%WK(ok4JN(l-1bX8>O2h_$=2GQ!4|H%!%W!BlQpCV0ZzIz0)&zVUoAJu$ z^4HS~*gO>812}pr=T`v-7QZCVNt;AYNmJbRC`w*iDY_53Ix-FQXU+SbfCx@V$?ON2 zn>PUCa5Q3OIBv0U)6!UT{czgZD#Lln_k`~b?tV4q$;`*aUb5Gm)jBu68jY-XciN7) zg^l02LE=qtyeBP~m>`+5v25mQqGT;^nuGbgmt_s`;}AWpxACq;j#%-^mU{HdnKq@{ z?-1T&Kfo$f!-=!C(AC%zNxLPp^94U4+^yQa>uSF|Y3D(Fm2JpmxX-ZG zaqgPBFy6Ji&&srZ`*>-+=t-!@uO@Wd^m>bt^xI95JH8S!JXV9jZeY>cS6S`S z8f+0QJ2$tsNBAzy_QDyqLzInL^Y3m*GNFwHl~jy@CnF4tWv-oCSEqg}hVtM|j{MdO zK3K*jzIEGz!s{_%1HFcHe5j$)%FJiItF`PZZZUCjAhvt93n>>_fkkxB%^#ZnO$L=f z1yQ~wugzcGYUT8SH}&t+Iq4;5llGHA9Av&<2Iu`cXcP58fTxT_GAw*>1b9SoL1p^= z!u7sui0pxR6@ryy%Ot~DeaKVgn!~zPVe3My7TxPwSdIo-FIk%q=oZ~hzd5r2i6#BO z5;Qb{94>_>+Fw(KYQ?sGCmTblo*PMq)~HL>J&`6bB#i3pJ1$PLUz9{7bCGAe6DtX( zZK>xkZ;nrNrdxUD4Sd6a42c}b#!#Py1IP!zbQVtk(H&J(-qT} z@ikC@{zwL*;k(G;!rh9tN+2WG1EhAYpm#86Rn^%pgv03jL-5@V6k=rBYX`r*D$#3< z5jbebDPdw|jePC@C_358CziKpX|hl)I3mLQ+j~S;l8}g>#{;aJ`}G*<;&1fy2Jek| zjnxE7>4wjLaAPJw8?W1s#*anhvDk;*YNQs4v+lC$dxm;eqrXL z?`lFQd~?#A`swumsoq;^ZMHeHc}1{R)_hR3`XfRg@D2Kghs%^TfpqQp!Qw!LQK!d2 zm0Fb&blGwwDQo7(C!U}fnD5KZ@w%J2n&}89>+W+0w0#}2W>SELB;<%G^YwK zoQ(7es*|905c%`^Zw z7^MH0;y?GAJNFH!|NS||5c^-5=l>V!-v3qR`F|otL;ruKqXPYZPvcLzBHVMuscrT7 zmEpu)-cYd9!E8&G4A(xWl6hCL>Hqa(p}9MLvyL^y)KwPzD6ulMNsL^gcrt3AdMXU-D)vk z2v$ZY+K+1+EJ(E>i#*4^(;X;dry|)ZiW1HICMN1jR}jTf4Qgpy=Ay!}FowMvAQQSY@W+RT_1D&$z4K zckYW$wDDruSI-soj0H(9E+jh=06_f!;UM(j`ci% z2w{{h4CwTAu}ypt=VpZ9MmyNa49yGOJna#wxPyjrG?zAI<`3Y_$qw!t zF&{qR0PUvBuZ&U27mpp3B$Vjahw&BL=UTrICAB&%&&_m{oBM2MZVRWtf0zwwp-93q zLuEaYX}wcC(D~B4GL=G6xeziaiUzYIF(^Br2q`Yps<328gqtIFd?w6=5-YWTbM(-@ zU&D36iTrP+cb%`DHk_&;n!}QdcBtcMJ@%DXO5P)87CRu;hx184c9x2T>Z7_(%%}uB zl*Mzlrjb2`X(qv_50hdObly~06FMj2V9jzxL~u2-25NT1j8l;1 zm)h5@n=v?KMlgURaY6;|;R}Oy4~|&-#^Ap70Wp)UL?>d5Qxp*={jY0+BjnEMY2W6g z@`8VUyd`H$u)w1FWQWAcD8QqBFQDo|e^jYU_Ct=OST`9RbzYG+)Zxoy1$-PN#P?#; zZFlJ9Osp4XK60x4)bv&_#Py1gL5(jz?s8+795eNH%drFAs1RP^K=ny_)?W?jr}ZiLa|l4>U7F7ufgby08ehtg4Xb$LvgQd z2W-1_uae@79N7YGAi7<1VP?4XyWt_!>mTN2wn?2|kp3ob4##CaL9s;3Mx- zHs42VE2U;(I-Ie=PjIy&14w3yxJAnKzSpWBl(oQI#n88#F;||iTJccE*VMS9u=G(f z34iFK(^l0%2uuS#DN$Na&f)<1fgct6O0&P(5nZHA1?fzi%c-V&*3>MWyBsvE6K>c* zdwRYH$@*FRmZo*V*gtEaAC4$6B+hi8#`bG}UyG|Lwo&QSy|L;BUp>O={29j>glc-y zbBb(3cc(F5SA&Y6%kE(UTIx7{%U{kk_(*Ka!)?AZMUXKaT>5rDrEswC2}Pw=qKUxc zs)neA^5&Qtod-E~5tK1Dsu{lVHTs6tLcaw8-I4ltO?E0vcBB+dV&Y@JWM-U6hv8qPW-Qc`8;@%HVpE&0t`~%m9I-B=vm3qq*^NX*n7tsQl|3mebZ( zx4-xw<5(S&DZdbSy^qoE=s4Wds_JUn>E9yPZUU7iRWm}PW_3}6NgJ|@_g1b6B{fR z-63Wr%;MiCEH`{@W4J3v$+SFq?ZIJ6zuuT!H_fK zt|;M}V&(dvT0+8jyUrBvgG|6XdH5zK)rqjseb{(Eg_WanL_CcD!gR;)o(}wcQ}>nl zAhcYmf1U*>+$H~;NCW_U-5dT?%UvX_H-~@5Pf2QMp@f_Ls`xbSO!M0*;eVj@Kb)wu zU4Df7k^j7*%>T!Cx!;O=-zB#nH{V&hJ;l;*o8k^Ft*?Kj3H{(9@2{4`MTr}5=a$PE zYr_T)>q$?4OBDmLg`oUJZ=%M${42_|)3@u;czwf`urY|p;3Ts&u?b$`NfjM}wvazu z+`>n|4;9dz0{!8B{Aa{c1&sEa&N;klB?FhA)6{1DhkGo#G) zLQ)tZ?3FbcI7nqPVD!4l`-}by0|g|{+=BcnC*=oE*aH2$e_iL0?CsaHr1hQX#>^Bj z8&x8C_`Z~Q6j6HrfJf%aWx=bI8Vj=32oS1F>S&;B0Ec0@Z^%r;FX{jx;qd8wY4!%G zXX+wtz&1lwro!2F97v1D8#9ibd6U*R+}ov&l#hs(Jm~$~d{?YUw!R}x%!yA{a#C$K{{U#0qjkUgBQ(cF zm>VsG--GZ2Cs-Tav#qLuZk~Q8s->bgqoZ8O`5-u+kjJV{y^6Asb9RgIyFS53Jr*Y&{p7@TV&6;MPedav$y4}ZGtBhn z%%7qZ%)9o5?KdZR2jov!_scvw%$Rw@ewDbO??Zfu9$9)#NZcFcuxNW*`OB!x?||fy zh%54~nIKTrH6Cl-*I|bdf?*rxPw75xq=6cFk|I!hISx99a7wPY8ta#&WgP^0%zL6Q zXCL4h@}`P#gKJN(y=Cny9hcO>?C!Y4PMNFU<_Y}7nW7mDH^yl@uU6v_yO7@_Wzg2G z$3KP|*(yGS+%cp);n{S&h<#<$Prib}zBy|puSbxJ5M%?5eS8SYwpPa~ynyyC%#dL> z^8457`md$V1wO&hd#$(i*H9^JH$ptH9{drL`FAU6--Oe_%B^TS0k5guI@Zm_r+ERj*b;I0uP9Tlxw8< z>W9W0@BYt;e6hP^{!g$?28Q-+vMrV#aAUj}nYiiYK@Lq{9#4F8e9Qr=Dc(^*TCUkm z@0u9%)Z^ffpJWV(tugbvQG0|{Pn|XvIZOp(q@zR6TGilThc^lKknk6r20Fnwm;#M% z$|FmPM2y)REWR-{DK?h7fJ-mGZO)^laE4DZH-nnZo>P(@^u-9MSzYwr0IvU(Hv6Y= zKhH13TJA>V#g}i@xQU<6#T@^%MYC~TxZ|ZtTU$8L7-vI4oQ^V>$!H&Wp{Sa}L?a>? z`}QuH$?FVc9%&;tx61LQ8dW>3|BKFY*q39f>Ws$tvfac=ydpo{l7{4SglT4z)y6*g zq+gij7@xMx=A)4xACA0oR1?&4ho?3^uDb<-q~X9(*2+1; z8uop!F6^6G2E5HgMzprxuJ%OXiRN%py;l6AUgV!Bli5_OYTpu_iEcQzEgZ2d9Lo#F-6yB1eSWFLu z>CAq30ssOdcLnvJHr(XJ=jnPp43W7bh#@2DvmRMc7}qM4AL3QiZ2-mO+9!S|ciymg zP6$nMLwpNkk`k#8FDCPjaX0jgf%tvtUF%iVk>f;CiwU~DK~t^AuQa`uXU7hVQmtOb zMgH_cQ*+8Af01Gp$Q$Gq#f7syps29I?U0kI+6rd0)L;LSuYM3CZ*12Z>263ia_Owe zc5sFEbY_qd+oIze^!T7yiS1^?L6vqyxFK&RL8Cym>HDO9;Sy7BIDf8@uy8ZwKa)RRh0n2$J^!yLFGE9rFlXeVh0|2= zhBlsPR&hUmV;DVnxjUx`_Pz0lVem!;P%?(HX=gN6wgT({Kw)>4-nvN3}s#~c0 zv}#$?c;8fo;BKBW5f5}x(Tv&-^pBrV=$E4cecgV?SvD)(8yz%!D*qU2}e(UD?ZU>*$s1vv2y8w zWc?RGFKN7Z8k-r0k0iKIEjq_tHcE!`?_-~K5{dTyIs;~iNMK=&NW?~;EJ-7DbsHZE zQ_QBA?&ExQB%CIu?Fdi-s#6baL7sbdj}k=gXgNQ=nnqZb;9fGUV+>qKMU%pScXxPw z{_HXzFMUu3JdF}amRj@fx#OBMPO(+w1|}YnY^T$d+&s&iU%CIymjEsX1=9fiFQVVq z)HiIJK7RU4I7*pR#w9f1=*_K*wA{tXqJtY*qO}?3g@5X&xtg~z>YMl zkDy(=??qAAN>>Oj=d-A|koswkBLsgFE3=8M#|_2$#p_8pU(~`*52vW9`eespvIM4% zwgkFlNg9v8qkXB-u7T{xM<$kwk6x>miqGQgStCClvo=5^LQl5l;Ul*uD%>!|5pvk1 zhe4UCUE%TOh|#JRR+og&k8SNQdkQ>P!QlWYfyfw_-bjKOrq+um6_#;6Fu~t;OrgylRz{FZaDR)kNTc@ z#jGDb?%6nn%0VZeq9VNTSuM`2*b3TLSs%urkl;qA;IZJT@MFFEY5p<%&3Ka|ep!TH zQr`*t4;be2ViBgokMSqtvol9en?9==S%?0p_GaJtkRHY`Y~CjqOTf*S_Q{dUK5?bR zshGn(HU%R(obu=B{>brD`pl-%p_l01c2(}N^SsGw^gI`|pcoekimtAUti!_g4S!t8 z)6fudcURIzW&TF>FVc2KU2y!V5N&qK_-Db1jy)|&Esj$ZtaT)qKoTzWaZIL0Ay^Q2 zz}MvqQ8=5dq^3ZA*7p|NtL8pi9EHhzcLLa+c^SOZ7tId)fv)*ctZu)8?E0bbmj=c` z%KD0hfm<#-g?0lA_M_IwFB8VN1qLxLGtdS$G2@e-%{T?Vj)Y*Fpw5Psh`|i$fMCB)L@n3%aiZ0d3GDa zo-S#Nm^#!q858M0a0v%z(Qzy|Hup7dF6IJ%e6@VaZOf>TyKcd@+4&P|zW5EwB8%ln zfG4VU62=;n$pS0wE3Rr36d*2s{L#K`koZbprU=BsCL(ifNON@3{^^y6%!BpKg{Q*l zeNk*D+PWwYv#k~xk}Ht2FRQE*$C>XF)e&M2+YdI(yGP4xQP}haCXObM zbL|*lcB?Hec=h|DVrWrG{r;gV1YEaLQu?(ieX$emJp(Gz1S69!K0tT%;CH>8q8-OB zs`Uss(QOX6sn~MOw=bN;l(JmqQKF=;OVHR+L($6;26ehcga?txfs7v>kF`?0xZ!d6 zAceC4o6z&Eb1Q~bJjtkKdX2JiIEn-&c6{d?bDl}n&+lk>_@qAh6;D}L5B=&WPn)SeFw#?#V0@^{ z4O288yp(P@)uAI#{q&(Pm-Ere^@(T(D2((Pm4@3IWNd8l#!u5r$21a-2KFX`K&yf{ z6h&g&^yfRvvUlc-rQ|b+J;_f9!NQj$PQjV;T;hax{^LBY-&e3@m=rA>BOk65$u7mu zGf**crcRTrg1|O7{;LdSc4(oyeUY0&ofRF0dG-lhyQ2N9-p`S!Tq2EUDBGz#PGovW zvqqk0FRdo%rURSd^1_AKUl)<;RgDt=Di|y>p%k9Ai>z;1?{k;Cz^5;>aQz&Dw$yVu z_Sht3+nW-jB&BDOhdC1=Xm2L)2~V#oIKBwTh328pGBC5}3xVi6LBYrkVU?ZS9A0az zNl!m<9exY)F3;3IGS63(r9IyWl&$w{Jt&}BJV#r_b2IXZ+;MyV^^NOl((!6BJ!I-v zDh=SYAkC?>f{B+)=i^&K6sGd?-hzab?s|g%eh`{cTG`Q1s$Rlst8&i1v?lvj6wgZr3$$ zb%3Zivf~rIe~}_yI!d>We2XnZ7&r*aVrs?rPaP#!7B^ZL4!PYffgX>$j=7SAQBCpJ zd&i%qRX85VtLAvKjXwN)VnFc$@~-(&0kv&oRwPibf+_&2*|!3|?JgMpO^6g~HvW&(2k(?2h&~gx*9_%l z;y^rflSVWZ74@ji|4bpiwK;0h`+VA!AcpEmkmbz#t)S5+bn)J=mWRT18+(Pjuc$!d z;L_wkh${*$wZ+jt8J8HU|6dDIiZ2b#I?Gy`BE)_#al7jtV;SK4NByf`y@VB3*4vxl z#pOVu9d3Y;03>p;yMLd=7ze#Q>i2&l``%sneN0SKsPv!y5JODK+70@%$%-$2r>TJzUL}WQxNmeE+%^SE{#_r(->yUfBnEh6U(Z(ovI0#-&weMu za$~=_wldN%jPO+tivfP(Jr>JEf9q4^RcwM_e4i^^2`SN>09TSf?c>3KBYqDToI2f7 zM)_wr{(B$p_l);L{I5^3{BPG1HT;{ae0z} zNr#pNsW5%i8!+jb`)BU!gn3?f29u3VEGbgpJPLcA{a^=cJ*&yes2!Xht(7Nf zNnw{o6JU&FCu%dZk2*GjjKTEn%_)fiy)oz0>`ygEOyrMtX; zqug0!;N|h$vb?7yl@hIu$@TZWrchuvw&@yT zs@R!VK#h+wfeffls-uC@(<*ipfnr)C1m?MMuN#JGJaIi!0?%g=!jO4#<;Wj2Mw7+v zsV0fPDKTE(dp=}iGo8?YAga5PY-?_d`CK<1OhT9;!7d6|;CPDDCJLe%=@S|wPCCJB zzT%2UXMEJ`dzam;fR#j!jnkkXrrEzrypmRbZc-jXVPm&GRkx0ZInx{&AU%7#wDP=d zPUlx`C&1{B(}-Ma?xYiddE1bk*pv7@@fu-)>?=%kbEt;1RgV&j1i; zyk57uu4X>HuU{=d!2* z@S^!QjHZ`+P(y}1CO>IP!TGDery4PtjRB1B5#neUqsb;>@$Vo9d&SeLA z4~C7L!-0Cw;0R@y;7e}|GaD!Yx2CFQ6kq7rNLhBK3KlZ+H3xSdDupXd)YWF7E+m7; z_VY(E6lbhIb=PaW-?jc+6U?>v#Hy{c-DotMgxrlW#2MMK2}eM*p>hQ!?Js)v~?zMY*uWJJ9_n}`fP``0>M*ZmncN9#*pzfDjQ zTfBGO8kT1tf)v;MV2`w7I5g9ktBCx!Ts;1M*KZ)nZpC7M`Qm%|e{5 znb@Yjh#6)6zoZ=9sUQP7+GZCILR(1(C3ud;yVdJyT~RSW_a2);LsG>4Z&H*JmPWPO)ExY5_?Xb32^Xg(v|Q<^6B^ zIzS!oiNpJcIHy493I}msEQov%c^vYy1u-l#n403hd67GU;(WAf)ZuAB7l+rl$-?ue zH6Y`?*>49;zP}{{Fp{LdbvQpwG(Ng<|7YBRHy0pt*$m3W&uLSEM@s5UgTjbxf1V}T zURy&%x)&!#>O8EfUJZo&Ugc{GCc(&64Pe z_fv9ZGX7MJ|JbZQg;4 zKFAU^4<}oj0ate;Y@)1Rs5E7!FTmlTbYZx%(!UCHmY~-4#3qDS(m~u5X=7B;?$e^P z!y4Kwp{oE&z0KE@sXkE`9HD2gGF`$%t;AEfK@$spxuU3&G2?6RVjw3+KVO&Gm)Re; zmDx||wF*Np5PZL7QEt}3R<-w>ffK91tLuTJEO5!h*s>6)->;&m96|hj9}^Xa9{BcN z_-F7QVkSzQgp6mXsL z62!qbIJq&rpv`2m!{Sl}qV@yBaXo$=TR8V%n0|Ds4}hz$=xU$yd_-DQfWs{0)3PAd z)C*32Nt;QY0Qd;0rA>r3LF&T+l=~iIqS4QR%NCLoYkWjHFNZC=N~Sz#>|OWP!%7t> zozRt-rKf$%^cLqm@cXuqm(;*@^s$e{N0)3+kpP2^YF>F5H$T>WGlJ-;a_&RmdL5J$ z8?N~K76K+Qz0~7BU++Jo^!{M@=S~p)@0I^;HV*OrgMC-q8!NxGIP+M$CQaGpD6!w| zQJH_&_HF6S_H3<1KJ-qT;V!_@^H1;WV3X?K`}_88xom=LKhXzlQuU`vg7{yO?DN~! zeuDqmcB+?ux7}f)cD&$NERwl!yxpf`M(|Isu`Z!M1S99tXkynot_8s+au?*n74KIF zY_-r|dcN%?-L4hMNP_pWSuMeO*8kF!hUMb^MD!_QFY!pST~v$k{|y_0m?_um7@IzG zE*jL|LyFcoHbPFm`g;50wO;1iTnH9Z*UP*s8b?y&=@VeDxuCn4ZsxKtS)7Riz-0&| zGZG@WWPp{jkLR+&F>qJe*K_{WVcT#`kZzlf=pC%!n1q2b}hA7dyJ*< zf^K_J<9a2;grQ;ZWzvM}Zk*Ni2Ch^dKqC|~$$q;=mmgYRt76`j@=Z;yL|-(i3SIcC zR1p$B1Lk~EI7JH^qTd&Jkv!b0PQ*4iBM($qdwiPJk8aT7S((+MQ{QkFtIo^zt2^!N zJPmi{=XYwMiCA!G3a#(U`S|3*di@heqS>$dZeAXMTQHP!_Y(BGsonN{3)R%rsuv!+ zS-~-i*N*e7_u}Z2wcoNaQ2<~Wm|rJ~bdsY#Y{>E#Tx zj>eCwEauig;kVQ2c-5dJBpddm>?mAd52Vh^$|ntOaI+W{T-?|0hH`4wQ>zi%s4wO) z);zYb;-8&Z&#y?nIdRN7=;QLT3R^#MPdl&wJXg|Z(29(JknsaNu=vKSS|7bxvW$7) z?AtZco0GHwE|2#Lg>64BbY@l6IH_WHgAftkZ{^4kmRgY04hH?CQH+J1eHCxw3-FJOh^mw6F|T+LbvranmRC+I~956Jr7lk~!jN z2N}+Pw672UXdtvQiEgXBKE;#jz2^5i{oRNi@w-HUn=eHea@3tdbNi?Cch=kQ-klXT z)(&k^b4d4ze zd#w&W3#8lu0kgOb7C)&A9qMPSQ{RiJxQOd{e`_0rpi*8Y)ux&g{q|$&^&rN_fchX{ zb-qOtf*dt8Q{FXOSBDeiP>USQ&0x0P|IY^CwPmt$_y`Fx((SHYPPJia#Nl3){Q`u6rQ#6Mc{9^NPB zQXuvi$2!63ghlOO)MZwXMMF!=3O-27=^i?;WqJ?u=Oz65HVstxNTbwG!@B+;Wrw5=saQr0uzp+hmuUj6kx)*t9dqFm@1=QUl zC6jRI{zc-wFe9Ah;vI`}aA)3B`&ZRcDrEGp#={(M&h7lELXYiTe%Lwu*Ah4JfkEG^ z6@yg@Dlft`%czo0)ZxmN=kOh_eKZ0R^gq)F_p!Riju8Sso=e~2(oZqfGb=&RYE!MM zHtC@YB~q(mf95BTMlPzgnY-Xz4t9NW;+D4Xf(Ziw!9iu^Fgp zWuB?y4J{v!z=~DxX$7zstwQ}2@oVITW#g|FU>cN+M&*-fUiF)0H(Ri^Kk4PgBQt)f z?P3%AseR;asRATGuL(GM(3myJk|yWm8P>_2u}pExUfnqdfX|e(*ux`$|JZ@)4Av;u zEqXi+0WnX#;oSF5eg#wUJ;7J>{M{Voz|`Mbr){=AQS)ml#jLz+a-mVla-l@yO*_=y z1>mgr4bKB5WkCwh_$Q5{7wxplgv6bI^!=e*;q;asfMg}!*Xiq`7x4-|qHjte>KdHl zZ3|1{(_eZ|#c~Ch-Ix$V1M4RCAyN%kcit{7&JXi4wftGu z`mwQlYJlD*YHFzWxy=(WH}+;N)Nm-xmR-l>FR42 z_U#q^Rz94VbN6O`9UW)aGf=&`RyBS)+AG?>9_Zi|EtwQC*0jqQp;-UI$qKf@qw(rS zFsW09x69Qndsd}TyDwQX z`%Y3c|H1N;^?W(!#l_T|K4t64k+nrS3g-{c7UdCQe83cw+jSd8vn%JM*=tx0%|W>8 z{R&>@xyB{5=;c2j2Gl7+AI&J!=HvOZ9$l9BMGo1z_Zr-F!S|?!x31X^!NKJU8O2s@?|-5oYBjqiQlLm&JN@va@0{mJ!e;Y(r&zW!-B^ShdKlAD19+ zFj;o!jaCW%CayELS?bj;sg+?V;HwGW=~yXme7*q|Z0TJ1PB-VN9sQ`5NWFCJ4f@x* zlZhK5b;0Q@y_^+*>$?hZa*$4CzUA2x^H{>=<~6Jn^b`x;>4u>LIJ|u?TDxS$G~MDI z5}$$huK%uok->H@j|9;qhk||TCf86?)_y;#P90S2XYKM5*bC58k2U@o@^V3^{ql(= zXE;f0;yw$2Mo>32DK3>6Si&f%iG7MLv0P0JhNyAF?$TRP<>6Rw^3!`s0)<)Ch z7=TCL5R6ysi=|p$vet5pl|27|=ZT?ZtsCw#6pp^`^qKX44CxRso7LR5kV#9Xmp4Ra z3(4kF+6uiWjfHRW;#O8Om7)FE;$IX=djR;$zM;}783wsm_B=9WJZIl1iEHw9G!zW= zs1tuvdPVs~I;d~<-fvG^k4Vc8=b5(J1Sb;3XMOzmVEvqjANQr}L~YDTW{pLATr`dE z70tb?_nzg!lvfTo&OD;N*bVlsv7KFkkrq_k*8aK~sheRLf$bjKF2m^Yy-|Hbu-XKf z9<_U`p}?m4?v`+5S^FK<@O_BUN9!PJ4ZdzF63|yM9!TJ!I>Bw)&0=$^@Ws(mmA8N= z$x9Ug^wQVKeJ^d7Atz9j?7EBAjKfP_KVt0i3Yek+(66$Nb-+;HtTsM0wKXW8s{y*v zuq?8Em*iP=+5;2kwBSblp<}mqN8ATv0yimK(-rbt z!7sca+slb6nGX>%?T?DDc~~vs_Nn}nE3p@oZS=cz%$|*5zhe>!I(Wz*R&tQae1jWV zKEZ9+TccBzH?N_`A53EAxRLB*)vqO<=&5i>yU5XTZxAy>MQf*T`^o~r+zS5}d+#09 z)VBSPq8{ZaD#wNb0v>77mEJ*-61r3Y0gseOS6XNxC`VALBtS^0N|PGtgccR)CG<`} z=`~UVgd}eV&%NiK`~AK*-d}HwH^y%b24f|A?Y-BUYpz*7bFP)96AF{za5p+va=vN2 z$qS}i{3(v211VR}NVP0puYS5BqvKJ}6)-UyH;=nPS-oH<0nBl?xII@|=1bR(S73k= zpH2dc{wGbcK8beGcAedJQy2VKd@T2LL={*J2-N8b=_;%C&L}7_w>{^!e!F5J^K|zK z(!E}Ar4xFqOU-06;ock@iY`FT|NB|@#_t!v-pjpMPv1Q_Y|m0dJ6t(Z)ggtnQLNwRQ6|Y$ERuz2Ht(8;qhG|#U1EaZlk*;Y)yC}QM z5@4gW=rTZ=sKP&57+5=ZV#Z=!ycg|T?5C4#D5e$7$_mkL?`1tr)5^iH;mYf^cPyR= zbn%_5{R+6TUmg$>m)WEBk6mj`$?OZ{18sIpE}GAO@;-8KzE;o$6bD+CDnA+y1wpQi zIvAJjHq@G~FxwWP5ZBu!bt-u#Si$72#Mfj$6}+|LF^1PLPB)vw_(YC2IJGxJXH!_- zWTsaNk+XEbGr<=DrtO|v3a4p$N@?*SwkaO$skfy24nW-D?5W39Wu4C(W&QHVgQm?a z471W-DGGSLlj;n8j;(woWxAzZ8Wl6d&vCl^sg;iPR|?+_KK33PK>1-{-H96(0Vjn# zou5^Fbza!Oym#cz*v7+bUn?fWuIsUtVu=0Z#=^%1l0tE=7GQ7R{MBS7n!720+LBrB zzu`MceVVr!TbGAjd9;~-Bf?{Km@rk;_g+TPD8r%>57p7(yV6?WkT6gC%$=;*Ugwt2 z5>ru7nJkU*Ld+MBaC@L_3GZggKh_y0GU1%=Sz+(W2i&A%2Q0LE0f{<-#~FGczoc01 zaCM;%4qewC)mg*Un-Cf+3H&zw-Bx^gw?HJ2b*nR}C4V>d*FdU;#jyGvfM*tUjH1r} zh7}%-#l3T2hd3=z<<};O1C`MU`HE@TSq<7IA8Tu`0c`sf949gzr|>wgs3}`b1RiE1 z67GWZO<4#|sBg^X5DlLfMrS9eG#Kx?nU3|A>RiF$4fkUm7qMKEd7V?{&Q``UZpyLJ z7>a64xZ@J`WSJy3&&WkN#&KxxBdri|_9Z;#x&#lP<`>OEC!G9i93SWAyzuvY$nHJx z5pYNuHiW3%S&|ERhZ{ykmbIpl(o!ExS*+m;hNBZka8h>N zCn@hm*|1JzOg8i$n3_~YdrEGkT?fI*jm#zro6gq#4|CJO3qG!hxwbg#-1=_$!L&)= zue=b-Z&%JG@I;=`c(~K99D8szOP~u~$L_r(osL$tW>zG3CP;_&eGO|`MauDh@V2_n zsc@R-cOB>2tc);wzFi{UpGn4hlR@XbUPSas=RHBpx;ecq3qYn28*+A>njR3=0ga%g zyJ4OcZ_h5RJ;!`?S=8MqIIPXy8@TYB&I@bHZHnNiyO7z^Fz2uih1V%2*xDp>QjZnA zAnW6F_;jIm12~T@Q0MV1{WgxOb{{7J(e&2ud#P5NUOQlu_DKMeJzm4q-CwUCR$^JX5+SwGk!c!`$?Zs5B#>)O z^Pe8VS-M3Hb9fvU1aMSL{_d3mEvbCpxy789iU4V)2Sg#ecTBkwwZj6-$Cr$$!+pH_ zPcGHPYU?Ek=fUw@^3+b{R=R|pb|vr$kj9?qHTe&Jr8pn>6`09H59u&zwE0#W8Jn5pd4FEC32cdEIcwtw zbmVPPr-kQ)xJ`^zvr9~Y<&`T1Qh_zb2N>2GB}=er&XpDH6ifQJ@=tHHeJ!U;`bkvc zVYQ2$nwVyk%zBR3_<62`FzbtCVL;_c;CvhQUJi{DhnkU04k{JUIWMQJ&1`hTlh@MS z&u%$GTz1xsnuro64duG(p3c36+HOJu#%+0Dp4z3x#9YU`;g-2CM4v*FuT$1NT_**# z$BQHMq&$5lvVtg)1r^F&?^Xic_)`GXhyy9IGOcXLKmNL|=hQ-v;@r@%lZS1M&v_Dn zLEi8`$!1dThG0?J__JYeTHbWLtiJ5WAlDD9t zHhi#nyn{F(rBG1LjV8ZdUNK2dFqFkIwn*%lkDYo0By?N&+o<{muSz?OC#{NJoP>PMD3SOn8h6`3v|6a=gbj zt6j0Oxh}edPRtB)Ntn2U_x>Z4aU^~@G6)wdBBib-t`_)(;I5btj-`pbr`qD{jBL4r zUg`3+t!-!?Qs*xtPVH2+r+hiK56Hh7K#QI_|CEw*Dq%uJ?ULPIWu=f;)(+!rqBSa< z`NL3JZcv$b;pe|#r2w}V88PYG+HfPw@p%8ekj@Hn<2rHQc53Ji-_+95u?r2jfwFVz z07Xl6PH7xOUvD`+Xt~uVI_l1zyU@XuFg3NPTK!OpF}pcNr{Pp+Utn!E1~y6u4>LlC zG0g|3u-(engnMp4$}!~$skw&-xco8m!kdF1#u74vW(A@-#hR zc&b=N(Z~5I$vR`0l_oS3(NC^Zd{Oy&N~MQ$wG_|95OV*v>$95P3kO+rdqHF~7_idG z95pU~^2!r?|0gW9c?XTIw`5k_&2eq;juzp<=z{n&5r8h4MxX$1$mw0LKu=`wPHl0& zh)rIRo^~`&1en5$QRnq7DZ;YhKV-t2K}`F;ffI4|BzkE)i*YD8 zLye1K9T1S`8~g`+K9-%W3lL)r^*5=${=YoRSNf>ALaa59?CWz-@cAYAr#}ZLRM%P1 z?scU=*7b34GB_{ms*SSX%e$GE=-sr_VPjq&nLB()~vxf#=3tYBdXsc z4%bIDPP-1TIMHiH)3ZND%Xml zp+Di1kcY2vfky8QwB>-1#f}SCkdqic(Dl~_lh*YrDl)rrz|9vyZW&ljif0#VeF`x8 z6p`YHctR+~<)ErSKIhQ0HfZc{&AJo>uQ1#)BNSa+H*orOt5@Ek?r`h%futUVlMbMT zoQJ^F4{+>w-CUkFkrpeqbF2ipz0ad-H8E$wcqnVfH5Z$j24ySZ**Rp{)NJiP7 z0NqFS*g5WhVj+-lQ{kkx8fxYIpGqDdZ7na;x#ny7ii!xORNPxd8`Q1~4<%XE!MEP_ z3IGJVN%nx*jcl#a5i*Q$3>md6WQ!4 zcHU(KJD08ifiCY=i`%!9HeUA9F$8OjQ=P?0mvh|d~>u_1ZQlu4|4)1H~e z8C8R|*$|a@jq~83quE%{jJpVZiSL1+{yuZSYi*qtXLot#{_uG3>#0nHz18^GL!N7wzj+3w{qUp`<|2{ z?b&`wQ^AX?rW@$M0|AUpRQq47rUI>ADMyL;0QYX626JgMGN=-#b=&V>u(t!A{gwHD z_#G^nYCCtI6+l7?G z9jm^bo~pC2k3afFN88XS63}waBaf-GfDu4_zI~nHhWuV6Kye1>J+(4}t|B*$mPKQ} zn4QHR&ohk~;_^JsQef}favNKq&0)uS>;Q8YaX9@u(EdIK(K&)jw|x+G++{o|l3>y^oSA;BJVl%;9lFVV_hdAn3$zR`3p5T62$Nn|qiKzT z*q|jg1&0VemWPr&{d@+_v*ulTQpxdhpZI{iPHu04t{E9+-K7+X=O)cEmlr5~H-9VM zFH)M5bE}6l9=HB%R_rbOeXyL|8STv^Zd=Bofy)jKVcHEMiJXOvfQ95;*m%FkH74k; zaOx192>{}G?fB$(bt4*uLH?fh!%i3-K~|Q4G5?<2L(HEMal3JHo9=~(@#WrkDn;1kB z5)h#JCndX>J%U2;H>MB{F+UWNjb^Fq%!9M%MM8Oh^G6K~4~ZIR!pd;gL%))%D$*^& z-`tS;ZU2E2wbGZvi@#eQkiR}{pR{msz!ZntrW`BU@1Bzn z?klL|T*Ykojtx)mXcBNDJ;4F6X#U^!1yWz^K1M=qRAg(cx%Sz=tfwcV-@$O(m7RuXnjUq=33`u#ZZN5By^lS%yHJlPJd zIX`4#zQ5Ynas#BDC_85p&(WMQfNm)m?C-!#D=-h$^B+_QY0CK2@Hzmo&Y>YmEpvx9 zQ)9qwxZ}w&k(s%BU5>{g$0AF07A&^wLq7bLu7^rSUufcKi}-7iIaHr=Y^`{L%_+pc zwaj`COU-!%QmWPx{Q0V9q6KOW*`{dPh!H4wj&R46*9<4PppspWxcYQ{M8UM&?-g(w zqPmUO3&-wCp{-WN0G~Dq%Va+P6LM(zTGi#==oi3)o>pO#NkQ8mTEqNI%}?998J87TanIy`!+ zP0;HrCFFj^6wIh)y#DCcU!I9Z#A{t+rBPFinAeyBsfim?t41S>q;Ty~!Z?dBjFwwG z*oI;of~`bX{Z!Qq+ZGO*Q$24~ z_nM;9Z9R36OD!u?{qDp!AIY?FRZZlVRvmtt70&G-aD?Kq3VAbhp7La5>qOg=`I0K1 z8!tmorLidj`7O_mT^5LYI5s|0s}k~?vJQQSA;0tm$02p4YL329C4Nt%Yf*anUufJN zD$xSu)!aSGtNGbVRrjwR9)0}H_{ggId5Picu!zh|Iu-JD&IVY-^m5~m=bSviRQ|0* zPDe-pb~*IQzkBz|-*EmHz^sAnc%oV(I(vNUxTw6Hd8cV2-HCCFyz11|!kvIyU#+}1iE!B#rw>B*Dx`wmy`%mHm4?`^H#_

eTlHxmOCm0I$DMbF|2&5rgI~T^_rw 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μ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] z(>#mNi5&-9xp+Kh@C8Y&<9fCvfUIvnvVsNLSgv4}t9?2;%GC!!Ju1T~Mw}17$5v`9 z`c58yCiYf;9c?M+2>8j+;9i&2K)&HXU)*}bWTW^_PV(#k-c@eAdek+~)e(Qp_Nv?a z+czDv5>u%EQ4AY*;m9ca0&9PH{E%MyV3@|Qc_ZN>c^LRM9R6Y`t`R_bAx%|gs9_yWCTopf#+4M zg@*c123N>klQeJFT)Wvr8`}j!qEGdnI|J0Fn&`8B!3>o=syfoT)z?3|)?Kw;YHhRX zct7@J@xp=Ati1k*EP@{c-uN9xr&a{IN@_% z#nTYhuhwrSrYBlt%)IPlu+o*WDrV_4)aUBR`wnc>*oF;+Xh2~Bi`~lxBOR1q?+f9B zYR;2x-is34=ygDc7rVqOjOyB20{S#fw~_LQwUEWPAlZW>GWB7HN!Q(2j^O8T7CD6i z>T9gMYbNmd(HhC&l^{C9Yeo;6mo9+JMe6v4r;KK z^(oNMS{T()ol<20^DRjMVUeHcRSlJPUTyj~7Ly-qNeBy&yCBj>)M*d7&Tgb@yIf;|FWhs9I`m22d8JYZ-z!noGfHxsUJ;jOnqBUUyYR~mk1EPrV) z;ZYiCO*-Z@Zh9tarTGa_m{=Ja!=t)1aS74%jQ1CGX=15*9oBi{Rb)w{ree-~*J$S) z{T84s%H%>BXG#nM!1~y*6tQ0C06^@E-QMdkRdwE==v03l9H-P3D+p-rI)k;_s4T89 zfs1#^*48RRwZTu+!<)0V&vD^<*%l=EjNfxHfkb_i=ZIs#0_e_Al2!nvUFi5o2fF{P z^M=xJ59?Qeg6~;Z!{q+M!E-J^?i52y837Kyegf7jAXrt&Gyx6Gg=rS@&-f}qTQl9A zLs*~%z@bOu=ygN>TDL|&0Az4Nx8ir_r)KJF>TqjZUQ$q+Qgobbk`@yjp9G+pVXO1b z;fEG8U9-v!PR2Ppy}g=g(H+8@5wK=CfZ7-lodxHscb(L(AcWZxggS`w^@}I#%G&zb zQeCt?zLv=q*Vw<6$7eAof!)0kz?qA&IK`yeL*Ei4BVOpmzra1<(7>7VLHhsS=o#SZ zzo8WXZvKA-3X%w%f8n| zFUkgTyAlc*xe z1t-J)Upm%JMU(!>97D1Z`_fv2;HPZM^&RB%ex50e$5!vpU(4@A6vO30+}B=L)&eQ; zB>c7kf}S1S{{)*{P?I+)Rj%#z2aBxkQWs{mnbiAl|F!rrvMb(C7dn$tG=&(|cE-37 zmSU7T8x^4vd9iyZwXTxs#-q;k9j5zpwd1mc2S@LFkkrC|`rmjSW={q!d-86Km7*_H z>X_<#=wNzQnt`6E{Ifq8J;+zVAHX+tf>-Z-47tU8mult ze6@9||F#hun~iSj2IIHo@^^Q9viMM83_ZI}0rB-v)cwDBh4kfY(pC0 z_YOvVe?#Sg!!G~)G^`rbEahje0JeykipYyXJY^Uc_fjSwg->Dmc8GrwdqofAT pgainlY)|2K;A{U6KaTsH#n Date: Thu, 21 Sep 2023 19:04:04 +0530 Subject: [PATCH 12/12] Updating screenshots --- ads/feature_store/docs/Makefile | 2 +- .../source/figures/dataset_statistics_viz.png | Bin 45707 -> 38545 bytes .../figures/feature_group_statistics_viz.png | Bin 31011 -> 25621 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/ads/feature_store/docs/Makefile b/ads/feature_store/docs/Makefile index f93e7ea53..36284073e 100644 --- a/ads/feature_store/docs/Makefile +++ b/ads/feature_store/docs/Makefile @@ -18,7 +18,7 @@ help: .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +# "make mode" option. $(O) is me`ant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/ads/feature_store/docs/source/figures/dataset_statistics_viz.png b/ads/feature_store/docs/source/figures/dataset_statistics_viz.png index 2e151fd1d715d1f31a913fe4c9646348100d630b..3f79725e255a8b32315f1ddd1f4c1cfbfe7c8a3d 100644 GIT binary patch literal 38545 zcmd>lWl)^Y*5?osAPG)z_uv{_lHkD-+}(n^y99^e?iPZ(3{G%&cXyw`hS?$id++=1 zR_)e)+Yj3XH8W4k>8JZx|IX>quW}M7ZwTH1000yzNl^s=0Nxz{cu|dn0DBUURf-M! zcMIq=cWBz47} zTWe-TpIb)jsGFe97%5AVzrX*B!}n<;yZh*(e+$v59&5b1v(r~1ioeA^;r#>_#&fY_ zcjB9Hu(PvsMEa)+Rar+zX%9<~+T-u~>g%peiowyC>Rz zO<3idyo7A;KX0>X6u%$(JXi=1ev#C*_rnSI4^(1}9e1Gf35Af*)9;=t*Ne>(6>$BU z+?C;E3c=h}^oNI%*3*j`Ue9`nWK)G8D4KLWQ?1pNJ`9qScd#r>*}Qn6l%JjL>j#e* zn~|Zd1=>l{y&Ry;QUXRT^0i^#=|SL3L{CaU_c-A}8{NT4bVH+~g;q=T$ON3fWZW#( zcyQU-Z+R)I8;`dyq30rcn)NQo#vXlNz43Wo`U=V;(?I&>r9t4K4)Q-QT{a(ZtmaqQ z;?uha0Qol1nE6bv1v^u2Z+y;oZ{F~n4_Z7vWsQY5K!mbC+^JYxwAFLj^ngGa3$QMV zy5h>WBtFeW+){CCFUSl{iP{AO-)X9Fv2|vI&GFvuI!3YR`0qg5Ou}`gON$r*$EVPj zuqN>i7aq5;@%Z`Hx}#m3_Vy94;2M9%bS9ek^{`>L7UfGRhQ2=i6ZI2#2YZWKuNRN^ z%XsWyn#!6n_;*^B%9jU9jC)_%J+kf?OlQmY&Lh-&cGNwv*y*V#5oH>WbE$U;WrZiZyjsEl|K)w|u zXV^|Yowc}YOEW>lCu;x{r9Bj%0B-p9?O3eOOJdJs9>bm+v8dImB0t+VUux>MN*c{O z$~9scixzGWA~0ER#qv1ZoOp*kMk)(82=$PcmE8%Y&CGV#8#OkNmy*(-{`F0{%?8Hb zriu_zmMc7nu+;jQCMx^UoaMRzROgDr=f3v5JxF-`vONfQAO+{C%^a6$ZDpjrOblC# z>~zoQsf{}3DeH02<*p8*^4oN8G(+{n#KY}YbcMzWNR+Cs_vX=X#AZfkE_0ul30&8J zSi9%!b7nrH`0dz_+x;^7Q^w%J=B4FAb!i&{ESsU(V!)F-0cj?FPLd;?^huol?pwP0ZF1r;O+ z2Ip94A)hw9{F#+D^n}|xVY2$*xX^^s-U*+R{rIiD+}gV5!F;?B1lj#0o*!%=o=kid6Xu-*1CZfCjag0T5`-rw|L3GV#B+vUQ}2HNw+ ze>GF1Wo?MJ4Pe^v=sN%wuLdW1%E$j@20h_ZZSVWcpCfCr&H7m1h5y*PpSV|huZ(Fg zac@0rZ&9^AnOxlC`j7~%G*5nD{xQ1d6Fjj5yuB*%sqqQ2<2IiTkr#%<-`^Z1(SgBW zS{9aQkziEi2fSxZ5-^k+v4gNi=vF4NwYfw4u+kX^NH?8O4Q|?4?V1x9X_;*&7m}8y zeRs3(Dghv_y4*YR_KoXBp2DADZxE!hYGEEUZIHR#ptxUvpJVS{EcCpC6mJbDs4pk zYIh_>cx_do(*4F9hf&RU#(d|ZkJPmPC%NTHbHb~)IJWoK-w{xWLZYM5NIlO#1y$|s z?p$pnF7eo25)r?!Ubjq4m|+1wf9ON6D5Z+nn{xaJr6rtu+G7ymg(Eil@|Co-*P#ZA zcqvryksF0Qq02kM_S`&apg37!~Lr)*p{Knxvt0hpc<)#^H6?JeL+RN^+?gwt|u$xs1l zVq)>E4!;4)pF`d2jXXuuHmyiJUEY3ISFyZ%bu24IYj|PUQ&FZ3Oq|G*P$h7|$ZNo5 zW-gz;0{x!7pGj!m;3rs}$V9L@VdFmZvMHNITVE;QFy*!>$aIz_$vNj>7HM>H?Yyetxyw1_;u|3DydU0H}p7YQD?cM_Jpzj=j= zJB%juaWcO+Y1-jp?_10e#G@U&>T!2}RN=M}g!{X$4JIZWzY^5B$Dr=XHrAG-^wGcP z%KF>R4DY7kIH1HtAJfe1Im$Ka!f0euS$&>7O~x`uiWQ3hW^?7lx;~H(2myX*LbtvN z465v|=X$%tDcxN`Z`o30jGNoU#KkW+!&wx*e(hNA3|MIQ5iZkgFuB<5kxA!?86W>T znqJkQlF4J|Z#TTAFzzPKCiD+|d@fJ(w?h#k${z#kAgE=0o0{!B}4L=69QZ|M_)oQZ9nau$@ zRyNy8y>5W}dT@b_hpx5Th6R@lqlX`lkECfT_r?11-CM`h%0%Jd+pEif20I&DMVMQ# zbv5CFTVcW3SgpU=Dgg5>2B$9;K$O>wBg51E&PLnY8!BT@pH$vGj8`T)zP22e9@-k5 zz8XFB;siMwo&nK*x;?!(Sa1Wh-0bMYK3$OAME=+WD^W2sM-?lwwA!{nKuZgC7ODxM zI$~^XH^wibok4p|ZDp?C@5YALe)cyCuc%lPHzX6z-YfOWcO4=y);-VGWdzg0GoX z6aY`F3Gv7eWM;YR(Vm{GDZ$nOSzhsud0f_2TX>jzRGBGd3^V3o4eb^WyX-dwRuH%= z5g&RT>km__BUO;!@)fs`X&Y~jvb|A+Y?zz?F6Go&xtN=zOe`nyj?Rh(soW3vy}ODY zRL+;1dV+3$4)$L7*GMYL51K6ObX;bhH;*q3m)KSY5TZw}YLeD=AIs)fc_Y zLpG@c)&^N8AdDfrQ@di8LS}gqpjVh!^AKCCw;D?QVDY=I9LC@^zk)=^1}_CwNNyET zss+|*ggK%&2V|4j%vptmG9ONB8ZrZef~s83bO7ue9Bz=CIbN4jqT=G>>%*CnNq5l6 zQr{3uyNtKDP%tX-=ATfkTI-cm*i#ORSw@)my1&%G0uY8=W6{ykA(IH;`CeZ;MiKLi z*O-hjA3;tf1w{U2fUNGF8jE=*mTrg6sPgk+zH57o?$?iTKMIF_H%RU!M!G_31O?n& z5TXN>mRE}VFG*2rXr5k{GcyzMr-?Y1qo66?Xo!V5BAsuf-0`#GYrCzZ3iGYncVqWF zt*oxy&HY3N2pr9I*Lb&X-Ul<@#t1uI1GfbWii)PPKLto1nos}2@Bke*`zSv%YBN9#%v90;7N#yT`}>(nQc83vW?>};6Q_L!QrG1T1|zDIeO&R(x7v+P2d1?B#Yf$(-J{LzN8qA38%$7I0x)v=2HO zOR%;dxG4LxFrxY06YAxD#OFRaZQoZ>~{e-BAX4{PyiiI-zr^`*A_XkCeN3&(F5ZGaY!|UF$y1IIQtzDRx zm-pSfceZO@;ERKztV`H`waG{-y=M5J;@7WVPj4(geS*`CI+433Y@KH>=GKj9DoU^W z4H^`&y3Nwh;7y8?*x$Ap7%g*+7)5K(Fj4HH<7#tenXtLetttwAeABD1yqh^|QZI8F zSrN@2a|Z2*GMAgSukwEp78gF*=3R`~?SWYBwnj&>#xxNq2B?V8O3(C^)uL zZX2Z}fAXxm!drXv^cPm1tgDw)Ieqnm0zfsd>Nxz>tH$^*T&W-^ht+PYuC?GzOY22j z2?sv^)}U8wKT}0S-q5JkbbA4>gs|3EW6!(0J2l2c^Js8Oa#e9k3kUU{$ZCqxvbE)# zk6RD-wsTQToTOI*h;L}W6-z>PxgDNDAXi8WEhMVkh6P8sbY7kearHNdsIneuS?}KMvL&zF#uo4i_hkhN=w@_pAx!fg&>|3# zZ=!Ox30*Iiv2I^TQ>9!Suk;oi&0q-~SU>c?`8@FIXn~Odb{sK)*{MA2!Om|`_Ls%Dxhev zUar<`!aq-fC4-ZOmp26_-_nE6`ZSC!-nNP=Jig7mHR-sdA=ns&TB<=+7y|1NTD}eWlKQgEnF6(;c~7 zg*u{d_(Vuf4lT?Gee@PeX+Q3vtTeu8E~mljrHLFWqg^wnb^w#ejQp0X)?QgQyX$=^ z$EYs%ba$0d?r}Ix*X(%k+59j;cGj?E17SHeRSL?M__(a4z-_(x0|-ngUElPFR+?5m zJ@M~(uWIWHa*GQMhRP=z@+ZB%yPL^0D!9HVlbo$+-&L7R+4b=g?`gJCL;8F14 z{gmKW;%z)p?BIF3V~t=fUtxPi5geta)&gauW#0PX27Q9?+O7k99+uYTn`*X4uVCub z^|WaZ4|dAP%*-^dKY*Pb2)V7dtNKW`mTcM!J_R5I1_yH(^`rMjla7@&B+3Y#pZP%3 z&d+UON1Z+hcuhWzM%HY$6rZK_8dF~Aj>_x)dZVmiH8)%7XwDZ7-t~4P`0hv-s$tSz zqEfbbd$H9s6yQ<2e!D=#C#xm##T>P;>%wx1^sJ*?#PqfI9pNcnd*Ur6wbVfXG33^L z&h9j`+ONWyq~v-Y=8i}%CAH_QFj(yS%#AGXYhS*G)VYvl=<1Gj*Bs;8c`e=9Gkyr} zgEmFp5ym2!DNMeqPOuSa5nSHqJJ2jFy?^Bkb6t?qK*VX_41?`Wwfm9UXpb;n+f@GE zih}Ojx^zi?-Q^E;x$~qMSAt`V^PSOB#euR9QP4m0n)Etul_;j{Wwl;+gw1mIiHZlH zZHsRF@`JIRTa#6gv4Hk3rB|;ctT?8J)gF|`RhLY z$Y0~YpV*tszc4^s-sl?@F+IRElNXOlAEmKebZKcf5r)>V#Z-P@tAhUFwZFPluRS0O z&qbSbnrygsKLT#@EiW%O?j&kT%E^_Raes(qHFCX(zd_W=M4B%eho1B#@zhw0T)ew4 zKRsRMv!L+^j#w`Oo)y51{$Q z2mY<&smHY`!V2K$^8*tf0pA-L^OQaYnDEfoXv37=))a)qTlY?^;D(gnIUbsOyshH!OhTGO6q#|SL{GFTPn9EY@Y9pr#TGV!b8|ppOf)*- zY(pc-d$*R)vu$3--i{w(Rbg75o(m~QW1V-g!X zYf=?L45Z#}$y{h_Un+)VIJ9vJt5~YZ%UV$I%5BA4j>Nn_!MWkSfq63O%{Q#=83KK^ z{mxOSC8O19j4h9sLyu?BCmTC;dwX^c(@~?<7PqLkr3h^hkS6GKMbl(=ZjUR-}DGSQw!Ye=*)1%qgM9H*~UYIDTwRyVL(Q;!xt9#2=wqz^f zX$gDpUF(m@8V}`r71qLaP#7P*r1@^r?%7Z4hlt}{{2H^OFJym2-j5KddYH(XCK%RD zI2?)};%kMI=8>t6T5@6G<4dWis9fYT7RhC7!f-`rTO-xewue)OsS&(mL)@#&OFT}q zuXR}kv>#k90*-d><5E)x9mWLvP`KkWULH;tE4G|>z5Q}2D!PqUbkF2I2WM(NQG%lT z6yH@7(C>_%$(_9caaqTaNS54o&6C}^t!KbOhi=lkDJnL zZqdJR)_m08j1vz5F4^z?;=Xo5|3P+TG6=uM>+0F${!?>DS%W=)m3KMaBzk6+2>Iku zPLTHxD(jWzphHW*hNX~HL|HXYnLgK#V{?qNh z!?)D#|3JEO;-Q&;JN*CI?2wla0Ao2|tWahLL^>)7noAyXF| zr1eI-0{o$F!4ZM-Pa$Z@Lnk)9v6=%OZ-_V(>c(CwJ@r~u2|zovX4N~V?En_0;O_SQ z4@2Szf>nXZI2fhc^Q6#7ho-ACHT!`38fX2Nemg|%xs8fnh~=UE-1D65zl?UKnFJpG zP~?{RdLWT{3WnK!*?ix<0uS9SL-J`9rhIs{?(}VVhy5k%Q(Q6fO_`ox00xV$@aJv{ zJdXE)9~%bIVqn-?;&UvanAZV)!^&$g5&sd%vHg;s!&|3w3Ty7?Pk7g~gXs$#nOROu zA6cW7OVQj0>YDQ`d8|V>{DjqaqON#Bp*jS>T&$|~PkKpu{%;I#Y&N{q?RI;`*bKei zlV0BxyYCGBtp4z$apRLCql`O;^B+vbZ?QiRJN3zHnFMf}Xt6@0B26dw5i1+V3{;XO zik%`~{%|DQ-`sK@*mIh2=f!dEp{}vM({ff9uX6qzBIx%HBjzaf@2uGrmxP9YXV)z#?XYEUw_-lB z6cR-y?diu+MK5YV+fC=3^=b**w-$K~OwX^u^kaII zR(glCi|xFIyo@0&69t2a$YeaYwVK;bc&;*uhg&9%txdWlqV()tU>H@9eJ{6$T7w>! z)G5e_kGrpHb!9+}b&{@H{(|QV21b(*9V~7ZlUhSn&3vEBZi7Zbh{8Qrd8kFG2dIp_ zh9D%KFy9!2kWxxhySt{owpQV*8tAs)=Sh6iS3mP&Oivv3E%{-Y+Ah=l=RdzReodi& zbmbP_Wr{Xkd3thu6!Jp`>)ktF(46L7a#co89BrQ%AI#)0Gx~GUk9LFrfF5JCnPi%s|d; zK}AOKTf=0L=J#h(w{A z8{{P+cdoC#dFfJDn?5YiwyUM)Jz8dayJt{2;3Ytm^FMnBcQko4?hAYYFHkxL)Kq$n zlj1cE)apN=uuj%H@kTqCVSIMwkklaVX?CR47v$GkXyi#th)AtB<9cKK$kFKr<*nmi1Y9g9;wkg9<`g}6#Rv2* zPr4M@DHHt_|0XJJc9CB(>ko)*?D>z{w_uOd91B`D(=(ja$M^B$6P@M@SQt%Ff0@xD zuf@(2f#WG=hsxbo75K!MLaOxGaot+g*Es_3P@^Im7+qB9E3C$MPHQr+U)KpYcd9(O z|CIfFje{A6gCgEC3>PT47{?aip5!J8^g7nIY|=L8SVZ~7I?=t}Hy+~^;;xS(Rg%PB z1Xk+hcb`>+sqCN9pFVx^%L{-Vk6|TdG4DBw9HS6BTcNk`)Dos@`_^E+^6Nt*KkVsI zyvBcG$0jTP@;cc6<8}O3Jo*1J?EL?p2OpD8u7i=xQJ7StKm;?vj*71 z^9+FmZ`N$GI%^L(B9=&R3BggxLlHN9156sm&^M=~)&4Ivsb`47Y0c%G?<%luvLvSS z^#y=JXY7WbbxwS8cn%q5HH=6jIF&NOaPw$kRAYyBX zE~uFU5oJNTo-=nO0LCh|KRi1w1&=v@m~)p}3r2%&AMS9Rw(Z9n7#>!n)p;YW&;BG` zec@uzWhkwf=1r;2oxV?ikR%mdH<1d#=II_2tgAUV7#PbpIISD=1*BOG!PY@kiwj*$ zwrpoE-gSxLiFS`d{g@sZQ~4Tdps$;k2j3(f5!kA5>ut3_bu!-((KLk@&zA{BM)J*m z^5jBnLB^i@Se78@pd$RmQj zCF~ZE)8_jja{m>FoA)VBmkGF6Yw0FVVsMrk*~66WsZ7UMua3T-hK4>Y5H2Th_RB{K z)ae#dT_%!`m2i~>7*`jTnOQhuOLvghrQ6{1!%H%QF5%ZM99=oF3Q&o@s#y~#r0g2p zNKr5bk$KB@qyLl8B^;5jXi2QM*`~6&uGUSk1hxS$58FIBw8XmPfXrT|u!TKF75Siu0*;aZe$wKe#>^I5A& zOx{z=Ji2mAl!*_MLtH%^Jq&a*MVAe0Zpnt93etd9LSW_#!-Gep7Yy#<2xu>WV&{JH zTxjwU6u;NrQ^=KXvT*2wy5N#sO7)ig)uJ@6`kk&Q4d!ioxwVEWsYCM{M|L-c$vv^_ z(;oJWFix}j2d_yyxfnC_pSwMQcu>nW?l3gxo!HSTqA)ypa=86|sP*3Hiu489u#O|o zhb2nrr2>-@SV5If7Lzj^7E{^I<#!Tx>@GBSJYWe;cO z>YAS%&Wa}q4#a>y})IM zT*D370ec_t@};CkYe*FXC`KQipuu!FFh}$qL~e(QeXmYgl(_Qe()+**#UGd(X|mHx zER}70?P_>mF?9xUYi@^Pkm_$%R4+X|`2q{mVh@_ml^@RN(Yep4dl$tkzbjGGwil(0 zOGupOI1%{VnZd)aogs?dv`@kf)&H)57qYDVJ$!LDel^u~62Krt5{j)wIPzL=As&UQ zfP0;VrHJhz#j>}}w4LU4;p16u)T*1Pth?XMr|6A3;lzAJoXIqh3258xY)t zVKd!a6nS(qghb|PTd>e&fYPMXGqFkRe8Kdr>iZL5xMYvR22C&0badI(zpr(qutyQ! zMvjUP``0z967`M#A0z&cGVW+5tq%ygkQ!3Yszj%Qjw%$H$M+e1yDek&V>+gKChxFR zb}?3`qLa@y2j2gFc<@RF1}mj+Cm5I$e@-@~SVD`ZucfXz&U5wGbx)JcY8xx$UW~ig zvQ{|7>)2j3Srp<+toVT#(23Ls(r?;Ru5VpJgN7fj*3m}CIIJ2jnHs(pzToAUEmFn| zP3fP&aJ)p;zwi1cdY|Zi&`&_)?U)*D($-gKe0H&rRh`1k5k}SVQq3Ulf)qqAEtEWX z4GLw{@De)-rI@2F336Ja-o&0Bqo8zjoQAc z)-=F)L}69NtovAg)o`jv5r3;Gs7e|W$F)_%d^1rTQ0h+WqX$O!M?E!El`HNt*Fl8AEzHj9b8wmD zGNh|;6(Gpn@d}a$rrNK`E$e?ZSXwXmGY^1&xq|(@{ZSOOczuQ=ACA4zsL(f1} z!%`zXl67@yKO}w;z-^Mn$j&b9MMogO`e1~GMJ%#hWhwIsk}Oo-M;)5(wL*69d_~uA zSTE=?ADyKM*wFTzPy4CWn#^nvy41J2Qkx&m)?sYCi+_tG@Wx!kdRZuz(?mQy0cL8j3Fl{i3+hL{8PW)P zmuaJ%g|+i^n&MHjU2}nKg`k(O$S=&!SoGFr^o5m3sG0Rk0i@O% z`f1=RJ2zU(?_=h#QeJp)l!XdT@3emz=bP$ZUcYa$b>LWpo_NrDX?l&$Elnb|(rb0*Y!*QcoE5Iudwd!(J2Vvdaz38Z2$>E z(ck9*73r3f6q4XoGV4zP|}l^A^oTK7Fm?$h6cUB+Ne^d&aq zs{Td`Tz_qcEb*7wD-bhp79m&1P^!zqUb1S^*Ux)mRi|pgpBs8VgL529Pv`5WIpy#L zSUnP%TOy7CV1+da+&*Q7Ik*{~Q|kieRL;VRQH5OEy0H~RhrDngqxPfNcEG~Ya0i`@ zF5fIQ8-}8s#z2z29A6^Q8=$O?l1+VrmH>UlSmIaxUplKO{gRTj@W;BpQ*dJKJ&`yc z&{wZ;b}d&2_}08QTWND2fz~_ykxMeQbtqe!@Dg8I$KNNzyk&eIzUX)>20Si{SHvRX zN_kG%qT(hv>)&qAEL#MmiKBCkh7%>Mu|rdmT;SP3rb#U}7F_tV2(E4_Z5bgBtOlqD zvTKD{^KIPG=U>Kx1vXVg?Kn%(xNWq01`+!()mM$^jA;yuCE;5HB8~Es();p_V>S*% zrZl{KC{R`0*%QAgd&{Z4hq|yBLKJ9v5h|~<@{pW^mv3sCu9jjo95`wQ3eF3y<#6y% zg7n{IEy(HZZq0jgwA5GQv-QyxhBbaLAEB?ZunCTEVZa*IcmmXXFub++&U7;#KMOK{94xHagPA!sK)lI{47S>D3aHd^=P70xVe z+G}K16>lLbaW-R3)-4Iakz2%?WNwy11l&*Jd@D0yd1;1{l`rzEPJv#oPRC#8#pt6W z91cmSeW;YvvEre?q?nXfkt4T2_>=+0rF3K!3p<4bAb;UGm@7KD>|wn=+k6D14g$|h zs*Q1}sjwIu%OO(yj@#Q&3%N639`n*STF)M@=D61xIr0rFkL(Zv3DcGsHJ!IAJ1zI{ z{t}ZX`Xjkti6J_w(bX+)6lW2T1{7r#>_@UDkHE(tb2y90O9P@=c?6>$YR}WpF~*a( z8YW*XQzdeLn7SxOeR(=s($Y4_dDMNa-E4-^O!Y?K=1nd-WoyxA+8z>C6e|3c_)ANv8 z_NjAn|Hw8iTm)JQ-M_@3+~qK|Ks0e`uYRpK?3HD5nbQ+N+|na7rM`jBzPg$GB z-M#AmdWfT<`h3DX>NQUB7QGN{HN)e|mHe5+pWcFHVOtavsGhjcOjhOh64%o$70>OiIdobvNQ45i8>5hO~fuari~51qLdF+RE2|W;eXs3VNw5gJbXwo zUluk~ZbjeuK}&yYDp?Itn#{g@n%Q(p6wr9uh9w?QZ01`I4C7ZJ(a0Igyp=$tw7;8n zQp|tR6g+!g(Fn*qETe)!AluP2#t`~kPj}2>D*40rFpzyGM4i>onxzMm=ka@2Yl)67 zEKxf>kSWED;oaUVnF{Jpuyu0UC?uqJ@A6tX_gHjep1&j}{vnw$Q+kmw^7EK+`Y-Zt zPdsTwf>HeXe~bCs6WiN40w@%Uo*|IuV)wtm19Z-ODE6cLd~aZN#dLxauvg_tc=J{W zaY+5)GV3fz$Ay=R23FT(Z~i=j0oIpT0bkjwsBkgS<7*;8811@!?LOqbxMI@Q``F8? zR+8S`qch(S(Ld@t+V6pub$m3a7<6`wEa7NVAf4EANKXy*$qE546%9r)fBe4o-tuPs zhC9gd!rmK8cNFYC?}rf@!eLGfAasdmbZHr}s|t|}J=v458q=6uULBw5*A>v@W2Jz_ zlAaURks9iJ+j7p2$j>hW;lTWS6d2#;WMOl9#>z0-?nq|)I%49^r72pPIwoM_hDgf( zO}ocLP1Kf?b&w&VQ0VHJfD4h#D0~j#u;LFf1NY}(8Ta{eQ}RtAA?IJ^SrZBBy!y(X z-&a)BTrRE(mSo&;+gWO7dx^|>@x%Sz={b*K>ROSRf}+Qhke~0x^FpG)4h(;zF#m_Z zOuy5wj{l+!8~xvR0-8{pcwn&$*r2XK79%F)=BElm4S*CkM^E>6hM!AI(;AY;> z^Y<#B&w_k>3eO~|n?fy;8}&$=PTjWeSI4enh*@!4)lTdDg5mS9F-)^@S}jImWxj+X z;XHXUN{he3fULRNgKdoLOwfdq`ND$o9@W~ZejrQqJx{!jD$Qxg1xvu4kyM6wNHOIb z6pFPR?=pMe z@WzE3{-#xCj@2xtxvxhoBU5ynPrv48{9<5K8$jG&qw(Ud)6z_P-duIG&hPa(Yl08) zb80G0Gb(xv{rd@rmzo3oPTBP9g9=PG@5}MamNt>s646=isjfA_e#@;8#w8j&+xrk?K15AGdzcl<#<| zvzW_d@?hZN)&+<5lcvFt{+LDdb&0PNS1c=$$(Ab18uy)pM(nIx%C`~2Oa2iv^lv#k zQfiv!9A{-QOgEAL&NT3ExAmpqn9eJFZXujF>=&e@{yykQLX7dwu1PqZcl*3xX%&a>GbDt#dG=R9+8<3Lu10>FzMnd zOiRMHX5_Due_`z}E~HnANJ6teIr`tVo(bcRxT2G->uQIMGg4ldu7pkdujS}EsI4A) z^(rb97SI+o4}K;>#~}n$h@yu=&z7YtT;4BSdcfX6x3A|}t9|$z@NTSPYs5c+Iy=2; zFN}(mcw)2kxHO%NPKT1^>(&7UUl>4&H{lUx=`v?aEW3S*@F`F$SjV62nA^&7GhP`gNAf1Di~~^Iz-J zTo_r$+Kb= zs!+a@%@`bgWsKTwTGO5OG!U3l6|nF6ecm?ynxC{vg{Vvc!p1NE@HP z?U4NXmRm?T8Kq3{jq0x_CtsMf{Uwa%DUu>kh1kjDxjs*TFtYe@|Jd7=0A;6KXKln6 zn6&sLO24(a86r*fmO)sqqa-2C%ML1zV+zt6m`0cB%f+iD`w>#aIKz;(xRolNX~6{a z6auH7>TE}s`5yt$6z}HXtZ%fw=N`e#yFX^@(WgT@P$42Z^7<+O3v_Vy*SwkDT&WPM z<2S#-Dvsz}537)eSTv8t&y<7!^Muh()MYS##&{AbhLeEG)!N{0i%t!}7ku6dU;b+L;;n%e=XYWFNvKcC0pX385RsKPDeqWaz}h0 z^S{8-Z0t^Xd0|_rVItsQVnubjZil&Idi9t|B15trVBD#NP-Y3>9lsdBxP_-BCN2q4 zTC0j2mfG*QRUJNFF=U}X^Y(D#wi#rAH(MST{nS~9Uocfexjg+otDE+X*?dRPxN~ZJ z6aB0D7ad!_W+VWv^V;j%P9g!2%OP+?iQ7vY;ktTrc!H0+K4bL zJ4f_P#Zn1iFR|LZaqzw(QYG8o7M`ACeVN=^E%zT}oRl+5c9 zfG*<5sG!|P9S5t1mmVg-siS&HJS&7Gx(SBv&&yE)FGL={vJhc3Dd=zMP$L6KyM9D7 zJ-WmkCO%)c)Z#_ydOwmlvTB2Sk<=OI>b**ki)Q@n$3B;sp+cP2Nn|)=PY4Qv#*}2p z%0M&rmAWMxrlM%@2Q{KSC z$NtY~^u=No5u64p-XoWh7gVYKNbT*2aeFVf&QOhdIW7v`=X#(~%WQ#RdIxsg;VTra z;9UByzz%UejC=~@0`9|wXLcfc_5PC5_@_m4QF&SczCY62`pVlaJOu#k5Je~)$ICwn zp!C!BXXED){fF%D_Y({wiT%0J(No|Ql3RGZ7kIpU@%aT7u(J*y53EgbiU2!1F>ydh ze_f7fMFbm_I@wf9u%&;)!+oz0Csn)BPf&}}|GPK+iwybBxL!SNW%WT8^R-N5%Wa_N5{ zhPYLiUo-OpurP{0e7R;$OzE8t|fW$v)i6d!4TLH9ecCrMW-9^RIyv$)4J_m9WQ zq2#(+Xb`2`xv&Z2DR7Bn?97HmJLZXtvTkB8!|ov=BoV~w>+kSuA`#4GRTjDPvvR>) zt^ybziLeTK<%J00e{QUxu|Y5PXgT1xH(n&+4e+=E_@n&97!O#$x<;0X5$2P=R-k#} z_G?Addw8m&W|^Oq6qxcuBgRdA&aiprNVv`V-b%|m1RD3mFW1YTlWz{bc1=@|*+YiL zXxwy(grDLEf3*i0R5$5QHZfcVo1%K8qAm8F@3wG~gdz6=_g@8IIB*CL-)EvfJ5jKy zA@;I(X2CN1_$lx(nmiXQZ_j<^#~Z1c5o0UoKVR^n_snDGcyjV8mANa=w;@KQ`~Dyq z=Xfb_2outnMFVmgzKrbCPXdl}LJFufNf|~bdIULM0T(VxuGqH!K6wL^M?PO4GFi%@ z>FslnCxd8Xmjr$d`&z-+W&u>gu*Iz7Sx&9n`oIBzUFMSgv#Weu9fVm9OI*MI&hq$> z7Q3^J#Y!=0cM&p8ugR52`F%M8V<=~fN?V|&5ROkfIIbM~pYvk;enO1wG{3{$;_@3z z%&Pg%(*$G+MXuvN1M)Sbu?uM8^sGM82KOj&=RfK=-;J~N{UNtk#(NQh_YU9-W#!08 z5g%R^w~wYq_W~?BzwU+dNnd`1xlall?om45>tEIv1+(9!e0}j&^ZW&=XKKi>t6+e1 zJ~M0W?ie(y)gwCkcN-W2&6F|up_MM`i2j+%pbPEwY=~@~{@hO-uB28g0nM;rYd;b( zR6Ma)O3ca_=4@(kOo?3^o6PGNVvkn29+XPvf2;q|u*p`B4T72))1 zsr$VN0?Z$Xb{l_4ux@!ye~(YYIhGSx`H-u=byk%e)pj=m;hem8RYhx8BQyOa{nj5t z5OC5NqT_3}piD=b2lugI#&jN{A-LU$O2l8*Kkr(QpZ}hXYg##|z4S~3bwV(l}#j_zKpwt}R1pGM3%htl-;?(nK z;PrW)#SY)eOdGElpIxJPgKWl#8DO0FHtKLqb?>PCh&pZ{->gKP-`SHY#b!LPFPI@= zZA&GEDn$mxhk_y>DT-BJ5@$e_GO4e)_0uO=CvA0VtC1uG+TdEM z?5z~V4;vux&AEJ55@a+~V@j9a&8ziNvDcja37$rzd7t6)@SB`u zULgpQ>}izK{B6PU2{aEwZuFo63=ngdGVyKWrHt7jfG?E23YgviBX-M{x3vz7otzngC>LUi>~(id;5FayL0sZ(=~(mzVhcfql9lsHv^> z1?k#2H>VRIW2hw8Ma8_6zlTrbDCS{#ul0kr^lCDZ^V~k%M-TMt7k?O>%$gO_xY!5) zj-+h?i{~Xw_i;rV1cEg^RGPIS_zPRSzQDjGo5b`rNobvXb>Ek`(>G3HA8F6Azi*Ke zyFboN#beBEHw&zi0`Sm3vG}Soo7OGMYT%&&nlY|M+~0#u1oLT%taD`(ty*l)T7GMM zU$s9-DEh34HGW~Ry`PjFpSi(%_Xgld<*%dIMp5Q!5_dVaqSMJJ4)1%~0ak6jycIvW ze90w|p2j!n9*zTvnyO~rEivJi1aqvAM)Z4@{ZMN#n+=ykA;k09XcoAt8*FBf4b3S< z0r25{s-Sa7-7S@wO8+_sw|<#yGb$)a z@7f91x-zcyDGS9XVtuYgMEeu%)l5HjLO!|5z)or7xOJ3uqfRvVH2~rBxW%CAFE?RL z7k$wRUh!AHmBw{yRN+)^Hx04feBUf4tME#;`HNk+-+kX^n7UnQ4bc%Sz$yY-dwi=; z#Ofe(lmq5ZCFGRnzD>r8_ky}g=`_)|R`-boH&X!iIsb|Q0rxHr?|syGAUW!SQdz9L zv-wrkr&Kl}W#<~BBLu{--AMznL}KfSQ)0)GLl1kSSCl0a<=E|$i&%E-8MejpJ|$5k zzbDo&rW`f7Z&y%Y7w#m-TIie139M6}F5@zQt-nYneZ4b)D77m&746iYu1&^D5+zh;f_s zdP&(!#^!!7+O|D`xMhMgriyJ!#;6#*NdRHaHsssf=(30+!%P*gghNE7KOVxbcV zNbe<7>4d5xz1JAJ^d5R>fxUR1_u2dX+I6n$>_6wnS${~vT5HZZ<~_!^N6AV;bq8m) zwz%iG#scqjT6Hoazn)gmxz;MnyTZ3cyuo*Z*^`I%V8%jS8RcjW!)Q=%7x+hW(c!X} z@Tw6_j~coycm!z8N=F+Fi%9*1R8LGNSUNI7x8uD|u=q+`?>6mVnA8%#rDuyDa@3^e zp%uStj46(gc~hSxtw7;JZNS!T{x(!Zg*`m|fPoX*5%p@psYhoD_4YBv6*p39tdB^3 zeniavI)tGJIqV&&og6f_RyY51V~$79@Z7%WY(cFkH6`Qp{87xwj7CvG=Wqd8E_{EF zWW&Jh0Tebaj-FUNn_92v@nScB_fYQwQ9qp36J`-Hc12oU+x(#Ase1$P&ZMj)>$1v& z{p8L`{q*v(Jg9a)dtaA+{=3En;u~F(S}cy(oJ!nOaeQDnyf-ss|3HLl4A(LIvG}+issD zpBSxt1LN*F*FY71lMHQAc04VRLjB9@+A~5;BMqavbp(=pQ@pj5VEf z`{Rs*XGQaQtdUg&VmOXgvuQo7Da$j8>fOoxJx2Q^?=my1t-8AFmXE#-OB8{4fi)%O zhsWVl&{uXJW2KN-5x@%f2VM2*@u35zcB4&F>wJ!b&-dFJF}Th)voNqRx6bd7SpD$1 z9gQgrmcG#?W@Fa+j2E4`O_*&Zv2{fmyR`ci>RN`gPR6{l)q#~6=5OW?vJw0t+7?;5 zP>jHR)k{kS&1n;Q+Or;lZqpuf?u3B5Y;7i9_d(0ySH0BT2NcFE>#84l^zdOf{S{O< zW3qxHHGhHJoT&HFo_Xw3lDc<%k>V9gePi)W8XhG=wp;x-2yfLsDrURw#EGOf6iiHN zWIw^!s-#$~#i5RLKCQh=S=(#x^XORoGTNT>xC~$72urLLT?X$aevIT0QEM&3%QQb? zdT}pB+rj50T7Nx4zcb)1)^~*KtjxGd!Y@C&To5@i*6&5?Oye|EuSYr`zSBABT|vE& zbvcx|N>UUQaPV;Xa?R_ggGN_%XNXGW=F0bwie&Ls$k2Qtvx6jN_{pv2O97gBML+Kx824Ek$e@_Okf>)bP>dYHnNXCdgZw*u-yS5np}UF<=ijbF$u^>`g&R=Ws&dkI$SIfb!AOySUC-Y`Wy zX`K9hL(VcWTW4f!*QhkA> z-}wy!jfLE50Hvdq>nfdYdKTr(Z)Se(nV-_F9FrV?Vc*SF*^N~lsnq@esf8O{@Fwk`q$mm# zruDt%ug-$dGUHg#`J*q zGee0w6=;nPuh3$G5-Tsqe|w1K8F}j~Ydt5iwheLLFQf6z`7A`WH13PpM|SCOL|2=F z-}6A{igl3htaOQccL{oHe)#x8>BFeS^R*t8U_hU*%1v1wHs@;V&4B{@_@teIhJr~Lff&YzCWN3q1LGi=5HRMmmpLO(PhUYHvXkb9e87as;uf;24=$T+7GkV{*}qd=@$RYizTyjz0;`Y-QnCtyaz6VWE~`T; z|9Yi;hsK74aq(j7qy@RMGn&phrjix62t>~ zUq%(>%arF(k>IMPGH@QN2bm&v+O>(qFjP4o*1;g8?roo7)vXC1pkMuR59CvKv?^~x)c>X1 z)@ZMl`yua-QU99QQ@gh>=D_8Zrii;td%tJaiXYtwczFw;ak;j=olxOi1@A|}L;=OF z=4LBhC47>iyN#qDlB9<(gO*3Xy6Yf(yoKRo)Ko{q_f~@|*Rj0h)dn*!NWWLh^q$AO z@)Dll0smy>^=2LhW*Srr0!`A&@;{0&&b9mHkPY&Iou2BUj_sR!2GG~6NP00y#x-=A$cD0bpxN_Q?ipjnq*Dk&I(EF~lA@KMNa!NbRVEVxx8Wk3 zK$rT=RgFgfQX0$6Jz8|rnGEIm`b0&SDLRSK;oR_Lb5D1XZ9o7eP0!bx zc*$*c$GzJ3fA2obzbXUmI1H~i*(HnUN%m<}+Av(XsdN2f*wCN1)vw*qLi?r*Nr&bk z2bCCdGFcHolhQaKi^4r-)mlXpak_%Ad4ad>5*)M7&}!~eyAf;0ls8_AfNDDr9}jNw zyZK#BkH~bbhOWg1N4(h-1sOMXdPQg)+Vx3m1c#CXCyoUIw<~KOsEdxU13d@@A7otW zy~9oB$L{fI3_MSfW!fItFw-!p<_N+hWc z4_6E1bVxy<<$EMxP=M4C^Omy-JX(hc6yW#{IK3YxafvAvbxoZC1WGf%xd#H}mr%N2 z2HvpT0^Y3NXFB}aVF+A4brpD;99T%9?3pNuWHf4Fo(ELRI9(00p}ZKWJXU3@_T$OQ z(La0U=yWX&d~u0q1F&bH3zEzT3UK`eOzqyq1>lW$5%HmyK>?e*f&g$payYc@pgF&& zaViI-nqqxoBe^)HiU3`5BnAaI2?19;crXtcY~;^A!EGivO!}3_xcDv=)^R7lfu#C8 zBww};B@lt`k;zgz+&0u^-7PIKs_=F^Pd^1`i2HbtYVKN!!-g^@laDkR8hJtQ9+s3( zZYLLy>syPPU~ldL-vWPfLQ=6N^^hc&-lsk#<0IP7px*8Y@_5+ zG`hK(^xiFC5bC-!jGZ{PT+H&DWcB&CJJooV@8%w@SKl-CL)3DL$-P0fsV&n!IZmsS zOH8>2>z$#iL$>3IuB*`jZ615e*`=if2?y_h0fGBuptKh9L5El%fCYiXudsN5Zn{v7 zHNHxol5&iaq$c-%UB;f}<}m2xsx)J+X%gqi2nbUEP>Bb_6r01f`DzWduWR)+HT%Q& zFT1!qU#pWQ^Xaxt0#0%Q^hD+}TBXZ!EtNBobzeh!c7>R08zNu4dH5yVXbxYUbee|~ z88E3LY_{M26Q^5HU|zK9P0o}H3fTI|aR>C_YZ3CG$ycY~__+AK5t-=yu2LP|W+uKT zlTRMbi0LshNGx1)cx>~K`Dd1t$)V*n&<8q=Ns@q@<&$3@P{oNR6?^_gLfAaE*Z-7A zj@&%R`qe#$~id#Hml5eTq$3_kEVStW`d~%%ko^ zkX(qWCDC8XFUMzUsAJ8=J!}cO%KeuG0LB7=uFC)Q8UP4L=H9Dkloz2P0Jonv0YL&f z1OWf$$G^j7FbEVN@ar>Uz`={rp4VD>X-bU0+3^8yA=fsH(&uw>kpG8llk4m{fSJ0Z#&^c=7jWKV==lCaNvgMskNN$=rDX&0(R`AyI#CelYmK;xo1K}z6^G#K{kT;Utv8kCtj#+I<=(PgIo?H77q2nn!6!h2Hmo$ zQ_XhzaO+7$7>gdxA-j*76P+Y`q9&TS${ff~GtQ!I>blifkil%(kZ(R`+h8V6XW`8r zeV4`@+0yNiR3jYy<(vZ~_kBsXV+Agf^)C)kO^Hz^&SZlW54vEFtwl*{rywelzA|jc z0boY2?0-ZM7e?I*c3imk!|IDx3>rB{8e+)NU0D=6CI2HXr0nZL0VShErh}CU-O#p~ zj#3K68Ka+`Zq{tkD8)46i)SPaulptBcb6==D*fx->=W5}k7VwvwmlkL)A?3iR?e8J z3uUS(Y5kYq-bb(9{gbb?zS=^x;g_gx&FF1<%Y8ridYSPERy^K!UshFG2gcDf?TZ4} z+mAjN-#y9hwA1|LMAiyK!+9P)-=;}GSCiAC@{n@@cGdjL;*#$B`6$Y%rGwF~b+Rds z(KVgqYSU=Vb-RJ;9B7VDQRu@_FJG7HvIg2}O%7iMe|oJYGSja3G4YXP%fdSjL->Sc zt+<=oYOS{^G~(d?mUB&+uPmagb;M|%JF6@<#U-B;1KRo-n?9eyq35QCu&ZeLojFg( zPj5fws1_Nlx`4%_P?@#NPJFDV=BGh4zDKQ8$a!UJp>#9+)Ga>k@n&o9T z7kW_IobxL1XigC5-VMN^0>@uI1NeJIz8_c-@SxC_g47i-i;j0`8;x0a<5fcf4@M@R zC`Ww?|0#PyI$Vn;CP56`^1hR?f1LrR6SJ$6A$XQf`pV;Z)oII!N{9+A! zH;S&;Hr@?sXojCworIiN^dI2HiZ^Ce`jJYwU+Yz@L<=9iA}h znwWWz8lKb2?Httvl&2O=ujwwb(yG1QN*ds-#E5otVTaN_GKdSq9AW zhle_OWT5_{3(p9cm^uFc(ZoFX`}BX93+Ta(#~Gw);F^X@avz3+9GrCm{hCW91uS9cgny| zQlV;=xAtUTZoycu_&-@R{L}H#DgmKkZ@@U$J_hWvF`s5wl3ohHq8_{KX+V1?5%YQ- zDcUCIlWJ&HeEX=hjwoa`IqTOD>E6*T>%=h?pTU^|`<;^`4Qb;eUq1+=2^AFzzOkqk z7igu%uHi$nwV?=1rfZ&ytAA{=myEoWGeLmUq<`-?zgVR&>DV>o01c&lo-ZOrLgh{gu&+tE`KUlaJ#?@1!9H5*!wAVX zwytw>LpRtpIcFYH&nH({|V-5%-+3OGdNfzk#RyzFw$_0Q}*9qvXvZ03!o(g_Ul#WxLfnJ{7K*X(0{T z{u0+}0P&2#ZheoGA{6X(&?Gk{Yc?)VZ0vKIXC{{PrZjj*o3Yr(_bBPf+HBS1DE9VN=%nUrONh=K%d00qfZ~DL7@wu@oN1C zeo>{zwZ&XEX8v7z$%fimMI+d0mk}zwyKqxhN%0GBJ-?D9cWZucbZ`II8XLryYBC7< zf$2SCZF2i8A=nFdex<@w$4O`Z!%ErR4ZR2k*rj91YOB1(sq;xBn+n3q-diU&FqO1o z#7Z-!1o}SXj4*xoXe2$LF`*QwD6Srx)R$H*`sNJzqg^{`$G$-TuYuG2Pw6T@zEXpQ?Q|T2LSmq2JYm_o6h3 z$8NKj?|GFlp|UnZQzRNV(r~Tq1r=wtOm8f|AhH}pl=l4#f{DjkTPE__W}QZ3S6Pnn zt0k9?*^NbHhIj%i(pMwj43jXDs+CR;ZxeM6Z(-_({6`0@h>ng@rt9Vptdh9;A!aXr zdmoLZua*>(dr2MbH)+gQ+n9~R4dO;`0oj`6*o27Lw>nPnO8yu={VwEz`^TK|U6=#3 z%DAvW9$rh|qr|>;`{Yw0HArR&E_EGw@BWb8bXb&$bb^NlJkxSxW$gyEwjrl0UOfLR z_ss4I@lQKkyAxh{>S=fFweOLq>3jf`9(=eU^B~X*0RYIr@fV8+{@%M0UHT#Dx`SD% zh7(h@GGoX`@Dsy3+C1rez=NpWu3fk%NyWXNKYk<|L6ImZjRt0Q<=R+jqfD_D=E6c; zX(IxO6R~)`{H|xj2Rm28vZ6c?w>6oxfP^1w^{T(P!al;n?rX&;>x!Lg^6I3>j;4?D zehyhQHi30Nv=G{W4?V?8(+aGmL9{g!b^WWf&pIN+_C)yT9f`l7{)Q?Q(o&E77IKgIVD`ADN!_BuJR#!JFm_7Rd z5mo)r>$SGvRMa;Y-Gto>zhxE8%%bKp?UK0agyv1-H`4Y2?mK-#I^xg2rP2F%XJr+* zt)Nn#lbBM~)gr+rF@VsTgP*xz?O+fGAP z_xXvsOxzcDPJJqlJ^WYrJv0dS-6utMT&( zRrLe4J-5@nju!T-lDLPg9(Va>8J(qq2Y1dZMoPRQ)_$I^DBePNjmbS7aBcg%@&hKk z<(cZ}TswL0{=!!`` zv9JBs`}t7^%&f%h;LJ2+fjLucXZUFERjP#1-u~w=T0Mp(u?I(fA?~feo^|TY4eWgI zw<%2mk7f)Nmm6X6z0|(Y@gnj49>b!|L~I5w;Yng|($1BQHFtMP&t!L_NxX(g>iT(Y zL8h)5F0K!=?%K+#VA!)WJW@TjR9pb{EtiUhtiBW>1^Wpoe6rP49BL0nF?m9DbLAM(|bCF6V(Nkz6y_xLo?@&t0wS=kHYq+ z(n_JzH~W|3%rGrVwg`^^c3YY6f|dC?KNZ3y3iod%7>OzCh&)QeWuf$ai@(H5w7bMA zM*|HU^9L1gLT?VNZZ}Wo!-cCcMZCxL`l%V+R$%W*2j1i1z@ut)KmXlkT{jVY_(FpA zQ`5D!r>th_i{LjhbEfx89s>Cwz@m%OU8o6huH#3d@vv*!&bH0Av~4PSi^|%9PMaW* z5BF<;+6f6{&`@*5G}$GO`tn{d#8@H2JIAiKL_wfw3VKq|@>`My0ce$Z5%p=hqUcEb zSteR659w#!@WV<>*c;+ylt!?v>` zVvk@Zo!Q|V=-UXbE)AOlx!soj8FwOdKA|+dg)7=UA-I1!<(I5&Jx`YyR;V0#d=6Wa z+M&T55zcA}XG=N7cwF(dGHL6v-_(vLCfnBMu1$wU=YKe8S0#`2i_ia@pSI%gCj^cu zliAe6(JyHZXZ+I#({+b^XXSoP(`Hp8(%bP7r^xj25bA^C?)^SOiCxn)4xf6s6M3Fj zH`cU|Ha<@fy!hx)+PJ>IX|JoQD#%_eK!auvPq+Mf@~B~CZu$i0bTWMoYi_ERss>Jp zjFQsPIGi>*g`Ia}!`!c&_&C8~SMeE7!-+$K;Cnx@D=x@=HSK&u#8U_g+@&{r!~MAf zGR+xp&4uMb2TMV*0kX8l_bvQ`$A44npO|EBlx#fT@nwnm{gzx|8^g#peUBgFazi=t zMA@^y>SO!}BB8rbzZemFM=eM>=zzvMD-b4(JId}P)X0fG)pI#EV#CL>hG-wd^t62{ z92`Eu<S<{DFc94w6BHt9slb@*{&%{*na8wIABpbdl zT$Ul+W8-27`PPSjQAan$Pt-=FDBn+J4UUfSsWnhwgrvxGxv)P%(u#z)_nyKVJ=uH0O|*z3gyxF3_t4I{n+n&neb?0pQ= z0%bJz{Jnqmk_}ymc2^%hQG0B()fpsC2KY{NSu(tGhM)p5 zWefL{+5PlMeHL9ab_u*Q#Op$#VRNseJZJe`Zkan_Gxp?;JyTta-$^j?WEV`k-?dGv z4J)MLcN~y1oEOctX)UxTe;!%&TOieN zgbxf0Vvnj6zBY!KHwV=IlbRz7!2lEw97PfdCEOs15dEp zL+ZM3UIU7=3oZvK#UuE(u1Z(*=9GR`(!0S$e8&Fw+IU*a{d}7?zT`aJ=1)LqzRbwy zN#CDVBMK?$?TMX4t4A+Vj6^-1r@yQbfiG3P9dKf;=}?Uvn7f8ejrgJ(;nFL_>W+COR-ud+|Yi61a70uNpmxdaO6b&i?? z!9qA(=>xWa6Cym;~d8ejjH@cjQT|G$>}vyVXDO9sCvWttb3_=XD?EzjjV+U^jh z|Eh_ollH06Q;*!vmySNO)^HKGR=%f+B{LJdxcde7%@G!Hx;taWVWwt$uu)-xrQb*U zFim&ADjn{rBjux$u7$!qQTw%4BHH~3Y=RF|Wv+^=!g@z6kj_ zzy0^r*|1)x#upvt345lMialnT&~iT4X^)cO{#2TFwvNYEIZ{4c8$LzXtC*l$v?Kzs z`DMTtdJqhRHf?vt@)Z>%b}9~}uj{@3&1qd^fm`XHfer3QpR_)z^LLxu<*OI%!Fq|i z!Mt)9-wMDC!(EEL3PQVr`O9`k-5QQlheSGkqLzRf$VL68=GA5fZ-TIdrgs5r3)^zl zL$P-Kwc#^pEFHiR~lohQRXNOw~8ateQh&-aU+cyb+ z0Ncs88PZla)?AmQ*)*D*7#l zTRU^3i9be_8k8$q*Fx_uW+D=6$rHG*+5w6nG#zDCSrtK@EuhgHHaQkh5K*?bjf)H%fE;5+7xpTXm z9o{^l#wPla10R*_HUDM5bGjPhDwb`xmX$@;)j}~Suc@i87#)?Cq37z3&v98e-wrVT z@qP+3E{v~aM&B(eOnPc0xGAUX!Z49z*z}t-F4y=(Q`Ha*5z7VdW-8=gv&xUaKhb23ao(JyPnlq?1%E>D6q?hyyZ>l{Jc#px2fZo7z(t zM8;r@5J9dzniY2bC&Aw=*d7u5hB~j^qm;^X;lPtFw%q8wROb8~m}^Iw_KD(d;s;4c z86|z@2%XtrB3YZM@H|Aj(3g}-&q z!MK+hHcYia0#qsmGJvgPE*7+w&s#~(8h=kx_$%>Bd-^LRgGc^vj_j1RJn^(R8Xn9V zg0*BKw@dHaG^gPm;g`m>>)IjT-1ZFQL*{bsvZcWHkN`MMh#n3`ZJRGlI7ele4~bY0 zE_Irj=1pL(BSpA31o6j7E(;rvV#n9}^9t``uc%}m`=wQ;`e)UfH;bTgY}8HfF)|2U z!~7oH`tx|!adikSPp)XJC!3-06A{$HZjqQxJIJ)7I=lR~Ju_@4DJ@9$BwmWy?SPxi&SHXKP;9 zLtkSGb&jecRjaxU?1fIHjqxg5u`3D4jTA`Fe5Wd9V{d=Sr;9CpwIR)$EviatX~w7> z&$_Rwr84wI)62?^03*lbqNT^v1~h%r%FGvB6e=0}wU3{&B0G;POI2d>Eg)r9%Oe~2 z5m|`+KD#}5wgdMB(Bp-Q@AP(w6D>ZJ`2rR2s&rC%r{aTXoXV+FvL{>S#u}#iMk9ph zUzI;M?S=PST)LYmVifL2ENo|y^YIC5NBaD;kiAOiNeD#;ShCVE?@Z-{LKUHa!MiHw zOHI2wDr$G2E(qv*FcsGul{Z!cBp~@2T3|uQ`(M-7{ScB0MpZs>DhZ*5=%y*u1SW*d z&~3au^y3Ta4;!PU3DH#idLo6Hm22a-aozn6`Vi7;+aEdF=!7?;v2a{eXBXFGtdzb` zS;oRtYHp>sWSnUlr)Ik7k_4Lqw+OfV98gR;gFx+)vdk}cp8Om?Fyh;$1*+?UCMCV8 z#cZw|@Lt~~xfE6f_;AD^;CiYYqGNqW_r&Y3Qx#&fBy(AnKKi*R!85Zd)Z07s^YysK zYh}BF$4n(a4}5^^KVZ-nSr@t)3w+C~^JeBMX?<~`mJ{=lMWd(&z*p@+!htp?1-!BS zn=YHM1aW=C)Iz9 z!jAH4eE##5cbWP{A<%UN7^WM*)IpmnzVz&rjCf63m z8Z(t$9Ua#8{T+PBjb1WIJr6kpg3oc4$~Ucy5Us z8>~nx_DwdZ;vM-gt(KmhrcXs*Gyy#vlt8^TfZK}hYtepzHN1DyRwXRIe+nGbd0r+5 z*njo6r}rHQ3$NMCxCEXEiYztW#pfmB{HE?vMQ)Q zo`Xpf*{0nemTM3ZgJI?AU6`b@PBnvdXPqCJ&l@zOeqY z2ROdJxUkQ_@n5QF|KFg6e={qO=jlDJDgE`D^}Kb3D5Jem`>+sr+bX_rq<`VDQMqHi zb`SY@msyzs8CRQ4^QjtJLZT!_Cr!z(UV9weGdds*gFz!4jHSBYsvz;D!gg;F_C2-1 zqunEuC2`dTzhb2zOlMp=m;0o$Jp8v{MU1v92}ZEIfkp-emryn6tIu2@knu%nAuViH zgwG?a6@n-+Kug0od%Pj8+7jk4Q>r4f;>%{%%VJG-)H}V8b8UL*`fOZqy}$i9o@l30 z`73MbM*`h2;g5wXPf!&Pz_Rb%p}P!&i~HWfE^ocIQZIuZtY1Wz4Brb74r?N~ePZ#4 zkZsO{(?g)=wlvRvmtVN_ksg+7H1%w8_!{|O=n^~k2{TcV{kRJ_$v<$BALvuv7gXJ* zvYTqab@|09j8B)_wBmB$F|KjcJRLe`oE_B2wDlxXVHU8dcGz`OSg|MWsio_a7$h?7 zy#qD4+Od8;F=gb}++3x%zC420lkn3VAEiGEtyjo2%O9xOyG}s0qcSr6` zVEj83E^{|rG?h_8qHjxPxaAR@uu~5s!@i-#T6E5RP4(ftDQ&DoQ~$3(TiPXwvIlDy62izadmNq>_NKG6frjD0riwu%-5v`6(jV^4OsYPPY#eO>4%N&e{weSzZJM>bsB;tXd8FMi-@j`YI$T(;AMa<6j|QA)Wrt(N$20 z_}ARa;~666`>J043%cY-wOVZ2{kN)jeP|3*Ss6HWu^#O3{lOrwHQ7&9O@?V@zukBf z64+08&G$!3iY4b)egjiHLpGjIs2*>H#Z@elE*Nd?@I9r2zwz_ibWh0%ZH86M4Bh4J z^i{<5X^fop)alMg8%v1UOl^`hd^@J{t=YDngeK<3C(>!siFoU61qplpv2Q@T@qS6G#wt- zE&8+=iEcdf#rqo{3hf15LbGAJw>xWu^xi{o6`bHd|+4E}I+iRf&UiKTD5*lwhgNmIs|#;1nhwsu!fu zUhw`svx&4%&BtFVf^FR1Zox^Z)G3s9ocE{o$_x?M^k1f?Xbmw5_hEWoC7-bCJ7g6& zgD`te^9mb%cFZP`%-27|>Oe~ZnybJvBBb#qqHv%L*5D#?B{HD#QOG)D30GiIdqP%H zT+Uk6q^ig^T3v;(|JL$XRoQb_gbQ`w@Drt>1#^p`hme7?R9JDoc5x>-LF`W{S>Ntk zH<(_Sv7RaRRVIJvj0qLXNw(rRAO{l`Y@z-bZP8y z(CGih1u5&aswA=RvvNqPZ?Si<$9L*2jGU?W!IveLLgFNPA41LVRl*XJxasyPU)%f~ z(#hV(t)cI)=}{x|ujw%Lho&dhUIYF40K_RaV&2A~#-#9h1ns5dTtz<3?xSxD`T4f@ zY@@S;MqCtHxR(v%ORv$ce|vP4f=bwJ@#!%_WEJfS&0jq*Hna!{iOaMuUtG+zE_E)$ zclRfWv2$k{zUK69WA=z1o1mg{IikH3(!(P{Zs-_+N37{M_sdCyvhXP$>^(ky{ZcUm zv~r{NnJYEcoVV6t@KRAzuBX6mRl_MT)YjX4cF9dW?54Wc>kf8uNNP@DS3}BeP`~XH z_d5Vu!yi`LY{k{ZcohC|#`a#?P^Zlbb-lK+duf3oE{m4xbUVOJN2Ph?T~RRfpb$mt z{b_iN|9mGnjyEH>VY3-)GtAkfIeKb z%>^8+iOGd9@?h$*nl?qO<065=bEwBEvAXOXeyWI0eaV7>PuvT^O$xh9xhBUkt-p19 zJgq|6!KKDzj$VqpPGOB@W8IL>__(6Wswo&sD8x~L+kC=e;g^aEL(x%l9DIs6!q%{l z#L{vy<5x3z2o^_QbgjuO*E@H8bl=ypzx^R`78kAs^*hPQX{VK+7@;@Ws_1U<&d^MMSRAW+O|5jn_xx5)lV{r|4^-B_p-?*U;sJeYsM< z`qvp{ud>UER7LvYi$*8~g@CoyxBy|$vKF;vXex@$5TTp7(YIu0{`_MZ@mK?w7caD2 zlx?}^L{RwLEM&hu7)&eKi@KajF?brpSr+6%17xGB+W`L8Z!76CVq^h#?y~}HHzU`H zbr4syg(g$U(*}>#sij~Mm*abEiSk+i!4bF%h%QauQ}3HCD(BP`q3JSlrqct7>fA{L z_sm7XMq8um>=?j&CesCqY;EwYsR0uc;eS=p-STpBZK`qpSbK~<9*&iON9{`0R(Bz3i9b^v8Ac@q*)TDDoEenA6iBZJexxp$$P>pe|jucFBu;Cm{0 zT>)cf<)1$bp!!C5`64d|IFYlPUnK28f&ZDueg#@~e;Sme{N2;51W5U+&YY4$e*P#O z&_@H35qk!-<_I8@UJR7#Tr>*2KKgft{IU~zzESfD=uKIEdx621s~gfa3d41R7<{bb z@|{&ckXIQ1ruYFho9VX!zPZX(%cPnmOfZu-0a}F9TP`^Hf7gQWPwAk;0F)M3)A&2* z@*2L~Hax0l3CYW*gA7>d!C!qkjXZ;AKjMvMpI}}*Up0}p z^iJ2ZoSVy@yKJqSP%9#BEwk*GL;AeM`ohD@lPB7lGzhsfgHg}uV z>_wg`y^y{<<77sUN8j*^f8b3XU7BSD?*J!N0lGHU_K(%+ALKVH7?~ojS1{xIYumEv zj@>52OD^ok!e$NCY;fhi^{rbkwNnc+YtxuPS2h2OAp%tYs`)J+2B2@Z7zFIV&*9G! z%)&gAH2;P!ccpywHjR-FwKsqw0=cvH%?nWcpMFLiF`@@*zS{G#ajJX8pF4(2@dL!5 zv^oIEGGC8pqP=|I2n_4FNiTl>NS8wl+H$yPCKJ#%V_Lml%Opet)Fi)OG)Vz46TSfO zzjwM^AOevq6QMSqf!HNqFna8O-jUQENI)NNntO6R6^mY^p%Y%H9DHyg+6qeG^xEL3 zruV~NEi~#duBu!VDITw}gWM|SE+^nEO6?J>5#fvxn9$bZUv;frrJm8E6v?P-=>@=o z?$KWiW`w)Jdpu&mrfT=Z-L)%7%Jn_FCPNly!5gl*l$#@fjBZ2#t4%A|r^|dwjDO?- zQ^?~6uzRKDGvk?=H=c>!(s$YWH2IfBqOw@KC6$0&vOTF`xVA8hI*z^@1w2OVw*cN? zY?x`KqJ3G*CM0Q8xq!ZqIfeQgY3K4)ahBJr{DVR+8zeQAq?JQRilD`}#+~_7W z3YzV|=Iuw>@RS*^xvnoGtas-L$7GEs^H|Nd>|{(SfXz|9F5@mwJk+#J{N~rH<_$M? z!?9t-yDx_CQcnv>w7*5L+J5Dxy?5{4Rq+q3D-Dc3Wf25Y!e=RHHqG~p#6NfDc0GDa z2d*mB2^~qKOI4INP`9)wgf`{*T)hp^e(AEB!wNyL28AkUB7hfitr;A^TgbyXD;|Vy z+H4%vbKiLQ9xG%JUA_#_es?@;&Ej^ZWY+%}_())WSRKNp#nz%As}#u!X^#2l9;ig% zS_%(~73W1O+2sxI#Oq8Q>=0T-9xveYs!gxN18LG^IZz1gdyNOcolAi`6PmCmw zh>uT0Qdk#8Y*wi!)J-%KhPjJas|zjF*V!4HF5iQ8m64twhnw=(CBT&Tvked7?G+wT zPlXd(q5~oP5X8?Pz^)v*v34Z*KBn&e68-fSi?c#(+@|V)pX&Nvn}<~2X4#dLTI;bd zE?4chKp?7G$TL}83E$)%o{2FztDTB;HQs;i?U68_#y&jp>om!LVEbMiqUK06|LN6a zNUUgOL*0F{Qd-C238lTUoF6Mm-)m@dJRB`CkAay(j<3vI5lO1A_=Y5&-GEQYpG(a=0TW3K*&6m~hH2VZR5_4^n1_;;A~7_g!O z2-kY1w?ZzJfhi+9#wVaU4TrTgJ27)pw ze!(9?XiZNORsR7j=cxG>v7g{KF{ax@5QL z?T9R7G>P_`69j4!n8{V1x;Vd#QkKiEsU=jd-G5=LkAbayU|4T6|T z^|%;gQ;(wltHo}tS()1~r;b>cox%Q)=kS92sugD?xkqU}MOvH*Wub*@e(W(`LQ=o0 zED>f{cr}(5uX(%ZiB5Y=6n;OM-YS*Ga%wy4~NhZB6JCm1GTwyixe<4C#HM}Se!}XfuEm*5 zbp7cyy$6k2QUl)pBA6Ri3-ZN>%}4?goWJQ!6Tl&B|5o|Dai-c zqT74Ft}vSQw{$K@TVfV=YkpW)1Lh{;I{?p%ZP0~~SNDFtbw7#veuE2pd8fEd&t*DZ zR~v~g|F{>}3CJ@=^-R>ZT$SX`rIi=vz?Cn1CA<(nODryppjo}c)oAJ42OIHE&zz=7 z^yfXn#DhhLa3_78_k}PM=^(X&rKPM|hT#OnF`2!VvcU&R@GOUfT{GzW< zlB^7D)XtbN=4_4!%+m(f9n`*B-{c?vlt!mHP8VU=zFMC127`a-?w3sp2rj_0#Cn=L^*?j8w z*UDK_$InC-5HK3S24mkYZ@uQJ!45$v-UjyUX4l{(RzVCzHQZ~P_NJGUAHRpVujjmj z_VUysRAYXa!wrwe?n)&qYn@bA{_1?-UK@BGIg3OI8SXod^RPM3S$~!smaDs<556Q9 z`+)RD?o-;c#e1e=Sgs}bO~^Pf=0X%_G3BeDgdpdoVFXeH&$)(Bd80pvGhiVk)#muG zMAQK~VZ1BF!TGRcK?lJaCV6ouJw%%ABmsBsCGF{F;Kff`ML;wSkGMAfdLpJ4>bf0u z^81wQm!_C|IcbjL+i-^DYpZP+i#(yLu`->?jZr~lMYRAhs(0Zn^hpaucUkF>%Osdc zJDIOeW3-TP^Byse$ioh1$95RDAno}2??X+>T{ln8DC5}fuYCi$#PLHtlk|GcW&TfE zJN1Bn8FEIQ@kDi$8;W3T69IH(0y=-alxIbHAJO4F+iSwtqgqFKJ6T75#M7&78M$A0 z@{-_fRzvX9Pu@K2z?9E^!ldR3Ul_Tar(PEh@U9@ROyI@!`?-LVs8rLW^G;D6G`ch| z{=}y+FfK(E!QS(SQJI8c>qamE_XIH64=)tyw~dsq-epq1@t=QwMExFC8S@{PlemfI z>a~<@l?d$Xd9+xYVEi}B(-jsF5V+}f6*9QO;F&45eDzYRA`AV7UlXaI-J|4<%13;B zuTB*f!peMWDP{tP}v19lt^jv1Nf8TP0YV2ATay?Faogr z&gwH(GTcP(pP~8~zc&)9`VQ8b(-Opx*on$7U@(W@_*u6dtysluCi;Q|z63^1N5IY7 zqV9!Q$L$P;m~gbds^qD=pJLDyu?O$rIp4S&>&vUb`a27d^H+fP4&LmjPs#$D%8$(3 zKGT7Wk+x-ukPC--hw~H6xyz}0a%x%ozXGc!@u`2$O8&+4jYxIms%rTbCejwi>}n$# z!a-c$vX=ZB+tNV4xgO+9CHn~pkdh<-@E_%tcGvmfGbrzzM1UJG_j7D6|B zO3Lr=b7Zv!=+oTwS|3I+-75?R2v%}yV8P-{;?X<~b}ZKg?5?}=VJ`?*|A&VEvj-EQ3W)2vr)A9f z{H|f94W()90t`~hHMgV>9(gDMX(n~}z1 zqgDEkdH-u)FR1_J)z?a~jMk3SAEp|sSHQdWKgthEKlcH_K(ZOId@e1RM}zuFYM@5? z9T!iDp*Cg?#;<&k!K1$bbr2^OsFCKA_(TdImswFj5c(hWu6C?=?Y{I>C9*w&T4h^h0-*v#`_>BZxU4S*qQO$w!~3 z-qM*F*L`Wt(Pl>T7>g(7v<}GnlU}I8e-ma>Bz~Fu(~B0!mt1CT9{O$bA#>6?<*JFX z@vp;>Q~6k7m#4sE3;^u>@4)h(h|c+f^1txELn(eC$nd}MvbZrv4?akhZM&)E`I573 zsuPF>YVL=yCi4QuP5WK2@r;sN`XkOjs70v{Ro zP1FBX*mZ_AdA3m$5Gh65VpAGZ5DCbpBA{RpE<_}Xq+u2$1Q`LuGMWH}6$L?1W{g0f z3~5lHC>x6*2^LVpkYQw%r7Q!o_Xz0|E~)L;uiy78Ka#xf^*r~v&pG#b-{g(iKbbD# zcuWDfIsY6* zhx2xcfc?JoH<}45U2D*oz{N*1Ayx1rZ52Kx2V_1#MGR&u=xU383Qdko)I)~UL>IDO z#oQ-X2vbmRZpYfD7?#8?wN4KUWxM&rD+n}FdjL?FTzk`_F^FZD7i0^nHHC58*MgfH zY3Hc_n(-t{yTHx?>0{rN-hBbFRe81TI^ex;aRT0JTSL&BpjRidyiA1jGwgq@jB3tz z>YTY<>J0vnF-|&GwXBAKy%i{+Z*HA{`qtX0ZeCUg(bv#cX?XUj+%DZrC8E&q<+Oq7 zyO>c)YgSe4+J(>5Bh5+5u^GN0t%@3;D&x7H&d$z<-hD=Pmb%}{1{4G1{*xn zgiI?JEO57t!99w+@Ar$JJneob3Y)3|su2x-a|(_O;sZhHjYbnTK4lpD_j#kgt$~mU zf!o971Q+W*n_Urgk9OkxG;o9>erq=#7d(Lj#8|I_-LTGaz{)!Fp8}Z@Q4Nw)Qi+%e z)e*o6apGS9z7tu1b1JuXwEB3k3#Z<555nG|%4VZ|OBatbB84$mz@6fOi^A2~beW46 zhB5n(vACC@8M2?g9Bv$T&K+g*umhvdOI?WygvvruX0A)2?cRRd90aIIoBuQP?(7K5$U!9jKHuVUN zD&_~PdoTB!zU62(i6+~C(ow-=sf^Xn_6V{UM)k8|0-7LmtNSmX=<72c>laqZr}Kif z_#tANOTuyYm!aKr3mkgTnpUyF^Nytl14|(3(GL=E+#OE&MvPO&3B9Qw9VK6##5#AC zTJ0+=y5t|0GQ!I2_R9;N&QwzxWN-Q!m=6cZ;I^W*yIQEGg#5bmWZHMi|IETt2GG_b zgKL+M+N8n^hf8MIAngLph$nWQ>>K`2aCSa=Ti?)3F&%?m2SqhYfiCghjVf-@pX5|boJa8=kRSTx#HIJO{GH& z*w*QE^RJCW?~WR244KUfRzU_z54K{f&opHQvB#}oeY49xkiowtd2VAmUag-V54q=#JpHA6w_S;V5dX*5$0Bls&BzC8)NW=xE(^UVQM}^LrdV5^e30ypA2wN7 z+}D3|d9E=HdfAnze-Dn7tpzaw?Q>1WINFD=*H`xT?B*nj)a<)eeZ6qJtBh8y>N_*n zIE~9fjZYCkE9U%Z+7A4roiP)f#z~cRX^88%Q)hr7q$Vn!OUHO;JBN82f(HgK_U^IO zQH)`(Dv?r)MzO4ulJA^(zr~v{Nt%_d19go|hr-}qGg+k6+WX9+4L7phita0nPCRkY zss7X{qHfHmQ5k>r>4pc2rYbBam%6GOGCB%6Vbhj4yc6q&UZ z@t)hdu*}Aq&Qnoj+I~SO3Vq|k=|WxNM?dKHcPpu9P+eMt6U#>LKF-fV#CBnQ6eN?p zhx6=Iso`ftDXGRN&3>Why=DR7Z6TB|l-bM~%xNTfz6G>0D2BuFL`mL7d*X~i5m&6y zg~Q_=wr!TVa3jNWohPNX*(qW2BhO?KYVWV-#|>!a^;k7y2aK1}q}x@7!frb%TNM|% zwIqfcU72I3t#XpWyumRW0h?^YN6=XSKyv>NUVK@tDTn$_~ih_hRNJ+PJhxE`LQqmyZJ*X(%DcvC5T_Ppj3_a2f(mBI@P(PpV z_qXm{?|ScD_s@6MFwe|$_Bm&tvwQF75Ui{y{p=~xQv?KrXCN5~RRn~`^auzK8c`kr zcTlsRlL429&SD^S6yW89Vj2YeCUlY1c2To8cX2mzGDEPiv$r*4b~bS`GqZEHw0Ai~ zY8M88nD2qaoy?3}tnBT`)vavJ5Y#PQ$=TV+)yy2o*FJjr&ehwK(O%-kP=WrwceGo*&b}J9gTr^G zOQs>pqa^wDmR4*oaarmgZsw%=g_TLUMZHRMqwz@f9y+WWTnAq6P zFO%c{?coyh^pQVT*{)mpf8gK6|8JvGG(}}*ZcYR2jC4u8%eJa8{Bji=uUC$>)#dvf zoZMM}aM#Ue-z^>NZ5zG|j&2Q1x|>zscIUaJ_xJPDtoA4h@mYQp7_-b ztDg6*LOQ#MGgpUb!rO^m$8y&d8wogc^c1`GCYSFvp#5d~3t5aePf-UB&c^ukwcU)A z5?l|5wC*k~;zus~*0m~^-6N4Itozuf(d4o`+)3p|nj1=n1Ee!dcjfMS&;4#=!)6q5 zkn7`xd!O-Cn`=L97BT2pLD$z=I&l&{m`Y?GQAE!4*i>Yn%h1J}_+T;j>j!T_x;xu| zw_Z;H1gd?WijWab09qjJ?9;&py|E&M}BmSBZjrfxLW$X zy{+Xx2k1wTqG0EO38~(~1KtM1A#GZ*Cre@o=j)r*CEoT4F2WhqA`L^;8r^&A<{Sz2Z1 z4)d<6iH>>BEqF{oMti>O}OK{li>m4V%+M+N#TXT-$#vbsDm_eLZbvgQSV;4bX7CD=3;733;*^oRO}( z>QQtIzd3Y1pS8dyB{k4I?<9jqwcoC@;=&(AQunN`H(e&&Dv9k9LHw@P6B`ejcF`H_ zr;2b#gf8^L=PZSPO1tQAX0U{AOn`SXic05!Pu`Q@N(ngXuAla5r z3QF=NW3BCFBVfJ|?u*F$)sl8BA77fQ3^@M#uLE8az!){YE@-<4gvg>Wsqp)m3vN$o zYuel&I^JD!Ab2urR=HkVyZG#~x+tcIdlc{@B)hbKErE`J&m`xF0?I#@F82AoZ-flj=Gw+>0`JoFl9QJkRF3=Ns{|rOu zjpp4bl=3(m^?u&8C2;7Y=xDQcL+xEnjh@9CD>Va;Wn?058||zXjbcq4T->9p%?wBb z#y>g;YV#~RJDULqfaI@CQ)6lT<+?Xp9T-h1T?K}D@w*@BX~GYh58188sdgacN&p9W ztVK(sU|?9R{fPEC?xUS7H_Y%n*aSw?-7v**iBJF@tBQwCJTMernIPNX|YL2hAxj* zi^EzoEy;M4u7UWOp+KY3@xLooD#r*cxXQLE_-RPXCZUgUE=TWF7 z9#;QAeK(TBz8YD@a(% z8wtKcWaK_rJ6pzg=(tFJP+@C9;h%AZ!RIMCS*#T~iS;CPoT{dO#?Z%4h?VKb%PJKl zxbVv?rt_AM#s|r5sgcwBbwTj#dxBHx7Zh@2Cl8)sGC1QnlQ`_dzt591%nv5E-noM(l9@)MujV#v`k9!lJ8}c57|z zL87K>Si4eg?NJM-7=_RZ3YAu`sCF-f?x&KH2$R;BU&mTgsPrVx1r8H@(K#bB4Kfia zR8*A9H%62VT19;yU|~(7KBLB5LV4dhJB#Dn7*B&A2Pcs-oC{5r+~yQqeLLQC$Ai2PTgvL9)7E(NFw;Pr2O5n_X~x)gT*%gm{v*7_H&{te0V6{zDcCVP*!Ck zeh^B5BZOt|N-*^Ht}M$6Dy&>is&I2*2BTa>x859u<}gU#Tr5>vD8Yd>Pg~Zu{*{OA zl=5SFMcnB!{Q-PKpAPCoJ=IlfIQ*i0qQ%oW-D`)QMj=_^6~V(ylirAyqaNai4-nIR z&voF}kanleXFR`VOd^lIqq1TW5%u5Qj@-r7I`7v)Vq#*%K%ggghj%cM=@K3BoAZ57 zK=)lum4myH@%6r)@6RL7RGFccx1JMC6e!VRqC};p4w@zEOI;i+ZZEY8_}-kG0pcMY z=IeF+D47R+{Z5r--Mz3_=hk!kY1?CXRY(R+&Bjhy!O1zT?$shxi{r{d4lJsDxOvt-$2#Wg6#2%igM7l5D z86`T)K~iBe%MQMohdO<2Xy8p?(f8`2GSgraKHngUX-Xe1Z5=T_C1(6`y|lS7TYuc8 zFt7G~w%MM{(DZQmbSt2x)ex{-FiFf zmoGn#j*h-t75=#gF?f^-bB<+n707FuV^*nO`@;e%`X^&kKgr4@2#MbMa@RZQQnh= zuLgNfc3V4aIW4D4N)-J!hUn&qN}_TXt}-Gm$6?tF*l`HRyFAYqH^&*;%Lm6!?GJ83 zEuEIHI2*ToxD~!ggl6$fZIP~=%jotP_Vs79si83J1=oB8QX}f5v zp4>CN2CP+!nuR5z(Rp+FYuUd%fA}>fZftB!+Sfl)1pZ~I)f;IvM;b%3^bPX2gT-dg zt*pSAT5J6Idiw&ca)YV5YOk|*_XMl5hYAbd-8$FV%!&a#y**io?RVKp)^OagURV+xLrk~KXU7Z*bxLOs+ zs4Rb&%u}Wlv!lG3MmY4P9o&D0U-z84L}2jV|8>-~d~jz+M=ym$R_Hd~+j6@)THp3@oGs7<( zXsp;n>jWZ<D!PX070|majuk()x#zYbd0$q$C>8*O#TVlsgi-coY07HN1+Z0}Z0D5~~&XTVq zL3dNMU0vj24^3^PWZkIw8h{3-@xSw_Tm53pN}t8Vrn!_6X!v6^-Bzc;i`YM-upxv4 z6Gh$Y-1PP94kL?6lH&1(qVm|uGnXa3rq8nj?YVwj^GBo=&2L#d4Gns#dG6jn`rscP z7!aVUt$pb#4xba#tT zbk=S|8Z|dC?D#tDps-xft>>OWQ_I{i%EUW}5xDxZ~`KiJabT_s?$0Ve|3Wq8C6N88bwF$<*$DN*hc5_>34~i<36~I*Vdz zS|rowPSavD8)N2l#^XNDYSR~(ZS}CKJu41@i8?h*2;8lmW+b+aVyTv4gt+eqRE$<> zL2`0q7*M5)uzRJw09a=i-r3@#1Xn zn%+$@93LO|mpys-0B2tWzr2Mu-Q(ln;9%9rre8VzVF{i7?8$IQso8okiK3D096!Q2 z4sK#;#Y4;SuZRL}5GKc3mWGrDO@)S=5N)DBEmN_REaS-dtf;hjF@sWr$F)Os!zVy#{^m$Tt}i%s#110sc0X&Vq4tW-GBjoW^J?+qP&+4Z{r zQ%L+Sv}o;)CpPMf+7_oh9uQ>2Cb-{yO#OVv@3hJl*4p=ZvwC&kQ(0B)JheW!W$XJ> zDA~}VV@(y13fZP6_=kyj)L{C}ZbxI%WK(ok4JN(l-1bX8>O2h_$=2GQ!4|H%!%W!BlQpCV0ZzIz0)&zVUoAJu$ z^4HS~*gO>812}pr=T`v-7QZCVNt;AYNmJbRC`w*iDY_53Ix-FQXU+SbfCx@V$?ON2 zn>PUCa5Q3OIBv0U)6!UT{czgZD#Lln_k`~b?tV4q$;`*aUb5Gm)jBu68jY-XciN7) zg^l02LE=qtyeBP~m>`+5v25mQqGT;^nuGbgmt_s`;}AWpxACq;j#%-^mU{HdnKq@{ z?-1T&Kfo$f!-=!C(AC%zNxLPp^94U4+^yQa>uSF|Y3D(Fm2JpmxX-ZG zaqgPBFy6Ji&&srZ`*>-+=t-!@uO@Wd^m>bt^xI95JH8S!JXV9jZeY>cS6S`S z8f+0QJ2$tsNBAzy_QDyqLzInL^Y3m*GNFwHl~jy@CnF4tWv-oCSEqg}hVtM|j{MdO zK3K*jzIEGz!s{_%1HFcHe5j$)%FJiItF`PZZZUCjAhvt93n>>_fkkxB%^#ZnO$L=f z1yQ~wugzcGYUT8SH}&t+Iq4;5llGHA9Av&<2Iu`cXcP58fTxT_GAw*>1b9SoL1p^= z!u7sui0pxR6@ryy%Ot~DeaKVgn!~zPVe3My7TxPwSdIo-FIk%q=oZ~hzd5r2i6#BO z5;Qb{94>_>+Fw(KYQ?sGCmTblo*PMq)~HL>J&`6bB#i3pJ1$PLUz9{7bCGAe6DtX( zZK>xkZ;nrNrdxUD4Sd6a42c}b#!#Py1IP!zbQVtk(H&J(-qT} z@ikC@{zwL*;k(G;!rh9tN+2WG1EhAYpm#86Rn^%pgv03jL-5@V6k=rBYX`r*D$#3< z5jbebDPdw|jePC@C_358CziKpX|hl)I3mLQ+j~S;l8}g>#{;aJ`}G*<;&1fy2Jek| zjnxE7>4wjLaAPJw8?W1s#*anhvDk;*YNQs4v+lC$dxm;eqrXL z?`lFQd~?#A`swumsoq;^ZMHeHc}1{R)_hR3`XfRg@D2Kghs%^TfpqQp!Qw!LQK!d2 zm0Fb&blGwwDQo7(C!U}fnD5KZ@w%J2n&}89>+W+0w0#}2W>SELB;<%G^YwK zoQ(7es*|905c%`^Zw z7^MH0;y?GAJNFH!|NS||5c^-5=l>V!-v3qR`F|otL;ruKqXPYZPvcLzBHVMuscrT7 zmEpu)-cYd9!E8&G4A(xWl6hCL>Hqa(p}9MLvyL^y)KwPzD6ulMNsL^gcrt3AdMXU-D)vk z2v$ZY+K+1+EJ(E>i#*4^(;X;dry|)ZiW1HICMN1jR}jTf4Qgpy=Ay!}FowMvAQQSY@W+RT_1D&$z4K zckYW$wDDruSI-soj0H(9E+jh=06_f!;UM(j`ci% z2w{{h4CwTAu}ypt=VpZ9MmyNa49yGOJna#wxPyjrG?zAI<`3Y_$qw!t zF&{qR0PUvBuZ&U27mpp3B$Vjahw&BL=UTrICAB&%&&_m{oBM2MZVRWtf0zwwp-93q zLuEaYX}wcC(D~B4GL=G6xeziaiUzYIF(^Br2q`Yps<328gqtIFd?w6=5-YWTbM(-@ zU&D36iTrP+cb%`DHk_&;n!}QdcBtcMJ@%DXO5P)87CRu;hx184c9x2T>Z7_(%%}uB zl*Mzlrjb2`X(qv_50hdObly~06FMj2V9jzxL~u2-25NT1j8l;1 zm)h5@n=v?KMlgURaY6;|;R}Oy4~|&-#^Ap70Wp)UL?>d5Qxp*={jY0+BjnEMY2W6g z@`8VUyd`H$u)w1FWQWAcD8QqBFQDo|e^jYU_Ct=OST`9RbzYG+)Zxoy1$-PN#P?#; zZFlJ9Osp4XK60x4)bv&_#Py1gL5(jz?s8+795eNH%drFAs1RP^K=ny_)?W?jr}ZiLa|l4>U7F7ufgby08ehtg4Xb$LvgQd z2W-1_uae@79N7YGAi7<1VP?4XyWt_!>mTN2wn?2|kp3ob4##CaL9s;3Mx- zHs42VE2U;(I-Ie=PjIy&14w3yxJAnKzSpWBl(oQI#n88#F;||iTJccE*VMS9u=G(f z34iFK(^l0%2uuS#DN$Na&f)<1fgct6O0&P(5nZHA1?fzi%c-V&*3>MWyBsvE6K>c* zdwRYH$@*FRmZo*V*gtEaAC4$6B+hi8#`bG}UyG|Lwo&QSy|L;BUp>O={29j>glc-y zbBb(3cc(F5SA&Y6%kE(UTIx7{%U{kk_(*Ka!)?AZMUXKaT>5rDrEswC2}Pw=qKUxc zs)neA^5&Qtod-E~5tK1Dsu{lVHTs6tLcaw8-I4ltO?E0vcBB+dV&Y@JWM-U6hv8qPW-Qc`8;@%HVpE&0t`~%m9I-B=vm3qq*^NX*n7tsQl|3mebZ( zx4-xw<5(S&DZdbSy^qoE=s4Wds_JUn>E9yPZUU7iRWm}PW_3}6NgJ|@_g1b6B{fR z-63Wr%;MiCEH`{@W4J3v$+SFq?ZIJ6zuuT!H_fK zt|;M}V&(dvT0+8jyUrBvgG|6XdH5zK)rqjseb{(Eg_WanL_CcD!gR;)o(}wcQ}>nl zAhcYmf1U*>+$H~;NCW_U-5dT?%UvX_H-~@5Pf2QMp@f_Ls`xbSO!M0*;eVj@Kb)wu zU4Df7k^j7*%>T!Cx!;O=-zB#nH{V&hJ;l;*o8k^Ft*?Kj3H{(9@2{4`MTr}5=a$PE zYr_T)>q$?4OBDmLg`oUJZ=%M${42_|)3@u;czwf`urY|p;3Ts&u?b$`NfjM}wvazu z+`>n|4;9dz0{!8B{Aa{c1&sEa&N;klB?FhA)6{1DhkGo#G) zLQ)tZ?3FbcI7nqPVD!4l`-}by0|g|{+=BcnC*=oE*aH2$e_iL0?CsaHr1hQX#>^Bj z8&x8C_`Z~Q6j6HrfJf%aWx=bI8Vj=32oS1F>S&;B0Ec0@Z^%r;FX{jx;qd8wY4!%G zXX+wtz&1lwro!2F97v1D8#9ibd6U*R+}ov&l#hs(Jm~$~d{?YUw!R}x%!yA{a#C$K{{U#0qjkUgBQ(cF zm>VsG--GZ2Cs-Tav#qLuZk~Q8s->bgqoZ8O`5-u+kjJV{y^6Asb9RgIyFS53Jr*Y&{p7@TV&6;MPedav$y4}ZGtBhn z%%7qZ%)9o5?KdZR2jov!_scvw%$Rw@ewDbO??Zfu9$9)#NZcFcuxNW*`OB!x?||fy zh%54~nIKTrH6Cl-*I|bdf?*rxPw75xq=6cFk|I!hISx99a7wPY8ta#&WgP^0%zL6Q zXCL4h@}`P#gKJN(y=Cny9hcO>?C!Y4PMNFU<_Y}7nW7mDH^yl@uU6v_yO7@_Wzg2G z$3KP|*(yGS+%cp);n{S&h<#<$Prib}zBy|puSbxJ5M%?5eS8SYwpPa~ynyyC%#dL> z^8457`md$V1wO&hd#$(i*H9^JH$ptH9{drL`FAU6--Oe_%B^TS0k5guI@Zm_r+ERj*b;I0uP9Tlxw8< z>W9W0@BYt;e6hP^{!g$?28Q-+vMrV#aAUj}nYiiYK@Lq{9#4F8e9Qr=Dc(^*TCUkm z@0u9%)Z^ffpJWV(tugbvQG0|{Pn|XvIZOp(q@zR6TGilThc^lKknk6r20Fnwm;#M% z$|FmPM2y)REWR-{DK?h7fJ-mGZO)^laE4DZH-nnZo>P(@^u-9MSzYwr0IvU(Hv6Y= zKhH13TJA>V#g}i@xQU<6#T@^%MYC~TxZ|ZtTU$8L7-vI4oQ^V>$!H&Wp{Sa}L?a>? z`}QuH$?FVc9%&;tx61LQ8dW>3|BKFY*q39f>Ws$tvfac=ydpo{l7{4SglT4z)y6*g zq+gij7@xMx=A)4xACA0oR1?&4ho?3^uDb<-q~X9(*2+1; z8uop!F6^6G2E5HgMzprxuJ%OXiRN%py;l6AUgV!Bli5_OYTpu_iEcQzEgZ2d9Lo#F-6yB1eSWFLu z>CAq30ssOdcLnvJHr(XJ=jnPp43W7bh#@2DvmRMc7}qM4AL3QiZ2-mO+9!S|ciymg zP6$nMLwpNkk`k#8FDCPjaX0jgf%tvtUF%iVk>f;CiwU~DK~t^AuQa`uXU7hVQmtOb zMgH_cQ*+8Af01Gp$Q$Gq#f7syps29I?U0kI+6rd0)L;LSuYM3CZ*12Z>263ia_Owe zc5sFEbY_qd+oIze^!T7yiS1^?L6vqyxFK&RL8Cym>HDO9;Sy7BIDf8@uy8ZwKa)RRh0n2$J^!yLFGE9rFlXeVh0|2= zhBlsPR&hUmV;DVnxjUx`_Pz0lVem!;P%?(HX=gN6wgT({Kw)>4-nvN3}s#~c0 zv}#$?c;8fo;BKBW5f5}x(Tv&-^pBrV=$E4cecgV?SvD)(8yz%!D*qU2}e(UD?ZU>*$s1vv2y8w zWc?RGFKN7Z8k-r0k0iKIEjq_tHcE!`?_-~K5{dTyIs;~iNMK=&NW?~;EJ-7DbsHZE zQ_QBA?&ExQB%CIu?Fdi-s#6baL7sbdj}k=gXgNQ=nnqZb;9fGUV+>qKMU%pScXxPw z{_HXzFMUu3JdF}amRj@fx#OBMPO(+w1|}YnY^T$d+&s&iU%CIymjEsX1=9fiFQVVq z)HiIJK7RU4I7*pR#w9f1=*_K*wA{tXqJtY*qO}?3g@5X&xtg~z>YMl zkDy(=??qAAN>>Oj=d-A|koswkBLsgFE3=8M#|_2$#p_8pU(~`*52vW9`eespvIM4% zwgkFlNg9v8qkXB-u7T{xM<$kwk6x>miqGQgStCClvo=5^LQl5l;Ul*uD%>!|5pvk1 zhe4UCUE%TOh|#JRR+og&k8SNQdkQ>P!QlWYfyfw_-bjKOrq+um6_#;6Fu~t;OrgylRz{FZaDR)kNTc@ z#jGDb?%6nn%0VZeq9VNTSuM`2*b3TLSs%urkl;qA;IZJT@MFFEY5p<%&3Ka|ep!TH zQr`*t4;be2ViBgokMSqtvol9en?9==S%?0p_GaJtkRHY`Y~CjqOTf*S_Q{dUK5?bR zshGn(HU%R(obu=B{>brD`pl-%p_l01c2(}N^SsGw^gI`|pcoekimtAUti!_g4S!t8 z)6fudcURIzW&TF>FVc2KU2y!V5N&qK_-Db1jy)|&Esj$ZtaT)qKoTzWaZIL0Ay^Q2 zz}MvqQ8=5dq^3ZA*7p|NtL8pi9EHhzcLLa+c^SOZ7tId)fv)*ctZu)8?E0bbmj=c` z%KD0hfm<#-g?0lA_M_IwFB8VN1qLxLGtdS$G2@e-%{T?Vj)Y*Fpw5Psh`|i$fMCB)L@n3%aiZ0d3GDa zo-S#Nm^#!q858M0a0v%z(Qzy|Hup7dF6IJ%e6@VaZOf>TyKcd@+4&P|zW5EwB8%ln zfG4VU62=;n$pS0wE3Rr36d*2s{L#K`koZbprU=BsCL(ifNON@3{^^y6%!BpKg{Q*l zeNk*D+PWwYv#k~xk}Ht2FRQE*$C>XF)e&M2+YdI(yGP4xQP}haCXObM zbL|*lcB?Hec=h|DVrWrG{r;gV1YEaLQu?(ieX$emJp(Gz1S69!K0tT%;CH>8q8-OB zs`Uss(QOX6sn~MOw=bN;l(JmqQKF=;OVHR+L($6;26ehcga?txfs7v>kF`?0xZ!d6 zAceC4o6z&Eb1Q~bJjtkKdX2JiIEn-&c6{d?bDl}n&+lk>_@qAh6;D}L5B=&WPn)SeFw#?#V0@^{ z4O288yp(P@)uAI#{q&(Pm-Ere^@(T(D2((Pm4@3IWNd8l#!u5r$21a-2KFX`K&yf{ z6h&g&^yfRvvUlc-rQ|b+J;_f9!NQj$PQjV;T;hax{^LBY-&e3@m=rA>BOk65$u7mu zGf**crcRTrg1|O7{;LdSc4(oyeUY0&ofRF0dG-lhyQ2N9-p`S!Tq2EUDBGz#PGovW zvqqk0FRdo%rURSd^1_AKUl)<;RgDt=Di|y>p%k9Ai>z;1?{k;Cz^5;>aQz&Dw$yVu z_Sht3+nW-jB&BDOhdC1=Xm2L)2~V#oIKBwTh328pGBC5}3xVi6LBYrkVU?ZS9A0az zNl!m<9exY)F3;3IGS63(r9IyWl&$w{Jt&}BJV#r_b2IXZ+;MyV^^NOl((!6BJ!I-v zDh=SYAkC?>f{B+)=i^&K6sGd?-hzab?s|g%eh`{cTG`Q1s$Rlst8&i1v?lvj6wgZr3$$ zb%3Zivf~rIe~}_yI!d>We2XnZ7&r*aVrs?rPaP#!7B^ZL4!PYffgX>$j=7SAQBCpJ zd&i%qRX85VtLAvKjXwN)VnFc$@~-(&0kv&oRwPibf+_&2*|!3|?JgMpO^6g~HvW&(2k(?2h&~gx*9_%l z;y^rflSVWZ74@ji|4bpiwK;0h`+VA!AcpEmkmbz#t)S5+bn)J=mWRT18+(Pjuc$!d z;L_wkh${*$wZ+jt8J8HU|6dDIiZ2b#I?Gy`BE)_#al7jtV;SK4NByf`y@VB3*4vxl z#pOVu9d3Y;03>p;yMLd=7ze#Q>i2&l``%sneN0SKsPv!y5JODK+70@%$%-$2r>TJzUL}WQxNmeE+%^SE{#_r(->yUfBnEh6U(Z(ovI0#-&weMu za$~=_wldN%jPO+tivfP(Jr>JEf9q4^RcwM_e4i^^2`SN>09TSf?c>3KBYqDToI2f7 zM)_wr{(B$p_l);L{I5^3{BPG1HT;{ae0z} zNr#pNsW5%i8!+jb`)BU!gn3?f29u3VEGbgpJPLcA{a^=cJ*&yes2!Xht(7Nf zNnw{o6JU&FCu%dZk2*GjjKTEn%_)fiy)oz0>`ygEOyrMtX; zqug0!;N|h$vb?7yl@hIu$@TZWrchuvw&@yT zs@R!VK#h+wfeffls-uC@(<*ipfnr)C1m?MMuN#JGJaIi!0?%g=!jO4#<;Wj2Mw7+v zsV0fPDKTE(dp=}iGo8?YAga5PY-?_d`CK<1OhT9;!7d6|;CPDDCJLe%=@S|wPCCJB zzT%2UXMEJ`dzam;fR#j!jnkkXrrEzrypmRbZc-jXVPm&GRkx0ZInx{&AU%7#wDP=d zPUlx`C&1{B(}-Ma?xYiddE1bk*pv7@@fu-)>?=%kbEt;1RgV&j1i; zyk57uu4X>HuU{=d!2* z@S^!QjHZ`+P(y}1CO>IP!TGDery4PtjRB1B5#neUqsb;>@$Vo9d&SeLA z4~C7L!-0Cw;0R@y;7e}|GaD!Yx2CFQ6kq7rNLhBK3KlZ+H3xSdDupXd)YWF7E+m7; z_VY(E6lbhIb=PaW-?jc+6U?>v#Hy{c-DotMgxrlW#2MMK2}eM*p>hQ!?Js)v~?zMY*uWJJ9_n}`fP``0>M*ZmncN9#*pzfDjQ zTfBGO8kT1tf)v;MV2`w7I5g9ktBCx!Ts;1M*KZ)nZpC7M`Qm%|e{5 znb@Yjh#6)6zoZ=9sUQP7+GZCILR(1(C3ud;yVdJyT~RSW_a2);LsG>4Z&H*JmPWPO)ExY5_?Xb32^Xg(v|Q<^6B^ zIzS!oiNpJcIHy493I}msEQov%c^vYy1u-l#n403hd67GU;(WAf)ZuAB7l+rl$-?ue zH6Y`?*>49;zP}{{Fp{LdbvQpwG(Ng<|7YBRHy0pt*$m3W&uLSEM@s5UgTjbxf1V}T zURy&%x)&!#>O8EfUJZo&Ugc{GCc(&64Pe z_fv9ZGX7MJ|JbZQg;4 zKFAU^4<}oj0ate;Y@)1Rs5E7!FTmlTbYZx%(!UCHmY~-4#3qDS(m~u5X=7B;?$e^P z!y4Kwp{oE&z0KE@sXkE`9HD2gGF`$%t;AEfK@$spxuU3&G2?6RVjw3+KVO&Gm)Re; zmDx||wF*Np5PZL7QEt}3R<-w>ffK91tLuTJEO5!h*s>6)->;&m96|hj9}^Xa9{BcN z_-F7QVkSzQgp6mXsL z62!qbIJq&rpv`2m!{Sl}qV@yBaXo$=TR8V%n0|Ds4}hz$=xU$yd_-DQfWs{0)3PAd z)C*32Nt;QY0Qd;0rA>r3LF&T+l=~iIqS4QR%NCLoYkWjHFNZC=N~Sz#>|OWP!%7t> zozRt-rKf$%^cLqm@cXuqm(;*@^s$e{N0)3+kpP2^YF>F5H$T>WGlJ-;a_&RmdL5J$ z8?N~K76K+Qz0~7BU++Jo^!{M@=S~p)@0I^;HV*OrgMC-q8!NxGIP+M$CQaGpD6!w| zQJH_&_HF6S_H3<1KJ-qT;V!_@^H1;WV3X?K`}_88xom=LKhXzlQuU`vg7{yO?DN~! zeuDqmcB+?ux7}f)cD&$NERwl!yxpf`M(|Isu`Z!M1S99tXkynot_8s+au?*n74KIF zY_-r|dcN%?-L4hMNP_pWSuMeO*8kF!hUMb^MD!_QFY!pST~v$k{|y_0m?_um7@IzG zE*jL|LyFcoHbPFm`g;50wO;1iTnH9Z*UP*s8b?y&=@VeDxuCn4ZsxKtS)7Riz-0&| zGZG@WWPp{jkLR+&F>qJe*K_{WVcT#`kZzlf=pC%!n1q2b}hA7dyJ*< zf^K_J<9a2;grQ;ZWzvM}Zk*Ni2Ch^dKqC|~$$q;=mmgYRt76`j@=Z;yL|-(i3SIcC zR1p$B1Lk~EI7JH^qTd&Jkv!b0PQ*4iBM($qdwiPJk8aT7S((+MQ{QkFtIo^zt2^!N zJPmi{=XYwMiCA!G3a#(U`S|3*di@heqS>$dZeAXMTQHP!_Y(BGsonN{3)R%rsuv!+ zS-~-i*N*e7_u}Z2wcoNaQ2<~Wm|rJ~bdsY#Y{>E#Tx zj>eCwEauig;kVQ2c-5dJBpddm>?mAd52Vh^$|ntOaI+W{T-?|0hH`4wQ>zi%s4wO) z);zYb;-8&Z&#y?nIdRN7=;QLT3R^#MPdl&wJXg|Z(29(JknsaNu=vKSS|7bxvW$7) z?AtZco0GHwE|2#Lg>64BbY@l6IH_WHgAftkZ{^4kmRgY04hH?CQH+J1eHCxw3-FJOh^mw6F|T+LbvranmRC+I~956Jr7lk~!jN z2N}+Pw672UXdtvQiEgXBKE;#jz2^5i{oRNi@w-HUn=eHea@3tdbNi?Cch=kQ-klXT z)(&k^b4d4ze zd#w&W3#8lu0kgOb7C)&A9qMPSQ{RiJxQOd{e`_0rpi*8Y)ux&g{q|$&^&rN_fchX{ zb-qOtf*dt8Q{FXOSBDeiP>USQ&0x0P|IY^CwPmt$_y`Fx((SHYPPJia#Nl3){Q`u6rQ#6Mc{9^NPB zQXuvi$2!63ghlOO)MZwXMMF!=3O-27=^i?;WqJ?u=Oz65HVstxNTbwG!@B+;Wrw5=saQr0uzp+hmuUj6kx)*t9dqFm@1=QUl zC6jRI{zc-wFe9Ah;vI`}aA)3B`&ZRcDrEGp#={(M&h7lELXYiTe%Lwu*Ah4JfkEG^ z6@yg@Dlft`%czo0)ZxmN=kOh_eKZ0R^gq)F_p!Riju8Sso=e~2(oZqfGb=&RYE!MM zHtC@YB~q(mf95BTMlPzgnY-Xz4t9NW;+D4Xf(Ziw!9iu^Fgp zWuB?y4J{v!z=~DxX$7zstwQ}2@oVITW#g|FU>cN+M&*-fUiF)0H(Ri^Kk4PgBQt)f z?P3%AseR;asRATGuL(GM(3myJk|yWm8P>_2u}pExUfnqdfX|e(*ux`$|JZ@)4Av;u zEqXi+0WnX#;oSF5eg#wUJ;7J>{M{Voz|`Mbr){=AQS)ml#jLz+a-mVla-l@yO*_=y z1>mgr4bKB5WkCwh_$Q5{7wxplgv6bI^!=e*;q;asfMg}!*Xiq`7x4-|qHjte>KdHl zZ3|1{(_eZ|#c~Ch-Ix$V1M4RCAyN%kcit{7&JXi4wftGu z`mwQlYJlD*YHFzWxy=(WH}+;N)Nm-xmR-l>FR42 z_U#q^Rz94VbN6O`9UW)aGf=&`RyBS)+AG?>9_Zi|EtwQC*0jqQp;-UI$qKf@qw(rS zFsW09x69Qndsd}TyDwQX z`%Y3c|H1N;^?W(!#l_T|K4t64k+nrS3g-{c7UdCQe83cw+jSd8vn%JM*=tx0%|W>8 z{R&>@xyB{5=;c2j2Gl7+AI&J!=HvOZ9$l9BMGo1z_Zr-F!S|?!x31X^!NKJU8O2s@?|-5oYBjqiQlLm&JN@va@0{mJ!e;Y(r&zW!-B^ShdKlAD19+ zFj;o!jaCW%CayELS?bj;sg+?V;HwGW=~yXme7*q|Z0TJ1PB-VN9sQ`5NWFCJ4f@x* zlZhK5b;0Q@y_^+*>$?hZa*$4CzUA2x^H{>=<~6Jn^b`x;>4u>LIJ|u?TDxS$G~MDI z5}$$huK%uok->H@j|9;qhk||TCf86?)_y;#P90S2XYKM5*bC58k2U@o@^V3^{ql(= zXE;f0;yw$2Mo>32DK3>6Si&f%iG7MLv0P0JhNyAF?$TRP<>6Rw^3!`s0)<)Ch z7=TCL5R6ysi=|p$vet5pl|27|=ZT?ZtsCw#6pp^`^qKX44CxRso7LR5kV#9Xmp4Ra z3(4kF+6uiWjfHRW;#O8Om7)FE;$IX=djR;$zM;}783wsm_B=9WJZIl1iEHw9G!zW= zs1tuvdPVs~I;d~<-fvG^k4Vc8=b5(J1Sb;3XMOzmVEvqjANQr}L~YDTW{pLATr`dE z70tb?_nzg!lvfTo&OD;N*bVlsv7KFkkrq_k*8aK~sheRLf$bjKF2m^Yy-|Hbu-XKf z9<_U`p}?m4?v`+5S^FK<@O_BUN9!PJ4ZdzF63|yM9!TJ!I>Bw)&0=$^@Ws(mmA8N= z$x9Ug^wQVKeJ^d7Atz9j?7EBAjKfP_KVt0i3Yek+(66$Nb-+;HtTsM0wKXW8s{y*v zuq?8Em*iP=+5;2kwBSblp<}mqN8ATv0yimK(-rbt z!7sca+slb6nGX>%?T?DDc~~vs_Nn}nE3p@oZS=cz%$|*5zhe>!I(Wz*R&tQae1jWV zKEZ9+TccBzH?N_`A53EAxRLB*)vqO<=&5i>yU5XTZxAy>MQf*T`^o~r+zS5}d+#09 z)VBSPq8{ZaD#wNb0v>77mEJ*-61r3Y0gseOS6XNxC`VALBtS^0N|PGtgccR)CG<`} z=`~UVgd}eV&%NiK`~AK*-d}HwH^y%b24f|A?Y-BUYpz*7bFP)96AF{za5p+va=vN2 z$qS}i{3(v211VR}NVP0puYS5BqvKJ}6)-UyH;=nPS-oH<0nBl?xII@|=1bR(S73k= zpH2dc{wGbcK8beGcAedJQy2VKd@T2LL={*J2-N8b=_;%C&L}7_w>{^!e!F5J^K|zK z(!E}Ar4xFqOU-06;ock@iY`FT|NB|@#_t!v-pjpMPv1Q_Y|m0dJ6t(Z)ggtnQLNwRQ6|Y$ERuz2Ht(8;qhG|#U1EaZlk*;Y)yC}QM z5@4gW=rTZ=sKP&57+5=ZV#Z=!ycg|T?5C4#D5e$7$_mkL?`1tr)5^iH;mYf^cPyR= zbn%_5{R+6TUmg$>m)WEBk6mj`$?OZ{18sIpE}GAO@;-8KzE;o$6bD+CDnA+y1wpQi zIvAJjHq@G~FxwWP5ZBu!bt-u#Si$72#Mfj$6}+|LF^1PLPB)vw_(YC2IJGxJXH!_- zWTsaNk+XEbGr<=DrtO|v3a4p$N@?*SwkaO$skfy24nW-D?5W39Wu4C(W&QHVgQm?a z471W-DGGSLlj;n8j;(woWxAzZ8Wl6d&vCl^sg;iPR|?+_KK33PK>1-{-H96(0Vjn# zou5^Fbza!Oym#cz*v7+bUn?fWuIsUtVu=0Z#=^%1l0tE=7GQ7R{MBS7n!720+LBrB zzu`MceVVr!TbGAjd9;~-Bf?{Km@rk;_g+TPD8r%>57p7(yV6?WkT6gC%$=;*Ugwt2 z5>ru7nJkU*Ld+MBaC@L_3GZggKh_y0GU1%=Sz+(W2i&A%2Q0LE0f{<-#~FGczoc01 zaCM;%4qewC)mg*Un-Cf+3H&zw-Bx^gw?HJ2b*nR}C4V>d*FdU;#jyGvfM*tUjH1r} zh7}%-#l3T2hd3=z<<};O1C`MU`HE@TSq<7IA8Tu`0c`sf949gzr|>wgs3}`b1RiE1 z67GWZO<4#|sBg^X5DlLfMrS9eG#Kx?nU3|A>RiF$4fkUm7qMKEd7V?{&Q``UZpyLJ z7>a64xZ@J`WSJy3&&WkN#&KxxBdri|_9Z;#x&#lP<`>OEC!G9i93SWAyzuvY$nHJx z5pYNuHiW3%S&|ERhZ{ykmbIpl(o!ExS*+m;hNBZka8h>N zCn@hm*|1JzOg8i$n3_~YdrEGkT?fI*jm#zro6gq#4|CJO3qG!hxwbg#-1=_$!L&)= zue=b-Z&%JG@I;=`c(~K99D8szOP~u~$L_r(osL$tW>zG3CP;_&eGO|`MauDh@V2_n zsc@R-cOB>2tc);wzFi{UpGn4hlR@XbUPSas=RHBpx;ecq3qYn28*+A>njR3=0ga%g zyJ4OcZ_h5RJ;!`?S=8MqIIPXy8@TYB&I@bHZHnNiyO7z^Fz2uih1V%2*xDp>QjZnA zAnW6F_;jIm12~T@Q0MV1{WgxOb{{7J(e&2ud#P5NUOQlu_DKMeJzm4q-CwUCR$^JX5+SwGk!c!`$?Zs5B#>)O z^Pe8VS-M3Hb9fvU1aMSL{_d3mEvbCpxy789iU4V)2Sg#ecTBkwwZj6-$Cr$$!+pH_ zPcGHPYU?Ek=fUw@^3+b{R=R|pb|vr$kj9?qHTe&Jr8pn>6`09H59u&zwE0#W8Jn5pd4FEC32cdEIcwtw zbmVPPr-kQ)xJ`^zvr9~Y<&`T1Qh_zb2N>2GB}=er&XpDH6ifQJ@=tHHeJ!U;`bkvc zVYQ2$nwVyk%zBR3_<62`FzbtCVL;_c;CvhQUJi{DhnkU04k{JUIWMQJ&1`hTlh@MS z&u%$GTz1xsnuro64duG(p3c36+HOJu#%+0Dp4z3x#9YU`;g-2CM4v*FuT$1NT_**# z$BQHMq&$5lvVtg)1r^F&?^Xic_)`GXhyy9IGOcXLKmNL|=hQ-v;@r@%lZS1M&v_Dn zLEi8`$!1dThG0?J__JYeTHbWLtiJ5WAlDD9t zHhi#nyn{F(rBG1LjV8ZdUNK2dFqFkIwn*%lkDYo0By?N&+o<{muSz?OC#{NJoP>PMD3SOn8h6`3v|6a=gbj zt6j0Oxh}edPRtB)Ntn2U_x>Z4aU^~@G6)wdBBib-t`_)(;I5btj-`pbr`qD{jBL4r zUg`3+t!-!?Qs*xtPVH2+r+hiK56Hh7K#QI_|CEw*Dq%uJ?ULPIWu=f;)(+!rqBSa< z`NL3JZcv$b;pe|#r2w}V88PYG+HfPw@p%8ekj@Hn<2rHQc53Ji-_+95u?r2jfwFVz z07Xl6PH7xOUvD`+Xt~uVI_l1zyU@XuFg3NPTK!OpF}pcNr{Pp+Utn!E1~y6u4>LlC zG0g|3u-(engnMp4$}!~$skw&-xco8m!kdF1#u74vW(A@-#hR zc&b=N(Z~5I$vR`0l_oS3(NC^Zd{Oy&N~MQ$wG_|95OV*v>$95P3kO+rdqHF~7_idG z95pU~^2!r?|0gW9c?XTIw`5k_&2eq;juzp<=z{n&5r8h4MxX$1$mw0LKu=`wPHl0& zh)rIRo^~`&1en5$QRnq7DZ;YhKV-t2K}`F;ffI4|BzkE)i*YD8 zLye1K9T1S`8~g`+K9-%W3lL)r^*5=${=YoRSNf>ALaa59?CWz-@cAYAr#}ZLRM%P1 z?scU=*7b34GB_{ms*SSX%e$GE=-sr_VPjq&nLB()~vxf#=3tYBdXsc z4%bIDPP-1TIMHiH)3ZND%Xml zp+Di1kcY2vfky8QwB>-1#f}SCkdqic(Dl~_lh*YrDl)rrz|9vyZW&ljif0#VeF`x8 z6p`YHctR+~<)ErSKIhQ0HfZc{&AJo>uQ1#)BNSa+H*orOt5@Ek?r`h%futUVlMbMT zoQJ^F4{+>w-CUkFkrpeqbF2ipz0ad-H8E$wcqnVfH5Z$j24ySZ**Rp{)NJiP7 z0NqFS*g5WhVj+-lQ{kkx8fxYIpGqDdZ7na;x#ny7ii!xORNPxd8`Q1~4<%XE!MEP_ z3IGJVN%nx*jcl#a5i*Q$3>md6WQ!4 zcHU(KJD08ifiCY=i`%!9HeUA9F$8OjQ=P?0mvh|d~>u_1ZQlu4|4)1H~e z8C8R|*$|a@jq~83quE%{jJpVZiSL1+{yuZSYi*qtXLot#{_uG3>#0nHz18^GL!N7wzj+3w{qUp`<|2{ z?b&`wQ^AX?rW@$M0|AUpRQq47rUI>ADMyL;0QYX626JgMGN=-#b=&V>u(t!A{gwHD z_#G^nYCCtI6+l7?G z9jm^bo~pC2k3afFN88XS63}waBaf-GfDu4_zI~nHhWuV6Kye1>J+(4}t|B*$mPKQ} zn4QHR&ohk~;_^JsQef}favNKq&0)uS>;Q8YaX9@u(EdIK(K&)jw|x+G++{o|l3>y^oSA;BJVl%;9lFVV_hdAn3$zR`3p5T62$Nn|qiKzT z*q|jg1&0VemWPr&{d@+_v*ulTQpxdhpZI{iPHu04t{E9+-K7+X=O)cEmlr5~H-9VM zFH)M5bE}6l9=HB%R_rbOeXyL|8STv^Zd=Bofy)jKVcHEMiJXOvfQ95;*m%FkH74k; zaOx192>{}G?fB$(bt4*uLH?fh!%i3-K~|Q4G5?<2L(HEMal3JHo9=~(@#WrkDn;1kB z5)h#JCndX>J%U2;H>MB{F+UWNjb^Fq%!9M%MM8Oh^G6K~4~ZIR!pd;gL%))%D$*^& z-`tS;ZU2E2wbGZvi@#eQkiR}{pR{msz!ZntrW`BU@1Bzn z?klL|T*Ykojtx)mXcBNDJ;4F6X#U^!1yWz^K1M=qRAg(cx%Sz=tfwcV-@$O(m7RuXnjUq=33`u#ZZN5By^lS%yHJlPJd zIX`4#zQ5Ynas#BDC_85p&(WMQfNm)m?C-!#D=-h$^B+_QY0CK2@Hzmo&Y>YmEpvx9 zQ)9qwxZ}w&k(s%BU5>{g$0AF07A&^wLq7bLu7^rSUufcKi}-7iIaHr=Y^`{L%_+pc zwaj`COU-!%QmWPx{Q0V9q6KOW*`{dPh!H4wj&R46*9<4PppspWxcYQ{M8UM&?-g(w zqPmUO3&-wCp{-WN0G~Dq%Va+P6LM(zTGi#==oi3)o>pO#NkQ8mTEqNI%}?998J87TanIy`!+ zP0;HrCFFj^6wIh)y#DCcU!I9Z#A{t+rBPFinAeyBsfim?t41S>q;Ty~!Z?dBjFwwG z*oI;of~`bX{Z!Qq+ZGO*Q$24~ z_nM;9Z9R36OD!u?{qDp!AIY?FRZZlVRvmtt70&G-aD?Kq3VAbhp7La5>qOg=`I0K1 z8!tmorLidj`7O_mT^5LYI5s|0s}k~?vJQQSA;0tm$02p4YL329C4Nt%Yf*anUufJN zD$xSu)!aSGtNGbVRrjwR9)0}H_{ggId5Picu!zh|Iu-JD&IVY-^m5~m=bSviRQ|0* zPDe-pb~*IQzkBz|-*EmHz^sAnc%oV(I(vNUxTw6Hd8cV2-HCCFyz11|!kvIyU#+}1iE!B#rw>B*Dx`wmy`%mHm4?`^H#_

eTlHxmOCm0I$DMbF|2&5rgI~T^_rw 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μm*K%fgcqG9r&B*#wcyNMWHOLs|ryMH|T8`in`c*bQWr)m8IQ}FGcg} ziKE#Li3U1~)Vd_UbeS4jdNNthcs%9=pN?>*=Bp;x{c@#0UeCffuVZz!p}Nhmxvlf} zW*|$j>irAlfpG%c+a-BWz~RRk&8M=Q|KHEH1=;l5aB@_zf< zW8XdYz2ly7?!Vjr)?7Widv;YlRrOSN#8-KVx5xy@FfcH0r6k3aU|`^+VPIfw-XH)^ zc#kuHA26?-K1->*0h;$4lW^cSzVjCiXJtDxXE#GfQy6nwI~!9bCu2ubQ(GqsJ7+Ll zrx4JI>7|pXqp6{@rJXIAilvPyjEaQ|89N)9vZ*~8J1aW}87ns*D;pmt57}2aGAU)1 z8I8Uz7#K1bDKQZh_pIYpFC7(^=fQK_sNOdeaeUvU69P3gGNf@=#M-E|A|UJ|T(zpl zKfh_|Y1x%)shRB*)#yOzTRavSYghM;T3R+tzi=x}b?JzRVve!B#=;l~SR*aa2`wu| z9e%ubztR|Y8~2_tANMrt$h~YQO6}?C`7HKND-18Ig~PynX{9zvbP?e%jpu7V6~#;2 z{1lP!&y#RCYUzKTP@w(qbt>6AhWV9{kg$1-@vr$}O0OfZ{1>fVUElmOpi-E{e)j+E z98I>^MI|M4Ku`Dce%#8Yn99!QjH|1wGQ7EK^Z5#0U`$r~^-ndmwfCEmEO_iDZ(@a? z-J2g{NriLn?(RMu`9QAc7h7DuHCOU(wdIcTOgw<)pLRWk7JXigRC>&Tpb$TrRPEwGUI zaLxdS)2HSIy%18Cmq*iWaW?D=$1J)LWcOv~Mf9WE*pQ%aGk{wk9Xwj}+FR{&JCX99 z&moF=qJ;U0!?LxFC^Jk1w%;aQoZoRfwpMEcKUGR7e z#w0%X&l5pr>hf=&?;eHiZS4f4ppQi7x?VMny{pIVM?#yeH`@!p7vK91BnfwZHi8a* zZ@6{2&xYu{bwNI?$?VWvUaeIPV9xT@Rn)m`734 z^*<;qN*496;?B+r`ql`woYAI*p$Sobw)9KFc?y2)jkYX&&*`!AmzUp@iTrHPG@&3> zl@9NF$A_Dfk+tWWMx}EJ35i;>u?%G4TtK9?sx4_jb5_(`Tq(O_nKM;}qTW6}usqKD z7zYOjz{XBD*l3TMaipiGKb`fWH?_2Eo}9>i{fYrI7(-0S!V;_eQ+}#kyRi)C?&11K zv(s1b^z>9+XE0UYcc{D(BwZjLU7@8jpIO=Q@LejA#sLbsg`4d3^J{TA8h}27p((A< zCWkHG%T0oD9xyG(_@(BG6ar}Vf_v`r{8Z)i?6PNNQl%Usyx^V0hW+uiWR#$g-_jk$l){9tWbHfV4kUply6(v(* z^`j@X!urLa#@x2rrN`9U^seXT6eex8ay|ld?_f2SPL*<>WpPMIl%EYX!wB=`{kPxb9qTa>mOv@{KVVEVKEAs2*I_4#otz7N1 z)73;S6wvm{t(PPLZ%XUtv+jXI7&>W8WTZ^`MHq=^_#mlY7HzIKmiqkBO%7m+D_y^I zuEz%l!y0UsacpvVokB17Ca|%vK8uLJHbe?PAt50-AI>77qobn{@pK)`{Ip!Eqc7L0 ze?`W@arx`@6XbTS)?$jn_xav@APPUIvs0MEY?O?FArha%%>L=lp{>2$V=J25;_q+# zHQz@j6kO)Mxw&Mua;@{FZU##YD*KHd z_O~N4%sNe7f8r^5z3*6o&nq+@jDaaEE@n6Ed99hF12G2CX*aO6F7?K9-dVS3&flaTz)bXv6W zVk5@*$weDk@AUf4+gozV3!$SibCigoA@DO=v1u|N`g@<^3p@eBb)%B7sb#|9hP}## zkgHk~Ff^d69|g8#?EweI(O0s~YOtwPpQrN);`BtLzWTVg)Rh>RMRYMEZ)CmnPLl50 z(-5$j%RPtk-7(q;=4|>uLq%lVxaw|hI!Bpwj8z+lrvZ`Ghw!Rz5#Ry>0*)7J!`9c= zt%#My#0qJ2Z!Xp?EiLP8Z904R4-d7RX(!EU6)SVvTQY51BJ_RlLyF}x)wI+d9ocCW zau^TCN@AFGTQJ_g|B@@@6aM}ChYx;$<{Yeb3b%V+8v%&web$XQn(;C6=483nc9jnm z0Zt}`aRclJV{2B93300pvbZaKm_pWHU zF>&$fRyRAXIt#_qM`7rblWofZ4aj4U7>7x#4_)}_>)|z^@xU_r?=SaYHEK+d+P!Xf zhiG$6PFI?LYd6N2=XexP<9S`}i!|DR zv-#Dv?104sA7k`%cV0BS<^>iEeM>05*5MNo6~%a+F=w^&vVNz%ansA)F@c)}4JhYdZ#{Kj{|4wg@QJFKqMMVE6Oxv(10Riq1+cU9la@XUS3enOwJ z`^Hg?b=+a{P6#;cM6td-Yq$hiL)>WZbe9KY{kFM$1^r+PxK>hr4cFFAuxO z0=00~qDdcG)!N=o#q@j**T9hJiD2}s=bkBRPhY0B+bxUGjlB6tpmT3!q@MF2qf=`9 z?0%u1pkRKPtL|yQKu5)J`wC_x_oSzlFp&*k7k{qyZrpcI+xyPSXr5gZjAJdEU;UGC zt#c{SX^-XI+-3JJW!t&CSIgSp!qLg@yF2&ir#<0RUUU%=5$h$D>&cGq~N$wCURu4|q> z9y?EX^`BF7M2ft486ISJNFL|#VOCnqzLZ{Y_(8Lx{Q6-gtruoE3DwT!;x4v}a=M&r zNt0%@6VAtk7ds#MVVE_>b=2CaJwjGSCj4~a;o;|&Iz@iAO8R)gMk5Ny4(!@R4*R*U z8~!%;&Fj`BK08=!FL|1b+i22x(zB~wA5(IHJgnYw9((F58qHaB^`;X00l~oI&580$ zG+IAxN-NFF%Uf7fgagdLkZsf57FfZ*KO0eQ#TpDno)7z|V*X2#y!qL()ghTQU6Z z;PzX0z%Bt7q+awmK+G$%aALM{*o@_=jeSUX@^&hXbmD9^zV^yzS?C=dZKwYe3VhRC zYn!2<8|b*d_q<+#%{NS16bn>Qp>i~r{L<>lR z&+}AlC$u-2w6`CA!YgoSskzl8zE`N<@8JrW(&pJ~g?(>MsdeRif`z_r@y>EuCQB2F zo*{4}3{$7w-Znbf8f9n9Gue)g>nk{TLR#5&u~5CHA|okT;wb^7HMC8~VncIt@AdWd zy#cUSP@v`IO_$H+n*#iMK1m@qt$bW=uD+>mG$D7f!`475sS7VM3d)PyJ-=aIEqO^G z@Od4n+}3=!bA4{`C1Qw5>v9r|cUW|qz8-!Y3{^KYBp39$F*%$qor|e%tA0pz_f%V9 zWxNLs8?|x1n+8x@Lqnsy$v1LXC~?Yyv0mRa6rEJw!h(*CjZNTsR@ocKY~GIxGZbbG ztoIwsMp_K|kB^OXxZ}4p*o+nrbsBF4%%Ex#4PIboH@C_y-iyGfX~SYeZ{U`pMAC_& zwqnf7qTTPaTv={Ck24mt{iwAxs@Nj>>h$q(^;~V0RgY~hYiP~A*FN=ttq11Mf9{_T zxZZRuVWTHP%tE^jegJJ$Aik}wEx!=b_#vJ{g$_WF;&Pd;t(t4`2*-}tdHQP`+ zH}=}+lDDF`#_3oG6~Wu{mWsnnTQOgSB$vdnE?qcGnL+JhW^}&k#LlmMbD?s#lMNFy zzU-t%8#9{VBLyWTTov~K%Qca%bQB;IUf(C4u?*GKNht+|N_L0RipSH|%92597M99= zW>Yma9Gj&&SOWktia=Wj2bx!!%xsxsS$rSjj#hlj{Ju&M%Mp%nAw$fJM-k4A|$O z5%X0U5267JT5NVQuRn4V01w8J(z3F~ZS;oC{16FJ+H+WKaj{;kDYD>isz=vG*Q#1V zUN~RV=dr6F#CL5?@3d9uwyL!oq9qIwhD z!BaiRLa(h|PuTK_Ab0aUm%Qmxm;*_@3HEFaIranmrX{;Qb0trA$4-j2q?{a+vbwZ1 zGAyiVVtwP9Zzd2QE1B+OuZ=g}Rgr^)7%wv6gl85zFG#k3q`c*I;7W~kE5cHYHgUTc zL=qr$MF|)i1{sv>bIcWbMiXv;PSt$xpJZT=FUse)c}`E365O7|raog9t8phL8ss7- zJFSN)34VqtPT9G2hs#>7MQ_BJYnoc$3iv9`XIf5fYiL{l&=sPGZZCyZ| z4saPis;c4)dqbx>e7wY?3HpPPuz{>YGo2(4NDD52Y-0+@NkN`ROc~sEFlP+ zjUZ13xeU(It28F9x^-Yi^MxwIckkX!7D{1*{GbrzTT&qPNTiW70>H7(Zmq*2&FG7G z4ABsfG~DeM#99E7pDKJ9Hj0XkH9wdxaz2<2c~R5p2L`1|JwX!hGZ7MxZA>77^#JVt z{$|-uv)PdvNXTeDeoP*SCaiToHyVf`9s!7k`y+j*^hgSm%r%8-VcX?15JgqlEOWt- zxUUB&2}VPoZ#&O#Z&?Tu+{!9xA^acrK&i%WkgUZx>>gLo2TyH>o{iI29vx8|UhO-0 zVSj#g!f*u7b=fzvD!FicB496}toPkQ-O#%=aVDMEC)^W3{VCJ^Y*M%5OQoPwr|{PN z@!<06pYP_a_D;rb2+p?S(6&|-Qgq73MhlH!6&tINgPSF;msf_;yzZ>l=y9Go()+MG z9cL5dlv%K$cy6RA`j_}Ecl^l6-K%3=(|iZXM1;^(B0nVI&HHT--d;3X+wo`HT53}P6e;NLpZ%{65cJ|FY-n!b=s#o@gE zaH{y`?c1GJa0i2y`%VIY!AY%3JHpTB=s=>@q2x3=%-@+v+L635a#OXvT(EMu9A^n( z5ZX%(UR#WcHBxSF?L+ocV19_1z0!%v8ZQPfL(Rl)wfEObc}Z=B2hdA3y_>f1NNf>0 ze5>7=HNNB?Sn)JF^ZuM)up6GeJkN*BL)QWNW(d@n8+f@F0bWXUC50qEJeQyO+0aPn zXAMW(gE#*ErY|>>+w-2DYvxr+P;h5)L|?MYsKet9Ex`Vna5Mfmi*6yB>9$t9?!6y;$W8VeuWW5? zUtG@9)r>+EG5^i4xix?^5rSMP%kH3-HLH#13data^z`?K0IB^YK+Nc0dMFy`ua5Pa ztlzOTM};r-4oG#DJ;*6l02w-~%@QZTwLDjrjGEP+k8(^@dEZ}rzYF1tm(Eh0FF60Q%uFO!z6l^ZIaOXQw}l*Xft9GLzfcx`^3CPV|(;Hef`R@l;3# zqr*N_x#Qh)@Vj~gmoA0BY2-4_0Fz9}&eokhvZ~g&+aiU!>(WSleKvP=aMuMk;x_ZRbZwt9JsY`-sPV_0A?Uq1J68%s z$N}A2w6{W?t4<9N*e{9yOA}xcPc42Gs*uS-K3NL`B#jH?*Cz||G#zmI?7qd4aAY7eBDH&FA*Zl*wtI!sXbL@13saSWQTtLIqWW%j-2p;_$VU5N8jjn6|C}?^@14 zf5-8)q9$dTEQL;ynR{1fgY)r&W%rvQI-?8NTLTc(h;ifHpyKydMBnlyEFlB3g2(%< z9So;t)Mwdydz|==_s8a}n>)*aaaC^y(BIN@m0u`RQ8-d6zNAp<14NSUUb)kzp*XLb z^gWU_AOBul)xD+KeFZY(b8CTD_C=5qrm1$2!(!uC)_4HT1iR~r7mdLop>G-GCw1qf zQ8Bt>*xO+Q;2K|lJMqzU*gc6h8!yHHfwz>e$5Y8&ycoSC5T*}|rqk;AV-~(A5DC0N zMk$8$JH@+wh)8R4&j;~E_4|-q_6SHHf1@I6q6~=HD<6gGqdo3uE!1*{M1RAn8Dvkf zD@ItxX2p!>`=|P#gQ@%o8ZGhdakljS9o`+n8DWf>ptgbs$<852I<#z zwjvi(?p!3E8S)}9ynV-#R1>xEu(p;|dwgx(>!J(F@lh;?{=?*+1DCQZIlVcemKbXJ z=EDXw-rEaUk9<|CZTg^bI?uMcw<9+^MzrwQwoS;SYGT`bKX`#^i4s52chfDTu6D|T z!O#?v-5uh-yL+d5vu6zo7FwwmoE3gn&#x#v_0hcFls^zpyYXhYzM=YKU}!9x(7vuC zka?qZe)vx8(W*@tJZpGUtObkChgjbvttgT+W(DnCEdfzsmMYH{ya<+x#gGGAKY~Gb zAHVO;p}nG{<98wsBTUD$v#oO}XV`+v(V}yHUrhPuv}2{JoBYIa=$5w5=HexVy#fq9IPv-+j#T^t3) zJo-z8%kj$x?Wt4gT{@5Z`Yu_4QrZN`Kfyo5VT4dUZbd_3h%~;;?{P1CWlIlW3dAW4 z>t3HC2R5PZ>ILCLRRt=KbtVGirrRxwWqJ{uoTRCITs8L`nNN+KdECSUdjgR(2<2o) z%^1C$SmDDkcHer9p!^smqF&eFgbS^tb?w*6f0Q+wEc*E2S4M$~iaClni*Ij-z9*w` zj_&Bd6-VJNH=WS{L zCRdS|$JsbzIVXx&KHhNIb{t#D-^dTbLuQ@S9*MF}8;ucatoAunKClMTqYtuQIiZwN zk7$Rmx6I=VSl3i}4vQJ_*X@`!S|{Al#%G`ucY&h7>f>Lzf`m6#wW=)S2s}=S51c9` z7JZnjO)+X|kVlF(obPY)+#jVGNFQ5INMuisuu3@wqzuJ7dP|Y3GD0^7*gbS9#--BjF-Rcrr0k5o}4) zv>T`?c+#HH!?6BN50!zEji^laKlK>n)Uwr@G^1}M>KR%dT{EuLgaVzF8y}gvnAXY#8fm{xqpqMB?}@*Xy17 zY22UR{D|slbcPlp+xs9f;m&|<7WL{M^NhtjUUMRt@dTSn0B^8=O!hBtZiRjQBJ}Lk zHcO^5bWH|OH&Yxr<>%we7=SI7|N0`Dmj+kvN&8PI@qb>r{r|2A{Qq{OPDO+=efQ7? zL850Azr;Bl^Fdc8ou{_;+&mjF=F0gx=>eM+xf54WyqjgJ=(huYZ>ER_>0i8<3ReMH z7y1mIoyq(7lihaeHo2=PUa7ZH*hQGkQ9IO zdp6H2&t2<32<=~tW{xiUo<~;lt-<+IGp8&NUbHG5CNECAo@Un>|-?CwG9c=E^ z@5HrvaX8_03{PIsdkZX(zCyehdUeLGq9b}ZZt-_p0?Xm2#3HUtoA7~jPc5<8>M#$$ zm<>!!#;1=g2i_*DP&sCEyk_6&JrH|%b&uc2=#j{V(um2`iMv~-E3Br}SZUIyJ#zky zKb?H;7g^ZCz6BOy7>1+jD=de6HOQU!y+I(VKU2`c`%C;wE6x*KbgCZ-YrWq_g2GF| zn5SmJ1^q?7vGUu5nULGY>9wuzz~@hBhOgG;s28_OUzF9RIsU9xfxIt0Zt4ej_7L(* z7;9ct;sjq`45~zPMX1O|BCI6QH1IvxRgpN0S zEE3=jn{rZyS4$T&a|)^h<3w313y3)V#7=MiPU0kZXK?W85!c=*;$#K+u(qG$WXSG} zU?p&NA(zLO9UH9I>*1$?p{F4Qs!OnBxN#C#3+HVjwTn9XbewBebzAMxMrsC~9$s!v zBVo|4vT}G0``$+^2oYA7(tV9K40a|z;*>ijT=~f3NiMC^nRR#dTY3{!%+|fy#flaN zn-P^Vfp2ekvQ%Nqn0Z(8hBrw=ZU;&Y(yfesUR7Ue|R}>F__2sX6Id}mFBOarR+2Wv$Qj_Sc@#Cryi;{?0GX&Dl2-n4z=GqZ* zq~Y|tsyXt=6vuzKZdUkHCc->Yz2ux*+?6X=)&#j3hV;eR3{OOAtUqm`MdcDm^%bp^ zu2A8$)#dE>;#?5GbL{L$Qg}Os`)+w~xj<25Ad$T?5NncH(ntgI+@Su>LGwV%2OH$o zRQU#I#Vaq|_CK$e={ktDhx);mG}}{(-f_?mu`J7@ac+;@MGv$teKoa*u3d=He^dE{ zN!@*&&mki3b7KpUm&8$?G$9ve2^@rHce(6o!i-@^PA4`AWW!MA!)+UCAi}do_C~D~ zb)d>^h+C|~y)?g}{Bv^nJktaM&Zp>TBQR8l38dX`=$Ng2qjnuKQfvKkHbm=m?|N=9 zs?TgT1xqHJ1CO$WlyQf!#+=*#&Iya{;8T&?rw^s*lr+nRMjWE)w>Qp0ewC!&H*X0! z0i7O75)~rxDoZOFg0ybmA+PPHRusYTySX; z%VP?e8`(tiJb&8(+1KsJ1_k_v9@Ab|bdMgJ7DEcK@4QVg@S^ND$x*pOSbp**`?|js9@JbiP3~yP2*=yqx=XAfF zM}*UkFUM~1iqV1oE;?;=_|}}QRTN86Ur*65Me-!c&Ty+U;SBlIptDtX<9faK#}uZ! zPe;nWGlSRsZ(4e5x&j8dgzr0w4d$yghVLt>K;uv7dlx4XwRqs>Xe0(~B=-*qpO1u-eLwJ^L<6+$2-rbnhoc}SSXlw9V3mTW2Ua_BD=pM zSUeT}f~ZC*e_o!@UZ%M%1JA-4NU-$d6FLW3#3nm?6|7r0z5k~446I_1sI^B5|IlU) zkU*=UZ4@*7xC|S!H#lWl4<`_mE?7gUM~rYWw2XN}b(k+b(b_G23>%*HF+CPnfowC? zB7d`D`s>b78Wwdk^6x%o?;PgXr|SLAiizJ8e-ZG=&Tb(>g;OwN@huc7vjA9rgY8*$v-9FzOu z^9Hj#${&&Zb`4FKMtAq)u877h8CHW{)|MA%44yXYhRB?Es~cRKwOWldjdbb^8Xcdo zscyFGr@1{r*1|}LctUrSzA}U6fpik*m3+l3N^(jwwpQ(kfq*<%GdM9gy_~nqIA(D! z%t2|EEEqlqXkkpG%8jTzsiHYvL7SzVwj}PVi>umFK6tQ{#aJ#nR{JKVX2us+bhdX* z_$Pjku6YW}3in3l2peNt;Wh-LztrXg;2UI>{4D(!f11Dzjm8Pb1}CqbUEC!Xwji>Z zY}*f{CSs%mhX-^;!0D-OL7Sa|f`3|$hpJsQ(-+-6yw+VxyT;&HxEVC}mR$OZwTqAD~$=bx)`{_M!%iKf63ZiKtKq#gNaH*6(1#T;qdz9 zlN1ck+N|FK`qe=*3|Xz!Txc?58gbL+v4a`c{NXXU32AGOtlSHIdp6vtck^-A#qJGx zWd5RiJ}LR~)(>r}>|gwiw1Po12Sm zhv`%(jgS|O*P$)Wht(?+|Kftsbnt2dUrc9Ok(GH5sLwJ zZlo1fGa}t203vgc6|${E`f5}t*sU`JUc1x004$OLB2|3W&2`*9S(TQ3K9RLVBw{%K zTtF5Yg<|xFhoO{zp4|wf#RnhzYhd-jNOP|SHa604Z+%B|(_2T{%v$Z@m!x%D8)2La z-OoFxy}h{PH5itO;Wb)EV^$-y(=WNj%8SVc)NRv8-NT^zDI)Zvu`%txwWk|Ms2}XA zLzE(URSIGCa>Q%cBP)&BYlbea@(xrX-W2j`j%;Dls=jg>bWk^zZ!;f?`|oQH+pAwU zi-L;po$t*Z%02cR|7>l_O|4khtoWQEc!9sVc(@k&oqfQuiJ<((9jq$ER-M$xR9)Br zmN4g*M!#=0JMsU%B>ukip-o1Uz?1gl;JU)C0Rtg7)l%!Q%}b&qtCIg->tP1u8ppEf z2*WUxX|(86x&c0so4MkQ*?YB((Yo~m0!f}zM{@d!RtIJK+hJYG6twSA$z~{;0jako zcYbEe;N@>Wm?z@WpBpbK&6>BU6&fjY%ayON z(5T$lS2GB8EpMQ92{m2g;wnl*I^$OJ6{Pxdc`;5_9OaWik8WOTp?GX(A%=J0t)Lxa z7fsDZN){9ijSijumX#PW6HJR>N-E1Ch=<78qvPgE!iZ(l1v~|8jnuImn55ecY&~r*EotV|EkHSuE$91K(_W z=kk3$S_C(>_Z+R*FD$vw?1s9n=l$C6zP68n4R(g4wlg2X!wr@3RwoRF63rz-1uzDK z&skUp5t=@ddtcG@tdbq&#GEY=d1{1S4E^{X8}#;bputpbam}6yS}~f!g$N5e>uYus zd$NhK>~3s1pR*%Je)3&ZugU~Bveo6vy<~HQvOU~%!6ZdUYm7IZV!ru%WkeRT-|Z9oBWAVfd!I1t zu4CN3{htU}H;0}%+EXd$0^LN%3WxdlSAq#rDGG>YLMR+?Qiv|)cko)3T z@%urQMYs5*iK42is>wx>@Fc@X^QFY8*KO)^RVig-(#LJ3Pes?cn)ep>kqkhp{O9d3 zK;9}UvfAKmY4h{rIdHvg$EGI-?;||d%;)~}q?ZDy_|k7m+~u@OKly`_sE`2C{CgjB zy7WBm)*HNg&JB<%m<33-x!-6bN9x^C!u=({7i>_k$8|~|%nSwn`z-Z;NzK(qvhIow z-)o5#dLslebO>E%6A#!qURX23!yoSBHe*#(Fmra6=F`5`CzUtN8Z=|Dcg3TaFHecC zv<{iRD3N$62^6N-JGjD7D2e@3K9FR}dp3z*`iIx}C;$I%=d@?BG76}ay#7@RD5d6< zkSe@+Nyn82vxodwF2`elbKr%pQ%*q5;IL%oplVyWDy!a3cpAF~rYk^k8I1QKS%pXg!Fyen6|4yR3w zcq7{1i{5eZUyGj{Cb*pKzikJHiybmkOV`IOgR+})1eNP-zHN@&=fGv*#fPtiFWvX1 ztoAQw+d1hmQYcy9-p>$?vYejU>|1RE@5@I?7TPMkEM8*uFTq1_SFA+$2sXm4i>nwQ zh5E1;R%}*L-!4q9+Wz?6Q{3y?6drzxmm>1Z_DB*ZyBA*Fq@(Wjkptu`;Y+2Zv_RIj zs8RPik_>nvCLBpY;i3XPHDF{@zOK;D#*GXQm$WJ9Cwkc%ZLO}h2>T0MRxeRO2nDd! z@1`d5fkEfns%t5M1N5anz^42U;!)f`h7l_a|IZ@Me=EHF7m)xHZct z_W7zu)!PboT=U@SN@DGBK zY`Tk+t4(x^v$P`+69|iJ(VRX1MiOvg&X^06Zqw0Q?y{`@F6r?ymUj@oAWWCE zqYg5+8xl1OHJb9#S6P5)zAGZ7T0|(14s|TEcjNfFHlh+F5~<^-qr=&vFJ^_58M1vv z<9q?ninXv5tq{BYsWq})e5dZMtbbVPldHeBpn66LF_}_965ZT8Z3H$3wet|S*R`Zv z#!D*CwtMAVE5q~?V~q~XGPfCGABHjk9o77fG0RboY#VaRAF)J`kzaglinT>T}J zwYWMwMKwNNRfwBZIc$7zUA^bLM1bFfPg|<MNs;q;TrDfq9yrcO_q5<_w0wHbV@I_wkgK}fbv)F zK=cv6?M3Vc-@a7+!S)!ydLrT@W_`JPCR-EDo#^RGnk#o~)xYA^ZSszpB*~}&x`prp%vmnHz#t4jpFiAvfB^# zAHzVU0A3WvEV;l4t?IO8yAtFO9=Ex_m^AhaNT`oWU!*Fw)qF(6#<-fL8(32XaZJ~g zX{yyuDDhj;w`V*45=RH%O{wg~Qks?0s~HzICXRU_XCrdPVEXksoQQ(8c;u`*uukli2U@eK}%i&B%`GEM6- z)m>bR;4xOMlCk+oHJ~y*$E~;BE%2V^%~=riK(TfZH@@bIlLxR~!I$NJV9A|nXb_V} z?f14qnHXP|oktu#RRh&d4Ku)5tW1i@Ra9RF?otiC-4=J>uTxvVDiwUWs-i;=#d)pg z`JCR0naD)i$i-x!i>#S;-f|aJxBM!4?gI*I7mN9&mGc~bJmFAu6;Mx|C3&&YiX=Nb zaYQDw%_JV#dyKO_`=?j*k5P4h7v~t@YO*2ez&^fy0n!UXyaP^mMh4>0%8=-+Pa36I zxmGC=lDcjXbdq1%X+|KkM@Bf!$mJC?EaHJ(L!VngPJP%vL;up;+EfMW=>GVk zyf;8eaj1w@D#v;D8PLHDVt9}Hn@$vD!&}%pAK|@$EA0~@7^%T*;(ojNKPV5Y;A1)f zWVv4S(nZBp{@{erkS(lm%l>YmUQpb#7~)6hq2FrE*%9gz87_JK&!!e+aE0p2P|1W6 z8nE6dqw6g{%y4Y%^xtglH!C|b{R5;9a8Hci!~Z0^Z``iWqsrQ@&%r$3vb}sW_ou;% zKX3n0ESH5sVIKZhFK$BWMbTc`|8&Xe9~W6ADlBq1v3`)Jx&kPG^uL_Zi7@Jj5CiD> zoK66H<3B762qggT5>uE0lIPjX;(4(;%71;GkMh9@!gV%w*o$*11giXnF^5Y)(a{jP zy!zVba~5H2xPK&YCo7%;@Z5l_^YHlWp9`@Ahfda{J8ivag4~N<&nhn8bfrMw*_oSk z_vMX8N{IcK1WMeJnE#r2Jd3Fv;?x58VBm%5f4v|_m<+N7_3=6Yus17C;HfUEXUdw$FtFK;8D8hbMA^9=xYWamRY*uDSp}!Zv2qMC$h^xQ zp<$rTQP+#?PXLSL=859JvvAf52JBCx;rzIyeB~D8OrdR7^?&t}tgRWQA0LUU9{mNS zUR5m`T-xscZ59{BXl7err25I7m&oED-}Tql+mi}$$wOyFo;$&vHP$Z++$Sld#|A~(8?;eGSh{|OO2 z^n4FaR@w*z+ay=jMEJXURebrofSV3-vuGHliqc70)Pm8$vVMUuD})9VaQ>HSgtj}! zIhl4_Iw@Lg6v=FOI_KA=`UQis5Jy2TFo7f#ZbS;9MroS09<3g|==^$+1w!^1tMyAY z#TssnAgbMl;Z8kbr<=d7ygMjzMe^V7Ex3M|oSZ(_UqbMMp91`ef0lrDbL*Zy-Fnm# zEQPAoV$=6;V0JpiUr2kKnyhvxUa^Jo+d{c)h@aDWXAwsdLQr+*VI1>jz!DpXS&o3q zQ}Us0s3NPTRHjLn;xS;1>Q5Fg7$C6ObzMqO|~(_~**wOjiYf7-0zV!Q--=OayMyE%;cSDzUr@rIckfTG66E7pwwKX{qiD@IINm}cT{Qh+eR(q_L`22}9c!lKZlEyZCUXmhmD=VLi_qKo6_l)@mh}~bLR58i+>EvD z(Jxq;bH zsihk@3Uj`7E6*TeO;2yYs^*A@p>bHnBfj7erq-xP;mzbEzbKiZ2u@06IQ9Fkl%9Ng zyBY&G1Ouvd5ZS0an&LkrS*2i6Yhx)gOz(3rz7vKC5-u1FiEBF~yjjX3&I0!8iA$|! zoR=Q~vzdfmks^~ZQTW6sy8nxr-z(Hb6FwF?V7g`k>j*}?YYI5C-=^2&oHfqaDq_E+ zoRUy&4rV+BmGx_}e1GDzXmbrc8ZFLvvc_j*0!UT82qy9JAS?r^i`jaI#*FF^iya2= zaM|ilq;;CEzkeqS6c5gjb|t7o>C9Ao$RV zRiBp3Ep`Kc7l|RQ>mUp|MFV%oo<`qxImYd?Y@I~%14Vo@{=RvK4gt*5k;>L*DeIrr z-j^F1r~FmPf&@mC6#mroF>{eP7kwNYX$|B-KjLc_?uT@Q@GW;Ex##D9@eYNIqkR(l zZm~~n$>?cG-m2wNs63R%hk$-z?H{@pG3%&y5k=zOvRh?7!QxEvE_^61G__kgrB)Oh zbFa1^yPgh5c|vcL(Dj@*0yll>+RVLCLv}n;Ud)OOkUXc752Xelo0xtQ#XO}bAs=`6 zZoT@gW5qfN4x-3mibekFQjIJ(pV(_kJ&`$>?8I`EF{p2!7mUsZijUEsnio8LsHi~LbJcF5=)8) zwH3`r`6-Yos8FBpBH;2fHo#S5Q7;?b*v6V(XN<{SGRD(2!*hTOBzv4CvpfrU@)<+%0*7`(rRFOnv(3@GGH&_%E{5|_AJCC|9;Z6K5T48*oCcB<}!pvF#HTunss14by_NA{f9e?zOR&B8sCe^nj95b-0u z75w4F>OSiR1Xb#hAq#1;uUg@!p*cZ?BvSP4k~8tBpC4W?l5(+7D4|hH!*HRn>DwBA zD;AFL4P+yhrl?dkC`HNzGQCB#YT6?bJ@<;Yxt;Ck{{CUPG)70BHw&NN%*(|h`=rA7 zJ+`>>?@&b%Yy%-h#RqM)6l46AD9n*5&IDrh298hWOiNT0$zSuu(5CE|wo#n4C1rbz zQ2wr3#2Egj>K)c4;pCzvn=Yx6A9K6URWJ|`G}E9yi=kd4cG&^G)k%C5 zBz_@Jh2?~|v_=@5n*bat3eG7okugy>d&3bHf?;2cNWZ@EGlB=V(!45M2Oagqz0eB> zEUVxDx3GOQojr(Tq9P>hVOlEshqT8>y7rURNg%+`(dM=GHb$#F9)%g<8j#hSC|+Q3 zKP`VbyC^4S_3@f+BLFvD!i?lB5_xGCbt8rwQ;9Gy- z$e7MKhb(0ZZ!5&UpjB%Hl&4_ zISnjmehNlP=eTt{bvos^JT3jO=d(f?Mio|Y89PJItC`rb6#wtD0JbQQ1Q~Yi9rTAQ zPz;V-jy_rX^#$V0WeQo!DiRD&^k=E*63ff0!}nqJNB#5A%;W_2cpd9V-5S%1)>abmhz8z@g{ZPAap5FLS!eB=s%oXfAY4IH9Y?Zt~ z<&XsYO<=VONTv7gWv>nylcK)1zLN90&V*yiFmtoAwB0`YGw8=Yog?7Cja<5$s&Mew z`FrlCjR?HF56H>b1IAn=uh2VLpI32bRn(jC?G^E^kl^js+XuO-O9JZNojBUEPl?47 z1~ASzsj;cvxl+(tnc=Z`GktS6@lRN3A3dKtQJilTb}g0k8jljDukN~v0zWLB9rcnnFh&H8;5v(jSRl};P% zr-%Hn?BD8k^HS?hW-r!5@3;u|QAXDeB3g6jZwyQpJgg45Zu_-vShCcdXh5UKh5-1FDl_?QM>XS!vk z^uenor;iyoeFC6Xb5`$g=Q?s1h=*V`ie#72Ti?>Wp;JbsF1qO}Z8J&ap|y8Pwt6Y6 z_^|twbV*T;tIj9=AMiYq&E)CgB$$4Ad6oSoCHM)?F`WEOGDnDYlKt>ovcp+Hn!Cjc zH8Q%PN#OHu)#dpojR}&m#H|v2O6ipcXTLJ$3^s+-n}FMj><+KYtI5QK&ic#Z+Ss+s zmFKqf>9nb#6S($9Xd3S{?m&{wV@yMd$Y`DWwz|+00+JBr7F?r{9IHZJcjd{tizq zc|TNZs{Ed8lCd6rBMIx2>+5vo$mC-Y`21)NJ{q9rF1h;S%H%ur(|aQW0afi8bKTrE$6sfW%Jz$2c8dMw-&2U>^6_LtH{U8zYce$1)H5aa&q(wnT}ll ztSxIK%tYS|mdu>?Fz)*MmMZ$%RWlDC;S4jVHMc5OU$VeVhTu~dXsDvg&DXM6&t1qx zTcyhMMvi zrxbFjt$F)6)UoK*HUAEM>9LMxS(Qcs!OdY1T!&u&q3l7v2#F@Wmhbop@&~;C)!B7M zHMOh< z8+vFqq``e^FYj-(Q(;k9dU0lf>`S?B6K>JGr?>4mG?logS2WHc9jEMa`ok-b->osl z-0045%5+iv+Vfk29MEpE*srXj9cWWeA}Fhh_FlD?dFk65D6Qa(}9;e4GJd&itL7BbJUcj-H+ty0wKh z3iqU*+QSa!bSTdVU(CrE+rk+(I7_}z zqaeV3sY}4)O9wFhmm>Eg`T*u&=a(t+)#llz*&}@wP+j;oz2}vX40YBn%M#0Z+;&N^VnuHH&0m?lwO2s_Al*~3>YEj#MQD#lTAeY5Uvniq%_OC zfVPnOIHKIZ6{=3KR&&Wa7}1t~%U0qg9Cdu;J0wDMu3Tv`eCbd-^|e=b=6x_WogZ<2 zZWU1ez0i=qOy5yk4^4ivcp<;j`Iu*!l3T|=CdI(u;ed5#EG3XnLs8&LAFv}u_Y;~y z_QZmF2l(-)5nnV)M)!*pIR)1(P~IP8qQsq!W+Ca#H6m8B#8=)V6bT!d6z!MS^A0wy!zu1k=2L-vwU9*K=M`1T(o zpvr4z;GE?6!mnuR`K;hl?^_v+ydLs!aqsHl%K|WHC2^xnJ1k*OvJ+Qb={;EtAw@e^ za9z*GE+B3jMZBTK6-$SSP85YsSZy2|N_CTr6g!#0sO+%*nx_+Cf>x7sx<{eMMko)HQ(QJkcH{|l*TqAX~!chFG?rX)~GR%o)OuC3)v#XjFDqE61IQ6!!b5At-wqejn zl2ltCGQe_(CZ=fZO8_gD+PCKh1+VCkFEX4;>=;fL6E;4uRB~dun0i{eG?Lf?saSp9 zE0jqK&1r`- z(kOCPk5L~_X>VzaDoVcl5@J;wsku!aTsW&Uj{p9&NCkyU=@(ja!!V1SPWDB9o{45k zucs^HPP(2-eCq44AMQEG2OYDf7(^dV_aSEwN3A9UjqpR%ytVl}LnKRyCc`Jz02>t4 z7Z>0B(bXH{;w^MPrk9>;Gb?!3uRAX0MeO@_xcOR^Rj}1w@|nv9eYjO&kvBJ=sH~0o zSd~af<*m{2s&zF9$*gL9=&@vfCq#!UO%77FRCv3YWRl5Xth{w;4XIgd*RuVY?xW6GeXt15Ju~ zw)zgEdfE<;HRfY&fjd3|e{i2)td)0@cFO{Q7Gr(sVw!ZV`y%P&dnseu$;~Q)%ZAyX znXSZOM7f)8`CkWyG6tm}V>Xvh{geS9KQ7#qtMj)$*e8Q|!>gYac9-Ajst4f)?b=hk zF%)P~;^j(dBB1Co7tv?H=R@btbpTMcG=ty!d_V3|*mZu-{~6YuQ6^X3OH#`I9dO-@ zY%se;nBkdikr2(D^XnUm+~0Z`8`n&WQYa~V3D=zVQNDhQ*Qd<$*tLh%1`vLZ12YF{ zo)-ZiTkP5PU1q5~@B2*wp>dLUFhyn_7sHlgGcqNxeaY4kl6!o6Y}d6^wSi_O9ua%t zr*Ss3Uw=hR$o(2STu~j7iikRGghr~9oPSc4>I^ujWP;?4$4RSo&Az7$(@*n29!y1z zl`x{Bxl~Ejro+);^69NE#^l&8s zPs2>=)hK+t7qxpo=A#X#vu=R3e~qYEr{_PH>}Opa@CBlHUp_Pq;C}m8?@FGmETGT< z0CSPAS^)4gE(!--3aHsXVS_f>KKDFzc1RRI*Y-RGZO`Lh-E3O0LC4CM)KO+Rnau($ zg2`DqnHa4C(w2jxC{X&H+rR)o7OtZhC$i~e%XA{i!TjlL>!U~$IbryGNc{e+sm*G5 zpS-reCGh9ld|ULYddU`V+U<0yYX$w?$2lRyfqUp>`#^bj84e3PByW^qhMYji3e&z6 zoTjB|5iWXY5tZ=mBCI-3r;PzycKW)}(&RP|TD7&mCA;Gy`;|Y_dvCgkoAGQ^Do$_N zfso-h!;2XEmCyL@XXR!FfhugsmPg%7vHro2zPK;E*GsIq2otpuCIi>%gPYKn$ILsj zFoCiX;(ThmB;fO{nAuN-CKXH`&T}h<`P9(INu7H&UxDuVVq_t7f`V}up zI(amAH&NR27-K$Y77T`6oj3wVFZFBmI^qT>s*u`T zY+jB#HgIU2em8hphiGij-Ad6)!i^{oTA-E2aZ!Je0gkbXy#j;$dl=v`KUijWmW1wKzog)npU1v_3 zZV#MJoLxJ>xvK`uxHeoDaO<48&vcdzREGZw=bBteY^i-}^MP2nq2u!uw%%WYp>OC# z@h{zsDCg$gk-XDS17lhqa_1?H5`NK*O~Pzgoh^%aPdID|A8K?i4Q+|oMy@Sgi1*t# zJn>!aM@L6~@Ba2+@j4d0Ku(~RWTaq6(`t<+b|&)(_NG#~jD1aZa~MN7C*KgEBj}7U z-z$i9pRb#G8pV`XDY8~eBDH=X!Gpuo-SFsN8+}cX`O{wI$)e<(7|O3lsNF+Pest={T{4&bX;(GJ315ydHy*n4?z#3)8 z{{RBaJ{y`^bpk1J_nCo`t|+1c(gULHi&gMY$(;sipr_Cd16h}e^TGaa_c zseVCd)TU2m?vnz|5(wEPExa#hs-_8{(+^(ec{nW$UL{3jPT*B--kKiC_!aHQ>(RW3as<4Fh!+ z-Qg~^DC__v>%`0eHBeOZKa--wC666W1q;s@g1@ddkM*ujImt3Nl! zPr?MtzxD}8G@0+B8=E}V>^#zmbMvo5It zAovE$RYuy6)&$s-q=W)iyNou&uOV^DXwL&^@%^2x@|hsxzAPgyMjTH1(NTY z!Ek}=y3S2tA;kR_(G?8kymh7%dt``}+g<3XyC#?bYmHl%94(#~Q)iuhLHEvkHI~3G ziw);ErFTx=-EDTg5tV)mS;Nl)C|ru{$6c1BxOd~bZ59Gd{1!3nP?*;`B?+2Nm%f3_ z+1$#0juJL~(<5U}T}J6}zIQubQr;OcnljZBWPdUKO)cXiK7%XCeW$Hzi7jMBoXzk! zr*^zj5agYTj-mE^)HenZIgB_Pl{`)`()r)#=@*}X+yN2~IHPS=ApEr8KRM=~XTa|f z*w%2lz8lwj_AM*AJEY(A+uov^iw9$#YJt;b^ZRL`_EP)|+@+`RGEYZQ&11*Mx&d}- z>3QBl&1$Xr)^H{XjK8V{3$3Is4i{X1f>O&_{Mq=W`z9Dpe-Rp32j&0(fn7MZc)5R; z5d%i%29c22`jh)jtM4Y5#{M$iuYGE*lY!CSN@f+{-WXeV8y+3_m}1do=1TwvBl#K( z-$Th27G&y$TX=N;ddWiWmgO`O@gT}z!K}nbowLu&0d7~ZkcXEz4Wu_UaXe-Qq52N& zFjwLQa!-s5&CEE%!?t-Q4Jhz^BK*(?lzVm#Ps*+Qq+YGMADq`3oL(>k=VTyZAG~O>i^>k^$I$g~j}Oey zi1j_6sLPQr!t50~&-jq+J%7D01;HJzcCz8WzYc4&qA2h_H1@(Ran4G44=h=^iM(3* zWs@;G_kaT$aEZoryEuLNPFm#SUP~+m7qzuhthv4$aI^LjOhY_MeW(Hw`k~jXm}82e zMZyw8W3H-+rCX?0r%XH>QTbBseZUFO&25 z;fmPEKr!XWyY^Y`e)@S4O9tzZ{Mx>r+-LtwF@9Kok%(oj>l{~rvXN8od`Y8^YVA(2 zJ6fidPqVbquz{Vw>Fv)&2-Dk?PCtBH?93!I(WBvbNvo#HJ=CNuQgC*>m1rEekDdOO z)Nt&e_K>Y5RTu!`1?uB&>b}vVh}Sp^1y|%}h#PSevLOe6n-PlS3N5YCVCYk&Er0y; zG5oLd992rqUP2KlDVs0iWgG`KKxqj`ih=__Clyum$N7!Tv2e8HpyV}N<(2mGqj2nm zLn6RlCGRh}R>?p~*Lfxj@2)z1X^f0s1GN?m&a{opLCfQ+SUvx0&j~`?Zs2iPZ*)O$ zb0kYo`FZt_JaCeFC6C5q4K51Ofr{6B-AzocZ6U3Zc0fu!X_lAi2jfIJxu}bDWPC7W z`|lRmp{&Wtm7!coBb>GqI|;`|m$z?ROSVL$r0ru70orM%;ty*`1k>`TS}soY3%Q_u z^9R=&jzWIF;hZ6-{^i@B0hil3AWdAns+(fO^)OlFf2D_U;8>`YYibATWgSUWhi0F7 z);wCQD*93P$bP|fWRn0bWN29UMBuoGT6C|esqp*BC+?ZWTSTtUWD$kg zO4`;rjPCmVX$=?oc-Z#Mt+;&cFJ{+ihEd-KU3ZYugsl>d$B8v1hkEDEUM>&67Jj{U zkae~@JL0KuIko5UaBkp%&AnkUtzj_&2IL=)&n^x097w=;{#&_R437{CgXfI#si}K# zRBT#8=h#|%x&CWiQ?9g+2YxE3&W;?2-2J?B9j?6LSJ{t#OSYV~$;cW?>TjrHS317n zL*eG@`g=7Uv~pAq2A*^m-vpODER-+smaV?BZ=4IgZGNaYJ}KMIxmne;&HFT026NHq zW{<;_I~w2Uw6IcMwM*2pnv@1%0J6uwfCLBQ!@mLPZ=n2C*> zZhk^kz!*eS&36W6FgchU=!p-Om2FWqo!X9H+Q|%)i)8?1FDV$kwuRxgG%zqlqsD_x z$ZxZbahfib(z{(0)&@I0rZ7!e-(Whr&qgUOMN3uFmu_BA$!0u-ue-}&6`{mwyWnYr zlh|CClhLhjf=*?krRTJo3-!iyD)b=ylpnt=GFD~j={`uwi@$u|<|i|f_N`Z3N%ujl zdS1#fZL^Js#@x4g4U(6GpklJ;u_dvY6=BOtB^ZogUpabZIqf$}&o!Q#%_n;9HBo$_ zd^0n|%I#Na1Su?Vm-NhTUGe4`$Limqjdk>rg6!32I#EYFJDj+6PupjF(oQl7{M&uE zfWk7kq*4B^x^8H*QEUH&#!CMM-v@qE$n8vmLFFD#1aHL~|3Ri|&BZ)pC+dfbDAh!f z>rqTZ>aC^adf#E^k2;*G_D3BC$L>h4 zIIp#QB=wMfkA2s|&Zkz3i1ri>(M_+ey8#Q4FCZ(-bHos<2>2`$75BJH2Si>nld3_K ziHDqWY~0vVuV$are)Ge~Q`xK#Czi%qto`Okop6DE?pKbC!X0xz7;YyQT1nbULK->l zsbSV*qPGQ?N*R^d8$H~i9nK~cTc3g}?4r6H>bf4*)N<#45RI0ew<`ML8$E6o^LBdY zJzSGD(vJIgdugLcCGdbO{HeChRr|QLDEXS2&G41f%%QWS__-vE&_UC_K+KF*+G|-< zhn4ZDl3c#x(|)Igse4LWt~~Jr3nph-O^x{14Czm&vlu{{7ViR&fYv6YGyZl(MKk}I zhE=;SNel?x`MIH3MAhmXC+cb^5f=~lu2$b`a01<)`wdRerC$N}(!yh|g1nce*^|eY z)dtM9JjaYErMC4;kgmV`^-HkZnknhu*m+tUe6?41|FZY5fCKAaCo%CTR z8oMqSm;F#=#o7AZK?VlGep5lJa2HX?i-?1p{!4+&<@Cs7DZc*AX}9x@a{DrgE54kQ zrcq_7r7)LC-zO=PRo#L9J5pQ7Dali>52;n&bA&EGWEAY1=vFLjV_<(gHPzJbtlK{2 zneo&p#?YkNLhiPN-T4LGR)x_g=UUU0XOQ5@^uv(~B**E|pIt%P{3zz{Ik);h@@;Jp zj!kn&P0EZ|EL>&1Mn3ZKIy5y{m(*?^H^t16UpaB|a|OyBlSI ztClWVOdN@%7@jU52IZGZ#xg3#ir?YlF`+m0@gzSI z^Ir%*qF|C_l9+1v_}BxL979zq;2Tb#anDKHMQ0ZE;4O=B0rql|D=rw}{72!KBGj{_ ztOMCNs~tptT0A+FMU=?1c*>|MDLN!vKg?ump6-4g)7Yq^s~6*28#9`eaE=qjE?0;< zVAv%#1+}!&I!=QxmlX)s(N|7LDcISbsFI=NiaJf-)Hqx`#Li}Ez4%_&RLl=Aa{jV0 z+=ArX#k1+C5>*>C7!8bkBn)9J#oQ)rT56>^0R_uj#S4heIKrgSPIex-E4msQuVi}o zL^I-+H=6IxA};9Df+m55Xe~@MPe)Bc3B1fnr!+k`e>rsW`y2h)D6ONi)5+?ZO?3-63I;BbSLb6$yvAiv^SFW@WhgJYr@EJk{Hl=hKEJ^sRP` z1wDfYC&vv*{cuYaX-X{nJ5BqyZ%fHqLQj(z@1luL!u<(ucUGb$yO-s>pHqIFD~@PM z`XVC)_p;+&yf|nbPHIFsuRAXyvGRdxlV~dEwP6&ZT=HoDyzS#+C%Dp-d|%=tsa!)0 zmtaj$T~&B_19*s7sM+am=OXQmlaT1~d;A!uk%-nnElQZpUs1-TSn8dL zN%_n?a+g|@{SDIXM0Fy##Rwmx~(|mRjQN?HOCo zz~MRkE>ARO>O3Ph?dB`)v#y0SqYgy6By$CG|MoJOfn-1J#{aa5|7L$cs{_hcuzUdX zg5Zw=EhrVh@=Edl_L%=vX7J?%@=2-<`|SlV%5a4SSLg$7w^eUsraTlr>$@@ZD9Yfl zBZf!fs}`7vVPjeYI#w$A`aepOfA+OQrofzED$Dw|*xgbU**cttlww=fSZdeReL2Aa zC%*9jR-Y=9zbZmL3awTsP+}8v!?^fC3@69+4i}rWOLo*@A3opBp_+=i7tkt;;7Rpu zsxj$D)v7YwE&0a7AC#+G5WIC2P*|e%V-ixz&XLc>y1cuGXs~Ejk_%`S*4AFs`7D{6 z1LjM$gpZvEtFUK{3=3isyhW_HU9WU0@2;cbJMhuDC7sgxUgivIVWDpn$t64g zfFnRhk6kPtj4L0>YT+AebX>^M%O$7(qMqov|1rNV-Zsf`@2}LFv&EvCtx~$iK(zu6 z5BIA;t{Z+(QbBiS+8V2-YtigE7hBTHWydt4U9}1MJuac5w8bP}mVn`LpW?)AZAQqC zm0sgDaGi4aVcviEHJo<+H*hZ3uCD>w1Me8f4vc8k6wHvbyBAh;(R^>b6r#uU;W!K- zMLE^^BzmSX#QL4@WRz|K8yL?hx`>u1q;uakSUTVG&d%TyWgC89ax&Ux4L!796sS-o zQJHd@`V`Z5@K^p_z1j^5BOVbjZTGrO5_tTCndv8bKKz%{{dZga|H9fYpZ@;^>fe>I amsggwGwy^^wSm4F0HBYw9+oRUeeoYfnfw?4 literal 31011 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] z(>#mNi5&-9xp+Kh@C8Y&<9fCvfUIvnvVsNLSgv4}t9?2;%GC!!Ju1T~Mw}17$5v`9 z`c58yCiYf;9c?M+2>8j+;9i&2K)&HXU)*}bWTW^_PV(#k-c@eAdek+~)e(Qp_Nv?a z+czDv5>u%EQ4AY*;m9ca0&9PH{E%MyV3@|Qc_ZN>c^LRM9R6Y`t`R_bAx%|gs9_yWCTopf#+4M zg@*c123N>klQeJFT)Wvr8`}j!qEGdnI|J0Fn&`8B!3>o=syfoT)z?3|)?Kw;YHhRX zct7@J@xp=Ati1k*EP@{c-uN9xr&a{IN@_% z#nTYhuhwrSrYBlt%)IPlu+o*WDrV_4)aUBR`wnc>*oF;+Xh2~Bi`~lxBOR1q?+f9B zYR;2x-is34=ygDc7rVqOjOyB20{S#fw~_LQwUEWPAlZW>GWB7HN!Q(2j^O8T7CD6i z>T9gMYbNmd(HhC&l^{C9Yeo;6mo9+JMe6v4r;KK z^(oNMS{T()ol<20^DRjMVUeHcRSlJPUTyj~7Ly-qNeBy&yCBj>)M*d7&Tgb@yIf;|FWhs9I`m22d8JYZ-z!noGfHxsUJ;jOnqBUUyYR~mk1EPrV) z;ZYiCO*-Z@Zh9tarTGa_m{=Ja!=t)1aS74%jQ1CGX=15*9oBi{Rb)w{ree-~*J$S) z{T84s%H%>BXG#nM!1~y*6tQ0C06^@E-QMdkRdwE==v03l9H-P3D+p-rI)k;_s4T89 zfs1#^*48RRwZTu+!<)0V&vD^<*%l=EjNfxHfkb_i=ZIs#0_e_Al2!nvUFi5o2fF{P z^M=xJ59?Qeg6~;Z!{q+M!E-J^?i52y837Kyegf7jAXrt&Gyx6Gg=rS@&-f}qTQl9A zLs*~%z@bOu=ygN>TDL|&0Az4Nx8ir_r)KJF>TqjZUQ$q+Qgobbk`@yjp9G+pVXO1b z;fEG8U9-v!PR2Ppy}g=g(H+8@5wK=CfZ7-lodxHscb(L(AcWZxggS`w^@}I#%G&zb zQeCt?zLv=q*Vw<6$7eAof!)0kz?qA&IK`yeL*Ei4BVOpmzra1<(7>7VLHhsS=o#SZ zzo8WXZvKA-3X%w%f8n| zFUkgTyAlc*xe z1t-J)Upm%JMU(!>97D1Z`_fv2;HPZM^&RB%ex50e$5!vpU(4@A6vO30+}B=L)&eQ; zB>c7kf}S1S{{)*{P?I+)Rj%#z2aBxkQWs{mnbiAl|F!rrvMb(C7dn$tG=&(|cE-37 zmSU7T8x^4vd9iyZwXTxs#-q;k9j5zpwd1mc2S@LFkkrC|`rmjSW={q!d-86Km7*_H z>X_<#=wNzQnt`6E{Ifq8J;+zVAHX+tf>-Z-47tU8mult ze6@9||F#hun~iSj2IIHo@^^Q9viMM83_ZI}0rB-v)cwDBh4kfY(pC0 z_YOvVe?#Sg!!G~)G^`rbEahje0JeykipYyXJY^Uc_fjSwg->Dmc8GrwdqofAT pgainlY)|2K;A{U6KaTsH#n