diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c1d06b4d..64caf2bac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,7 +96,7 @@ jobs: if: matrix.os == 'windows-2019' shell: bash -l {0} run: | - pytest + pytest --durations=-1 - name: Test with pytest (Ubuntu) if: matrix.os == 'ubuntu-20.04' shell: @@ -111,7 +111,7 @@ jobs: sudo apt install xvfb libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 sudo Xvfb :1 -screen 0 1024x768x24 Description: {self.state["skeleton_description"]}' + ) + self.skeleton_description.setWordWrap(True) + hb.addWidget(self.skeleton_description) + hb.setAlignment(self.skeleton_description, Qt.AlignLeft) + + hbw = QWidget() + hbw.setLayout(hb) + vb.addWidget(hbw) + + def updatePreviewImage(preview_image_bytes: bytes): + + # Decode the preview image + preview_image = decode_preview_image(preview_image_bytes) + + # Create a QImage from the Image + preview_image = QtGui.QImage( + preview_image.tobytes(), + preview_image.size[0], + preview_image.size[1], + QtGui.QImage.Format_RGBA8888, # Format for RGBA images (see Image.mode) + ) + + preview_image = QtGui.QPixmap.fromImage(preview_image) + + self.skeleton_preview_image.setPixmap(preview_image) + + gb.set_content_layout(vb) + skeleton_layout.addWidget(gb) + + def update_skeleton_preview(idx: int): + skel = Skeleton.load_json(skeletons_json_files[idx]) + self.state["skeleton_description"] = ( + f"Description: {skel.description}

" + f"Nodes ({len(skel)}): {', '.join(skel.node_names)}" + ) + self.skeleton_description.setText(self.state["skeleton_description"]) + updatePreviewImage(skel.preview_image) + + self.skeletonTemplates.currentIndexChanged.connect(update_skeleton_preview) + update_skeleton_preview(idx=0) + + gb = QGroupBox("Project Skeleton") + vgb = QVBoxLayout() + + nodes_widget = QWidget() vb = QVBoxLayout() + graph_tabs = QTabWidget() self.skeletonNodesTable = GenericTableView( state=self.state, row_name="node", @@ -1023,13 +1099,13 @@ def _add_button(to, label, action, key=None): hbw = QWidget() hbw.setLayout(hb) vb.addWidget(hbw) - gb.setLayout(vb) - skeleton_layout.addWidget(gb) + nodes_widget.setLayout(vb) + graph_tabs.addTab(nodes_widget, "Nodes") def _update_edge_src(): self.skeletonEdgesDst.model().skeleton = self.state["skeleton"] - gb = QGroupBox("Edges") + edges_widget = QWidget() vb = QVBoxLayout() self.skeletonEdgesTable = GenericTableView( state=self.state, @@ -1066,16 +1142,21 @@ def new_edge(): hbw = QWidget() hbw.setLayout(hb) vb.addWidget(hbw) - gb.setLayout(vb) - skeleton_layout.addWidget(gb) + edges_widget.setLayout(vb) + graph_tabs.addTab(edges_widget, "Edges") + vgb.addWidget(graph_tabs) hb = QHBoxLayout() - _add_button(hb, "Load Skeleton", self.commands.openSkeleton) - _add_button(hb, "Save Skeleton", self.commands.saveSkeleton) + _add_button(hb, "Load From File...", self.commands.openSkeleton) + _add_button(hb, "Save As...", self.commands.saveSkeleton) hbw = QWidget() hbw.setLayout(hb) - skeleton_layout.addWidget(hbw) + vgb.addWidget(hbw) + + # Add graph tabs to "Project Skeleton" group box + gb.setLayout(vgb) + skeleton_layout.addWidget(gb) ####### Suggestions ####### suggestions_layout = _make_dock( @@ -1836,3 +1917,7 @@ def main(args: Optional[list] = None): app.exec_() pass + + +if __name__ == "__main__": + main() diff --git a/sleap/gui/commands.py b/sleap/gui/commands.py index 6b8c65d51..d53585159 100644 --- a/sleap/gui/commands.py +++ b/sleap/gui/commands.py @@ -26,23 +26,25 @@ class which inherits from `AppCommand` (or a more specialized class such as for now it's at least easy to see where this separation is violated. """ -import attr +import logging import operator import os -import cv2 import re import sys import subprocess - from enum import Enum from glob import glob from pathlib import PurePath, Path +import traceback from typing import Callable, Dict, Iterator, List, Optional, Type, Tuple import numpy as np - +import cv2 +import attr from qtpy import QtCore, QtWidgets, QtGui +from qtpy.QtWidgets import QMessageBox, QProgressDialog +from sleap.util import get_package_file from sleap.skeleton import Node, Skeleton from sleap.instance import Instance, PredictedInstance, Point, Track, LabeledFrame from sleap.io.video import Video @@ -54,7 +56,7 @@ class which inherits from `AppCommand` (or a more specialized class such as from sleap.gui.dialogs.importvideos import ImportVideos from sleap.gui.dialogs.filedialog import FileDialog from sleap.gui.dialogs.missingfiles import MissingFilesDialog -from sleap.gui.dialogs.merge import MergeDialog +from sleap.gui.dialogs.merge import MergeDialog, ReplaceSkeletonTableDialog from sleap.gui.dialogs.message import MessageDialog from sleap.gui.dialogs.query import QueryDialog from sleap.gui.suggestions import VideoFrameSuggestions @@ -64,6 +66,8 @@ class which inherits from `AppCommand` (or a more specialized class such as # Indicates whether we support multiple project windows (i.e., "open" opens new window) OPEN_IN_NEW = True +logger = logging.getLogger(__name__) + class UpdateTopic(Enum): """Topics so context can tell callback what was updated by the command.""" @@ -424,6 +428,10 @@ def removeVideo(self): """Removes selected video from project.""" self.execute(RemoveVideo) + def openSkeletonTemplate(self): + """Shows gui for loading saved skeleton into project.""" + self.execute(OpenSkeleton, template=True) + def openSkeleton(self): """Shows gui for loading saved skeleton into project.""" self.execute(OpenSkeleton) @@ -1854,7 +1862,7 @@ def load_skeleton(filename: str): @staticmethod def compare_skeletons( skeleton: Skeleton, new_skeleton: Skeleton - ) -> Tuple[List[str], List[str]]: + ) -> Tuple[List[str], List[str], List[str]]: delete_nodes = [] add_nodes = [] @@ -1865,7 +1873,12 @@ def compare_skeletons( delete_nodes = [node for node in base_nodes if node not in new_nodes] add_nodes = [node for node in new_nodes if node not in base_nodes] - return delete_nodes, add_nodes + # We want to run this even if the skeletons are the same + rename_nodes = [ + node for node in skeleton.node_names if node not in delete_nodes + ] + + return rename_nodes, delete_nodes, add_nodes @staticmethod def delete_extra_skeletons(labels: Labels): @@ -1888,11 +1901,20 @@ def delete_extra_skeletons(labels: Labels): @staticmethod def ask(context: CommandContext, params: dict) -> bool: - filters = ["JSON skeleton (*.json)", "HDF5 skeleton (*.h5 *.hdf5)"] - filename, selected_filter = FileDialog.open( - context.app, dir=None, caption="Open skeleton...", filter=";;".join(filters) - ) + # Check whether to load from file or preset + if params.get("template", False): + # Get selected template from dropdown + template = context.app.skeletonTemplates.currentText() + # Load from selected preset + filename = get_package_file(f"sleap/skeletons/{template}.json") + else: + filename, selected_filter = FileDialog.open( + context.app, + dir=None, + caption="Open skeleton...", + filter=";;".join(filters), + ) if len(filename) == 0: return False @@ -1905,27 +1927,26 @@ def ask(context: CommandContext, params: dict) -> bool: # Load new skeleton and compare new_skeleton = OpenSkeleton.load_skeleton(filename) - (delete_nodes, add_nodes) = OpenSkeleton.compare_skeletons( + (rename_nodes, delete_nodes, add_nodes) = OpenSkeleton.compare_skeletons( skeleton, new_skeleton ) if (len(delete_nodes) > 0) or (len(add_nodes) > 0): - # Warn about mismatching skeletons - title = "Replace Skeleton" - message = ( - "

Warning: Pre-existing skeleton found." - "

The following nodes will be deleted from all instances:" - f"
From base labels: {','.join(delete_nodes)}

" - "

The following nodes will be added to all instances:
" - f"From new labels: {','.join(add_nodes)}

" - "

Nodes can be deleted or merged from the skeleton editor after " - "merging labels.

" + # Allow user to link mismatched nodes + query = ReplaceSkeletonTableDialog( + rename_nodes=rename_nodes, + delete_nodes=delete_nodes, + add_nodes=add_nodes, ) - query = QueryDialog(title=title, message=message) query.exec_() # Give the okay to add/delete nodes - okay = bool(query.result()) + linked_nodes: Optional[Dict[str, str]] = query.result() + if linked_nodes is not None: + delete_nodes = list(set(delete_nodes) - set(linked_nodes.values())) + add_nodes = list(set(add_nodes) - set(linked_nodes.keys())) + params["linked_nodes"] = linked_nodes + okay = True params["delete_nodes"] = delete_nodes params["add_nodes"] = add_nodes @@ -1935,10 +1956,46 @@ def ask(context: CommandContext, params: dict) -> bool: @staticmethod def do_action(context: CommandContext, params: dict): + """Replace skeleton with new skeleton. + + Note that we modify the existing skeleton in-place to essentially match the new + skeleton. However, we cannot rename the skeleton since `Skeleton.name` is used + for hashing (see `Skeleton.name` setter). + + Args: + context: CommandContext + params: dict + filename: str + delete_nodes: List[str] + add_nodes: List[str] + linked_nodes: Dict[str, str] + + Returns: + None + """ + + # TODO (LM): This is a hack to get around the fact that we do some dangerous + # in-place operations on the skeleton. We should fix this. + def try_and_skip_if_error(func, *args, **kwargs): + """This is a helper function to try and skip if there is an error.""" + try: + func(*args, **kwargs) + except Exception as e: + tb_str = traceback.format_exception( + etype=type(e), value=e, tb=e.__traceback__ + ) + logger.warning( + f"Recieved the following error while replacing skeleton:\n" + f"{''.join(tb_str)}" + ) # Load new skeleton filename = params["filename"] new_skeleton = OpenSkeleton.load_skeleton(filename) + if new_skeleton.description == None: + new_skeleton.description = f"Custom Skeleton loaded from {filename}" + context.state["skeleton_description"] = new_skeleton.description + context.state["skeleton_preview_image"] = new_skeleton.preview_image # Case 1: No skeleton exists in project if len(context.labels.skeletons) == 0: @@ -1958,7 +2015,7 @@ def do_action(context: CommandContext, params: dict): add_nodes: List[str] = params["add_nodes"] else: # Otherwise, load new skeleton and compare - (delete_nodes, add_nodes) = OpenSkeleton.compare_skeletons( + (rename_nodes, delete_nodes, add_nodes) = OpenSkeleton.compare_skeletons( skeleton, new_skeleton ) @@ -1966,22 +2023,28 @@ def do_action(context: CommandContext, params: dict): for src, dst in skeleton.symmetries: skeleton.delete_symmetry(src, dst) + # Link mismatched nodes + if "linked_nodes" in params.keys(): + linked_nodes = params["linked_nodes"] + for new_name, old_name in linked_nodes.items(): + try_and_skip_if_error(skeleton.relabel_node, old_name, new_name) + # Delete nodes from skeleton that are not in new skeleton for node in delete_nodes: - skeleton.delete_node(node) + try_and_skip_if_error(skeleton.delete_node, node) # Add nodes that only exist in the new skeleton for node in add_nodes: - skeleton.add_node(node) + try_and_skip_if_error(skeleton.add_node, node) # Add edges skeleton.clear_edges() for src, dest in new_skeleton.edges: - skeleton.add_edge(src.name, dest.name) + try_and_skip_if_error(skeleton.add_edge, src.name, dest.name) # Add new symmetry for src, dst in new_skeleton.symmetries: - skeleton.add_symmetry(src.name, dst.name) + try_and_skip_if_error(skeleton.add_symmetry, src.name, dst.name) # Set state of context context.state["skeleton"] = skeleton diff --git a/sleap/gui/dialogs/merge.py b/sleap/gui/dialogs/merge.py index ff0dca008..3dd90eb0e 100644 --- a/sleap/gui/dialogs/merge.py +++ b/sleap/gui/dialogs/merge.py @@ -2,20 +2,23 @@ Gui for merging two labels files with options to resolve conflicts. """ -import attr -from typing import Dict, List +import logging +from typing import Dict, List, Optional + +import attr +from qtpy import QtWidgets, QtCore from sleap.instance import LabeledFrame from sleap.io.dataset import Labels -from qtpy import QtWidgets, QtCore - USE_BASE_STRING = "Use base, discard conflicting new instances" USE_NEW_STRING = "Use new, discard conflicting base instances" USE_NEITHER_STRING = "Discard all conflicting instances" CLEAN_STRING = "Accept clean merge" +log = logging.getLogger(__name__) + class MergeDialog(QtWidgets.QDialog): """ @@ -301,6 +304,258 @@ def headerData( return None +class ReplaceSkeletonTableDialog(QtWidgets.QDialog): + """Qt dialog for handling skeleton replacement. + + Args: + rename_nodes: The nodes that will be renamed. + delete_nodes: The nodes that will be deleted. + add_nodes: The nodes that will be added. + skeleton_nodes: The nodes in the current skeleton. + new_skeleton_nodes: The nodes in the new skeleton. + + Attributes: + results_data: The results of the dialog. This is a dictionary with the keys + being the new node names and the values being the old node names. + delete_nodes: The nodes that will be deleted. + add_nodes: The nodes that will be added. + table: The table widget that displays the nodes. + + Methods: + add_combo_boxes_to_table: Add combo boxes to the table. + find_unused_nodes: Find unused nodes. + create_combo_box: Create a combo box. + get_table_data: Get the data from the table. + accept: Accept the dialog. + result: Get the result of the dialog. + + Returns: + If accepted, returns a dictionary with the keys being the new node names and the values being the + old node names. If rejected, returns None. + """ + + def __init__( + self, + rename_nodes: List[str], + delete_nodes: List[str], + add_nodes: List[str], + *args, + **kwargs, + ): + super().__init__(*args, **kwargs) + + # The only data we need + self.rename_nodes = rename_nodes + self.delete_nodes = delete_nodes + self.add_nodes = add_nodes + + # We want the skeleton nodes to be ordered with rename nodes first + self.skeleton_nodes = list(self.rename_nodes) + self.skeleton_nodes.extend(self.delete_nodes) + self.new_skeleton_nodes = list(self.rename_nodes) + self.new_skeleton_nodes.extend(self.add_nodes) + + self.results_data: Optional[Dict[str, str]] = None + + # Set table name + self.setWindowTitle("Replace Nodes") + + # Add table to dialog (if any nodes exist to link) + if (len(self.add_nodes) > 0) or (len(self.delete_nodes) > 0): + self.create_table() + else: + self.table = None + + # Add table and message to application + layout = QtWidgets.QVBoxLayout(self) + + # Dynamically create message + message = "

Warning: Pre-existing skeleton found." + if len(self.delete_nodes) > 0: + message += ( + "

The following nodes will be deleted from all instances:" + f"
From base labels: {', '.join(self.delete_nodes)}

" + ) + else: + message += "

No nodes will be deleted.

" + if len(self.add_nodes) > 0: + message += ( + "

The following nodes will be added to all instances:
" + f"From new labels: {', '.join(self.add_nodes)}

" + ) + else: + message += "

No nodes will be added.

" + if self.table is not None: + message += ( + "

Old nodes to can be linked to new nodes via the table below.

" + ) + + label = QtWidgets.QLabel(message) + label.setWordWrap(True) + layout.addWidget(label) + if self.table is not None: + layout.addWidget(self.table) + + # Add button to application + button = QtWidgets.QPushButton("Replace") + button.clicked.connect(self.accept) + layout.addWidget(button) + + # Set layout (otherwise nothing will be shown) + self.setLayout(layout) + + def create_table(self: "ReplaceSkeletonTableDialog") -> QtWidgets.QTableWidget: + """Create the table widget.""" + + self.table = QtWidgets.QTableWidget(self) + + if self.table is None: + return + + # Create QTable Widget to display skeleton differences + self.table.setColumnCount(2) + self.table.setRowCount(len(self.new_skeleton_nodes)) + self.table.setHorizontalHeaderLabels(["New", "Old"]) + self.table.verticalHeader().setVisible(False) + self.table.horizontalHeader().setSectionResizeMode( + QtWidgets.QHeaderView.Stretch + ) + self.table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) + self.table.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + self.table.setShowGrid(False) + self.table.setAlternatingRowColors(True) + + # Add data to table + column = 0 + for i, new_node in enumerate(self.new_skeleton_nodes): + row = i + self.table.setItem(row, column, QtWidgets.QTableWidgetItem(new_node)) + self.add_combo_boxes_to_table(init=True) + + def add_combo_boxes_to_table( + self: "ReplaceSkeletonTableDialog", + init: bool = False, + ): + """Adds combo boxes to table. + + Args: + init: If True, the combo boxes will be initialized with all + `self.delete_nodes`. If False, the combo boxes will be initialized with + all `self.delete_nodes` excluding nodes that have already been used by + other combo boxes. + """ + if self.table is None: + return + + for i in range(self.table.rowCount()): + # Get text from table item in column 1 + new_node_name = self.table.item(i, 0).text() + if init and (new_node_name in self.rename_nodes): + current_combo_text = new_node_name + else: + current_combo = self.table.cellWidget(i, 1) + current_combo_text = ( + current_combo.currentText() if current_combo else "" + ) + self.table.setCellWidget( + i, + 1, + self.create_combo_box(set_text=current_combo_text, init=init), + ) + + def find_unused_nodes(self: "ReplaceSkeletonTableDialog"): + """Finds set of nodes from `delete_nodes` that are not used by combo boxes. + + Returns: + List of unused nodes. + """ + if self.table is None: + return + + unused_nodes = set(self.skeleton_nodes) + for i in range(self.table.rowCount()): + combo = self.table.cellWidget(i, 1) + if combo is None: + break + elif combo.currentText() in unused_nodes: + unused_nodes.remove(combo.currentText()) + return list(unused_nodes) + + def create_combo_box( + self: "ReplaceSkeletonTableDialog", + set_text: str = "", + init: bool = False, + ): + """Creates combo box with unused nodes from `delete_nodes`. + + Args: + set_text: Text to set combo box to. + init: If True, the combo boxes will be initialized with all + `self.delete_nodes`. If False, the combo boxes will be initialized with + all `self.delete_nodes` excluding nodes that have already been used by + other combo boxes. + + Returns: + Combo box with unused nodes from `delete_nodes` plus an empty string and the + `set_text`. + """ + unused_nodes = self.delete_nodes if init else self.find_unused_nodes() + combo = QtWidgets.QComboBox() + combo.addItem("") + if set_text != "": + combo.addItem(set_text) + combo.addItems(sorted(unused_nodes)) + combo.setCurrentText(set_text) # Set text to current text + combo.currentTextChanged.connect( + lambda: self.add_combo_boxes_to_table(init=False) + ) + return combo + + def get_table_data(self: "ReplaceSkeletonTableDialog"): + """Gets data from table.""" + if self.table is None: + return {} + + data = {} + for i in range(self.table.rowCount()): + new_node = self.table.item(i, 0).text() + old_node = self.table.cellWidget(i, 1).currentText() + if (old_node != "") and (new_node != old_node): + data[new_node] = old_node + + # Sort the data s.t. skeleton nodes are renamed to new nodes first + data = dict( + sorted(data.items(), key=lambda item: item[0] in self.skeleton_nodes) + ) + + # This case happens if exclusively bipartite match (new) `self.rename_nodes` + # with set including (old) `self.delete_nodes` and `self.rename_nodes` + if len(data) > 0: + first_new_node, first_old_node = list(data.items())[0] + if first_new_node in self.skeleton_nodes: + # Reordering has failed! + log.debug(f"Linked nodes (new: old): {data}") + raise ValueError( + f"Cannot rename skeleton node '{first_old_node}' to already existing " + f"node '{first_new_node}'. Please rename existing skeleton node " + f"'{first_new_node}' manually before linking." + ) + return data + + def accept(self): + """Overrides accept method to return table data.""" + try: + self.results_data = self.get_table_data() + except ValueError as e: + QtWidgets.QMessageBox.critical(self, "Error", str(e)) + return # Allow user to fix error if possible instead of closing dialog + super().accept() + + def result(self): + """Overrides result method to return table data.""" + return self.get_table_data() if self.results_data is None else self.results_data + + def show_instance_type_counts(instance_list: List["Instance"]) -> str: """ Returns string of instance counts to show in table. @@ -316,23 +571,3 @@ def show_instance_type_counts(instance_list: List["Instance"]) -> str: ) user_count = len(instance_list) - prediction_count return f"{user_count} (user) / {prediction_count} (pred)" - - -if __name__ == "__main__": - - # file_a = "tests/data/json_format_v1/centered_pair.json" - # file_b = "tests/data/json_format_v2/centered_pair_predictions.json" - # file_a = "files/merge/a.h5" - # file_b = "files/merge/b.h5" - file_a = r"sleap_sandbox/skeleton_merge_conflicts/base_labels.slp" - # file_b = r"sleap_sandbox/skeleton_merge_conflicts/labels.renamed_node.slp") - # file_b = r"sleap_sandbox/skeleton_merge_conflicts/labels.new_node.slp" - file_b = r"sleap_sandbox/skeleton_merge_conflicts/labels.deleted_node.slp" - - base_labels = Labels.load_file(file_a) - new_labels = Labels.load_file(file_b) - - app = QtWidgets.QApplication() - win = MergeDialog(base_labels, new_labels) - win.show() - app.exec_() diff --git a/sleap/gui/no-preview.png b/sleap/gui/no-preview.png new file mode 100644 index 000000000..1aec2a76b Binary files /dev/null and b/sleap/gui/no-preview.png differ diff --git a/sleap/gui/widgets/views.py b/sleap/gui/widgets/views.py new file mode 100644 index 000000000..ec3477ed2 --- /dev/null +++ b/sleap/gui/widgets/views.py @@ -0,0 +1,103 @@ +"""GUI code for the views (e.g. Videos, Skeleton, Labeling Suggestions, etc.).""" + +from typing import Tuple +from qtpy.QtWidgets import ( + QWidget, + QHBoxLayout, + QVBoxLayout, + QToolButton, + QFrame, + QSizePolicy, + QComboBox, +) +from qtpy.QtCore import Qt +from qtpy.QtGui import QCursor + + +class CollapsibleWidget(QWidget): + """An animated collapsible QWidget. + + Derived from: https://stackoverflow.com/a/37119983/13281260 + """ + + def __init__(self, title: str, parent: QWidget = None): + super().__init__(parent=parent) + + # Create the header widget which contains the toggle button. + self.header_widget, self.toggle_button = self.create_header_widget(title) + + # Content area for setting an external layout to. + self.content_area = QWidget() + + # Tie everything together in a main layout. + main_layout = self.create_main_layout() + self.setLayout(main_layout) + + def create_toggle_button(self, title="") -> QToolButton: + """Create our custom toggle button.""" + + toggle_button = QToolButton() + toggle_button.setStyleSheet("QToolButton { border: none; }") + toggle_button.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + toggle_button.setArrowType(Qt.ArrowType.RightArrow) + toggle_button.setText(title) + toggle_button.setCheckable(True) + toggle_button.setChecked(False) + toggle_button.setCursor(QCursor(Qt.PointingHandCursor)) + + toggle_button.clicked.connect(self.toggle_button_callback) + + return toggle_button + + def create_header_widget(self, title="") -> Tuple[QWidget, QToolButton]: + """Create header widget which includes `QToolButton` and `QFrame`.""" + + # Create our custom toggle button. + toggle_button = self.create_toggle_button(title) + + # Create the header line. + header_line = QFrame() + header_line.setFrameShape(QFrame.HLine) + header_line.setFrameShadow(QFrame.Plain) + header_line.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) + header_line.setStyleSheet("color: #dcdcdc") + + # Created the layout for the header. + header_layout = QHBoxLayout() + header_layout.addWidget(toggle_button) + header_layout.addWidget(header_line) + header_layout.setContentsMargins(0, 0, 0, 0) + + # Create a widget to apply the header layout to. + header_widget = QWidget() + header_widget.setLayout(header_layout) + + return header_widget, toggle_button + + def create_main_layout(self) -> QVBoxLayout: + """Tie everything together in a main layout.""" + + main_layout = QVBoxLayout() + main_layout.addWidget(self.header_widget) + main_layout.addWidget(self.content_area) + main_layout.setContentsMargins(0, 0, 0, 0) + + return main_layout + + def toggle_button_callback(self, checked: bool): + self.toggle_button.setArrowType( + Qt.ArrowType.DownArrow if checked else Qt.ArrowType.RightArrow + ) + + # Hide children if we're collapsing + for child in self.content_area.findChildren(QWidget): + child.setVisible(checked) + + # Collapse combo box (otherwise, visiblity opens combo) + if checked: + combo = self.content_area.findChild(QComboBox) + combo.hidePopup() + + def set_content_layout(self, content_layout): + self.content_area.setLayout(content_layout) + self.toggle_button_callback(self.toggle_button.isChecked()) diff --git a/sleap/instance.py b/sleap/instance.py index 8eb24c1a2..c14038552 100644 --- a/sleap/instance.py +++ b/sleap/instance.py @@ -799,11 +799,11 @@ def fill_missing( """ self._fix_array() y1, x1, y2, x2 = self.bounding_box - y1, x1 = max(y1, 0), max(x1, 0) + y1, x1 = np.nanmax([y1, 0]), np.nanmax([x1, 0]) if max_x is not None: - x2 = min(x2, max_x) + x2 = np.nanmin([x2, max_x]) if max_y is not None: - y2 = min(y2, max_y) + y2 = np.nanmin([y2, max_y]) w, h = y2 - y1, x2 - x1 for node in self.skeleton.nodes: diff --git a/sleap/io/dataset.py b/sleap/io/dataset.py index 044d55758..6ebe27822 100644 --- a/sleap/io/dataset.py +++ b/sleap/io/dataset.py @@ -2618,6 +2618,7 @@ def video_callback( for i, filename in enumerate(filenames): if missing[i]: filenames[i] = new_paths[i] + missing[i] = False # Solely for testing since only gui will have a `CommandContext` context["changed_on_load"] = True diff --git a/sleap/nn/viz.py b/sleap/nn/viz.py index 6fe5bf4ba..4fd6e8272 100644 --- a/sleap/nn/viz.py +++ b/sleap/nn/viz.py @@ -4,7 +4,11 @@ import matplotlib import matplotlib.pyplot as plt import seaborn as sns +import base64 from typing import Union, Tuple, Optional, Text +from sleap import Instance +from io import BytesIO +from PIL import Image def imgfig( @@ -194,7 +198,7 @@ def plot_instance( ms=10, bbox=None, scale=1.0, - **kwargs + **kwargs, ): """Plot a single instance with edge coloring.""" if cmap is None: @@ -296,3 +300,87 @@ def plot_bbox(bbox, **kwargs): bbox = bbox.bounding_box y1, x1, y2, x2 = bbox plt.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "-", **kwargs) + + +def generate_skeleton_preview_image( + instance: Instance, square_bb: bool = True, thumbnail_size=(128, 128) +) -> bytes: + """Generate preview image for skeleton based on given instance. + + Args: + instance: A `sleap.Instance` object for which to generate the preview image from. + square_bb: A boolean flag for whether or not the preview image should be a square image + thumbnail_size: A tuple of (w,h) for what the size of the thumbnail image should be + + Returns: + A byte string encoding of the preview image. + """ + + def get_square_bounding_box(bb): + """Convert rectangular bounding box to square bounding box. + + Args: + bb: A tuple representing a bounding box in `sleap.Instance.bounding_box` + with the format [y1, x1, y2, x2] + + Returns: + A square bounding box in `PIL.Image.crop()` with the format [x1, y1, x2, y2] + """ + + y1, x1, y2, x2 = bb + + # Get side lengths + dist_x = x2 - x1 + dist_y = y2 - y1 + + mid_x = x1 + dist_x / 2 + mid_y = y1 + dist_y / 2 + + # Get max side length to use as square side length + max_dist = max(dist_x, dist_y) + + # Get new coordinates + new_x1 = mid_x - max_dist / 2 + new_x2 = mid_x + max_dist / 2 + new_y1 = mid_y - max_dist / 2 + new_y2 = mid_y + max_dist / 2 + + assert new_x2 - new_x1 == new_y2 - new_y1, ValueError( + f"{new_x2-new_x1} != {new_y2-new_y1}" + ) + return (new_x1, new_y1, new_x2, new_y2) + + if square_bb: + x1, y1, x2, y2 = get_square_bounding_box(instance.bounding_box) + else: + y1, x1, y2, x2 = instance.bounding_box + bb = [x1, y1, x2, y2] + bb = [coor - 20 if idx < 2 else coor + 20 for idx, coor in enumerate(bb)] + + frame = plot_img(instance.video.get_frame(instance.frame_idx)) + + # Custom formula for scaling line width and marker size based on bounding box size. + max_dim = max(abs(y1 - y2), abs(x1 - x2)) + ms = int(max_dim / 7) + lw = int(max_dim / 30) + skeleton = plot_instance( + instance, skeleton=instance.skeleton, lw=lw, ms=ms, color_by_node=False + ) + + fig = skeleton[0][0].figure + ax = fig.gca() + ax.get_yaxis().set_visible(False) + ax.get_xaxis().set_visible(False) + fig.set(facecolor="white", frameon=False) + + img_buf = BytesIO() + plt.savefig(img_buf, format="png", facecolor="white") + im = Image.open(img_buf) + im = im.crop(bb) + im.thumbnail(thumbnail_size) + + img_stream = BytesIO() + im.save(img_stream, format="png") + img_bytes = img_stream.getvalue() # image in binary format + img_b64 = base64.b64encode(img_bytes) + return img_b64 diff --git a/sleap/skeleton.py b/sleap/skeleton.py index 064105a1f..e159aeb05 100644 --- a/sleap/skeleton.py +++ b/sleap/skeleton.py @@ -86,17 +86,22 @@ def matches(self, other: "Node") -> bool: class Skeleton: - """ - The main object for representing animal skeletons. + """The main object for representing animal skeletons. The skeleton represents the constituent parts of the animal whose pose is being estimated. - An index variable used to give skeletons a default name that should - be unique across all skeletons. + Attributes: + _skeleton_idx: An index variable used to give skeletons a default name that + should be unique across all skeletons. + preview_image: A byte string containing an encoded preview image for the + skeleton. + description: A text description of the skeleton. Used mostly for presets. """ _skeleton_idx = count(0) + preview_image: Optional[bytes] = None + description: Optional[str] = None def __init__(self, name: str = None): """Initialize an empty skeleton object. @@ -120,20 +125,23 @@ def __init__(self, name: str = None): def __repr__(self) -> str: """Return full description of the skeleton.""" return ( - f"Skeleton(name='{self.name}', " + f"Skeleton(name='{self.name}', ", + f"description='{self.description}', ", f"nodes={self.node_names}, " f"edges={self.edge_names}, " f"symmetries={self.symmetry_names}" - ")" + ")", ) def __str__(self) -> str: """Return short readable description of the skeleton.""" + description = self.description nodes = ", ".join(self.node_names) edges = ", ".join([f"{s}->{d}" for (s, d) in self.edge_names]) symm = ", ".join([f"{s}<->{d}" for (s, d) in self.symmetry_names]) return ( "Skeleton(" + f"description={description}, " f"nodes=[{nodes}], " f"edges=[{edges}], " f"symmetries=[{symm}]" @@ -797,8 +805,7 @@ def __len__(self) -> int: return len(self.nodes) def relabel_node(self, old_name: str, new_name: str): - """ - Relabel a single node to a new name. + """Relabel a single node to a new name. Args: old_name: The old name of the node. @@ -810,8 +817,7 @@ def relabel_node(self, old_name: str, new_name: str): self.relabel_nodes({old_name: new_name}) def relabel_nodes(self, mapping: Dict[str, str]): - """ - Relabel the nodes of the skeleton. + """Relabel the nodes of the skeleton. Args: mapping: A dictionary with the old labels as keys and new @@ -975,7 +981,12 @@ def to_json(self, node_to_idx: Optional[Dict[Node, int]] = None) -> str: indexed_node_graph = self._graph # Encode to JSON - json_str = jsonpickle.encode(json_graph.node_link_data(indexed_node_graph)) + dicts = { + "nx_graph": json_graph.node_link_data(indexed_node_graph), + "description": self.description, + "preview_image": self.preview_image, + } + json_str = jsonpickle.encode(dicts) return json_str @@ -1024,7 +1035,10 @@ def from_json( Returns: An instance of the `Skeleton` object decoded from the JSON. """ - graph = json_graph.node_link_graph(jsonpickle.decode(json_str)) + dicts = jsonpickle.decode(json_str) + if "nx_graph" not in dicts: + dicts = {"nx_graph": dicts, "description": None, "preview_image": None} + graph = json_graph.node_link_graph(dicts["nx_graph"]) # Replace graph node indices with corresponding nodes from node_map if idx_to_node is not None: @@ -1032,6 +1046,8 @@ def from_json( skeleton = Skeleton() skeleton._graph = graph + skeleton.description = dicts["description"] + skeleton.preview_image = dicts["preview_image"] return skeleton diff --git a/sleap/skeletons/bees.json b/sleap/skeletons/bees.json new file mode 100644 index 000000000..819c6a894 --- /dev/null +++ b/sleap/skeletons/bees.json @@ -0,0 +1 @@ +{"description": "Template Skeleton for bees reference dataset.", "nx_graph": {"directed": true, "graph": {"name": "Skeleton-1", "num_edges_inserted": 20}, "links": [{"edge_insert_idx": 0, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["thorax1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["head1", 1.0]}}, "type": {"py/reduce": [{"py/type": "sleap.skeleton.EdgeType"}, {"py/tuple": [1]}]}}, {"edge_insert_idx": 1, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["abdomen1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 6, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 8, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 10, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 12, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 14, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 15, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 18, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["wingL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 19, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["wingR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 2, "key": 0, "source": {"py/id": 2}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["antennaL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 3, "key": 0, "source": {"py/id": 2}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["antennaR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 4, "key": 0, "source": {"py/id": 13}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["antennaL2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 5, "key": 0, "source": {"py/id": 14}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["antennaR2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 7, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegL2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 9, "key": 0, "source": {"py/id": 6}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegR2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 11, "key": 0, "source": {"py/id": 7}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegL2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 13, "key": 0, "source": {"py/id": 8}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegR2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 16, "key": 0, "source": {"py/id": 9}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegL2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 17, "key": 0, "source": {"py/id": 10}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegR2", 1.0]}}, "type": {"py/id": 3}}], "multigraph": true, "nodes": [{"id": {"py/id": 1}}, {"id": {"py/id": 2}}, {"id": {"py/id": 4}}, {"id": {"py/id": 13}}, {"id": {"py/id": 15}}, {"id": {"py/id": 14}}, {"id": {"py/id": 16}}, {"id": {"py/id": 5}}, {"id": {"py/id": 17}}, {"id": {"py/id": 6}}, {"id": {"py/id": 18}}, {"id": {"py/id": 7}}, {"id": {"py/id": 19}}, {"id": {"py/id": 8}}, {"id": {"py/id": 20}}, {"id": {"py/id": 9}}, {"id": {"py/id": 21}}, {"id": {"py/id": 10}}, {"id": {"py/id": 22}}, {"id": {"py/id": 11}}, {"id": {"py/id": 12}}]}, "preview_image": {"py/b64": "aVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUlBQUFBQ0FDQVlBQUFERFBtSExBQUJZcFVsRVFWUjRuTFc5YWF4azZYbVk5NXkxVHEyMzZ1NjlUbTh6emRrNEhDN2lrTElsVXBRb1NxS2xTSFlNd1lhZEJIWmd3SWtUQkFFQyswZU01RmVRSHdrUU9MQ2RRTEFkTzdLMVdiYk1XS1FwV2hJcGl5T1RISEtHbkptZXRkZDd1L3Z1dFM5bitiNzhPUFdlKzlicDZ2RUMrd0FYOTk2cXMzemZ1Ky9IK1pWZitSWHJPQTYrNytPNkxvN2pJUC83dmsrbFVxRmFyV0t0QlNDS0lxSW93blZkSnBNSmNSeVRaUm16Mll3a1NjaXlqQ1JKU0pJRWF5MnRWb3RxdFVvY3g0eEdvK0p6WU9GNXJ1dmllUjdXV2x6WExaN2grejZPNDJDTUlVMVRqREVZWTVoTUpsaHJ5YkpzNGNkMVhjSXd4SEVjWnJNWmp1TWdoN1VXYTIzeFBLQjRaaGlHaEdGSXBWSWhDQUxTTkdVNm5SYlBTTk9VTkUyeDFoWnJjQnluK0Q1SmtnSm1ydXNXZTVSelpKK080K0I1WGdGYnovUElzcXhZcCt4VG5xVi81TG5HbUFKK251Y1Y4SkUxeWY3MDNuM2ZwMWFyRVVWUmNhOHN5L0Jsb1ZtV0xTQkZGaStiaWVNWWF5MlZTZ1hmOTR0RkpFbkNiRFlqeTdKaUVmSUFheTFKa2hTYjFJYzhRejlmZnphYnpRb0NjRjIzZUY0Y3h3VWhMTHVQN01GMVhZSWdLQWhEbnl1QUZzQTVqa09TSkJoanFGYXIrTDVQbG1YRnZnVVpjcDNzcmZ5L2ZDWUlMNi9SR0lQbmVRVUJBelNiellWN3lYbzEwdlhmUWxEQ0tQSXMvVndoYXYxZG1xWUxPQkNjK0dtYUxsQ1J2cEVzWGpqYjkzMmlLQ0lNUTRiRElkYmFBaGxsQ3BYN2pVYWpBcmxDSkhvVCtqa2FnSEplRUFURlp2VmE1Q2dEWG9Db3VVbUlRcDhuRWtDZUkvOVhLcFZpUGNZWWtpUlpJQnFORUwzbnh4R2psZ1J3eW1pZTV4RkZFVUVRTE1CTkNMRjhEN2xPZjE3K1RoT1J3RXMvWHhoRDQ4RFhuS2VScndsQ0tNcjNmWUlnS0c0bXlORWJsRU52ZURLWkZBU2c3eWRBMTlRc253R0ZTQlVpMVp6eHVFT0xUbU5NSVNabEw3SzJaY1FuYWtDcmpqSng2ZDhDY1BtdG42RUpYSE9zSEVFUVVLdlZGc1IxSE1jTDRsMUwxVEpzTlpObzJHdHBJN0FXcVJDR1lYR080TmVWaDJneHAyK2dOK0w3ZnZGWnRWcGQrRjREUlM5UTdpVjZUWDZXM2IrOENYbWV2bWNaRUdVa2lkcVpUcWNGUU10NzArZnE2MFZsQ0FMS25GNitYdmFzVmFVbXdHVjcwZ2dRd3BZZmZUL2dFWFdnY1NQZmFhbFVWdDJhR01vTUszdnd0Y2dRYWFDcHRtdzRpVTVPMC9RUnlhRTNXdVlHTVpTMHVOWFNwZ3hjRGVRc3k1aE9wNHpINHdWOXJrWHdNcU5MRzRiTE9FWHZUZXZOTXBJMVFwWkpTOW12bGhCaXZHcUVheUxXWWw5TEtNM3hqNU4wK2pseWY4L3pGczdSS2c4bzFxTWx1ekVtSjRBMFRRdkRSMjRrVktPSlFJQXZCb1hXTTJVT2VkeWlDOUV6SndMOWpES3c1Sm8wVFJtTlJvVStsN1ZvUUdseHFMbGU5aWE2VDR2aE1sY0pWK3FqTEFYS2hDUFBlNXpra0QzcFoyazRsd2x3bVVHNWJLMXlYaEFFaFpndkg1b1pOQk5vMWVScnhHamthTmRDMzJ3OEhoZWlSQmFsRFJTTkdJMzRNdVhyRFpkZEZyMEJBWTQ4ZnphYlBYS2VuS3ZGb2w2UDcvdkY4NVloWHo5TGM3eEdYSGxmWmYwdTV3bkI2ZnNBQ3lMZVdsdUkvYkxrTEt1V3N1ZWk5eWozZWR4ZTlPZGlDK25EMnJrUktQOElsOGlOOVFMa1p1SU82a1hwdjdWcUtLc1IyWUJHcWdCSEZxbnZKZjhuU2NKZ01EajFYVXZpdGF5bmhRdjEydVM1c3MvSHFSNU44R1UxbytHZzl5NTZ1Z3dEZVphR3Ezd21zWXF5ZWkxYjhlVzFsZFdqZUNsYXRXcTRhRHdzczZOOHZTa040R1djS1p4VTlnNUViR29ScVJjaVNKRy9reVFwQUtPNWROazFzdWtrU1VpekRCeHdIUi9IV2x3SGpGbEVkTmxDMXFwTFAzTVpsNVQzOERneFhEYndsdTIzTEJuMGQvcFoyaDNWM0YxR1lObVAxNGFuWEsvM3YyeVA1VmlMdFJaZmM5OHk5MEp2dHJ5QXNoZ3NIL3JoSW9Ma2Vkb1kwZWRwcVZDNGhwNUhFQVNzQm5XYWJnaXV3MUU2WnBqTmNGa09jSTFvYldnSkI1YWZLNGNtRmdIc01rbFdOdkRrL21YSlVqNi9iQWNKY2tXRmFkaVVQYVVQTXA3TExyYUdwZU00QmZPV3BaVmZGcUZhVDRnbzhuMS9xU0drRFN0dDFaYU5HYjJCWlJRcDU0ditsSTBZWTBpekZOODZmS0oyZ1cyM2p1L21HNXpZaERjbmU3dy9QUUs3YUhBSjhaVFZtVlpER3BBYVdBS1lNcUNYdVZ6YUEvZ2dUaGVnYTZLVWtIaVpFVFRoYU9TWFZaSStYeU8wZ0Z1YUxqeFB3czlhWlFDbm9XQzVVVGwwcW5XNjF1R2F1dlZDbDBXc0hpZWVoUHJMSWs4QUx2ZS9NcTJ5N29VWUxKbk43MVYxQWo1YU84ODRqYmszT3lra2dYNW0yV2pUQ0JHQWxxMWpUYnhhSkV1RVRodUwrcjRhUnZyUVhzRXlHMFY3UTh2ZytrRjcwbXE2Yk1SclExRWJnTUlZNGlXNVpVTlBHeGZhRGROLzYwT3JCNDAwRFJndFRzc0VJNGNFaUxTSWNseVhwZ25vSkFFWkZpMnNEUmJYY1hpcXVvSG51SThZZHN1ZXBhV1RUaXpwMEhGWnJCcGpGaUowWmFsV05zbzBYSVNJeXM5M0hLZElkaTBUMTFwU0xTTW9RYlMyRjJRTm1tamx0MGh3dlErQmxhODNyQ2xKYnFZL0V4MFNCTUVDVW5YMnFueVU3MWxXQjNJUE9WZTdpRW1XVXJNVlhBdm1VUzhSWXkwcmZwWElEWmlZWkVFR2lDalV4Q2pjSVFBUjZTWVNSemhIemhlOStUaHhMOFJkZHU4MFFaUzlBYm1uNjdyRWNWdzhSODdWbHJ3bXVESk10VDZYMzJFWUZ2L0wvWHpmSnd6RElwZ21zSkUxK1dXcTF4d2hDOUFMeTdLTU9JNkxuRUFVUmNVRE5RZnJleTVEdHQ2Y3RnMkU2S0lvd2hwRGFqTndIT0JSNGdMSXJDRTFHZGFZK1htTGExN212NHNVRTBCb2c3WXNPc013SkUzVHd2MHR3NnNzZ3N2aVhoQW14Q2U2dUd6elNKUlVjaC9MVkpnOFYvYWxEVCtkb1pWbnl1K3k1QlppRDRJZ2p3UElJdVFHd2hsbHNTb1VxeEVtR2EzWmJFYXYxMk0ybXhYU29HeXA2a09MUS9sZmI5QjFYUndMSjNaR1RFU0E4d2dKdUk3RGcxbVBjVG9yakVNQlhKazdOU0MxTGhkQU9JNVQxQmhvc1Y2cFZIQmRsK2wweW5RNkxlNnZKV0Q1T2ZyK1pja25pSnZOWmd2bnkvUENNTVR6UE9JNEx0THNPbU1yNTJrQzF2alEwa2JEVjF4djdTVlVLcFhjQ0N5TFpxRWN5VmlKeUJmcElOU2tOeW1FTUI2UDZmZjd4UWJMd0JkdTBOL0pZaVhWWEtsVWl1OG1Uc1p1T09WeVhNdjlmaFlOT3V1QTUvdll6RHlTT0ZsR2ZGcmRpSGlVdlUwbWt5TElwTG5ZOHp6cTlUcFJGREVlanhtUHgwc05USjMyMXA2SEVKbm5lUVZCYWRkUDIxRUNJeWxNbVV3bWhlaGVKbGxsTDNwZlFSQVVkUnRsRDBqMkk5S2pJQUQ1VWhaZnFWU28xV29MQVJyUlc1UEpoREFNaWFLb0FKaHNzdEZvNEhrZWc4R0E4WGk4dExKRkRubVcxQm1JWWFRWEhDY3g3MllqanVPQWkwNlRwaDlSOGZKUXRMR0dLOUVhZTR6WkhaOHM5VXFXQVVpcWNZVHpaUjFKa2pBZWo0dTk2aEN5Y0UrajBjRDNmY2JqTVhFY1ArSzZsYTEwMlpzd2tlaHZ5Q1hxZUR3dTFpUkVJdmR5WFpkR28wRVloa1ZoaWlaaUhSZVF3cHRxdFZvd3JjYWJGTzRJRElUSWZCRkxjbUlZaGpRYWpRVkRUeDdTNy9jTDc2QlNxVENkVHFsV3ExUXFsY0lBQWFoV3F3V0JkTHZkWXBOQzRUcnhKSnhWVGdwWmF3dVZZcTJsaCtXMTNrMzJkaC93NmEybitOeFRIeVhPVWp4Y25xbHNNdkl5SnJNcDQ5RjRvZXhNOWlVQWxiV1dMWERoYkczNFN0RkdGRVVMeHFBdWlSTzFvVGxVZnNwTUlzL0tzb3pCWVBBSVF1VDhTcVd5UUNoU09qYWRUZ3RiUVdDbERlZGFyVWE5WGw5STZBbWhTVEpOcTVISlpISWFDdlo5bjJhenVZQU03ZFpKSlk1Mm1iSXNZendlTTV2TkN2RXR3UWJSbjUxT0I5ZDFDeUtRK3daQlFMMWVMd2hIMndDNmlrZnE4eHhybVV5bjNIbTR5NzI3ZDNsbSt3azJtNnRrSm1QVnFYTFcxcmxic2F6NFFhR0NaSjJ1NnhhbFh0cU5FaWtrK2xhckpsbnJjRGhrTXBrVWlORVNUMkFsZG85ZXM0aGhyWE9GRXdlRHdVSk5oSndqTlF5YThIUmdUS3FWdEJxV1FnODVWOWRzQUl4R282SnVVOXNMWWtqNjFscHF0UnExV3EzUURRSTBjZThnTDVZUTkwbW9Wa3VIOFhqTVpES2hVcWtVQ3hYdUZiRXA1V0ZoR0JiVk1HS1JDcVhLOCtVKzJyanlQWTlhSmVMdTRRNi85dTEveVYvNTNIK2FQeCs0NXEveVlESmc1cHBDRGMxbU04SXdYSkJtR3JrYUtKN25MUVNsdElSSWtxUW9FbzJpaUdxMVdud3ZRSmVpV0JHdHVzeE9ZQ21HcEU1ckMySG9RNHBxeCtNeGpVYWprQWpXTHFaL3RkMGtoQ0ZybjB3bUM4VTM0Z21JYWhQOCtlMTJ1OUNGMnJvVmNXT01lYXlJWG1ad0NUZm8yRFBrYWtFV0xSdVFCWXVFa1ZJc1FZWVVrV2pWMHVsMDZIYTcvTjViMytYVFY1L25FNWVmSVU0VGFsN0lrLzRxMzUzZUovRDlndU5samJKNTRWaDVscWdEN1VycHZXbUxQazFUaHNNaFNaSlFyVllYOGhVaUljb1NVaVNhTG1iVlJxTndzY0JkZTJCSmt0RHRkZ3NHbFdmSitZSk1UY2dDZnduNjZGaUk5bUJrVDc2SUFubG9lYkhDbWVXUWFXRkZ6cWxKSXpXTzQ0VXlhUUdJOWxWMTdFRFVpK1pPdlhoNWhoREEwZEVSM1g2ZmYvRE5ML1AwbVV0RVFZaXhoaWNxSGU3TnVoeGtZMEkvSUF6RGdwdEV6TVp4WEloYUxjNkZFN1VrMElqU0hwTFlDMXB5eXZYYTNSUENsaGlDMXI5YURTM3ppalN5eHVQY3JoSDdSUmhPdTUveUxCM0JGU0xVOXBEQVY0NGlFR1N0TGZ4T09UUUJpRmlXWWhEdHZwVDlVd0dFMU9hSi9wTG9uSEMycGxJNXl0RkhTVjZJR0kraWlHYXpTYlZTNGNidUxmN1o5LzZBUC91cEx6QkxZMXpINVpsb2s2OFAzc2Y2UHE3akxuQ1RKamJoTmtHc2NKTGV2eVpVelRteVY1RUdJcVpsNzhJQTVRcGZIYUxWdG9HMmY3U3hMRVFpUDNFY0U0WWg5WHA5Z2JIRWZpbkRNU2Nxa0MwNURuamU0ak44dVltSTJzZUplT0ZvVVJkQzlicDRRUnRRMnQrWERlc0ZDN0ZwU2k2WGNNczkwalF0bmlzQXFGYXIrSU1Cdi82dHIvSFMxZWU0dkhHR0pNdllxRFM1TWwzbFZqYkFjNzFpN2RMa1VSYnhvaG9FTVJMczBqRFFRTlVFN3poT1lVQktlWGVXWllYKzFVeWtJNUx5WElHZEpxNXlnS3k4bGppT0M2OUV4MlhLRVU5akxGbG1pQ0pEdTUzaGVaWitIM285RjJ2QmRlY3FRSXdsNFRTTnhESWhsSXNTUkgzSVVZNTZpYjdTM1RaaUYrak5sNUVpWEtuMXNMZzZVUlN4c3JKUzJBSkh2UlArenUvL0Z2L3puL3hMT1FDdDVabkdHVTZtQ1VPYkZOUmVmbzc4TCtzWEJoQXJ2R3lZQ1N6MFhnWEJJdTAwdDVZVFkvcGEvYmVjcXlXeDNGOUxIRG0wY1ZsV2xmcFphV280Zno3bHlTZFRvc2ppT0pDbXNMZm44TlpibGl3TGNGMlZEQ3BIdHNvaVNNU3h0Z1hLY1cxZDdLRUJWZGFST3ZLbHc4YkxnamdpUWJTNHJ0ZnJySzJ0Y1hoNHlHZzA0dmZmL0E2LysvUkgrZnlIUDhVc2lZbGNuNmNyRzN3bmZvRGxWT1JwaE9uc3BmN1JLdWh4eHpLZHFvbDIyYjNsdW5Kb1dzZEc1QnlORS8yM3VMUGFvMWttQWRMVXNMbVo4dXl6R2E0TGdsckhnZlBuTFk0VDg1M3ZKUFQ3ZzFNQ1dFYWxtaWkwY1NaVUtHRk40V1E0cmVYWDU4dW05SGxDTkdWZzZtZnF6OFF3RXorNzFXclI2WFE0UGo1bU9CcnhmMy90Ti9ub3BRL1JyamZKakdIYmEzTEc3WE0zNnkwQSs0TkVzeHhsZmI4TThmSy9Sb2JzVnh2UW1sTWZCMk85TjEyUVV6NWY0S0hYSXBJNWg2WG8rNHhMbHpJODcxVC95NUdtc0wxdG1jMzJlUEJnbU1jQnRGRlFYcHc4VkJ0bFdoTElvalVuNkdzMFVMVmtlVnl6aHY0dEtrYk9GUXRZUXFSbno1NHRJbzN2UGJqTHI3ejhWZjZyei85cE1tTndnT3ZCT252eGtPSGM2TlNpVW90Uk9lUlp5OXd0dlFjZGc5ZHJGODdYMmJ6SFBVdlVodXlueU03TmpWSDVmTmt6UkYyNXJrZVdHZExVRlBwK1k4Tnc1b3hsYmMxNUJQbHllQjVjdU5BaWpsZE9JNEhMcW5uTGg5WXpZdlRJNTlyd0s0ZVFNNFVBYlRCcW5hYzVTSDhud1JWOWpqeS8xV3F4dXJySzhmRXhZYVhDZC9kdmN2UG9QcGM2MjZRbVk4V0xlTUpwY21lOHUyQUhpRkdxa1NLY3FOUEJXb3FWOWE0UXZ4YjdlczlhQ21qWUNlRm9tSXRVbFZTd0pvQ3ljWmluNGtNY3h5Vk5Fenh2eHRtek1WdGJsdFZWU3hTQnRRNW1VYWd0SE5aQ0dOYW8xWnhUQWxpMldDMlNCSEI2TVpKQTBaR3pNaGN2RTFuNk9mSmJJMEtmSjBhWlBGZi9ybFFxYkc1dUZ1N2ROSW41QjkvOE1uLzFDMzh1bHg3V2NyMit4WGZUZDNnWXp3ZzhmK0daWmFPd2JQZG82ZllvRUU5RDJ0cHRLK3ZrRDdLdFJCMkoycHhPcDRWTEt0SlBpTUhhSExGeG5OSm94S3l0R1RZMlVqcWRqRW9sTi9LTU9SWDVyaXZYTEs3YmNXQTZ0ZHkvUHlQTHZOUEdFTm5RNHhaY0RpQm90MG1xZlRWeXRQaVN2M1hzUUFCUTF2dGw2U09jS21wSFJMRGo1Qm0wVHFkRHI5Zmo1czJiekdZei92RCtmZjdGdVNmNXVZLzlLTE1rcHVJSHZMUnhqYi8vZzkrbFZxL2pMY2tGbE5XVzdFMUVkRG0rWGhiTDJualU5OVZGR0ZxaWFLa28zcEhzVHplbjVzWmhCYzl6aVNLSDdlMkFTNWNNVzF2anVXWHZZTzJwa2VlNjRIa09TV0k1T2pKVUtnNnRWaTROckQwbGlqZmVTT2wyVTRMQTVqYUFka1hLb3YrVUFrLzFzc1NqeTdxeHZGazVYNTlYUGpTUjZiWG9ybFpCZkpxbWhHRzRRR1FDd05Gb2xNY1dUTWIvOC9VdjhZbkx6N0M1c2txYVpYeG84eUxYbTl1OHN2OCthKzNWUjNMK0lzM0VSUzAvVS9haHJmMHlzV2hKcDBQTldxSm9PRXFPSCtENCtCaGpETFZhRFhBQUI4L3pxVlk5enB6eHVIcTF5c1dMVlpwTnQrQjBhNTA1VWgwOEw3ZjhUMDRNOSsrbjdPeGtIQjlEcmVidzdMTStaODU0K0w1RHYyOTUrKzJFTzNjeVhIZWVDOURGbUhxQittOVp2QUJKUXJ3aXF1UmMwV1ZhbW9qdkx1Zm84OHZQS0J1aStocWRqaTM3NEpJc2tUYjBPK01IL0wydi96UCsybi95WDVBWnNGaCsrdWxQOHNydHQrZzZQVlphclFVN1JBaGRFNFZlcDdhUHlqcGZvb3h5cllodTdkZHJnMCtlMWV2MWFMVmE3TzN0MGUxMnFWU3FEQVpqbXMySUo1NW84dHh6TGE1ZGE3SzJGdUY1RG5rRERQTm5Pbk1MMzNCME5HTjNOMlozMTlMdHVpU0pnK1Brb3I3WE0vekJIOFJFa1lQdjU5K2xxY1h6bkxsNm1QY0dMdU5nYmNFS0Z5K3ppalhDTllJZVp3UG8rK3JQTmRDVy9XakRVaEFrQk5Ob05GaGRYV1U0SE9aR2t1dnhwZTk4bmM4Kzh3ays5ZFR6ek5LRTdaVTFmdXBEUDhUZi9hUGZ4bkV1VUowbnVDUzBMWHZSU0NvVHlUTFh0aHhIMFI2QUlGK2luZ0tudk5ONVFyOC81UER3aUNqeXVYeDVoUmRmUE1Peno2Nnh0VlVuQ0Z5eXpHS01KVTB0cnVzUUJBNVpaamsrbm5EbnpwaTdkeE42UFI5akFqelB4L1BBODhRYk9jWHBkT3BnVERvbkhBODR0ZXQ4cmF1MWxTc2JGcVFMNXkrejhPVzhNdmNJaDBoOFhDTlFQMGRMR0hsdStVY2JnSHA5QUsxV2k2dFhyNUttS2J1N3U4U3pHYVBaalAveks3L0M4MDljbytLSHhGbktqei83US96K2pWZTR1L2VBSjg1ZmZFUzNMNU5BMnVndEU2S3VQTmFFa3dNL0Q4Zkc4WXpwZERwWEN6R3pXY3pKU1JmWE5adzVVK2ZuZi80cFB2clJzMXk0c0VLbDRwTmxoaXl6SkltWkk5M0RXc1BKeVpUMzN1dHgrM2JNMFpIRjk1czBtK3ZVNnc1SkVpK284VEl6Z2NWYVE1Ymw2NU82RFd2dEtRR0lyNjI1WHBBdkNDNWJ3eG9weTVKRDhyZU8rUXZBeStwRlg3UE1adEFpV0JPZ2ZMYTJ0c2JUVHo5TnZWN245dTNiek9LWWI3LzdPci82ci80RmYvSEhmNEZwTWlQMEEvNnpQL1l6L0M5Zi9nZE14aFB3WEFKcmNKMUZOYWJ2djh3MTFkL3JDR1V1cGkyZWx4dGJvOUYwWHB3eTVlam9CTmMxbkR1M3dxYy9mWldQZkdTYksxZFdxVllESkc0ZngxbUJkTENjbkV4NTU1MURidHpvOGVCQmlyVVJxNnVyTkp0MXF0Vm93ZTNXdVgvdHhaUkQyb0lQK2R3WFNwWWdqeFpyMmtDVFVLOU9IMnVBQ0JISWRkcVEwdnBSdnRQNnNXd2NDc0ZwOTBvV3ZNenRsSFBXMTlkWldWbWgyV3p5emp2dmNHOTNoMS82Mm0veW84OStqQ3RiNTBpeWxPdG5ML0cvL2VuL2hsbVM4UGJSRHQrOC94WXprK0tWOGhJYXlacElOVEZJTlZPZWFUU3NyMWY0OElkcmREcTV6Yk96TSthM2Z1dVF5YVRQWno1emxrOTg0anhYcjY1UnI0ZHpwRnZpV0NSb2J1RDErelBlZWVlUWIzM3JIbSsrZWNoazRySzl2YzNhMmlxTlJwMTZ2YjZBQTFsWGVWWlRPWEZWSm1wSmtUdS85RXUvWksyMURBWUR1dDN1QWdDMENoRC9WQkF2UnFEOExaNkJqdnRMaFcrNVdVSXladVB4ZUdHVWl6NTBTTGtzUGZUR05BSEk4NlV5K2M2ZE83ejJnKy96eDU5OGdmLzF6LzkzU0hlQjU3bzRPSGlPeXp2N08vekRHMThudGlrbU94WG5aZmU0N01OTFhEN3ZHOGpZM283NC9PZGIxR3FueHBybnVReUhlUUJzWlNXYVN3eTVUKzZ5T1k3RGFKUnc5MjZmMTE4LzV2MzNCK3p2ajhreWkrKzdCSUZQdTkybVhxOHZGTExxSWg1anpNSTBzM0tsazhCcG1WMVZWQVZIVVM1ZXBGSlZJbmZMUklmV2ZUcWpWellZUmM5b3JoWC8zL2Q5R3MwR2Z1QVg1V1JwbXVJNnArN1hzbHI0c2o5ZGxoQ2k0OWJYMTJrMEdqU2FUZnhSVnFTVXNaWk1ERFl5bnR3OHo2ZTZIK0pyOTE3RG5UTitPVFd1Q1UxL2xvdmRETTl6K2VRbjY5UnFGdDA1WjR3aGlud2Noem1uNXhhODY3cE1KaWwzN295NWNlT0V0OS91MGUybWdFY1FWRmhiaXdvRTZqcEc3VTJJMFNvNDBsSEpjbUN0akhpOVByK2NhWk5hdk5sc1ZoQkMyVVhVQnArbVFsM2lMV0ZOWGRLbGtabGxLYUZUcDFNL1I5Q01tQ1VUSHB6YzRXUzB2NUJLTFZ2WlpaR21wWklXMTBLc1o4K2Y0MU9yMTZpR0ZSTHphSEE4c3huWDE4L3p1M2RleGRoSFU5Nnkzckp0SlBzZWpTWjBPaTdyNjJkSjAwZkQ1em5SUUJDNHhISEd6czZRR3plNnZQdnVnS09qQkdOeThTK3VyQ1kya2E1bHRTeFN0SnlIa2ZPa0Zhd2M1eWdUZ0xVVy8vajRlTUcvRjVFaDRtMDZuVEtaVEJaMGluYVpSUFQ2OHpvOHFZelI5UVhTM0dDTXdmUHpYdi8xNmpuV292TTV4d1Axb0VXbnRzWDlrL2U1ZGZCbTRjYVUvV2tCaWc3R0NJR0krSnRNSm94R28xeVNXSU8vN2tLcGUxZ2ZnZTlqTFF2RUtvYzhYd2UrWkYxeEhMTzdlNS9SS01Yem5zSThHdWNDY3E3L3hqZDJlT1dWUS9iM1o2UXArTDZINjRyK3pyTjAydENWRGlFdDhhU3FTVmN3aDJGWTRFckRTWWZ3ZFcrR0hJVXFIdzZIaFZzUUJFRlJSU3NMa2RKdDBkWGExUk5rU09PRDQrVGpXVFdIekdhem9oTFdtTHpSSXlCaXRYTU9Cd2N6Yi9lV3BaM3RYR0ZxUmh6MGQwbmk5QkZqUnlkSXlwdWFUcWVNUnFPRlpvczBUZG5ySHNPNXh5REhjVG5xZDVuT1pnaHphR05QL3RkU0QvTGkxK1BqWTQ2T0RuajY2WTloYllqalRMRjJrZEJjRjZaVHc2LzkydmZaMlRtbTNXN2hlWG1ybWRiVnN0NUdvMEc5WGllTzQ2SUdVTmNwNmhDejQrVDlESUxEVnF0Vk1HQjUzV1VWS2swa1Bwd0dQYlFQS2JsK1kweGh6RWtQZ053c0NJS2lZbGpyZGdsK1NLbVVGR2ZLb3RyVlRUekhLNUN2RHdlSDFkbzJ3K1NFd0U4Wmo4Y0ZSZXRXSjcwWkthR1dXanl0bWtMZjU0Mmp1L3p3NEJuV1d5djVtSm41SVpiL2I3M3lEVWF6RWExRzh4R3JYL1NxWHY5b05LTGY3eFBITVQvek16L05UL3pFVHpJZTM2Sld1NGNFV2ZKeklZcEN2dnJWRzl5NGNSdlhkVWlTUEFTczV5a0x4NGRoeUdnMEttWXpTeldWL2hINENpTUlRVWpIVnExV285VnFGVXdzQnFQZVV4QUVoYlF1Q2tLRXF1U0dTWklVbkMxR21aUSt6MmF6d2dzUWdoRWlFR3RVRDByU090cHhJUFNpNWV4SUxnbGNQQ2FUTWI2WDl5YUtWQ25iSHJyK1RzU2p0dGhGVmZYaUViLyt4aC93aTgvOEtDdXRPdGJKQ1cwOG52QTN2dlNQK08wMy9wQ3IxNjVoYXZWSERDc2RISko5VFNZVGdpRGdNNS81REMrOTlCTEdXRWFqaTNoZVJyVjZnTzlMOHN2eXU3OTdrNy81TjMrZk5JM25LbVF4WEN3WlB5bjRsR1FRbk5vOVVnMHRYVDlDQUNKMVphM0dHSWJESWRQcE5EZUE1LzBST2g0Z29YbXByU2lTUVJwUnhwaENiT3RHUXdHODdsQ1JCZWpPSVUyaDJoWndIQWVMWlpxTytDQ2Q3RGtCaHc5UEdNMEd0RmZhUmFHRTVuNmhlbDFTTGdEVEViNDBUUWs4bjF1alBkNStkWWRuMXk3aTFCMm1zNWkvL3Z0L20zLzUrc3VzZDFZWmowYlVhN1ZpQW1vNU9DWWNLeG04ejN6bU03end3Z3ZGc3owdjVOMTNHN3p5eWplcDFmSXA2amR1N1BGSGYvVCszQXRhTENnUm90SkZKRUxBdW1kUm1DckxNa2FqMFVKWnVQUUJhbHRCSktKMFIwa0JyVlJWNjBGZm51ZWR1b0Z5YUlyWG14ZGJRTTdSaTlmNmNsa3hneXpZZFYyd2NEemFZN054QWQ4THNTVTFZSzJoRWJYNGtRLy9OTC83blgvT2E5OS9sVnExenZyNk9sdGJXd3Rpcnh6NUVnTFY4NHg5M3llc2hBUitRUDI0eXVUQkRJdGw2TTVvbmwzakkrNkhHWS95aHRESlpGSklHcTF2ZFg0L0RFTis3TWQrak9lZWUyNmhQZXZnWUo5dmYvczc3TzVPMmRtNXo2MWJ0NWhPSnpoT3ZpZGpUdDJ5c2dGYmhycytSNnZUV3ExV3FHYkhjUmdNQm5RNkhScU54aU9SVzljOWJSS1pUQ1owT3AyaUcwdkhDbnlkMENuNzFrS3RJbHFxMWVwQ1prL2JBeHJSc29sbEZyVGp1RXlTQWJlUGJuQnA3V2tDdjNKcUFUSVgzZGF3MHVqd1U1LytVN2pHNDl0di9DRW5KOGRrSm1OdGRYV09qTVdBaDZ4YmpDSGQ0T3A1SHI3alVlMVZzQzY1OUlsY25ycDRuZFd6Ryt3OWZFaTMyMTBvNXdJVzFGbVdaVVJSeEJlKzhBV2VldXFwaFdLT25aMGRYbi85ZFR6UFpXTmpEY2V4dUs3bHpwMDdqRWFqQWw0YStEcmRyWDMwc3RHbUdVMEhvUVRPV1piUEdwQytUbUUrZVo0a24wYWpFWTFHbzhDTmZQZkloQkN0dDJXeHVvTkdQb05UdDBuN3EyVTNTdCt6UUxPQi9mNE9nMG1YdGZvMlVWaGpta3d3TnVQQzZqVThOeUF6R1pXZ3dwLzQ3Qyt5dFhhV2VKWnc5dXg1WE5kaDUvQVdCLzFkbVB2WTF1YkRxMWRXVmxoYld5dGFxZ3QzQ1NBMitHWk9oRURxWmxRYk5iWXFQcFg1RkpEUmFMUVFUOUR0YWRWcWxTOSs4WXRjdlhwMW9WRGtqVGZlNER2ZitVN3hNZ2FKRUxiYmJZNk9qZ3I3UkdDczArbTZMRTI3bUpxWlJCWHBsSE5aU2x0ckYrNTVLazFQMVlMT2V1cUVYVEVwdEN5cXRTV2RKRW5SQmlYVUs4RFJsS2l2MTRjdS9kYkVNSWtIM0psMjUvL25lZXpCcE11VDJ5OVFEZW9ZbTkvelV4LzU3RnlVNWdpL3VIV05OMjUranh2M3ZrTVFCTFRiYlRZM040dm9uenhUdURsSkU3SkJqSnZtMkhlc3d5aVpjSGh5Uk9nSFJWV1Ria1lWcVNYYzliTS8rN05jdkhpeFFJVG5lYno4OHN0ODdXdGZLN3drUVZhYXBnd0dBMXpYcGRsc0Z2ZlIxd3BzTlpkclZhcEZ1aGh1b3Y2RThlU2UxdWFoZkNFQUdiQ2hZemFpdnN0SFlRUXVJR2ZPcks3cllwM1RqaFRwRWRRTDExVzB5N2k5L0YwNWt1Zmdvajg2R2UzemczdmY1S250ajdCU1c4ZGFRNW9sQzllNHJzTnpWejdLOFdDUExKaHcrZkpsT3AxT0VReVJSdFBoY0pqbkJZWUR6TkVNeDF6S0NjQjFPSm4wZWZ1ZHQvQ2QwK25uMGtvdE1aSGhjTWphMmhvLzkzTS94L2IyOWtKSSs4dGYvakpmL3ZLWEMra25SQ0IrZTdWYVpYdDdtOEZnd0dBd0FCYnJKelN5eTFLem5EV1ZQVUV1UVdwell6VkpFa2FqRVpQSnBDQUdNVkxseU1QUjBVSm50MlpjZitGQk9GZ0RtV3Z3UXhkY0Y1TmFjT3pDellVQXhNb1dxdGI5Ymd0SWRoNU41anp1Y0IyWFNUemlqWjF2OGV6NVQ3SlNXMXRpS09ZYyt0U0Y1OWlQYnhKRjBZSkhNSnZOaXVUVy92NCtEdy8yMkRZcmVOdHU4WXo3eHcrNWNlY3RJcjlTM0ZPTDJUaU91WGp4SWovLzh6OWZGSjRLTWYvVGYvcFArZXBYdjFvWVplSXA2VFp1SFNFVkVheG5JY2d6dFFvdXovSHhQSzh3YUxWck81dk5pa0ZkZXFST0VzL0kwZ3J4YkVaWUNZdG5hTyt1bkVYMUYyTHNGbHJYYXJRL1hDWG8rTmpZTXJvVjAzdHRRcFpRSkdpMDM2OEJJeFJldG02MVh2bzNIVUtJR1NtcGlYT2lYSEtlc2ZrTHFicURvUENiaFNPR3d5SEQ0WkNIRHgveThPRkRKdkdValdZRDMvRXg1QUR2VG5NM3lYZDgzRGtYYXl2NzdObXovTXpQL0F3ckt5dkZIck1zNHpkKzR6ZjQrdGUvWG5DN25oNGl5SnpOWnNYa2tDSUpKZXVlNjJBeElpdVZDcTFXYTBHY3kyL2Y5d3Z2UytZTDZIY21TTDltR0FaVW9vaXpGNTlrYy9zOEpwbHh2SCtQTko1U2RyZkw5dDdwSzJPTXcvckhHMng5dG8zak9XQXNPRkRaRG9qTytEejhjcDk0RmhlQVdGYjdwNm10WE1LbExkM0hMV2poYzJSMi8zS0o0VGdRRHgzY3JFS2N6c2dTdzNnOExtWVRuWnljY0hKeWtxL0ZjNm02SVo3allxekJHb3RUOWRuZTNzYkVlVEJKOXVCNUh0ZXZYK2R6bi9zY1VSUVZSRCtiemZqVlgvMVZYbjc1NVFLaGdqUlJBV0luQ1ZFSXA0b2JwNnVucGJoVmhrc0lrVWtVVU53K0tUc1htMHZtR3duRFpXbEtlM1dMTC96aVgrYlNVeS9pVnlwTW5KaUQ3ajM2SjN0MDc5MW1jdWY5UityRGhZanlPRUJtaVRaQ05uNTRKVGUyZEZZcnM5UXZWV2g5dUVyeWc0dzBXQ3dnTGNlWlJScm9LSlU4VVB1L3k0aEJFNFUxaHYzK0RwdXQ4emh1eWJ1WSs5Wkg3NmFNUitzRVYvZEpnbkdSVmg0TUJneUh3d0tnbys2WWlnMXlXOE9Dd1pCNmk1bE1DYW84Kyt5ei9NaVAvRWdCZUtrditPVmYvbVZlZWVXVnd0Q1QvTHdFYVpJa0thSnd0VnFOWnJOWkdKV0R3YUJBbms3Y3lIVWl3VlpYVnpsMzdoeUR3WUNUazVPaTdYdzZuUzVFQ2FVRUxQQTkydTAyUC9lZi93OWNldW9GNG5SR0w1cVNWcURadmtqcnlpWE9mK3dsUmc5M09makc3MkRIZ3dMbUFzKzhQVHl6MUorbzROZGNUTElrcFpsQjg4a0t2VnNwSnBrWEt2TG9NRU5CdEk0MGxmMVpRYkFPV0dpOUtaR3Z5V1RDM3Y0Qlp1cnl3cE9meFBmOHdoYXdCdTYvMTZOM09NT3hGZUszempCZG45S25SNy9iWnpBWUZ1OG83UFY2N0I4ZkVOUmVQSTFSWUJtbEU1STQxN25yNit2VTYzV2VmLzU1UHZXcFR4WHF6Zk04aHNNaHYvN3J2ODVycjcxV2VCVnlIOTFKTEdwUnd0TzZIYjNWYWhYcVJaSmpPbFl2NnFUZGJzLzNQcVphamVhUnlZaFdNdy9wZW43QWFEUWh5U0NNR3JUWHR6bC85VG5PWDMyV09KNHlyaHVTQ2pnV1RGNEFDRUJ0K3l4ckwvMElSMS8veW9LTFh4Q0F0Ull2K29CdVdHTUpWMzFXditpUjNMVk1iaG5TSTR0SkRGbWFGV3BHR3l1NjdreXJCdm0vSERHVXo4YmpNYjFlajVPVEU4YmpNZSsrOHc0Mzc3M0xDMDk5Z2thandYUTI0ZkJCRDN0L0d3Y1hYQXVwVDdSM0RkOUxlSER3TnQxdWwrbjBkRlJLbGhrYWZsNXpMeG5JN3FTZnI0bDh6UysrK0NLZi9PUW5pL1Y1bmtlLzMrZTNmL3UzMmQzZExkN3ZwMmNCaUNFbXZRbVNETk9XdnFpRmZyOWZETlFVRlpBa0NWbWFZckdzZGpib3JMVG85ZnM0dUZTclRacXJaMml2YnRMZU9FdHJkWlBxeWlwQnZVbFFxK05YcXhCNlpLNmxiMktNYXpGZWp2enlZWktFMnBsekRGYzNpWS8yd0RtMXllWjFWekE5U0ZpU25GTlVBRjdUd1gvZW9YSTlKTmszY0NOZ2ZBUFNRWWIxTEY3Vlc2QXVheXlPNDg1RjlxTXJFd0lSemhxUHh4d2RIYkcvdjgvSnlVbVJqemc4T3VUOW5UZloyTmdrREFQQ01HQ3RjNVZtL3luY0xNQTZCbkRZeko1akVoaStPZnJIek15VXdNdUhTV3lkMjJaN1phTllRMnBTOW5xSHhEYW1Fb1I4OHBPZjVLV1hYbG9JcWh3ZEhmRTd2L003UEh6NHNKajk0emhPTWVoS0o1MTAxQTFPeCtGSTUxS2FKUFM2Si9SN0kzemZwOVdva3htb1Z1dXNycCtoMVZsbis5d2xOczlmb3RMc0VOU2JSQ3R0d25vZEp3cXdub3R4d1RnRzQxaG1HS2FrV0ZKQjMrTk1wZUp3UEIrLzNpQTlQc0JSU1M3ZmRWM2MwR1YwSjJaOGYwYjlmR1ZSRFRqa1JpRmdNNHROY3dLcW5IUFpQTmVnL1lrcS9YZkg5RzZNeVU1eXFlQzRMb0huNE5mbTE4NHN5UXdjZjNGUklrN2pPS2JYNjNGNGVNaisvajZEd1dDaGlDUk5VNDZDWTZJb3o0cUJ5eVI2aVBFbk5FNnVFMll0REJtR2pFdXRqMUMvMW1HODlpNk5qWURoWUpSYnlOTXRNcE9YWmNVMnBUOGVNSE9tL093WC93UXZ2ZlRTS1VCOG45M2RYYjd5bGE4d0dBd0t1eVlJZ21Jd1pObDk4N3c4eCtIT2JaUEplSlFIYnlvUmcvNkFKTE0wT21jNDAxbG4rOEpsT2x2bnFLK3VVKytzVVdtMThHc1JoRDdHc1JnM2IyUXhHS2JXUG9ya1JkU2Mvc3dObk94eGhKQ2wyT2tZei9keDUxNVptcWFuRXNETURMdGZQdUxjVDYxUk8xdGhYaWxOTXN6by9tQkV1QkpRdjFUQnE3cGdMUE1nSFdITFkrT0hXcXg5cE1ua1ljenc3Umo2aHJXUFZQQzNmWXdMN3RBeWVTdGw4SzVsSHBndDlQMW9OR0ozZHpkMzErYURGOFc2MXIzOElpSEV3czZTQ2hQM21INzFaVmI2MStsNGx6RTJJN01KNjlVTE9Pa1ozUEFodHZFK251TlRUYUw1bkZuQWQzanV4US96eEljdTg0bVBmMklocm4vcjFpMis5S1V2RlNQYXlsMitEcENsQ2VuY2ZuQUJHNFpVYXcwcXRTYU5sVlZXTnJacGI1NmxzMzJXMnVvNmxkWUtZYU9PVjYzZytGNk9hQ2V2MVUvblA1WTRGOThsS1Z4R3NnUDVNOGxkNFFTWUdNTXdNM2lPdzFiZ1BVSUVnZXR3Y3p5bE41MnhuUVAvdEM4QTVqcmFjNWdlSk56NjFUMGFseUtpOVpCMG1qRzhOV0YybU9LSEFlM3pUV3FYUTJwWGZZSlZEOGR6Y3FtUVdIQ2hkcjVDN1h3Rk1ndmVhZE9pV1hXby9YQ0lGeVVjdjVhQm15TzEzKzl6Ky9adDd0Mjd4M2c4TG5Tbnp1dnJJcFhaYkZha1JJMHhlSTVINWt6NWZ2L0xiSnJuZUtyejZWekhPeG5NWE14N1oyaHVXT0xhTGxIczRHYnpMc2s2ZlBhUC94aXJtK3NMR2IzMzNudVByM3psSzh4bU02cFJoRWxUYkphUnhqT1MyWXd3Q1BIYUVaMnRDelE2NjZ4dW42Tjk1aHlkTStlb3I2NFJyYXpnVnlQY01NQzZEZ2FEbGFZTWE4bHNDbWJ4ZlFzTFNIWWdyMWMrUFZKclNheGxiQ3pEek5ETk1rNnlqT1BVY0pKbWRMT01rVEVNamFIbXVQeVp0UmJYbzBvaExGemdZWnp5YTRNWkg2dFVPVGNkZ1NydlgzaHBGQzVrTTBQM3pSR09Nd1ljSEJmOGlvL3ZlU1FuR2QzRENZTWZPRlRPK05TZkRJa3UrSGpWUEloa05lbnB1a29MbVFQaGN6NlYyNFpKMXpBWTVtWGJPenM3UmRXUDcvc0xVeTNsRUNJUVExRzdsTk5KbnVsNk8vMEdaNitzMFI1OWlIUUdqbXV4MXNGL2NJNXMzZWU5Wjl0VVcyM1MxQkEwSnF5c1pwZzBMWUIvZkhEQXpmZmVJL0FEVE9SUXFUZXByM1NvZGRhb3ROY0lteXZVMXphSVZscUVqU1plSmNUeFBXeVI3alZ6amdac0RDVThheVE3Q3NsMmp1VFlXSWJHTURDR2JwcHhuR2FjWkRtU2Uxbkd5RmdteHBCeUtzZ2NsRHZ0K25TdDRlOGQ5dmhvUGVKNkpjUnpITzdNRXI0MW5uQ2NHV3BKakxFR3g1Nlc5Zm5hTFhEeTFZRUhydmZvQ3c1d3dBMGNUR0taM0VtWjNzMm9kSHlpU3o3Vkt6N0JXbjdPVW9QRUFwRkQ3WXhEYnovajhQaUVnNE9ENGlYVVlndm9raTVZYk1Zc0cxMlM2ODVuNkVXMHIxak9yYVRjLzVaRDB2ZHdNS1JuUXFwZi9DUjdHNmRWU0RhejFFZDlMa3g3T0s3SElERThJR0xqazU5bDVWTStYcTFPVUsvaFJ6VWNQdytKUzZyYXpnTkpLU2trcGJlbm9FUzFjeHFETTBCaUxET2JjMm92TlhRencxR2FjM00zeStobGhyRzFURzNPTzlaeHNQTTdpR1h2ZWg2ZXRmaFpobWN5U0JLODJSUi9Oc0dmVEVoYUt3eld0L2lEd1pnL0hJeUxaK1A1YkE1N3JIV1BTSHdYWDVEdisvbVVNQjJmRnQ5Y0NrVzFteWFBZHozSk4wUGFONHgva0JHL0M5RjVqK1lQZTFoL09SRWt4dUdITDZha2t4bS9jampoMWY2QWFaSVJlcms0aXRPWWRONVg1M3NPdm5lYVNOSzZXTGpmR0lQSk1xcFJoU2N1WG1TMXVjTEdoUUF2SFBId1d5NlRRWVh3cDg1UTNheGlrMFhsT3FtMXVCblZ3WEhJSEJkbnl5TndJQkJxdFhsZEFwbFprR2FpZzkwNWtvVzJEWmFac1V5dGlHckRTV1k0eWd6SG1hRnZESDFqbWRqOFBPbE5jS3pGczRZZ1MzR1RoR3FTNEV5R2VPTXhrVW1wSmpGTmExajFYY0xwaFBUa21QN0RCeVRkRSt4b1FFaSs1cXBqY2M1ZTRMdWYvd1Y2NjFzNFdTNG5ITWVsTmgzenFiZS9oemViWUx4NnZtWmJwUEVYWDFlaVU1QUZ4eWpPRTB1NHFBOXdjLzF2TXBkczErSjBEWGJUWFZRQmN5QjV4bkkrUzlpNDZQRGg3UXY4cTJjaS90RTNidktITi9hb2hpNmZmMkdMTTJ0MXByT1VsOTgrNEszZEhxSG5ZRTFHUEowdzZKMVFEWDA4MjhiRmdEVVkxMmYxL0ZVMlB2UVIzcGsyZWUyZGhBZER1RmVaY3UxY2k1ZTI2cGprVWYvV0JjeDhqcUFEWUxLNVdDMko2dmtIeG9KeEhLWVd4dFl5eUd3dW9yT01velRqT01rWVpDbkROR09XWldSSmpJMWozRGpHblUxeFJ3UEM2WmlWSkthV0psU1RtR0E2cHA2bGhFbE1rTVEwWEllNjYzQzh2OGZ1blR2NGpzT1ZKeTZ5dHJiT2REYWwyKzF5Y0hqSXJEOGd5VkljMThPclZyR3VpeHRGVk83djhLSGYrTHNjZlB5UDBidDRGZXY3YkhTUGVQYk8yNnoyajVtNkhyTjUybGhlQmVDdnJLd1VoUk1TbmRKbHgzQTZTRkphdUhUMWlxUk9YZGNsVGwybWJ4bXFHeTZaeTZsRjY0QjE0WmxCek1Zc0F3dVZ3T1Z6TDU3bGM4OXY4ZTEzRDZtSEhzOWNXVVU2SzN1OUNmLzdiNzdHMy9tOVd3U1ZDck9vamR2WVlyOTVrWEgxSW0rbkhRWk95R2c5d1BnMWZuL0hKOGtNcVluQmdTenphVjdMOWFCNWpKUHNvSnBOWFpjTVNDek1JTmZIU2NwSm5OQk5VN3B4VEhjOFpqZ2E1Y01vUmlQc2FJQTNSMkk5UzJsT3gzVEdJNXhCSDNjNndabE9ZRHJCVDFQUzJSU2JaVVNCejhiNk91MTJtNU51bHpoSjhQMkFlclBCbVRObnFWU3JWQjNJNHBpRGd3TU8rZ05PeHBOaWFubVNKS1RHNExnZXJ1Y3htNmZwQjhOaEhtMmNUcm4yemEreGV2TU5vbW9WTDAzSnJDRjJYRnhNWVV3blNaSkxlWW1YNjBwZVBUUlpWOXpLWitJYjY4OEFnc0RTZTkvRGl4ekM1MTFzTmMva09SbHcyMkRlNnpQWU1EU2JsZHhGU1BJbzRpYyt0RG0zaGd6U1c3WFNpUGlmL3N5TDNOMzZFYjR5dUVxbFdpWHhJM3FPbTlPVnpaTlZqZ09PeVlXdzYwQTRGMXhUNjJLUzlMSHhFUWVJamVWaDk0aHBtckYvY3N4b01tSFE2N0gvNEQ1bU9xSHV1UVR4RkhjNklUczVocE1qZ2w2UDFtaUlreVI0RGxTQ2tKVm1FOWQxU0xNTXgzWEYwU1hOTXF3RFlWU2x2YkZSdEluM1p6R3pibzk2dllHZEo0dmNPT0gydlh0RmFybGVyek1jRGprNk9sb1lreXNHc1Vob3lSZ0tnOVpxdFR4UzZMbTQxbUk4RDJ2eTNJcUlmZWtjR28xR3VRMmd3N0k1YkU4SEVPcktta0o4dXFmRGxTVU9YbFQvK3BhajE2RjZ6eU02RStDR1B1NEFKb2VXcng2Ry9NclgzK0ZqWitDblA3ck51YzFtcm1QVEpTSEl6T0Q0SG4vaEl6Ny84dFhWdkpUYkdoeWJGWlgzZGs0Qnh1U2VKelluQ0Mvd3VUQTc1aGUrOUkvSlB2clhvTmw2WkdDZTR3ZjAzbjZkL2g5OWcxYTl6dXpOTjJnR0FaZFhPN3ozenJ0a1NjTGE2aXJXY1VpemxNRndpRGNZRUtRSldSQmdQQy8zcDhPUWNaYVJ4Zm45ZFFVMTVDUHVtUnVzdlY2dlVLL2RicGRXcTRYbmVaeWNuQ0JsYlRJSFdBbzl4TmlWUS9jdFJsRkVyVllyVXNYVmFwVkdvekV2L25ReFN3cHhkTVdYNTNuNGttdVdEM1FRWnFGV1FBRG5uSGJuTEtzRVN0T1VsSlRreUdQV2h5QUV6OCtEMU5hbTNOa2Y4bnZmdXNzdi9ZczMrY0pIei9GZmZ2NDY1OWZydVpJdEh3WXUxbU1pM3pLMVBvN2o1M1dBeHVDYUZNOU1DVXpNVmpQa2ZLZkdSczFscmU2eWxveDQvcGYvSVdmZmVvMjMvdjRXTzMvNXZ5WDBmWmh6S0o1UGYvOGhvOWUrVGRPa01CNXg5ZUpGVnRmV2FEV2JYSC82R1hxOVhoR2ZzTE1aZnBJUzFRMUJGQlZSU2wyakorbGNPSzI0a2F5ZmxJaEpqY0JzTml1S1IyU09zVVE4UjZNUjBxTXB2cnAwWk9uTXF4anZ4OGZIOUhvOW1zMG1xNnVyckt5c0xMem1wMHdBdXRmUWNSejhhclZhVks3SzhVRWxTcG9BdEdlZ3c2T3U2Mkt4cERiQnBnWi9IbkE4UGo2bTMrdmkycFM5NHlsLzQwdHZzTjRJK0N0LzhnV1lMWmxxNkRna1NVcDJjQnM3T01GT1RxaVpNZWZhRVozSXdZdEhtT21BODJjMitkRVAvekNkOVRYY3laVFcvL1gzaU41L2s3aFc1K28vK1RXcUJ3ZTg5eGYvRWw2blF6TG9NN241TnIyN3QyRTJ4YzdmTnVhNExpc3JLenozM0hPc3JhM3g0TUVEVGs1T0NvNnJWcXRrV2NiSnlVbUJFR2s5azRub29oYjFTelBFclpWS0pkRzl1c3hPS282cjFTckc1Qyt2a29rcW9vSUZrWkpPVHBLRWs1TVRKcE1KalVhanlEaHF6MDFYQWhWdWZva29mQ2xEa3Mzb21JQXVEaTFUbFJDRXRnbjBieUVJb1dKZHp5OHVaQlE0ZlAwSDkvbExQLzBjb2VjOFVyUkE2UE43TDcvR3lXLytFaFhYNExrT1diVktjTzBhbllzWENXc1JZeWRrWjJlWEg3ejlMaDhMS216L3Y3OU0rT29QeU1Jd3Y1L3ZFM1hxZFBidjRKMDhZUGp1bXd6KzFkZW9ybTR5UFhjRjY0ZGdjd0M5Ly83N1RLZFRQdnpoRDNQanhnME9EZzZLUWxoSlVldmlUVjFoSzIxeWdud2hCc2tXQ2tKMTI3d1FrbVFYSlNZaUtuV1pCRTZTcENBUXovTllYVjJsMCtrVUJiRlNkUEs0Mmd1UjlFVlZzQ0JkUEFBcFhOQXBXMW00Ym1tU2hZbTQwd2pYYWVFeTVlbUYrWjdEdjM3M2tHOTk1elgrMktkZkpNK0VtRHlyRXJpOC9kNGUvOGMvK3o0ZUJsd1A2N3BNVTBOM01HSWpUcW5XQTJvMWwwa2NjL1B0dC9tUlAvclgxRjkvL1JUNVdjYkpGNy9JeVUvL0ZQSGhBWUV4dEo5OG1zR2Q5NW5ldjBzMVRaaWV2WXlwTldDKzl0M2RYUTRQRDdsejU4NUMyMW5aVGhKcjJuRWNHbzBHVVJRVm5oRlF2SFhOZFYyR3cyRmh1RWw4UmVBbXNOR3dGbGRiSTFMcSs4ZmpjYUhyRzQwRzdYYWIxZFZWYXJWYW9YSUVOK1VDM21VNDhTWDNMZHlyRFR1UkNzc1FXYTRFS2tjVWhTQkVWT3FGRkVXUnVHeldNcTZkZkJOdUhNTDJjNWpLQ2c5SEtWLy93UVAreHY5M2c0TkJRaGdFR0h0YWZESVlERGc2T3NxQjNHaFFEU3Q4NXZYWDJUNCtJWnNQZ1hDTllmOXpQOGJkbHo1SmRUekdkNzE4SHA4RkxsNkR3MzI4eVlqYTNYZVlubm1DdExVR05pZUNPSTVaWDEvbjZPaW9pRUJLZVpjMnlJUXhkS21YSHAvbk9FNVJwZ1lVM3BZdUNoWHUxM1dWY3IydUh4UTdvZDF1RjMyQ3pXYVRWcXRWdkw2bVVMOEtWeDlVZFFYa1hzQ3lMd29Sb1JwQXk3WHJ5MjU2Mml1M09ENU8yc2gxYTFPY1dYN3NmTXgyeThDRE4rSG9IWDdydlJyLy9kZERVanc2S3kzV09pdU14NmN2UUxMV01oZ09PVDQrcHIyNlNsU3I4WVc3OTNpeDJ5T2RxeWszTTR5LzhKUEVmL0lYeUhaMk9KaGIzMUtpdmI2NVJlUEpweG04K1JwT21sRGRlWi9aNW94NC9RelkweGMzYm05dmMzaDR5T0hoWVJHbUZyRXVkZllDK0N6TGlpU1ZxQXZ0U3BkN0FQVGJSQVJXdW1OWTF5Z0tjOWJyZFZaWFY0dm1sMmF6dWZBK3dzY2hXNjdYamJ6eW1SOUYwVUw4WFVxUnkvcGRibFErZFBHbmZLK05RZEg3WVJpeXNyTEN4c1pHL3Y3Qk5LUG1Hbjd4eW54OG5PdGhNOHMvZWozaGVHQlpiOWVKWjlPRmVuaGpETk0wSloxT21jVXg2V3pHUzYrL3pvdDM3NUhPQ2RsTFU5NjlmcDNlRDMrYWxlbVVlcTNHWk43V3ZyR3h3ZXJxS3BVb29ySzVUbnE0eC9SZ0R4eUh5c083dU5ZdzJUaVhwMXZuKzVhUzhPUGo0OEt5MTYxWjJqN1NYYjA2aE4zdjk0dTNqWmE3cS9Rc1pJR1Y0RUJlZkNYRTFXNjNpMEZZK2tWZWVsakhRdXBhNlg4dGtlWHdQQTkvZjMrZnRiVzFvdHRIaUVCVG9hYlNzam9vRTRjMk5vQ0NLN0lzeTZ0enRyWTRQanhoRnNkY3VKTGlQT0d4YjJIVFRYbjd3T1dQSHZwRVBndXZYUUZJMHBRa3kvakpLNWY1Y3gvN0dKZlBuc0ZQVWhvL2VKM3UvUWRnREw2MWZIZGpnMStQS29ULy9KOXovdXhacmx5NXdzcktTaUVtb3lpZnY5TWJEQmwydG5BT0h1WnhCZGNsT0xqUG5lNkE1b1ZMTk9ZV09jQzVjK2VJb29nMzNuaUR5V1N5SUs0MTV3VkJVSENsSUVQbUNJZ0lGeGpwOG5tTk5HbkpseXBqS1FiVkJLRG5OWllOeFdWU1FCaFJNN1JJWW45blo0ZHV0OHU1YytlS0tsYnROb2dob3YzZFpZY3VCWk5EMndsaUJHMXZuR0gwa1QzRzIzc2NiTlg0ODI2ZFRtcjRVOU1oUjkrYU1KaENOVHdGakN4K2xpVDgxNS80T0gvOWl6K0RHNGFueFFibnoxRzdlSUdIdi8wVjNqdDdscGVmZTViV2RFbzhtZkRnd1FNT0R3OXB0OXM4K2VTVHJLNnVGZ2JkNGVFaHg4YkI5V3RzbWlrbXJ6QmtiWFRDOTE3cmNmWEpKOWxZWHkvRTV2cjZPaSsrK0NMZi9lNTNPVG82S2lwOG04MW1NYWFsWHE4WDdsaVdaZm5iemJyZEJZdGVBa0h5bzZ1bnRacVVSbHd4R2lWVXI5dStOQUhwejhwRUlHcEo5M1VVM3AweGhtNjN5MncyWTJWbHBTaEYxdjEvbXZQbFptV2ZVaU84bk1zWEVaV2xobW5sbUhjLy9CNzl3T0tZdkk3Z3lIUDVXeXNyTkorcjBucHRTSnhrdUw0U3M3N1BTMmZQOEZkLzh2TjVPVk95MkNyV2V1WnA3a3dtL090V205VldrM1Y3MnEvUTcvYzVPRGpnd1lNSFJkRnB0VnBsYzNPVGVxUEJYZU5SaVROYW9ZOEIxaXMrMjVNSjMzdjFOYTQvZVkwbm5uaWlrR0ROWnBPWFhucUpWMTk5bGZ2Mzk0RVF6NnNVUDNvNlNxL1hZMmRuaDRPRGc0WHFZWEVEeGZVV1dNdjdEMlFPb0JpVHduaWFFZUYwcW1yWk9OZk1xSU56dXA1Q1hOSW9pdkk0Z0xXVzBUeko0WGtlbHk1ZDRzS0ZDNFZSSWpjUTduZmQwd0hKdXM5c29hNkFSWmN2eXpJY1kzbTMvUVpIM2hRL080MHJlSUNiV3BKbkE2Nzg4Qm5HNzNsWTF4UTYxL28rZitwREh5S3ExWXBjUVluRTZYem9RMFNUNmNKd0JhRFFvN2R1M1dKdmI2OGc0cjI5UGNLVEV5YXBZZGVwMENMdkhNMHNQTjJ1TWE0NGZQZlZWOW5mMytmRkYxOHNPQ2NNSzN6MG81L2c2clZ2Y3ZIQ0hpdnRRMGFqSm5mdm5HTTBxaGYrdll5c0VTU0xUU1FHWnIxZUw1cElaQzZUOUJWcXBwSy9IY2RaYVAvV1VjZnlJWEVYYld0SThLbnNmaGJEb3NYL1Q1S0VuWjJkNGtYRW92ODFNblhYUzFuM2xHMEJiWHlrSkR5b25KQlgwaTBlRHBBNGhzYXpIYTVXTGhMYnVBaVV4TWF3c2RwNU5GQWtoN1hVZlo5cUdCTE1HeUgxdnFSWjg5S2xTMFd6aUVUbFBNOGpxbFl4ZTNkd2p2YkJkZkd4WEFrc045S1ViMy83Mnh3ZEhmR2pQL3FqUkZHVkxETmN2Zm9xbHk3ZnduV3orWkw2UFBQTVB0Lys5alBjdm5rV1MxeDRDeEtjMFowLzdYYTdhR0dYMEt3T0xwV0pRUDdYcnFZUWdEYnlCTjRTZmhacHJLV0ZNRWhCQU9XWWY2MVd3eGpEclZ1M09IUG1ETTFtY3dIeDJ0ZVVIeDFCZkFTeGhXVXFKVEtQN3o4QWkrTTZCRUZZRktVWVl3aU1vVGViUFo0QUhJZnVaRUxtZXJScU5XcnprU2dTUERIR3NMcTZ1dUJhNllGWHJ1ZmhOR3Frd3o0Mm5wSGhzT0U3WEl4OEhnQTNiOTNDY1J3Ky92RlBjZTNhQ1JlZmVBMWpITEpNOXVJUUJDa2YvL2hiM0xzVGMvdU9ZVEtaTVJyTjV0SXozNysxa0tZWnMxbE1HTWFQTUpibWJIajBuY0xTZ3JiTTRDdmJBMEp3NWNCUStmd2lEcURIcmJodVBzYnN6cDA3cksydHNiYTJWbENkcGlyZEthd25XSlIxVXVFN201Q05XWnZEc0w4VWo1NXg2UFRxV09lMFI5NTFYUnhyK1lPSGUvekUxaVliN1pYRnhKR1RoNUMvY1hEQVFWakozN3BkcVJSTkd2VjZ2VlRDN1MyVW9UbE9YcDgzZFR3bXJYVWFoenVBUTJZTW56aXp4azV2U0Q5T09ENDU0Wlh2Zm9jWFB6ckc4eUJOeTRhV1F4REUvTXlmZUllVEU1ZHUxK0g0Q0E0UDRlVEVZekR3NlBVZ2poM0c0eEZ4YlBEOUNaVktpTzk3aEdGQXRScmgrOTU4aHVEaWk2bTA1WDVhRVdXeE5nL1dZUTA0R1ZtV0xraHRIZGJYUkZYWUk1cnFqREhGRzdMbDRzUERRMmF6R1Z0Yld3c1RLTFc3S0dKTWY2ZkZqT3U2K0s3UDJJNDVETWFsdXRkNVNaV1g4Y1IrbTJwM0RUeHc3Q2t4VGNkajNybC9uNzl0TXY3SHozNEdOY0FBazZaODVjNWRYdTcxQ2NLUSs5WnlkSFNFNjdwRmY1N0U2VDNQbzlmckZRMmt1dXYzcE51bFAwMjU0SVkwc3huTjFYVStkUGtLbi9qczU1Z2xLYmYzRHZpamQyL2hlUThvendJczltRWRHZzFMczVseTZaTFlSR0J0U3BMa2Mvdkg0eW45dmtlLzc5SHRlcHljK0F3SEFkTnBsVGl1a1dVTjByUkdFSVFZNDVEUCtIZHhYVzkrTCtaMW1pSEdUS2xXSCtJNGZhYlRLdDF1RzJNY2ZOL0JkUmNuaU1LalUxV3R0ZmhTWnEzVHd0SzdKbFpvdDV0UDhkamEybHBvZFJicElhSlZDRUJVZ2k0eGM2ekRHODAzT0lnTzhleGNKemtHTE5ReWp6TjdtMnpmdW9TMTgzekEvSmhNSmtYV0t4T09uLzkrWmZjK3YvM2dJVGZUbE1EUFU4WDY5WEF5TUhJMm14VUpHNG5TU2JldVZDTFBaalBpTk9VdUlaL2FXdVBwRjE3QUMvS2NnZ09jM1ZqaitvVUxUUHhEakwySE5GWHB3M0hBY2V4YzFEc0xHc3Qxb1Y2M05CcVdyYTBNTFNUVEZKTEVZVGJ6bUV3Q3BwT0l5YlRHWkZ4bk1xa3ltZFRJc2laQmtHQ3RqN1VCdGZvQlo4LytIclhhZlZ6WFlJekg4ZkVhYjkzNEdLUFJLbms5NE9KTE84dWVnekVHdjlsc0xrUUJwZXhhb25jeUJYdzRIR0tNWVd0cmE4RVhGU0xSdVFRZERuWWNoNHBYNFo1M2o3ZGJiK1BhZWVBSXk4ZU9QOFphdkVvVXU1aGV3TkFkazdqeEhKaW40K3JpT0NaTFV6Nnl1VmtRZ0xXV2Y3Szd5ODBrcFZXdDRwYUNLM0tPR0lLU3c5ZTVkUUdNbk9zQ1RsVGx3dlduOGZ3Z2I3Q2NINWt4ck5UcUJNbUxXTE16UjdUU3dhNGxtYmtjSEZhbzFUS2lLQ01NRFo1bkVkVXI1eHYxemg4NWdnRENNS1BaVE1sTDhvOXhISXN4RHNhNHBLbFBra1NrYVpVa2FkRm9QQ1NLZWhqalkweU8ySTJOUFNxVmwvbjJ0ejVMbXRZV2tGMkdpekJvTVNaTzZnTDFTVExPVktobk1CZ1F4ekdycTZ1MDIrMEZGWkJ2N05GSkhpWXp4RTdNOTlyZkkzVlRQT3VST1JsWGgxZTUxbjB5TDd6MFhleUtwZGFzRjkyek1xTTRqbVBTTENQeVBKN2VXTStoNXpqMHBsT09rcFI2R0JMTnhYelo2SkdOU25DbFZxc3RTSUJ5dDI5bUxWdk5CaXYxMmlON3lZazJ3eDAreWM3dFp6aDcrUWF1bXdFT2ptT0prd3JmZWVVNk45N3NVS21rVktzWmxjcU1LQnBUcjA5b05HZlU2MU1halpSYU5hVVNaZmgrUGsxc2JzYk1DY0xCR09jUk5STUVDVUVRNHpnOTRBSFdlaGl6S0lXeXpLZlZPdUhjK2J2Y3V2a01ybnVhZE5KNDBvZC9kSFMwNEk0SUlrVWlTSWV0V0tBNkxibTl2VTIxV2wzUTlicHVFTUMxTHQrdmY1L0RTaTc2aldOb3hBMmVQbmlhT0lteHJpVndUc2U1U1VtVEVGc1lobFNpaVBQTkJoZmI3WGt0b01PRDJReFRyZEpTVXoyV0JhTEtzZTk2dlU2ajBTaW1lRWpTQnNCbWhpRElKNFlZKzZqSFliSDRuc3Y5M1UreDN6M0RtZTE3aEpVeGcwR0R1M2ZQYzNMYzVzd1pkNzdFdkZTdDI0MjVmMy9NWkRMRzJvd2dNRlFxR1ZFMW85bElhRFlUbXMwWnplYU1XbTFLSllxSm9oamZON2h1aWxPMCt6cHpxZUUrMWdiSjkrdlFiaCtSdjRCaU1TQW5ockUyRHYyYk4yK3l2cjdPeHNaR0VaU1FxaFNoR0FrSWlVOGRCQUZIUjBkTXA5TmlQcDB4cHBoVGEwemVFdVVhbHp2dUhkNnN2MW1JZnNjNlBIZjBITlc0U21JVHlDRGxORVNwQ3hxc3RmbUlsRnFOSCtxMHFjNVR2UUFQTTBOalpZVkl6U0RRU1EvdDJ1cS9wWXBaUXEyMVdxM1kzM1E2WXppTmlkTUV6L01YaUVldW42VUptYldNdXBmb2RTK1JaU2xKa21KTVNoaWVOcElLODlScUllMTJyWkJvczFtTXRUQ2RlTXdtRHZ2NzBvN3U0bm1HS0lKbXkyZDkzYWRlaXdrckE4S3dSeGdPQ2NNUnZqOGlDR1lMeUMyVGFlQkg4MExSOFVKK1o1a2Q0RStuVTI3ZXZFbVdaVnk3ZHEwWWk2SURDZVV4SlhKeEhNY2NIeDhYa2E4c3kvajR4ejlPcDlNaG5zVU0weUhmYW4rTHpNMXdyVXZtWkZ3WlhPSHk1REpaa09HYjAxU3oyQkFTYXBhM2lRd0dBekxINGNxRjg3a2xOZGZMdTJsS21IZTJGRWdYa1M3cjFNVVVzT2hYQzBCRVBRaUNSK014ZDQ5N1BMVzFRVkxLbmpuQXU0Y245S2NKWVdIN1pGaWI1UExCbnFhRnRZdXNwNENMZXRNNWxkTUVUWlZhclU1VXFURVorMHpHK3NYY0dkYk9TTk1aMjlzM2VQTDZLNWpzMGRsTDFzSjAraVJyYTJ0TUpnR2owV2hCemVrVWRCUkYrT2ZPbmVQaHc0ZnM3T3d3blU2NWNPRkNRY0dWU21YaGZYZGFuRWdVVFhSdkdJYU14Mk4yZDNZSnZSRGY4WG10OGRxQzZHOG1UVjdvdllEcm5mcWlPbW9sQnB0d2k4UWtYT0JLbzE1dy95d3pIQnBMNFB2NTBNZDA4Vld0eXhJbGNuOEJ1QlJlaUNjZzU3WGJiWDV3Y01Kc011SHBDK2NJZko4a1BTMHZ6OTJ4ZU9HZTVTaWNHSnV5UiswTmlaVFZWZGZpcGtwVlVYNmR3WEhzUE9hUWtyK1F5aVhMS3V6c2ZJalZ0WWVzcjkvREdBOXJjenZFY1RMNi9hZm85Njlqekt6SUpzcjRPeUZ5VFpDKzY3cGN2SGlSWHEvSHdjRUIvWDZmczJmUHNyYTJWc3pOU2RQVHNlMkNGT2FBbHdXSFlVZ1VSQXhHQTc1Nzc3c0VGd0xlYXJ5MUlQby9OdmdZemF4SjZxUkZZNk1nU1UrKzBoT3p2REJrdlZialFxTlI2UCtUTEtGbkREYkxpRldPUXJ3QXlYcHB4T2lzWkpabGhUdXJLM0JjTjMrMzZzbHd4Ti82K2plNDBHN3gzTlZML1BqSFBwSzNxUUhYTnRvY0pJYXB5b0VJWU12NzBTbDBZTUcxbG9JU3lmTEoyc3RXKzJtczM4NmxUSUl4UG0rLzlSa21UN3pLK3ZvZGZIOUdta1ljSFY3bThQRFRWQ29Ccm52NmF0NVdxOFYwT2kwS1VtVm1jSlpsK0FjSEIzUTZIVFkyTnFqVmFod2VIbkw3OW0zNi9UN1BQLzk4VVdrcXRYSEMrUnBwbnVmaDRURnFqN2gzN1I2RDFpQVgrL05tNTh6SnVENjl6dFg0S2pOM2hqV25PbHN5WDRKOFNWZ1lZM0I5bjVibjhlTVh6dE9VT2ovSFlTZE5tUnFEbzlTUjVqUk5uQXNpM0ZsOGU1a0VnbVRzaXdDKzMrc3hIbzk1cmR2bDlidTduRjFmNTZOUFhpRkpVK3ErejlsNnhLM0I1SkVCZHVYQWk1WnFBaitKdWNnNWtpaVNTR3E1cGxMdXE2dUQ4bnRXdWZuK3A5bmRlUkhQai9QNWdIRU4xODJJNDE2UkJKTjdDZUsxcSs1NUhuNmowWmpQMU1rTnVyTm56M0owZEVTdjErTzk5OTdqaFJkZUtFU242RFhkb2gyR0lZNTFtRFZudlB2OHU4UzFHTmU0S3RoakNlS0FzemZQRWpkaXZNRERwbzgybzJvWHpuVmQvREJrTXd6NUM1Y3VjcjNWV3NnRGRGeVBpalZNY3lndklFQ01NSjBqMTkvcDMvSXM0VFFoOU9QajQ3eThPd2l3T1B6T0s2L3kvT1dMT09SREdTNjJhanljSnN5VW5WR1dOSm9ZNUhPZG01QXk4RElCNlVNVHR4Q05xQmhyRFk0RGNSeEJYTVZ4bUx1bEZDMTgraVVUY244ZDdzK3lEUGY4K2ZQRkdOVER3ME9tMHlrYkd4dGN1SENCNCtOalhubmxGVjU5OVZVT0RnNFdYZy9qdW03Um5oMVBZL1l1N3VYSXo5eUZ6bURIT2hqZnNEUGE0ZGF0Vy9SNnZhVklMeER2KzFTaWlHb1U4V2VldU1qMWxaWEZKSkMxWEkwcS9GaXpXYmhxd2hYYTJpMERVd0NnRVY4V3UwRVFNSmxNNlBmN2hhNE1BNThiZDNmNHdjMDd1ZmdHNm9IUG1mcGlhbmJaTTVldFFZak5jWnhDR2dnOGw2MVhmcGVMUjA0UGcrT1lCYTlBMWlJbDVETGhWZTlaM0hzM1NSTFcxdGE0ZlBreXRWcU5YcTlIdDlzbENBTE9uejlQa2lROGVQQ0FXN2R1TFF3dmxJSUZZd3pqZE15Z1BjQjVqSDlxZk1Od2RjaDBQR1ZuNTVRUVpGTWFPWjduNFFjQmwxdE5ubXMyVGl0L1NzZUxqVG9ybnZjSUVZaDAwb2ZPdUQwT0tZSkVtZlduZ1pWbEdWLzl6cXNrYVpvSGJiQmNxRmNJM2R3dUtHZnp5cy9TenhSQ2xkeCsrWHNOQ3gyM0YrOUlHM09QMjRzYzJpWFcway9nWkszRjdmVjZIQjhmNC9zK0Z5OWVaR05qZzlGb3hQMzc5NW5OWm14dWJoWjU5RnUzYmhYQkdkR2w5ZHI4UlJLUGMwdExoekY1QThUdTdpNTM3OTR0UnNQb3BKVGplYXptbmF1UDJ4a056NlBoZVFzamRjclZ0bkxvc20wQlhybHVRUU90ckkvRElPRDl2VDNlMlgyQVAwL0tOQUtmN1ZvRlV3bzhMZk8xOWIwMG9UK09NTFVxMGNqWEw5OWFkcDBtRnUxZTZ6VUlEZ3JYVzBhVjd1L3ZNeDZQMmRqWTRNcVZLd1JCd043ZUhnY0hCNFJoeUxsejUvQThqemZlZUlNYk4yNnd2NzlQbXFhME8yMDZqUTdOWHJOSTQ1WVB4empVam1wWVR1UHZqdVBRN1haNS8vMzN1WC8vUHROcC9qS2xTcVZDR0FSTTdmSXFaRGxteHVTR0lJOEM3bkYxQ1krekEvVDFaWVBNZFYxY0o2OVIrTUhPUTFKeEpiRmNhRlNKZk1uU0xVYmRsbVZGNVo2NnNHTVpjWllQTVZnbEdGZTJiOHI3bEd1RVVKYXBqaUovNDNuNStIRnI4elNxU0lQTGx5OXo3dHc1a2lUaDRjT0hwR2s2ZjNGeGs4Rmd3TTdPRHJkdjMrYm16WnNNaGdNMjcyd1Nqa09NcDNqU3ljVi8rMzZibGU0S0dZKyt6MWF5amZmdTNlUGc0Q0NQUUxvdUI4RHViSGFhL1Z2Y0plOU5aM1NOSWZEY1IvUytwdmF5T0YwbXJ2VjU4cjVCY1EyRElLRFphckd4dnM1SmtyRS9IT2N6Qnl3MFE1L3RXc1M4M0dVcG9lbFlRVGtCcFYxcWpUVDl2LzVjSTcwczVmVDUrcHE4ak8zMFBVTnlyUkNTdjdlM3g5cmFHdlY2bmRGb1ZNVGdhN1ZhOGZuQndRR0hoNGRFVVVTejJlVDgrZk4wdTExNnZSNjNiOS9tWWZTUXRmWWE1OHc1amo1OHhHaGxoSEVON3RSbDVkNEtaMitleGZkOXB1a1VERXM1dzNHY1lzWnZvOUdnc2JMQ2w3RDgyWTExV3ZOVXJ5Qi9MNDc1YW45UUJJbVdKVzdLdFcrbnRMUDRURGtrREMwMTk5cFhyMVFxcksrdjArNTB1RGVhc2Rtb0ZkYzkwYXB6dHpzZ3RYbmFXRXVoeDNHcFJsWlpEWHdRVXZWYXRZZndRZWRxQTFOblBvWDQvSjJkblNMNEkwR2ZPSTZMU3VGMnU4M2x5NWZwOVhvOGZQaVFCdzhlc0xLeVFydmRabVZsQmJFaFRrNU8yQjV1YzIxNGpXd2xZK2JNY0FZTzdzQmw1c3hJL2ROM0FjdW10VityWGFaK3Y4OXdPT1FnRE9sT3BueHVlNHVMWVlqQjh0NTB4amQ3UFFiRzRpbHUwMUcrWmZxOWpQZ3lBWWhFT0gvK1BGZXZYdVhXclZ1Rjd3eDVvS3RXclhLU1pIUm5DWjFLZ0xHV2xVckEyV2FOMjczaGZHN1FZc21jSnM0eW9zc1M0WEhpZjlsbldzUS9UbjJJSkN2YlBQcGFYNlpXU0haUDNpNGxzL2RuczFuUmdWcXIxZGpmMytmbzZJalJhRVNuMDJGMWRaVXdERGs4UEdUMzRTNG52Uk0yTnpaWlcxMGpxa1k0Z1VObXNtS0NoYnpnUUxLTDF0cEMvNWNYbWNVeGJ6NTR3TzNCZ0kxT0ozOHhoREZrbVNsOGNwMDRraGkzNWtCQlFCbklXa2RyUURZYURWNTg4VVhnVkxMczdlM2xJMTViTFZ6UDUrNXdRcnR5V2hoenBkMWtkekRHUUVFRVlrdG93aTRUZ2F5amJJL0ljM1ZTUys5Skc4d2ZKR1gwYzJWUWRUa3FXc3dKRk5FL0hvOVpYVjB0T2w3ak9HWnZiNC9oY01qcTZpb1hMbHlnM1c3ejhPRkREZzRPaUtLSVZxdkZ1WFBuYUxmYkhCd2NjT3ZPTGZZUDk5blkyS0RUNlJUcFdubVdXT29TbVpMUGRYQkk2L1hKY01qTy9JVk9ydXZTNlhTS05IUlplbWl1RW5mdzMxVVZOSnROR28wRzMvLys5NHU0dnZSTkJFSEFRd2N1TmlJNmxSQmpMZTBvNUV5anlzNXdzc0I5c284eXB5NHI1UzRqdVp4bmtMVnBvdElWeE12dUpjK1NWLzNJYy9VekZnWkZ4bkhNdzRjUEdRNkhiR3hzMEc2M2l5SUtrUWFOUm9PVmxSVXVYNzdNMGRFUkJ3Y0g3Ty92RjZuZ1M1Y3VjWEp5d3RIUkVYZnUzT0g0K0pqMTlmV2lpMVgzSFk1R295S1dVQmFOWld2WEtBQk1KcE1pcnk4dFg3SUhuYWpTeHBibWVLMC85YXRZaFNBa2lpWklrSXFvL2YzOS9PMmRRY0NkL3BqT3h1bUxtSzYwRzl3ZmpoZUlXSDVyUFYzT1RPcVF0ZjVaUmlRYXFSTEtsUnkvbGl3TFJTN3pjNHNLYUhmeEZmTisrUUZabGhYalRIcTlYakY0UU93RGVTT2xqQ1NwMStzY0hoNFc0OTFiclZZeHF1VHc4SkJlcjhmZHUzZHBOQnBzYlcwVjNLdmZUU3pKRzBGRzJXcldmd3ZCOUhxOVlteXNORnBJYWxmcUd3VzRHdWxsVWJ6TVcwalRsR2F6aVV4UEVhQWVIeDhYT1pPOXNVOTNGdE9lMndLcjFZaXRXc1Q5MFJUdk1kSkdFSy8xc0NDcG5La3NjNnBlcjY3c0VVTFJSS0NSckhHcll3VEZmT1JIeUl6VFhyS2pveU1ta3dudGRwdDJ1MTJFZ2FVT1FQcmh6cHc1UTZ2VjR1RGdnTUZnd0dnMG90bHNzcjYrVHFmVHlVZkQ5UHZzN3U0eUdvMEs2Yksrdm83cjVtM2JXdHd0QzR2cTFxWnlSbElrbFBUVWlkcVI4elhpdGIyZ2sxbENqTkx4MU9sMDJON2U1dWpvcUVDaXZJK28wK21RWkliYi9SRWYyZWdnVWJCcnF5c2NUT0tGNkdUWkVGMEllSldzL3JMWWY1dzBLTytuYkN0b2dpOUxoN0xSN1Mrek12V0NaRnJWWURBb1dwT0xFUEM4dVVJU0d4Y3VYQ2htL2g4Zkh4ZmRzaHNiRzdSYUxZNlBqems4UEdROHpzZVlGam5wZVJKRys2ZkxMUGhsUU5YZlM1MmZUUHFXVm03eFBzckdsM0RDc3FGS251Y1YvUkFpU1dUWVU1cW11QTQ4SEU3cHRXSlc1cmJBYXJYQ1pyM0svZUg0ZEpLWlhVeElsYmw1bWE5ZlJwS0krakt4aUdTQzB4ZDZhWFdvbTBtMTVKR2N4NElOOERoTEVpalVRaHpIREFhRElqNGdob1VVSEVnN1diMWVMK2IvSHg4ZkUwVVJLeXNybkQ5L3ZqajM2dFdyaFRyb2Ryc2NIeDh2OUJrS3h3dmdIdWNpbGZXN0FFUDYrYTIxaGIwZ2hSZzZHbGdtSWlFSzEzV0w5d0pwWTFJS1NxMHhKRGpjN285NFlXNExPTUNWbFRwN284a2pkZzBzMmlKQ25GcXlDWkxMVlZKYUJjcDlOQXcwY1lrbnBBbFoxaUdTVHJ5dzRuMEJINFI4ZlhQWi9HZzBXbEFMR3VpVlNxV0lFelNielFLNU9wQlVyOWZaMjlzcmJJSE56VTJpS09LdHQ5NHFLRmV2cVVoY2xNU242SHBOQ0xwSVJRQWtObzIwY1JlOThhb0RGMDdUcUNJNlpSeUxTQ3hSalVtU1lLekZkUjBlREtkY1hrbG9oYmt0c0ZhcnNGRU4yZW1QOGQxRkxwZjFhSUxRRTFRMEVTenpCSmI1K2VXL05hemsvaUt4aFRDa0FtazhIaSszQWY1TmZxWFU2L1Y2UGRydE5oc2JHNFd1U2RNVXFUUnV0VnFGdmo4K1BpNjhCbm5ibHJScWR6b2Rack1aNzcvL2Z1Rk5OSnZOQWpuYTNkT3QwbUtrUFE3QWNvaWhLZmw0VVF1VlNxVndkOFZkMDAwdGpVYURzMmZQOHZEaHd3V0RUVXJvUGM4ak1aWTd2UkhQYjdTQmZONy9sWGFUN2pSbWxtVWthVHJQSlFRRm9zTXdMTlloc0phMHNNUkxaQ0taaHJ1VzFNdWt0aVljMmFNdWtCRnBFQVJCNFlJNzFXclZhb0Q5bTZSQitRaUNnSldWRlZaWFY0dFhsT3FTcUNpS0N2RXJSWjdDa1hKdHJWWmpOQnJSNy9lTE9Yc3lxMEFYYldvWFM4YmJsZE8yUWlqbGNpeFlMRnVYKzhnYTE5YldpcG84cVJ3T2dvRDc5Ky96OHNzdkY1Tyt3akRreXBVclhMMTZ0U0Q2d1BQNDlOazFHb0ZmREp4T3JXVXdTM2kzTytBb3pxak81d0NJNU5IMmdFYW83RU15ZitXaFVtWFBRUFloa2t0ZVpxbGZaU3ZuQzVFSlFTUkpnbE92MSsweVAveHh4dUhqQ0VTUUp1Tll0QTh1Q1NkNXJidmpPQndkSFhILy92MUNOTGRhTFlJZ0tJeE9tV2d0RzVJeWJ0MnBKQUdPc3BFbmZyeHd2UUJQSDVvSXBPSkdwSUxVT3pRYURWelg1WHZmK3g3Mzd0MHIraU9lZlBKSnJsKy9YanpMQU0rc3RuaXkweVNUK3dwaXJPV3Q0WXlqT01PWk13eWN2cHBlcDQvbDBBUXRLVzVSVDlwUTFKenV1bTVSV0txbmxBa09CQS9GSzNkRXVsU3JWVnRHN0FjUmdJN2NsWTB2QWFDTVNoRUxYMFNyRU1uVzFsWlJJcjI3dTh2T3pnNXhIQmZkTzNyU2hxWnM2YXNYdTBNQW85ZWpwM2ZwNlNabHhNdWhHMkswd1NaU3BORm9jSEp5d3M3T1RxRlBMMTI2eEpOUFBsbFVRbU1NbnpxN1Rqc0tIMmtvY1lGUlp2akJZSWJqNWM4U08wSUlXQkkybXFzRnFkb21rSEZ4V3RJSmN3alI2ajFxNDFJSVFLU2I0TktKb3VqZnNwU0RBa2lQT3pRbGkrV3ZKWUlnUkJPQ3ZLVkxadDVLbWJTTVJOV2JrS0xLWnJOWmhHVjFnWVJ3Zy9hTFJjekRZb200bksvckI4djdMSjh2M3BCa0RiZTJ0cWhFRWMzQTV6TVh0K0VEdE9mM2UxT0dKdS8vMGdpUzMxb0NhME5PSjh5QVI4YlRpa0dySjZOb3dwZjdhUzlBOXVjNHpuOVlBaWo3MmdDMVdvMlZsUlZhclZhaFk3WGxLeTlXOUR5dmVQM3E4ZkV4azhta1VCMVNoallhallyeVpsRVBRUkE4TWxkSEVLZGRLUjJUbDdYcWdZekxERW10VWdRUjhocllvdVBHRDlodU5mZ0xQLzdISHc4WDROWHVtRjZTajd0ZFpzQnA5MVRHOHNpZVpPMXluWllZc0ZnRFdFNk5sNE5BK2hyWGRaZDdBZisrUjFtdml1c29pQlhyWG56Z05FM3BkcnVGTjFDcjFZb3c4bUF3S01LOTQvR1lsWldWQlV2Wm1MeDlyZHZ0Rm1xZzNXNFhuS0NOUUtta2tmOUZYSlpGZjlrOU04WVVmWkFpUmZMM0UxV0tuQWJXMHB0TTZJK25kQnBWTWxPV0pEQk5EYjNKRk92NVdIczZPMW5uNmJYTkpPc1gxU2tFV0g3OXZDWmdzUkUwNHVVUW1KU0hVLzQ3UzRCL1d3OUJCenJLT2xWR3ErbFh0V3RFaEdGWXhQWFROR1U0SEJiMUFmSzlTQVJqVFBGbTd1RndXTGgxRWhMV3lTZXhKelQzNmJlZHlCcUYrNUlrS1FwVUJHRnl2UmlNVWlYdCtRRS84dHgxZnVMNXAzUDFJMXptT0xpT3d6ZmV1Y21yOXg0UytGNHhOMGdhY2l2S085QWhhUzNLWmIwaUVXUzlvdk8xblNENzBJUWxkcEVZbm5vUC8xRUlBQ2lzZFQwclFCZC9DcUpsV3BaUXZMU2lDUUpGYmN4bXN5TFBJSU1mSktna2hwVjRCbUt0aStmUjZYUndYYmNZMTZZNVFiaE5nQ25wVTBsa0dXTUtEaEtYVm94VWJZUjJPaDMrK0xQWCthR3JsMmhFdWRzNm1zMzQzcDFkWHJtOTgwaGtVeU5jZExrWXdPS0NsZ05mY3VoWlFTSWhsaG5sOHJlV3VMS09vaVA4MzlVR1dIWXNJd3poYkMyV3lyWHR3Z0VTcXRWdDNuS2RHSVNTOWhXcDBPMTJHUTZIQmJISTlkS3JJUGFDQkhSRVBjajl5MjNTV2tYSVN4eDZ2Vjd4dmJYNU93TldWbFlXQUF3VTBxVmFxN0hXYkhCbXRZUGpPQnlQeHZTbitTU1N4N0dPN0ZYZ3BVZnhDV0ZxK0ZZcUZkYlcxbWcybXdBTGtrSzhGTGxlOXFkbk5PdUs1ZitvQlBDNDc4U29FUzRRRGhRT2VCd2hpTGdWNDA5eUVDY25KNHhHbzJLaWlZUjZoVmdta3duajhiZ0lIQWxRNi9YNlFyR0t2QlJhKzg3U01pWnIwWTBrc2pkQmtPUWU2dlVHeGhvODM2YzI5N25MSENrSWtFUHJmLzFibjZ0MXQzNHRqVFlNSmNJcTQyL2t2Z0szVHFkVEdOTUN2MzhyQWlqSENNcmZsZDBZZlc0NXRhdkRrem9wbzFXREdJU3lVYTBYWmJQaS80cElsMVR0Y0Rnc1lnNGlPZlFjSUhuN0Z1UWVTcnZkcGw2dkYxYTM2RXZ4dThVVEVkKzUxK3NWWTJaMDFaS2twY1UyMFlNZk5lY3RTKzdJVElaeUhjUXlvdEh3ZzhWYUFpRWVuUzZIVTZZVFloZkphSzM5RDBzQSt2L0hIYm9PWG42V1JmT0U0NFVZOUJSTnNYamxIUGtCR0kvSGRMdmRZa2d6VUxpUzlYcTl1SDQ0SEJhVHdnUXhRUkRRYnJjTG9oUEVkRG9kbXMwbW51Y1Z5UzJ4SS9UYVpmK3lOcjIzOG9CR0RTUHg3VDhJOXZxM0VKM0FXa2R5eTdaTkdYY3k2NkZRTy8rK0trQnZSQk9CY0ZCNVJyNitya3dFWlFJUWhBajM2SEN3N3E0Vi9TZnQzc0x4RW5TU1BqK1pOeURHajhRa3RFMGhZbEhxSExJc0t3elU5ZlYxMXRiV0NtTzFtRnFtNGdHNk1FUGlFWHEvMnZYVUJwdjhMb3Q5T2NxRk1uS3VTTXl5U3RJNDBaL3BPSWxJTU1keGNDcVZ5dEpRY1BtR1pjVHI4MlVSWXAyV2t4ajZLQ2R3eWdTZ2dWWit2dmpDWXYzcjFtcDVwbVFKUlNwSVBsOEtWU1J1NERoT1VaQWkvZktpU3VSSGpFREpDMnh1YnRKc05oZldJM3NYb2hPWFVWU0lxQVBSMFhyUEduWmxBaEN1MXNhcGZxbVVpUFF5ZlBULytyZUdzWTZFRmdUd3VPTnhCbDc1Y3dueENpQjFLck5NQUZwM3lrSjBWVTZaQUhSb0YwNjlCeWxKRTMwclhDaXVwRWdQSVJpWmhkenY5emsrUGk1Nkg0UXpwTWhVQURzWURBcHZRR3dMUVZZVVJVVUdWSDYwTFNQZWhIRHJNaVlDQ2x1blBKWkhZS3JQTFhzS292YkUrdGRxWVptcTFxRmxrWnFQRU1BSFNZSVBPay9FdjBTdkhuZXRsZ0RsUXNieVlzc1NvQnl5MVFhaEZLNktCNkNES2NKTjlYcDk0ZVVSb2lJT0R3L3BkcnNGWUNYWXRMS3lzaUJtUlRJSVlZZ3RJaXBLMUpBWWpXV2kwRkpSOW5MMTZsVTJOemZaMzkvbi92MzdCZkxFY0JPQzB4azlnWWt1L3lySERNb0JObGcwd0lzZzAzOUlBdEF4NjJXSGlDSVIwMnRyYTBWQ3A5L3ZMN2hoWmEraS9Idlpzd1VSWXZRSkFpQzNTV2F6V2NFdFV2VXJxV1hSNitYWDVNcGE1WDU2bXNsa01pbEsyYVRCUm13QVlHRVNXYVBSZUNSTUhVVlJNWk9wMSt0eGNuSUNVSlRmYjI1dUZvR3A0K1BqNGkxbDVjemhNbHRBQW5INmV5MUJaQnJMQWdFc0UrdVBJd0Q5ZVZsVWZkQWhpRzIxV2p6MzNITlVxMVVPRHcrNWUvZnVRaitmTnBMS3J1V3lOV28xSVJVdjhtbzFjU2YxZmZVUVRMSENCVEFpdGdWSU91SW40ZXpUVjdUbTk1UXFIcGxJS2g2R0VKTjRHWks4OG4yL0dCM2ZicmNYWGdrcnRreWowU2oyS1BjWGcxSUlWZFlrTm9obVFPRjRIWGNCRnV5Sy94ODZkUXBRRU80VlFBQUFBQUJKUlU1RXJrSmdnZz09"}} \ No newline at end of file diff --git a/sleap/skeletons/flies13.json b/sleap/skeletons/flies13.json new file mode 100644 index 000000000..7a2c02422 --- /dev/null +++ b/sleap/skeletons/flies13.json @@ -0,0 +1 @@ +{"description": "Template Skeleton for flies13 reference dataset.", "nx_graph": {"directed": true, "graph": {"name": "Skeleton-0", "num_edges_inserted": 46}, "links": [{"edge_insert_idx": 44, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["head1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["eyeL1", 1.0]}}, "type": {"py/reduce": [{"py/type": "sleap.skeleton.EdgeType"}, {"py/tuple": [1]}]}}, {"edge_insert_idx": 45, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["eyeR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 34, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["thorax1", 1.0]}}, "target": {"py/id": 1}, "type": {"py/id": 3}}, {"edge_insert_idx": 35, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["abdomen1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 36, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["wingL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 37, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["wingR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 38, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 39, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 40, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 41, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 42, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 43, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegR1", 1.0]}}, "type": {"py/id": 3}}, {"key": 0, "source": {"py/id": 7}, "target": {"py/id": 8}, "type": {"py/reduce": [{"py/type": "sleap.skeleton.EdgeType"}, {"py/tuple": [2]}]}}, {"key": 0, "source": {"py/id": 8}, "target": {"py/id": 7}, "type": {"py/id": 15}}, {"key": 0, "source": {"py/id": 9}, "target": {"py/id": 10}, "type": {"py/id": 15}}, {"key": 0, "source": {"py/id": 10}, "target": {"py/id": 9}, "type": {"py/id": 15}}, {"key": 0, "source": {"py/id": 11}, "target": {"py/id": 12}, "type": {"py/id": 15}}, {"key": 0, "source": {"py/id": 12}, "target": {"py/id": 11}, "type": {"py/id": 15}}, {"key": 0, "source": {"py/id": 13}, "target": {"py/id": 14}, "type": {"py/id": 15}}, {"key": 0, "source": {"py/id": 14}, "target": {"py/id": 13}, "type": {"py/id": 15}}, {"key": 0, "source": {"py/id": 2}, "target": {"py/id": 4}, "type": {"py/id": 15}}, {"key": 0, "source": {"py/id": 4}, "target": {"py/id": 2}, "type": {"py/id": 15}}], "multigraph": true, "nodes": [{"id": {"py/id": 1}}, {"id": {"py/id": 5}}, {"id": {"py/id": 6}}, {"id": {"py/id": 7}}, {"id": {"py/id": 8}}, {"id": {"py/id": 9}}, {"id": {"py/id": 10}}, {"id": {"py/id": 11}}, {"id": {"py/id": 12}}, {"id": {"py/id": 13}}, {"id": {"py/id": 14}}, {"id": {"py/id": 2}}, {"id": {"py/id": 4}}]}, "preview_image": {"py/b64": "aVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUlBQUFBQi9DQVlBQUFBbitzb0hBQUJGSzBsRVFWUjRuSjI5ZVl4bDJYblk5enQzZVd2dFZkMVZ2WGRQVDg4K25JV2o0VElqTGlJbGthSmt5WllkU1hGZ3hJaWlCSTZqUUVnY0NBNkVPQWdTNUE4SGdRRTdpWklBam0wNGppTkxva1FySW0yU0lzVmwyQ0tIdzFsNlpycDd1cWYzcmw1cXI3ZmZlMC8rZVBYZCt0NVg1MVVQYzRCQ3ZYZmZ2ZWQ4NTl1Lzczem5YTmRvTkR5QWN3N25IQURlKzVFL2dDaUtjTTZWM3o5SWt6N2xHZWxQeG5IT0VVVVIzbnVLb2lpdjZaYm5PZDc3Y256cFQ4TXF6Mmw0YlI5UkZKVmoyZWZqT0NhS0lvcWlLSCtUL29xaTJBT1RuYU9HUTY3RmNWek9UNjRWUlVHV1plVmNOZXloUHVTWktJcUk0NWhxdFVxMVdpVkpFdkk4cDlmck1SZ015UE84aEZQRExQK1RKQm5Cb1c1SkNPbjZtZ1pPT3JUM2E0VHVoeHg3bnlhYW5yeEcrampraHdndi9WdkV4bkZjUGlPRURzR294N1Q5YVRocy8vb1orVDNMTXRJMEJTZ1p6d3FFSGxkZkd3d0dwR2s2QXE5empzRmdnUGVlV3ExR3BWSWhUVk82M1M2OVhvOSt2eitDUjVsakZFWGtlVDdDVEVWUkVNY3gzdnNoQTBpTG9vZ2tTY3JPOWtPOGNMYVczSkJrYWdUb0NWdUU2dDh0UWFRUFN5QTdscDcwT0FiU0NNL3p2RVNFdEJEVFN0OEN0KzVUUzU2ZGt6Q0JadWc0amt1dGx1ZDVlVTBJTXhnTVNKSmtEK3hGVVpTRTdIYTdKU1BVYWpYaU9DYU9Zd2FEQVZtV2xSclB3cWMxWEo3bjVIbE9vaEdWSkVrSmNML2ZaNzhXa2dKTmFIMmZFRVFEWTVHdXBjUWlWU1JZeHRJU3JQdlFrajZPa1RRRGluU0l1ZzVKb3g1UGtCb3lJeUYxTG45V0ExaFRKSnBpTUJpVXNGZzhBeVhERkVWUkVqTk5VNUlrS2IvcjN6VERhcHhwaGt3MElLSmlzaXdMSW1LY0Q2QW5xdS9WaEFSSzI2WHZzY0JwUkZ1RXl1UzBiUTJwY3d1WFZlLzZHYkdQbG1EV0o3Rk1xMVZyaVBHbGlYMldzVFJPeEMrQklmRzFiNkR2c2N3cDJpRExNcElrS2ZzVi84SXl2MlpPN1IrVUprQkxWci9mMzVmUUd0bmFlZE5jYnRXbjNLK0pMeE1YRlN6MlNUOW43YlZXdytNUW5tVloyYSsxMFpaNTVGNjVYeGpNM2o5T0lnVW1VZUh5dXlhYTRFVG1Jc0lsL2N1OGhhSEcrUnNob25ydkdRd0dRVDlHMDJnL0p6UFJBNDF6dUd4bklRS0V1TTJxZE8zUWFHN1gyaU9rZFhULyt0blFaTFgyME05WnM2TGhBVXBwdG4xYUdPUlA3SzdZYmEwSkxOTnErNnZoRXFKM09wMVNRS3htME9QcWlFQ3VoeUlYUzBlQnh6TDBDQU5ZaDhPMlVNY2F1UlpobWlIMkE4NXlxTlVnKzlsbTNiZWVoNGJId3FRZFJFRm95SVpMLzVvQTFxWUx3YlJqQlpST0hPejFHL1FZMHRkZ01OaWo2c2NKaWlXaTlCSEhjYWxkN0p4a3JrVlJrQ1RKaUNDT1JBSGoxS3BHb0oyRVpoYnI4RmlFV2E0T3FTYUx0RkRURTlBRTBNUU9NVnBvZkN0QndJalRhZUcwNmwzM1o4M091SERXTXJnNGdkcWNhcE00emd3S3JNS01HbTkyUEIzdGFHMlVhRzU3VUFzUlRJZ3IzSmNreVZqSnR3alRnSWJVYklpd1ZwMWFxZFlKSFEyM2hVTXpwbGJUMW9UbzUwSU1GTkpnV3BYciswUDlhWk9oQ1dRRlN6T2M3U3VrZ1VQbVdJZWJNbmJ5SU5zZlFvUjgxOXdvOXRDcXNIRjlod0RVTGFURzdPOTZzc0NlY000aU50VEdaZVVlaEFzWjN6cTJJWTFpbWR0R09jNjUwaUVOYVRkN3I5Vysxc3pZcUNSa2ZrYzBRQWhCRmhHaDc1YUkyam14d0Q2b2pTTkFhQno5alA1TkV3TjJFMEwydXUxZmE4Qnh1TEJxMnpLNWx2eHhKc2hLc0VoaWlGRXNBMnVtc3hwWU02T0dUZVBNOWkxdHhBZXdMU1NoNC95QWtQMjF4TE45aFpBZU1oZjd3V1dsUWE1SlZ0T3FVOXNzc2ZaaldBdXZOV002bEpQdnRtK3R6cTBUR1ZMdEllbTFNRmpHQzlFaU5EZm5ITkU0RXlBY1pHMnU3ZFFPYkRuVjJpL2RSMGhTeGtsUGFMeVFyNkFkTWZGSFFneWxKVVdhamVmdC9hRW0rQW1GZVpvUVdrdEpJa2UraDNBa05sdmcwdmkwTU1uNE5pbG1tU0ZFNjBRNitLQ3EyazRlOWk1MjZHc2hKeWxrMzBQSTh0NVQ3SHlPallkck9Wc0lvSk04blU1bnhDYUhtandyU0xadFhKUWp6NHJOdG1iRWV2QlpsbzJFanhvZW5ZK3dnbVpYUWEzemFRVkFQL2NnVGVtOS8rQStnRVorNkw2UTVJUzhWZzJnZG56MHBJcWlJQ3NLdXYwQlUvVWF6VXFGKzYwV1JWRlEzWkZxQzZORnVDRGF3bUxoMTU2NFZkbjZ1bVV3aTNpTEgrLzlTSHd2c0lWd29wMDUrYTV4RW5KbVF3UU81UnoyTTkyd3ozS3dibGJTclZOaTdkYzRFNkdScWozMlBjMDVKcXBWZnVQakgrT3B3NGVweERHM05qYjRmOCs5elhjdVg2WlJxWXlWNnBEUEVWb3ZzTTVyS01FeTdobHRGc2RwTkgydkpxeUZNOFRNOXJQV2NLRStiZjVCbnRQK3lEaDhKZnM1Vy91MWNiWmVybWwxRjBMS09Fbkw4cHlKYXBYZi9PUW4rTTFQL2lTVFU5T1E1MUFVdkhqOE9QL05sNy9NSzVmZnA2STBRUWo1NHlSOTNGekdtUUM3RW1udHRiVzFXcjJMNXNqem5DUkp5TElzNk1OWWZGcG4wakpqNkx0ZGN0ZDR0YmdZV1F3THpqcUFJQ0dtVmswV0lKbUUvRWx5U0FPbC9RVzVybFdkOTU3anM3UDg1azk5aXNsS0ZXUloyamsrOWRpalhMeC9uMWZldndKcVhCdU9oVlJqeUhjSU5hc21yVm1RcHBsZnJ3cUdQUDl4RHBqR256eHJZUStGc0hZKzJreG8yUFI4dEoranRVbjBRWkNpSjJvQmx3SHRBb2Iyaksxalo0RXZuL0dlTkk1NTlPQkJKcXMxMEJMclBYR1NjSFJtaHFXcHFkSTV0TTZRMWtJVzBSK2t5VHlTSkNtakFpR3EvaS81ZHkwYzFsYUx3T2drbVhYQzVMUDJFMEpyR1pZV0dsNGQ3WVRNdERZeituT1NKQjlNQStnSE5CQWhOYWJUakhMTkFtNDV1NnpaY3c2Y296WG9ReFJCSUg3UGZVRjNNTmlEa0pEdHRzMytGcEpLbTh6eTNsT3BWSWlpaUY2dnQwZlZhdzllTTRCbUh0aFY2L3FhSm9hRkxVUTAvZHM0RXhSeWpFUFhTOGR6TExaTXM0Qll0YTJSWm9zVWRZYktNb2FlUUJMSEZONXo0YzVkYnF5c2dKbjRkcWZObXpkdnNySzFSZXhHUTcrUXBPb1dzcWVoWmxPNUlzSFdhZFhJbGQ4dHdtWGxUZnF5L29TMisxS2laY1BKRU03R09kd0N2NzVITTV1VWkybmEvZjltQUdtaE1FTysyL0JHMUpXZWpFVkU1QnpYMTliNU8zLzRSVzZ1clVHbE1tU0VPT2I4OGgzKzRJMDNTT0trUkk1ZTNwU3hORFBzeDNDaFAxSEJnaXlnckxTeEJOYkVsUmJIOFo0cUk4MU1RaVJyVXVTNnRlZUN5eENzSDRSZUl3SzJneXNOL3dkMkFxMmFDbm5kSVdkSE9GK3IvWEZjWG1vTVgvRGx0OS9sNnRvNm56cnpNUC9sWno3RHpFU1RZN096L01UeEU3eDI0eFpWNDI5b2MyUlY4NDhiNldnQzZES3IvU0lOU3hncEVySHoxeVpCSjVDa1dEU2taZTBpVjJoT2x0RzFZMndYenJTSitrQmhvQTA3UkZKQ2dJUlVyeTV1MEFBSklqUkNSWG9MNFBWYnQ3aTZ2czVVbzhGdmYvNXpISnllNXE4OTl4eC9kdkU5YnF5dms2cjQzWTZ2aVJGeU9pMUJOY0kxN0hxdTlqNHJtU0ZWcloxblBiWU9DU1ZMcU1lMHVIMFFucTBXRWJpdHYySDcvMEFtd0NKVGR6Sk9OUW5BT3ZUUVJRbGFSY3AzYlFNajU2Z21DZHY5UGw5Kzl6eXZYNzBHVWNSUG5uNklYL3Z3OC9UenZXclMvbWx2UFlTNC9Sam5RUXd6VGcxYnYwVDZ5TEpzWkZNSTdJWnpvYkJOK3RwdkljczJLUlFWK0VUTGFKdXZ4L2pBREZBNkRBRmtXbW5Rem9jNFIxYUZQY2lXYVljbzhwNXp0Mi96VDc3L2ZmQ2VhcTNHenovMUpCOS82QlI5RXlOYjVyUHc2dmxZQnJSejBuRDlPRVFRb21tSjF2a1FnY3N5cDRiWitqVDc0VXlyZVFrSDllcWcxYmI2K1ozSTY4ZGJCTExjYWdjS09UOXBtbEt0VmtzZ1E5S3ErN1FwNWs2M3kzZmV2OExYTDE0RTUzanU1RW4rNnJQUGtDWkpHU25zcDRuc3RkQzlJVHpvKy9WL2dYbWNiNkRWZTRnSmhibjNVK3VocE5KK1RSaFBuRkNydmF4NUs4ZjVjUmdnei9OeTc0QUZXaE5kYzZLa1F1VnpsbVVqbXNFaVJ6dE9nb2hhcGNLbCsvZjVsejk2blg2L1R4SkYvTnlUVC9Bemp6L0d3R1FCYlVMcVFjMXFqWEVTcHVjWTBtUnlyOVRwYTJlc0tJYVZ3M1pNd1lzMnFTR0h6WTRkOGczRWhJcXBDZEhJTnUvOWJqM0FPQ2w0RVBLczlNdkU1RGU3bTJXL3BxVmYrcExuOGl6ajdMWHJmT244QlhDTzAwdEwvT0pUVHpJMzBZUXhrcnlmZ3p0TytpM3pXSnlNMHhTV0VXUjh3WTg0WlRKR3FIVE00a0wzTlk1R0ZuYng3dVZlcmFXMHVTNzlwQitYNlB1MTRBRFJhTUdtVk1DR21pVys5RmtVQlJRRlYrL2U1WS9mT3NmZHJTMmM5L3o4azAveWhjZWZvRys4M1JBVGpOTUtJZWN1Rk45Yi84WktvWFdPTlN6NlQ2ZklkVHA1UDBLSHBIOGNJK3FrbEJiT1VQOVJGTzExQWg5a0Z6VlFvdDVEQ0pUUFJWSFE2L1gyTFRyUmxTLzdxVi95bkc5ZHZNanZ2L2tXT01mczlEUi82ZWtuT1hOZ2dUeGc1MElhd1BZZkdrdm1ZSW1xbVZrN3R5R3B0TXdzNXFGU3FaQWtDWWNXRC9QTTQ4K3pNSGV3dE5zNlV6aE9HRFJlUS9PemtnNlVwamUwUHJOblgwQW9KTEVxTFlUQWtFUm9nSzJVNkw1REsyaDJmUGxiYjdYNCtxVkxmT2JNR1I1Wm1PTUxUenpCTjkrN3hQLzYzVmVJbmNNWHhaNXhRNHlocitsUVZUZHRoN1hhdHFwN1hDU2hDUkJGdzlYUlJxUEpmLzRidjhQSFgvZ2tlWmFSSkNsbmYvZ3QvdjcvOXQvUzZiWkxXMjU5STF1d292dTI2bDdmYTJHQllaS3FVcWtBTzJzQjR5UitQeHRxMjRPMGhUWUhsaGkyWnNEK2pVd2l6M25sMG1YKzZPMjNLUXBQVktud2w1OSttbWVQSENFeldzYjZONkZWUzduZjVpazBySUpVdWE0bDM4NHRwRlYyUFhyNHJWLy91M3o4aFU5U3I5YVphRTVTcTliNHlQTS95Vy85K3Q4dE40aUtadFZ6Q0VWWlZzcERmb1g0WXpaOEYyYytrazVFRGNrZ09wYTFkWFhqYk5RSHNXWGpWSmY4YnB2bFlPY2M3WGFiTDcvekRxOWN1d2JlODlLamovQnpUejdPWktOQlpPSnEyL1Q0R3JFNjZ0Qy9hV0k3dDdmME83UzZaL0VsYlhaNm51ZWVlcEZHclRGeXZWNnQ4OXpUSDJGNmFnN3dJNkd5SFJNWVNTaHAvTmh4UTVsQTUxeTVwUnhVUFlDRUpCWjU0OVN6YldNbFZ2VWovKzFLbW5Cb0tPbWg0U21SRHZ6bzZqVys5UFk3ZEh0ZDhKNWZlZlpaUHY3UUtaeXl6YUdtSldHL2hJdEZtc0NoNTZYaHN0ZjBmL2w5NmVEaFBmZ0Y4SGlLUE9QUXdTV2MyNnRKUWxLdmZiRDloQ29VZlduR2o2eFUya2xwVHRNZDJQOTJQNTIyVGZ0SnRpQi92eGIwdUxPTXI3eDducTlldm9MM250T0hEL09MSDNxYVE3TXpKR202cDVSYSt0Qk1yaXVjUnFwa0ZETll4aEFHRHZrbk5yTTNOQTJPdk1ocE5pZDQvcWtYbVd4T0JwaHpPUDd0TzdmS3ZqVVRqeE1PVFVnOXBzV1pNSUZPQlpmenQ0aitjZXkrSUVBUGFQc0lPVnc2VGF6djI0K1RiZDhPZVAvZVBmN2tuWGU1dDdVRjJZQmZlZVpaZnVHRm4yRGh3QUdxMWVvSWZQSlpaOHIyTTFmNytUVHl1ODdXYVVkTTVoa25NWEdjc0RpL3lILzRhNy9Kci8vYTM2WmVhK0J3eE5IdUlWSWIyMnQ4L2J0ZlpydTlGWVRManFzamhwRHExNzZKYmpxeWtXZjNuQTlna2FBSmFJbXRuN01Fc3ZmcDMwTVRDOW5NY2VPSjA1VUMvL2I4ZVg3eW9aUDg2clBQVUluZzExNzRNT3RweXJkKytFUDh2WHZsS1ZwYVl1MTZmS2hwN1dYTmtkWW1tZ24wMHE1SThJa2pEL0VmLzN1L3hiTlB2b0J6RWIxK2x4dTNyK0tMZ2dKUFVYaGVmZU1WL3ZmLzZ4K08rQnRXR0t4SmdOR0NWUjJTaHdSSm5GekxITUh0NFRZR0RoSEhldGlXaUxvdmJZTnNpT085QjArWjA3Y0kxeUdONWx4Qjl2MzFkYjc0MXR1OGVQUW9EOC9QOC9Ua0JKOTcra2xXdTEzZWZ2dHRWdTdmTDA4OUNSVjFoSmhlaDN4eUxjUUk4dDBTd3VPcFZXczg4K1FML0VmLzduL0cwVU1ud01ObWE0TlhYdnNtLy9UM2Y1ZTF0WFhtWnhhNGMrODIyNjB0NGpnaGlwSmd0alFrR0NINjZDZ21SQk9adjA1RUpWcWlkTWNmeEZNUE1ZYStSL3NRZGlMZWUvSkJUcFJFcE5XVVFYZEFuaGRFeWZnTkpyYUpEZnZLbTIveXNhT0grVnN2dlVRMWl2akk5RFMzbm4yV3JDaDQ1NjIzV0Z0YksvUGsxcWV4V1QzeGtIdTkza2hPUGVTVWl2U0wxKzZjQXdjelUzTjg5cVhQOGUvOHdyL1B6T1FNaGZmY1cxM21qNzc2Ly9DbGYvT3Y2SGE3T0FjM2JsK2pLQXJTdFBLQjF5K0VSaFp1NjIrRi9EZnJSRHJuaGp1RFFrUU1jWkJ0V3YzWkNNS3EwRDJBRnA2alR4emk0SmtEVE00MjJiaTN4ZktGdTl5NnNFeGFUWW5jK0VNaU5QRmtqTi83MFJ0ODlQaHhQbmJxRkl0WnhoT1RFOXgrOUZINjNTN3ZYYnpJNnVycVdKc3FmMG1TVUsvWFI2cUFRb2pXWTl0MS8yTUhUL0JMUC9NcmZPYWxuNk9hVnNuem5LdTNMdkV2dnZTUE9mdkRiMU1VUlJtQ3hYRXhzaW5GTXIwT3cvVjFEY3NIOGRrMFU5Z3k4OFJ5OVFkdElTOFU5cDRKcUlFb2tlL2g1UFBIK01YZi9sbE9QSE9Fcko4VHB4SHZmZThLZi9qZi95bTN6OTh0alpQVkdpRlRGRHZIRDY5ZTVmZGZmNTBuRHk0eTFXendTSy9IYXc0ZWZld3g4cDBWc3UzdDdXQllsS1lwemprbUp5ZXBWQ3EwV3ExeVp6R01obzUyN21Mdks1VUtEeDAvdzEvNTJiL09zMCs4UU9SaXV2ME83MTUrZzkvNzAzL0dwU3NYU05NS2NieWJscFhESUhXR2NkeUNtVFd2bXZoVyt1V2FqUkNpYVBka00ya1BQQ0ptblBScmdIVklGZXJMWnJIU1Nzb3YvSjJmNXZDakJ4bjBNaHlPdko5ejRwbWovTUovOGRQODdxLy84ejNwVEF1YmxlWnFIUE43cjczT3AwOC96T2VmZXBLbGVwMkg4b3lOYW9Xang0NXg3KzdkOG1oVmE4OGxNcWhVS3RUcmRmSThwOTF1ajVSMnl6TkM5SExaTjNKTU5pZDU1dkVYK01LbmY1bGpoMDdoY0t5dTMrT0g3NXpseTkvNkltdHJLelNiRS9pNkwvUHlVblNhWlZsNXdDTXc5bnpHRU9OcjB6M3VmbTMvN2ZPZ3RvYUZFTHpmTlVHS3RwTWFTZkpkcHlpOUgyYTVaZzlQczNCOGZ1ajQrV0VpQkNCT0loWk96dEdjYTdCOWY1dTRGazdvV0pzV1JSRnBITE84dWNrLy84R3JQSGZrTUlmbjUvbkpBd2U0Zkh1WnUwbkM5TXdNNnhzYmUzTHFPaHJvZERyMGVqMjg5elFhalpGNU9PZW83T3hKbEFNMW84Z3hON3ZBaTArL3pDZGUrR2xtcCtZcGZNSE51OWY1Mm5mL05YL3g1bmZvRC9xQUk5K3BnNUIrS3BWS0tUU0R3YUJrZ2lSSnlzakZydXRyTFdCVnVYVU1kZUpOVEl3K0ZrL3UzN2NxZUQva0MwQzJDVUdFUVFUaCt0NXFyUUxpL1p0bks3VUtILzc1cC9uUm41eGo0KzRXYVhVb1pUcGpweWVnQ1RsUnFmQ243N3pENTU5NG5GK2RtbUttMmVRVGM3UGM2dmFvTnhyVXF0V1IwamF0NG5XR01rM1Q4aXhlbmFtVWd5N3pJZ2NQU3djTzhmTHpuK0hwUjE2a2x0Ykk4b3lMMTk3bFQvN3M5M25uMHV2NEhhR1RvM2Qxdlo3R3AxUk1aVmxHdFZxbDMrL1Q2L1hvZHJzang4cGFwdFhSa080dmxMME4rUkY3R0dCY3lHZWJWUy9TbWZjZW0yb1ZMeGwydWZiK3RWVTJWN2FwVFZZQU4xUUVPNkZnYzZiQlozN2pKUTQ5c3NpN2YvNGVsMSs5eHNieUprazFKb3IzSHFlaW5iSTRpbWoxZXZ5VFYxL2xZeWRQOHZEaVFaNlpudWFIVzl2Y2FEWnBURXdRcWFWWHFkU3BWcXRNVGs0eU9UazVJamtpN1ZxaSt2MCtXWjV4K01CeFhuN3VwemgxNUZHU0tLVTc2UERhdWJOODVkdC96STNscStUWmJzZ3A0WmxtT3RnOS85Y3VxY3VTY2FWU29kdnQwdS8zUnp6NmNWbldFUEZEUk5kYXdVMU1UUGdQRXRxRmJKQUFvT05ydmVJbUVqUVlET2ozKzdzNUFBL1BmTzRKUHZlZmZvcWxNNHRrZzR3a2plbTNCeVMxQk9mQXVZajEyeHU4KzYzM09QK3RTMXc4ZTRYV1NvdHFvd29SUkM1OC9Ic1V4eFRPOFR1Zi9ReC84NFVQVTY5V3VkWnE4VCtlZTRlM3IxNmx0M01vb3p5VHBpbXpzN01zTEN6UWJEWVpEQVowT2gyNjNTN2RicmNrbEtqdWFyWEd5VU5uZU83Umo3STRkNWc0aWxuWnVNLzNYdjhtZi9iS2wxbmJXS0ZTcWU0eGZYcEpXQXRNbnVlbGhnaHBwSDYvWDJxRVhxKzNoNWhDR3kyQWFacU9WQWpMSEd6QktvQ2JuSnowT3U2M0NCV2l5bi90K0ZtN281MGtVWnUxV20yRWkwV04rc0x6OUdjZTU5alRoMmxPTjJodnRCbHM1aHc5YzRTVEx4NWg4bGdURnptY2g3VmJHMXo0N21VdWZQc3lsNzkvamUyVk5vM0pPa21hbE02VWVPSnhIRU1VY2ZMQUFmNm5uL2xwbmx3OENNN3hlemR2OHNVTDc5RWJEQ2gyRmxDU0pLSFJhREE5UGMzczdDeEZVYkN4c2NINitqcnRkcHRXcTdXN0VoYzVGZzhjNGlNZmVwa25UajNIZEhNVzcrRFczV3Q4NCt5WGVmV3Q3N0cxdlJWY2c5REUxb1NROEZremljYXBKbFMvMzJkamMydDQ2SVJ6UkFHenFEZWphdjlMQzZxOXh6V2JUVzhUQ0ZieTVVOTNiQmxHQUxZaGs0NWx0VDhReHpGWkx5T3Rwa3dmbUthejBjSG5jR0RwQUk5LzdBd25YempLa1E4ZlpPSklIZWNpS0lhTWNPbjdWM24vbGV2Y2UyZU5ySjJUdTZ3OFluMWlZbUxJQ05VcTljbEovc1l6ei9CWERpOVJqU0xXc294L2RPVWF0MXF0TXNsVEZBVVRFeFBNemMweE5UVkZyOWRqZVhtWnV6c1JRN3ZkSHRyZXlMRTR2OFNuWHZ3OFQ1eCtobnExU1o1bm5MOXlqcSs5OGllOGQvWGRrUU8yUXc2YWpwYTBPcGVvUk15UkRjdWRjMlI1UWFjM29KNFUrR3pBN2RVVzRLa2tvMHU5OXJQdVI4YTBtMXJkeE1TRWwyMUora1k3Z2RCS2wyVUd6U3doSjFCckNtMnZvaWdtTHdvbW1nMW1KaWJvOURPbTVxWjU2dU9QY3ZUWkpSYWVuR0x5U0JNWFJaQjdOcGEzdUg5aG5jMkxIVmJmM1dEMTdqbzVHZE96MHh3K2RKaG1zOG5rMUJSejA5TjhJWUtqTytPZGJYWDR5c1lHYTV1YmREc2RzaXhqY1hHUnVibTVNdjVmWGw1bWVYbDVKenpyTXhoa0hEOTBpcDk4L3FjNWVlUU1hVktoMit0dzd2SnJmT2UxcjNOeitkcHdYcmc5ekc2bFh5UmUvNjQxUXFmVDJTT0F2VUhHNG5TZHYvN0owNXhlbWdCZmNQM2VGdi9pRysveTNYTzNxRmZqb1QrdHZIK2JNOUI5MnVJYjEydzJ2YzNYMjdCT000SGxVRTFZbmRVU2JhRUIwQ0ZZV1pLMDgvMHZ2ZnhSSGoxK25EUVpPbkxuTGwvampTczNPSGJ5R0VjZVA4akNvelBNZjJpS3ljTk53T0c4WTdDUjA3N1JvL04rUnU5R3hvRzVneHcvZFh6WGZ1WTU4NjB0UHJiZG91SUwrc0FmOUFkY2FiWEx0M0pNVGs2V05yUGRick8ydHNiYTJscHBiMDhzbmVIWk14L2g0UHhoSExEZDN1VGMrei9rL0xVMzJXcHQ0QXZLc0UzOEh0RWVFdUtKbzJjZFB2MjVLSVludFEreWpEejNETEtNVHJmUC9HU0YzLzdsRC9IWFB2NFFsVVk2OUpiemduL3o2aFgrM2ovOUxtZmZ1VVdhN2kxbUNkRlJtd1Jod0QybmhGbkhRdHNrN1gzcWp1MmYvVTA3TjhJY2tnV0xvNGhmL3ZUTGZPN0ZEek0zTlVWZUZEZ0hEeDFhZ3NqeG84dlhJUE93bFpEZGNmUWU5a3cvVmllZWM4U1RqcW5INjB5ZGNMQWVjNGdUSEttY0lQS09kcTlEdTkxaXhSZGNiM2M0bFJkVWdJK21NYmZUaEdxdFJxTmVMOS9CSS92emhxYWtpZmR3YVBvVXh3ODh6RVI5YXVnZmROYTVjT04xbGpldlVXL1dxTllxWmU1QWpvR1JIYmlTME5GbVU1dmFQQy9vWnpuZVE1WVg1SVhIRXpIUmFMQTBYV1Z4dXNMQnlaUVBuWmptbHo1Mmtrb1N3eUFYbGN4UHZYQ0tzKzh1OHhmdjNoN3hGeXpOdEZDSDFnWVMvWUNXZGgzNmpBc0w3ZjIyajVBVzBjeVZKQW1MOC9OOC9pTS93VVM5eGtCNXJVY09MUERKRHozRnF4Y3VjZmYrWFpKS1NrcktwSjhtYTFYZ2tDYzY0ZkdOQVZFOXd0VUw3dWZYNldhYkhCd2NZY3JONFhOUHU5dmx3c1FFaHpZMmFPQTU3aHlQMU92Y2lJZDUvM3E5WHRyRE5FMXBOQnVRTHpCZlBjcFViWjRrcnBBWE9adWRGUzR0djgxSzZ3N1Y2akJIME9sMFJsWUN0WXFYeElzSEJubEJmNURUNncvbzl2cmtlY0ZVTGVMRWZJM0RjM1VPejlVNU1qdjhQemRScFZtSmFWWmptcldFeVZveWxQQkNtd1pQRXNVY25aOWdmcnJPeW1hSE9CNHR4QW5SVFdkV3BTV2FlTmFXVzQ3UzNLVHRuUjFvM0xOYUs4UnhUTDFlNS9TeEk5UjJpamRHZ0hXTytabHBIanY5RUhmWE54Z00rcVRWbExucGVSWnFDelR5QnNsNlJIdXd3V3BqbVY3U0k0OWE5TklPVy9FYWsra3NrL2s4elg2ZFpIS0dqY1o5YW5lV2lZcUNsNUtZcjA1T2tkVHJKUUhGMlV0OGxhbG9pVnJjSkhJUmVaRnhiK3NHTjFiZlk3TzFQcXc2amlMeWZLZ3hLcFVLZ3l3YkptMEtUMTU0dHRvOXV2MkNMUE5NMWlLT0hHeXcwSXc0T0pGd2FLYkM0ZGthTTgwS2pXcE12UkxUcUNZMEtqR1ZTZ3l4SzVmR2NReVRaUVBqbDNrZ2poamtCWjErWHA2aEdOTENXdURzNlNkUkZJMitNMGhMcS9VSk5ERkQ5UUtXQWZRZ3VyODRIcjcrYkdwcWlxTkhqL0xVaDU0bGpnSWF4bnNxMVNxSGpoMG5iYXp3eUNPUDhNZ2pqN0M0dUxqenNxUTZhWnhRNUlzYzdoNW5KYjNEN2VRcS9haExOeXJvUnowMlpsZHBOQ1paNkJ6aFpueUFtZFZWNnIwdU03N2cwVHpuU3BMZzJKR015RkZsa2liekpLNUtoQ1BMKzl4WXY4U2Q5V3NNaXFHMzN1bDBoK1VMVVV5V2UzbzU5RE9vcFRIek5jOUMwekgvMERTTGt6RkwweW1UdFlScTRxZ2tqbG9TVWF0RVE0bU8yTW1HK2lHaFpaOWpMK2ZXNmpZM1Y3dGNYK2t5eU9HelQ4MHpQMVhkelp3NngvcDZpN2V1M0dlcjNhZGVIYWFsUTZZZzFIVHk3TWQ2WDREK2J3a2RXam5UNGFHc3JrVlJ4T1RrSkFzTEN6ejExRk44OWdzL0R4ZmVJTS9NdVQ4dW9qSTV5Y0xpSXZWR2d5ZWVlSUlUSjA1UXI5ZExXd3ZEaEZBY1R6UGo1emlVSFdNNXVzR3QrQXA5MThVbkJWdnhnSFoxazN2WkRKWE5CazlkN3hQNWdrZmJMZTVOVDlOTlV3YTlIaE1zVUhWVFJBeVpvcHQzdUxaMmdaV3RPd3lLZ3NMSDlITklJODk4cldCcEd1YnFqdmxxd2t4dGdtYkZrVVNlTkJvU3U1STRrbVJIbWwySk1NZ3pLUHI0UEdXTFNWclJETmZ1YnZPTmIzK2JtNnQ5MXJvRi9heWduM202ZzV6K0lPZjFxNnY4MXM4OXpJSFpPaFN3M2VuemovN29SL3lMYjU2bm1pWllPb2VJcnpPSW10WWZlRGxZcTVOUXhVd29MYWsvNjFXMFdxM0d5Wk1uK2ZTblA4MnBnM05jZW1jbk83YWpYZ0hTK1FVcUUzUE1yN2VabTVsaGNYR1JxYWtwNmp0cVd5WWtublhzRWlhWm9aNDNXY3lPc0J4ZjUxWnlsWUViVU1RRldYeWY3NTlKV0Z5dnNyZ0pGVC9neUswN3ZFL0s1UHdacXVrVWpoaVBvNVZ0czdKOW5rcCttMGVuZXN4VlBUUFZqT2xrUUNXT1NKd2pqUjFKQkltc0lUZ1lybXo1bmY4RkZKNWVOK1AyWnM3dGpZeGJteG1USno5Q3V2UWtnMlNXd3NVVUpHd2ZhTE41ZUlLemYvRi9FcVdWNGJ4MkZvSjhVZkQxTjN1OGZXT0xJL01ONXFNVzcxMjd6VGZPcjdIZXpxbkV1eHA3bk8zZno3UW40OWFmYmJPeCt6aGJZeGxBbmhFdFVLdlZhRGFiUFAzMDB6ejM3TFBjT3Z1dEVwalowNDlRWHpoSTVpS2lhcDFzWllWbXMwbXRWbU4rZnA2SmlZbHk3VjZTS09KUGlQT1Z1SlFKWmppWk5WZ3NqbkVydXNweWZKVWl6dWxYQ3M0K2x2TXozNi96WnZRMDJmUUVUZWVJa3lyRE5ZbUM2ZWdhVDlkZUpXNzJjQlRFemhNN2lKMGZTcG9ERUlMdnpyZGZwR3d5eGFhYnBoWFAwNG9YYUNVTGRDZnFaTE9RRlo2czhHeWtkVnhTeFJPVlQwZVRzeno4NGMveVovL21EMmh2YlpiaDRaRFJZN2I2Y0t5N3l0K1l2Y2l4ZW9mdWZNNjlSejEvL3l4ODhieWptamhnYjRRV01zM1N4RlRzV1EwVVl1azk3dnBoa1RwOVhiU0JYdlN3RERQTW8xZkxsTzJCQXdmbzNMeEdlMzExQ0VpanljR25ubUdRKzUwa1RNYms1Q1FuVHB3WVNka21TVUszMjZYVDZRVDNNWGlmRXpsSExhbFFMUklXa2cveEVHYzQzN3ZBZXZVNnl3c1paeXRQRUUzTUU2VXhPMjRSUmVHSnVoczhmdkRiUkQ1SFVYdm5jd1E0aXF4UDBXdVRkOXY0ZnB1ODJ5WHJkOGdLRDhRMFhVcmRKY3hHQ1FVSmhVdHdMc2E3Q0Z5RXgrSGR6cWd1eGp1SEoyYlE2OUY0NUM2Ym14c1F1ZUY5M3BHNW1Pa2s0K1dEMnh4cjlJbUhZUERRak9PL2ZnbjZPZnpyOTZBV1UrSmluTzNYNndDbENaQWZKWkZoanlyYlJleW9DYkFwUnV0RTZ0U3dNSU13d2R6Y0hNMXFoWHZueiswOEczSDQ2ZWNnVGlIdmwzNUVvOUZnY1hFUjUxeXBDZUo0K0hLa1NwcFN4QkdGSkZOaXgxYTM0TVphbjZ1clBXNXM5cm01bFhGcksrZjJWa1kzbTZJK084ZXZIcjhPVXpQRWNZUmVqNDZpQ0o5V3VYWWZUaDZJb2QrRnpqcDAxcUM5dHZOL25hamZJWEtlMkd0MVA2eG9lTUFhNmc2cjJjdFNKZVY1NUZDQlgxTE1ySjVNSS9Ya3pzY25EenMrZXJqZ0s1YzlxRWhPUjF1YWZwYjQzdnZkZHdicEVFRXZZMnBiYXhsQkozcENaa0RmWDYvWE9YYnNHTWVPSGVQb3NXTXNSVG5GWUpnc2FTNHNNSDM4VkxuNElndEd6amxxMWVxd1lNUjdza0dmUEhPc3QzcGNXTjdreW1xWGErczlycTMxdUxyV1phV2RrUmVld3JQN1Z6aGNaWm5LL0xkcFRmK0l5dTJmaFVWZ3o4a3huangzM0wrUmMvTDlmd3lEUHZpaGFrVVRlNFNjdTUvMkovNXVLOW5BMjR1TzNiV2ZVRlFVNkN1SCtUck0xV0cxNDNjaXlQRWJjVUs1bnBGM0JrbEdESFpmcEJoYTJOQ2ZyVDlnNzNWdXVPVGFiRFk1ZmZvMHp6MzNBck94ZzYzTjRUMVJ4T0tIbnQ5VFVwWVhucnZiQTk1ZjdYQjFwY2R5YTVVYld4bFgxN3FzdFROZ1NHaS9VMUhrL2FqRTRCMXgvVHIxdVQ4bm1Ud1BVWStjZ2pmamQza215dGtOc2hYU1k3aGVuK0hxM0g5RnY5dWkyMjRSQVpVMG9jZ3pldDBPM1hhTGZxOUQ3QnlPZ216UXA5L3IwdTkzeVFkOW5COHlqSE9lQ0Uvc2hrREdFYmlob1BMWU15K3pjT2dZRkJseDVGbTVmWldMcjM4TG53MXdlSnpQS2JJTVgrVGdDeDZlN1BKekoxbzdES2xhQWhzOVdPK0EyOUZCSVRyczV3dVVHa0N2VmN0RDRvell1bnpkaWJVNW9haGl1RFpkOE96Y05BOFBOb2lLM1RXRitxRmozUFlUWEhwM2hVdjN0N2w4dDhXVnRTNDNOL3EwQmdWT0NzWVVnVVhkaWgvbWRzWk5ZMWhzeE16TVhXT3o5alhXM0hrS0JrUEU0RWlJeVk1TzByK3pSVHBYTFV2UUFZb3NvN2Zlb1QxekZGOUEzMC9RenR0bGhwQVVXbm1MZGI5T256NXBraEpGRVoyOHcxYTJSYXZUb3R2dERwZWFKUWZpUnM4SUZQWDg3Vzllb05hNFRYTjZqbzJWZTJ4dnJ0THZUUVBEaloreTlwOWxHZTEreG1OVG5sTVRYUjZiSzBaMHcvdjNQSzh1T3pxWnB4WVBYNjRodFFSNnlYNC94ekRSTndremlGMlhXRnV2WG1uSExoUmUyQmJITWYwczR6LzQyWi9pNGNNSGlaUFJQTUg1TjgveDI5OVF0a285cThObkY3bVM2STAwNHVoTWhSTXpOWTdQVmpnNmszSmtLdUZtL3cyK2RQc1BlWGZyUExuUGgwa2VZbUlYODdHRmovRkxSMzZKNDVNUHNmM0gvd05iei80S3llSUJ2SGZnSXRidjlMaDdkNW1wWjZya2c3dzBpOTd2MWoxYVpwZklScGVTRlRzK2lzeTlOS2ZDQkVWQmtlZHNiYXl5dm5xdkxCQ1ZncG5CWUZDdUxlUjVqczl5M2w1TCtIcy9tT0YzWHRqaXhNU0F3c085dHVlLys2N25EODhYMUpOUjZiZEp2RkI0V0lhQlFzaFFtWkY5MEVxMzJPdFFaWTdjNy9FY1hqekNzUU96UTFWcXRNalNWSjNESzV2Y2R0UEVEaUkzVEFOSERxWnFNVWVuRWc0M0kwN00xM25rMERTbjVodE1WeHpPNzd4VkpPL3kvWlVmOEEvZS8zM2UyM29QNzRaTHM3R0xxYmthSDV2L0dMOTQ1QmM1TVhHQ3ZNanA5ZnJVcmx5aDhlZi9DZjBqajNEOXMzK1pHM2RQa1hjOHJqSk5iMjJOcUxscittenRnMlpzbmRhVzZpY3BOTEhGSFZwSWltSjRhb3E4MGthSUw0eW1YeVNkcGtNaC9PRkt6Ri85eWl3SDRoWlp0OFhGbFlMV0FKSm82RVNQSTd4Tnc5czI4dlp3TGVIQytlTWVEa1VLSWpXYVVmSzhZT25BQWVJbzNxTitZSmo4K2ZCVWo4SFJCWTdOVkRreW1YQjBLdVhRUk1SazZ1anRsR2hWZC9JSGFhVkNiOUJqcGJQRzJmdG4rYU9iZjhUbDdjdkViamh1NmxJbTQwbGVYbmlaTHh6NkFrdTFKUWI1Z0szdExUemdOemVwcmR3SDUwaFdydUdmbktPYURXamZTdkI1Uk90eWsrcWpkK2wydTJVWnVTU3d0SE1zV3RDcVdydlJRNFNyMysrUFNIdTczUjRwRDVlbUN6YTAwTVZBdTkzanJhMHV2VjVHRkxsaFNNZ3Vyc2ZsWWVUL1dDZFE1L2QxS3RmV2p3a0I1ZDZSQXgyajBmUHpTd2tCM3I5eG5mNllWOUxIa2VPdlBsTG54Yzg5Tmx3dDYzYko4cHk4R0s2SjV4NEs3OGh6VDJmUTVmNWdoVy9kK1JaZnZQcEZycmV2azBRSmFaU1N1cFQ1Nmp3dno3L001eFkveDN4bG50Nmd4L3JtZWttc3pIdUt0ODlSTFlhMnRIdjBLQzZPbVhzc28zMDNodHlSYjFUbzNhK1ExVGIzRkcySVE2dkwwTFRXMUZVL1FGbnFQUmdNMk5yYUtvVkthZ0ExVHZkcnNyemM3WFlwaWh6bjlrcDRLQ20zM3hpbDQ2OVZrdzBKSDdRY3JGVy81VUJkRVhQdi9oM09YYjNCekVTVGVyVlNYdS8zKzZ6ZXVjM1ZiM3lOV3IzS3lROS9sR3duZkl1aWlNaEZKSEZDei9lNHZYMmI3OS8rUGwrOSsxVnVkVzlSaVNwVTR5cTFxTVppYlpGUExIeUN6eDc0TERPVkdRWitRT1l6OG1MM1ZTMkR3WUNCOTFRdlhZYWRZMlk3UjQ3UUh3end5WURHRVUvN2FoMmZSK1MzWm9oUHIrUFZnV1k2c2FXZExGMndLYXBiaUN5L2lhUUxYclNxRnEwQnU5S3YzOHRRRkFYZGJwZDJ1MTBXbHdoUmJmclhTcmxkaU5OdFpDM0FPamJqdU1vK2JDZGd1YTZNNVNzVmZ2ZExYeVp5RVUrZVBFcXRXcVU1MGFUZjZYSHR3bm1LUE9mYi8rVC9vTE8xeGVtUGY0SW9Tb2FPMG1DTDI1M2JmTzNPMS9qbXZXK3ltcTJTUkFuMXVFNDlybk9zZG94UEgvZzBMODI5UkROcTBpLzZiSFkyaVZ4VUVpZlA4N0pvSTNPT3hjdnY0M1lRc2pZL3g5YlcxcEJBMHg2ZkhzTmxGWHluUXJZOFNYLzZOa1cyNnptTDZwWkRId2VEQWExV2k2MnRyWExibWZlK1pBaTlYVnZqVHZJY2xrajZrRW5SRnAxT2g2MnRyWks1aEY3NmNBdHI1eldEaGh4Mi9YbmtyV0hTc1YwMzFxR2lsbmc5QVptRWRYWktSaWt5L3BjLy9oSVBuWHlZejN6eVU3ejArSE1jUFRqUDhwMWJyRnk2U0pGbHZQb0gvNUpldTgzaGozK0VhNzJiZlAzR1YvbjYyamZaeXJhb3VJUjZVcWZwbWh5dkhlZFRjNS9pSjJaK2dtYmFwSmYxMkNxMlNoaHo4dEtqN3ZmN2REb2RXcTBXdlN6anlJMGJ3emVST0xoYXFkQmZXYUZXcTVIbkJZT1ptMVR2bllRaUlyODd5ZkxHbXd4OEIrOHB0WWd3bFRDNE9ITlN6NmZ0dmthMHpwamFmUUJ5ZXFyR3RURFg5dloyV1ZGdEhVcXRPWFFMbGZlRmhObDdUNkxqMDFCc3I5V0tKYjYrMXo0dnpERVNNYmlFMVpXN0xOKy96Y1VMNy9MR0cxMU9QUHRSbW8xcGx0OStuVjZ2eHh0Zi9pUE8zdmcyMzZ0ZXdIWDd6RTlFMUthbWNiVXFCL01EZkdMbUV6dy8vVHkxcEVhMzNXVTczemFMSjI1RVNnU21RWjdEOGpKSmQzaW1VSzlSNTM1UkVHMXZsK25sVG1VTGw4eFJ6V2RJZllObzlRQVhWNzhHeGU3Yk52VDg5VFdadC9ZYk5FSDBOaSs5YzByblcrUTUwU0RkYnJlc050YWwzOUtITGd2WHp1ZzQ0cGZDcU9pVnlONTIzZlRKRjZIa2o3MHV2Mms3cEgvWFRsU3IxZUxWSDd6S3plczM4WVhuSno3NklpOTkvaVV1REM0UnZkc2h6U09hcjYvdzArNEFSZVR4ZU5aTzFLZys5Z1R6N2NOTU04V2FYOE5GcnR3Y29uZmI2dTFjY3IzZGJ0UHBkcG02ZmgzeVlYNWdmZUVBdU9HSzRzcktDcFZLQlJjN05xcnZzZEI2amppcXNGQTVUVEk0eTkzTnErUVp3RjUvUnpTTlRwc0h3MkVsQ0hKTjFsNkVDY1JVaVphUit5UkUxTDZCeFhPSXlQSmZhMlo5MzA1MGs0d1FTS3NxelNsYXVxMFRZN25LMmh2dHJPUlp6dHE5TmZxRFBwV2xDajhhdk1acmwzL0VwUk1YZVhGN21pZXVUT09UNFFzandCSGhXTG9WRVJYYkxFL2NaV1h0UGlkT25DaGg2bmE3M0x0M2oyNjN5OFRFQkZOVFV6U2JUZXIxT3M0NSt2MCtXMXRiYkxUYkxGeS9RU1RiMCtibTZQWjZ0SFppOGZuNWVhTElzVldzay9qcnpQdUhhS2JUUEhIZ1pkWTd5eFJ4UVZIczNjSXROdDF1bnRINDBtR2t2SGhLK2hGVkw4eXFWMkcxeHJDbmYxZ1RveGQ2TlBPSXFaQjdKVXdWM3lEUjlrTThVTG5aZW84aERyZWhvODByZU85M3NuZ09NcUFKNlltVTRtUkI1N0VPN3h4K0I5L3h4SEhDMVpOOW5yeGFKbitIL1FIOVFZZnUzVnUwQzVpWW1tRmpZNE5XcTBXcjFXSjFkWldyVjYreXRiVkZyVlpqZG5hV3BhVWxscGFXaU9PNDNKWFV5bk9lWFY0bThoNEgzR28wMldxMVdGbFpJVWtTcXRVcXRWcVZ3bVhjSHJ6SlpIcUlTbHpuWVAwaERrOCt3dnVycitOOFVoS2szT0VVY0xRMEhzUVpsU2hBaDRaeXJkZnJsYmtGcTFsMXBaWDFIVFJkckQrZ2FXQkw5RFhNaWFpdmtmMWl4cGFMU2RBY1o4Tkg1OXlRV240bjh5NEk4UkJsRWNsVVFub2tKVDRWa3p5YjRBOE5mMHQ4UXBxbE5OWWFuTjQ0Z2t1Nnd6ZUZtZ2s2QitrTzB0OS8vMzIydHJhNGYvOCtHeHNidE52dFVoTmN1WEtGZXIzTzdPd3N6V1p6eU8xeFRLMWFZMkpqQStjOWhYUGNTQ0pXVmxaWVdWa0JoaDcrd1lNSHFkVnJ0UDBhVjdaZTQ5R1psNmdua3h5dVBjVnI5NzlOVHI2eit1dXAxV3A3RnN1MDh5dmFSOVMzZm5tMGpwREVWR21tMFUxTHRLYUovaHh5TnFYcERUMTZWNUtNbGVqTm5Ib1N3blgyQWUwSGpEZ2NPK0ZTM0lpaGdLSlRFTHVZZENHbGVySks1VXlGOU1tVTZHQlVNa2E4SFJQZGpVaXVKMVJ1VjlpZ1Q2K2FrVVp1ZFBYVGU5YmJIUzVlZnA5aUp6VGEzdDVtYzNOeldCdFFxWlR4Y3JaVG9idXhzVkdlVEo0RForSmtwNlFEMWhzTk9uSE02dG9hTjIvZUpNOXpWbGRYYWJmYkhEOStuQ1IxM041NG00T3RoNW1iWE9USXpNT2NYdmd3Mzd2MHB5U2tGRVhCOXZiMkhyeU1hRDIzNnpoS2FHY3pxOXFKMHdKb0N6djFXY2FTcDlIK2czWWdyWWJXL1dwR0VLWktMUEd0QTZPdmE1czBZdnN6VDdxVVVuMjBTandYUXc3NS9aeVltTnJwR3VsVEtXNW10NDlrSXlHL250Ty8yQ2Uva0pPdjVkek9iM085WGlGYm5PZlp4VGttYWhXS25WcjRtMXR0Zm5CbmxSdGJiWnlTSUVGb3U5MHVFU0Flc2FSZm5YUDRKT0Z3bEpGVWh1WG5keWFud0RtNk80eWsxWGRSRkN3dUxwSTBQSmUzdnM5TTQrZVlxTTN3NU9HUGMrN2E5OWpxcmc5UE5GR3Exa1pDMW5HMm9adG9CeG5QU3I1MUlFVVFkWkpPdm9lMm8ybDYybVNSM3JJSHFpaDBITWZKLzFBY0NWQU1DdEpES1pPZm42VHhmQU9YRE5kbmZYZEhMZFYyYlhxOEVqTzROS0IvcFUvL1FwLzIvVGJkckVzVUQ0RWE1QVBPOXZwc2Qzc2NuS2dUUjQ1V1ArUHEramJYTjdkSmxCblNTTk5WVEZvRlNrNWpNQmh3dWxZblphZ0JidFhyYkd4dXNyNitYaUlzeXpMVzE5ZnA5WHBFVWNUaTBpSSszbVMxZDVPRituR096SjNtaFljK3k5Zk8vZDhrVVdXUCtnMkZZTnJXd3U1Uk5FVlJsQ2VFNkRlSjZIUzg5djR0b3dsTmRLU21IVDlMVHkwWTFuOUw3QmwzNHVCb0x0VUE2ampYZXc4NU5KNXZVSCt1UGlSOHRzTWd5UTYyQzRqdVJnd3VEc2d1WlhUT2Q4amFHWm5QaU9LSU9CbGRQT2tQQnZ6ZzVoMnFjVXdsaVdrUGhsNXhHdGpBS2dqUUNSVE5vR1U0NkQxbm9valVPWnozWEsxVnViZXlRcXZWMnFOTjhqem4vdjM3VEV4T01EVVJzK1l2TVowdjBhaE84Y1RSajNMKzlnKzR0WGFaSks0Q282ZCtXT2ZaYWszcFg3NXJJbXZjVjZ0VnZQZkI5TEh0VDlxNDFWeHJhalNqZUs5S3d2VE5nOEZnSk5GZ1ZVanB6T1NlZUNJbVdVaUkwbWlYK0ZBdTdQZmY3TlA5WHBmZXhSNzlkaDhmRGFNQzc0Y3hmaWgzRUx2aGx1aXNHRmJYUkFwR0hWWUs4ZlpUbjRYM0xDUUppMUZFRFBTaWlPVTRZbVYxdFl5NWJTaDcvLzU5b2lqaTZORWpOQTVNc3BuZFpLNDR4ZEwwQ1Y1NDZMTjg1YTEvaG1NVXBwRHpKdkJaTGFCL3Q2dUpVamNweDhOb3gxRVRQdVI3MlBIdEM3cjBid0pQRXVKYThWaTE5Nmx0aHg3UTc4VEdvVEkybHpwYVAyalJlcU0xTkFQUjNseTBqR2tCa3hJZ3E3SnN1bGxQTHBURElJNDVVNmtNM3pUcVBmZWJEVGE3WFZvN2UvKzExaEJUSUdxNVdxMVNyVlp4dFF0TXVpVXFjWjFIRDcvQTljMTNlZWZHV1lwczl4bWRRcGZ4clo5Z3BkUkt0WXpwdlI4eERkYTNDREdjWlFMUjRxRnNvZTV6cEI1QUQ2aUJ0azVpYVdjajhDMVBkamVqNkJaRCt5OHdPTWpYY3ZwMyswTkpqL2J1SXhnWDBsaWkyM3VrYWVuUnorblkyVHZIdzNITThEUWl1RHM5dzNhN1RYZW5yTndpUmZyZDN0N20xcTFiZ01jdlJjeE1YV2JKUDhsTWZZbm5UMzZLdGQ1Tmx1L2NvdGNiUFgzVUl0Z0tqTldxMm96SkFkZFM5cTducVQ5YjlXODFnWjJQUkEzbFN5S1VkaDg1TEZxYUpuakk2ZEQzUjNGRTYyd0xOK09ZZkdtU0tJMGdobXcxWS9OZmI5Sy9zK3RIV050a3Iydm0wbW96cE41Qy96VnM0akc3T09aTW5GQWQvc0NOYXBYMWUzZkwweitzRnk5ejdmVjZyS3lzREplUnN3SHBvUW1tWmc5VGoyWTRPdk00ejV4OG1VNy9UN2wvZDIxUFNHeWJIY01LbkZRVU5ScU5jbUZKOGdSVzFXc2FXWTJubXpDZXppTHErY25ua2RWQWpjeFFUdHR5TDRDUFBQMzdmVGIrZElQZU96MHFpeFdLWGtGdnVjZmd5Z0FHbERaL1AzdGxXNGpUN2U4V1BrR01UQnlHS3ZVa2tIcFA1RDBYZk1IYTVtWjVIcUNHd2NKV0ZNTXpnd2FEUHR1YmJaS1RNN3g0OU9lcE1zSHBBODl6cC9VKzdkYVBhTGM2ZXdwcXJTUmFiYVh6K3JJTVhLMVcyZHJhQ3BiZ3k3UGpjS0x4cTRWSS9CQmRxU1dMWDJCMkJ0bVlWRHRISWVJUFJ3YVhPUEsxblBaNm0zNjlUNUVWRklPQ0tJNzIrQWJqbktXUVZ0RHFNMlNpckhyVmVmZ29pa2dxRlk1Vktrem5PYTd3YkZlclhObmNMUE1Hb2RoZHd5R2ZXNjAyN2U1VktzVzNPVHp4Q0VlbXp6Q1hIdVhNd2VlNXMzcUQ1ZjZkRVhPNUoxSXljN2RaVlRsTXExNnZCd21yOFI2eS9Sb25jazJQSVdwZjQxVmFKSFpRMjBQTHZaWkFGbG5PT2VJMEprb2lpbjR4RFAyU1hlS1BzL2wyY3VQdTBVa09PMmxydy9VeExGbFJjRFF2cU96NHFEY3JLYmZ1M1J0SnFJU1FiY2R3enVGenVITG5YVjY3OGcwS2NtSmY0Y2prWTV3KytpVE55VVo1WnJER2xRNVJyV2J4M284czlZcnpKMHhrMWJiRm8vMDhqbTd5WjVldFN3WUlJZEVDR2tLOG5xQUFIRVhEZmZaUnZPc3JXRS9YQW1vUkh2S1FoYWg3bkZEVG40NnB2ZmYwODV6aldVYVZZYVh4MjcwZXJVNjNySzZ4NmxRenRPNWI3czJ5QWVkdnZjcUY1UjhTeHltVExIRnE5bWtXRmhhb1ZOSWdFMWttMEg2VU1JM3NtVnhkWFIwNU0xRHVIeWNnbGhuR1hkdVB4cEVscW8zNXJYZHBPVnl2aEZsVmJmdTJTQTdaZm4yUG5venRWOE5tNFplK00rODVDZFFZYnUxOHE5T2xNK2hUcUlVWXV3SVhraVFRcHlyaTdzWjFmblRsbTdUN0cwUXVZYW4rQ0tjT1BrR2pXUTh1cUlXY1ExMVZMT2NHZHpvZE5uYk9NcmI3TS9kek1FTU9ZT2llY1MyeXRsMHZTNFljSTJsYUxZOVRVeG9BKzEwVDBTSThsUFd5enFobHlKRko3V2lrV2hSeEJFaThCK2Q0cDl1aHU2TjI5YmlhSUphcGJmUGVjK0hXRHpsMzR5eHBuRkpubmxQenozRGswSEdhRTQzZGd5c1VnOXF5T1NGdXM5bGthbW9LNzMxSi9KQ0dzNzZFeHFIY281bi9RUXd4Z2l0TmVCaDlvN1ZNUkh1c0Zoa0NqTlVnY3QyV2FXbTFhb0VmcHhGQ0U3ZkxudFpVWlVYQnlUUmxJaHErWnU0Mm5tM25SaElrMW9uVS9ZVDhucUlvaUZ6TVptZVZ0Mis4d3IydEcwVE9zVmc1dy9HNXgyazA2enVuaU85V0tlaytoU25TTkdWaVlvTEZ4VVdxMVdxNUtiWWtpbG1aRFJGMVJJMHJCaHVIdzNIWG81QUVoUjYycGtHSEZSWUlQV2t0WGJxZi9WUnZ5SXpJNXhEbmErUkt2eGx3T2ttcEQwdFJ1SkJuNUdQZ3RPTmJNMkMxVHh4RlhMajFHdWR1bkNXS0lpcCtnak1IbjJOcC9qZ3VHbFhidW1oRTNrZ3lQVDA5UEIraDArSG16WnUwV3EwUExBQVdIZzI3YlhZdUlUcEhjcU05Uzk1eWZxamprTXJSQkpaajE2dlY2by9seklTMGdvUlgrMVhoU012em5BSTRGVVhVM1ZBRFhCams5SXJkbzFmczJDRVZhcldWUmxzM2EvUDJ6ZTl4Yy9VOVhCd3hHNTNpeVBURFRNOU9qVGpGb2xrbHptODBHdFJxTmU3Y3VjUHk4akxkYnJlRVJ4ZHM3TmRDNWtCSE5lTjhoeEN1ZG5la0sra0pJWFkvMjJMdjFTdGZJU1lKQVdJSllMbGFjdlRDQU5xOFNKOWE2OFNWQ2llQitzNjlGd2FEY21YeFFaSW1STmZSaDRVemlWTGV1L01HNTI2Y0pTK0dZZUhwaGVkWmFCNGlUWGZMNnNUVGw0TFZQTTlaWGw0ZXFVT1FKZXNQMHNiUkllU0hXYnlHV2hUcVZNSWVhN04xeDJKRGJZeHVseTdsNkhXNzZCSUNkcHg2ZnRDMVBScklPYVlpeDZJYlpyb3k0UEtnejhEdlhkM1V6VHEybXJrc25weHorS0xncmV2ZjRlcjl0NGdpeDJMMURDY1duaHhXR0x2ZGhTSjV3NGhVS2ttZXZ5aDIzeHNrZnBiNEo2RUtMWUVsRktHRXpGWElqRmxHaWJ6ZlBjSGExcDZGdU1lV2tPMUhESTFVSGRib2ZpeVRXUlVzLzhmRnNiby9lYTV3anVNdUt1My9sYUtnN1JsNTFvNWhWYTkyZkczOXY5eWZ4Q2szVmk3eXpvMi9vRHRvNFhBOGR2Q2pIRHZ3TUxWNnJkUlNVdENwQzBIMXZrcGRvcVZoRTc5Qktvckh4dklQY0FMM2paaXM2cmZPbmdaS08zSTJkQW8xYmF0MUcvZmRxdjc5YkpnTlFmVnZ1ZmVjZEJFTklNSnhNYy9vK2NBNmhocEhpS0RMc2tPbTBHcURKSzd3K3JYdmNPbnVtempuT0ZBN3ljTkx6OUdvVDQ3Z1N2YjloK1psY2F6bktNeG5ROE9RNlJ0bkJpeWU5ZmNSSDZCY1FWT0FDQWVISENUZGFlaDdhS0lQWW9aeHpZNHZqR2ZWZnh6SDVONXozTUdFRzFZVFg4eHllc1d3SE56bUdHeDBJczBpTkRUKzhMbUkxZFp0emwzL0h1dnQrM2dLbmpqNEVyUDFwYklVVGdocEl3T3QyYXl3Nk90MjFlK0RSQXdQd211cFpaeHpJeWR2Q3FEV3JsdlZieVhQRXQ1NjZhWEU3THl2NTBHNWVQMU02TGZRdmVXWVVjU0pVZ1BBeFVHZlFRUStrTGlTRmxvQ3Q4aXk0OHRmRWxWNDQrcTN1SHozTFR5ZTZlcEJQblRzWlNacVU4VHhybURKbkVNaHRFUmlWZ1BhUHczVGZpWXgxRUo5UkhJeGxQZVh6L0k2VlUzOEVGQWFvQkJYaDV3dk81NVZaOXAyV1liUVJKYzVaRVhCQWVlWWo0Wm45R3g3ejQwc0cyNDdEeVIrTkRMczlpNzlXMmlPNVhVUG5mNDJyMS85SnZlM2JwSDduQThkK1FTSDV4NGlpcEt5cHFCa0dIV0NpSFg0WkU3N0ZYMThFT0tHZmd2UkxJbWlxSHg1ZzU2MFB1bGlwQTd3QTlnV1N4eTVKbHl1Kzl0UG5Xa21zdmVHQ2thaUtLSmZGSnhJVXlaY2hQTnd5WHY2YnVpeDYzNDFZa0syVXdnajMrM3VKOXVTT09YdG0yZDU3UEFMekRVUFVra2FmT3pNenpNM3NjVHl5aldXMTYrejFWNGRlVDdQOHpJMGxJakJDa3dJTnF0Wng4RmtmOWQ3SnFXUFJMWTRpNTBSb3BkTHFqczMyMDBJZGswNzFMU25Md1BLU3B6MS9LVnBpYkRFdHhNS2VlYTlMT040cmM2RWMwUjRyZ0J0aWVYZGJ0WlFPMVVpaVNHR3NIWmZ0MUdrTzdKQnh0bjN2c0t4K1VjNFBIdWFNd2VmNTlUQ2gwampDcmZYM3VkZnZmSVB1TDV5b1N6UUNEbkpVYlMzY25mY21GWTcybnRsbmxacjZtY2lZT1R3QWZFRk5OSkRsYmNmeE83b2ljZ2J2YXdOMGdEcWJKL05MNFFRb0ZXYUlESUhqc2NSa3p1VHUxVGt0UE44ZUNaQW9GbXRwaGwyUCtteUpncWdrbGE1Y3ZjYzk3ZHVBMURzSEZ1YkZ3TU9UaC9sbHovNnQ1bHN6b0ViM1NKdWNSYXk3WmJRbHZHdGtBaE9MTTUxTFlUMzZzV1IraUdSRHIxQklhUUNMZWRaYjFxa0ZDaTFqTGJEdHVMSFBtL0h0RGJmYm1BWkVpSGxlSkxRWUpnUGVMZlhwMTBVeE43dnZPZ2hEOXBZWFQ1bEY3L0dhVGo3bS9jRkU3Vlpxc25leWg2QXBibUhtRzB1MHVsdmxjOXExUzlhUVp0ZW1YZW9URXpqUmZCaGZhaVFzeWlhQnhoOVpZd1FYS3R1UVk0ZXpBNXNmNVArTkZLRlVQcStrTDNURHBKb0NQMjdsUVF0U1QzdmVTcEpPQnpGZ0tQcllDWnlWSk4wNTNXdm83WHlOczloSFRMTmRBTC9mb3hRZUU4MUdhYWZQRlpyT1BKc1FLTTZVYzViYjlYV1JKV3hyQWJTaDNCSkcxSG55azhUWVpPK1F6NFRCTjRlN3B3ck4xVktSNWJBMHFIdUxPU1FhVFVrdGkzTE10STBMWTk2MTc2SFJ1YURtdlZtYytjNEJQek5XbzJINHBnQkhncjRXNVVxZWRybno3b1ovUjFOWmgwODZVY3poOVl3b1FNamd6QVJzZDYrUjZ1M3VYT1BBMkVFQjFreFlLMTFwK3hUejhVNjRGcHdOSUVGajFxSU5JT0t6eWFDSkRUUnBrRDZ5dk44dHlwWVM1MnNtZXZLV2F2MnJTY2FVdjhDbFBUcHZTK1pTLzdEN2lwWWlKbnNUbGladEI2MzhKNGlpdmpsYXBXUEp5a1JJT3gwTUlyNHpZa0p6dlc2M0RLT2w5WWl1azRnNU54S0hLOHpjMXA3bHFyYTUvem95amVabTF6aStQeWpPL0RHYkhmWCtjSDcvNVpXZngxZEs2bWRVaTNOV3ZQWi9JdGVaUlRZcEErdDFmUVpoSnJoNVhOUkZMdW5oR25uVDJ5UzdraXJRaXVoSWNkRVg3UDE5eHI1c21Uc25CdlpwcVVucjA4UEYzams5eUhTUFpOeHpISG5hRGpINkk1R09CVEhuS3BXdWR2cmtUc0hBYWEyQkxGU0xocEJ4dFJIditsK0tuR1ZjemRlQVFkUEhQa0l6ZG8waGMrNXRYYUo3MS8rTWxuZUx3KzExSXduanZnNEJyUWFWcXQ4WVJadHVyVWZZVFdCcmpkTTVFRnAwcUhzRDdRQWhEaEpFMXdUWGhNZjltN2RrdDJ5Y1J5WGUveERxM0U2YWFJM1RKYS9BMFdTVWhRZTc5eHdDN2tpWGc2a3JoUzdQWDZIU0luc25KRS9VY1dWU3FVa2xod1VxWStCczR5U0psWE9YWCtGZDI2Y1phSTJTM2ZRb3B0MVNLTktPZmVLcTVUemwzT041Q1FSdmVSdEdVRUVWSjlMSk1JaGJ4MlhwZWVpS01wNkF4dTFDTE1rK2tmaERsRnhRbUJST1pwekh1UmxDcEUwOGV6RWhEdjcvWDdRQzViUEFteG8rZG01WVh4L3A5L2o5bUJBdHJPOVNsbGZ0cjNuZXBZeEtJcnlaSEdCVTVoY0RuWFVjeE1rUzZ0V3F5V3hoQkEyZ3lvdFRZWnZFRjl2M2FmSWh3V2xBN2Y3YnVBOHo0ZjdEcDJqVnF1VjBZQ1lHUnZEQ3o2RitIckpYajRYUlZFeXF6Q0hQbHNncE5raTZkaUdHbnFqbzY1MzE1TU5lZlUyeEJJaWpsc0FHUXdHSTh1aytyZ2EzYTllbE5vRGkvZmtXY2FYMmkyKzArc04zOExHc0JwNEcvam4vUjdMQVhXdmwyRGxtdFUrd2dqNlJHL1JCaG9lL2R3SS9ON2gvV2kxanpqRGdoUFpocTlyQWdRZUc0MW9BUkdhV1Z6S3JtZUorYlZnV3FZYU9SOUFENlJEQ3UyazZCUnh5Q0cwenFKK1ZxN0w4em9sYVROKzBwZSticzJQY0hZY3gxU2ppRGY2ZmY3bmpRMWVyOWM1VXEyU1J4SFhJc2RYaTRKQkhKTUVORWdvVk5MRWxQdTEycFY1YU45RTM2dFZzeEJJejFrblk2UVNLSW9pYXJWYStkM0cvVGFxc2d3cy9ZczJsUVUraVFiMCtjUmFHNHd3Z0paZUc1cU1jL1RHT1lTYWs3VlhxNXRJazJnSVMyeU5URDJlbGpndEtUWG5PRGZvODI2ZWNURFBvRnFscUZaeGNUdzhyMTlKZ2ZhcXRUclY4N01JMW82ZmpTUTBMclNXMHlwYStwRjdoRUdFU09JVDJQNnNScFQrTlNFMXpuVjlaeHpITkJxTkVjYlRjeXlyZ3VWL3BWSXBhOVZsY0EyUVZaSDZlMGg5V21iUnhOWGpoclJLaUlHMERRMjFkRGdwVnZ0OU9vTUJhVkdVUlE5V085ay8vVW82VFN4TlBMMXBZNzhGSWoxWCthN3g2SndycFYwSUttY0lhdWFTWnMydDFiaDZYR0hXa0FETDUxTHIyUWxvTHJGQVdNQkNhbCthWGo3V1FNai9jWDZGOWhsQ0U5ZnI2aUZ6NWYydzhNTVZCYWgrckhhek1BSGxlb1ZJcC9VNzlQMmlYa01hVWVOT1orQXNEZ1RlVU5XUC9sM3dZYldQeGIwTjNhVmZNYlZXYUwwM1I4U0lJN0cxdFRVeWFXMnpOSEFXZ1NFTzFkR0RIbHdqUXU0VHUybjcwbU1LOCtqdmVueWJYcmJKRVMzTkdsWmRicTZqbnhCaHJla0pOYzBFNGl0SXY5cVBrbkZsYWRqaVYvZG5jUlB5bXpTKzlzTzd0RVNjR0wyUW9ITUFHcWxXNHEzNjE4MG1KL1IxK1pNa2lFYTYzcUVreUpQSjZEQlVJeUpFZUdzYnJhUksweHJDWmkzRlBtdHBsUHUxVXhVaWVrZ3k5ek5wdGk4TnE1NmY3ay93b1FWVTk2TWxYZWNzUmpTMWRzUTBNVUxIamxrVkVnTFVhZ0g3dlBZQlFpYkZacTYwUFI1UjgyNDBLdERxV0JoYTVoSUsxM1FNcldIemZyZEUyeUxWTW53b2E2Y0xYdVNheFBpVzZCWlBlcTNCNW1HME5nNlpGa3Q4QzVNOGE1ZjdFMjN2Tk9MRVNkR3FVanN3bWtoV0FyVWthVTJnMWFnd21DMUN0V0dqWk9kQ2s3ZWFRT3lvT0hONnVkZ1N5cG9RYTdPRm9ld0NrSlp5bTl6UzZsMzZyRlFxNWQ0QW5adVhaMnk1WGVpVnZYcitRTG1YUVB0ckdzYVFvQWx1TmZ6QTdsdkROT2RaRlJaU2E5cDNzSit0cWhKMUhnTEFTb0pOeDFwTkVWSmpJWW13QkxKWlNJdGtyU2xFZ21YRjBqS0F3S2dkVmMyY1duTm9KZ2pCYkpueFFYUFgyczlxRk8zOVMrd3ZRaVlNSUtHbmJHSk5oTnUxcEZqMXBvRzJRT2ltNzdlY0tXbE82ek5ZbFMvTW9zZTNIS3dsWC81YmM2RjlBTTJRK3FDSjBKeUVZV1VqaDYxUEVLMW9OM0pZRDE1d29KTXlPdnVuTmFJMncvcklPYTJkOVR4RHVKWnJPcHNvZU5kSDBXdGNGMFV4TkFINm9sNHZ0MHhnYmFDZGVLaFo0bHJDaHlZbGNJeWJzRFpMMXRQVjZWS2dUTmxxeHRaRTBuTVRKdFdTWkU4VDBmWmZ3NlhoRWFKSVlxZGVIeDRlSVlkWjJ3MG93TzY1eG43MCtIM3RwR3VZZFdMSDRsVXorTGh3dWt3ODZadEN0ZnJXNDdTT29BWktFMEl2S1Z1cDEvZU9zOC95WC9ldkpWRVFKYXR6TnF5U2UzUVJxbVpXbXczVVdrOS9sMGpBYWh0cmR3V2VrTWVmcGluMWVuMWtzVW4vYm1IV01GcjZXTlV2dU5iWGJIcGYreDBXem5JNVdOc3hQYmdsdEZiN0ZtRDdYUk5mK3drYVFmc3hoMllDM1k5R3V0VUFvWDZ0bHJKaldzblE0NHBES1ZwQjc5TUw1UktzcnlObVo5TWNUYWZOcmpTZERBcVpLVEVWUXVSUTRzaHFOazFmYlZwRkEwUVdRZU1rVWt1akFCQktXVm9BOU84MlBCcjNuTTRWaE15QVNMNk9YRUxtU0pzcExiRjZBY2VxVHV2YjZEeUJlTis2c0ZRemdGYS8ydVRKYTJHMDFwRWlHTTE0bHZsa3Jub3VWbE9KS2RHYlNFUENGRExsWlVuWU9GV3VKeWRJc0wrSHBGNDNQUkZ4YUt5azZEN0ZEdXRuTFl3YVFUSVpyWHJsczE1cEUrUks0WWtnemlhOHBGbkhXQk5JcEZwckpVa1l5Unhsekg2L1g1NXJJTERKT1BvdHBOSi9pT0M2NmNVY2EzSTBUcXhtc1JwY3ZvK2NGS3FsUkhZTGFRSllsYWQvMHkya3R1VzZMYnV1VkNvbE4wcWlZaHhEYWpoc2VsZmJQdjFpUmxzK0ptTkVVVFJTZ2liaG0yVjI3UVBwRUZYR2tkOEVOenIzNEp3cjdiNDl2Rm1hVGd0clZTMWo2MzR0OFd4YVc4TVdNaUdhRHVJTC9IOFlQSWFuMkM0Q3ZnQUFBQUJKUlU1RXJrSmdnZz09"}} \ No newline at end of file diff --git a/sleap/skeletons/fly32.json b/sleap/skeletons/fly32.json new file mode 100644 index 000000000..c75361ce5 --- /dev/null +++ b/sleap/skeletons/fly32.json @@ -0,0 +1 @@ +{"description": "Template Skeleton for fly32 reference dataset.", "nx_graph": {"directed": true, "graph": {"name": "M:/talmo/data/leap_datasets/BermanFlies/2018-05-03_cluster-sampled.k=10,n=150.labels.mat", "num_edges_inserted": 25}, "links": [{"edge_insert_idx": 0, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["head1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["eyeL1", 1.0]}}, "type": {"py/reduce": [{"py/type": "sleap.skeleton.EdgeType"}, {"py/tuple": [1]}]}}, {"edge_insert_idx": 1, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["eyeR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 2, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["neck1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 3, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["thorax1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 23, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["wingL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 24, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["wingR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 4, "key": 0, "source": {"py/id": 6}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["abdomen1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 5, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegR1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegR2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 6, "key": 0, "source": {"py/id": 11}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegR3", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 7, "key": 0, "source": {"py/id": 12}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegR4", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 8, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegR1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegR2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 9, "key": 0, "source": {"py/id": 15}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegR3", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 10, "key": 0, "source": {"py/id": 16}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegR4", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 11, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegR1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegR2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 12, "key": 0, "source": {"py/id": 19}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegR3", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 13, "key": 0, "source": {"py/id": 20}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegR4", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 14, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegL1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegL2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 15, "key": 0, "source": {"py/id": 23}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegL3", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 16, "key": 0, "source": {"py/id": 24}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegL4", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 17, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegL1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegL2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 18, "key": 0, "source": {"py/id": 27}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegL3", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 19, "key": 0, "source": {"py/id": 28}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["midlegL4", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 20, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegL1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegL2", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 21, "key": 0, "source": {"py/id": 31}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegL3", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 22, "key": 0, "source": {"py/id": 32}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegL4", 1.0]}}, "type": {"py/id": 3}}], "multigraph": true, "nodes": [{"id": {"py/id": 1}}, {"id": {"py/id": 2}}, {"id": {"py/id": 4}}, {"id": {"py/id": 5}}, {"id": {"py/id": 6}}, {"id": {"py/id": 9}}, {"id": {"py/id": 10}}, {"id": {"py/id": 11}}, {"id": {"py/id": 12}}, {"id": {"py/id": 13}}, {"id": {"py/id": 14}}, {"id": {"py/id": 15}}, {"id": {"py/id": 16}}, {"id": {"py/id": 17}}, {"id": {"py/id": 18}}, {"id": {"py/id": 19}}, {"id": {"py/id": 20}}, {"id": {"py/id": 21}}, {"id": {"py/id": 22}}, {"id": {"py/id": 23}}, {"id": {"py/id": 24}}, {"id": {"py/id": 25}}, {"id": {"py/id": 26}}, {"id": {"py/id": 27}}, {"id": {"py/id": 28}}, {"id": {"py/id": 29}}, {"id": {"py/id": 30}}, {"id": {"py/id": 31}}, {"id": {"py/id": 32}}, {"id": {"py/id": 33}}, {"id": {"py/id": 7}}, {"id": {"py/id": 8}}]}, "preview_image": {"py/b64": "aVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUlBQUFBQ0FDQVlBQUFERFBtSExBQUFvZFVsRVFWUjRuTzJkZVpSa1YzM2ZQL2ZldDlYV1ZiMVB6MHhyUnJOSkd1MGd0QTBJU1FpREZRZ1lBemFiRFNUMnlYWklpSlBEeVhGT25KUDRISi9FU2J3R0wyQ0lrNEFqTUFuWUxMS0VRUkpJTWxyUVNKcFZzMmkybnVtZTZiWDJ0OXg3ODhlcnFxN3U2WUhwMFVnejBQM3Q4ODZyZWxYMTNuM3Y5NzIvKzl2dWJVR0szd0grQmF0WWNaQ1h1Z0dydUxSWUpjQUt4eW9CVmpoV0NiRENzVXFBRlk1VkFxeHdyQkpnaFdPVkFDc2Nxd1JZNFZnbHdBckhLZ0ZXT0ZZSnNNS3hTb0FWamxVQ3JIQ3NFbUNGWTVVQUt4eXJCRmpoV0NYQUNzY3FBVlk0Vmdtd3dyRktnQldPVlFLc2NLd1NZSVZqbFFBckhLc0VXT0ZZSmNBS3h5b0JWamhXQ2JEQzRWenFCdndrWS9qS1RXeTc1VGFTS0dMMzl4K2xQRFY1cVp1MGJLd1M0QUlnbGVKbmYrV2ZjTmY3UDhqZytsRjBvamwxK0NEZi9OTS81Ty8rNnY5ZDZ1WXRDNnREd0FYZ2xyZS9nL2Q4OGxPc3VYSXpRaWdjejJQRHRkZnprZC80TGRadHUvcFNOMjlaV0NYQU11RjRIbmY4L2ZmZ3VDNDZqckhXWUkxQnh6RzVVb2s3My8zemw3cUp5OElxQVpZSjEvTlp1MlViMXRxelBoTlNzWDdiTlplZ1ZSZU95NG9BYS9LQ1g3ek81WVBYdTZ6dnVheWExa0VVTmpteTYzbUVFQXMvRUFLck5ZZDMvdkRTTk93Q2NjbU1RQ0hFZ2w3MHl6ZTZmUEoyajJzR0ZWTEFTNU9hUDN3NjRvK2ZqVm1pczEweTZEam15YTk5aFp2dWV4dWU1M2Z1d1hGY3BrNmU0QWRmLytxbGJlQXljY2tJMEMzODI5WXJQdjMzQXJLQkFKTWUyejZpK0oyM0J4eWF0angwT0xsRXJVelI2ZTNXSXYyQTNzMWJtU3VYR1JvYXhtcU4xcG9Ydi9jd0QzM3VqeGsvY3ZpU3RuVzVlTlgxckJCaXlVMUtDYTBIKzBzM3VHUjlBUnF3clUyRDd3bytjcU9MK0ZFWGVBMWdyZTBROXY1UGZvb1AvZHYveU1EQUlFYnI5QXVPeTY3bm5tYjM0NCtsOS9VVGhFdmEyclpnYjFxanp2bWRhNGNVU3FXZm56WHVkcCtyUmF4WEE1NHJ5YTFmeDVhZmZRZHZmdjhIY0pPWTduSEpjeFIzdnZjRERGeDlMY2FZVjZVTnJ4WXVneUZBOFBUSmhEczNMRUVDQy8wNWw5dTJEL0RFM2xQWUpFUXBoVzczdkNXdzJMWjRwU2hzMmN6SWh6K00ybkVQMjN1SEtCVjY1bnQrQ3laSldML3hTalpjZXoyVCszWmZ0R3UvRm5qVkNXQ3Q3ZlRPYmxVS3BEMWJPZnpsQVkrUDNXVHBDU3pZVmk4VzZlc3JpcG8vZTF2Q2IvYU84cjBURWt4Q3BWS20ybWlpRTQzVk1ZTDU4N2F2MTM3OVN1RDFsbGo3bTc5TmRjTTExQm9oNnhPQk5hWXpkTFVoQUswTlNYSnBiWlVMd1d1aUFkcUM5endQcFJUR0dBWUhCOG5uOHppdWkrZ2Y1UGVQVlhqL3VuRTJacW9JWUR6dW9jK3BrN01OcnNyUDhhZHZidkRBbWExODg4eGF3amltTnhwSHh5Rmp6WUFqRTJXa2pVbVNoSHE5VHFWU29kbHNBbEFZR0dGa2RCTTYwUnc3dEp1NFh2bVJiZTBteitaZmZDL1YwVzNFalNZZWNLZ1pNaEZuR1BWZGRCZTNsT3R4Wk85dURqMzdnMWZwQ2I1NnVDZ0VXRHoydG51aGxCS2xGSTdqNFBzK3ZiMjlGSXRGZ2lDZ3I2K1BJQWhRU3BISlpOaG5KWDh3dlpWdHdReEN3TkdrbjFGM2xwOHY3R1NkTjBOR1JYeDBlQzgzbG1vUTlIQ2RQNE1qTkFkRGoyK01YOG5UMVNHU3FFR3RXbVY2YW9ycDJUbEdyNzJUTi83c0I5aDJ6ZlhFY2NJTHp6N0JONzc0aHh4NjRVbWtsQ1JKY3BaV2FyY2ZRTjUwSzdHWnQxWG10T0hSU3AyZmN3cGtsRUpJQ1VJeTIyendyVS8vSHRVVHh5L0c0M3hOMGI2M2k3cFVySlFTMy9jSmdvRCsvbjVHUmtiSVpyUGtjam55K1R5dTZ3SmdqRUczM0NnQWJTQnVEUUZLV0VBdzZOYjU4T0FlYml1TUlheWRiM0hiMXBJVzdmYnp2L1E3MkJlUG9NTTYxaG95QXh1NWRzZlBrYzk0NkRnR0lWQ3V4OWo0T0gveE83L0czT25qaEZHTTFwcG1zMG10VmlPT1V5Mml0Y1pvemZiLzh0dE12UDZ0MkRqdTNKc0cxcm9PZC9pQ2tWcU5nM3QyODhobi9qc25kajU3c1I3ZmE0b0wwZ0RkaHRaaW8wdEtTYUZRb0wrL24vNytma1pIUitucjZ5TkpFb3d4Q0NFNnI3dDduN1VXZ2NYclVpWlNTcVowamorWnZJWGpkb1IzRkY0a1kwTkF6QlBCZ2dyUGNQZklITG1yL2psV3VxbjJjWHlVRXNSUjFQcWV4WVJOaHZyN2VlTzdQODdrOHc4U3hRbFJGREU3TzB1NVhLYlJhSFNzZUFVRU81OWw3blZ2cG83b1hFNEE0OWJ5MGhNUGMraXJYMlBQdnYyTWo0OWZ5R05jRXV2V09XeTgwcU5XdGV6ZTNTU09YOTBvMkNzbVFEZWtsQlNMUlVaR1JsaS9majI5dmIzNHZrK2owU0JxQzZMMXZmYXdJYVhzYk4zdmhSQW9wWkJDa0JqRDM5UzJjMXZ2TEZja0IrQ3N5SUJrc1BJQzJTQWdkZ3NJYThBWWpEM2JKUk5ZMW85dXhwOWNSek9NQ01PUVlyRklGRVhVYXJXT0lTY0FXMnNTN0gyYVExZS9qcXB4MEZZUVNNUE5lb3krZ3k4eUpoUkJOb3NYQklSaCtJcU1UaW5oZ3g4c2NjKzllZGF2ZDZuWExIdjJOUG56UDUvaHBaZkNDejd2ajhNcnRnSG1RNkVPUTBORGpJNk9zbWJOR2pLWkRNWVlxdFZxcCtjdjN0cS83L1lVMnB2ak9QTkVBQXlHTTJvdFZ5UUhsMm9GRlhlSWFubUtSTmJBR3FSZklBajhOS2pVQldOaHJobVR6K2RCMURBbXZiYm5lV1F5bVk3dDRyZ3VycVBnNVplNVRTUWN2ZUpLWkE3ZTBudWEyL3hwL21aTGdkTUhmWWFIaDFOTk5UVkZzOWtranROaFpibGtlTWM3QzN6czQzMDRqa0JyUzdFa2VPT2JjcXdaY2ZqRUowNVNxNzQ2OFlWbEUyQng3MWRLSWFXa3I2K1ByVnUzMHQvZmorZDVSRkUwMzV1V0NOSXNma0RHR0J6SG1ZOFNudlZkeTkvVlI3blp6eUdUS2d2SEFKOW5teHZZL2ZSREtKdWtOc0RhRzdqeXVqdnhoRjB3WElWeHdrT0g1OWpFSU5ma0pFcEtqSVY2dlU0Y3h4M1NGUW9GY3JrY1VrcUNSSERWMkduV3JZL1p1R1lPcE9EVzIwYzRlaHdtSitmbzYrdGpabWFHNmVscDV1Ym1xRlFxaEdGSTNHVTd0SEh6elRkejQ0MDMwbXcyZWZUUngzSGRPdmZjVytLdXUyS2tGQXRVdnJXVzBWR1hONzBweDRQZit0SGV5NFZpMlFUb0ZwempPQlNMUlVxbEVpTWpJd3dQRDZPMTdveWwzV3E5bzlLWEVLN1dHcVhTaUYvYlFHeGZSeWxGRUFSSXFUZ1d1enpzdjRrM3VzK1NTNllCUTZpSzdGSTNzak5hanpCTmhBQXBJQnpmdzZsOGlmNlJ6UVNlaDhYU2JEUjU4S1Z4OWs4MU9TejdxSmRjN3VpZHhSV1dwTGQzZ1NieWZSL1hkVHVrZEJ5SDZRcjBWcHNVQ2lFREF4NTMzcm1KL2Z1YmpJNVdPWDM2TktkT25hSmNMbE9wVkRoOStuVEh5RzAwR21TeldUNzYwWS95bHJlOEpiV0pOTHpuUFZkZytXdEdSZ1RHUUpJczlrYkE5eVhidG5vOCtLM2xTdXI4OE1xR0FPbFM2dTNuaXRIMURBejBMeGpYdTlWNTJ4VnM5KzYyRm1tL2RsMlhUQ2FENDh3M3AzM2M4N3hPL0VBSXdUTzhnYkhnUnJhckl6Z2tISFcyY0N3cWtyT2E3SUl4MzZKUFBzTjRkWUo4L3pva0VEVm1DY3NHa0dncmVHeW1TTTM2M0wrMnlWQWdNY3puS2RyZVFKc01RUkJncmFCUzBSUUtZNEJsMnpZSEliWlFyWVlVaXlWeXVSelZhcFZtczhuUTBCQzFXZzBoQk0xbWszdnV1WWYzdmU5OWFLMkpZNDAySnhrYWZnaHJRNklvOVhpV1FoZ2FYajV5dGlhNVdMZ2dBdlRrZkg3K1RWZnorcXZXYzdxaE9GVDIwZExENmdUUDgxSTNxbVZOZHh0NWJRM1FWckd1NjNZZWVMdm5kOXNBcnV2aXV1NkMzMGtwYWNnOE8vMTFLT1hnU2t0L3ppRGx3bEJ5aDRERXFQQm82cHJtZkQ1MHRVZGZYdkxneXhvRVBEdnJVOGZqbDY2V3JDczRHRUJKU2JsU3BWeXBkdTdCZFYxODMwZUlERkUwaStmVkNJS0lMVnZLTkpzK2ZYM3JLWlZLMU9zMW1zMG0wOVBUVkNxVkRxbHZ2LzMyanZjRERrbjhQWkpramxUd1p3dGZDb3NVaG1OakNZODlXcjBRTVowWHpwc0E3VjU3eC9aMS9ObXYzYy9XZGIwNHZvT09OTWRuWWo3OTZDUkhwaEpVbHdHWHorYzdCbEVtayttUVFDbEZOcHZ0RUtDdE9icjMzZHFqVFlEMlhrcUo3MG9jWi81OGp1TVFCQUdlNXkwWVB0ckRpaENDUkdzOFIvR1AxanFNOXRYNHdndFZxckZoejR6Z2ozWUwvc0VOUGtONVJUT0JYTUZuODBBL1VhS0JlUzJsbEl1MUc3SDJSVUNRelU2VHpRcUtSWmVob1FGT25oemt4SW5qTkp0Tk1wa00xdHBPRUt3Ny8ySHRHR2xVNFd3UlNLRnBKQm1PMTY3Z001L1p4OXpjcTVkZ1dwWUc2TW42L09kZnVadHJOZzlCWWlBeEtDWFlPT1R6aTdlVStMMUhaMEI2T0NvVmpPY0hMUUU0cVRDa2FxbnlWTWh0TGRGVzk5MEdZTGZkMEJaOFd4dTBJNHVlNTNXMGhKU3lRNER1Yzh6MzNQbGhSMG5KaDI3cFlXMnB6Qjg4ZVpySnV1Wm9XZk43ejlZcCtKTFpwdUdLb3VLTm94bmV0cm1BZ05RcmNGMmtkRWlUcU9rMXJHMFBlekY5ZlJOTVQ2OWhjbklLWTNTSDBFbVNNRGMzUnhBRXJTZHBFWElyNkIrUXVpbnpHa0FKdzNoOUcxODVjRGZQVDE3TGJQSDdJUDdyZ3V6anhjUjVFOEJheTkwM1hzRk5tNGZUa0YyN1FSWXdsdXZXWmZqMXQ3dU1Wd3d6RGN0c1V6QVhLV3JHd1FnSGkwUklCNHNnakRYYUdKUVVLQ2x4SE5YeDFycnJCYnJEeVZMS2pzRGJ3ME0rbjZkUUtIUzBTL3Y0NGtCVm0wVHpScDdFV3NQOTF3WDA1MzErNy9GeERrMkZ6RFFOMHcyREVQRENoR2IzbVJnckhYN2hobDRNc25WdVM1S2NXdklaQ1dGdzNWTm9iWkJ5WHFoeEhETTJOc2JBd0VBcnRXMXgzUjBZOHpER25NVGFsRXlPMUNnUjhPQ1JlM2pzeEczNFRremhpbXVZVWc0bWlTOTZwaE9XcVFFR2lsbnlHZThzM3hvTG5pUFlOdXl4YmRqT2YyNVR2N3NhSmN5RmduS1VVQTRGYzZHa0VrRlRTMklyYUdwRFUxdWFXbUtGZzFKcEQxTkNvaHdIS1JXZTU5TGYzMCt4V01UMy9jNFE0amhPWjhqcERpZ3RScmRoQ3ZQeGgzdXVIcUlTQy83RHcwY0pFNHRxL1Z3S1FhUXRqeDZ0ODlhckIxaFhDa0FvaElqUk9qeG5oM1Njc3pPQ1Vrckd4OGZKWkRKczJMQUJ4M0V3SmsrNS9BczR6c01Fd1hFY0dYT212bzd2SEwrRFIwL2NTS0NhSUFUOWJvVFlzSUVqUjE3dXhGTXVKZ21XUllDZGg4WVpteXl6YmswSkZya3NXTHRZbTRGTUZXVlBCbm95N1ZJZlFHaXdFQ2ZRVENJYWlVZzNMV21haUdxaXFHdVhodlpvQ2tVc1hkd2dTeWFiSTVQTmtjM21DSUlBeDNWUnFxVXBoRURLZEw4VUZzY1gyZ1J3bEdBMk1rU0o2UXI0dGg2T2hLTXpFV2VhZ3F0eldTSnRFY0pENnpVMG0zTUlzYmlHUVdCdFAxQTc2L3B0ZDFjSTBRb2FOYWhXaXZTV1BrUlZ6L0Mxd3hHSDU5WndwTnlIcnhJUTRHRFk1azR6czNVejVmSWNrNU9UbDFZRFBIZHdncTgrY1pCLytwNWJRSW0wZXd2QVdCNTUyZkREY2NuYUhrVnZSbEQwTFgwQkZIeUxyOEJWRmxlQ3AwQktDeEpjRjF6WFVsaHdUeEVZZ2JFQ1kwR1R1bWVoOWRHTVE5U0xrQ1VzZlVBUktUTUk0WUwwRUk0UHlnT3BXa09VVGNQQzdkZGR2YWRqS0xxS3ZseUE2eWppWktHeFpTMFVBa1YvSVl2bkI1Qm9RQklFMjRpaVl4aFQ3eUtCQWZvWUdub2RwVktabVptcER1R01NUVJCd0pZdFd5aVZTcDJBazFJSzE4dFE4TmV4TnFmWk94M2hxd1JqQVFRRkoyRjl6cU13T3NxcGlkUE16TXdzcURtNEdOcGcyVjdBcHo3N0NPV0c1dWZlZEJVYmhncWNMbHQybllISFR5aVFEbE5SUzgyMkZJSVVscHdMQmMrUzk2RG9Dd28rRkh6SXVaYWNhOG03bHF4cnlUb1dwQVZoVXpjSWNGcStmWVlJZEFVcUo2QVRGSk1ZTjRQMUNsZzNoM1h6R0xjQVhyNzFQcGUrOXZKWU40dVFMblNLUnl4WWl4Vnc3OVhEL1BrUFRyTDdWQVZIcG9rbWF5RXhsdHMzOXJGOWJRK0phUk5INDdwcnllZmZUTE81anlRNURVaVVHc0Z4dHBMTkRuRHZ2ZmV3YTllTGpJMk5kV29mTm0zYXhPRGdJRnByZW50N3llVnloR0VhNDFjUzNyVlZjc2RhbCtjbjREc25ORWNxbHVuWTVXVFF4MEEyUTdGWXBMZTNsMmF6MllrdGRPZFhMaFRublE3dVpsdVF5WEh2blRkeDg3VlhJWU1DTmVPVDhiMk80YlBBclJPaU16cEFhb0FoSktxbERUS3VJSEFFZ2FjSUhPanhvQmhBeVRmMHVJWmVEM0tPQmhLc1RWbzl1clhSMVdPN2U0S1FvRkp0WUpVSGpvK1ZIbmdGVEZDQ29BUitDUk1Vd2UvQmNUeSt1MytLZi9mTkE1eXV4alFUOEYySExZTU8vK0dkVjdKbElJc25NZ2drMmlTdDU2RFF1b0hXNVpZbmtHc1pjMm1ib2loaVptWUdZd3paYkJiUDg2alg2NTBZU1hzOGo2S284eDVyVUNibU8wZWJmR2EzSVRIUTUycmVsZG5ENlJOSE9IandFSlZLQldNTVI0NGM0Y3laTTY5QTlDa3VLQkFVeHlIN2pwekdLUXl6NmNvU2dTOFhXTDF0V0d0UlVxYloyeTdydmozK2FpT3B4WUo2SWxHSlJFaUY1enI0a1UvZ2VtUnpHVUxWUkxtd3BUVE1OYVZocEs0Z296SXlLcVBpR2tJM0VUcEM2Q1lrVFVUU1NNbVJOTkwzN1FxelZzQkZ0a2paYWhRSWhmVUt2Q1hYeTYzMzVmakJLYzJ1YWNtR05ZUDA5T3ppcTgvL0xqTnh4QzBqYitTT3plL2lpdUtXbHZ0cWNXUVc1V1RCR294cEY1ZEl0TmE0cnN2QXdBQkFKNnJvK3o1eG5HQ05RRnF3clhab25mNDJTUklpWTdsbDJPVTd4NXJzbXhOTUp3Nkg1VHF1SFUzd1BKK1ptUm5tNXVZWUd4dTdNSWt2d3JJSTBPN1pSbXRtWjZhWW01bWl1V2FJd1BjV2pFVnRmeHRZWUxrdUpvRm9HVzVLU1pSS1NTU3hTQXNWVytiUjVCRmVubjZaaXFrd09uMEZieGw5S3grNStpTTQwc01JaWNiZzJBalhSZ2pkZ0xqZTJxb1FsdE90T1FkUkdjSUtXTjF1WUdzUFdJMW96a0JqbWdLVys3SndYODZDMGN6T2FiWUVvOHk2RVpPVHV5R3E0US9maXZaNjB1SEdMMkRjQXNiTkk2VFQwa3dXZ2NEYUpEMjlOUWlwa0lDU0xxWTV5d3ZqMytaQU5NMFZUb0ZyZW01RGVjTm9FM2VlbWFzRTk0MUs5cGNOeGdyMk5ncHNLZlhTMjZkSnRHSGZ2bjFNVFUyOUlzRzNjVUVhd0ZwTHBWTGg1TW1UbEVxbFRyeStqYlk3MW83L3c3dy8zcmFFdTdPRDNkL3hYQS9IVlh4ZFBjeUIrQURTcGhwa1gza3ZCL2NjNEV4em5CMXJkdERRRFF3R0xTeEdHQkpyaUV4TWdrWW5NWEhTSUVtYXhFbWRXRGRKYklPc2llZ3hocEt4OUZub0U0cCtGSUZVQkNMZGZLc1FTQkErSlJkS3dBWVhDSVpBeHpEMmZWenBnSFN3SXJWN3JIU3dYZ0hqRmRGdUVlUDFFS3M4V21XeFNLeVFnTXZ4bWQzOHQ1ZCtud1AxNDFSc1RFNDRqSjU1bUkrdi9TaHJpN2VnZFFOSWJldHIrZ1RYbG1EbkZJekZPU1pDbCsycVJ0TVRUSlhyeEJlcEFQV0NDQ0JscXVacXRSclZhcFZ5dVV5aFVPalU3N2N0M01XUnZiWm1hR2NLRjFmdkNpRndwTU5SZVpRVG5FQ2hGaVNZTEpZdkgvb3lYenIwcGZOb3BlamFpYk9Qa3lvQVR3ajZaY0NRQ2hoV0FZUFNaMWhsNkZjZWZjcW5UM2owS3A4KzZWRlFYdnJJckFHakVXalFVWHJHc0l6aUJLN1ZoRllUVzBOc0RYV3BxRXVmcXN6d3A1TlA4blR0WlpSMEVNS2pobVZYTk1FWFR2MXYvcFU3alBIWG9SVm9DVm5QY3RzYU9GTFJmTmg3bVBlS3A5aW9qbk5pWUlqOERZTGZPdTVUcjljdlJId0xzQ3dDZEJkN1dtTnhwVXZXeTVKRUNYRWNwMk4rcStxM3ZUOVg4Y2ZpODBLcnRrQklKcGdnSkVRdW1yY2lFRWdoTWJaMVhzUlpleW5ra3NjWFhLL2xvdGpXMzZ6VlRDVlZkaVZsdExWb3ExRUk4dEtoSUJ4eTBtM3RIVGFxUEZkNVBWUk5UTTFxYWphbXFoT3FOcUhlRW55RTZSQWdRcE5ZUThQRXpGbU5JK2RuT2drRVNqZ2NUbWFZM1BmYjNGNjNOTHcrbWs2UnVsUGtYdHZMM2NVOTNOMTRDSm9SV01sbU1jRy9mWDBQZWRid3liODgwaktHTHh3WE5nUm9pM1FsY2tRU0RvWm9wZEhSL0dTSjdyUnU1emN0NFhmWENYVFBGeEFJSktud1NwUndjVWxJRmdqUFdNT2E3QnJ1V25zWE9TODNYL0lsNWovdi9pNGl0VUhhZ2s1TWdqYWEyTVRwcG1PYXVwbHVTYm8xa2dibGNKYUdDV2xhVGNOcWpHNm1FVzhzajNNR3R5NUp6OXE2TDFMYjMzYUhRRzFyM3pvdUVIalNRUzRpbzBSUUVUQlhPMGJQeEhGNmxKTjZNVUp5alpDQWJzMlZjT2FWVjdQTWgyL280Y3Y3Ti9IRUMwdFZTSjAvbHBVTGFPLzlVWi8rdC9XVHVUN0RlSGFjY3JuTThNUXdnMmNHd1lDd0FtSFRyS0N3clY0cFd6MVNpdmJUNnZSUUxUUk4wU1FrWkk0NUFnTHk1SmxsOXF4MlpGUUdSemcwa2daTjNTUk1RcHFtU2FqRDlGalNKVkE5TDFSdHp6MmJDRnBlZ3VpOFduRFA3WVJ0Sy8xRHZLanVnTlpuQW9HdmZESk9oa0FHQkU1QVJtWElxQ3hPMHVSQTlTQnpKbGtRcmRSWWhxMWdpd2hBT3EwcjJkUmd0UnFFNHF4MHNaVU1lSFZ1Nm9jbmZxemtmalNXclFGVVZySDJWOWVTMlpUQmFvdXhodkpnbVZxeFJtUWlpclVpeGpNSVQyQjlpM0VNeGpVWXg2QmRqVkdHUkNVa01pR1dNVnBxakRCWTBlcW5JdDFDd3JOVXR4U1NseXN2czI5MlgxZHYrL0ZvbjBlSlZrWlNwRU9ORXUzWEN0ZHhRVnVFMWlqcDRnVVpQT0ZnalVZaEdjNE9NWmhiUzg3SlVmRHo1UDBjV1pVaklFTkdaY2c1T1h6aG8xQ3BKbXNSWHdtRnNCS1ZhTDU0NE5OOGFlSWhFdWtoaFVpMWlJbTVJWGN0M3BVZjVZWEdMS0oyR2xVL2pkczRRNkY2bE1IWloxRTJZaUVKTEFaRlRaOTdUdVg1WXRrRTZIbEREOEZvZ0UzbWt6N1NTcXhyT1hiOXNYUCs3c2NKclBPNW5WZVowRmF4cmIvV01DS0Z4Rk1ldnZUeFZicDV5c05YUG9FSzVvOUpqMEFGZUNyZFo1MHNHU2VUN2xXR2pOUGFWSmJrekJUNjlCU2kwaVNmS1RGOHhWYUdObCtOOGhhNnVFSUpaay9WbVoxbzRQcVN3UTE1bENlSUk0M1dDVWEzZ2p3dFpaK1loRGlKTVE1ODZNcVBFd2lYWjZhZjVMaXVNaXdEYmlqZXpqdUgzMDh6R0NIeUJvbXpHNG1pa0ViaVl2MSs3dGo1Q1FZbnZ3ZHkzc3RDU2ZiTStEeDhZSGE1NGpzTHl5WkE3cW9jd2hFcEFiclJUZ1NKUmNkb3FYbzcvNEZBTE1nWU90YkJzeDRlSHA1STk0RklCWmIzOHhTRElqa3ZSMysrbjJKUUpPdG1DZHdBMzJrUndFazNWN3A0eXNPVDZlWklCMDk2dU5KRkNkVWhtVFo2Zms2Q0ZNd2NPOHpZL3Yzb09PMXBwakhMeWFtbmFNek1NUHo2V3hIV29wVEVHdGoxeURoSGQ4NVFtUXB4UE1uZ2hoemI3eG1pTk9LVEpCcHJvR2xybkxUSHFOc2FSZHZMSUd0eGhBTmVpZmR1K0JYdUtPNWdQSzR5Nk9WWWs5bEVpRWVTaEpnNEFoMWpyRVFISTJpL2ozMWJQMEd1Zm94c2ZCclFJRnhtUlMrLy9uQ1ZrNmNtbGl1K3M3QnNBa1NURWRZczNadmRwb3RYOXBDeFJDWVNGU3VVVGpmWHVqamF3YlV1SGg2T2FRbGRlSGpLSXhOa0NQd0EzL1B4UFI5SE9XU0NERDFPRHoycWgwS21RQ0ZUb0tmUVF5YklwRVVlc251dGdiUU5iVzJCQmFNTlVSTFJNSTBGN2V6MGFDRXdVY2laZy91SXd3WkN0VlZxcW4vbXhvN2lyeG5CNyszSDh4d08vdDBNeno5NEVtdFNUYURqaE9NdnpsR2ViSEQ3aDBad1BjVnBUckpQN3FRcEdoZzBEb3E4TFhGTmNqTnVsS0VaaGtpOWxyWFdrblZ6Tkl4RjY3U2MzT2lFeERnMC9MVllsVWVSTUphNWxzZVREN0ZWNzJLZEhtTlBwY0R2Zm1zdkw3NTBjcm1pV3hMTEpzRHNFN1AwdjZVZnA4ZFpTQVFCZllmNkdIeHBFSTN1cUc0cFU4dGVPV2tsRDJLK2xOeHhISVFqMEZMVENCdG9UeE82SWI2WFZ1VFdxMm1wZGhpRk5NTW1ZUnpTQ0J2a0Mza3ltWlFFM1dWaUMxUjFWOFZSSi9UY1ZhdW9sRUlvUlhOdWxzYnNaRHJQcnh0Q1lKT1l1Wk1ueVBrQmxXazQrc0lNMW9KMFJPYzdRa0IxS21ac2I1bkI2eHoycStlcGl5cXk5V2V3ek1wSkR0bzlySzl0cFZLdVVDNlhzZGJTVHorWklFQWJUUkxIR09GUWRkZWlWVDZOdFlSVnpyejBHTS90MnMwM0p5YVptUTJabWp6T3pOUWtaeGRsWEJpV3J3SEdJOFlmR0dmd1hZTjQvUjVDQ1pKcVF1WjRodEt4RXRLWG5iaTJ0UmFON2hSNUd0R2FEbVlzd2dxc3NCaFNuMTRaUmFJVFpDZ0ozYkJUMlJOR0lZMUdnM3E5M2hGa0dJVmtNaG15MmV5Q0lwRHVDcUlvaW5CZEYyTk1aODVma2lUekZVS09nd0Npa3ljd2NYSldiS0oxUWlKdHNMVUt6V2xENVV5WWVqRUx2Z05HUTJVOFFWeC9ob2FxTHhHL2tKU2RhU2JyRXpTbUk4STRKQWdDa2lTaHBoV2g2TU00QWlNOXRNd2lwVUJIRGNiM2ZaK2orNS9uNElHWE9IcjBHSTFHWThtNUJxOEVGeFFIbUhsc2hzcUxGWXEzRkpFWlNYd3dKaitYSjdNaHcvQ2E0VTZsVG52K0h5ek1EM1QzeUtVS05kckhsVktFWWRpSkZTaWxTSktFVENaREZFWFU2L1VGMVVEZEpkMWhHT0o1SHJWYWpWcXRodGE2VlQya1VNckZkeHk4OGhSaTVzelN3c2RpSFE5UktLWXVxd0luRU1RTmU1WlhKaFZZTDJTNk5vVXRuVjFZSWhERVRzU2ttQ0NhRlhpdWc4aGtDTDAxeE00Z2l4ZHFNWEdEVTNzZVkvK0xUN0o3OTE0T0hEaElvOUhvUEo5MkxPVmlyRVp5d2ZNQ2twbUVxWWZuRXhMTm9FbWlFeEtkZEdZRGQ1ZGhMZFhZN3JUbzR2QnhkNjgyeGhDR0lYTnpjOFJ4M0pscDNMMTBUSGZJdVY2dlU2L1hjVjJYT0k0N0JSaSs3K042UHI0UytHRU5FZGJuZzBnaVRVUzFSYWVSTkhNOU9JbkdiZFFwajBOVXM2M3NZc3RYVDgxYm5LeG1WaHdqUGx4QjNDREJ0UXMxZE91a3pmVnpvRnpFeVNMR0x4SmxodE1aejRCVkNxSFRlc1M1aVJQczMvVTBSNDhlWTJ4c2pFcWwwcm0zTnRvRVdCeE9YeTR1MmdJUnpXYVRpWWtKeXVVeTA5UFRyRisvbm53KzMwa1d0V2ZKZEhMZkxiVFozRDArdDdHNEVEUkowcEJ6cFZKWlFKaHVMQjc3MjJYaHJ1c1NSaEdCZ041R0E4L0VyY0NVWWhLSGs0MlFQSWFDRklUYWtPUjd5THBaVkwxR2VBcE9QeFdnSTRsVUFpc1RwSFV3R0dwbW1vbzl5T2xuamhBMll6YkpZZGJlT29neHJhRk9pbzZ0SkR5TDNSRFRXRE5ENWtWRjcvLzdXL0o3bmlQdTYyTnV4enRwWHZ0bWpKc2htMWp1TTVvYnI3K2U1bFZYOGJrbm4rUnpQM3lPcVdZVEtjNWVhZVdWNEZWWkg4QjFYWEs1SExsY2JzRmswYllRMjRKckM2cDdxbmkzS20rWGYzZVhnN2ZEek5aYWdpQm96ZGl4YVZDbGxXZFFTcVZaUlVjaFZMb2FtWktTQWM5bG1BVFBwajB0c1RBV3cxaXR5ZFQwTkZKSUVwMjJyNysvbjhIQmZqeVJwYnk3UURqcG9xU2liRTl4UFB3aGpzMVNEeXNjbjlsSGJKck16WmFwMStwa2VnSzIzNytGclhkdXBEalN3K3l4Q2xONzUranB6ek55MndDcTE2T3c4eVJYLzlaM3lKNG8weTVZMEM2Y3VmODlSUGU4bjl0ZS9nRkZtWUE3Ny9zLzl0eHp2UFB6ZjA0NURDOXFpZmhGMHdEZEZVUHRPdmpaMlZtbXBxYm82K3VqcjYrUC92NTArbGhmWHgrNVhHNUJuVUI3M0crbmtOc2thUjlmVEJKSWN3NmU3MkcwNFVwL2tPMDk2MUJTY2J3K3pmNzZTWHJqREpzcS9VZ3RtY3ZNNFpkcU9OSWdsYUlheHJ3d01jMkp1UXFOZXAxR280RzFsbWF6aWU5N1lBU2U4bkduaXNSblVnSTJiWmtYcDc3TjBjbTlZR2pkM3d4UmE1cDVGS1V1OHM2bm4yZHd0SitCTmYySVJDRkR4ZkRJTVAxUDlYTERPemR4OWRmM2tUdGF4dmp6ajE5cXk5QTN2a29wYkZEY3ZnMmtDMTBhOGE2YmIrWVRMeDNnejNidHBsS3JVNjFXY0tUazNxdXU0bjIzdkI1akxRODg4d3lQdm5RQXZRemI0S0pwZ01YNS9jWEZsMEVRNFBzK0FNVmlrZUhoWVJ6SHdWcExxVlRxalB1bFVva2tTVG91WGx0OWR5ZVkycG9qeUFRb29YalhwdHU1ZWVSS2hETmZoRktiYVZMYlgwZUdxUnRxaEtHUnFUQXpNc2FSeWlUZjNmMFNMNCtmSm00Wm1WRVVZYTNGODMxZWY4ME9idDErRjMybEFab1Z6ZXlwaVBIamt6eDIrQUgyalQvRjNFdzZBVFNLb3M3TXAzT3BaTi8xS1JRTFpMTlpZbTI1Y2FqSWY4cjRlR2VxMkc2UHdscWs0N0x4L2UvQlg3dDJnZkE3OTIwdGV5YW5lUHI0Q2Y3MnhSZTQvNXFyZWY4dHQrQjRIbGhMSEVYOGp5ZWY1Sk5mL2dxMThQeldGTGlvaTBTMWUzTjNmcitOTUF3N2l5ZzBHZzJtcDZlQmRKeHZUK3lRVXRMYjIwc2N4eDMxM3A0MlBqdzhUQ2FUb1Z3dWQ3U0JGL2pzdU9KNmJsNjdHU1BiZFlLQWdHeC9nQjJ5Tkk2SDJOWnlNN2xHaWJIakUzemgyY2M0ZU93RXpVWmpvU2NpNE9kLzVpTzg1eTBmQkdtd0dESTVsLzZSUEtkcSszbjRMLzR2VWtyQ01EeHJSYkNsUFFrSTQ1QjRPclZib2lSaE1LNGhObS9zbUpFTFR3S2lOVWR5S1VqSDRicVJOVnczc29hUDNmWUcwSnJXdEdJQVhLWDRoenQyOE0xZHUvbnF6dWZQUzJhdjJpcGhpM3RFMnh0SVo4ZkduZm9CSVFUbGNybnpuY25KU2VJNHh2ZjlqcnRucldWb2FBamY5ekhHVUN3VzA5OHF5UnZ2K2hEU0ZaZ2xrbjMrc0VmelZKU0dyVVVhSlJ5S2h6bTAveWdIeHc2akU5MnhwSldqdUg3YjY3anJscmNpSFVoMFZ3K1VsbTFYYjJMRG1tM3NQYnp6bk1JKzEvMGJZenIzY2FSZTQ1a2s1RzVIMGRUeksxQUpLMmdveXlNSDkvRXpRME5ubjFBSWpwK1pKT3Q3OU9menFlMndoSllRanNQSDdyamp0U2ZBWXBYZmZyMlVtOUpkSHdobmF3b2hCSTFHbytQN0NpRTRlZkpreC9YcDdlMmxwNmVIVEM2TDczdG4rZDF0Q0NWWS9GR2dQS1luSjRuQ3FITnVheTF4RkRQWXU0YkJnYlErcnh2YWFFYUcxM0x6dGJldzkvRE84M29lUzkyM0VJSnlOZVJ6eDA1eC9ZWlJlaXN4U2N2MVUzbWZCNXBsdnZUTmgvbXJ0UnZZdkhGalY3R0g0TWtYWHVDRFgvd0xSbnBMM0xaaEk1OTYyOCt3cHJlMEpBbDZzOW56YWlPOHhpdUZMalUwTE1aU3BBQTZOZlFBazVPVGxFb2xSa2ZXNFFmZWt1T3ZFQkRQeEZnOUg3anhISmZ2anoxRk9hcDFydEV0S04xYVYwaTJiQk5yVEZyVVNXcUVYb3c2UENFRTN6ODl3OGNUelM5dlhjL3JaTUMwaEFjbUp2bkcwUW5xVWN6Yi8raVArUmM3N3VUZE45NUlsTVI4L3UrZTRyUFBQTU9wYXBVajA5TThlZWd3cFd5VzMzajMzMStTQUYvZjllSjV0K2MxWHlyMmZOVG5Vci9wbnQwcmxhU24wTU0vdnUrOWJGMDdpckVXMTNIUUxkdkFWUTRpZ3Rwa2lEQ3BGdkFjbDRxdThDZFBmSWxhczdIa0hNTG45ejNMN3IzUHNYbmRNRkhVSk5NemlKY3BJQVdNalkzeGcrY2V1eWozSzRBWHArYjQxN01WWENFd3RJYWNsbVk4T0QzTlAvdnJyL012djVrdUN4SzFsdEhySnVzWG5ucUs5NzMrSnJhUFhqRlBBaW5aK2ZMTC9NWFR6NXgzKzE2VHBXSXY1am0wMWd3UHIrSFgzdjFMM0xmOURVZ2hxVFJxL0hEdmJxNGIzVUl1aytYYnp6L0pseC81Smx2ekcvaTU2OTVLUnZrOFB2WTBmL0xFQTN6M3dBL09UdnkwTUpCVlRPOS9pT2IrSmtrY2t1OGZaWGpMN1pUVzNzRC8rc3BuT1RaKytJSUl2QlNFU0FORVVXZktESjJZZ0JBQ3k5bUM3OGFCMDZmNXdHYy96ei9Zc1lOMzNIQWR4bHErOXZ3TGZPN3h4emsrUFhQKzdXanRMMm9nNk5WRUlWL2d2L3pUZjhQSDdubFhxdWFUaFAvNHhUL2kwMS83SWoxK0ZxVVUwNVU1eW8wcXlsRU01L3RSUWpMVG1LTjZqcDV2akdHa3Y0OVB2dTFlSE4zbytOSFdhSEtGZmg1ODZSUi8vY1FqRjAzNEZ3dnRpVGVEK1R6R1dzNVVxOHZ1Y0Q5Ui96Yk9jMTErL1lQL2lJL2QreTZFVFlYL20xLzRJLzdULy9rTUNKaXJsanZmVGNQTGhwT3pweGNjT3hkKzVxYlg0Uk1UVzlMcGE0QlFrckJSNXFxQlBBOTVQbUVVWGxZa0VFS2dqV0c4dlBDK2w1TWsrb2tnZ0pJSzVTZys5WXUveWlmZTlXRUVhWVh1Ny96bDUvbnRMMzBXWS9TQ2VRYlE4alNnbzFiYng4NkY5Y1hjMGdrcmExbFg2c0ZUaXZESG5PTnl3SEl6aEpjMUFRYUx2Yng3eDF2NWhidnZaNlIvZ0N2WGpPSW9CMnZodjM3NTgveTcvL2tIblVET3VYQytBcXRFQ1FQZTJScENDRUV0U2pDWHVlQXZGSmN0QVVyNUhqN3phNy9KMzd2MTdqUVhZQTNHV3FRVWZQcHJYK1RmLzgvZjd5d3lmVEd5WTkvWnRZZGZmZE10NkxCRzJ6UVNRT0JuK2R2ZGgybEUwU3RPdlY2T3VHei93YzM5dDcyWm43MzF6V2hyaUhXU0dtWXRRUitkR0NOcXJRQitzY2JrWFVkZTVwSDloM0JiTlFhTzR5RGNETThlUDhOM2R1M0NtQjhkOC85SnhXVkxnUGUrNlcwNGkrcjhXc3M2OE42NzNrN2crUjFDWEN6TWxPZGFVOHZnNEdTWkx6eTlpODk5OXhHYTU1bFkrVW5FWlRzRWFLT1hMSHNVaUdXbE81ZUQ0WjQ4Rmt1a05YL3ovSXNjbUpqL2IrQ0xEY3lmRmx5Mkd1RC9mUGNiSklzTVBOR3F3djN5WTkraUdWM2NYcm1ocjhTbXdYNjBzUmdMZzRYY1dZdGVyQTRCcnlFZWZ2WUp2dks5djBFQXJuSnhIUWNsSmQvKzRaTjgrYkVITCtxMU5nLzI4Y3M3WHM5QVBvczJCdDlSdlB1bTdkeDN6UlpnWVgzRFR4c3UyeUdnWEsveWozLzNOL2lySi82V0Q5ejdUanpINWY5Ky95RysrdjF2TTFrKy8xRG5qNFBuS0haczNVaGZQa2ZTOWUvZ0hLVzRjL05HWGpneHp2amNxN05VKytXQXk1WUFBT1Y2alFjZStSWVBQUElxclpVT0RPUnpiQjdzUHl1QVlxMmxrUEc1Wm1Ub3A1b0FsKzBRY1BuZ3AxUDF0N0hpQ1RCWnJYSG96TlJaZVFJaEJKVkd5SjZUcDgveHk1OE9yQ2dDdE9zS3VyY28wVHgrOENoVDFWcTZZcGxJNS9WclkzamkwQkVteXEvZVd2MlhBMzdpMHNHdkJPZUtHbHByR1M3bWVjUEdVVFlQOWpGZGEvRE1rZVBzbjVqRW5HTW05RThMTG1zajhHTGpSN2x5RTNOVnZ2NzgzcVdyZFgrS3NhS0dnSE9oVXh2WXFzUnBIMXNKV0ZFYTRGeFlTalA4dEFaK0ZtTlZBNnh3ckJKZ2hXT1ZBQ3NjcXdSWTRWZ2x3QXJIS2dGV09GWUpzTUt4U29BVmpsVUNySENzRW1DRlk1VUFLeHlyQkZqaFdDWEFDc2NxQVZZNFZnbXd3ckZLZ0JXT1ZRS3NjS3dTWUlWamxRQXJIS3NFV09GWUpjQUt4eW9CVmpoV0NiRENzVXFBRlk1VkFxeHcvSDg3bDJsdG05eFJId0FBQUFCSlJVNUVya0pnZ2c9PQ=="}} \ No newline at end of file diff --git a/sleap/skeletons/gerbils.json b/sleap/skeletons/gerbils.json new file mode 100644 index 000000000..66264a3a6 --- /dev/null +++ b/sleap/skeletons/gerbils.json @@ -0,0 +1 @@ +{"description": "Template Skeleton for gerbils reference dataset.", "nx_graph": {"directed": true, "graph": {"name": "Skeleton-0", "num_edges_inserted": 13}, "links": [{"key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["eyeL1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["eyeR1", 1.0]}}, "type": {"py/reduce": [{"py/type": "sleap.skeleton.EdgeType"}, {"py/tuple": [2]}]}}, {"key": 0, "source": {"py/id": 2}, "target": {"py/id": 1}, "type": {"py/id": 3}}, {"key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["earL1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["earR1", 1.0]}}, "type": {"py/id": 3}}, {"key": 0, "source": {"py/id": 5}, "target": {"py/id": 4}, "type": {"py/id": 3}}, {"edge_insert_idx": 2, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["spinestart1", 1.0]}}, "target": {"py/id": 1}, "type": {"py/reduce": [{"py/type": "sleap.skeleton.EdgeType"}, {"py/tuple": [1]}]}}, {"edge_insert_idx": 3, "key": 0, "source": {"py/id": 6}, "target": {"py/id": 4}, "type": {"py/id": 7}}, {"edge_insert_idx": 4, "key": 0, "source": {"py/id": 6}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["nose1", 1.0]}}, "type": {"py/id": 7}}, {"edge_insert_idx": 5, "key": 0, "source": {"py/id": 6}, "target": {"py/id": 2}, "type": {"py/id": 7}}, {"edge_insert_idx": 6, "key": 0, "source": {"py/id": 6}, "target": {"py/id": 5}, "type": {"py/id": 7}}, {"edge_insert_idx": 1, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["spine1", 1.0]}}, "target": {"py/id": 6}, "type": {"py/id": 7}}, {"edge_insert_idx": 0, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["spine2", 1.0]}}, "target": {"py/id": 9}, "type": {"py/id": 7}}, {"edge_insert_idx": 7, "key": 0, "source": {"py/id": 10}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["spineend1", 1.0]}}, "type": {"py/id": 7}}, {"edge_insert_idx": 8, "key": 0, "source": {"py/id": 11}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tailstart1", 1.0]}}, "type": {"py/id": 7}}, {"edge_insert_idx": 9, "key": 0, "source": {"py/id": 12}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tail1", 1.0]}}, "type": {"py/id": 7}}, {"edge_insert_idx": 10, "key": 0, "source": {"py/id": 13}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tail2", 1.0]}}, "type": {"py/id": 7}}, {"edge_insert_idx": 11, "key": 0, "source": {"py/id": 14}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tail3", 1.0]}}, "type": {"py/id": 7}}, {"edge_insert_idx": 12, "key": 0, "source": {"py/id": 15}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tailend1", 1.0]}}, "type": {"py/id": 7}}], "multigraph": true, "nodes": [{"id": {"py/id": 8}}, {"id": {"py/id": 1}}, {"id": {"py/id": 2}}, {"id": {"py/id": 4}}, {"id": {"py/id": 5}}, {"id": {"py/id": 6}}, {"id": {"py/id": 9}}, {"id": {"py/id": 10}}, {"id": {"py/id": 11}}, {"id": {"py/id": 12}}, {"id": {"py/id": 13}}, {"id": {"py/id": 14}}, {"id": {"py/id": 15}}, {"id": {"py/id": 16}}]}, "preview_image": {"py/b64": "aVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUlBQUFBQi9DQVlBQUFBbitzb0hBQUJtRVVsRVFWUjRuTDM5WjdCdFczYmZoLzFtV0dHSEUyNTRPZmZyaU81R0E1M1JBR0VBalc1UUZrRENJZ0hSRkVIQXBxTlVkQ0JJeTdMNFFXVlgwUkN0c2tTVzZMSXRDVXlBYVZJeUlRSUNBWklBd1c2RWJuUUdPcjBPTCtmM2Jqcm43TERXbXNrZnhweHJyMzN1ZVE4Tm1PVlZ0ZXVlZTg3ZWE4ODE1NWhqanZFZi96R0crdG4vNEgrWE5wc042L1dhMlh6T3dkRWhzOFVjWlExYWE3ejNSQjlRTVpGU0lzWklpQkhuQms1T1QzbjUycXU4OE9JTHhKUzRmUGt5RHozd0lORkhVa3pVZGMxeXVjUmFpN1dXcEJOS0thcXFZajZmMHpRelNJcVVJSVRBZXIybUh3WmNjSkNnYmh1TXRRQm9yWG5xcWFjNE96dmo4UENRZzRNRDV2TTVWVlVCa0pMY082YUU3M28yNnpXcnN4WGI3WllZSTIzYjBqUU54c2h6MVhWTlhkY0F4QlJ3cmlmR1FFcUpFQUo5MytPOVJ5azEvajk2ajBxS3VxcFlMcGZVZGMzSjZveXo5WXB0UDdEcGUwNVhaNnhXS3didmlDUVNrQlFZWTZncWk5WkdmcTRyNXJNWlY2NWM1YTQ3N3FacVcyemQwTTVtSEJ3Y01Kdk4wRm96ZEFQRE1EQ2Z6Mm5iRnFVVVdtdTAxdklzUnFPQk1BeWNyZFpvbFppMUxWVlYwWFVEMFFXOEMvUjl4NlVINzJXMm5HT040dVRGRitsWEsyUjI4d1NqUUNrRmdDcXZsR1NDRVFIUVdxT0FhQ3h0MjNKNGVNaU5XemRaclZaY3UzYU5nOFdTdytVaGJkT2l0YVpwR3VxNnhoaERJcUswd21pTlNnbVZJTVVFQ1lnSllrS2pxTFJGYVVWVE45UzFMTEJTbWl1WExsTmJpMUo2ZkwrUzRjbkVLSTBtb2V1YWJ0dWhrR2VKTWRKMUhURkVxcnFpcWlycXVzWmFtNS9YQUltaDM0SlNwSlRHVndoQk5rR01LQlRHV09xbW9aM1BhZXFHQUNTdHFCcEhOZlRZdWtLUk9Eazl3OFU0anMyYUNxMk1qQ2twcks2WXRRdVdpd01XeXlYdGZJNnRhdXEyNWZqNFdCWWJPSEczU01ZU2ZjQVBUdVpSUjVMU2tCSXFXWHlNaE9BWmhvSEtha0lJVkZXRktzOFNJekZHaUFtRHB0S0dlVHNqYkR1czBvcXFyZ2d4eWk1TkNlODlOaVhRbWhRaUtVYUM4d0JVVllXcEt0Q0ttRnJxYnN0eXNXQ3oyVEFNQXpkdjNxU3RXdzRQRGxrdUZyUnRpMVlLcFJXZ1pVTHlnc2ZnNVhkSmhNMG9SWkFaUXl0TmJTMTFWWk9TQ01tbG95T3NNUXhETHdLYklpa0VsRmFvcEVncW9GQm9yV1MzV1MzZnF5Q21pUE1ETWUvTE90VHlPYVZJU1ZIWEZVb2wrcUV2ZTBMK2pzSmtRVkVKcXFxbW5TMll6UlpvbzJsVHBQY2VwUTExMDlCVU5RWkZRblByOUpRQW1LcVNuV29NV3NtWWJGWFR0blBtaXlYenhVSUVxcDB4WHk1WXpCZFUxcUJSdU5tTTREd3BCS0tYZjVWUzFIVk44dUJqa2cwWkU0cUVRbzNybVBjeXNRaEFpRmlnVXBwWk82T3Z0MWhsREhYYjBzN254QmhKS2VINmdXUXR4aGk4OTJ3M0cxQnk0N3F1cWFvS1cxV2tyQjZyckU3N3ZtZTFYcEZTb3JLV1dUdVRCMVpLZGpscG5Od1lJc0U1dERZb3BWRWtqRkVvSDFFeG9aSkdKWVZSV3JRUENhTVZiVk9OVWg2Q3g2VjR1MXBVaXFhdHFCcUxIaFNhckIyeVlNem1MWFZiRWZCWlN5U1VCbHRYdU9CQks1VFJLQVZHYTZ4U01vRm9tcXFsYm1mVTdZd1VJOFltak9ud1BtSVVMR1pMVk5TRXFJaEtzK282VEdWUldtT05xUCtVRXFhcXNVMUQzYzZwMnhuYUdHYnpscXRYTHBOUzJhMkt0cTV4eHRCMUhUZHYzYUt5MWFqR1k1QWRicTBWUWRXS2c0TWxoNGVITWovdUZHSWdCRWZ3anY3c0RKWnowQW9DMUhVclIwQlJGVnJMeE1hc3VrSUlyRllycmwrL3pudys1K3JWcTd2ZGtTZW5iVnRtYlV2YnRteldHemJyRFdkblo2d09EakhhY0hoNGlOWjZQS1BMZmN1L0tzbU9KU1dzTnFRZzZscWJDbTNsakN1ZmkxbXFqZEU0MTNOMmRvWlNqQXR2akdFMm00bUFXazNUMXRqZVlpczVVcXl4bUh4UEZ4MmhDK085eXhWSVJBVkpLYXd4NC9FWVFpQWxSZFhVTkcwRE91ODNMY0tubEJwZjg4VWNyOEdyQktzVlE0cFlZMmlhaHFxcWFKcUd5NWN1Y1hSOExIWk9WV0dzcG1scVl2UnlUd002d1hxellyVTZvKzg2Vm1kbk5FMERTbzVPVTlseEhxMjFIQjBkamJhSk1RYUQ0dVhOeTNUZGxtSG8yWnlkY3RZMmJQUEc5dDVqeStJcnBiS2hVczVja1hxbEZONTcrcjRmRGFnUUFvbEVUSUdtYlduYkdjdkRBN3F1NCtUV0xkYlpBRE5LWTYzWUNzWm8rcjRmSnltRUlHcThBbDNwZklhcjBmRFVVZEYxUFFtdzFtSzB5ZVBVSUFjRk1ZcHhCb3hqTC9lSitYTjEwMEFXN3ZHNVVoUkR0ZGczK2ZuTEMwQVpoVUVFUzJVaFNGbFlVNTcwWWlPVSs0N1BVRlVzelJKZFZ5eVBqK204bk4xMVhUT2Z6Nm5ybXRsc1JwczNqcldXV1RaNFF3cFlMTnZ0bHUzWm10T1RFemJiRGQxbWl4c0dPZmVWSmlXd1RZVXhKcThUek9lWHhqVkN5WFBGRUloUkJIMFlCcTVmdXpacVM2MDF0cTdyOFdHcXFob0ZJTVk0dnNrNXh6QU1lTytwNjFyT2xCUUpYcXpyNVhLSmp3SFhEd3hkUDA0cUNVNVBUems3TzhOYVE5OTM2S3cxNXZQNXVOamp1WlVYcmFwcnRLNVFXdTBNTUsxUllqeU1DNmUxSnNhSWMwNHNadWRHbzgxVWxwakV1RkNvM1dJREtTK2FENEhndmZ3dEgzRlZQaisxMHVnc3dGcHJjSTRZd2Z2QUpteHd6cEZJZUI4SU1SSlRRaXRRMm1DckNxT2dXY3c1VkFxUENOaGlzUmd0L0hHY1djc0F1SDRBSWs0NXJyL3lLdGRmdmNiNmRFMGNQQ0Y0dEJJaDFtYWdtYzkzeDJsS3hBUjFYZWM1U2ZqQnNWcXRDQ0dpbFNacFdaUHR0Z01TeGxnV2k3a2NBVVdLWW96anppeHFyV2tham82T2NNN1JkNTJvSU1RclVJQldpc1Z5SWJzcUJQcHRSMjFybXFhbW5iVnN0MXY2dnBmUDkxdTg5MVJWeFIxMzNNSHg4VEZWVlJOU3dpWVJPRk5aMmxsTFZCcVZkMjFNQ1dJMjlwUVljY3BvbE5HRUZQRXh5RmszZEd5Mkd6YmRscXFwU2RrdFBIOGxHQzNqT0xIVVV6N2JpazFoc3NHcnRTWXFDSU80eE03TGhsQkdnOUgwUkJ3Uml4aXViZE9ncmNGcGhWZVE4bncyVGNOOFB1Znc4SkJoR0lneDBqU05hSmNZT0RzNUlRWkhqRkcwNkdyRlpqMmdDQ2c4eGxRMGRZTW40bE9nMGpPVU1kazJhN0JXTm5QWDlmUmRSOWNOSk1UZ1ZDSElneXZ4YnB6enBLU3d6c3Y1a1pRbUZGY3NSYlF4R0tXSUpPcDJoaklXTnd3a0pYNTdqRXBjRVJJYVExTzNIQzZQaUZmRUJUazhPS1N1NjFGN0ZHczdoRWdJUFRkdm51QmNZTGxjc2x3dWlTU3NNU2lqMFZXRml1SS9qNHVXa2xqOStlZWkwa01JYkxkYjF1djFPS2xvUmRVMExKZExxb21HSzVjQ2xOYmkwUmdqYWwrOE01bWpMQUJNVktWU0NxczBMa1VJaWFRU3lXaWF0dVhnMGpIT2Vkd3dvSHpFS0xING8xWmljQmt6THZ4OFBpZUVNS3JxR0NOOTF6RjBXL3pRWXlzWlQxM1ZIQ3lXekdjV0gxWU0vUlpqREUwN282cGFxcXJCYUlzMW9yVzBNWnljbmFHMUlvYkFkdWh4TWFDTXlnWjd0cjJTSXBGR1k5Y096cEd5T2kzbmV3QjBqSVRSK0JFVjFyUXRLWUgzWG9RZ2lWT2x0Y1lheTNLeFpEbWJVOWxLQnBVWHFmalVCYmdwYW4wWUJrNVBUMlhYbXhuUkozU1NpUyt1VzB5SkZNWDR5NllnNUFkdzNySFpicmx4NHlicjAxVStmaFRKUWpLS3M5V0tvK01qckxFQ3lSUVp5T2U4R2ZyczFkUm9xeUZxTkFhalpVSjlQaisxMHNRUVNDay9TM2EzVEYweFd5NVlIQ3pGZmU0SCtyTTEyb3Z2alRJWWJkQlZ4ZEhSRVVkSFIrTlo3SndUdGU4YzNYWkxDaDVyTEcxZGp5Nm5XV3FVWHVDQ29SOUVFODJheTdUdEhHTXFyTEhaaTVLZDNYVURLY21ZbmZONVhTMm1NUmdyZG9YWUxNWFdVVmp2eGI4dloxMngyTXNaVlhiRDFJS2Z2cUlTYkVCMkRLaWtxWXdkNzFjK1Z5UytMSDc1TGg4Q20rMFdVMWNZYlFoRU5JWVVGVDVHZlBCNWh5cTBSclJBaW15Mlc4N1dhMWFyTmJmNlU2Ni91V2Z6a0N6eTdPdVI1Vk9HYnR1UkZLT2FIUTI4ck9hTFMrWmpwRlppalN0alJ2d2dob2h6UWJRQ3lGazYwVWpXV2t4dHNiT1d4V0tPMjNSc3RhRS9XVEc0QVcwdHRxNnA1clBSNW5IT2pVZHUzL2Vqb2QyMk0yWk56YXlwc2NhdzJtNVlyVGRvM1pMMGhxZ3JqTGEwN1JGdDIxSm5RUkYwVmx6aU9IaEM5Q09pS1I2V3htaU4xcEd1Ni9NR0VzRUFKVVpnakZGY2d1em5lKy9IQlo1YXo4RG9Qb1FRMkd3MjJLYmVUWVlSaVFjeElvdmxXOXl6Y3Q2Vys0UVE2UHFld1RzMm00MDhsTkhZbEVoUnNlbTdjY0txN0NwQnBPdTJiRFliVG03ZTRqU3NlUDRISE91SEFDdGozYjVSMFgwdGNjZHZPRlN2UjRHcktwdWxYdzZDQXBqWWxLaWFPZ3ZGVG10TnpwOVJhMHdOaWJxcG1jMUV0Uy9tYzV5cFViMW5lL01VSHdJcUJCcHJXQzRXV0d2M2JJNHB3bWlzcFdrYWNhZWJTdjdtL0xnUnRkYVlKQUo4Y0xoa1BsdGtTMTh4OUQxOW56ZWpFd0hRR3VxNm9USjJCUEwyUEp3cy9LSzVzM3RWWEwwUlU4K0Q5ZDdMR3pNYVZnYmU5ejM5MEpPMEd0OVhXVXN5bHBDUnZKalJ4U0pFNTNkaFhkY29yZkhyZ0hOT2hMQ3FDRlhBTzlubGczZmplMjFsZ01oMnUrR0ZGMTdnNVBvdFhucnJtdlViSWlvbzhEc1Z2M2tyM0h6Q2NmUk5xTEtCNlNjR24xSWFHeU8xcUNkQW9iVkZLME5DRVZGaTcyUlZtYkxRRkl3OHBpaW9ZTnZTVkJWdUdIWXY3MlJPbmFQditvbjdKbTdpNE53WWF3Qm9xb3FtYmFuYmxtSG9XRy9XREc3STZ0cWh0YUtwR3F5dG1MY05zNmFWSTFGcFZFeXN6ODdvdHgxOTEyR3RIc0VnclJUQmViYnJ6ZDdhRnVOK3VWeGkxVVFsaW5Yb3hvR2w3TjVZWTBqYWdJS1FGNy9zVE8vY3FNWkNDRGdHak5ZWUxXcXVCSDZtN3M1VUF1c1VVUnRGOE9MQ09lOUlXMGhKTWJpQjFXYURkNDZxcnFrcVEwcWlBVmFyRllOejNIaXdvMERNMDkySlZXemZxbW0vNVBCRWpMSFlrTVo0aDBKUnB4cWxJN1pDVG5XbEVSbEpKSjJ5dWxkNTl5ZkIvUkhzUHlYRmRydGxjN1lTdUZzcmZEN2JRelpFVTB3RTV3amVNM1RkNkdtVXhTOExFbUtrSHdaU2lneERoL2NoRzl1SmxBSTZpYUZ0bEVXVHNCcTBObmdmY0gzUDBIZDAydzM5NEppWkZyU1dJTnBrTTI4Mkc1d1RJN21xYXhhTEJmUDVIS3NTWXJYYVhWUk5KOFlIVVVvUkVsZ2p2cmpSaHVWOFFVeUpFQVUxREV3QUZYYUN0RjZ2eDZOaG52M1cwY0xPa3h0Q1FDazV4N3BPZ2pFaHlvTDVGT2s2OGJsOWNBeURHcy9PbEJJK2hGSHRuNzlrd3lhY0N3UUROcW5zdU82T00wSHlETVo2MXVzdHhsU0VtSTh6YTh1NzgrYklzcFc5aGFoaHRWNmhyY0VXKzZZZk9EMDc0OWJaS2RwYTZxWkZ4VVFZSEp1ejlXalVoaFRGM2N6ejRFTmd2Vm16VmhuTHJ5dytpbSt2bEllZ1pGeGE0WVlOOXZBQVl3eEQzL1A4Yzg5eWVuWUNKSFJia1ZUYXVjWkI0aDlER0RnN08yR3oyZERPWnVqYXNEaGNVTTlxUVFLVlV1ako0b1FNeXNUc1ZoWERVTFJsM3RuV1VHczUvK1BrZU5ReEVVTmt2VnFQVWJpenM3UFIzYXFxU3JCd2s2M1hqTU1yblVoRVFlMk14aGdGU1dPdEJnd3hlbExTeEJoRyt5SEdRUE5FcEw5TGpaRy84ZklKOVkyQUk2QkNJZ0l4bTNOYWk1RDZGRWxLNGFPNFRldHV5M0s1WkpGRHIyUk5nUUpyREZZYk1hR1VRTVp1dTJVWUJ2ck5GcVUxUTlleFhxM3B1azdnMmFybWNyeUNpeEh2SEQ1NEFaOUl6QllMRG8rT21MWHQrQ3dwSDFXSDlZSDQ3bHFUdkJ5UENqQTYwSFVEcm5lcyt6VzNidDFpZlhiSzZ2U1VldFpnTktpRnBtckVvTVVrdEZZTVhjY3dkTVRvUVE0M0lsSGlIMXBKZUxhNGM2TVFCUG5pWXJSTWpaZHlKcGRZZmNqK09Wa1poOEd6VnV2Ui9ldjdmc1FDcGtLZ010SldWeldESHpCRzU5MHZScDlWaWdNT1dLMVcyV0lPb3hIcXZTZkV5UEwzSXQxREduZnZSQVRLS21tSmtwRmQyWlFST1VJTzBTcUY4MDRpaGNHUGNmLzFlczE4TWNjYU80NjVybXZtVFpzUlFwWGo3UjJielliMTZabG9TeFFxcFhFdStyNW50VnFqcXdxZlVVb1h2SGhPZFUzS0tLWUFjRzZNd3h3Zkg3TThXbUsxNXNhMTYzVGJEbUpFS1Mxdzd2WHJ1SXowV2FNRmlCTVZMT3VYNHlKS2k1YUduWmRYak56QkRheE9UN0hGRWs3NUJnVTVLNlNKcWZ0WERNTnlNMXRWNGg1TkJNQ2c2UDNPMmkvb29uT09wbWxHMTdKY280ZWdNcExvWEE0ZFExVlpiTFhjdThmVUJVMHFZZGVhUy8vRXMvcDJSZi9HakJ4ZU1sQ0QrMkNGZmlGaW5nbDdac0w1QUZES1dJT2JRTW5ETU95aWkza3VYRHRndGFqOHVtbllkaDJiMVpxaDd3a2hNS3VGKzFCQVoyTXJqTmFqRmM1a0xydStaN3ZkN2dKZE1ZMXpYSUNpV1NheG5KNmNrR0xLc0xmbnpKMFJRMklZQm1iek9UYlVkSDJQcXZMRzBVWUVNYStsdFpiRmZENGluY1YyTyswSDdHS3hHSEgrR0lLUUMxSWNTUk9yMVlyTlpqTXVWbUgzZ0JyRHh5SHQ4UG1ZRjMwcU9GM1hqY2ZJQ0NYbjl5dTlDK1Mwc3htbXJnUWtTV0lMRkxpMElJcGxyR01ReG1yMEdjdys3cWwvSTBnMDhjTXR3L2ZVY0tSdzMxK2gvMUZFRDdjdi90UWpLY0phV0UvRlFDdGEwUTBEdmgvR09haTZhZ1IwU25ETXhZQUt2a2dWV0V2TTF2cDhMa2RLSXJIcE85bGs4cVdDQ0U3R05Bd0RmZDlUNVFoaThkTEt6M1hkNEZXa2JoVktlL0FSbEFWdG1GVTFqVEZZSllLWGpLR2R0YlN6R2Q1NW9rcm95aENRNDhFMlRUT3F1VUc0V1ptVll6Q1ZwYzhSdGlMNTFsaHFZekZaM1FrekorL0k3QzZINE1jRkwyNWtlYWppVG81eEJ6VG9YVXpmSkUzUUdwSWVCYUNnWm1WMzdrRzdLYUdNcUgreHNoWDE3dzZFK3czaEVVTjh5T0EvV0tFLzVzZEZucnFqNVpnNi8vK3BwdEpheGhLaXdMem1uRnNjVTh5ZmphTmdwcFF3TVFBUnBSTEdDQjhoaElqVkJwL25TQnROVXpmWVZHT3o1aGtHeDlBUGhLb2hoQ2pjaUtqUWFJd1MvMTliUTZVa0hKMVN6SjVid3ZVOUo3ZE91SDd0T292NW5PQWQzWFlqUjArT29aRHRPRzJzQklPS256KzlDazVlVnhXenRzVnFLeW81YXdDbE5Va3JRdkxFSUlaZnNSTlNtQVJZSnFxbzdPTGlFb1lZQ05Iam9xTjNZaWY0NENVbWtjVDM5bG1EVElOVmdtbW4zZEhGSkJ4ck5XeWgvWmVPOWIrdFlhRnc3Ni9nV1UvNGVvK3VkMnI5dkNCTS8xL2N0Tkg0MVlaQmFRd2FhNFhUcDYwUmlEaEs3RVNIaWJlUUV0VkVNT1NsOFY3Y3doZ2xPRE52WnpSTlE4d0NQbVFnN3V4c2hZcXc3WVRhVmxVVkpPRmdKRUFiRVhiblBmMGdicVZXaW02em9kLzArT0RvTjF0U0RQVDlsdFBOQ21zTUIwZEhzaFlaYzdIbG5Cc0huY1BCWllLYXFvWTJqY1NITW5sSk1TNUNUTHZGa1J1eHB6Nm5PRU5ad09LTHUrZ1lYRS92K3pIRWloSVBJS1NJeXdzeFhmd1l4ZWFJY1lKeWFTRkhwcFRBZ240Qm1rOEV1ZzliVkF2dSsycjhzNmZvczBUVjd2aUE1NCtFNlRoSG04TUhqdTg1NWsxLy9LMWNlZk5WaHRYQUM1OTRqcHVQM1lBUWhWT2tJQnFEVmp2K1pJbGVsUEhIR0hOOEllS2RSNlZFV3pmQ243UVd0Q3pvWnJ2RlplOHBBYmF5NkRTZHozeDhta1MvSGRodU8xUVNRSW1ZSUFWMGhINnpSWnQ4ejdWNFphYXVPR2lQOFZsbzdmVEJwOWNVdHF6cTZyWUppcFBkWjdRaG1SMXJHSFlFazRPRGcwbWNlZ2NZalNwY0pUYWJEVnUzaFFUYUdERUNzMjBoeDhCazRTY2tqbEZsay9hRVdDbng4ZXZQQjl3OUVOOXU0VDVMK1A0Vy93dG54RDd0M2ErYzZ3V3BteDRENjlXYTQwY3U4VDMvNFE5dzVaRXJLQ01BenozdnU0OXYvSlBIZU9JWHY1YTlLRVR3OG5NbWR2R1VBcHh0MW10VzZ6VzJiamc0T0JpMWpFVDVXb3cxOUlYYllBd3FSTFpkaHcrNzU1WTFpQ1FGaXNUWjJZWis0NWkxTTZwcVNXVkVVQVJzQ2hJeUQ0R3pzek91WGJ2RzJXYk4vZXBoN3I3N2JoYUx4ZTRJS0xoMEdkUU9yR0Z2d3NzT2owa0dvYldtcW11VTM2bk9HT0lvQU5aWXFscU9rN0tEaDJFWWJ4V2k1K1RraE1ITGd5c2o5eU5wb2lvN01kTDNneUJrT1hnVE0wcVpNdUZEWlpzalpYSkVBdWdqL05xR2RPOENkZG1pdjdQRmZiT24vMnlIcnlNK1JKd1hnN2RCZ2RJaklwaFFoSkJJV3ZIdFAvWnVycjd4S21FSWhZeUVxUXdQZmVSUlh2NjlGem41eGcyaDBTdVQ3eUdRay9PQjFXWWpabEtNck5jcnR0dU9xaHBZTHBjanBsSTJYUEtKRkFKR0tVRVhFd3pPMFRrL2F0dmdIVXBYNk1yZ2ZHQXhYMkMxcGFsbU5IV05VUXB0ZG1DYmoyTExIQndjOE1vcnIzQjZjc0t0R3pjNFhDeW9qTUVPd3pENjZxTjdsWGZ5YUppTmkrZDNPMDlwdEJHSVZEU0FKa1o1cFNpZ3FiSENnalYyRi90T0tUSmt1RG5HU05kM25KNmRFUk5DMm15YVFqVWhLb2x0QzRjZ2d0TGo0aXF0YzRSdUY4TTMxZ29NRzRFVXdTamlpNEg0S3l2TWp4OUJyVEVmUGNDOTZIRXZCcUlLaEFRK1JFSktOQW5xT2tjZFVSaGJNNTliSHYxamJ5UzZuV3NMUW1xZFg1NXg2VzFYZVA1eno5TXNHbUJIUmRNWk5CcWN4MWl4ZlRaZGovTUJaWXk0YmZrOEg0WkI0dk9JbllRQ2c1QlN2ZmVzMWlzVXNGZ3NDRVRCN3dFZlBMYXlwS3oraGNpYTJVMlZaYTRYYkxZYnJMVWNIeDl6NWNwVnR0MFcxdzk0NStnMkcreloyZG5JcTN1dDgxRFV0aHZQeFpRU3RyWllWUXVoVTBXMFZ2a0ZuZ1E2VVRjWjhORUk5cVFDUG5yNm9hUHJPdFo5eDlCbnlEbmo2eWFCQzBtTXBsRkxRRXhLWXVCVlRYRGlveXNndVVHczJ6eFdRZThrbHBCVXd0U1c0ZmM2MGlOcjdJZVc2RHN0NXFOTGhwODdnU0M4eG1qQWJ6c0c1Nm1xWVF5M1ZrM0QvTkljWXcyN0EyOTNLYTFBYXhHaW1Fak9FeEswcmFKcExCR0IwVU1DWGRYWU9oQ1ZwcG5OV1I0ZVVUVXRJY0ZxdTRFWTZidnRHR01wWHRRcnI3ekM2bXhGWlMzdHZCWENxcFlnVmUrY0VHVTFLS3VFUmFwMkRHbGJpVkZjejJ0aWlBeURaNzFlazRDMmJsak01dGlDUkUzOTNtSnNGRXhmeUp6WnowOWUwQ3NxVEdWazUySkFKYlFCRlJKS1M4S0cwY1VxVHZsNGNReXVvK3UzYkxzTktTbG04NW5nOFhXbW9ZZUE4NTRZMDJnUVJwSkU1WXhpdGx4Z2ZBNWhCdzg2dTRkSkdFTXFpaUNhQkVGck1hQTZ4ZkNySzdpL3dqN1lZTi9SNHI5N1lQallHbVBOR01zWWdzZTRnZDQ3WnJNWnkva0NOd1JlL3YxWHVQZDk5NURDaEZWa0ZOdWJXMTc2MHN0RURUNEtyQnljazdGcUxkeUNHSWtnUXBYeERLMDF6VXpvWENFbFZFcTR2bU1ZZXJZNTlqRUNVdjFBTzY4NU9EZ0FJNHV0cmJDM2h1eGlLdzBoQlRSZ2pDQzAxbFlZYTJoU2d3K2U3WGJMWXJFWVVWNnRGUE4yaHAwYVZzVWRMTGg5QVY1RU1CVFd5dDhsT0xQakN4U3JmcW81cHRwaloxREtkM1hkbHE3cm1DME9hSm9hV3pkVWJZTUMrbUhBaHpoeTE5SW9uR1Nxc3l5cUQ0RXVBeW9Kc0NrUmt5S29YUWpYV2dnaFVqVVZ3NG1qLzZVVHpGKzRpbTQxOWZjdGNVLzJ1Q2NHZEwyemQ0TGU0UStDa3NMVHYvMHNkMzM3blpqS2pPRmdGRHoyeng3amhTKzhNUElLeXJGWmRuR1pqNUxtZFY2N2xtTlJJMGRjM3c4anZGeldwWkJveStJNU4yQUcwUzZGWXhCaUpBMERKcWUrMVUwelV0Q24wVk9UZ1NWSUk4eHRoVU12R0VCSitvQWRWYnJnN2lXVVNUYjhDamRQVXFZMFNlMFF0Q2w0VSs1VnNQOWlmUmVrMFJncmJPUnNFQmx0aEVLKzdRaXBMSVFZa3lqeE1Jb0xxQkdMUEE5TDZPQktqV3JRbUoyRmIydEwvN1dCL2wrZDBYNzBDSDFrbVAzd0lXZi81VFZpRjhTWVlBZGR4eGpGZTBsR2FHRkdHRS85clo2ekY4NTQvRjgrenRPLytiUXM5TGs0VkxtOGw1MVhucjhzdURHR2s1TVQ1amtaaCtqcHQ5dVJRRHRsYVJXZ3JtamwwOU5UemxacnFxWVZleW5iYjlFSGlKSGExdERPSm1TZVJOZDFlK3lqTXVBUWdpQ0JCUjFybW1aUG1vc3dDSlZZak1BUVhmYTdaV2U3WVVEWlhheS9MSDR4TG90bW1icC9CZEljUWFXWXdFVTBZSUZXVzZncWVqZmdrUGhDYlN0MEpSWjIzL2RFRjBnNWFUVUhGU1dVV2d4RnBUQkdZVzJtdXpjVkxnVGN4OWJZUnhyc1cxcXFSMXZhRHgrdy9TVUpwMDVCSVhIYk50Uk56WlczWE1hMkZ0OTd2dm5mZkpOWFAvVXFRUVdPRDQ5Wm1kVVkwSmxxdjJud3pEbVhrMWpVT0s4NmsxTEY5VXlvR0lqQmp3SlNqTyt5a3d1YXVscWRrVEJvdTZYT2Y4dDZoZFBUVTdhYmp1MjI0OUtsUzNSZGgvZU92dS9HOFJVYVhOLzNnc3lXWDViWGxNaFpwRWh5QjRZc0FNSXpWMmlpRDJLUTlPSWJtWHdjUkI4SXp1T3k1aGdKb2pGUlo3QWl4b2hSa3IxUzNFcVZzWEpqTGUxTWd6WFlHRWJ5b3phU3lkdWxsRW1hV2NDSzRROENoQUE2N1hoL1ZWVlJ1UXBqSFduajZINzVsTVc5TmVwQTAzN1BBZjdKSHZmN1c2ajJqekhuSEZGSDdublhQYVNZMkw2NnBYKzVaM0cwUUZ2eHRXMWxPVDA5M1hOdHB3QllFWUlTWENyWE1BeXMxMnRaWUtOSTBSTzlKNmFTOUNMejBYVWR3dWVYd05GNnZlR0ZsMTRpcE1pOTk5M0hBdzg4UUYwMVJCZDQ5dm9yQkJjNE9UMWh0Vmx4NXgxMzdOQlNMZkN4dUpNUUl3eUR4NWEwb21KMVRnR1dIU05ZR0NpRkVGSUFrNUNqVXlFYkk5R1kwWUNKTVJMOExqQlNnSmEyYWFtck9pTnN4V05HRWthVFpLOHFuYkNWSEEyQzZnajVJeWJQa09uWGN0d3dvbzRxZjAvWkRlVXkxbUx5TXhxdGNRYkNVd1BkUHo5aDlpZVBVVFBOL0ljdmNmYThJOTNhSFFWbHR4NDllTWpodlFja0VqZWZ2TW5xeFJXTDVXSU1FVStEVlZQaG1mNWNORW9SeUxLd2hTRmRtUnhYU1NHVE9ndHhVN1JBMTNYajUyL2V2TW4xNjlmUWxlVUI4NkNralRjdGZwQ1VNbGxMSmJzKzh3c3FJd2JoZHJzZGNSNlFjTFV0Tnk3Vy8xU1ZUejBENzExT000bzUxYnVnaFdFdlBXcUtJSmI3VE5uRlUzNGdSdHoxc25NTHBJdFdLSXlBUEZxVFlxSUxIWDJJREYwdmxuWktJakJhSUdPZElFd0RSRGxYVmlzMUhqVkYvYUdoKzhRSzgwaE4vWjRGNXI2SzJSOC9aUE1QYndxb2xNYzZkSTZIUC9pd2VBbys4UFNubm1HOVhsTm5LSGxFOFpxRzdYWTd6c0VVTWkvZk9ZV0R5N3h1dDVMdVZWbU5VVExpeEE2SEtmZWJVdW5YcXhWOVA3QnNtakcxckcxYWdnNHNGZ3RVekRtUWs3ekc4dnhUZm9kSzJRWW9aM1l4Zm5aKy96NzBXbUxrSWU2UXd1SUpuTmNhNVhmVDRJcW9OUEIrZHpiR1VEYnQ3dXhVU1FnTmVXdUxsNUZrTENXaTZMemc2RG9icGlybTlLZ1FTREVRazg0c0pVMUM3d21meE9VVGFVaHNmdWtXNXY0YWMyZEY4OTRGNFduSDhEdHIwUEw4cytPV0I3L3pBWlJXZEtjZGozL2ljY3hnOE1FSmlUTVhtSmlTTFVjRU5BdmMxR0NXWjk2cCtMN3ZjVnJUazZpTXhockJWRWFVUEtlbmwyZVBNUkJpNFBMbFMwTHR5dVNPcG1sd3lYRjBlQ1R6cC9SSVF5OUNXcnlKTWZrM3I0OHRibHl4OXN2Wk0wYjJ4bU5oaC9NWHlSNnJoeWlGVVVwY3RoQWxNaGhTWnRtcUVaeVp1all4K3B5ZXBIY3FPd2RTVUZwQW43b2lKTWN3T0xwaG9PdGNCbzVTTnZveXVoZ2hlRG1PaEtNWVFFa1dNT2FDd0ZRUTRDcTk0dWwrNVlUNW43MkNxalR0Unc0SlR6cmlTd0VmQWcrLzUxNHUzWGNNQ3A3NTNITmNmK0VtYmQwd0RQMlkzRG1kb3hHQUthNjAxaVN0YVpUQ0FGNGJ0aWFNODF0Y2JLTVNMa2x1SVdySHF5VFBhYm0wem1SUEphRFoyZW1hYTY5ZXh5aERERkd5b0tPU3hKeHNZQmFCQkhZaDdKeVBXUXZyS21mcnhnQlJLTXNUUUhBY2pJeEhveFdDNzFjVkNzRUtZZ2dFbDNjWlNDZzNLWXd5WXlDb2FKVVN0MVlZWW5KanRrNUk0Z3ZISk9SVHJZV3ZiNnRLRWtSeUpDM0VOR3FORW5GTEtFSktBbzQ0eitBZENVM1R6ckc2a294ZG83RjFoZDVvRVpDVTBFYmhQN2RsZUdoTjgzMUw5RlhMN0U4Y3NmcTd0MUNieUFQZitRRExLMHRpVEh6OXR4N245TllLTjNjNFY0OSt1ODVnazUwWTB1VW9NOEIzM2pyaC9iZE91ZVFjTjZxS1R4OGY4WVhEcFhBdk1xbVdLQ0ZsTmFhZ0ZQdGhQd1l6ZW1wMWpmZUI2OWR1U0xKS1FyaUZQakpyV3FxcUZvM28zRWkvSzhSVm90Ui9DRUU4S0t1c0lRVUlQdUhjZ1BJN2lZR2MwWk1ZVllsUmx0clcxRlZOVzdmTVo2MUU4N1piVWtZRmRRb2pMNitxNnBGYmtGSWExYmpXZ1pSTVhrQXluQ3FnaGtaMmhRWjhTcG1qcndrcGpkYSs3SkQ4TTRtSVJBOEhON0RlZHZJWlk1aFZCbVd0Wk9sWVdTanYzR2c4a2pUOXYxaGpINjB4RDlUWXR6YVlEODNnTTU0SFAvUUdrdFdjUEhXZEY3LzZFaW1EUkYwLzRFSmsxcmJNWmpOUjIxSGlDU0VsYkYwVGpPRUhicDd3UTlkdmlwWlFpbnU2bmoveDBpdTBNZkNiUjBzQmNGS21oR2UxTExqQ2JSVFh2SU1WYVhEWUJJTVByRGNkcDZkbkRJUG4zbnZ2bFp6TVhKS243enFDODZQS24rV1NQYVJFditubytvNzE2UmxXVzROUjBLOEdZWm11MStPSFNoVHBhSG5BZk5aS3RDbWZKY0lYaEJCM2hSbTZycVBiRHZTRFIydFJpZlA1ZkZLTGh3bTJzQlc4UDBmZTBFb0tIdVFRc05HS3BIV08rS204K0dxSHlJK0xMd3pkRXI3ZDlCMDMxaDB1UXFqbTZDWmlLaEhrdG0zcHNzVmUwTXVrRlBFa3N2M0ZGWXVmT2lZZUtPNzUzaVB1dnhsNFo1L2cyVnQ4OGNzdjh0TGoxOUJHR0QweFJsd0lBanJWTlJxSWZtQ2VYZDZtcW5sWWE5NTN0Z2JVeUpwT1NxRlQ0bjAzVC9ocVcvTnlYV0Z6SkRhUUllMEpnSFkrTnVNTG15bVRhc29SdEY2djZmdGV3cnQxTFRDMHRYU2JEU2xJOGExVHBibnp6anV6QVorNGNlTUdDc1FHZ0oyUlY1Q3JNWGZQKzF5WlEyTzBWTTJZb29jNVpYMVVmNVd0R1laQTZJUXFYVkxEeXJtbmxNSmFreTFkQ1JxaDFaajdUaFQzY3R0MTBQY2prWEpxRll2bVZ5TXFTNzUzN3p3bUR2ejRXd2JlZG9laVY2Zjg5blhOYzBNbDUxMnRzSFdMcVJ5REYvNUJBcEtHNGJHQjhQRTFIM3JQRmY2ZGp5ZmU4bXFDdi9UTGJOOXdpZTdoQTM3dHFPSGF0UzFXdzJHQ3ExcHpWMHJjMHcvY1VWVWNPcyt4Tmh4N3gySHZ1UlFUTTNtY3ZTc3F4UjNPc3h3R25zczVCZVc4TGpiU2xLSldvcDZ3NzVxSEVNYXFZWVhKZk5kZGQ0M3JsbEppdmRuZ2g0SEcxRnkrZkVsY3hFeHBjODdSYnp2QkFiYmI3ZWpIRnZlbXBBN05aak5xVytXOXB2YVl3dWN2cGNTQ3I1b0tQZlJDWDVxNE5EdE9uNkJoMWd5RWZJYkhITXp4V2NVT2d4dkxxNWxjV3MxYWs5MlpzTk1FTWpNNEg3bG43dm5wNys3NTBQMEtYU3NJRy83TXB1ZS8rRWJrTTdjdVV4bkZRYW80TTVhdTBUbUROMlZORm5uaytveS8rTjhHN241dXkyQVZOSWJtNlZ0OHo4c3JyaHdkY3QxWjdsS2FRNjJwbEtJQmFoUjFpRmlkS1hYNXVDU0JldzJJdUZlS3JmZjAzUlpUMWFPZE5JMjJsaU9YbEhKeGpOdHZWaXF1TkUyekIwUU53OENOR3plNG1YZTVXaXdsTXhrMUpxZW83TVhaWVJqWWJEWnNOaHVVa2lvV3M5bU1vNk1qWnJPWmNNMHlBVlNyWFpadmtjanpSb28xMmVDeUJtM015QUdjU20vQnVQdkJNNFRBa1BueVNpbTZZV0RyQjZLUzJFVGJ0a0xFVkJybkZONDd2SGVrdUF0QVNZV3N3RSsrdmVON0hnR0NBZ2VndURLUC9QVGJYK0dKMVNsYUsxUU1xQlRRS2FDVnBGa1pCZFpHcnI4VWNKLzJETGFvRmtoV0UxemtiYmNpdG03MkZtRDY3QU53UXVJV2NLWTFKMXJ4aHBDNFB5WDh1SDJnU29tdk5oVXZhTW5ySzR0WTZoWVdJUmczbE43bkxrNi8xM3RQMTNVak83bFkvRjNYY1hKeWt2TWJGalFIa2diV242NFpOaElYSUFOMTl2bm5ueDh6ZDBydG1vSS9GeENDbEVnK0VKTXdrQW1KVk1BZHBZUVFoNmlxcWlwQWhCMlBrRks0WVdvbEcyTlEyZDlQTVRBRXo2MWJ0eGlDUnh0RDNjd3dqYmlDSm9yTEo1ODlud2NvTnNKUmsvandBeDM0OHpvWEtwMTR5L0U2dzQycW5Cdmo4UUpJcmFMSE5yelltUkVTSGk4RklTWnVoa2dQbk1iSXl5bnhTa3E4SEFPdkFDY0tZdE1RcXdwdkxZTXh2RGtsZm1MYmMzZU1OQ25obE9LNXl2S3JSd2QwdGNYbWlPTVV0Q251ZFJHQTg5SFY4bnNSZkFIWlZxc1ZOMi9lNU5sbm4yVzlYclBkYnJsMjdScmRkb3RkemdnYWJyeDZqZGoxbk4wNjRlejBqTlYyeTdidlJRT1VtOVoxemRIUjBSNGhRV0JXb1V0Si9sNVg1cDBZQTBPMzJRc2lwWXpDeldhek1acFhvTXcyVjdBY001Q014ZytlOVhiTDZYckZ6Wk5id3N5Wno1Z2RIVkhOV3FGWXBWSUxUemdGSVFnZ1VvSlNXaHRKdzY3aWJ1dnVMV0RpZXRmd1N0K1FrbUx3Z2Q0RmV1ZHhQdUdUWWtod1lPYmNPVFBnM0o1dzZKUzRjYlhtcnp6OU1pOEh4YmJJajlhNS9KeW1xUzBIVFUzYnRGUkdLTnRQa1BoYnRlWGRnK055ak53d21pOHQ1NXpXTlUyK2Y5a1V4WWlkb3FoVDlQQWlEVkIrdDkxdWVmWFZWMUZLOGZ6enorK2dZeFJxMmRLc1RxbldEdDA3YnJ4NmpSc25OOWxzTjFTMXhSWkF3em5IY3Jsa1BwK1BFbGgyN2ZTTFM5NmI5NTYrNnprOXVjSGg0ZUhJY1lQczVSdURSRHFGUUZLSUVOT0lsQXkrNDJSMXhzbnFGQmNrdU9SVHhMYjFXSXFOVE5ISzRZSlIwRklTT3BvMW1xQm1QSGFyNVcxWHVuM0xTMEhuRlQvN3hMMThjWE1uaHNSNjAzSHI1SVJiSjZlc05qMHVRaGNzNzNsYnhYOXdhRGgrZVNCYTBSUXFKQktPMHgvOFFab3Z2TWpxZC83VldHZEFJOGVIVVlxbXNzenFtbG5Xbm9YL3NDTHg2NDJWUkU4U05WQ0ZRSm9jcGRQZGZCNUczK05pbnJ0S2VMbThYbm5sRlVxaVQ0eVIrV3pPNldxRkkwcFJ6eUZ5OCtRV20zN0RmRDduK1BBSUt3a0xoa3VYanBuUEY2TmtGVmR3R0FhQzgvaGg0T3owakZ1M2JvMnMwKzEyaXg4Nm5ubm1HUTRQRDNuMDBVZVp6V2JacUpQeXBTWGR2QlNnQ0RteDQrenNqR3UzVHJoMjZ4YlhUMC9aOUZLK1JGdEQwb3FoSDdER0VraW9tS3R6cEIzMWF5U2hlRG1CMXNIdzN6eDFoYjkwK0NLTGFsSmdTQ2MrOXVJQnYvSHlJZk5sZzFHS1hpdDZlZ2JWMHdXZmt5WVVUNzI4eHYzVSs5bit6clBVajU4d0Q0blZ2WE91ZjljSDJQN1F2OGRQZm8vaDU5eS96NWMrL1RGc1ZlOHRSb3FpK2ZaeUxKSUlnUTJlbENJQ3BFb21kRm44QXBGUGtkZnpPLzIxcm1rSWVvU1dKMlNVVTM5QzM1MkJWdHpxRmZPZ1VaWEJMR2M4OU5CREhCMGNZbU9BbzhORERnNFBnUWs4YVF6YmJzdXRtN2Vrd0VEWHNWcXZjM2d5c3QwS21FRDJpMC9YRzNSVjg4Z2pEOU0wTTFKSXhDSGlla2NNa3FidHc0YkJDOXAzY25iR3lYck42WHJGWnJNV0tRMDVTWkxFeWEwVEtsdWhqU1doV0cvV2VEY1F2QmRxMlZCUU9DbUFwRlBpRTY4cytHdWZ1NHMvOWZBTjNuTFVjMzBMLytUeGluLzYwakZwcHFnVTFKVWxlY084clhGOWpXczY2Q1BiSWZDblB2QUdQdlNCTjNMNnpnZjQ1WC80ZWY3eHIzMk5vWFY4KzVWMzhzSFovVnhxSFgvMkwvNmYrTm0vL3BmNTVoZC9sM28yeTBlaEFGRE9PYnh6b3dCb1ZRdzVnL2M3eGxDS2loaDNwMHhLWXpCN1hQanBtZjk2R3VEOCs2WmVGeW5oVXlCcDZQckUyYTAxaDVlT3VIcmxtS09qSTVxcXhpNFBEam0rZEVVUXN1Q3BtMnhwTzAvZmQxeTc5aXJYcmwzSE96ZHkySWFjN1RzTUE4R0xwdEREUUh6K2VWUlY4L0Q5RDFFYjhUbXR0cWcwNUdSR1IrYzlRL0NjckZlY0RoMWQ4TmkycHJMQ1BKWnFYejJyczFNdUhSNVNIN1lZTk5FNXZFdVNZdTEzRWJNUUpJUmJqb1JQdkRMbkV5OVZiRmVuOUlQSG1aYkRBOFB4WE54TW81QTZnVEdJaTZTRTRmdmdIUWY4NmU5OUkxb3JHcVg0K2NkZjVwTnVvSHErNTdIL3gzOEtxZVdEUC9palhMMzdmbjdxTC84TWYrYy8rZmQ1NHN1ZkZVMmdGTUZIdHR2dEdQeVJ4WkhGVFZIR0hYTGNwRzFiaWZvaG1rMmJ6SERXQm10TFpkSTRmdjc4VlR5S1ZGekUvUHpGTGlwR2Jvb3hjemdTcXo3UWJkZWsybEN2Vm1OWkd0dk9CVDBTNG9haG9tTGJyUmlHbm02ejRkVnJyM0w5NWkyYzkyWElFcTFMU1dqYlJvdWFWdENseU5ZRitzRlJ6Mm9xVTZOclRkY05Jamhlaks2VHJTeisxblhZeFl6YWFPcW1vdXQ3ZlBKMG15M0dHcGFMR2ZPMmdRU0dHWDZRRlBFeHBJcksveThUazVDYTVKclo4cElBTWFSY25UemkzVUFYQWtPM1plZzZvaHVraGs2Q0gzalgvYnp0a2F1QTRsZCs5eW0rK3ZoMVpsWXlmVGJyVy96WC8rWC9tZGw4d1hkODZLUGNjYzlEL1BuLzlWL2piLzlmZnBxbnZ2WkZLV3laWUxXUzh2VEZmUzBzSHAvVHh3VHJTQndkSFVuVmxDaHNwVklFMDlvS1kyd200aFJNZ0QyN29Ed24yUUNXWXRoaUg3bFNlTEljQ3lubGN2RUQvYllucW9BZXR0aVRXNXl0empoY0xySHRmSVl5T1dzbkNaZS9hUnFpSDNCaHdQa2VyUkpKZzlLV2xKUkFyMGhTUmxUaWRxdjhjOVNDZGtXUTJ2cDFpelpidExMMHc0cDFjSFF4UW1XeHFlSEtsY3NjTGhja0pFNndtTTNZbkswNHZuVE00V0pCazdPU0RGRG5VdStWcllpK2tFWWxrRFJlU21vSkZ3Nml6aFhCQ1o1K3U2SEx4cGIzam40UXl0VGh2T0xQZi9SdG9CWHIweTMvOWNjZnAvY1JVMHNLbkRLR3M5TWIvUHgvL2grUkVuekhoejdLM1E4K3lwLy95Mytkdi9NZi96VFBQdjRWVkxibXkxazhKY3lPS1hONTE1NmRuUkZqWkxGWTVNOUlxcnRpNXdxSy82OXdicmdOYnlrcUlDb3lMVC96TU1oMCtwU3JuQ3RGWXkwV1JSOGgxVFYxSXhsSXI3NzZLZ2Z6QlhhMVdnbTZoOVNOTU9pY24yNVpMQlljSGh4d3R0cklyamRXUXIyVHNaeEhxTXFaRktQc3hwUWtxSk5pWkwzWjBCTkpsYWF1R3k0ZFgrSjRzV1RlMVBMdHpZeTVNbXpyR2N1alE5cTJ3UnBodm1JamRRbDAyQjRYeGJBa1pXRXNFNVFaUGRQdzcraGlqVXdpbVNpVmhNLy9JKzk3aUxjOGVBbUEzLzNxeTN6eUt5L1MxSmFnMHBnUFlHekZ5YTFYK1FkLzZ6K2libWE4L1gzZnk3MFB2WW1mK09tZjRXLy96Ri9paFNlK1N0UE94dm1RRlBjMExzN1VkWnU2M3JBekJDWE5ZRkxITnlPd2hYanpCNWdFZTNDN3pvWmdaU3ZxcW1ZK200RlN6R2N6RG1ielhRbWZKNTk4a3NFNUxsKytMRVlMU2RTOWQxeTZmSW43N3J1ZnMvV1d6bnQ4amtLcDdJZW5JQTg0WmIxNDUramR3S3h1aVNIU2J6WnNodzZmSk1hdUtvRnptL21jeThlWE9HaGE1dFppY3dqMW9KN1JMM3VVTVdPOVFlOERTUWVhcHFacEdqWjJJOURiNjF4VGtzcjVud3NhT1Y4c1dDeG4vUGozdlFWZFc0SUwvTzEvOW1WY2tPeWJLVlVCd0JqTHJlc3Y4L04vODYveUUvK2J2OFpidi9ORFBQRG8yL21wdi9LZjhGLzl0ZjhWTHozempUMVgxMVExSkRVU01OSzVzYTF5d21ZcE1xV0w0NkoxanFKS0ZyWXhOcnUveFZpOEhldVlic1NRajR5b2pWUk56ZmRxNm9iRHhaSlowMlQ2V0lYOTJqZS93Y25xakhlODR4MDBWWVd2TFQ0NmxKSmM4cnZ1dlp0cTF2SzFiejdCNlhvanVmdGVFVXRKdGhoUjJtU0xNN0hhYk5nTVBYWFRFd2R4QTRjVWNTU3dCbVdGb2pYUDNNREdWRFRHU3BXUm1LaTFJU2hEQ0ZGWXY4WktsNUNVQ0xuT3NBUTFkbkh6MTlvYUZ3bEJtV0E1SXpYZi9mWTcrYzQzM3dVS1B2bmxsL2pDRXplcEswdmtkdU1Md0ZZMTExOStqcC8vei80cVAvVlgvanB2Zk9mN2VQRE43K1FuL3ZKZjV6ZC8vWmU0ZXVVS1dodSsvdld2OE9UblAwYjBBMlN5MTI0OFFJckVRV29rem9kaFpCY1YrTGVxc3NDM2t1Z2gwZThvaHA0dXp5ZThDM0pZVEtrZEpoQkRRSm1FTnhxdElscEJrOFBYZFNtSWJUUjIyM1hjdkhYQzE3NytkWTZPRGprK1hMSmN0RFMxTkNFQWhHa2p5VjE3a3oxMVYwVDlCRTQzSzU1LzZTVk96MVpqdnlDbnM1MVFpVVFhcmJIYVNDVUxJMFdoVll6RVhLYkY1UnA1MisyV3FxcFlMSmZVVlRYV0doclB5UW4xYkZxWVlUcW04NmpaZEtlMHRlRkhQL1F3VldOeFc4Yy8vdTBuMlE0UmF6UkRybkZRR0UwZ1NMSktZSnFXNjY4OHg4Lzl6Yi9LVC83MGY4eERiM29uYjNqYmQvTEFXNzZEV1E3Um5weWQ4bHUvOW92OHlzLytER0hvOHZlVzNTc0xGNk1FeU03OEJ0MXR4KzhyWmVXVkFtM0FXc243RStxNlVPTkxKZlNRNGlTU3VoTUtwU0FvaFVFUms5eW9ybXBtN1V4WVRkNVJ0eTA2a3ZCUmF2TTRMMnlhM2cxanJidCs2Rmx2MXZSRHoyYmIwZlU5L1RDTXhZZW1WMHlSOVhiTHFsdlRSNDlYQ2E4U1FVSFNTanFUMUExV0daUVA0SUlFRjJMTVpWa2QyKzJXYnJQbDFaZGY0ZnExYTd6NnlpdTg4Tnh6dlBqQ0M5eTZjWE1NVjVjR1VPV2FZdWJuTmNCRmx3dVJkejV5aWZlODZTcWt4SmVmdnNsdmZlVVYycVllamJDTEluRGxPNnFtNGVYbm51RHYvMmYvQjE1OC9tbFJxU294ZEJ1R2JzT2lxZm5vai93WjN2RjlQd3BKdEtRMnU1ZFN1K3JrS2NjYVFreTRFT2tHUjlmM2RMMWpzKzBaQm9kV2toeWpsUm1GS01ZY1VzOXNyZWtZUzZ4RG9DamtLS2dsUjlCb3c2d1JtTjJpMU5oUlEzeFlsYWxYY3Q2czFtdmg0dzBEMjI0N0VnQ21rNTBtT3l2RUlGV3lyU2JvaEpZYXpDaWptYmN0UkVuM1VrTWc5bzZrRFQ1RVl2UVpXWFFNZmMrMVYxOFZyWlBTV0pUSlpHYVAwWHFzaEZWeThRdFRlYzhnbkV6SUZIbUxVVWlZUC9MQkI5R1ZnWmo0NVUrL1FFZ1ZiYVBvaDRTTGtySzFNd052djZxNjRma25IK1BrNXF2Yys4QWpwT1RIdndtTURoLzRZeC9sOC8vczV6RzZxR2xWQnJVWDV4OWZNTlpuVEJHU2FsQm90Q29zWXdHU3lHeWlGTVViTUtnTEJWWThOU25scDlqeEFwT0NydSt4MDhKUHh0cWN4QkM0NVhwaThHT29XSWdoY2RjRGlOdURFb1hzVWVYN2xYS3hoRWlWRkxXcGFLeFV4Slo4T1VOU2taakNPQUVscXdqRXJ5Mlp5OVYyeTJ5eFlEYWZDejM5M0VLclBLSFRrM3RLckpnV3ErN2R3UHZmZkpYM3ZQa09BTDc1d2htZitQb3REZzhYVXZFclJyVDNNc212c2ZqbDB0clFOczJGZjFQQWN0N2VScmsvYjVQc0NVRDJITHozOUVpdWY1V3hnU25UV215ZmllYlRFcFdkZWdKN1kxR0t6WFpMNkIyMzBrME9qZzZGSmplYnpjWXpSM3J4U0gzYnd2ZnYreUhYdEVsaTdHbTlOeW1qS2tPcWV6VHRmS1JNanl5WGpKTlh4bkF3eTEyeEtuRXBYZlNFa0lCSWJhMFVMVEE1c3BnTkdxMmxNSkx6SHJaYlNZcE11OFNUTXJtN2MzWi9Vb3NHS0huN2ljUVB2dnQrRm9zR1F1UlhQL3NTMjBFYVhXbWtjT1FRSEs1enUxMTZRWkN4Zk9kVHp6M1B3Mi85anR2K2xrZzg5ZlRUdHgxTlpYeDdjM2crMUJzaUxqcTBobm5UeWx4TUpXdnkzdGM3Nm9yZFFwSkUyWUJnME52TmhxcHAwRlZsbWMzYWtTc0dpZFZxbmM4ZVQwelNBaTNsekQzeDdnMXg4cSs4TEtacW1jOFBXQ3dPcUNzNVMyT0kyWGpyMFFvcGZWWlZWTG5SUWEwMWxUSFV4bExyWERLKzFDcmV6WkJNU2hRbTdqQTRxUkpDTG9tVFdjSzNFeWprdGZPdHBZTEhtKysvelBlLzYxNUlpU2VlUCtXVGoxMm5iV3JxcXFLcUsrcGMzNCtVU2d4eU9wcTlTeHZEYi82VG4rV1ZWMTZXNnA1NXNhM1d2SFN5NFRjLzh4bHNwbldWbDFiQ281aUtoSm84WjNuMlNNeEZvQnk5ODFMSUloTm54dytwOHU2THhwbkdEVWhNWXduQWlCQndjMGw3eldJeFp6R2YwYzRhYkczQldEbVhRWGE5YVVoVUtOMkFxa2xVUUVXaUltSUp5YUNybHNYQlpZNk9yN0pjSEdKdExhckxlN2JiRGR2dFdsaEZnRW9SVGFLMlJoWmZHMXBiVTJrTlB1ejZEb0cwV3pFbU41R1FuUHRJTGhyQkxoVmNLWTNTQnFYa3BYVnBwcURSMnFLVUlVU0ZENHAvODMzM1U3Y1dZdUxqWDNxRkc2dUJXV3RwR3lsSXJUV29qSXhPWDJXM25YY3BYMzNxcS96ZC8rdi9uazkvOXBQMFRsalB2L3ZzZGY3dXA1N2cxUWUrQis3K05sUVFMbjdwUlRTK1VMSkxpMUJNVmJxU2NQalplczNaZWszdlhLNGhuQVE1eks5RUpLVkFxVVpXZWl1TjQ0NHhKNTVLbGRLQU5OeXcxbUtQamcrNWZPVjRyT2R2ak9iU1pUZzVPUm5SSjF0WDJLYkZZakl2ZitMVGF0bUdUVHZuMHBXcnpHZE56bGdSL243WDl3eVNoWXBWZ25tbjZQRmVhdWVwckZ0S2xxQ2FUbkkyVUl2Qmw3UVdGcStDWE53NEh5K1RuVFRaUlNVcVo0d0ZyYm43dU9YYkhqemdBMis1QWdsZXZySGxYM3poSmVyY3BrVWJoUTZRa0R6RTE3djJoRUFwbnZuaUovajViM3lCdGhFM3NIdjdqekM4OGZzeEIxZUlIL3h6bUkvLzM5RW5MNUMwelVHb1hRQXJGbHRqWXJPVVM1cHlST2k3VVNpTWxaeURrZUZFTmh6VFBuOUFZZ2lTck90N1I2Y0hTU3d4d2s4SU1XTHZ1dXV1a2N6aEoyZHFqRktYZnhnY3RxcUVhQkJXWS9oM2Q3WXFiR05wWjNMMmw3WnFrbEFpaVpORFZXSGl6b0NKS1VId3hEaGg5ckt6MW5lV01qa3pPRGVReXVFN2xWRkRJakk1aWR2TzBCM3J5R0MxNWdmZWRTYy84djU3dU8vT3VTUWhBSi85NWcxT041NHFHM0ZpVisxWU9OL3FsWkFrMU9nR05rTXZOTmN2L0FKbWNSa2VlRGZwK0Q3OGUvOXRtay84VitoaGc5TDcrWUpLNWVUUWlTMHdGYlNDYzJ5N0RwUTB2NndxZzdFU0x4anZNOVlsVEhzQ05sTFpDeTlEbTNITzlNSHlJTGRMazRJTnMxYU13c1Y4em1LK29La2xDZkhnWUNGdHhxd1VISzRxSzVRaWE1alBaOVMxM1lVdWs2Z2tVbVErbTNIcDBqR0x4WHcwNXNiVHFreENmcFZRcWR5dkZqN0FCZjc0YUFtZkk2ZW1TWkJpNUIwcXczdmZkSm4vMlE4OXduMTN6TUduZk1CR1B2aVdLeng4OTNLdnMxaEpYUG5EQ01EME81V1cwdnZLYmFrKzlmT29hMDhBaVhqdjIzSGYrYWRSVlR0V1ppOWovNFB1V2E1U2NFS0Fzc2o1NCtpaSs0Mnd0SkgraDZYU2FqbHFkSW9SUDBqbXI5V0dwcTZaTlMzejJaemxRa3FueitxR2VWTng2WGpCWXRFeW0xWGp5NWhFU280UWVxUmxoMEFQbWtTbE5QT3E0bkEybzYyc1JCVlZ5cWhpbHM2Yzh1V0RWT3l5dVpsQjZZQzliMEdmTS9KUzJ2djdSUk9pRlB6eGQ5OGx4OUtreGc4SkxoKzNmT1E3N3M3a0RMbEhLZFVhb3hwZHkyOWw0Y3UvTytFMDZQVU43S2QvSHJXNkpndjR5SGN4dlBVakk2UDVJdUJxU3ZFcTE3UnFpUVMyZGhYYkxrSTR6M01KcTV4cVh6S0UzVEJJaTVyWlRPb0VGdlV3bFpacFhmLzVJcUJYRmQyMTZ5d1dMU25XMHBjUFdLL0ZuUkJrVHVyeU5NcFFhZUVYR0dOd0E4QWNra0VaU0RybkNTU2hlMEVCUVFLWXhHd3hvNnByekRCa0EwbUtVU290ZExGeTdSZ3h3aklTaURTaTBtUkJVTng3dWIxNDViVGkzc3N6RWxCWnk3YVVaMG1NNTNTZTBXOUpDRzViVUZOaHJqMkordXcvWXZqZ1QwSTl4NzNsSTZqMWRhckhmNXVFdWsxb3B5N2hlY3BYSWVxV1JUNC9ENmo5eUtPby85d2pJT2MvSEJ3c3VmZnVlM2p3d1llb3F6cTNqSkZ2RzhPclk2cDRMR25FaW9QNUhIL2swRVRxcXFiT0VhVjRkRVRTVXVDeHJpeTFNalJhVVNuSkVZZ3hvYXpCdERVcWlIVTcrdFFwa3h1U09LdkdpcHRXY2dKc1piR1pQMWNFQUZPc2YvS2huWEJweUsxZ0lZVTRucGt4UnJSSlBIZDl3OVhqQzRRZ0psNjRJZEJ5S2Q4Kzdpb2xxZXF2alFQZUxnQzNIVmNSTWZxZS9neDJmZ24vN2g4SFcrUGU5YU80cyt2RXB6OVBISkZWY25jdnZTY0EwMklSNVhmVG5iKzdMajRLcG0xL1p6UER3Y0dTcTFldmNPblNKWkowSVNuYy9rVDAwdEVpRmVsTGVYR1NPSDdIaXprbUJlcE1BeGRta0tZYnBNZHZYVmRZWmFpVkVEZ1VTVnJKNVVYWFZtZTNMVThhWlBKbzJHWCtWQmFUQkNuYzVQdU9EeXk5V2NtZzF6anhhZEtScTR5OS9DMG16My8zeWVmNTlvZVBwVVJLRHZKZ05hZW5QZi9pQ3kralZjcGN3M044ZkMwVnVsTXFSOWJ0aTE0VzV6emFCNUNVMkJ0SkcvVFgveFY2Y1lYNHRvL2dtMFBlOU4wL3p2L29ROS9CdHgvVVhQT0pmL1RseC9pMTMvOE15ZStYa2lrRTJHSU1UcjRkMkRYdzBGcUwyM2RPQzhDdVNQZlIwUkdIaDRlanB3Skl2NEJFMnJVcG03QlRZOVlHT2tIeUVkTjdMbGR6S2lPbFc3UXlndUo1bWZSV0s2cXF0SUlSbjdTYzd5VVFkcHU2eTRaYlNVeXhkUVhHY1AvOTl4T1U0dWF0bXlPbEtrMVF4OGxOUnBnM1hHQzRHYVA1MURldTg3ZCs2V3Y4eVEvZXo0UDNIVUpJUFBiRURmN2hiejdMVXkrdlVDVUpOVTlnMHpTRW1PamRNSmFDejlXeGIxdjgwWmg2amV3ZCtSbUlIdjM1WDJCb2p2akEyOTdGMzd3L2NsLzloaEg4K1lFM1BNVGZ1UE1xZitPZi85UFJtajh2Q0x2ZkpieDNxR0ZmS0pwS2NJL3BNVEw5L0pocGxmbVhNUVRzNFZMeTMwOXUzUkttVHlvN1J4Z3pPcE1Mb3cvU3NqekRwUlFBSTRGSjBwNnNDMnNHWXdFcEdtbHJPMDZTTmxwVTZ2VE0wMUlYV0N2eEtwcW1rYWJQd01IQmdydnV1Q0lsMVBvZTV3WmNLSFMwYzlSL3JZakdFTDBYTkNGbHdkQTY1eWZDcjN6MlJUNzN6ZXZjZGR6Z1ErVFpWemVjOVltbXNybnNmWFpUbzZLcUt4WktvM3JSYm1wU1YyZTY2T2Rkem4yNVZLRFpGWmRVbWpoMEhIN3h2K1hmZmUrOTNHY0hpWkZQbnVFbnZ1UGIrZmpqVC9DNXIzMlJLamZ4S3B0bWVxNjduUFpON2tPUTBSTlVTdElGTlFOZ0lRUlV5a2VabHRLN0JUanpRMll3TjVYNHdMZGlrdDdBU0toVlV4NVNJRW1yTmRyWW5jK2UyUUlhQVVLTTBuZ2ZXSzlPaVNwUzFSVkx2Y2paUUVKMjhJTVhkbXd1SmsyTTBqWTJ0MXFScWhxU0haeThaMVpWWERvOFlPZ2J1cjZqY3hGZlhNZGNVVHhtNFNSS2pyNlBVa1FDeUx6RVVybGM4L3lOTFUrOXNoTEp0NFpaMjRnd0ZaOVk2MXo0S2FGVVFBMkNTTWFVSnM4OVdXUlo2WEhIN1FsQndlREw4aVJKWWJzY3QzemYwdDBlWElpSksvT0dEOTU1bVU5L0pkSFl2QkdSVWpoRnQ2VlVCQUxwQUJKMlRiYUpBZkJTYkJ2aEJraEpuaURFMktaQm13b1ZGYWtmR0xvdHRySldmRVB2NlhOamhsblRTbU5vUmNhc2xZUnRsUjlEbFFwNVFLMmtWU3cxNEJ3YVJkMDBMQThQYUdjN1Z3Nmcxd05oRzBtbHJwQ1UrcWFxREl0WkswZFFrdlF1My9lNHpZYlE5VlJLWWRxV3VrcTRLTVNVa2xIc2hrSFlSdEZBcWxBdWtaQjhlNVN3Z3NYSWhLcTJhS09JVVdlc1BlWGFBbksvWFJlUUNLWDhURks1QmwzYUUvemlKYWlzQ2M4TFIwcHBETUtVZjZXVXIwRGErM0hMM2FVellscWh4MklZKys1bzBRVGdYRURyaE1sbGNId1NvN2VBYm9sSUdCekJSMGxYYTF0MEp0UVNlNGF6dFRTTm1xWWtsOWZVc0RFb1VvajB1ajlYRkZFNDdWcHI2bFFUYXVrR2JodXB6RGxOYTA1SXA2eElJbW9JUGtnOWV5VzFha3JCYVNLa0dCbTZEVVlqQ1J6T3lmR2pWYTdZYVVsS2tNdmczSWlsR3kxTnJBR2NrdU5pOFB1UXJxam1YR2dhQ1lxY1R6aWRSaUxQWit5azZYM09YUmVCT3VjemdHNTJBLy9xaFd0OCtJRTdZTUlXUml1dWJUbysrK29KODBxQ1lvcU1tMlM0ZTdjKysyZ2ZNUEl5YjhzbFZCcVVRZGNOcXE3eFNmSTY5REN3WGEreFV5dXpHRE5GQUlweFpaVkdHWExwOXJ4N1ZabjBIU3RuWjhTUjgvcDI1MVpNd2tHckcxRlBYWktzSWhTNDRORkJmUDF5My9sOFBuWWFjODZ4SFJ6ZDRCaEN5QXVlY3RNbDJXazJJMTFhYTNRd1VuK25WTVE2dDJoanlMVjRPZGxDM1pGYnA1TTlMVXh4TzhIMEQ3cW05b0l4aG0yLzVmLzU4WS94NWovNXd6eHdNQmUxSFVYci9iOS83eXM4OXZRVE5GVTFNcS9GK2RHaTlVYjNNREd1NzBRSXpzUExVbUhOWTAydUxaVEx6YTI2am1IYk1mZ2V1OWxzNkhKYjB5bm9NSjJveWRQYy9vU0pzYzJic1FJZ29jbGNHZ2xGSmdBbHhadzFtc3BhYUJxa1paUWkrSUJMRWE5VWJoY2Z4NVpwcFNCbDJ6bE9WbWY0OVJydlBjWUl4NkNwS293U0l5NVZpSFhzUGRGREg4SzR5T2RqN2lYZWtSOXMxQUlxZjUvTHhTOUwvZUUwRVpTTHlCd1hhWVR6Um1LTWtkb3FQdmZOeC9nTC8yRExuLzNBQi9taEIrN2duc01EQUU1dVhTTkVqMVZaUDQxZnN4djNSVURRMUFhWkNzRzBZSFZsTFZacmtzOXRaRGRib2tIYXg1K3Y5bjJicEo5enZzclpSMGJlckxMNVN5U2VrRkxJTGVqS25Pa01yVXFiV2FNdDFpcGNrTXhhRlNNcTcrQml0R203YXorZlVxS3lEU0ZHQnVmWmROS2tzYW9xNnFyQmVUZG1JTnNjTVhRcG9aUWJEY1dMRm1jM2laSy9WeVl4eEVBSXUwYVhCZDVPcVNTZEtxWW8zVVZvbmhSa1l1ODlSUWlzVGp6ejBqUDhILzgvVC9Mcmp6N0szLzR6UDRZMWhqLzl6bS9qWDN6dGE5eFlyV1J1aVNQbmovSWRhV2Rkam5aSWNZWFZmbXlrYUd2aGhJb1hoZytrTGxkekJXenkwbXN2T3FrRVVoa3JGVGxRMldnWmRjM1lOemNrV1FDU3NFNURDRHZjUGlSQ2tOeUNiVTRsTDI1WlVta3MrYUtUcGpZTldnblNhTFNSUmRBVGdjc3djQVMwRGpTMWNBeE1QcDZxV29nYlZhancxdUVycVpqaFlwQWpZU0pBcjZldTVUMWxWKzAwSUZHTTQrTHVxc2t0cG1wMmV1Wk92MCt4cjNYR3paTmYxbGI4L2tzdjhiRW5udVREYjNzcmI3cnJUajc2bGpmeGM1LzZMRVpsa0l4ZDdLUkVRMlh4azhEaVJsQllaYkp4cVNWY0x1RjFoWThKaThiN3hMRHBXZmVCdVUrWnBLcWtSbEMzbGRUc0pnTUZwV3BGcWVaeG5uWTlvbTR4WWRTdUJHc3hHSWRoVi9mZWxZYVVPWmxrdVR4Z3NWemtvaEpheUJja3FaaXRwalVBQ3NwRjVpQkU2cnFSS3BuYkZqY0poaGlFZ1VPcHJEMVVoTTJHSmdqTHVSaTVyM2ROZDNUcGZpTHQzSVFaVFVqc2VQZzdTSFphZ3ZhaXdFeVpzL01DQjR6TnB2N1I3MytSNzNya1llWnR5Ny8xem5md3kxLzZNdGRXSzluRnhCSDIzbW1rbE1jbzJkR2xSdUZZdW1maUtkaW1RUnREM3c4a0g2bTFwYlVKUFd0Skdxa1ZYSFp3S1E5VEZyOFVrUVpHTzJGYVRwNEVoQjMwT0JZNW1MekNNREQwUFp2dGxpSEhvdHU2UnRlTkJJdTBxTmpiczJERnVJc3hqalFxWXhUejJaeDJOc2Q3bCt2ckQwUWx4d3BLK2diWnRzRXJ4ZHIxTktFWksyNi8zalUxbnBRQ2F6UDlXbXUwVmZSZER5bGtLdlpPYUthN2Z3b0lLYVgyNFBraUlPYzFRV1VNWDNqaEJYNzdpU2Y1eUxlOWpiZmVmVGNmZnRNYitiblBmZzZsQ2pIbWZMbmJnbTNzT3BkUGowdEYrUjQ1cUVPS09EZGdqZUY0ZHNpODkyenFTTkpSYklBaXhhVmhSQ0ZRVHV2VWx3R1U5empuaEdOZTIxRlF0QmFqcnE3cjhmTmQxN0hOalNaMVp2ZzY1NlFvMVh4T1ZSb2RzYSttWTh3UnZxSys4ekdodEVGWlE4cGw1NFB6OUdIQTZBcGpLcFFDa3lMSHgwYzRsUWo1WHV0c1BGNEVrNTRYQktWS1BTS0RNaHB0aGI1RjZnaEJ3ckZUSVNpTC8zb0dZYmwzdVVadG94UmI1L21Idi9mN2ZPOGJIcUZwR3Y3Y2U5L0RMMzdweTV4MDI1RUZWTlprcXFFdWFvQzUvMTFTUVVWc00rbFBPR3RiR3VWNWViaUoxeEY3NitZdDZxYm0wcVZMTkRuNWN0ZHAydXlkZGRPK3YxVlZFWHpBcUoyV2dNeFB6d09xcW9yNWZEN1d4dTl5VFlIdGRqdE9YRnZiVWFMSkViRUNSWThGb0ZPQ0NNb29LbE9oa3BTRTFkbDFNekhYNTlVRlNmVFlaRm5NNXRLTU9pTjVtODFHY3VhbklkUEp3b3plRDR6NFJtVXlpYVZPcEtqb0J3Y1poQ3BqS3diWDlOb1p5cmN2L3ZTS01XS1Y0alBQUE12dlBQa1UzLysydC9Mb25YZnczLysydC9KM1B2VnBaazB0UVNtenF6NithOUIxMGVMdmYyZlYxQnhmdXNUbHkxZXdsV1hWYmRuMkF5dmZNeVNQOWNHam5OcmI5ZFBNbUtrQVROMEtyVFZPT1F4MjM5Zk9GYTRWQXN4VUttZXFLa1ZjcjNIZXNkMTJNc0dEWVhBOUVLa3FLeDAwamM0UEc3SWQ0Qm1jeXpXRVJRVW5CQUgwVWVvSzE4ME1vM2M5RDRpTU1QWEJiQWE1dXJoS2lhN3JJYm1SQlRTdHpURnFtNXh3SVVVYXBUaW1xbXNrUVVQUkpRamVsNU5XRExLSlp6QWVrZXExQ0NXNVBPNDR0NG8rQnY3ZVp6L0hCOS93Q0xPbTRYLzRubmZ6cTE5OWpPdmJEYlV4STVQWWxDT0FuRTI4ano0emRXbHRaVGc0T09McUhYZHljSEJFU0lsYlEwZnFPam9WNkpOSFg3bmpLcGN1WGRxcmIzOCtyRGxLZERsM0prYmlGT2tDSk5pZ05JSVNHblJWU1NxVWtiekFkakZuY2JCa3Zsd3lYeTVJV3RGNXo5WjVQSUN4bUZ3YVJsdXg1SjEzMHZkbTZGbXRWNnhXSy9waHdIbXBwMmRzUmQwMk5MTldQb080a3pvbUtoVHpxcVkxbGpZbnBWVEdTbU9LWWxpbkhldFhFaXN6ZnBFRWg2KzBvYllWYlYweGF4cmF1c0pxaFZIN255MExQL3JpS1kzMWc2ZXZsQ0hxOGdyNWV6NzMvUE44L0J2ZkFLVjR4MzMzOFFOdmVaTUFhTm5RTlpsRkxDOVF1WGl1eXZaU0VYdGhSRnNXeTBQdXVQTXVybHk1aWxhRzdUQ3dKWEttb1U4UkQ5aWpveVBwZjN0dThhZldmaEdBY2dZVk84QWFpK3ZGR2krRkN1dTZGdWFPRWhPa1ZNWlFSbk53Y0pEai81RjJKaGt6eWlwc1o0Z3BZU3JwTWlxSkg2S1JmSkNXOWk0RXJETFpjNUFBU0tVMUdJMnVhbkdGdEZRRVYwT1BVU29EUk5EWUdsZlhzbXNUNkJUcFVzSUZkcDIvMllkWGkvdGFMUDFSQTFiU1ViUnB4TFB3NTZEbWNmZkxwQW15bVRHVFJDYmNabGFrOUR2SWdTWUZaMFBQMy8vczUvaGpqejdLZkRiamYvNWQ3K2RYSC9zeUs5ZUJhb1F3TTM2UElJTEM5aEZ4bUo0eXhoam1zeG1IUjBmWXVxYmJyUEVxa0JRTWVEeFJPbzlKN25rUTFhMzJ6NCtwRDFzbXBhUlhUZDg3dFliUCs3M251VzExMDBqbjdjTGExU0N0emJyZDRLMGxrMzMzVldwRzRzcGlWSFdOc29hbzlPZ3FqZCtmczVETGhCZE9YSlZrMzVrWUJNOFl5OC92bnB1VXE1TEhuVkUzMWs0MGFxeDBXcDR0Rkk4b1gyTlRCaVVoWVQxQkdhZEc0bFRnWW93WTRMY2VmNXpmZXZ5YmZQVHQ3eVNaUi9rZnZPY3ZjdEp2MlhUZjVQZGUrQnd1UmN6azg3SW0rZVNmd1BKVlZiRThXRkxWTlc0WXBCMjlpWHZkM1ZCZ1M5blE2VUNtdEtUcFlLZjFBNVVTQ0RlR1hUQmlkQjBud1pXaUhaeDNJNnBZM2lmMzhoUXFkb2hocnlsMWpHbDA3UmdHNFMxbUFFTnBsWk5GRFQ2eEk1bG1ZMnlzcHEwMXNlOHcxc3BreElBT1p0UXVGd2JsQ2hJN3VWOUthV1RXRmxaMFROTFN6VGtITVk1TTNmTCtSSUxBQ0lDZDMyQVhXZTY5Yy93WG4vZ01kdjZEUEhaOXlYMVgzOENEV2tIOFl6eHcrZHY1MWNmK1gvUytaL3JSL1RWTGsrb3VoMEFhQzBlV2pPOVVRQ1hBcnRjcmpOS1RCZGtaZmROL3g0ZktDNXBTa3JNeU1LcitrbVNhd3E2T1FBaVNlcjdkYm9TWE5wK053cVMxa1NhTklUSUVUeDFMN2xwR0hFbG9hNmhuRGQwZ2FkSXE1S29YVFRNaVlDcEkvS0RzV0dzdG1vUXlSa3JONThKU2RWWGhnaGVvTjFxczk3aXdTMHNwZFVabGg4VHhXTml6NEJVb25UQldVeVdEVWxMb0dlOEF2eThFNVNPVDFUb3ZCT1VhT1l3cWNlZWxkL1BZaldNaW5oU0h6R0pUM0h2NS9iejNnY2Y1K09PL2daMmt4b01FNmpBcUUydHFLZlE5bjBNaXA1cDNZQTI2MHRLWnpDVEptZWk2Z2JhdWJsdnM2V0JINUNxN2hjVkhGOUJuMHB5eFpBVmJOWmFTQzE3SUNFM1RqTERwam52bkNSRkNVcmpCczE1dGFlc1pxUVZHVTBlak1CaGpzWFozM0JTTUlvWXdlZ21KaE5LSnloZ1MwajVXVzRzTG5zRjdURjFodlVQN3ZCdXpxeWV0MnBLd245SXU1VXBGaURGSTY1Y2dXa2JyM0JCYmFUQldqQzhiZ1JxTnd1RWttYmJBbWFvd3AxU3VTS2F6YmFCSEUxNGNEMDlNbmtEZ3ZxdnZKZk5kcHZxQm1CU1hsKy9BcTMrZU5VQlJYekpIS2tsM3RNUERRNXFtWWJWYTRYek9wd3llNkRRbWFJelZxS1JCZzdVWkFDb2RLczhYWFNpWGxDMlJFcWpPdVpIcUZId1kvZEdxa3Zaa1Zwa1JudXc2S2QwcVhhNGx0bDNLeG9yYWtoM2pmR0J3YSthTE9Rcy9SK1dJWXRsMUVsTXF1elZ4dGpyRFZoVm9sWThHY1Rmck9wZFV5Zlp4RlNQT08vRWFnaGZvMUR1ME5laVFLV1BzN0EwUk1KbDhrN3VqVHdNclJxZnNwbVpITTJsSUZtVVN0akxVVlNXbDRieFVJUFZSYUZubkExSnE3Rmhjd3VYU2NTU1JDR2wvZDArdlFHNm9kZjdLd05EQndaS2pvMlBtOHhucjdVYVNmSjJNSlJtTjhZYXFzV2hqc1NwaW02YmQ2MjA3VmZjWFhlZGp6NGtkajZEUXQ2MnhrTTg4VzNaZ0xobnJnaWZGSFpseGREMk5acjFaMDIwN3VzVkFWWnZ4d1ZTMitqVTVTU0pHWWk1YWtYSVRDMXZ2RUV6YjFJU1lpQWtxRFBOWkt5M1luZlQzcVh5RmRZUDBJYkNXbE1QR3U4aGRLZEs0UzVPYld2Y3g1WDRIeFNwWFd2Z0hVVGdOTnJPc3VxRW45ZjMrWnkrSVRKWjVMSWJuTUR3TlBIalJHaFA5YzB6Qm52R0tDVjFwbHNzRGpvNE9zZFp5dGw2Skp2Wmk4S2FrcFFGMUVQYzFxaUM5Z3k4cVlEQnRCM2Mremx4K1ArNzZyRFhHNDBIRmtZeFIvT3J5NEpXdHh2R3I3QVl0bG5Oc1hmSE1NOC9RRHdOOTE2Tk1uUzMwNmNMazhHQ1owQXc2YVMwY2d6b0hQdVFaNUVnWW5NTkhPU0tLU3I3b21qN2pic0YyUWxxZWUwckRCbkpoUm8zRzVCS3d1OGJUS3FPSTAzNTk1eW5iNDV5clhiRHZxZXZQY2Q5VndmSkxhenlqTE92K1dUNzU5TC9FS0xzLzlpVEk1Y0hCQVpjdVNhS3YxSGJvcGVGbWxJb3ZNVVVpUVRxTkc0dU9HbXNydS9kQXhVQXJUWXpQSTRIN0wwc3l1Vmdoak81aHlIR0N3alh3ZVFBRkhqWldiSW1oNzNFeFNLTWxiVGhZSGdnL1B3YWM4OElZeXVNUjNxTFlFNUtUb0VmTllJMmxhVnJxV2pwakN4b29wZVczbXkzZDBPZEdVUUdOQkplRXF6ZUpzY3V2Uk1PRU9KWnFuUnJEVXdFWmp3UmpwWmFoU3Fpa0NUNFNsQnlMU1luMktzV3RYaS9wVkNIaDhrVjl6Q04zZmxBczlSUlpEeWNZclRqZFBNWnZQZjZydkxLNklRYmdSSmdqd282NmRPbVlnK1ZTNGpkdXlFU2NYQ2NvUmtMS3pBWVZNU0Zpa3NhYVRCOHVBeXdXZnBuMEtRUThEVWlNUjRWbW5JeWRmU0FMNkhOT2ZFeHg5TkZqakpoa2lQazlneDlHQU9kd3VaQ0NTQ1JDTHJTWW90VGdEVjZPanJadHBWNlF5V0JUWGlTREl1YTBMclJZeGQyMkkrUU9JeEp5bGo5WGxkMzFQTnJ0d2Z4OVlZeEhwK3dYbk4rd1U3d2psdnE4T2tjUmE0c09VbWZKa2xES0NwZFJsWWpxK0cxTXZ4b2todkcyKzc2TE80OGVSR0Y0N01YZjRaZSs4SCtUREtrc1VIWGQ3RmpLU3VvTkNPaXo0T3JWTzVqUEY3Z1lPZHRzV0hmYjNJbE55dnRJYW9NU0ZuWEdYNnhTVXNTNTFMa2RjdUpnYVIxVG1qeGM5UEFBbU4zQ1RwTVlmU2hjK29KUXkrV2RsRjBwU1lvK0ROUk5CY25RVkJackNwNHZpeWxIaUN6Z2NqRm5rYnVRRlFGSXNPc1k2bDNHMklWaWxvSWplQWN4NU9wZjRIeEFLVTJJbm0yM0luamhCb2FZWVZXVk1MbXNYY3puNXV2RitSV0tFTHhVNzlLWjM2QjBybnVVTjZwUk5IVkY5STRZdktRRDdFbVZKcWJJdkQ3azIrNzlFSldwY2I3amk4OThMSHNUbW9SNEh5a2l2cndTMVYrMUxRZUxBKzY2NHk0V2l3TldtdzJEYzV5c3o5Z01IYVNkWms1STRTbU5qRThwSzZUUWxLUk9iNmxyNjcwZnU0ZU1MYzR6S2FUd0Fnb2ZRTEZyaUR5RmpVdHk2WFN5aXFZbzlLMFVkd1dTcTZxaW00QTRwZVVNU0tHSDdYcERXemQ3SWREeVhUNzMzaG1GTDBhaWpxVGtpZDR4YTJ1VTFuUzl4Z1pQNVFJbTErRTlKYUVHSmIwQVkwNDdLZUJUQ0ptQXVkOGFmbi96cGxGUWxTcFZPaElwZHdHWG8wT1NacXRhR2pxNnVMT1BkcGhCNVA0cmIrWGhPOThKd0pPdmZwRVhibjR6bDRYYkdkMHh4aHdReWpXU2xhSnFhcXE2b3U4N2J0NDhwWGVPbTVzVnZaT3NiN0ozVnhoTkkrOGhoRjEyY1BIVHA3dTlUSEE1Qm9wd3JOZnJYU3FYMmhtUjV6dGVUQU5GWVdJVUZtRXgxb0RlVmZBcWt5RUNzQXMrS1NXWkxPZDNZdmxNNlV2a2MzZVNxQ0FaU0ZxWU13WGNNVGxqeGhxcCtKazBXVk50Q0ZGcTYrT3pVR2U3cGhSWHVJM3NNVmtVK1hrZkRwZmZxMUgzVFFOcENqUE9pUUJxa0tMaU94LytNRlpYT04veDFlYy9RZWMzR0Z2dmVWNkY3R0dNcG0xbTh2c1kyYXczOUgzSFp0UGpvdFQvZ2VJNjd4WjlPbStRK3daT0F6eGx4OVYxUFZxdnBVMjZNSEI2TnB1TklINHhVYzJiTVZoaWM1bTV3aklxRXpFMUtpK0NSTXYzN1BIWnVUMFpVMUtkNUpkVlZZMGFhN1BaN0JsYUlTV3dJZ1NGdCtCSytGWlpLYkZpTGFheTBwNHVBYmtxWUJjeWV5amxSZE1Ha3RnRjA0VTRMd0RuQzhxSnRwQ282QlJpRjlzallUSmlHVUpnU0k2SHJyNHQ3LzdFS3lmUDhyVVhQbzFteDhjb0NiU0ZnYTIwWnI1WTVPTTJzTjZzczFCSkgySmZhZ1p4K3pXTlFkZ1MyTmdmdU5xVDBISk5EY1NpdnR1MjJTT1BsTVUvYnhnV294SVlqY3FVRGEwWTB0N2ZpZzhPYVd5TkpveGZJd3dmdCtQNUZYZW5aTUQ2M05kQWVhVFRwdzlvbzhVQ1RxQU1LRk5SNVJiMXk4V0M0QU1sK1ZQRmhCczh6a2xIUTJIM1pqY3dxOU5kckdLU1NFdmFFNGlwQUV5RlJmaURPMDBoMUhQTk94Lzg3OUhXU3dDKytOekhjS0ZISVhtTjV4bkl4bGFTbm04c1NvbDEzN3RTUGJzazg0REtUVGpQaThHZUFKeVA2WmVJWDNtSW92YW5MbER4M3hVN0lHZGFNWHc2Q2VWdkYxMkZ0MGJlY1NDR2pSamZXYzBpUHZDaVhZd3BaVEUzbVE0KzBBOTlqa25JNzRrQ2pJcTdBenFqYkRFcHZBL29EUFBGSUFoaGRKN0tXaGJ6R2RacXJGYWNwUlhPRCtpVU1rSUloYmVZa2lvQjNOdXVLUmRBRmt5TXlxbktMWXUrTTZZalZ5KzlnVWZ2ZkRjS3hiV3paM255bGM4SkV5bEJ5dFhFVklhVVU1SUUwS2FkN2JBRnlNNXRUdlZYakQyV1NtRHIvT0lYb2JKRlpZOCtlMWJUeFNZb083ZW81aERDV0FUU1ZwWDBCS3BLNlJLL1YxK25TRzJWTTFKS1E4U0xCR0hQczhqSDV4N1RTQ2tKN2dRSmFicmVqWDJPQytTOGU3OFFTSldWd3NvcGF4am52SUF6dVJOSDc3TEdTRUVpbTA0WXpHUXVmb3BKTXF2UzdsVmc2WXV1L1dTVDEzaTJ5VUxrTi9Eb0hlL2hZSGFWbENMZmZQblRESEZGWGNteG05UU9kOUdGLzJBTWFKTmpHQmxCWW9jSnBNbUdNbm5PNHFTMjh4N0h3MmNCNlB0K1hMeGk4QlVHOEhUQVpVSExTcTIzYTRGV2M1R0dLVUZpYWtDV2VQeDUwc2x1SGlaWkw2UXhzamZ1cUZFSVpGSFB6czcyK2h4UDFYRWk1eEQ2a2xzbmJWWUg3M0kwVHd2SkpCOVhNUVo4MFFnK1lKU1V1L1haYmloN1hxdGRldlYwU1dWelRKcENwUjE2dWZ2NzdvcVQ1NXhWaDd6NTd1OGlwY2pwOWhwUHZQcTVrZkFpUjh1T1gybHorTnRVTnR1WFpzK2QzRGRBODN4cFNidzV2NGFqRVRpaVNRVzJ6Y2JLZWFQc1BNR2o2enB1M3JoSjlEdXloZGE3enVJRmFKbCthVjNWSkhZcTBIdS9wNkdtbklSeXZvK3VVa3cwVlVXS2tWdTNidEgzL2RnMmRUck9sREx0Q29HazBRSW9kc05BUC9UQ1VGSms2dHIrcmhtL2t4M1VIWk5rTkVsWnV2enZSQUNtRTE0K3M0UFZkMTdBK1N2R2dBc0Q3N3ozSXl5Yks0RGlxV3UvenlzblQyTk5OVTVLMlVCTjA5RFVOYnFxU0ZhS2V1c0x0TkZ0bmdvQ0UrKzVuSlB4MnBJOXFyVEpaV0Z6ZmZra1JoSlptcTNkOWNPUnllL3B0MFB1VEJWMlZUcnlNVEpmekRGS3VBRWpwR3lrakVtWnBHTEJKalZKUGt1N0drWEYrSXNwb1JNTTFySTZPK01zZzFhYnpVWUVvR2lLdkFzam1YZVhFa2xKaWxvM0REU1ZlRGNhMkhRZGZVWTZ5MUtWR0d5SWt0MlVFalIxQTlGbmZoOXNYYWJJbCtIbWlaWXM0L0gwbXZ4dC93aUlNZUw4UU5zc3VIcnBmdDc2d0FjdzFyTHR6dmp5Y3g4VDZEYjc5MXBwYk5OSUJkZXFrdUxPeGhLTjVDdHFjenR4WjNvVjQ1U29pSHBuMUU4M2l3MEpvdFpnSzJ3amZRTWpVbEZOeDUyVnFyUkZJYXJTWjZ2WldBUEpaTlp2RHFzbWNDR3c2cmEwamJRM2o4V1MwZ3BkbEdvQkpaSlVDNHRST0hoYUtYU005RU5QMzNYMFhTZEZvcU1rYkc0MjRvcDIvZTV2bnBRTk5ISXBtVjN1dndSQUZHOSs4QUgrMkh2ZnpUMTMzVTJNa1NlZmVZYmYrUFJuZVByRmwwVUlGR01Ya2hBaVVXa2V2SG9uYjczN0x0cXdCUlFiVmZPbGwxN20yV3V2UXE1alVLWmQ1YUxGYW04Qk1sSlpqalNrYU9NNzMveEJmdmpEZjQ0M3ZPR05KQktyYTQ1UGZlb3IzTmk4aUtrcUtsdGF4UmlxZGlHTG4yTWZLUWVZZEQ3SzlPVDhINyszYkNkeElVWUJtUjRSUlFoc1VGSmVoYnJDYWkzTTNOd29PcVFrWDJLazdxNTBxZEFvWmJCV2N0dUtuenRlV3VOVFRwNVFReTY2dkJ1aWpvSzNoeUJaYno0R2ZBckVqRmVyWEl4aEdEcUd6Wlp1SzJwK3RWNng3cnNjMkJGRFRlb1BlVUtHWHlHemxBQ1hBajRtQnU5NDJ5T1A4S01mL1FpenRwVlM4TWJ3bGplOWljdVhMdkgzZnVFWHVYWjJsZ21zYVp5M3U0Nk9lZGRkbDhHdFJ0ckZUSG5lYy9kVlFraGNPejNaY2YyWTRnQnFmRmlwWm1ia3JBWjhETng3NXlQOGhULzdWemc2UHNveENqaTZxK0g5My9zdVB2WEVXM2oybGNkcDJsWjRDM1ZGTXRJdFJPSU5PY0RFYmtOeGJ1Y1hBR3EwaWNnZTdsaFpxMFJWNWYwMndWaVBOeHJ4NzFNVnBFcEZCb1NzbFFJT0tUZ0plbGlEU25ia3lKVkJPT2NZZ3JCOFVsVDBNWGNZdjAwQUppNFRRYXBpNDRrKzRQb0IxdzFzK3pYOWFrTy83Vmh2Tjh5ck9ROHRIa0hQSzdaeHpkZGUvVHFyYmtOU0NvK29PcCtQSDJVMHkvbVNTMGRMRm9zWlAvaWg3eHBEcE9YeTNuUGw4bVYrK0x2ZXh6Y2UrK3ArT0J4WU5pMzRmdStNVFFtVTcvZzNQdmo5M1BXT2o2QlNISDE5cGFWc3F5Ny9WM3JNa1pnS2hkRW1sK1hkZVVReFJpNGRYK0hmK0w0ZjQrLzk4dCtnclZzeGR2UENKNjJFektFem0yaGlPRS9IZlZHa1VTbjJqTzd6NzdNeFJla2Ftand1SlZ6YXVYMlZTZ3dCcVFsdURIMUtCSzFKMWtpVUR6VVpoRWpXMXZVNDVMd3NRVzVkWENoeTVoQktsaXdHYVJYcmhRN2xNaGRnMkhaMDNaWmgwN0hlckhqazBrUDhxYmY4R0E4dEg4R3FpajV0K2Z3cm4rZnYvLzQvNFBtYkw3R1lMN2pqeWlYdXZIS0ZPeTVmNHNyeE1RZUxCWWZMSllmTEpWVkczQzZhblN0WHJuQjkxbzQ4Z25LRmVER0tGbU1nYkc1eXoxMFBFY0s1MW1XdjVSOU8vbGppOHhmY21UdnV1b0tkTnloYnljNkZURnN6WTBlWGdnZnNIbUUvUmxHZWN4U01mQzZmZDBkSEwyQUlIb3RoMi9kc3VpMmJic3N3T0RBS0d5cnFVRk1aSTZYaVlpNzdrTTFQblFWYkt6R1loaFRvVXFTTFhvUWdqM1JQQUlxUEg0TGtxZ2N2YldHSG5tM1g0WWNlMXp1MjNaWnV2ZWFvT2VEZmV2T1A4WWJsbXhoQ1R5Q2cwTHovNmdlNS9QMkh2SGo4RE1kSEI5SmlicElzT1o3TnFwQkNMMTZUMDgyRzU4ODJtZGl4bTdPcml3VTJoZHZXVkNsTkh4TmYrc2JuaWNHVG5kWnpGclpRMzFLeFFaTFlCeUVFSHIzM0xSd2ZIWk11a0phdTkxRFhZT3JSOVVRSi9XeWZxYVgydXFaTk1mNGlBT09aSDVHdHFuWjB2Nm0zWmJzZ0xMUFRic3ZKMlJuYm9XYzc5Q1AvM1ZwTFpTeHpXMUViOFkrVEVpUE9wMXpnUVVuSHNNNDd0c0d4alk0dUJ2eEVBRWJIS0dSTFBRUlVCT004b2V2WXJOZDAzVmFLUG5tSFQ0NCs5SHpYbmQvTnc0ZVBNUGgrc200Smx4d1AyamN3dXdxKzZTRXcxalhjOWowdjM3ekpDOWR2OE55MTZ4ek5XbjdvZmU4ZGkxS0Q1Q0I2UC9DUFAvMTVQdnZONTZXQ3RncWpBSHpnNFVkNDMrVVdIendUdTU3SzFuenk2U2Y1L0NmK1EzRmhVM1lOVXhwNytJN2g4ZXh1cWt5Vkl5VSsvQjAvd3AvN0V6K1ppejlNRWtzamZQNXJYeUNwQ3JRMGpFUWxkTktrdEcrOVg1UVRXQVN3b0k1RkFIU0d2S2VmbjJJVjlpdlBQeVVEellQMjBSTzE3R2dURXpaRXFwdzRncEVnQ2lpQlpXUE0yYmVCM3ZXc2g0N2VCL29ZR1ZJaWpnS1FjdjNlUkJ6ODJFS2U0TkF1a056QXR0K3c3YmZNMUl3NzUzZnc1dU5IZWRmVmQvTEdvNGVKL3VMdGEzekZDeTlmNS9uK0pWNTQ5UVpQdi9JS0w1L2M0dWEyWitzRHZROXNlcytpYldqYUdSOTg4Nk1zWmtKTHY3VmE4K3RmL0NwZnZyWm1kdm5LWHRkT3BSUlB1TURkekxpdkNtZ3ZTU3ZSem5oTzF6ekhkUzdkZFhYMEFRUzRpbE5NSnFQWjBta2xLdkVDWWd4ODV1bmY1ZDVQUDhBSDMvRWhEcGFDL1ordFZuenlTNS9nTTQ5L0VxVnlMMlpBNTdxS1JMV242a3N0NVBNSTQzU1JSeTFRdWpHa3RLY0Z4dmpDLytUZit4K25vSGJKUzFOZ28zUzJycFRob0oyeGFHZk0yMWE2akNGUTZkQUxzV08xWGt0UUp1UjZQeVM4a25OVXh5VEZKSDNBYlR1Y0d4aWNrRFdVY3pSUjgyQnpOMjg4ZUlSSER4L2gwYU5IT01pQkVSQ3lSa2o3NTZaRzBlbU9mL2QzZm9ZdnZmb1VsUlV3cW0wYnFsb2FVaFdQUldtTjFacDMzSDBYOTF5NVRFcUpwMTk1bFc5Y3Z5V2N3bnlVN1NaWjNFSnJMUGN2bGpTRFZCTWRtaVV2ZGh0aWNxaUozWi9TRHJuY2lXZkdJVkNFbEt1d0ZIQXRLTjU0OTF1NTk2NTdRY0VMTDcvSU4xLzhtaFJzc0phZDZUZ3BoSlh4ZlpRRXVRVEgydGNBNTBFcGxjR3Vnby9zZ1YxNUxOYkgzVTdkaXp2bkQ2YVlRQ2M2NzFDRElobEZSWTZQSnhoaVlEUDBiSjNEWmNNcGtqQm9McWtsbGFybzQ1WWJ3d25kMExOZHIvQ2RZNkZuM052Y3o3dXV2b20zSDcyWnkvVXh5M3FCVVpLUjY2TG5abmZDczJmUGMybCt5TU1IRHdxakdJbUoxOXJ5MzEzN0xDK2JnVHZ1dlYvbzZOWmlqRWE2NGUwTVZLc3JRUEdOMVpwdm5Ld0FPUUtXQjR1OFhYZnVuMHdjRkxYL1hMOUI2VXFzKzl5MVF5TXFXcFhQSklrWm5EZXlWQW5IQnNSdVFzdjdkT1FyTDMyWjMzdjI5eUNWSFA1RzFIMVVJLzFkS1pVTnVDeFNGNE9LdThWbVh5aWcyT0g3R21ONlRGaGxEVlA3OTd3RUdXTnlKNjNFWm5EMEllNUtvbVEzWjNBOVF3b1pmWU9GbXZHOXpidDRaL01HRHRTY0crR1UzN241ZTN6aXhoZDQxRHpLVys1NW1EY2ZQc0tEeTN2R0JTL1g5ZTFOdm5MejYzengydGY0M0t0ZjVpczN2c21qVngvZ2YvSHQvdzd2dmZ4T2FtbzJiUGlYcTgveHo3dmY1Njc3NzVGYXYwd3NZQ1FCVktlWVZYdVpHREZtODNSS01XZWdGSUtNR2N3WktlS1FtenptSmxaSlUvclZ4TnlkRXpYWmZSUERMdVk2U2lrbERGWUNUc2lSbVl5aHNaYXFTWkphRitMZUhKeGYyS2xCVytJT2Y1UnI2Z21NQ09qLzlILzd2engza01oUk1PNmdFb3BrcCtyMmJraVNTRnJlL1RZby9zM20vWHlnZVJzK1YvYlZXV0hlNkU4NHJKWXNxdGw0ajg3M25BeW5mTzNXay96T2k1L2xxemNmNTVYdGRjN0Noc3BXdE0wTWJUU0hCOGZjZi93Z2Jic2sxSnFYM1UxQ2pCaGpwV1Y5R1R5QWl1Z1l4ZlpBenVMQ1hKNUdETXRsbEFqeVZFMmVEK2hBRm9DeFN0ais1RjZFczh2R25mQWxVOEtuT0tsUW1sVjJTRGtaZHRJNENqQTVFbGxTVjhZNFF5azl5c1VROFBTS2FWZEIvVHdsUGFXRWhYT3grbkllbHJTbFNkQ0VsUHNIajNjUUZlanorZGNIeDV2MFBieTllcGd3bG5VbUYzWlYzTkZld21xRGk1Nm56bDdrS3pjZjUwczN2czduWC8weUwyOWVIYk43bXFibHVMbURwbW1vNmxvYUsxdkxDNXlpL0JhamFxeVNjeDNFV0NvTHZIdUl6QXBJaUQwdy9pWDdJMHFOajZYUStZd3R0WTkyc0s2YVBMK2doV0w3Wk8wOFdZZ01GS205VVl5WVBrcmNhSk0wUm9HT1FRem9yT0xUNk4rbjNXY25FNzBiUmpyM0JSZjhQRm1mNmJYdlNzcGxweW5GRjM5V1hMN2RaTEIza3dTZ05DRkVPdWRvYmMyUldkQ2w0ZHo5RWdyTlAzMzJ0L24xRno3Tk02dVhlTEc3VGtpT3hsVE1qa3FKbW9hNnFUR2xlcmlSc25MS1ZwQlVadmJrTk01c0dLVko5eXk1ekdpZkM0Q3hROHVtQzdTWHhZd0kvU2dFNXladDkzOXh6Nlk3YXVkV1hUQTNNb1Y1TXlSTXhreUt4T1JUcENnV01STHpzNDJBajVLeHlYRFRYcDFwcFM5YStkM25LSTI1WGtOVDJBdC9PN25PUDB6NU4wNVVYbW5pQ0lwTkdsakhEcXNNMHpOUm96anpHMzdoNWQvaTY1dG5hT3FhZy9xUXFxN0dsak0yTTVCSDFvd1Y0a091aGl5N0ZqVXViM25LQzg5UGVlcmJmMzFPclo5LzFtTDNuSGVweGwyVFphM3dINmJIeHZRN0JHL2ZxV3FkaTQ2Vk1xODZKU2xjclpUMDloMmJRRXRnaTBSKzdnSTN2NzZxZjYxbzROVG52KzFaQUtzNEY4eDVqV3YzbnFJT3g0QW9LamMyYm16THMvNDZUN2lYZUVmekVFUGFXZTJWc256bTlPdXNLc2RkbCs2a3NwVmsrRnJKejlQR1pNMjcyMzNDRDlRanNpZjBxTnVYKytMaFgveE1JdzF0Ny9OeDhuUHhIdVFwbGRxaGU3dGRYZ0FaaTlhbGhzQXVQMSsraC95WkhEVlVTYXpSN002V3lpUmFGYXQvVjJTaUhFTXhSclI1ZmFGOXZldTFQck1YRHY1V2JpUVRQSzMrTVlFYUUxVDVYNjBVam9GZjdqNkRVWnFIN0ozTVZjTXFiZm5DOWdsK2RmMVo1b2RMckJKQXlSb3JHU3JzYTVReThSTHVMQThoVlVERzJ2aVRLOGJkeE8rUCtWdWRsTnNGUW5iZDY3MnZmR2ZCNk5Oa0hEdStIeG1JeVpaR3pzaEpPOEhLcDZyT1VWUHhyalI3VnVZZmZ1MWY4OW5LNzRxbFlhZHE2alZ2a2MrbWlUK1NCV0RjQy9KcmJUQ200WHBZOFEvNmovUGdjQWRMMVhLU05qdyt2SWliSnc1WmpQY3RybVNTTDdndFEzbTYyMGg2ekFRNnI3RXlFbnZoZFJzd1FucE5kYm5idmJ1ZE8zbkgrTHhLRmFHRG5TQ2tNU3RJb0hISktpcWRQY3A3ZFdGeFphTlJxcUNBVGpzQklFYklXazhxZ3BYNU9HOWgzdTcvMzY3Tnl4RTVHYWVTNHRvbzlhMXBnUElGcjNlV2xNdG9TZU1lWXVCTC9obEFOSU94aG9iNnRzK01HWGpuRnYvMkFhUlJFNTEvMk5jNzA3L1YzNThQdHBTZmJ3TllYdWV6MC90TFRxUUhkYnZyQlRzQzZUaXZjcVBiczZ3RVM2VVFiaUNMYVRrdVVuSFRjNWxkNHUxRFZGbkRLaldLUVhtVC9WYk8vNHNlOUxVbVVWeElBWGRtdHRuNzNFWFlkY3c3TDZhTGQrYitjNXkzeUc5ZnFQUFhiZWpjNjN6SDlLeTlDRnFWTWJ6TytOUitpbmt4OXFjQ05iMm1peDF6RGF5Q1hoYTBUc05lNEVmclhVR0w2WmgzNDk0bG9xVGlsNzdHV3FXVXNOT2QvWWNSaHRlN0ZHcU1YNy9XTlU1dXp0dFBGOFpyenc5YTdqNjloL3orWDkvWWQ5LzFXaXIxOW95bGk2NnAwYnd6SlBmSE9vSk5Xa2d6cUIxZnY3elhUQlorekNkZ1h3QXVHdnMwNUl1NjJJalVXbVBMMmZhdmV3Sy9sVXV3N2ovTUIyN1hBcTgxN3Vray9GR2U3Zi9YK1RqdmJVelYrdm43YTZYQjdMOS9pa2FXeGI5SUFDN0tRNWorZlA1N3o3L1BwcjMrYS9DSFc1RS8ydlVIVGU1cnErbUwrUGl2Zjc4L3FuYTQ2TGdUamZXdEcrVVgyU3JUWStoMkEzVVhyaTBDTUVMRGFwY3NPNXB6ZTU3VDdmYzdqL3RQRTNQTFpkbkRBWXB6d0FWUCtZZnhSVjU3d3N2WmVKc2VWY1ZTbmFxM2kyNDcrWndxOTdsZ1ZiN0ZOZitEN0pxTHJteUw3ajlDM3BtN2Nhanh2YmNmSXVVZStTWVhZQlBqMk5LNU1iN0crRjlQRTA0MXlXaDQ1anZadlM5T3UzK1Uyci9oU0c3OEF5NTVzR2tKNXR2L1h2emYwVWdaMS82Y3AzRnU5NTZuVVkyMS9DNXc3UklYSHkvVDNYZ1J3REpWdmVWOTVmZjdVRGk3WjloN0h4UERxNHloaEtxbUVjUDhyOXI3M3dRK3p2ZUxhUmVQbWJDQ3k2aW5SOXdmNUIxTi94NXlJTWYrVVZYazYxMnZaYzZkUDQ4VFpOOStoMWVmNTdSTlAzdjd2ZjYxRHZ1UGRMM1dtVHVORDV5bnpsOTB4QldyL1h5VjFsUVFSQ1hzNExKWjFPVDdMc3BKdkdpTSszWlJKb1JNSzJEdE50NU9IZi8vODNxOUlNejBkeGNWVzdwTmlQZjE4Yi8yYTdweFhtdW5uZi9kTk0zN3RZUmcrcmZ6Q3pmTllpcWZMdXQzbnZyOWVtTlRhaGRQK2Y4QyswcGo1M1ZKa3hBQUFBQUFTVVZPUks1Q1lJST0="}} \ No newline at end of file diff --git a/sleap/skeletons/mice_hc.json b/sleap/skeletons/mice_hc.json new file mode 100644 index 000000000..1931f8166 --- /dev/null +++ b/sleap/skeletons/mice_hc.json @@ -0,0 +1 @@ +{"description": "Template Skeleton for mice_hc reference dataset.", "nx_graph": {"directed": true, "graph": {"name": "Skeleton-0", "num_edges_inserted": 4}, "links": [{"edge_insert_idx": 0, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["nose1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["earL1", 1.0]}}, "type": {"py/reduce": [{"py/type": "sleap.skeleton.EdgeType"}, {"py/tuple": [1]}]}}, {"edge_insert_idx": 1, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["earR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 2, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tailstart1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 3, "key": 0, "source": {"py/id": 5}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tailend1", 1.0]}}, "type": {"py/id": 3}}], "multigraph": true, "nodes": [{"id": {"py/id": 1}}, {"id": {"py/id": 2}}, {"id": {"py/id": 4}}, {"id": {"py/id": 5}}, {"id": {"py/id": 6}}]}, "preview_image": {"py/b64": "aVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUlBQUFBQ0FDQVlBQUFERFBtSExBQUJWQkVsRVFWUjRuSzI5MlpObDJYWGU5NTNoem1QZW5DdXJzcXE3cXJvYjZHNFFJeHNETVZBUUJaaWthU0pDMUlQTUNObldDeDBodjFsL2dNTVJmdkNEM3h4K3NoME8yeUZyc0J3S21ZTW9DQVJBREVSallzOFR1bXZPeXN5YmVlZjVUSDY0K2R1NTdrVTF5QWVmaUlyTXlyeDV6ajU3citGYjMxcDdiZStQL3VpUHN0bHNwaXpMdEwyOXJYdytyemlPMWUvMzFlbDBGRVdSc2l4VEVBVHlQRTl4SEt0VUtxbFlMRXFTa2lSUkZFWHlmVisxV2sybFVrbWU1K25SbzBmS3Nrd2JHeHRLMDFUeitWeFJGRW1TS3BXS2dpRFFZckdRNy92eVBFOVJGR2s0SEtyUmFDaWZ6MnN3R01qM2ZSVUtCVTJuVTRWaHFNM05UWVZocUNBSWxDU0pGb3VGeHVPeGdpQnc0NDZpU0hFY3kvTThiVzV1YWpRYUtVa1NWU29WeFhHc05FMGxTYVBSU0hFY1M1TEc0N0dpS05MQndZRzJ0N2RWTEJZVkJJSDYvYjZPam80VXg3RjJkblowZUhpb1hDN24zdWZvNkVpZFRrZEJFS2hRS0toWUxDcE5VNTJkblNsSkVqZG5sVXBGa2hUSHNYWjNkOTM5SldteFdDaUtJalVhRFUyblU1MmRuYWxVS21rd0dDaE5VOVhyZFlWaDZON1g4endGUWFDN2QrOHFuOC9yeXBVcnl1VnlpdU5ZY1J3clNSTDN6RXFsb2pBTTNYdFBKaE1kSFIzcDVPUkVZUmpxOFBCUW9lZDU4bjFmdlY1UFFSQm9jM05Ua3BUTDVSU0dvZEkwVmFQUlVCekhldmp3b2ZyOXZuWjJkdVQ3dm51d0pGV3JWUlVLQmFWcHFpaUtGQVNCeXVXeXdqQlVsbVh5UE0rOThIZzhWcUZRVUJBRUNvTEEzU3NJQXRWcU5SV0xSUlVLQlkxR0l5MFdDNlZwNnA3bGVaNDh6MU9TSkJxUHgwcVNSTnZiMjVLa05FMDFtODJjOElSaDZKNDdIbzlYSnJCYXJTb01RL20rci9QemN6MTQ4RUR2dmZlZWU3OWFyYWJoY0tnb2lsUW9GSlJsMmNva3oyWXpCVUdnUnFQaG5vVkM1UE41OTI3SHg4Y2FEQVpLa2tUNysvdnVmUkdJT0k3ZFBFZFJwRnF0SnQvM1ZhbFUxTzEyTlJnTTNGanorYnlpS05Kb05GSVVSYXBXcTFvc0Zsb3NGazZnUGM5VHVWeFdyVllUMTN3K1Z4QUVLcFZLcXRmckdvL0h5ckpNV1pZcDVFUFQ2ZFJKU3JWYWRVSXduOC9kWW0xdGJia0ZDTU5RdVZ4T1daWXBUVlA1dnU4MFBJb2lUYWRUbGN0bCtiNnZMTXVjcHNkeDdEU0dSVS9UVkdtYUtwL1BLNS9QS3d4RFZTb1ZGWXRGblo2ZU9tMlE1TzdIUFF1RmdncUZnck1pV1phcFVxbW8wK25vNU9URVRVS2FwczZTNVBONStiNHYzL2VkY0cxc2JNanpQSlZLSlVWUnBINi9yOGxrb2lBSWxNdmxuQUFpQ0lQQlFKSlVLcFdVWlpsN1JoQUV6a3A1bnFjc3kxUW9GRlF1bDlWb05KeVFTTkpzTnROaXNWQ2xVbEVVUlpyUDU4cmxjdko5WDBtU2FENmZPd0VwRm90S2trU2owVWlUeVVUTlpsTzd1N3VTNU1hNVdDeWNwVVdKNGpqV2REcFZQcDlYcVZSU3BWTFJ4c2FHczdnaGsrbDVucWJUcVk2T2psU3RWdFZzTmpXYnpUU1pUTlRwZEZTdFZsV3RWbGNXbndIbTgzbTEyMjAxR2czMzRGS3A1QmFOQ1pMa0pMRlVLam1oUVBvOXo5TjhQbmNUTkpsTU5CZ01kUC8rZlVuUzV1YW1OamMzdFZnc05Kdk50TGUzNXhZTzRVQkFQTS9UWkRKeFkvVjlYNDFHd3dsUHI5ZlRZckZRcVZSU0xwZlR6czZPd2pCY0VhWTBUWjFHVjZ2VkZjR3IxK3RPYVZocy92SE9TWktvV0N4cVkyTkQ5WHJkaldPeFdLamI3V3F4V0RoTGkxVmhzUmhmc1ZqVVlyRlFITWNhRG9jYWpVWnV2S1ZTeVZsVkJIVXdHT2o4L055NUt0NEJLMUF1bHpVYWplVDcvbEs0am8rUFZTNlh0Ykd4b2Nsa29vY1BIeXJMc2hVL3pJdHpnL2w4cnRsczVueC9McGRUdlY1WFBwOTM1aExOd0dRaW5Vd1labERTaWhBZzhRaGtyOWR6Zmd4VHlkL3dPZndlejFrc0ZrNGcwalNWNTNuSzVYSXFsVXJPN0U0bUUrSCsydTIyOHZtOG1zMm1NK1ZXYUhPNW5OTm1McXdja3d6Mm1VNm5LeFlQeldVT2VYYS8zMWNjeHlxWHl5cVh5MHFTUk4xdVY5UHBWTHU3dTZwVUtwcE9wd3FDUUsxV3l5MWlzVmgwV2x3dWx4WEhzWEs1bkNhVGlTcVZpdkw1dkU1T1RyUzl2UzNQODFaY3hIUTZWYXZWVXFsVVVwSWtLcFZLQ3J2ZHJxclZxdXIxdXZOcm1BZE1sOVVxRnB3WHhnVVVpMFhuVXhFTXREQkpFc1Z4N0h3YWJpYVh5N25KQklqeU0vNW1jM05UVjY1Y2NZc0t1T0psMFlEWmJLWWtTVFNaVERTWlRKeGZuazZueXVWeXpvOWF2NHRHem1ZejUvNzYvYjdETTd6TG8wZVBGRVdSTmpZMmxNL25sU1NKVGs5UG5Rc1lEb2NyWUxCV3E2bFFLTGlGSDQvSEs4SUNGdUgvYUhldjE1TWt0eGFUeVVUMWVsMlZTc1c1aDBLaG9GYXI1VUI0THBkelkySWRybHk1NHRZTGF4eEZrUjQrZkxnaWxNVmlVU0VTbGN2bEhNb2VqOGNLdzFDMVdzMU5HaVlFRTRkV29TMEl3M3crZHhaaU1CZzRZQk9Hb2NybHNxSW8wdm41dWNJd1hFR3dhRFAzNXg0SVo1cW1Hby9INm5RNjZ2ZjdrdVN3Q2M4ZERBWk9veWFUaWVienVjN096clJZTFBUMDAwOXJjM1BUV1E3Y2hTUzFXaTBIWERjMk50UnNOaDJvNHJtZzlhMnRMYzFtTTdYYmJXMXZiOHYzZmVYemVhVnBxa0toNExBTEpoWmdXcS9YVlNnVTFPdjFOQjZQNVhtZVdxMldpM3BtczVtYXphYWF6YVp5dVp5R3c2RlRQakFKZ2pPWlRIUitmcTU2dmU2RXRkVnFhVGdjYXJGWWFHdHJTMkVZcXRmck9WdzBuVTYxczdPalZxdmxYRndZaGdwcnRacW0wNmxHbzVIemdkYnNzVGhvSk5JMEhBNmQ0TEJ3VEJUK3I5ZnJLVWtTYlc1dXFsZ3N1c1h0ZHJzNk96dFRQcDkzSVJMbU9rMVRaVm5tTkI3ZzVmditMeTIyRlVUR2gyRDArMzJkbnA0NkM5UnV0MVVvRkZTdFZoM3dSSGg1ZHFWUzBmNyt2cXJWcXZMNXZPYnp1UU9KazhsRXcrRlExV3BWazhsa0JYUDR2cTlxdGFwU3FlU3NFcUdsSkIwY0hPanExYXR1b2Z2OXZyTmlBT2xtcyttaWsrbDBLdC8zdGJlM3A4VmlvZVBqWTgxbU01VktKUlVLQlQxNjlFanZ2UE9PYnQ2OHFhZWVla3JGWXRHTmVUd2V1M2taalVicWRydE9PSGQzZDEya3hudUV6V1p6R1E2RTRVcWNMc2xORWo3YkluN0F4WFE2ZGRaaFBwODd3QlFFZ2VJNFZxL1hjOGcrQ0FJVmkwVnRiMit2bUVlQURoT09yMGR5SmFsY0xqdFREdEp1dDl1cTFXcmEzOTkzaTQ4ZzV2TjViVzF0cVZLcE9FdkI3MjFZNm5tZTR4QmFyWlpiUVBEQTJkbVpwdE9wV3lDcnZjVmkwZUdDS0lxY0pRQ0orNzZ2N2UxdHA1R1NIQyt5V0N4Y1ZKTEw1Vnk0RzBXUjAzUmNHQnhOclZaendIVTBHcWxjTHJ1NUFPdUFRNGhpV0w4Z0NEUWNEdDA3RTNXRWdEYUVnRkNHQldEUjBVWUdsR1daQTRsUkZEblNhSDkvMzAxNHRWcDFnb0lsQVFnUkFscTNBZHExcG8vblpGbW1xMWV2dXZoMloyZkhnU2ZBYWJmYjFiMTc5OXpFdDFvdGh5dldvd0tzRFJaanNWaTQ4TkFDeDBxbDRpellZckhRMGRHUkZvdUZBMjBiR3h0T3EwRDMwK2xVMVdwVjVYSlpoVUxCQ1JqS0JTaERnUkJJd3NUaGNPZ0VaVGFiT1NzRGVDd1dpN3A1ODZhenpPQ1l5V1RpSWdJNENzZ3hua2xZNnJDUVhXaWtBMmxFUy9nZTRxWFJhRGdRazgvblZTd1duZWJrY2ptTngyTkhSdGdvQXRjUXg3R0xGaGhZcFZKeFlRMFNDbURKNS9PNmYvKytack9aYnQyNjVSYXcyV3lxMSt1cDMrODc5dXpldlh2YTNkM1Y1dWJtQ2lIRXM1a3djQTI4d0dLeDBNbkp5UklaWDN4K05CcTU4QXBYQWRBY2o4ZUs0MWdiR3h0dTNKMU9SOGZIeHpvN085T1ZLMWQwOWVwVjl6d3U1aElpYTdGWUtBeEQ3ZS92Ty9jS2c5ZnI5VFFZREp6Q3pHWXpkKyt0clMzZHYzL2ZFV0hUNmRTQjJYSzU3QWd2ckhPeFdGUVVSYzRxQUx6RDJXeTJFdUlBdnVJNFhvbGRrUmdzQmVnVGtpU2Z6enVOQkRBQnJMZy9vUXhNR1RoaE5CbzVNQVMxREw5QXRORnF0Und1Z0VPQTBjSjl6R1l6SFJ3Y09JM0cvQ0dZZ0NrbzJ5aUtWQ3FWbkYvdWRyc3FGb3NPS0EwR0EvZitXRUxDWDZJUXJNWm9OTko4UG5lRUQ1ekliRFp6K0dvMm03azVoaWdEc0hML0pFa1VocUdMQ2p6UDA4YkdoaVRwN3QyN21rNm5ldXFwcDlUcGRQVEJCeDg0NWhiaGdnanpmZC9OTlVJM0hBNGRKcGhPcDB1dzMrLzNuWm1Lb2tpRHdjQkpkejZmZHlZRGExQXFsZHhrb3hFMkRzZjB6Mll6QndMeHc1Z3g3c1dna3lSUnY5OVhvOUZ3OTVQa0loRGY5NTNQNVlVUXVsYXJwVUtob1BQemN6VWFEVjI3ZHMxSk56NGF2d2tKVTZsVW5LWHI5L3R1OFRZMk5sUXNGbGVBTFNZYUlNZzc4Zy9RMVc2M05aL1BuU1hMc2t6dGRsdEJFR2cwR3FsWUxMcFluWVhCMGd5SFE4VnhySU9EQTAyblU2Y0VVTGUxV2sxMzc5NVZ1OTNXL3Y2K2lzV2k3dCsvcjNLNXJPM3RiYWZwa2h3Zkk4a0pnWFYzRmd2MWVqMkY4TWNrS1BMNXZBTmVNRldBRlFEWWZENTM3b0FrQ0pJYWhxRWpIL0JkbUx0aXNlaklHRUt4YTlldU9YS0VRWVpoNk1KQ0VDejNBcnhFVWVSOE5IeTlqWEV0S0JvT2gwN2ppU2I0T3B2TkhBbDBjSENnUnFQaHJGYTVYSFlDWU1lR05RTUFTMHZVVDBpSUc4VFNqY2RqdGR0dEY2SmxXYWJOelUwRlFlQm9YQ3lFdGJCRU4xbVdxVmdzNnZyMTY0NGpRR0FKc1h1OW5yTXFBSFhlRVVDSnhaclA1NXBNSmt0dUJNREZaQUYyZUhFbUZoSW95ekpINGxqM2thYXBoc09oa3pvbUZtMGFEQWFhVHFmT056RklCQWlKWmZIdzg3aVNYcS9uc3BDWVVqUTVpaUpuaFlpRmZkOTN6OE5NVytIbHZYQjlsdlBIbE9LVDBSb20wYUo0TW0vUTVEd0QvZ0tzWVhFUC8yQVROelkyVktsVUhGNWdQV3lPb2Rsc3FsQW9PTmZBV296SFk0ZTFDUHVJbUd6eXl2cDlTS245L1gyRlNBUkFnd1VtWnVhRnVRR0pobks1N016WmZENTN3Z0txWnJBSWxiMXNOc3R5RDZCK202aUIwQmtNQmlxVlNxclZhdTR6czluTXVRbDh0VTBIOC9LTlJzTng3cFBKeExtSFdxM21jQWtFRmJrQk5BK054MVVoVURCNGk4VkN0VnBOOVhyZFJRZTlYcytCWUd2cUVUQk1zRTMzTW5iQ1RDd3lycFg1UFQ0K1ZwWmwydDNkZGV4bmxtV096T3AydTVyTlppcVh5dzdRSXRCUTFqQzVoVUpCNFhRNjFXUXlVUnpIYWphYkRzeUJKREUzYUtza1I3V1d5MlZIQVdkWjV1SlNpM294N1VnLzVnMk5HQTZITGdGaVRUUCs5L2o0MkpuV1lySG9mQ21Uei9qSlE2Q04wK24wa3UwS1hkTFRqUUczWmFsVVRHT3RWbk5LWVlVS3dlSWRzRlpZRTF4S3Q5dFZ1OTFXbG1XNmN1V0s0d2F1WExtaVdxM213Q1NNSnVFd1FsWW9GQnoxR3dTQnB0UHBjckV1c3FTTW1RdUIyZC9mVnk2WGM5R0xGWjUxMTRwQWhwUEp4Smw3ekNwU1F6eVArZWNmazQ3NXM1U3dmUkhpVDl3QWVDSkpFaGZyTnhxTmxXaGgvVDZZT3JLSStYemVJWGs3Sm9TVTUxaGhRMEI1ZGhpR0xpZVJwcW5qRnRJMFZhL1gwMlF5Y2FDUmR3R3BFMEV3dGxxdDVvUkJXcWJWTWNPRWw2ZW5weHFQeHpvOFBIVHVCSUcyU1M1K0JvNGlocWN1Z3VmZysxRkVGcnBRS0tqUmFEanR4cW9pdUZ5c1lSQUVDa3Vsa2l2YzZQVjZqckNBOUpIa2tDUm1GUjhNcUVDQytiMHRUbUJpcDlPcGszNzcwbWk4clR5eUUxS3IxUnk1QWwrT1dXWHhBVlkyL2NtOWJHRUxKcHgwc09jdHE0YkFDSUJSd2xJb1pjc1oyTnc5NDBPQVNVcVJWeUZVeENLUjZtWXVlUzd6eEQzQUFwQlRDSklrbHhBQ0dQTlpvcDJ6c3pPbnNCQkZQTStDOHJPek03VmFyU1VHQUd3eFdQenFhRFJ5bkVBdWwzTnVBY0REeEJDclEvMk94K01WWUFSb3NqNmVGNWJrQm9uUGhpT1lUcWRPRXhBa1hBOUVVUzZYYytFZUdqTVlETnp6TmpZMlhGZ0szODhrRWpPakxRaHpyOWZUK2ZtNTR4TlFCQ0lZdm9jQkJOTjBPaDNOWmpNZEhoNXFZMk5qaGVVa3pFYnpjR0VRUVJCaXVDdG9lYXd5S1Z3YmRXSFNzZDVKa3FqVDZXZ3dHR2h2Yjg5UjJ4WURjRzhBZTBqeUpvNWpOUm9OVmF0Vk41R0VUYkJkMWxkWkFnYW1DZnpBNEVERUpEZElUektKU0tpTk1BQ1pXQTE4TXFhTmNxbVRreE1YQ2hLbG9PMW5aMmVPeDBpU1JPZm41ODRVTnB0Tmh5TnNBUWJheUlTeFVMd1hlSUNmSVdDa24wZWprWWJEb2VyMStrb09BcURXYXJVMG5VNTEvLzU5UjNwWkMyZ3BheFlKVElJN3NmUEl2RUhvb0JDKzcydDdaMGZiMnp1cU4rcUtMbGhkRkZtU0UrcDhQcSt3MCtrNDZVY3FoOE9oQTNYNFBhVE9adXlJWGZGL05rVU1YVXJvUVY0QWtES2Z6MTE2VnBJRFVreG90OXQxeElsTnBtQ1NZZmFtMDZrVEdNdld4WEhzY0FKK0daS0UrMmRaNXBnOTJEWXdBaUZjbG1VckRLV2RLNndXMW5OcmE4dTVKOGFicHFsakJ5ZVRpUjQ5ZXFUUmFPUmMzTzd1cmhOY0ZnaUFlSHA2NnRhQWQ2S3FpWHNqMkZtV0tVdFR5ZlBWMnR6UjN1NzJNcFU5bVdzUlh4SnJ1SFNJc0hCalk4UDVQbndPSUF5UVFqNTduUklHK2FLNURJZ0ZwZWdBcGhIelRyZ0NBQ01CaFY4bk1VUU5BUlB0Kzc2TEdzaWJ6Mll6UFg3OFdHRVlycVJVS2NKQUtLYlRxZlAzbU43ZDNkMFZLOFg3a3BIRXNxeS9zd1c2dytIUVpTbUpSTGduQ2dXR29aaG1PcDFxT0J5cVZDcHBmMy9mMWZyQis2UDlwSmpSZUN3VVFJN3FxdVhQTWtWSnB2MVdWYi8vOFpwZXVKSXBqV1BkNmViMG80YzFkZWM1NVhQTEtPdng0OGV1VUNSRVl5RTVySStIcHB4T3AwNTdHSnlkRUV3NS9wMDRFMXJYUmhsOHhVcll5bDJ3QVBHcXpVVXc0VmJEY0RuZ0JNQmxxOVZTcTlWU3Y5OTMrWUphcmJZU2VWaVNDMFlPbCtaNW5xdE81bjFoNlN5bkFZY0JKd0t3STN3R0VDNFdDejErL0hpRnVZUGFSb0Z3YmJaUWhUWGdId0tKTDJmc1FSQm90bGhvbytqcG4veTlBOTNjelV0Wklzblh6UjFmbjdubTZaKzlHZXBvRkNnWEx2TXFWNjllWFFvNnlCTCsybVlHWjdPWm8zeVBqNDlYQ2tENERINFp6U0dNc1dZTkxjSnZBaWp4cnhBZ0VES2dhNTVuQmNOYUtOLzNuWVd4SldHQVBWQTE5N014TUJrOG01MDdPVGxScFZKeHFXWUFITllObEkvZ2dJKzREN2lIKzJNUnQ3ZTMxV3cyVnl5b0pPZWlDTG14Z0dBeTNJKzFnRVJrVUxtWEdNTFQ3enhmMGMyOWdoUmZLcGtrTmNxWmZ1dEdvdi96clZCWnRzd1hvQVFoc1N6K2RES1p1SXBmR0NiUDgxd1l4Q1JpZWdxRmdqUDdjUDdrc3UwaTRhdElja0JtMkNJS1FxQm1zK2xDVTZ3RENCMUJBSURaU2w2YlNDR2VSL2hJeXNBMzhOVVdZVlNyVmUzdDdTbWZ6NjhBU2FJTVcvU0IxYk5qeE1JaFpKaHJvZ2ZjbXNVeGxzc2dYd0J1SUNJajkyRERYQVM5VnF2SkR3SzFxam05ZUtVZ3BhdUx2NVJPNldvOTFYWTUwOG5ZVitCZHptY1lodUZLUVFaU3lzdkNVUlAyV0xJR3dnV3pLY21GY2tpeU5mczJMa1Y2eVNvMkdnMTFPcDBWczhZOXNTYVc5N2V1aEh2RGpWcy9uYy9uMWUxMkhVdkh3alFhalJYQ1pYTnowOFhPdlY1UDNXNVhtNXViYnZGZzJ3QmxnQ2liQ2FYa2kvbXljVGNGbjlDelJBMnRWbXNsOFdXQkpxRE5Kc0Y0TnpiUkJFR2dKTTFVQ1VNVlFrOTZ3dnBMVXVCSlhqTFhZQmhybzFGemN4dnlBcGg3WHBUQ1VPaElHNWNTdnlPUmFCckpHbGc1UGtPSlV4ekhLL2NsUzFldjE1MDVwS0xGNXNZeGt6YkxTRWhwNnhVc2xZcHBETU5RT3pzN0x0Ym5mbWdBV2dwWmhMVlkzL0RCb2pKZi9DM0tRMUxIK20xcGliajcvYjZHdzZHMnQ3Y2RiNEVsSU5KSmtrUzFXazNWYWxXajBVaVNuSElndUpaWjNkemNOQUI2b2RuQ1UyZWFxVm5SRTRWZ3ZKQ08rd3ZOWjNOcFhRQ3NUd1BFa1ljbTNDTHpCeC9BWWdHeTBIZ1crdno4M0NGZE5BdDJrVEJ3UHAvcjVzMmJMb1VMZVFJdlB4d09uVFd3V1VLYm5VVFFxRFN5dERSV3BGNnZ1d1VGcDdDd3VLajFVSmJzbXRYTVdxM21NQUJDaVB1Q3YzaFN5SWl3V3NHQWkzajQ4S0cydHJZYzUxK3YxOVZzTnQxY2VaNm5zN016aHlWUUZrazZPenR6Y3hEbWkvcmUzYmtPTndLRnhpWEpreFJJTHo5TTFCNUc4ajJ0RUh3aDRRL2hFeHBodVh4cGlkaW4wNmtPRGc2Y1JxTEJoSkpvNzJ3MjAvMzc5NTJnMk5TczFXaUFIb3NMaVNUSklmTFQwMU8zbU9BVnNualdDbUc5S3BYS1NzcVR1anlleWFMeGRkMVY0VjVxdFpvVE5LanZORTFYZGtBQnluZzNteEhGWXNHWEVPcGE0SXF5OVB0OUJ5QXBYckZ1c0Znc2FqcWRxdFBwdUxySU9JN2RMcUI2dmE2ZDNWMzk1UDVVWDc4ZGFLZWVXMW9CVDVwRm1YNzQza0xmZk45VFBoY3FpU01IdWllVGljSjZ2ZTQwbUVIWVlvZkpaS0xkM1YxWGtZckpINC9IeXVWeWp1SHE5WHJPSkRPWjdJUWxiT0VybkFMZ2t0UXd2MmV4TUlYMWVsMmowY2loZVFBZEdUT3lleFNjQUdhcDZBV1RFSllPQmdPWE9WeVBNaEFDU3psVHdnMkRGa1dSV3EyV1cyVEdpQkxZTW5VMGpiK2JUcWVPTUNKN09wbE1mb25mZCtUT0JRbEVEUUNFWEtQUmNPVmtZUmdxU2FXbk5ueTFxa3ZjRUtmU0g3ODUwODhlTGZSNGtDZ0lmT1V2MWdiY2s4dmxsaHREa0ZSTUlOSnFZMVdrRHJOUHJNeExBVm9JY2FpRnR6dGtZUGQ0a2NWaW9jRmdzRkk4S2wwV0xpQmdwVkxKVlJzUk51S0RiWTRlZ0FXQlFtMmROZTJFZSt5NHNhaWRmQUVBMkNiQkVBNnlsOXdUUzRHZnhxcVFQVVNnSlRtaFEvdkpTUkRhRWtJeUpuWVlzV2o1ZkY3MWVuM0Z0ZkZPZ2UvclM3ZHFDZ05Qa3FlN25VaC84dlpNYVNiNWtpYmpzVVltODhselFzd1NzUzdXQUFSc09YMGtIU1NjWmN2S1djZ1FCdGJ0ZHQwaWc2S1p0T1BqWTFkc1FySUg0ZUg1QUxIOS9YMkhrQ0Z4dU9yMXVyTWVGcHV3TUdnUlpkc3NNaTdHTGhBTDNPbDBYSWlIcndWY1FqSGo2d0daclZaTHVWek9GV0pZbmdUdzIyZzB0TE96NC9DQTFYTDRDQkpPUkRtNHJtcTE2dHdlOUx3bDcwcWxrcWF6dWNyK1hNOXQrODcwLy9oaHBEVHpsQXVrT0U0Y3lNZUtPc2FUbENuYXdJdmlFdENDWHEvbjJEU2JDS0xzYXo2Zk8wMjJLVTViQVNQSmhVTmdEMkorTzJsSmtyanFHUnZTSVdBa1J1d1dNZnRNSm5LeFdEZ05reTYzWlFkQjRFQVp4U1ZCc095TkFPS3YxK3Z1WGxZNDRTK3dldmg0Zm1ZcmhxRjhFV0JiSVkzL0owTnFVOFNNRVFhVnpidVlicnUzMFBkOTlmb0RmZVFnVmFWVWxsSnBORTMxNW1tbWZCaElTbDFOQWU5aVM5M0R3V0RnZkp5bGYyMVJJeHBUcjlkWFhzQ3lmWVJzeEt1WU0wd2dNV3kxV25WYnNQaDdKaEpOaStOWVoyZG5Db0pBeldiVE1XVUlBZHpEY0RqVTF0YVdJNWJzaFlEaUVrRHJZSWxXcXlYZjkxMTlJQnFIc0orZG5Ubno2dnYrU2xnWWh1RktpaGozZzFXQjBrV3grdjIrN3QyN3A1MmRIVFdiVFdlQzAzUzVHWFZyYTJzbEF3cHV3VExpRWxGS1dNTk9wNk5PdDZ2SmFLUlBmbnAzcWZwK3BqZmJxYzdHcWJJa2NpRTFZQkZYNDhMaXlXVGl3aGNienNIRkk2bjcrL3NydVdXYkNMSlZ2a2duUHg4T2gyNGZYeEFFT2pnNGNMWHkxb2RpZ2tuRFp0bXlySG84SG10emM5UHRmS25WYWc0UFVLcHRLVmlFZFRnY3V1M1VrRnhZTTFqR09JNWRXeHR5OUw3dmEzZDNWOFBoME1YdjVBV2dkL3Y5L2tvbHNpU1hUZ1ljd3pXd2dYTTZuYnJFRGhZUllzdHVyV01NbHZ6S3NzeFpBemJsTEltdlZKMXVYN2Rhdm03dEZxVTBVNVpKUDNrUU9XdEttYnZGYU53L1RkTmxWVEFFamszM2drcnRBZ09VOEdOY3BWTEpWYU5JY2x1Y0ZvdUZlcjJlVGs1T1hNS0V6NTZjbkRqT0hyQXpIby9kQkJJTFU0VUQ5ZWtHSG9hdUVtZzRIRHFhZWpRYXVXMXFZQmhBTHBwTUlRdENTWHFXVFNId0JyUlRZYTlFczlsY0FiMTJRWWtJUU84Mm9VT2R4WHFkSHFFZW1VcllVVDRETHVOZTlybkxaMmJLSkgzcDJZYkN2QytsbVk3NnFlNzBzaVh6WjhpeS9mMTlWd3ZCV0pNa1dVWUJQSXhRaHdIaW56Q2RGQjlzYkd3NEpvOXR6KzEyVzZlbnA2NS9FQk5CRGp1S0lyZERGODBETHdCSU1FMndYNlNEbVZCS294RUFUS25kdmNQRVdvUnNldy9ZRUFzU2pOekIxYXRYSGU0QUNCWUtCUmVwYkcxdHVibEFHQzBsalZWQ3V4M1NYbk56akFtc2dmc2g0c0psc2dZSUFYd0hybm0raUxSZHpldWxwMnZMSElBbi9meFJyUEU4ays5ZFdwbGlzYWlyVjY4NmQyTHA5QkN6amVUQkFsTGRTb1RBNEpsZ01udjR3dUZ3Nk13MDVoVHdnNm1iVENZcklBaytuYzJmbUVOOEhidVU4ZHNJQndLQjJlZGV1QlJDUlVrck9RNmJpMEFMbUJCQ1A3UVVLN2RZTExTNXVlbmNqdWQ1MnR2YmN5VlZDTGxsN0hBek1IWldTQURaZGllMGRRazIwNHJtUTdBUmxWQnpPUnBQOU5MMWlyWWJlU25MTkoybit0bkRoUUkvVUpaZTRpRUxwSW1hWUdKRFFCTDhOQkw0NE1FRG5aMmRPWE51MDdoTUxwTGI3WGJkeE1CMVErZXlVSkxjYmwzOEdQN0lGcVFnaENTZk1LczI0Y1Mxbml1dzlYRjJFdEYyRm9kSm9lUU5YMzV5Y3VMOE5ySDhjRGgwdVFRS1dxRElyWDhlRG9jNlB6OTNHMWZtODdsakRNa3FycWQ2QVdKc21zRjZBb1RaTW9ZZ1dQY3dHbzNrSzlYbm42NHY2VjdQMDd2dFdKMUZxRnF0ckVHLzd4YWRORGJOb1pJa2NZcm5ta1J4b1YxdzRUQnZBRCtYUkxqd3VWQ2hvRk8wQzNQVDcvZFh0bnV6NE53VDgwaVpkcWxVY2h3RXdvTW00b0lnZ2RiM0VRQjgySy9Id3FacDZzeTRyVHJHVmFDRjNXNVhSMGRITHJ5bEkwbWFwcnA2OWVwS2tzcGFJUWduM0F1THhXWlR4bUVUVHphN2lzbUhKR09CK3YyK2ttVFpZTU1XMUtacHF0azgwcFdhcCtkMjh5NEYvTVo1WHJtOGxCbmN3TjRJbm8zQXNrczRiTGZiamtpeENEVU1sNDBaaVlmeGxiWkpKTUlEL1VwZklSYVlRcEo2dmE3TnpVMWxXZVlRTk0rYnpXWU8vZHRpVkxzanlTWmV1RGNUeCtmdEJnODdVWXdkbmtPNlRMWGFLaWplZzRtSGltWVRDOUVTVzg5c2x6TjJHYUVrK1BlSER4K3FYQzdyeG8wYlNwTEVoWWRVWDYrN013U00rYmNXMERhMmpPTllvOGxNWDcvZFVLSG9TMG1temtSNnYrc3A5S1VzUzEyVXh2elpQWlA5ZnQvbFRjTHo4M05WS3BVVkhody9EZXZFSUJndzV0anpQRWQrMklWQTA0a1lJSXRnMTRoM3lTdFFjNGcxWWVJdG8wZVJKMEtLOEdIS2JFazdRb3d3VUxPSEFHRkZXRUFtM29JNkFDazFFZmpNL29WcHhhUXpiOHlWNTNrNlB6L1h3NGNQMWUxMlYxaEl3aklXTk1zeUY0TGJBaFZyOHFNbzB1bnBxZnU1Ny91UzV5bnZKL3JjemFwai90NW9TOE9GcDlEUEZFV1grd0VsclpTeGNROHdSVml2MTdXM3QrZXFURmdFZkRtTUduRTdHeU1RQUVJOUtsOHg4VWdxVGFnQWp5d2lpUklTTkV3b09BVHRuYzFtR2c2SEx2eEJ3SkJtdnJmVlFWZ2Z5MFlTUHRxSWdGSXkzb3ZQMUdvMU5adE5UYWRUblorZk80b1g4OC85RVFwY0R1T0dXR3MwR3RyYjIxdlpNa2R4Q056STN0NmVFekF3a08vN0s1dGNzYm91dVpSNitzU05ocTV0TG1QL09KRmVQZkhrZVpsVEtvQXBpdzJRRG9KbEl5eFhlQXN3STlPSHFiRzlkUWxick1SYlJyQlFLTGlhT3dnTHJBYkltUUZKY3Fsa0prN1NTdU1JU1k0T2hzSGpIcmJjR2cybTZnZExZMDBwbitGNzdpbkp1UzVBRWd0RldweE1IOHdjOS9ROHo0WEY1RUw0UEZwTkhzTjJUN0drRVM2QW1CNE1BRTBMaTJrN2x1QzJwck9GdnZ4TVNYN2dTVm1taHdOUHZiU3NSczEzRzNXSU11STQxcDA3ZHhUSHNhNWZ2KzRza3R1VU1ocU4zRU13M1d4RUNNUFE5UTYwdnRKZTFNdkJaQ0VvZHJNRjJUdUFIM1h2OC9sY3JWWnJwUkNFejVGQ1pmRnBPOGZXZElBU3o2SlJoR1c3bUFBV0QrdkRvcWRwNnNnUlc4YkZ0bkFzblJVR1d4OUlNbXc4SHJ0T283N3ZyMVJWcjNNQzRDMFVBa0lLQVJtUHgybzBHcTdFSFdCTnYrRWdDSFc0WGRHTFYzSXU5bisxN1N0S1BaWHlsNVZPek1ONFBOYlIwWkcydHJaY2FUcHVOUXpEeTJ3Z29ZblZjT2pUVXFua3drR2JVYk1BalRKb1VxcGdCMXdCb1IzM3hXUVM2MFBid3JuYkhnV0VxbWdVUXNWa1dST0xtUWNEb08wSTMzZzhkZzJhb0lsWnBEaU9uV1pTRTRFd1VyOW5lUkdzMGQyN2R4MkZUQkdweFV1NEk4c1NzcWp2di8rK3RyYTJkUDM2ZFZlS1JtN0Nwc2hkUXNvTDlPSitxRXB4bWZidERCZjY1bDgvVnE2MnJlTFdwcnJkcnFzeXd0K3p2dVE5QU1VWFJhcVhXNmVaUEY2Y1B3YU5Jc1dXQm1ieW1FZ3FnbWluWXB0QjRUTzczYTdDTU5UR3hvWURLN2JXRGpCSmcwak1MT2FTYWhiU3BiYUpCVnFMaXdDWUFVb0JnQWdJWU5TK0U5clArNTJmbjYrQVQ2eEtvVkRRNXVhbVRrNU8xTzEydGJlM3Q3SnIyUW9laTRqd29PM01NMGtrbEFkQWFydU0rbjZnTU1qMDhkMkxnUWFlL3VMVkkvMzR0ZnZhM3h1bzJ6blg0OGVQMVc2M0ZVV1JheVpkcjlkMWVIaTRVbVVNM2d0aHg2UWxXTnJZMkZoSmE2S3hoRi80UWRLU2xJS0R0UEY1cEdKdDdFeFdhejZmdXdVbDI0WjVSbGp3cFFBMkZwaXhrZ3ZnNzFnZ3RNaldPa0xmVW5sa0NhTWdDTlJ1dDExUGhFNm40M3I3SEI0ZWlteXA3ZUlGU1FSZGkrV3k0N1RLd1lKWHExWFhWdmJodzRlcVZDbzZPRGh3Z291V1NzcytoWGJ1ZmQvWFBJcDByUjdvV3JNZ1pWSWFwZnJaNDFUYkY3VUdEeDgrMVBuNXVYcTludHVqNlB1WHRSMjJGdEpsQTVrRVMxTGdKeW01b3A0ZG9FZGhCS2FVd3RBZ0NGdzl1OTFVUVJFaXlTRHJkbGdNb2cxTDE2NExVQnhmTmxlTzQ5aTlCT2FZdWtXN1JRdmhnZ0N4MklRY1FxL1hjMkRUa2xTbnA2ZnlmZDl0RmNlZFNFdjJqZzZlbUZhRW5uZXpHVWllaVlXRFB5Q2RUQWN2QkFHWEtjbTFlYys4UUY5NmVxRWdXQ3JCeWRCVGZ1ZTJucW5NMUw5b0M4dFljQ1VJS1VKb2dXeVdaY3RHa2FCTEpobUFkWEp5NGtxVkFSVmdCTXU0TVdFc0lDOUpPUmJZQWhOdlNRbGJSa1pJeUhZdmF5cXBtTFZicGUwOXgrT3h6czdPSEhJR3RJSlR5dVd5KzU2RndOdys4OHd6T2owOTFXS3hjQzNlMkJIRjJPRWk2Tk9MV2NaMDEybzFqY2RqOVhvOTV3WVFObW9Wd0NiazVVdWxra3N4STZqMEpEZytQdGIyOXJacjd6NlBJajE5c0tQbnRqSVgrNy9UeXlzb2xMVmRxcXA4SVN3c051Q1VxSWM1NW4zQUppSDhPQ1lhTFVDQ2FkZE9UMkZ1TUJ3TzNkWmxBSXRsMzJ3MHdFQVFFR0ozdElXc0h6dVRtUmpNTjMzeTJhMXovZnIxRlNLSUZ5VGxTaWlKZGVFZTVCbXNPeGtNQm1vMEd0cmMzSFQ5ZHdxRmdudlhYcS9uWEJicFpsd0pZTEZVS3JrK2hrZEhSeTRxb0NXTXBXV2h1MkU3QVpqeitkeGhJaXdiVnJqVDZVaEJUbCs4V1ZHOUtDbVQ1Z3ZwOVZNcFdzemtoVXZMdTd1NzY3Z1JXRlhDWXF3Zjd0c0pBSnJXN1hiVjcvZlZiRGFkcVVlQ09UckYwc1VzTUNHWlJicjRMdHdDUHRQdTlMVnNHc0FTMXdNdWtLVFQwMU5Iby9LVkY3VGtDWjFPRU5CdXQrdVNWOFBoMERXMzV2ZTJKcEFXOFZtMmJFc0xaWXNtdGR0dHRkdHR0NHNISk0yNzRGdEoza2h5a2M1NkFZM3YrNDVvbTgxbU9qOC9YMm54YXB0TmxVb2xuWjJkcWR2dHlmYzlQVlBmbHZ4bDJkYzdaNGxlKytCRW85RlF1WXZvcU5sc09vTHE2YWVmZHBFRFFvRjdRRW56K2Z3eUhZeHA0STlCM3hiUVFHUHlVaXdlL3M3V0I5b3cwdnAxUGsrOHpYTzVKd2tLcUdJYmNpWEpjczhnK1FRazJHWWY4YTFrOFN4WVJlTkIrSnpJQVlNNUhBNTFmSHpzdG8zaEx1cjF1azVPVHZUNDhXTlhWblY0ZUNqZlgxYi9uSjZlYWpxZDZ2RHdVSXZGUXRldVhYT2JQcXliQWhPUjg4ZEtFV0szMjIwZEhSMjU0aFBldjFhcmFUU1phVE0vMDdNN2w0bWYxOXFCQnFPeGhyMmVjcm1jQTMrNEpKVFBjamUyYU5ZSkFDRVMzYkVCZ2ZsODN0WGpqY1lUaGJsVmJlWEFJaGFieU1FZXJRSzR3d3d4R0lnS2FnbVlJSHI3cmpPT0xDRFBzQ0VlTkNmaHF1LzdqbVlGc01KV0lnVGo4ZGhSdGdoNUdJWnVqOE5nTUZnSks2bmx3MldjbnA1cVkyUGpRanU3N3ZTT1pyUHBpbVVRUWphVm5KNmU2dWpvU0pWS3hlMFVQajgvVjdQWmRNZS8zTGx6UitmbjU0NVVhN2ZidW4zN3R2YjM5L1cxcHpPVlNxR1VadXJPQWowWUJ5b1Zjdkl2T3FkWTBnbkVEK25HZ2tOVWdXMnk3S0lzSFA4V0JJRWJkRDYvQkJoQm11aHFLWkQ4bkVaSklHV3hmR1VyaTJ5MUZtU05CdGt0VW53V1JNN0JFWlNEMlhJejdnT2F0WUpqcFpqRUNzZ2Z2QUtPd2ZKUVk0Zlc4WG1pSDkvM1hjVVAwUWJsVkJCUXVJM2o0Mk9YQWFRREtwdE5iUmw3b1ZEUTQ4ZVA5Zmp4WXoxOCtOQzFlQ2NmOFBqeFk4MW1NMTI3ZHMxeENxU1ZOemMzbHdJZEJLcjQwbWVmTGtyWmt2bDc2OHpUdzlPQk9oZjhCUEUrdkFHaHMyVkVVVEtVMk0wbldvcDVJUHp5d29JKzB4em9hNDFmNkdwaHFpajE5T1pzUy8vUHlhSHU5bUpGMDdFaXMzc0ZWQTNZWUVCUXVvQTlQazlyVmMvelhQcVY1N040YURndndUMnNkdmI3ZmZkemdCYmFnRDhtVThkbmdpQndKaHBmelR3Z3ZIWVRCcGFLMEd4N2UxdFhyMTUxNDdJc0p6Nlh5T1RkZDkvVmd3Y1BGTWZMOHdnT0RnNmNGYkFWVCsxMjI5VWRvTUcrNzZzL0hHdmZQOWR1dlNKbFVwSjUrdGFiNTNydDFiYzE2SGRkQk1ZWlFZOGVQWEkxamN3TDQwRzRZRllYaThVeUNyQUFiV2tyQ3ZyS2RrLy91UEdYOHJPWnRKeEhmYm40VU05ZU85Ri9zL2cxdlR1SWxVU1hGY0NBSEtwVm1IeVNHOHZRY0tIQXYreGJhL01QOWd3Z2gxQ053TmlFRGw5eEIzd092QUhRdy9wWW40dUxnUVcwMURUYnV5Q2J5QkJTQStoU3FCZmpMNVZLdW5MbHlncVl4VHFsYWFxSER4L3E2T2pJMVJLd281ZS9MNWZMcnVpRXNudWlLdVpTeXZUU2plSXk4U1BwRjhlUnZ2L2FIWFhPejVRa3k3RDg3YmZmMXVucHFRNFBEN1c5dmUzQXF6Mk5CVXZQM0tFc0liMTZTQUNsOGxUUEpmcEc0M1g1NlV6U2N1S1c2aW50K2NmNnhwVmQvUSs5YldYeFFsRTBYMW9tejFjUStBckRRSXVGM01iUlpkbDFVWUh2cTFyZjBPN1ZweFVFZ1FhZFkwM0hBNUZiUWxLcDAwT1RMSG1CcHVMTFNhUmdEU3c0QllEWjdCK1R5bWVwYmVUM2hHYTRIS3Fac0ZoTUltd24yN1FoaGJBd2dON0hqeDhybjg5cmYzL2ZhU2twZGdRMHk1YW5xN0xEeUhIK1dhWW9UclZYQy9XSnc4b1MvUG0rL3NWMzM5VUhkeDhvaXhkTzBDa3UzZC9mbDZTVjVoaTRKZWJDRnRPT3grTmxqeURicWFKVXJ1cG1QZEdXMTlWeVY5bmFsV1Q2OU5aYzMvaFAvNGw2ZzVINjU0L1ZPenZXb0h1cXlhZ3ZwYkZtazVGeTRVVnUvQUpiUFArWnIrb1RYL3dkVmV0YmtpZE5oajM5NHBYdjZNN3JQMVNhcHU2QUl5WUdxU1hSUkdrVElKTUZZL0VSSExzVkhIeUJlYmN4TXIramJCeUxBMmtERWNZT0pOcTFYcmx5UlllSGg1TGtNblJadGl4TlB6czdjeWVQNGlwMmRuYWMvd1dkMjRWRHVJbGtZRXl6TE5NOGl2VHNickpNL0hpK1RzL0grcE9YUDFDOG1NdlRwYlhKNS9PdWxaOHRoNFB3d1FyWWZBM2NTTGk1dWVsMm94UUtCWVc1VU1WY3VyN3M1dkpVam50NmRyZWk3bk5mbEovTXBXU2hORTIwbUU4MUdmVTFHdzgwR1hZMTdMYlZPenRTdWQ3U1ovN08zNWNmaE1yU3BYbXROYmYxaWEvOGZTbE45ZDRyMzNWa0NINFYzMFo0U1B0V1hBU0lsc1VDTjJDdTJlL0FmV3gzRFM2K0o1UkY4TUFoN1haYmp4OC9kaGdKNFlQaXBuUWQ5NFg3SWQ5dks0d0lSN0VLdGpLSWJWdEVNYTZOMjN5bWozNnNJcWtnK1o1KzhGNVhaOE5ZbmlkNThsWVdmendldTIzbWpVWmp4ZnBaWHNVbXZtYXoyVElYZ0xuTHNrejFaa3YzeDNtTjZtVlZOZGV5NU5TdWY2RGk3RVNmL2FzLzFKMXIvMUIzRHYraEpxVXJDbnhQaFZKRnhYSlZubmZ0NHU4dW80UXNUWlFtc1puOFJINFE2cWtYdjZDM2YvNjlsUncyQ3dKaFJPeE92U0crMjlZWVNKY25uYTN6M1JaSG9EVjhqcisxZXhMNWVhRlFjTFJ0UHI4OHFCbnd4UFBzdGpUMkEwSU8yWWttQy9yZ3dRT2xhYXBXcTZWS3BhTHo4M09IM0RIWHRWcE5HNXZiK3RSVFRkM1lYSlo4WjNHbVYwODlWYW9WRGZ0ZDZTTFMyTnJhY3ZXV2xQZFJ3bTdkS0w0ZlljQ3FoZmdoQUZpcGtOTjVsTk0zUjdmMSs5V1hwVFExUXBCSVNpVXZWSEYyb28rODg5L3Irc04vcFY4Yy9xRSsyUDk5elFzN3l2bVpnaUNUNTEzeTBtajkrcFdscVVyVnBrcTFEZVg3blpXRnQ2WnJ2YXFWSEwwRmg5YmZXV1pSMGkvdHhBRkQyR0lSQkdrd0dEaXlwbFFxNmVtbm4zWUFHUzJYNUk1KzNkalljT0VycnVyazVNUTExNEozT0Q4L1Y3L2ZkNzBBNmFlQVJiR0NlWDUrcnN6ejlmbXY3aXNJbDFOK012WjBIbGNVQnA1TGcyOXZiN3ZHVm5BZXM5bE1EeDQ4Y0x1S0xYYUNGNEJlbnMvbnl6Q1FlQnNRSmkvV3Z6eTZvc1h1Wi9SMzZ4K282VStWeU5lN3VxRTNvajM5bHZleU5yeU9GQlJVbnQ3WHg5NytiM1h3L3YrbTcrc3plalg0aE5MYUZUWHFEWldyRFpXcUc2bzB0cDRvQU11QnBRckQ0SUlmajkwa0VzdmF2UXBvRThrZEpCemZ6bWNKN3dCOFZCcFpwdEx1RVdEeUVUN3VoVFpaNFVOZ2ZOOVhwOU5aMmNOUUtwVWN5Yk8rc0RTN3B0b1o4MDkwWW9WN3ZvaFV5MlY2Zmpkd2laKzN6a01WcXh2YTJkNVc2ZkRRRVhmZ0J5d1FjOWZwZERRYWpWWjZKZURlenM3TzNHWWNSd1hiVFptZVVxVkpxbjkyZjBkL2x0dlFyVmFnZHVGQWYxcjRPK3FuUlQzbi9hNytLUGczK2tid1BlVzlSUEx5Mm93ZjZmZjBVTDgyL3JiK3crTm45ZlA0cHFLZ29tSXUwQXUvOFEzdEhINVVTWExaYUVxUy9DQlF2LzFJOFh5a1NxWHErSEI4RzFJTFFJVk9sZVJDSlduMWNFbk1QbGlBQ2NGa1kwMHNMY3JmOFQzZ3lUWlRzRXdtbU1uMi9BZFV0bG90U1pjdWhTemt4c2FHZG5aMkhMZzhQajVlMFU1cEdZWSs5ZFJUYXA5MzljbkRzaHBsWDBwVHpXTlByNTFreXRMWThRaTg0enBIQWt1THByUGZBbnFmS21yWHNvZjZ1TUZnNERwWkxrMXJyRUtXcWpPVFhqNUtGZWJiS3U4OTFxUjBxSGV6cS9xdm8vOVNMeTl1NngrRzM5TEg4dmVVODFKSmdhNlhCdm92aWovV3ZmaWV2alYvVWE4dXJ1bk9XejlXYmV0QXhYSkRXVVl6SmwvenlVQjNYdnV1Y21FZzM2UnUwV0lFQUZOTi9wd0p0L1F3VW80cklGMXJoY1MyY09Oc0lKN0hJbHNTeVc2WVpXeTB3K0dRcUhhNzdZZ3V0c0dSajhEYUJFSGdkaUVUbjFQMlZhdlZOQmdNTkovUGRmdjJiVjIvY1VNSFY2ZjZuVThGa2pMSjkvVGFvNWwrL09ZanBja2xRMG1kQVNWN1pCWUhnOEZLTzMrYmt3RlVvekJCRUN5emdhQmZKZzhRbENTSlF2K2k2YUVYNlhiL1p4cUhUYzNDbWpKUCttTjlRYU5aVWM5SGQvWGx3dXQ2SWJ5bklJc2wrYm9lbnVnL0Q5dDZ2M2hGM3g2K3FIZC9rR3JyMXErcnNiRXRUOUtvZTZ3SGIvMUlvODZSQ29YTDJOaUNJVFRPNWdYNDN1YmlXU0NidUhKV3h1QUtKb3kvczUwNnFmQWhneGpIc1RxZGppdjJSUFBaMk5KcXRiU3pzK09FY3phYmFiRllyQncrZ2NaaHdUcWRqaXYzaHJTaHJ6RjRRcDZ2Wi9acWV2N0F1eWo2OVBUUHYvTzJYbm50UkpWaTN1MGlCalIzT2gyM1lUUk5VeGNKc0gwTnk4aGNlR3VLRnFMeGhGWk1sUFdQa3BSbW5yTEJpYTVFMzlQZHExOVRKbW5zbGZSNmVGT0ZlSzY3MDMzZERvLzFsZHhmNjdud2dZT05ONE9IZXJwMHBMZkhiK3E3UC91NTNzamRWcXBBNlh5b0pJa1ZCSmNsYVRZSHdQTnQyR2F2SjZGN0xBTk1Jbi9MdmdNMEZST083eVFCUk1ZVFRSME1CcTRKQlhzSVdGQjJJbGs2MjI0RjQzMm9obUwvUUxGWTFNSEJnVHY0Z21qamNoK0RweGQzcFRCY092OEhweE45LzYxanhZdTV4a25rU3ZZUERnNVdlaDdaeU9YR2pSdXVxUmZwZVJScXZZUTloQWEyOFRJM3M2blVNQXkxaUZPRlI2OXF0M3FnbzQyUEs4aGlQZkQzdE9WMzlFejZVTzhrQjNvLzJkTnp3UU45SmYrS2JnVkhTODJVOUpId25wNEpIK25ONUlhK2wzeFNkNE1yeWhUSVQyZnU1WkZVSnM4bW02eUdXd0d3LytjekxLeXQ2SUhoczNYeG9IZDJMWU5CYkgyZXRRcFlSYlNQTWNQOFdjc0RUOENXT2VZeWpwZCszQ2JIY0J1eitVTFZVbDR2N0N4RFB3V2V2dm5xc2M0R00rVkQzN0dmUkVtZFRzZlZFMkRsN0JhMTlYcE1YQUo0eHZmOTVjR1JMdnQzRVNiWkRKSnR2ZUw1dnJ3ZzBOYnhqelNyN3F1VDI1R1hwWG9qdUsxTkRiV1ZEUlZubmw3TnJ1dmQ5S3Blek4zWGwzS3Y2cnEzRklSQXFWNE1mcUdQQlBmMVducEwzMGxmMUIyMWxIcVpmUCtTb0xCeE9zSzRydWsyeGtkZ0VBUSt4d1R3ZXdvOUpMbkZYYmMyY1J5N1hyNVVOQ0VRMG1WVGFEZ0hLM3lFWVVtU3VDN3IwTFQxZXQwSkdRVTB1RnZLNTNxRHNWN1k4YlJkeVV2eU5KdkcrbjkvZkU5cGtpanhMcE51NUNnSWh4RTg4akFjc1dmck9YZ21jMEhFRk5LZWhJVzJtVFZib01sVktKWVZKSFBkT1B1UlJydC9WNUZYME1MTDYrZitzL3I4L0NjcStJbENaY3E4VUs5bXorbTkrSlplOU4vVGIvZy8xNzUzSXNsVHFGaWY4Ti9RUnd2djY2ZkJiWDFuL2xIZG05WGxCWjRDTDE3UkRBc0kxNjhQY3cvOGJ0MUNVQytJY0lGL0xBdm8rNWV0V2VsY1FrOUN0SXZTTmVhTmlpZmNERlZNOUJhR0diUVhPNjhwK3hxUFJwcE9KL3JFL3M2U2dmYzgvZno5TTcxK3J5UGZ2NndzaXFMbDBUU2NTVVIrWW50NzIxWDkyTTZuVmpsc1RzUnR4Y084MmRwNkM3cXNGQkdlZWZJVWpJNTBMZnlwUHRqK2d2d3MxWm5mMGl2Wm9WNmN2SzVTc2FSY0xwRG5KWW95WHo5Sm45ZGJ1cVdQZTIvcmMvN1B0YTB6U2I0S1hxVFA1MTdUcjRYdjY2L0NXL3JPNUZrOWp1dnkwMWllMHBYbnJpL29yN293MWZ3dDk3RVpQVXk1TGU4bVlyQWNCRkVHSVJielE5RW9uMXNzRnE2dklpVmV0bVF1am1ObmdzL1B6MWZvYTBuS1BGODN0aXY2K0dGVldnWlUramN2Mzlka0hxbVVEeVh2c21TKzNXNnJWcXU1VXIzcjE2KzdMbUtkVG1jRmlLNFRRUWlBaTVnb1hyQXh0MDFTY0FHQUx0dXhlTnJzdnFWQllVZnQrak1Lc2tTUFNqZVZ5VlBKUzdXVkxuVE5INmpnWndyOVZKRlgxRi9wazNvdGVWYWY5TjdRWjcyLzFzWkZ3cW5pemZYVjBtdjZUUDREZlc5NlM5K2QzRlk3cVNwUXFzQzd6UDdaOGZCU1Q3cXdIUGgvYStiNWFrMWttcVp1TWdGU05MSUVKMWhxRjBIQUFsQkdocUR5UGZsM0dEaU9jejg1T1ZteERtbWFhcjZJOWJrWFdxcFZsMXUrem50enZYbVNxRm12YVRHZnJZeWYzY0tVcCszdDdhbFVLcW5iN2Jwai8yelNhMzNPVmdwbnJhVFlPTkZLT3krTkNjSi9LRTEwMFA2UkpvVk5UZkl0eVpNZWxKOVJKdWxkWmRwTSsvcUMzdE9tdjVDOFRLR1hhcDZWOU4zMDEvWHo1Qmw5S250Rm44MjlvWVkza2pKZmRYK3EzNjYrb3M4V1A5QjNwcy9vQjdQYkdxaXFJRXZrL3kyMDMzTDdBRmRpWG43UFo2QjYrU3lJM2RZc1dzQm53Mk5MOFdiWjVTa2l0cUtKSEFFaDVkblptZHJ0dGlTNW5EOExNcDh2Rk05Ryt2ek5hMHZ3NTB1dlBsNm90TEdubThXNjd0eTU0NTdGZ1ZQRllsRzNidDFhYVhEQnMzQnYxb3BiQWJBL0N6RXJGdXdCaHBnY3dDQjdBUWdsZk45WGJ0NVhxL3VtSm51L3NlUXRkSWtYMnQ2R2ZwemQxRmZUdDVYM2x5QXl5RElwaXpWVVdYOFcvN3ArdExpdHo0ZXY2YlA1OTFRTnhsSVdxQldNOUkzcVQvV0YwdnY2enV3amVubDJVOTBrcDV5ZnVqU28xWGE3Nk91ZzBaSTdsa1BBTWxEZ1FWVXRsVWk4TTYzeXJIdUFjS0h3QmVESFdKSmsyZnFkSEQrVnhtZ20yOCt6YkZsMmZ0N3Q2OFVyUmQzY0swdHBwaVNWZm42VXFWZ3Fhem9lT1JkeWNIQ2cyN2R2dXg0TExEN1BKZTNjNy9jZE1iWWV6cTlmSWNqVXZpUzBLMmxRd2tQTGJ2SENpUUtOaXhkTkN0ZHZya1FuYXFpZFZYUlZZM25lNVpZc3BZbkNMRllucmVwZlQzNWRQNWcvb3k4WDN0UkxoZmRWOUdkUzVtc242T3NQS2ovVUZ3cnY2RnZUaitpbmk2YzF6UW9LbFN3RndmaDJMc2FMNmJXVk9qYTZzZTRCUkUxb2huYVFIeUdVWXZIaFROaU5aSGYwU3NzSWc4VkJrVWpPZ0RjZ3FMcmRyazVQei9SYlgvKzB3a0lvSmFudW5zNzAydjJCSnBObDNhUWszYnAxU3pkdTNIQUhXOWhrbVExMzRTTjJkblpjZDVkMUlXQStzaXhidWdBNld0TVZoQ0lMVE5oaXNYQWR3eml0SzAxVEpYR3MyQTgxejlmMVlVZFZwUEkxU0F2SzB1Rkt1TVdBdlN4ZENrclMwUDgxK2J5K1AzOVd2MWw4UTUvTTMxSEJYMGlacnl0aFYzOVkrNEcrbkx5cmI4MWUxQ3ZSRGMyenZBSWxVclphTzhBQ01qRk1rclRhOHRWV0hxOUhIZXZBQ1dzQWtRSlp4TEh3ME1iTUM1ckltRERSdkw4dFlWdEVzYmFxb2I3eS9PNnl4YmNuZmYvOWtkNzU0SjRHM1ROWEI3RzF0ZVV5akd6Qnd5SkRYVlBUUVNoTExlUjZOR1RuUDdTVk1iYUsxeFkzZU42eThwU05HVWoyZkQ1VEZzVUtvdkVUTFlBa2VWbXFYREpXN0NmeXZkVWUvL1lLbENxUWRKUnU2ZjhZZjBsL09YdFdYeTI5b1YvTDNWUG9MZW5sYThHWi9sSGwyL29nM3ROZlJCL1Q2NHRyV3FTaFFpK1ZielI4dlI3QUNnR3Vqcnk0L2YzZjVDK3RNTEFmb1Znc3VwWTJkai9rMmRtWjYydElxcGlXNzdhd1pEcGY2SGMrdHErOTdhcVVaQnBOWXYzNVh6L1NXZnRFaTluVVZlL2N1WFBIWlNlcFdwWXVEK2ZtdWJsY1RudDdldzZIMkdJUSsxNnNRMGc2azFDbTArazQ4d1phVE5QVWhVNU1BZzJaa3NWY3JlRUhHalJ1eXJzb0FuSGE3NFZxUkdlcXpFNjA4RXZLWFFnQXdHd2R4WHVlcDBDSlBOL1QvWFJQLzh0b1I3ZkR4L3BxNlEyOWtIc2dUOHZhaEtmREl6MFZIdXVkM0lIK1l2RnJlaWU2b2pqekZIckx0dW5lRTF3RGkyeDVqaWRGRm94akhUZXMvMTVhS2drbGFLUFJ5QlZacEducStpUndHZ2lSQmhpcVdDd3FDSFB5MGxqL3lVdlhKWGxTS0wzOGZrYy9mZk91WnRPSndpRFFsU3RYWEdVeTZkMGdDTnh4TTFodlNDdTdYclpZaG9XM2k1OWwyYkpUcU9YZ29UUWhGTkFZQzRMd25iN3ZLL1Y4dFlZZmFOSjVWZTJORjVSNW9ST0NVdFRYcmNGUEpVMFY1UytMTmV4QTFnZkk1T2I4VEVtYTZkMzRpdTZNcitpaitTUDladjVWUFJNK1dpNkNwT2ZDQjNvbWZLdzNva1A5eGVKRnZSL3ZLYzR5QllwWHFuL1g3Mjh6Z0gvVE9HenhpUldPZGRyYUhra0RBd2hYZ0NDUmVTVXY0QWM1ZmZMV2psNTZkbGRLbHViL3A0OFNIVnc3MUdJNmRwYVhuYzY0R0lDbExYT3psVXgydTU1ZE93Z3Y2L3BDU1N1aEhRY1JzZjJLSnBBVUZyQ0I5REpkS3lsTGRlMzBoMnFNSDZoWHZxWTBMS2c4NzJwbmVrOVZiNmFvVUhLUnhycDIvaXB5Snd5Q1pkVGdlWG96dWFIM3BnZDZQdmRBWDg2OW9xZUR4OHZKVjZvWGN4L29vN2tIZWlXNm9XL05udGVkYUZ1WmxwVkp2Q2hJR3NGZ01YK1ZOV0x5d0VRV1orQXkrVnNvV2k0U1Rtd3lCUXhDSTI5dmJ5dkpQUDNPcHcrVUwrV2tKTlZSZDZHM1RoYmEzZDZTNzIydEZJdFE1RW1MT25iK01KZHNhTVVOc0xGWGtndEppVmdJRlgzZlh4SkJESklpU29vbTdBWlBBQVlkd3dpaExnZFZWR3Z5UVBYaFBZVmhUb0V2WmZJVUJhRzhDNzZhaWh4TGF2eE43SjZ6Q0Y2aVRJRmVUVzdwbmVSUUw0UjM5T1h3RlYwTGx2UnlvRVNmekwybkY4SjcrdW5pYVgxNy9vSWVwWnZ5TWw5ZUdxM2dndldJeDRadzlwbnJUQ2hDd0lLdVd4SGY5MWZxQ0tsdVF0RFkvYk81dWFseXBhcGFLZERmKzdVclMrMzNwWmZ2akRXWUppcmtKSG0rNjRobTU0c3Q2dndmaTJEbmtzNXFsSjFkdlhwMXBVb0tDeFlFd2JJZ0JGNmJmZTUweVlLbElsdG1nUk1aSnFwNUM0V0NzbHhPV1Jvcjh6eGwvdElYWlJkYVI1cldhbzFGN1grYnkvY2tMNHNVZTRGK25uMVViMFZQNmVQSmUvcFMrSXAyL1hOSm52SmVyTThWM3RMSDgzZjE0OFZ0L1lYM0VUMmFWNVY1bVhLNTFXTlhzUWFXT3JhQ2grbTJic01XcXF6L0RSYzFlK1FRQUk2TlJzUFZBTVNwOUluRHVnNjJTbEtXYVRIUDlNTVBKdkxOTTZQbzhyaDVnQjd1SlpmTE9ieEJtem1FaFdvbGhNNXVsckhhSHdUQjBnSlFVVUluREVBZ0h5TFp3UTVncXkza3ZxVkxVR1hOUEd5YTNiMXJ6YkNrRDlXODljVnc0RXlaQ2tHcVRDWDlWZnd4dlJvL3JjL2szdFVYd3RlMDZYVWsrU3A1QzMycDhKbyttWDlmUDVqZTFyZEdOM1VhVitYN2lid3NYWjYwcmRXMDg0Y3RxQjJISGUvNlpYa0hxMlZjN0MxTTAweWVwTTgrVmJyWWV1SHI1KytkNlNmdlBMckk5SVVyM1U5SUF3UDhPRGFXenFZY2drVVVSQVdRcEpVamN5VTVBWEFKdjFLcDVKb2RFTjRCT0FDR1NMQWxVU2pWQm4xYXpWcG41R3oxTFFVS0NCYWZSU2pXRjkvZWMzVkNQU2xMbGZkU3pWVFVkNUpQNnRYc09YM0dmME12QmErcDZmVWwrYXA2TS8yOXlpdjY5ZUw3K3U3a0dYMXZla3ZuY1ZuU1FsNldyb0JiaFBqL2p5dkxsdDFEN2FFYmtHbnlBbDNiTE9wakI2VmxvWFVnL2VzZmZLQjdEeCtwMWFpNXMzMXp1WnpyMTRnSloyNm9OK1F3Q3VhR2J1bHNtQVdYc0E3TU5mTVpPa0xHdSt5d05adk5WQ3dXVmEvWEhUNkE3N1o1ZDh4TkZFV09Vc1ZOMkczY0xMd3RvZ0JiY0M4RTRGZkY1cnprQ29IamVRbzlTVW8wekVyNlp2cVNmcG84bzEvM1g5ZEw0WnVxZVNNcEM5VDBKL3E5MnMvMHVkSXY5TzNKcy9xcjJVMTFvcnlDTEJZeVpkSCszOFkxL1UyZllUT0ovVXdjeDVyTzUvclVZVk9WeWpMeDg3ZzkwdmZlYW11ejFWVHRJdGN2WFlKenNwS3oyY3gxUlVQcHFITmdYcVhMNGxlaU8wbU9veUFqeXZoRENnaUpUZEZJQUtEZGJjdU5vVTRoaXRnaEE1ZGdld25aWERUYWIzOXUrWE9idWZvd2k4RGdueFREZTJtaVVLbTZhVlYva254T0wwZlA2amZDMS9XWjNEc3FlVk1wODdVZER2VUg5Ui9yaStWZjZKdWpaL1dqNlhVTms3eDhYL0w5OUpjc2dLV1BuMlNkVnA1dmt5d201R1hjeS9kTVZTdjYrdXJ6V3hkVlA3NisrOWFaT3BORTE2N1czZGwrekJtbGEvWWNKOUwzOXY0c09JVW9nSFJLMmdrQjExMTBpR2JhZ2tGSnJyS1VoYURzeUpaV0UydmljeWlPdE9ET21sWWJWZUFDZUM0WWdYRFVobHZyN0p6ZDRHakpIcmRZV2FwUTBsblcwTCtlZjBFL2pKN1RGM092NmxPNTkxWHc1bExtYXkvczZRK2JmNlV2bDkvVG40K2UwNDlHVnpSVEtNOVBIS2U1amswc2YvQmhTUlltMk80bHNJVW04eWpXWjY5VzlmVHVzdFZMa2lUNnkzY0hXc3dYNnB5ZnV6TUdXQ0FvZU9teTZUTXVlcDJveXJMbERpKzdaYzNPUFFKZ2NVbG9nZDZUR0RRT1dFclQ5SmNxWTZ6SnRpMWsxZ2tXQnNyL0VZRDFmelpldGx5OW5Wd0xydFp6L1BidnBDVzk3SHVaanJOTi9mUFpWL1M5MmJQNnpjTHIrbmorcm5KZUpHVytydVU3K3NjYlA5Q1h5MXY2MC81dC9YUzhwM2thTEJOTzNpK3phSllYc005OUVxRmszMXRhbXZRNGl2U2JIOWxRc096cnJnK09adnBGZTZZZ2tLdnpJelBKKytQTE56YzMzVHNpYUlTRnpBZFdGcHFhNTlxaWx4V3JhOE1ndW1LejREWSt0blg0dHZPR2ZXRWVna2JiUmJFUFJZT0lFT3p4c3RaRWNaOTE2MlJmWkgyQjFvVmdLUWlKZkMvVHZXaEwvMnYwSmQwS245TlhTNi9yeGR3RCtSZDVobHZGTS8xWGhYTzlNZHZSbi9adjY5WEpqcUkwVU9nbFVyWmFaQ2xkRWtUcmxzQmFDN0FRZlFzbXM3azJpcDVldXRrUVIzcCs3eGNEelJOUGhRdlRMc2tWcExLQWhOazhFNHR0ZDBMWmRqdVNIQlVNTFUyT3gxNXBtaTdEUUd2U3JFWmFLaGpmRDV2RW9oRlM1UFA1bGI2N0Z2WGJQWFVzbHAwNGkyNnQ4RGk2T1YxdDVXcUZ6Z3JodXNsZXZ3SWxTck5VNzhXNyttQzBvMmZESTMyMStMbytrajl5ZVliblN5ZjZTTEd0VnlkNytwUGVMYjA1M1ZJaVg2RlMrZjR2azBYcjQ3SC9Sd0RvV1RTYXpQWGJYN21sclkyeWxLWWFEQmY2NDVmdmF0Z2ZPZmRJSTJrYlFkRk9wMWFydWVOcmJCOUU1cDdZSHdFZzVmeWs0aENISGRaZkFCTnJlLzJ3V0F6TWJzVWkzV2gvemdReEdMdVk5bUtoOFUwMjlrV3diTVJndVgzTHdxMVR1ZXN2dVU0NmhVcVVwZEtiMFlIZWpmYjAwZkNCL2s3cERUMmJQMW1PVlprK1hqblNpNlVUL1dTOHJ6L3QzOVo3ODliRmU1aFV0cmVhY1Z3WEFpeW43L3VhVEtjSy9WUy8rK2tEeVZ1Q3YyKy9kcVFmdmY2K0F1OHlPMGtCS1M2WFkyNW9NNE1BTUMvZ2pTekwzSFl2cW9adEtmcVRCTUR6TG1vQzBUQmJxNDdtb2NuY25FWUU5aUxUUmJpWVpabWpqVzNmblNkcEt2OFFBbHdOejVZdXQ0R3RML2I2d3R2SnQ5OC9LZjNzZVZLUXhjcms2V2V6cTNwbHNxMlBGeDdxYTlXMzlWUitlZjVoNEtWNnFmWkFuNmdjNjBmanEvcXovaTE5TUdzbzg2UXd2T3hNc241WjNvS2F3ZUY0cWhldk5mWHAyOXRTbkVuSzlIOS83eGVhVEtZcTVsY2JkcU04dU1zd0RMV3pzNk1nV1BZZGV2ejRzZHVzQWdhQVpDSzlUeVJIdFJKcmFsMytSUUN3bXFHRGZnUk0ySWttQnJWcFJpWUJLcElpaENBSUhDZU5LN0hsM2NTamRoRkoxdGc0MVE3K3d4WjczZVJibnVERDRub0xUb01zVVp4S1A1cmUwR3VMcS9wTThaNStxL0syRHZJZExlbmxSRitzM2RHbnkwZjYzdWlhL3J6M3RPN05xcEluZVY3OG9WYUFjWmRLSmVWR1UvM2VTMDhwWDg1TFNhYjM3bmYwL2JjZUsvQXZxVjhVVGJwc2dzR0pvNXVibXk3TVBqNCsxbmc4MXRXclY5MHByTGhhckNoUmxWMUhhN0ZRc05BdW9qWFptRjA0YUZxbXNjMEtyUWFNSUR3QXdmV1c4ZmJFVGp1bzlZc0Z0dzBudVRjZ2FIMDM4UHJpVzBHelFyQXVBUEFWa3VSN25nSXZWWlFGK3N2cGJmMXNlazB2bFQ3UVY2dnZhaS9YbCtTcDVFZjZyY1l2OUxuS1EzMjdmMDEvMXIyaGgzRkJtU2Q1V2swNzJ3Z21sOHZycVlOdC9VZWZ1aVlseXgwLy8vYmx1MnIzcHlybUFpRTdXWmE1azBoUW9pZWxzMG5YYzNZaDY4UWFnYjJ3d05LbGNqRVBEa2h5WTd1ZDJaN3J3OE95N1BLRVRzdndvZm1nWktUUm5rZHM0MzRXYzMxeDFoZUZRVnFMd1dmczV5MlhzTDZvOW5NSTY3b3dyUC9mVTZhY0YydVNodnJ6MGJONmVYcW8zNmpjMFc5VzN0TldPSlF5WDlWZ29kL2RmRSsvVVgra2Y5Kzlwajg3UDlEeExLOGdTMWFLVmgwMlNxV3Z2TENydzkycWxHYWF6aUw5OFUvdXkvZCsyVEl4ZHJ2ZHpPWmdzQ2lXdEhNbDN1SGw4VHlVOGR0ZTBBZ0xjK1Y1bmtMODQ0ZHg0QkFLOUJKdXRWb3J1WEdrRFFtRDBXT2ZQRkpLT1BTa05PcjZ4VDFaR0R0SlZvcjV5dGlmNU92dFBXd3VnM3V1NDVQbDkwc2dtUGRTamRLQy9uand2SDQ0T3RTWHlyL1FWMm9mcUJsT3BNeFhNemZUSCt5K3F5ODNIK3BQMmxmMXpjNmV6dWQ1cFprVkxrOWhJSDMxK2MyTGRLYjAwemZQOWFBYnExbXZLNDRqdDBnV3BKRjlaYnNaU1RvYmp1TEgyUjFrZVJ5S1QxZ2I1cHhuVVZTNmNuQ2tSZXJVb3NFNmxjdGxWL2VPbEZuelR5amkrNzdiQzgvMktQdndzN016YlcxdHFWS3B1QzFZOXVYWHFXT2J0K2ZuNjNFK212Mmt4YmNMYXdYZ3c3YWI4VGZPTW1TcFFxWHF4RVg5aTg1SDlaM0JOZjNkK2dmNmN1MmVxdUZNU24zdDVLZjZ6dzdlMVc5dFB0Sy9QYjJxUHovZVZDY09wRFRXSWs3MTFIWlpuM3Fxc1RUL3ZxZC85K3FwU3BXYVdvVkFhWHA1S2docFhnc0NzV2lVa3RuaVQ0cHNLQVhqODZQUmFLVm1nUGVGMTdGV01yU3NFdkU4ZjRBdm9oT1ZUZlNnV1pnVXVselRzQUM4Z0pEQVRaTnhwTmhoUFcvQVZ3dmtMSFdKa1BCN3l4RThLUjVmeHdMMjczNVY2R2kvejdKc1dkenFwVHFOeXZyZnoxL1VYd3l1NjJ1TjkvV0YyZ09WdzRXVStqb29UdlJIaCsvb2ExdFYvYXVIZS9vUGo2czYzQ3JxSDMxeFY1VnlLR1hTMGRsWVA3NHpWTFZTVWk2OE5OM3M4Mk5UQ3Z2OFlGNUxwWkxyUDh5WlB5QitMQUtjQSszcnJQVWtwV3pYTGN1eVpSaUlmN2IwWnBabGJ2dVUzWWxxK1hvRWh3SGdZMmg3Wm12MCtUL25CM0FHc1kxUDdZS3Vad1laRTgreUllU1RGdjVKaTdnZUhhd0x3SHJVWS8rT3Z3MDhLVkNteDFGZC8zUDc0L3IzM1d2NjdlYjcrbHpqV0FVL2xsSmZUNVZIK3FlMzN0TS8rT1NudGYzc3gxU3VGSnoyNXdMcG9KblhuVjZtUWhnb05SYVEwOG9aUjdWYVhkbWxSZDZmaUFDQ0RWZkJ1UXJXdXZHOXhRMVlpaVJKNVAzZTcvMWVCbmdhajhldUlzaEtEeHBHVEc4UFhZQnRzdElseWZrZUxJbzFaVkVVYVdOalk2VWVZRjBURVFETFRGcUN5Z3FBRllSMXJtSGRHdGo4d2ZwbjFqSEJldGhxQzE2NDF6eGV1cmJieFhOOVkrZUJQdGM4VStBdHBNWjE2Y1gvV1BKekY1M1dMcTdRMTN2M3p2UlAvK1U5elZOZnljWG1rSEs1N09hRTV3UE1MVDlDU00zQ2d4V3M1bk1SR2V6djd5dVh5eTBiUTE2NDdHNjN1MndUeDRzenliUk94YWRZbmdBTFFOMGduYTlaVkJZR1NjUEhZejJJTWtDMzFpV3NnOUIxRGVRaWhGemZ5cmF1dWV0QzhLc0V3QUpLWEpEZElHdXRnUDFjbG1YeXMwUmVGdXZOVVVOdkRhdjZhUGxjLzJEdmdUNTkrem41ZmtGS0wwUHI1UXVrdW4yMXFVOWVQZFZmM3AwcHVIQ1J0bURXcmdtTXFEMXJDUzBHSjdINHRwa0g5OXJlM3RhTkd6ZjA3cnZ2cm5STWM4MmsxeWNJMUNrdFU4S2NYa1ZUYVE1WmdQSGp3WUFNZkQ0Rm9BdzB5ektYV1VSb01QY2ZsdDVkOTlYcmZ0eHRValcvZTVJRnNMOWJ6eUN1TDc0a04yYjdPZXMrckp0TTAxVEtNdVdVS3M1Uy9hVGIwSjFKVmYvVDUzYTBvMThHcFpJazM5ZXp1M2w5LzM2c2ZMZzAvZXVkeTZRbEY0STF0aUFZbGcvU3J0ZnJPWUJ1RjU5VFNWNTc3VFdIRyt3NWhyVmFiWGxlQU1lSkF6b3NrT09oL002U0RUUTNzbWFmTGh4SUdsd0MxU2dra1RZMk5sYUlEaXdCZmg4VGJOMkVaU0J4S1ZndXUwaFdBTllGWVIwRVlzM1doWVZyZmVIWG93ZDN2eXhUbGk1TDFLYVIxQjRuMnZHbEo4cEFscWs5enBUTGhjcm5Bc2Z0V3h6Q1pVTTdCTk1LZ0EwaFVZajFTQzVKRWxkRFdDcVZYSEZKRkVYTGlpQUVnQnNTY3RpRGtaaHNlM2dqdTJvOXozUGRxYmxzanpwK1BoZ01mcW12bnRWQVczMWpKMzU5WXF3Si9EQ3ovNlNmV1ROdUYzVTlrbGkzT0ZZZzE1KzNMamllSjQyalROOTV1NnZuYjIxcmJiT1VGUGpxZG9mNnljT0ZjbXQxR09zWEp0NmFlOWZjNmFJQ0MweGtJd0xjQitUUlpESnhQcjlXcTdrbUZ2UDVYQ0g5NVRESitOZUtxVTBMZ2tDTlJzTzVCeG9kczAvZGxtbEpXb2xQNllaSmswU2FKdGd6QlN5NVk3TisxaFJib1VCWWJMbnpPczM3SkRid1NSWUNiYklzbVVYOWR2R2ZCQndaRzErekxGUE9sLzc0dFlGZU9IaXNMMzE4VC9JdXdsaGZtb3htK2gvLy9UMDk2aTZXUjc1NFQ4NXpNRjZxcmRoa3dyelRCaGJ3RFY5ajZ5N3RQR0xoSmJrV2VVbVNMUGNHYm05dkt3eERkMVQ2T21YS1RaQkFtNmUzaTBpWkdDd1VsU3hrcW14M1Qvd1FaSkZOYi9JQ1FYRFpzUXZ3dDY0eEZyaDkyR0t2LzN4ZDQrd0NyMWNpOGZPL1RjbjRKVGhNTlltay8rNVA3dXRINzNmMXhXZWIyaWg2ZXYzaFNQL21aOGQ2NzF3cUZmTWFSWE9uS091UmtMVTBjUnk3RGliVWJzS2pBTFJ0V1o4TnZ5MVRtMldacXpGMGVPUHJYLzk2QmpqcjkvdE9DSXJGb3ZiMjlsU3IxWnhib0dJSTdXTVFoSUxXTDhNSUZnb0ZuWnljT0NHWnpXYXVWbDFhYnFHaXRidTBDczQ4ejNQWWc4bmcyZnplVnNDeXNFOWFyQ2VoZmlzQTY0dHBoY2ptMDU5MDhSbkwzQzBYSU5Wa3RwQ1hMS1FzMW1DeVVMNVExTzcycHVzdElPbVgwdXZXM1ZqOHhUeVJYS01KTmViZVJsUlpsamxzWWFseUFEclBDVWs1MHI2VVJhV25MUnBqQVNBYXg4VFpqdU13VkVndUJ5Qmd5Z0NHdnI4c05PVzhvUFdGUkZyWjNrU3pCdkxiNjF6RWsxRC8rcUxheFYwWGp2VnJKZFJibzU2ZkpBajI4eXpnWXJGUXZKaHBzWWprK1o2cWxZbzJOcG9PVzBtcnhiZU1uUjdFN1BQTHNteWxweERqSVdSbjhYRmY2NjFpQWJ1MmNnaThFRnJOWW9FSjhRai84STFNUElORjJ0aU1tTXZsWEQ3YStpK2trVlpwV1phNWRDWVVKWGtFZmg5RmtUczFuTTBPcEpJUlVGdmNzTzRXN0dVamhYWHc5eVNmL3FURlhhOW00cklKTVRUUEpuSElaK1R6ZVcxdXR0d3BxNUtjSHlhU3lySWwrWVBMeElMYXNNNEtEc1dnMWlKaW1TK2JlV1VycEJGendmUENlcjIrN0U5LzhYQnJIcDZFdk8zRjVFMm5VM2Q4T3FWSTloLzR3RllOa3pMbVoreGt0ZFpDa3V1TmF4ZGlOQm81aTJOOUhaK3hvWkMwR3RkYklmamJYSllSWFJjc20yaEJFS3d3a0tWakxEYXNaWjZpS0hLSFYvTzN2dStyMVdxNWJpMHNPTytHZ0tGOHRrQ1dlbzBuRVV2cjRhdm5lUXFiemFhVFJNNzRYVS80V0k3Y1RnZy9BeVFDMk5CZzZmTGdabnNjSzF1a3lEWXlZU1JFYkFJSnhzcnp2Sld6Z0R6UGN4MnkxeGNBeXRocS9mb0VyTk8rSCtiZlAweG9zQ0k4MzJvL2MwRHpEY2FKcTJWalo3L2ZYMmtxd1lLeTA0ZlFtbENiUnRDbFVzbFZEcTNUNHRZTkFhUUJpaGJZTWo4aER6ZytQbmJvMGFMSVh3VjhrSER5QjdSQnNST0ZKTnFHRTFnTU5HTGRSVmh6Wmw5T2ttdU1RQU1rcE5taTNEaGVIaVJ0TmNneWxVd083L2VrUWhIN25rOTZkeGFNQmJlTkY2d3dXa3pBd2RPVlNtWGxoTkx0N2UwVndhY052U1IzRWlra0Q1d05ycFVJZ2xKK3R2VlRSR0x6Rit0anp1VnlDbnU5bnN0RjIwSU4ycDdpTjlBV3JJT2xmUUVxYURVRnBFZ3VyQlg5OGRkZERReVZOV1dXRU9KenRGVzFzVHFhaFJZalNHbWF1bWRLV3RFQ3hvOGcyQkxySjRIRUp3bUFEYkdZVk9ZSDEwUUxGNndWYUI5c3dQT2hnaEZHRHNPc1ZDb3JWaEdNUlpVVzRiaTFPSHdPdkxUdUNxd0FaMW1tRUhJQTBnZi96STJRTkM3WVFoNEtTWUZwRG9KZ1JmTzRKNkVrdVczTU9WcEF5M1NFaFFXbEdRVkFCcERKOHpINVlBWjJPNmZwc2xKNU1CaXNWTkpZSVVZanJCa0ZZVE5CTmlyaFdxZGx1U2R6UU5ReW1VeWNlZC9aMlZHcjFWckJBOUMwL0QxdU5FMHZ6M0VrMDJvN20vSU1nUHQ2aFJXZkF3K2dNSlpyWWU1Qys1SmNmSkNRMEw2MGRNazZZVW9vQ2QvZjMzY29FKzNBUEZHcURJWEp4R0ZwMWxrNmUrWVBMMDlGREFLQzVtRlZhTzF1N3crdW9lbEZITWR1MGlDeENGdXQ2YlpFRlVxeFhtSExXTkZFeThCaHdkWUZpdm1CQU1NYUVOTHhHZGhXMW9LNXd4SmFWODF6Vm9wY2pVQmhCYmlQZFh2aE9ycTF2NlRZazBsZzRhMjFZQUNXckxFa0J1N0VhcEtkTUVtdUFTV0xGNGFoTzArM1VxbG9hMnZMQ1I0K2p3cmtpOXAyWjliZG1Yc1hZV0t6MlhTTUdhYllUdVo2aFRMZll6NVpMRnJqTUg1YmtHSG53V0tNVXFta1NxWGl6TFZsVGozUDA4N09qbnN2dTNzSHpiWmZDWDBSQU81aE4rb2l1SGJNQ0FPQ2gzSWcwS0hOcTFzTHNBNWlXSEF1SmkrZnoydDdlOXRsQnZIL2xvQmdRaEFPQm04SFlnWEtwbms1YW0xN2U5dU54MjdHd0FKTnAxUFhRZzN0dFZ3Qjk2RllsVENLQ1hRK01ReWQyVVZnMXMwL2lvRzJXYTJTTHM4K0pzekZnbG5hSERUUCsrRFNiRG9YWmNBZFoxbm1yQzNDaWZ1enVaTWdDRndrc1g3SWxpMnRkd1VoOXVMaFBKUUZXdytWZUFsZUNwT0tJSkJPdHFFZjk0ZmpwNFFKbHNzaWRyNlBva2hIUjBkT0tDaDRwSmlrWEM2dmRQcEdhNWpBMld6bWprbVQ1RTRUWS9FM056ZWQ5V0Fod1RsV1cyeUlaN2V3cy9FVFVFc3VoTEFXMzJ1SkhoU0QrV0F1RVNqaWZINW45MkhhZ2hnN1B1dENMYkJsWFN3K3NCYkx1UUJlM2k2eVpabnNUYmdSUDU5TUpzNVVXYXJZdGlxRjNJRnRIQXdHYXJmYlRwcWhtcGxrWGdUaElaWEoyVDBJRkJxRUpneUhRN1ZhTFhkMEsxWUEvTURDWXkyd1pKenRBMFZ0b3dTMG5zVmtYRGJleHVKWS8yeXRHdS9EQXRxZjJ5eW5YVkJibVUxVVlZK2xzWXBwYXpTNUQ1YUFmb1hyQ1ROSlN3RmdjT3UveEhjd1NFdDNXZzIxNUF2L1Q5UFVuYUxCQkRKNHo3dmNabzcvNi9WNnptd0JXaXFWaWtxbGtscXRsdXZCYjNQWmt0d0VzWENEd2NDMXJFRVRPRUdMSmhmbGNubmw0RVhlRHg4UDFyQTdvTEF3dUV3c2hrM0NnRW5zMFRUcmMyckRXdTVMOXBSRnRBUVl0ZjFFVVN6MmszaWFkWExMaHJ6ckFzQzE0Z0lzY0VQU2JkVU9KcytHRS9nNjNBVytsWVdsenFCYXJUcXpQWmxNM0dUYnlpTTBFRitGMzBLYkVTeHlGWXdSd1FJTThlTHNUbW8ybTg1VWo4ZmpsVDJPYUlzdFpTZVVwS2V2ZFhQV3ZTQ3NJRzRFeHlvTmJkNXdSM1pQUHhZVXQySFBSVVJwRUhJcXFoQUFubWZ4bWdXaGpKbUZaKzI0dDdNQUZ1RFpYMWplMy9vd0MrTElaZHNPMVpQSnhGV2RVTVFRQklFejMxbVd1VU9xbUd5THlBbGI4SHNJbGMwVThyZDI0bTNuVE0vejNIMVpMQ0lGaEk2RjUzY2dkdDZYbmJWb0cyTW5wTFhGTXBabG8zWVM4TWlrNDYrcjFhcXpHQlprMjFEVWJyZmozbWl5RmI1MWZQWWsxdFlXa2lJRXpGMFFCTXNlUVVnUGwvVkpWZ0NRSlBzemZOOTRQTlo0UEY3UkF0d0IrUWIrenJZLzQ3SUF5emFsNlBmN3J2ek1tbDhiWFZTclZSZjJBS2lzVlpQa3VteXQ3NjFIRXdHVXNIZSs3N3VOTVFnSlNSYkxydG41UVBqUThpekxYSjRGUHNQM2ZXZktyWXV4bFZDNFc0NjVzOGt4Nit0NXRuMWZxN1IyUFJuYnVzVUliVkdocFdMWGI0YnBzeHM3K1R1U080dkZRdlY2M2NXdHhML3JyZExRVU12TjgxTHJwQVdoajZWU0NZRklvNUpaQS9oRTBmSmtMYlNhUkpmMTRkeC9YZGo1SENFYTRCZDJ6NXBaSnBlSXdSYk0ybmNGeVZ0THgvOVpkQXNjY1JlV2tMTEpMUXN3QWJWMnJTekhnanZFK3EwWDBEb21rQWxCS3ZrL04rRkZyTmFBYU5kZk9Fa1NkYnRkeDJTTlJxTW5hbkN0VmxzQktFUUQrRy9RUHViVHBvR3RsYkFsVDFnQytBSExBTm9KNDNzaURQejFrL2h6TE1BNmV1ZXlaaGJOWCtjNGlGNm9pTEpoSUhQTUJlVk5zUTYvdDN3SzY4SDhXZVcxN3NEMmV3Q3MyMDRzb1VXVS9JRTFIOWJVTVFodVpETkxmTTZpVnNDUFJicnJMMndIR3dTQkt6MkRGMEFiQ2FIUVpwQXlMc2ppQmJ0OWplZGE4c1lpNGlSSjFPdjFYRVJpdVEyckNPdUZyM2JPMWsyd1JlUE1IVVVlL0IveXh6S0VGTlVRdmNBMTJJT3cxME05N21ldEFoZDRCTzIzNjhnOVFpYUVQV1dZRUFvSExiZk5BeXhZaFBYQzkyTUIwQWo2RDF0QWhLYXNhNUcwckpLQnVxVVpFbHlBTmRsMklhd0paekxSV3Z2aWRzTHNWMDRIWFEvVkxKL09QUkVDRmdWc3crZHRQb0dGQit4U0gyRDVCN1NhalozMWV0MUZQZlppanEwbDRwbk1nN1VBbGk2MzFzT2VEeGtFZ2Y0Ly9GTzRXd1htM0NzQUFBQUFTVVZPUks1Q1lJST0="}} \ No newline at end of file diff --git a/sleap/skeletons/mice_of.json b/sleap/skeletons/mice_of.json new file mode 100644 index 000000000..93f6f0438 --- /dev/null +++ b/sleap/skeletons/mice_of.json @@ -0,0 +1 @@ +{"description": "Template Skeleton for mice_of reference dataset.", "nx_graph": {"directed": true, "graph": {"name": "Skeleton-1", "num_edges_inserted": 20}, "links": [{"edge_insert_idx": 3, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["neck1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegL1", 1.0]}}, "type": {"py/reduce": [{"py/type": "sleap.skeleton.EdgeType"}, {"py/tuple": [1]}]}}, {"edge_insert_idx": 4, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["forelegR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 16, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["nose1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 17, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["earR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 18, "key": 0, "source": {"py/id": 1}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["earL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 6, "key": 0, "source": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tailstart1", 1.0]}}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegR1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 7, "key": 0, "source": {"py/id": 8}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["hindlegL1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 8, "key": 0, "source": {"py/id": 8}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tail1", 1.0]}}, "type": {"py/id": 3}}, {"edge_insert_idx": 19, "key": 0, "source": {"py/id": 8}, "target": {"py/id": 1}, "type": {"py/id": 3}}, {"edge_insert_idx": 9, "key": 0, "source": {"py/id": 11}, "target": {"py/object": "sleap.skeleton.Node", "py/state": {"py/tuple": ["tailend1", 1.0]}}, "type": {"py/id": 3}}], "multigraph": true, "nodes": [{"id": {"py/id": 5}}, {"id": {"py/id": 1}}, {"id": {"py/id": 7}}, {"id": {"py/id": 6}}, {"id": {"py/id": 2}}, {"id": {"py/id": 4}}, {"id": {"py/id": 8}}, {"id": {"py/id": 10}}, {"id": {"py/id": 9}}, {"id": {"py/id": 11}}, {"id": {"py/id": 12}}]}, "preview_image": {"py/b64": "aVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUlBQUFBQ0FDQVlBQUFERFBtSExBQUFlRGtsRVFWUjRuTzJkZWJSY1ZaM3ZQM3Z2YzA1VjNicGpKakNFQkF3QmpHRXlCTVFHR1pTcEFYMkswTUpTY1dobld2dTViRjJyMTNwdjJVOVgvOUZ0ZDYvV2ZyVHRoQUtpSUdyMGlReU5vQ0FrQkdRS1F5QWhaQ0R6WFBmZXFqckQzdnY5Y2VyVVBWVzM3cGhiOTlZTjk1dDFWdDJjT25XbS9kdS8rZmZid25WZHl5VENXbHZ6S1lRWTl2ajY3NVBmRGZYL0dZd09RZ2lzdGNqSnVsZzlwSlJJT1NtWG44RXdjQ2JqSXVsWldrOE1JM0dBZW94MC9BeEhHQjJTOXpRekJkL2dxQktBRUdMTXM3RlpzSUMyRmozVk4vSUdRSlVBakRFWVk2YnlYZ0FJclVVQWN4MkhiaWtKclVVenc5YWJoYW9PMEFxelA3S1dDOXJ5WE52WnlWc3pHZnFNNFUvRklyY2NPc1MyS01RZDVoNW5aUC80SUNiYkRCd0tvYlc4dDZPRGI4eWRSNXVVUk5ZaWhNQUZuaXFYdVhIbkRuWkZFV29JczNDR0FNYUhHaDFncW1DQUhpbjVkSGNQT1NueEsvSS9zcGFTdGJ3dG0rVzZXYk54czFrOHowTXBOV05DVGhCcWRBQ1lHa0xRMW5KYUxzY2l6eU5zTUpORGF6bS92WjFqWjg4bWw4K1R5V1JRU3RYY2F5c3BzZE1KZzNTQVpyUFNaS0NFRURWS3B5ZmtrRGFwQlRLT1EzZTJpMGhLZktVb2w4dFlhMnZPWWEwZHRZZHhCakdja1Z5dHpVQjZvS1NVdU1DTFVjaXVLR0srNnhMVjNZTzBsZ09aREIyemVpQ1RvYmRRd0hFY0hNZkI5MzJDSUNDS29wbEJId2RrTWhqcFFXazIwbHdBUUFHN3RPYU92ajZrdFRpQXFHd0FrUkNjVWlweGVibE1XMGNIbVZ3TzEzWEpaREswdDdmVDJkbEplM3Q3VlQrWUlZVFJZMUpjd2ZXb2R3MExJWENFNEpiZUFuZ2U3Mjl2NXloajBFS1FxUnlyck9XcVBmc0kyOXY1aGVmaWVCN0dHS1NVR0dQd1BJOHdET252N3llS0lzSXdIQ1FPYk1XeW1NRUFoT000azI0L3BRZWhKaWdrQkpsOG5oUG16dVhObVN3eTM4WloybkQ1L3YwRHZ3WHV5bWI1bVRVVWkwVWtvTFd1NmdKUkZPSDdQc1ZpRWQvM3E0TStveHMweHBSemdCcHVBQkNHN0M0V0tYc2VlV0JmVHpkYVNhN2NzemMrSHJpbVhFWjRMcmQ0SG1FUXhMK3RETExqeEkrVUVFUkNIUFVLNHd4aUhCWUJXR3VSVW81SmQwaG1ZUDFuY2o2dE5YNnBSRWtwSEtBc0pmZDNkaEpaeTN2MzdrTVMrdzJ1Q1VKUWtwdWxKQWhEWkVXVUpMcU02N3JBZ0lzN2lpS2lLRUxybVFoREdvZEZBT05ocDhsdmhuTGthSzN4ZmIrcXpHbXR5WWNodjh2bDhMdTd1T2JnSVJTZ2dXdTBBYVA1bm80SUxBZ3N4aHFzalluQmRWMjAxdFZCTjhiTUVFQWR4cXdEVElRTVRjLytoSXZVbnp1Zno5UFcxbGJWOXJPNUhDcWI1YklvNHE4T0ZYQ3NBYTBKNWk5bTdmSjNVNXAvUEdGL2dZZFczOGVxdFk5U0RuMlVWRlVDMEZwWGxjTVpJaGpBbEJCQUdsTEtLaUdrUHozUEk1L1A0N3B1ZGZNOGozeFBEeGNVUzF4M1lEL205QXZvKzhEbmNEbzZrZFlBQW1IZ0Q0L2N6YmQrOGszOEtLZzZuTkppWUlZSUJqRGxEdlZrZ0JJbExmbE1CaXFSMjhtK2NtOHYvNjBrZHk1WVRQOVZuMEMwNTlHaFR4aUZoRkZBYUVNdVBQOUt6ajNqQWlJZDF2Z2JwSlE0am9QcnVpaWxwdmJCV3dSVFRnRDFGa0d5YWEwSEVZQXhCcjljcG5Ed0FQN0paK0hNbWdOUk5PaDhSbGd1UHVjeW5KVDVsMEFJZ2VNNGVKNkg1M2x2K0tEU21KWEF3L1VXTm5JOUQyVVdKc2VudVlQV210NytYcFIwVVZJUU5lRGsxbWp5cytjalp5L0M3TnNFd3FtS21nU0psUkJGVWRXVlBOa2UwVmJBbFBnQjBoaHU4Sk45VmUxZENDSmp1R1RKRXE1KzgzejhNR3g0VG1FTWU0eUh1dlFycUJmdnc2eDdFT3NYd1hFR21aMUtLVHpQcTFFU0U2N3pSdkFjVGprQkpLaFA3TERXWW9HaTd5T2ppSXd4Wkl6aDQyZXQ0S3NYbkU5Ynh2SkVzVURZM2dXbWxnMVlBYkxOSTl2ZVRiamlPdFNpNWVpbmY0WGQvanpXQURLVy96WHhDS1dxRm9mdisvaStYK1VLUnpJbTNSWGNhRVkxNGdKR0NPWjJkWEgyOGNmUjNkYkc2NGNPOGRFVksvaklXU3ZpQTQybVgzWHlkT2JOME5hQmtoS3cySXBNZDZUZ3ppMEgrT25tL2JpdUI2R1AzdkFJNXJuZlludjNnRXBDVG9OUlZUakxaY3JsOG9RK2Y2dGhTbUlCSXlHS05KY3VleXZmK0IvdjRiUTN2UW5YY2VncmwyblA1Y0JhcUJEUnJhdFhjZXVHYlh6eWsvK0g3dTQ1V0JQUkJpaGpFUklpQS8vMnlpNVc3ZTNIVXhLa2l5M3N4RHo3Rzh5cnE3QlJnSlcxMWtBNmJoQkZFZjM5L1RXQnBTTU5MVWNBV210T1hiQ0FCNzc0QmViMGROZHErWlhCTC9nKy8vemdnOXp4MG5vKzlJV3ZjOHFLODdFVlAwQ3VXS0xyVUI4QWpoRHNMb2Q4NDRYdHZPNWJIRXlWL2R1dHo2S2ZXWW5kOHlwV1NHeUtHNlJGZysvN2xFb2xmTitmckZjd3FXaEpHK2lHYzg1bXpxd2VDTU40MEpNTk1OYnk5ZnZ1NTkvLytERG5YbkkxeTk5eE1XaURNQlpoREtWc2h2NjJMTUphSW1zNXVzM2pFL005Y29lMllJU016Mk1NWXVFWk9KZDhHYm44YWtTbUhXazFTa3FVVWlpbHFxWmlKcE9wcHFBZGlXZ3BBckRXNHJrdTV5MCtBWWFJM0VrcDZROEM4dTJkbkhiMlJaZ29BbW9qaXYzdGJmaVpEQUlJdE9IMFk0N2gydHdCekpOM1Fya1F5MzhkZ2RlR092MTlPSmQrQmVmNHMzQWRCMGNPT0tlMDFsWEZNREVianpTMEZBRkFySUR0TC9ZUCszMi9IK0E0THUyZFBSWFdYM2VNbEJ6TWUvaEdJNFFnTXBZcjNua2w1K2REZVBCZlVWdi9IQjhvQk9nUU1Yc1I0dnpQWXMvNUdIUWNCVHJFVmh4UDFsbzh6eU5YeVVJNjB0QlNCQ0NFSUl3aWZ2SDBNL0hnMUZzTWpzUG1mZnRadldVTFFiR1BMYSsraUZLREI4V1JrcjJGL2R6Ky8zNUlFQVFJUURrZUg3bm04eXpwYmtldC9pSE80emNqRG0wSDVZS05mUXdzZmdkYy9HWGswa3RRYmdaaElxZ0VxL0w1UExsYzdvanpDN1FVQVFCSXBiamppU2RaK2VTVDRMcmdPS0FVZUM2RllwR3YzWHN2KzRwRmRCand5SDEzVVM3MzR6aGVQREJDeEJsR2pzc3JUei9LL1EvK2t0ODhjQ2RLS2JTT21OVTlsdzlmL1huYWNubkVsaWR3SC80UG5IWDNReFNBZEVDSGtPdUdGZGNqTHZvaXpvSmxTR0hCR3FRUTVMTWVEZ2FyTlJ3aFRxSXB0d0lhdVg0anJlbk01ZmpRMldkeDllbW5NN2VqblRXdmJlYkhqei9PcXMyYnllZHlsUVFRT08rU3E3bnl1czh4ZTk1OHBGS1UrZ3RzWEx1YUIxYitnRDI3ZHhFR21yKzU0YXVjZmZxNUJHR0E1M3JjKy9DdnVlV1gvNFVVZ0RIbzJjY1RMZjFMN0ZGdkFlSUJSemtRbEpFYi80Ulk5d0EyOHJGSG5Vd1JqK0xyTCtOdmV3a1QrU0NtdDNMWWNnU1F3RmlMTlFiUGRYR1ZvdC8zb1pMcGswVDFzdGtzQWt2WHJMbWN1R3dGK1h3N3ZRZDJZTU1pNVhLWllyRkUyUy9UMGRiRlZ6LzlkZDQwN3hpMDFnZ0VQL2o1dDNsdzFiMTRyb3ZWRVZaNW1PUE9JVHJwM2RqOGJEQVY4MU00aU1KMnNBYmJjVFJDT2Rpb2pML2xlZmJmL3g5RUIzWWc1UFFsZ3BZbGdBUW1TZWFrTnBFa01kRTh6NnVjeUtDVW9xdXJtNTZlSHFSUytMNlBNWWErWWgrbm52ZzJidnp3VjNIZERFSUkrdm9MZlBQN1gyUEQ1blY0Ymdhd0tDeTJZeDdCa29zSkZwd0IwbzBKUWFqNEJvd0JZbCtFY0RLVU5xeGgzeS8rQWF2RHdmcktORUhMNlFEMWtFSlU4LzBTV0d0cmN2eGMxNlV0MzA0bW15T01JdnFMUllJZ3dGcExHSVk0MHVHNWw1L2lOdy8rSENVbHhtaTZPcnE1NGYyZnBUUGZVNGtHYWdKdDBRZDM0ajMxVTNKcmZvUTZ1Q1VlV0tzcjhRYWIzQUEyOHNrdVBJWHN3bVVJMjdnNktiMnZWZEh5QkRBVTZoTTlremcvUUJBRWxNdmxLaEZJS1hHVXczMFByMlQxTXcvanVSNWhGTExrdUpQNTRGVWZBMncxTEZ3T1FvcmxNdUZyVHlELzhDM0V3VzFWNzJFTnJFVTRIdG41SnlIRjJNUGNyWUpwU3dCSmJrQVN4azFxQUJ6SHdSaERxVlNpVkNwVkkzckdHRXJsTXJldC9ENmJ0bTNFY1Z5Q01PRDhzOTdOdTgrOWlqQUtxdWMyeGhCWkNBcjdNSHMyZ21qd21rU2NkMkNMQjFDT1U2MVlsbExpdWk3WmJMYnFOMmpWd1lkcFRBQVFEMVFZaHRVdENJS3FLOWZ6dkNveFZHc0hFZXpldDVNZi9lSS9LUmI3NHBSMkxIOTF4UTBzTy9GMC9NQ3ZFbFVZUmtTUkpucHRUZXcxckNjQzZVTHZIcHc5cjVESnRWV1ZVNlVVUFQwOUxGeTRrSG56NXVGVWNoQmF0WHA1V2hOQWtqYWVGSWo2dmsrNVhFWktXVlVTazB5Z1pQTmNqeGRlZVlhZjMzTXJRc1JsWmZtMmRqNSt6WTNNbVRXUEtFcEYvcFFETzlhaDE5NGRleHlWRy9zTEhBOUtoK0RwdThqYU1wMWRYZFVzNW82T0R1Yk5tOGV4Q3hjeC85aEY1RHU3UVRxSVJseWtCWERZVnNEaFpzMk1sVDAyS3ZNU0ZRZVFVcXFtVUZSS1dWTVpsRnpQR0FOQzhPbnIvcFlMMzM1cDFUL3c4SnJmOCs4My8yTlZiQWdoWW9VUFVQUGZpcnZrSEd5Mkc3dHZFMnhlQXdkaS9TQmRrR0tNWWRic09WeXcvQ1RPUEM2UDhmdjR3N09idWZ1eGw5bXoveEJLTlo4UXhqSW1MVzhHMWlOTkFQWDdrMktRenM3T2F0TG5VT1h2eGhpNk8zdjR1MC85QTRzWG5rZ1loVGpLNGRaZmZaYzdmbnNMamtxbmo4VW1vcGZOWW96RjZBZ1FnNVJEV3puL0Y2ODZoYzljK1ZieUdRVlNnSUZIMW03alkvLzBXMTdkdnIrU3ZOSThqSVVBV3BNdmpST0oyZGZiMjB1aFVLQ3ZyMi9JWkUrbEZJZDZEM0R6WFRkeHFQY2dTaXFNTVh6Z0x6L01pbFBQUWV1b2VrNFFXT21nRFZnRVFqbnhsaEl0UWdpQ1VIUHBHUXY0MHZ0T0llOHAwQlpDQTlwdzN2S0YvT3VuTDhBWll5bmRlREFXam56RUVFQjZrQk45b0wrL24yS3hXQ01HMHFYaWp1T3lmdE5MM0hIM2o3Q1ZmN2xzanIvKzRCZVlmOVNDS2hHa1JRaFFsZWZwYXhwajhSekorOTl4UE1KUllPb0cyWSs0Nkl4Rm5MYjRLRXo5ZDFPSUNTZUErb1lUSTIzak9mOW92ay9rY2JsY3JwcURqYko5UGRmam9kWDM4Y0NmZm9mcnVFUlJ4TEZ2V3NUSHI3MFJ6OHMyR0h4UmsySmVyV013R2svQmtxTTdCdzkrZkNEdCtTeExqdW1CRnVwN2VNUndnRFNTSXBJa3FTT3hFaElQWXJyUXhCaUROWlk3N3I2WkZ6ZXN4WFU5Z2pEZzdXZWN4d2N1dng1ak5LUWNQZlhFbTdCL0tTVitaSGx0VnlHVysvVVFnbEl4WU11ZUF0QllqNWtLSEpFRUFBUDlBWUFhSWtqdlMyb0VwWlQwRmZ2NDBWMDNzZi9nWHBSU1JEcmlmWmRkejl2ZjlrN0N1dnFENU54SjZwaVVFaVVsb2Jhc2ZIeHp6QUhxaWNCMWVPekY3VHkxZmpkeUVpeUIwYUxtVGxyUlVURmVwQnRDSkpaREVBVFZMUkVGaWFzNDQyWFl0TzFWYnYvTkQ2cS84OXdNZi8zQkw3RG9tT014UnRldy9yUW9TSnhQR2MvaGQzOStuZS84OW5uOFNBOWtuVXZCMnZXNytmdGJWaEZHcGlhd05kV29JWUNKWUV2MW12RklXek5STDcrVGZlbVdNZ21zdFFnRUQ2MjZqN3NmL0NXdTQ2SjF4UHg1eC9ESjY3NUl4c3NTNmRvNnhBVFZQa2RLZ1pEODA4b1hlT2paSGVBb1VJTFg5NWI0L1BlZVlOM1dnemhPNjh4K2FBRVIwRXdpU0FhN1h2dXYvMHpjeU1ZWWhCRGNkYyt0UEx2dXozZ1ZmZURNVTgvaG1pcytUQlJHMWNGT1loSDErb0RqS0x4TWhuS0tWdnA5UTZHa2thTDEraGhPT1FFMEc0MW1lNEpFVElSaFdEM0dkVnlDS09EbU8vOHZ1L2J1UUNtSEtBcDV6OFhYOGhkblhrQVFsS3R0Y1licU8rUW9oZXNvRW0zZllsRlNvQnR3cEtsR1N4REFaSENCWktCcWJYZFRZeHBDVEREV1dEWnNmb1h2Lyt6YmxTaWh3RkVPSC8zQTUxaDR6R0w4d0srcFdrNy9Qckh3WlBxWmJFVVBNUU5WenExQ0NFM3pBd3kxZjZMOEFXTkJFakpPRDN4OWpLRCtYaDNsOEtjbkh1U1g5OXlPb3h5MDFzeWRkUlNmdVBadmFNdmxCN1dvclo2UHl0OWFrN1M3REtLSVFxR0F0VE1jWUVxUW1IeUpuRSszakVtMGVhaFZHdVA5aXR0L2ZUT3Jubm9ZejhzUVJnR25ubndHSDd6aW94Zzd1TG0yTVFZZHhTWm40a1ZFUUxuc3MzLy9mb0lnbkJUbGR5d1lNd0dNOUFCcEpTbTlUZldEcHp1TzFIT0NldTllK2puSzVSTC9lZXUvc0hYN0poekhJWXhDTHJ2Z3ZaeC8xc1g0Z1YralRNYm5IT0Eyc1JrWXkzNnROY2FhbGhwOEdBY0J0Skw4R2lzU2hTK3R2U2ZpWVNoRjBYRWNYdCt4bVp0dStSZks1VEpDU0tTUWZPVDluMkx4d2hNSndvRkdsWkNJZ3loT0xhOGdlVit5eFFZZnBrQUhtRW9rQTU0NGd0THU0a1orZ1FTZWwrSHhaeDdoOWwvL01NNHhNSnFlcmpsODZ2cS9wYnV6QjUxcVVHRUJtNDRGaUlFeXg3SE8vc25nRm04SUhTQ05SUGJIY2xyWFdBTnBVWlVrbUNUNmdWSU9kLzN1Tmg1NS9JR3FQckQwaEZQNTBIcy9HUmVUVmhROGEweFZQMGhnSzZuazFyWmVmdUFiamdCZ0lLMDhhZnhRRFFwVkNDQko3a3luazBraENhT1E3L3prMzlpNGVUMk80eEpHQVJmOXhXVmNmTzRWUk9sNGdhV205NGd4c1pkeFBQY0pnOXZyVHlUZWtBUUFBMFNRSHZ4MEo3SWswVFJ0NHp2S1llZWU3ZHgwNnpmcEwvWWhoUVFFMTEzMWNaYWVlQnBoRkJOQnpEM2tRQmtCU1VQTXc3L3ZlbVgxc004M1lXZWFobWpreVV1TGhIUXdLWG5wR1MvTDA4K3Y0U2NydngvWGpGaERaM3NYbjdqMlJ1Yk9tbGVwV25JSDVmNUpwWENjZ1RUeDBZaUNoQnVsTGFsc05qdWgzR0RDQ2FEVnpKeVIwR2l4ckhTRUw3MGwrb0RqdVB6bXYzL09RNnZ2eDYwVW1aeXc2R1ErY3ZWbnlMZTNrMi9QNDdrdUNRc1FRdUo1TGw3R082eE9JMG5jWWlJVjZxWllBZE1GYWZrUDFMUytUMkw5OVZ0eW5EYWFILy9pTzJ6WXRBNjNvZytjdS94Q3JyancvWldzWkRmSkVnVWh5R1p6MVU0am81MGt5ZjJsZlNzSkFiUXNCNWh1cUU4WlQ1Q1VtdFUzcTNaZEY4ZHh5TGdaOXUzZncvZCs5aTBLZlllUUlpNHl1ZXFpYTFoNndpbG9NeEFPdERZbXFHeWwzOUI0NVhpYTlUZU5BMHkxeDI2eVVSOGJTSkJPTTA5U3pKTy80MllVc1gvZ3BRMXJLMG1sOGJseTJUYmUrNjdyNld5ZkhSZVZZcXNpUll3ekk3aVpjWk1ST2NDUlRoREo0Q2RtWVNPUFlQSU9rbTZpaVNpQTJGUDQ0R1AzOE5EcWU2dEpKUE5tTHlBejV5SktvVXZKT29RVkl0RGF0RnpQd1RlOENJQ0JhR0Y2ZFJFWW5GYVdhT1ZKdTNsakRJTFl3WFBuM1Q5bTNjWVhjQjBYYk1SQnM0ZzFwY3RaM1hzSi90eExlY2RaYjhPYXVBeTltaWZRQW9Rd1F3QVZwTlBHMDF4Z3dFOEFFUkt0TWhpVlFia1paS1V5U0NsRmIzK0JXMzcxWGZZZTJGUGQ3ektMakozRDdJN2xmUHdEWCtHeWQxMkkxaUd0OU5vSDNjbFV4dTJuQ29uenAxd3UxOFFJNGp6QnVNQkhZRGw3WHNDWFR1dmpzNmVVT2JISFlvUkVveWhyZ1JFZXUzZXRaOTNHMVNpVmlBZ0RHSXdKVVRiTGV5NitnYU9QbnQwd2xEeFZhSmx1NGEyQUpIMDg3UUxHY1puWHJ2amE4b084ZTBFSlI4V1Q0Tk1uU2I3N2ZKYkhkbVU1WTI2UlpiTUNGczEyMkgvU2NZUU5GakdJZE1SUnM0OWwyYkxUMmJyMXZwYnBQRHBEQUNrSUlhcnUzMXd1Unk2WHc4a292bnhhTDVjZDN3OWFnb2xuYlZmRzhuZG5sckNtaEpBV2hNSEtOaDV5Mm9ZOHZ4UUtwYnpKZXB4Um9YV0VVUXNnaVE4RVFVQi9meitGdmlKSHF3THZtbCtNQno4dEFTMWdLa0VmS3dDRnNFWG1sWi9HeXNIelNrbkpvYjU5Yk56NEFrTzFxWjhLREVrQTllYmZhTTNCeWN6N2J5YWlLS0szdDU4NXFrQlBacGdWUndYMCtiQmhyMlhsOHhFcjcva2xSWDgzcnBOQklCRUlsSEJ3WEpjL1BQNXJYbjc1dFVucEVUQmF6SWlBWVdIWWNpQ2s0RXM2YzJKd1RhZUVGL1lvUG5WM3dQTTdBd29CQ1BzVWwrNzZLdGRkLzNrV3psNkNhMTMyNnQwOHMrcjMzSHpiRDRqWFNtKytNajFhZC9FTUFRd0RSOExhWFlaSHRocXVXS29nU0gwWmMzMSs4cExpc2MwR0tTeU9BSVRpM2djZTVqbTFnVE51T0JQUFp0aFoyazcvdzRjSUFvR1VFNU1ZVXQ4b28zNndSK3N5bmlHQUVhQ041ZS8vQ0F0N0pLY2NaYW5PWGdPM1AyUDVyeWVLQ0JHazh2MHNEZzdsUTJWZURWNEJhVkhDb2FPbmcxeTJ3TUhDd2FiZGF6TG9UcVZyV1gzUlN5UE1FTUF3c05haUpEeTN6ZWZTMnpUdk8wbHg0U0lvK0paZnJZdTQvMVZOb0VISndUTk45Mm1VVVFncFFJRm9FM1IzZGJQdjRENUtwZEpoNjBmMTEwdUtYRHM2T2dpQ2dHdzJPNmdpdWhGbUNHQVVVTkt5b3hCeTArTWhOejArc0YvS2VQRHJZYkdFdldHOHdyVURTQkJaUVZ1dWpiYTJ0cVlzUkdWdDNFYzVsOHZWNURxT2hCa0NHQ1ZVUmVhUENnSjByOGJxT0JmUVNvdk4ybXFUNjhORkkvbWVkRVE3ZVBBZ3J1dldOTThjRGpNRTBBUUlCQ1kwNkpKR3RhbTQrMUFtN21McXFMaWh4R2htNTFpUnBMc256cXdrbVdRNE5KMEFKdG9YTUMzaUVRS0lZajJBT2ZFdWt6VUlLWkRxOEpNNmg2cTdFRUxVWkRpTjVqcXQ0NUU0d21DMVJmZFh1b1RZbUFDUWpDczl2Sm1ZSVlBbXdVWXBBZ0JNeG1CRjYzR3ZHUUpvQmtSY0htYjZLZ21kVm1BeXBwVkNBRUFsN1h5cWIrSkloYVdXQTlpTXJWb1JreFVqR1UwOFpzWUthQ0owbjY0V2lscHBNWjZaMUI2Um8xR1laemhBa3lBUXNSV1E1SVlvWWdKb0lWaHJ4MDhBMHozY094bUllaU9zSHVBQTJ0VVkzVnBFTU80T0lmWFJxRGNhUnBNckdmVkZzUWl3WU5VQUFiVFM1RGtzRVpEVXlzMmdNYUpDUkJUR0ZVTENFUVFpSUNnRkxkVXBiTnhLWUN2Yy9GUmlwQmxzTUhpdXg2bnpUMmJKZ3VQSmVCN2J6QzRlM2JLR1BZL3VtZkF5Ny9GaXpDdUcxTi8wWkJQQ2RDQThZeXo1MlRrKzl1M3JPUDI4cFJodHdWcWtKem00cjhBUC91ZFBlZkdCbDFzaU03amxlUGlSVUpkZ3JlSGNENS9OMjk2MWpEQ00wRWFqclNIMEkzcm1kUEcrcjF4T3BpTlQyMHRvaXRCeUJERGRra3JyOVNCckxObjJER2Rjdmd3ZERLNFBDUDJJWTA0OG1zVm5IemVvbDlCVW9DRUJEUFhpUjZ2NVQ0ZUJPMXdNUjZES1ViUjM1eHZPY0dzdHJ1ZlMxcFZyOWkyT0NnMEpZRFNEUEJ4TG5raFdQVks3K1lua0dHTTVYN3JaWkgxeVpybmZaOU56VzFIdTROY3JsYVIzZngvYlh0eFJNNkdTRGlTVExlYkdKQUlhTlZJNDBqQWVRcW81WG9BT05ZL2V2b2IrM3RyY1B5a2xidGJoaVh1ZVplZTYzVFVMVG1ReW1TbFJDbHRPQjVoS1RKVFNLUkJzZW5JcmhWMTlDQlVUZ0hRbHhWS0pCMjU3aEpYL2VFL045WktheEtSMzhXUmlKaGpVQkZnc3g1MitrSjc1M1ZoamtVcnk1TXBuK2QxM2ZzL3JMMnhIVXJ2MERGRFRsMkF5NFVCdFE4S1JLa3BHb3REcExoN3E3My9NUFhrc2dPRFVkNzJGYkp0SEZFYVVlMzBldmZsSnRqMi9BeVhqVlBINmR6NFZFRUxncFAzNjA4WDBtZ3FNbGhDTU1lUzdjaXg5NTRub1NDT1ZaUHNMdTlpelpSL0tVWVBPTWRVVHBrb0E5WW1FUTNXa21rNE9tWWxBMGpNNGtkWERQYnNRQWdzc1huNGM4NDZiZ3pFV0pRU3ZQUG9hcFdLODFNeFV5UG5oSUJOSFJuckFoNm9NcnYrK2xSNmttUmoxODFhV2hsbDI0Y2w0V1JjaG9QOUFpVmNmMzRURnRDU1hkV0RvUlI0UzFCY2cxTzlMWTZSWVFhT0hIN2UyM1VCK1R2VExUZXJyWU9TS1cyTXM3ZDE1bHI1elNRMzczN2YxUUxXYmVIS2V3OFZFMUJZSUlXcXRnRFFSalBURDVFVU10ZTVPbzJPaDhjT1BWZEdhN0JrMDJ2c3lSdlBtNVF1WnMzQTJ4bGlrRUt4L2JCTjloYjRSeGNkWWtIUXJtd2h4M0hRenNGSE93R2k1eDdTQ2plMy9oUDJIUVVUeFlJbU5UMnhHMjZHWHJodjM1U1pJRjJzNkFUU2pCS29WWWF5bHZTZlBXODViUWhScGxDUFp0blluQjdZZGloZU1tRUJNcE10NHpBVFFTRDhZcmxGQnMyWDBhREdSRFpZYndSak40aFhITWVmWVdWZ1REM2t6Mkg5OHJZbGJmbTdjaTBaTnR4aDlVN1Z2Q3dMSktSWDJEN0gydjJIMWEvaWhQK0h0WWNlaW80MkVHVmZ3Qk1CYVMvdXNOazVPc2YrdHorMWc5K2E5UkRxYXRFbVNYdW9tV2ZSaXhOOU13bjBkOGRCR2M4S0s0NW16b01MK2plV2xQNjZudDlBM3FUcFEvVHBINDJvU2xYZ0ZoMHNLZ2RyNHdYQm90azR3RmhOeUxETngxT2UxOFlvZ3l5NDhHVGZqRUFVUmZmdjZXZmZvZW94cHZITDVlSkcwZ1VuL1A0MWt4bzhsY2FmaGVnRktxV0VKb0JVeVdsdEMvN0J4QzloOFY0NmxDZnQzRlJ1ZjNNcnV6WHN4REU0V09WeTRyanRpT3Y1WTNrdEREcEIyOHJ4UnpMaXhJbm5KSjU2OW1QTS9kQTZ6anVtSmV3SVl6ZHJmdjBTNVdFWTRFenRKaEJBMUN1VklYSGdvYnBzK2ZoQUJwRTgrNVRPc1JXR3RSVWpCZTc1MENaZDg1Z0ljTDJiOVFnaWl5RkRZMzR1MkdtVW5Qc05uUEdKc3VIMXlxQnk0aE5YWGJ4UE4rdXNmcUpHSjJRb21aL3I2V210T3VmQXRYUGI1aTVCS0VnVlI5UmczNjNEWmpSZVNiYzgwalhzbTkzSTRwbTN5MjFFdkdkTk1PN3JSNEtZRFZLMkE2dlBiT0lIenpQZWNobkxrb0dKUEV4bU9YVHFmRTg1Njg3RHJFVTgxa3VjNWJEL0FTQnJ1U0ZiQVVOOU41c3RLejZhUm5zTllnMVN5NnZGcmRDNG42ekJyZm5mVDduZXNsdGh3NXpsc1A4QklpdUowOUJvMlFwWHRJdENSWnVzTDI1RU51a1FLSWZEN2ZMYS9zclBsR2tMVlEwcloyQXhNSTFsVnEzNGJTWFlQdFkzMStJbmVHaUU5bytxZmY5QjNJdjU3emNxbktSWktPSzZxT2RiTGVieXk2bFUyUGJPbG12dlhMT0lmcTFpdTEvR3N0YkVTMkV5TVpTREdjcjZoL3Q4TTFJc0hwUlRybjlqSVQvL1hTZzdzUEloeUpFN0d3VmpEY3crOHlFLy85MHFpUUUrNXIyUWtXR3NSdVZ6TzFsTisrb1dPRkhrYTZlVzNHdHNmemFDa2syVFRxSGtXRzFzRHN4ZjBzUFQ4aytpYTI4RnJ6MnhoL2VxTitPV2dKU3AvNjVGK25xUVNTV1N6V1F0RG14WXpCSkJTQUJ2b09pWXlHQWIyU3lIakR1RXRpRVlFNENRUFZlOWRhdlRqcWRMU0p4SWozWGY2T2RPZmpYSWhoUkJJUnlLWi9KcSs4U0M1eDNUQVNDYSsvN0cyZXhuTy9YZ2thUDMxYVBRczAvWDVFcWNlZ0pOT0MyOGt0eHBWdjZiL3JtZUxFNW4xTzlrWVB1UFhWTDJqVUdzeDFQODlXVWc0MDFpdVdTL2l4OVVsTE8wU0hxMU1iV3BHemdSaExMcE8rbmxhL2JuU1NNOStnUDhQSTRkcXRleWZPbmtBQUFBQVNVVk9SSzVDWUlJPQ=="}} \ No newline at end of file diff --git a/sleap/util.py b/sleap/util.py index 1335bcac4..d3a3073c2 100644 --- a/sleap/util.py +++ b/sleap/util.py @@ -1,35 +1,34 @@ -""" -A miscellaneous set of utility functions. Try not to put things in here -unless they really have no other place. +"""A miscellaneous set of utility functions. + +Try not to put things in here unless they really have no other place. """ +import base64 +from collections import defaultdict +from io import BytesIO +import json import os +from pathlib import Path import re import shutil - -from collections import defaultdict -from pkg_resources import Requirement, resource_filename - -from pathlib import Path -from urllib.parse import unquote, urlparse +from typing import Any, Dict, Hashable, Iterable, List, Optional from urllib.request import url2pathname +from urllib.parse import unquote, urlparse +import attr import h5py as h5 import numpy as np -import attr +from PIL import Image +from pkg_resources import Requirement, resource_filename import psutil -import json import rapidjson import yaml -from typing import Any, Dict, Hashable, Iterable, List, Optional - import sleap.version as sleap_version def json_loads(json_str: str) -> Dict: - """ - A simple wrapper around the JSON decoder we are using. + """A simple wrapper around the JSON decoder we are using. Args: json_str: JSON string to decode. @@ -44,8 +43,7 @@ def json_loads(json_str: str) -> Dict: def json_dumps(d: Dict, filename: str = None): - """ - A simple wrapper around the JSON encoder we are using. + """A simple wrapper around the JSON encoder we are using. Args: d: The dict to write. @@ -65,8 +63,7 @@ def json_dumps(d: Dict, filename: str = None): def attr_to_dtype(cls: Any): - """ - Converts classes with basic types to numpy composite dtypes. + """Converts classes with basic types to numpy composite dtypes. Arguments: cls: class to convert @@ -95,8 +92,7 @@ def attr_to_dtype(cls: Any): def usable_cpu_count() -> int: - """ - Gets number of CPUs usable by the current process. + """Gets number of CPUs usable by the current process. Takes into consideration cpusets restrictions. @@ -114,8 +110,7 @@ def usable_cpu_count() -> int: def save_dict_to_hdf5(h5file: h5.File, path: str, dic: dict): - """ - Saves dictionary to an HDF5 file. + """Saves dictionary to an HDF5 file. Calls itself recursively if items in dictionary are not `np.ndarray`, `np.int64`, `np.float64`, `str`, or bytes. @@ -162,8 +157,7 @@ def save_dict_to_hdf5(h5file: h5.File, path: str, dic: dict): def frame_list(frame_str: str) -> Optional[List[int]]: - """ - Converts 'n-m' string to list of ints. + """Converts 'n-m' string to list of ints. Args: frame_str: string representing range @@ -183,8 +177,7 @@ def frame_list(frame_str: str) -> Optional[List[int]]: def uniquify(seq: Iterable[Hashable]) -> List: - """ - Returns unique elements from list, preserving order. + """Returns unique elements from list, preserving order. Note: This will not work on Python 3.5 or lower since dicts don't preserve order. @@ -203,8 +196,7 @@ def uniquify(seq: Iterable[Hashable]) -> List: def weak_filename_match(filename_a: str, filename_b: str) -> bool: - """ - Check if paths probably point to same file. + """Check if paths probably point to same file. Compares the filename and names of two directories up. @@ -228,8 +220,7 @@ def weak_filename_match(filename_a: str, filename_b: str) -> bool: def dict_cut(d: Dict, a: int, b: int) -> Dict: - """ - Helper function for creating subdictionary by numeric indexing of items. + """Helper function for creating subdictionary by numeric indexing of items. Assumes that `dict.items()` will have a fixed order. @@ -254,8 +245,7 @@ def get_package_file(filename: str) -> str: def get_config_file( shortname: str, ignore_file_not_found: bool = False, get_defaults: bool = False ) -> str: - """ - Returns the full path to the specified config file. + """Returns the full path to the specified config file. The config file will be at ~/.sleap// @@ -352,8 +342,7 @@ def make_scoped_dictionary( def find_files_by_suffix( root_dir: str, suffix: str, prefix: str = "", depth: int = 0 ) -> List[os.DirEntry]: - """ - Returns list of files matching suffix, optionally searching in subdirs. + """Returns list of files matching suffix, optionally searching in subdirs. Args: root_dir: Path to directory where we start searching @@ -389,3 +378,18 @@ def find_files_by_suffix( def parse_uri_path(uri: str) -> str: """Parse a URI starting with 'file:///' to a posix path.""" return Path(url2pathname(urlparse(unquote(uri)).path)).as_posix() + + +def decode_preview_image(img_b64: bytes) -> Image: + """Decode a skeleton preview image byte string representation to a `PIL.Image` + + Args: + img_b64: a byte string representation of a skeleton preview image + + Returns: + A PIL.Image of the skeleton preview + """ + bytes = base64.b64decode(img_b64) + buffer = BytesIO(bytes) + img = Image.open(buffer) + return img diff --git a/tests/fixtures/skeletons.py b/tests/fixtures/skeletons.py index ce214eed2..311510e6a 100644 --- a/tests/fixtures/skeletons.py +++ b/tests/fixtures/skeletons.py @@ -48,3 +48,8 @@ def skeleton(): skeleton.add_symmetry(node1="left-wing", node2="right-wing") return skeleton + + +@pytest.fixture +def flies13_skeleton(): + return Skeleton.load_json("sleap/skeletons/flies13.json") diff --git a/tests/fixtures/videos.py b/tests/fixtures/videos.py index 81d096f81..b160caedd 100644 --- a/tests/fixtures/videos.py +++ b/tests/fixtures/videos.py @@ -54,6 +54,11 @@ def small_robot_mp4_vid(): return Video.from_media(TEST_SMALL_ROBOT_MP4_FILE) +@pytest.fixture +def centered_pair_vid_path(): + return TEST_SMALL_CENTERED_PAIR_VID + + @pytest.fixture def centered_pair_vid(): return Video.from_media(TEST_SMALL_CENTERED_PAIR_VID) diff --git a/tests/gui/test_commands.py b/tests/gui/test_commands.py index 20d8ba6fa..6423b5099 100644 --- a/tests/gui/test_commands.py +++ b/tests/gui/test_commands.py @@ -4,6 +4,7 @@ from typing import List import pytest +from qtpy.QtWidgets import QComboBox from sleap import Skeleton, Track from sleap.gui.commands import ( @@ -22,6 +23,7 @@ from sleap.io.format.ndx_pose import NDXPoseAdaptor from sleap.io.pathutils import fix_path_separator from sleap.io.video import Video +from sleap.util import get_package_file # These imports cause trouble when running `pytest.main()` from within the file # Comment out to debug tests file via VSCode's "Debug Python File" @@ -382,9 +384,7 @@ def test_OpenSkeleton( ): def assert_skeletons_match(new_skeleton: Skeleton, skeleton: Skeleton): # Node names match - for new_node, node in zip(new_skeleton.nodes, skeleton.nodes): - assert new_node.name == node.name - + assert len(set(new_skeleton.nodes) - set(skeleton.nodes)) # Edges match for (new_src, new_dst), (src, dst) in zip(new_skeleton.edges, skeleton.edges): assert new_src.name == src.name @@ -399,10 +399,14 @@ def assert_skeletons_match(new_skeleton: Skeleton, skeleton: Skeleton): def OpenSkeleton_ask(context: CommandContext, params: dict) -> bool: """Implement `OpenSkeleton.ask` without GUI elements.""" - - # Original function opens FileDialog here - filename = params["filename_in"] - + template = ( + context.app.currentText + ) # Original function uses `QComboBox.currentText()` + if template == "Custom": + # Original function opens FileDialog here + filename = params["filename_in"] + else: + filename = get_package_file(f"sleap/skeletons/{template}.json") if len(filename) == 0: return False @@ -414,14 +418,20 @@ def OpenSkeleton_ask(context: CommandContext, params: dict) -> bool: # Load new skeleton and compare new_skeleton = OpenSkeleton.load_skeleton(filename) - (delete_nodes, add_nodes) = OpenSkeleton.compare_skeletons( + (rename_nodes, delete_nodes, add_nodes) = OpenSkeleton.compare_skeletons( skeleton, new_skeleton ) # Original function shows pop-up warning here if (len(delete_nodes) > 0) or (len(add_nodes) > 0): - # Warn about mismatching skeletons - pass + linked_nodes = { + "abdomen": "body", + "wingL": "left-arm", + "wingR": "right-arm", + } + delete_nodes = list(set(delete_nodes) - set(linked_nodes.values())) + add_nodes = list(set(add_nodes) - set(linked_nodes.keys())) + params["linked_nodes"] = linked_nodes params["delete_nodes"] = delete_nodes params["add_nodes"] = add_nodes @@ -433,7 +443,7 @@ def OpenSkeleton_ask(context: CommandContext, params: dict) -> bool: skeleton = labels.skeleton skeleton.add_symmetry(skeleton.nodes[0].name, skeleton.nodes[1].name) context = CommandContext.from_labels(labels) - + context.app.__setattr__("currentText", "Custom") # Add multiple skeletons to and ensure the unused skeleton is removed labels.skeletons.append(stickman) @@ -455,9 +465,20 @@ def OpenSkeleton_ask(context: CommandContext, params: dict) -> bool: params = {"filename_in": fly_legs_skeleton_json} OpenSkeleton_ask(context, params) assert params["filename"] == fly_legs_skeleton_json + assert len(set(params["delete_nodes"]) & set(params["linked_nodes"])) == 0 + assert len(set(params["add_nodes"]) & set(params["linked_nodes"])) == 0 OpenSkeleton.do_action(context, params) assert_skeletons_match(new_skeleton, stickman) + # Run again with template set + context.app.currentText = "fly32" + fly32_json = get_package_file(f"sleap/skeletons/fly32.json") + OpenSkeleton_ask(context, params) + assert params["filename"] == fly32_json + fly32_skeleton = Skeleton.load_json(fly32_json) + OpenSkeleton.do_action(context, params) + assert_skeletons_match(labels.skeleton, fly32_skeleton) + def test_SaveProjectAs(centered_pair_predictions: Labels, tmpdir): """Test that project can be saved as default slp extension""" diff --git a/tests/gui/test_dialogs.py b/tests/gui/test_dialogs.py new file mode 100644 index 000000000..250e91bdd --- /dev/null +++ b/tests/gui/test_dialogs.py @@ -0,0 +1,114 @@ +"""Module to test the dialogs of the GUI (contained in sleap/gui/dialogs).""" + + +import os +from pathlib import Path + +import pytest +from PySide2.QtWidgets import QComboBox + +import sleap +from sleap.skeleton import Skeleton +from sleap.io.dataset import Labels +from sleap.gui.commands import OpenSkeleton +from sleap.gui.dialogs.merge import ReplaceSkeletonTableDialog + + +def test_ReplaceSkeletonTableDialog( + qtbot, centered_pair_labels: Labels, flies13_skeleton: Skeleton +): + """Test ReplaceSkeletonTableDialog.""" + + def get_combo_box_items(combo_box: QComboBox) -> set: + return set([combo_box.itemText(i) for i in range(combo_box.count())]) + + def predict_combo_box_items( + combo_box: QComboBox, base=None, include=None, exclude=None + ) -> set: + if isinstance(include, str): + include = [include] + if isinstance(exclude, str): + exclude = [exclude] + predicted = set([combo_box.currentText(), ""]) + predicted = predicted if base is None else predicted | set(base) + predicted = predicted if include is None else predicted | set(include) + predicted = predicted if exclude is None else predicted - set(exclude) + return predicted + + labels = centered_pair_labels + skeleton = labels.skeletons[0] + + skeleton_new = flies13_skeleton + rename_nodes, delete_nodes, add_nodes = OpenSkeleton.compare_skeletons( + skeleton, skeleton_new + ) + + win = ReplaceSkeletonTableDialog( + rename_nodes, + delete_nodes=[], + add_nodes=[], + ) + + assert win.table is None + + win = ReplaceSkeletonTableDialog( + rename_nodes, + delete_nodes, + add_nodes, + ) + + # Check that all nodes are in the table + assert win.table.rowCount() == len(rename_nodes) + len(add_nodes) + + # Check table initialized correctly + for i in range(win.table.rowCount()): + table_item = win.table.item(i, 0) + combo_box: QComboBox = win.table.cellWidget(i, 1) + + # Expect combo box to contain all `add_nodes` plus current text and `""` + combo_box_text: str = combo_box.currentText() + combo_box_items = get_combo_box_items(combo_box) + expected_combo_box_items = predict_combo_box_items(combo_box, base=delete_nodes) + assert combo_box_items == expected_combo_box_items + + # Expect rename nodes to be preset to combo with same node name + if table_item.text() in rename_nodes: + assert combo_box_text == table_item.text() + else: + assert table_item.text() in add_nodes + assert combo_box_text == "" + + assert win.result() == {} + + # Change combo box for one row + combo_box: QComboBox = win.table.cellWidget(0, 1) + combo_box_text = combo_box.currentText() + new_text = combo_box.itemText(len(rename_nodes)) + combo_box.setCurrentText(new_text) + + # Check that combo boxes update correctly + assert get_combo_box_items(combo_box) == predict_combo_box_items( + combo_box, base=delete_nodes, include=combo_box_text + ) + for i in range(1, win.table.rowCount()): + combo_box: QComboBox = win.table.cellWidget(i, 1) + assert get_combo_box_items(combo_box) == predict_combo_box_items( + combo_box, base=delete_nodes, include=combo_box_text, exclude=new_text + ) + + # Check that error occurs if trying to ONLY rename nodes to existing node names + assert win.table.item(0, 0).text() in skeleton.node_names + with pytest.raises(ValueError): + data = win.result() + + # Change combo box of a delete node to a new node + combo_box: QComboBox = win.table.cellWidget(len(rename_nodes), 1) + combo_box_text = combo_box.currentText() + new_text = combo_box.itemText(3) + combo_box.setCurrentText(new_text) + + # This operation should be allowed since we are linking old nodes to new nodes + # (not just renaming) + assert win.table.item(len(rename_nodes), 0).text() not in skeleton.node_names + data = win.result() + assert data == {"head1": "forelegL2", "forelegL1": "forelegR3"} diff --git a/tests/nn/test_viz.py b/tests/nn/test_viz.py new file mode 100644 index 000000000..f611cae9b --- /dev/null +++ b/tests/nn/test_viz.py @@ -0,0 +1,30 @@ +"""Module to test all functions in sleap.nn.viz module.""" + +import sleap +from sleap.instance import LabeledFrame, Track +from sleap.io.dataset import Labels +from sleap.nn.viz import generate_skeleton_preview_image + + +def test_generate_skeleton_preview_image( + centered_pair_predictions_slp_path: str, + centered_pair_vid_path: str, +): + """Encode preview images for all skeletons in sleap.skeletons directory.""" + + video_file = centered_pair_vid_path + labels: Labels = sleap.load_file( + centered_pair_predictions_slp_path, search_paths=[video_file] + ) + lf: LabeledFrame = labels.labeled_frames[0] + track: Track = labels.tracks[0] + + if track is None: + inst = lf.instances[0] + else: + inst = next( + instance for instance in lf.instances if instance.track.matches(track) + ) + + img_b64: bytes = generate_skeleton_preview_image(inst) + assert isinstance(img_b64, bytes) diff --git a/tests/test_util.py b/tests/test_util.py index 35b41afa8..a7916d47f 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,4 +1,5 @@ import pytest +from sleap.skeleton import Skeleton from sleap.util import * @@ -146,3 +147,10 @@ def test_save_dict_to_hdf5(tmpdir): assert f["bar"][-1].decode() == "zop" assert f["cab"]["a"][()] == 2 + + +def test_decode_preview_image(flies13_skeleton: Skeleton): + skeleton = flies13_skeleton + img_b64 = skeleton.preview_image + img = decode_preview_image(img_b64) + assert img.mode == "RGBA"