From 846c0dc59dc26481e8a2690580415111627e8a39 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 4 Nov 2020 21:40:17 +0200 Subject: [PATCH] - fixed the UI layout in Excellon Editor and made sure that after changing a value in the Notebook side after the mouse is inside the canvas, the canvas takes the focus allowing the key shortcuts to work - Turkish language strings updated (by Mehmet Kaya) --- CHANGELOG.md | 4 +- appEditors/AppExcEditor.py | 534 +++++++++++++++++-------------- appEditors/AppGerberEditor.py | 4 + appGUI/GUIElements.py | 14 +- locale/tr/LC_MESSAGES/strings.mo | Bin 368710 -> 372943 bytes locale/tr/LC_MESSAGES/strings.po | 168 +++------- 6 files changed, 348 insertions(+), 376 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff9a9ec1..f24a0f23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ CHANGELOG for FlatCAM beta - fixed issue in the Excellon Editor where the Space key did not toggle the direction of the array of drills - combed the application strings all over the app and trimmed them up until those starting with letter 'O' - updated the translation strings +- fixed the UI layout in Excellon Editor and made sure that after changing a value in the Notebook side after the mouse is inside the canvas, the canvas takes the focus allowing the key shortcuts to work +- Turkish language strings updated (by Mehmet Kaya) 3.11.2020 @@ -3080,7 +3082,7 @@ RELEASE 8.993 - added all the tools from Gerber Editor to the the contextual menu - added the menu entry "Edit" in the Project contextual menu for Gerber objects - started to work in adding slots and slots array in Excellon Editor -- in FCSlot finished the utility geometry and the GUI for it +- in SlotAdd finished the utility geometry and the GUI for it 12.08.2019 diff --git a/appEditors/AppExcEditor.py b/appEditors/AppExcEditor.py index 5f7691f6..2a1d99a7 100644 --- a/appEditors/AppExcEditor.py +++ b/appEditors/AppExcEditor.py @@ -9,7 +9,7 @@ from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtCore import Qt from camlib import distance, arc, FlatCAMRTreeStorage -from appGUI.GUIElements import FCEntry, FCComboBox2, FCTable, FCDoubleSpinner, RadioSet, FCSpinner, FCButton +from appGUI.GUIElements import FCEntry, FCComboBox2, FCTable, FCDoubleSpinner, RadioSet, FCSpinner, FCButton, FCLabel from appEditors.AppGeoEditor import FCShapeTool, DrawTool, DrawToolShape, DrawToolUtilityShape, AppGeoEditor from shapely.geometry import LineString, LinearRing, MultiLineString, Polygon, MultiPolygon, Point @@ -35,7 +35,7 @@ if '_' not in builtins.__dict__: log = logging.getLogger('base') -class FCDrillSelect(FCShapeTool): +class SelectEditorExc(FCShapeTool): def __init__(self, draw_app): DrawTool.__init__(self, draw_app) self.name = 'drill_select' @@ -219,7 +219,7 @@ class FCDrillSelect(FCShapeTool): pass -class FCDrillAdd(FCShapeTool): +class DrillAdd(FCShapeTool): """ Resulting type: MultiLineString """ @@ -317,7 +317,7 @@ class FCDrillAdd(FCShapeTool): pass -class FCDrillArray(FCShapeTool): +class DrillArray(FCShapeTool): """ Resulting type: MultiLineString """ @@ -404,7 +404,7 @@ class FCDrillArray(FCShapeTool): def utility_geometry(self, data=None, static=None): self.drill_axis = self.draw_app.ui.drill_axis_radio.get_value() - self.drill_direction = self.draw_app.ui.drill_direction_radio.get_value() + self.drill_direction = self.draw_app.ui.drill_array_dir_radio.get_value() self.drill_array = self.draw_app.ui.array_type_combo.get_value() try: self.drill_array_size = int(self.draw_app.ui.drill_array_size_entry.get_value()) @@ -577,7 +577,7 @@ class FCDrillArray(FCShapeTool): pass -class FCSlot(FCShapeTool): +class SlotAdd(FCShapeTool): """ Resulting type: Polygon """ @@ -751,7 +751,7 @@ class FCSlot(FCShapeTool): try: self.geometry = DrawToolShape(self.util_shape(self.points)) except Exception as e: - log.debug("FCSlot.make() --> %s" % str(e)) + log.debug("SlotAdd.make() --> %s" % str(e)) # add the point to drills/slots if the diameter is a key in the dict, if not, create it add the drill location # to the value, as a list of itself @@ -791,7 +791,7 @@ class FCSlot(FCShapeTool): pass -class FCSlotArray(FCShapeTool): +class SlotArray(FCShapeTool): """ Resulting type: MultiPolygon """ @@ -1150,7 +1150,7 @@ class FCSlotArray(FCShapeTool): pass -class FCDrillResize(FCShapeTool): +class ResizeEditorExc(FCShapeTool): def __init__(self, draw_app): DrawTool.__init__(self, draw_app) self.name = 'drill_resize' @@ -1386,7 +1386,7 @@ class FCDrillResize(FCShapeTool): pass -class FCDrillMove(FCShapeTool): +class MoveEditorExc(FCShapeTool): def __init__(self, draw_app): DrawTool.__init__(self, draw_app) self.name = 'drill_move' @@ -1535,9 +1535,9 @@ class FCDrillMove(FCShapeTool): pass -class FCDrillCopy(FCDrillMove): +class CopyEditorExc(MoveEditorExc): def __init__(self, draw_app): - FCDrillMove.__init__(self, draw_app) + MoveEditorExc.__init__(self, draw_app) self.name = 'drill_copy' def make(self): @@ -1777,14 +1777,14 @@ class AppExcEditor(QtCore.QObject): def connect_exc_toolbar_signals(self): self.tools_exc.update({ - "drill_select": {"button": self.app.ui.select_drill_btn, "constructor": FCDrillSelect}, - "drill_add": {"button": self.app.ui.add_drill_btn, "constructor": FCDrillAdd}, - "drill_array": {"button": self.app.ui.add_drill_array_btn, "constructor": FCDrillArray}, - "slot_add": {"button": self.app.ui.add_slot_btn, "constructor": FCSlot}, - "slot_array": {"button": self.app.ui.add_slot_array_btn, "constructor": FCSlotArray}, - "drill_resize": {"button": self.app.ui.resize_drill_btn, "constructor": FCDrillResize}, - "drill_copy": {"button": self.app.ui.copy_drill_btn, "constructor": FCDrillCopy}, - "drill_move": {"button": self.app.ui.move_drill_btn, "constructor": FCDrillMove}, + "drill_select": {"button": self.app.ui.select_drill_btn, "constructor": SelectEditorExc}, + "drill_add": {"button": self.app.ui.add_drill_btn, "constructor": DrillAdd}, + "drill_array": {"button": self.app.ui.add_drill_array_btn, "constructor": DrillArray}, + "slot_add": {"button": self.app.ui.add_slot_btn, "constructor": SlotAdd}, + "slot_array": {"button": self.app.ui.add_slot_array_btn, "constructor": SlotArray}, + "drill_resize": {"button": self.app.ui.resize_drill_btn, "constructor": ResizeEditorExc}, + "drill_copy": {"button": self.app.ui.copy_drill_btn, "constructor": CopyEditorExc}, + "drill_move": {"button": self.app.ui.move_drill_btn, "constructor": MoveEditorExc}, }) for tool in self.tools_exc: @@ -1842,7 +1842,7 @@ class AppExcEditor(QtCore.QObject): self.ui.drill_axis_radio.set_value(self.app.defaults['excellon_editor_lin_dir']) self.ui.drill_pitch_entry.set_value(float(self.app.defaults['excellon_editor_lin_pitch'])) self.ui.linear_angle_spinner.set_value(float(self.app.defaults['excellon_editor_lin_angle'])) - self.ui.drill_direction_radio.set_value(self.app.defaults['excellon_editor_circ_dir']) + self.ui.drill_array_dir_radio.set_value(self.app.defaults['excellon_editor_circ_dir']) self.ui.drill_angle_entry.set_value(float(self.app.defaults['excellon_editor_circ_angle'])) self.ui.slot_length_entry.set_value(float(self.app.defaults['excellon_editor_slot_length'])) @@ -1856,8 +1856,14 @@ class AppExcEditor(QtCore.QObject): self.ui.slot_array_direction_radio.set_value(self.app.defaults['excellon_editor_slot_circ_dir']) self.ui.slot_array_angle_entry.set_value(float(self.app.defaults['excellon_editor_slot_circ_angle'])) - self.ui.slot_array_circular_frame.hide() - self.ui.slot_array_linear_frame.show() + # make sure that th visibility of the various UI frame are updated + # according to the set Preferences already loaded + self.on_slot_angle_radio() + + self.on_array_type_combo() + self.on_slot_array_type_combo() + self.on_linear_angle_radio() + self.on_slot_array_linear_angle_radio() def build_ui(self, first_run=None): @@ -2989,7 +2995,7 @@ class AppExcEditor(QtCore.QObject): self.tools_exc[t]["button"].setChecked(False) self.select_tool('drill_select') - self.active_tool = FCDrillSelect(self) + self.active_tool = SelectEditorExc(self) def on_row_selected(self, row, col): if col == 0: @@ -3067,14 +3073,14 @@ class AppExcEditor(QtCore.QObject): if key_modifier == modifier_to_use: self.select_tool(self.active_tool.name) else: - # return to Select tool but not for FCDrillAdd or FCSlot - if isinstance(self.active_tool, FCDrillAdd) or isinstance(self.active_tool, FCSlot): + # return to Select tool but not for FCDrillAdd or SlotAdd + if isinstance(self.active_tool, DrillAdd) or isinstance(self.active_tool, SlotAdd): self.select_tool(self.active_tool.name) else: self.select_tool("drill_select") return - if isinstance(self.active_tool, FCDrillSelect): + if isinstance(self.active_tool, SelectEditorExc): # self.app.log.debug("Replotting after click.") self.replot() else: @@ -3192,14 +3198,14 @@ class AppExcEditor(QtCore.QObject): QtGui.QGuiApplication.restoreOverrideCursor() except Exception: pass - if self.active_tool.complete is False and not isinstance(self.active_tool, FCDrillSelect): + if self.active_tool.complete is False and not isinstance(self.active_tool, SelectEditorExc): self.active_tool.complete = True self.in_action = False self.delete_utility_geometry() self.app.inform.emit('[success] %s' % _("Done.")) self.select_tool('drill_select') else: - if isinstance(self.active_tool, FCDrillAdd): + if isinstance(self.active_tool, DrillAdd): self.active_tool.complete = True self.in_action = False self.delete_utility_geometry() @@ -3222,7 +3228,7 @@ class AppExcEditor(QtCore.QObject): self.draw_selection_area_handler(self.pos, pos, self.app.selection_type) self.app.selection_type = None - elif isinstance(self.active_tool, FCDrillSelect): + elif isinstance(self.active_tool, SelectEditorExc): self.active_tool.click_release((self.pos[0], self.pos[1])) # if there are selected objects then plot them @@ -3333,6 +3339,9 @@ class AppExcEditor(QtCore.QObject): :return: None """ + if not self.app.plotcanvas.native.hasFocus(): + self.app.plotcanvas.native.setFocus() + if self.app.is_legacy is False: event_pos = event.pos event_is_dragging = event.is_dragging @@ -3398,10 +3407,10 @@ class AppExcEditor(QtCore.QObject): # ## Selection area on canvas section # ## if event_is_dragging == 1 and event.button == 1: - # I make an exception for FCDrillAdd and FCDrillArray because clicking and dragging while making regions - # can create strange issues. Also for FCSlot and FCSlotArray - if isinstance(self.active_tool, FCDrillAdd) or isinstance(self.active_tool, FCDrillArray) or \ - isinstance(self.active_tool, FCSlot) or isinstance(self.active_tool, FCSlotArray): + # I make an exception for FCDrillAdd and DrillArray because clicking and dragging while making regions + # can create strange issues. Also for SlotAdd and SlotArray + if isinstance(self.active_tool, DrillAdd) or isinstance(self.active_tool, DrillArray) or \ + isinstance(self.active_tool, SlotAdd) or isinstance(self.active_tool, SlotArray): self.app.selection_type = None else: dx = pos[0] - self.pos[0] @@ -3764,144 +3773,155 @@ class AppExcEditorUI: self.drills_frame = QtWidgets.QFrame() self.drills_frame.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.drills_frame) - self.tools_box = QtWidgets.QVBoxLayout() - self.tools_box.setContentsMargins(0, 0, 0, 0) - self.drills_frame.setLayout(self.tools_box) + + # ############################################################################################################# + # ######################## MAIN Grid ########################################################################## + # ############################################################################################################# + self.ui_vertical_lay = QtWidgets.QVBoxLayout() + self.ui_vertical_lay.setContentsMargins(0, 0, 0, 0) + self.drills_frame.setLayout(self.ui_vertical_lay) # ## Page Title box (spacing between children) self.title_box = QtWidgets.QHBoxLayout() - self.tools_box.addLayout(self.title_box) + self.ui_vertical_lay.addLayout(self.title_box) - # ## Page Title icon + # ## Page Title pixmap = QtGui.QPixmap(self.app.resource_location + '/flatcam_icon32.png') - self.icon = QtWidgets.QLabel() + self.icon = FCLabel() self.icon.setPixmap(pixmap) - self.title_box.addWidget(self.icon, stretch=0) - # ## Title label - self.title_label = QtWidgets.QLabel("%s" % _('Excellon Editor')) + self.title_label = FCLabel("%s" % _('Excellon Editor')) self.title_label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) + + self.title_box.addWidget(self.icon, stretch=0) self.title_box.addWidget(self.title_label, stretch=1) # ## Object name self.name_box = QtWidgets.QHBoxLayout() - self.tools_box.addLayout(self.name_box) - name_label = QtWidgets.QLabel(_("Name:")) - self.name_box.addWidget(name_label) + self.ui_vertical_lay.addLayout(self.name_box) + + name_label = FCLabel(_("Name:")) self.name_entry = FCEntry() + + self.name_box.addWidget(name_label) self.name_box.addWidget(self.name_entry) # ### Tools Drills ## ## - self.tools_table_label = QtWidgets.QLabel("%s" % _('Tools Table')) + self.tools_table_label = FCLabel("%s" % _('Tools Table')) self.tools_table_label.setToolTip( _("Tools in this Excellon object\n" "when are used for drilling.") ) - self.tools_box.addWidget(self.tools_table_label) + self.ui_vertical_lay.addWidget(self.tools_table_label) + # Drills TABLE self.tools_table_exc = FCTable() - # delegate = SpinBoxDelegate(units=self.units) - # self.ui.tools_table_exc.setItemDelegateForColumn(1, delegate) - - self.tools_box.addWidget(self.tools_table_exc) - self.tools_table_exc.setColumnCount(4) self.tools_table_exc.setHorizontalHeaderLabels(['#', _('Diameter'), 'D', 'S']) self.tools_table_exc.setSortingEnabled(False) self.tools_table_exc.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) + self.ui_vertical_lay.addWidget(self.tools_table_exc) + separator_line = QtWidgets.QFrame() separator_line.setFrameShape(QtWidgets.QFrame.HLine) separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - self.tools_box.addWidget(separator_line) + self.ui_vertical_lay.addWidget(separator_line) self.convert_slots_btn = FCButton('%s' % _("Convert Slots")) self.convert_slots_btn.setToolTip( _("Convert the slots in the selected tools to drills.") ) - self.tools_box.addWidget(self.convert_slots_btn) + self.ui_vertical_lay.addWidget(self.convert_slots_btn) separator_line = QtWidgets.QFrame() separator_line.setFrameShape(QtWidgets.QFrame.HLine) separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - self.tools_box.addWidget(separator_line) + self.ui_vertical_lay.addWidget(separator_line) # ### Add a new Tool ## ## - self.addtool_label = QtWidgets.QLabel('%s' % _('Add/Delete Tool')) + self.addtool_label = FCLabel('%s' % _('Add/Delete Tool')) self.addtool_label.setToolTip( _("Add/Delete a tool to the tool list\n" "for this Excellon object.") ) - self.tools_box.addWidget(self.addtool_label) + self.ui_vertical_lay.addWidget(self.addtool_label) + # ############################################################################################################# + # ######################## ADD New Tool Grid ################################################################## + # ############################################################################################################# grid1 = QtWidgets.QGridLayout() - self.tools_box.addLayout(grid1) grid1.setColumnStretch(0, 0) grid1.setColumnStretch(1, 1) + self.ui_vertical_lay.addLayout(grid1) - addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('Tool Dia')) + # Tool Diameter Label + addtool_entry_lbl = FCLabel('%s:' % _('Tool Dia')) addtool_entry_lbl.setToolTip( _("Diameter for the new tool") ) hlay = QtWidgets.QHBoxLayout() - self.addtool_entry = FCDoubleSpinner() + # Tool Diameter Entry + self.addtool_entry = FCDoubleSpinner(policy=False) self.addtool_entry.set_precision(self.decimals) self.addtool_entry.set_range(0.0000, 10000.0000) hlay.addWidget(self.addtool_entry) - self.addtool_btn = QtWidgets.QPushButton(_('Add Tool')) + # Tool Diameter Button + self.addtool_btn = QtWidgets.QPushButton(_('Add')) self.addtool_btn.setToolTip( _("Add a new tool to the tool list\n" "with the diameter specified above.") ) - self.addtool_btn.setFixedWidth(80) hlay.addWidget(self.addtool_btn) grid1.addWidget(addtool_entry_lbl, 0, 0) grid1.addLayout(hlay, 0, 1) - grid2 = QtWidgets.QGridLayout() - self.tools_box.addLayout(grid2) - + # Delete Tool self.deltool_btn = QtWidgets.QPushButton(_('Delete Tool')) self.deltool_btn.setToolTip( _("Delete a tool in the tool list\n" "by selecting a row in the tool table.") ) - grid2.addWidget(self.deltool_btn, 0, 1) + grid1.addWidget(self.deltool_btn, 2, 0, 1, 2) - # add a frame and inside add a vertical box layout. Inside this vbox layout I add all the Drills widgets + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + grid1.addWidget(separator_line, 4, 0, 1, 2) + + # ############################################################################################################# + # ############################## Resize Tool Grid ############################################################# + # ############################################################################################################# + # add a frame and inside add a grid box layout. Inside this layout I add all the Drills widgets # this way I can hide/show the frame self.resize_frame = QtWidgets.QFrame() self.resize_frame.setContentsMargins(0, 0, 0, 0) - self.tools_box.addWidget(self.resize_frame) - self.resize_box = QtWidgets.QVBoxLayout() - self.resize_box.setContentsMargins(0, 0, 0, 0) - self.resize_frame.setLayout(self.resize_box) + self.ui_vertical_lay.addWidget(self.resize_frame) - # ### Resize a drill ## ## - self.emptyresize_label = QtWidgets.QLabel('') - self.resize_box.addWidget(self.emptyresize_label) + self.resize_grid = QtWidgets.QGridLayout() + self.resize_grid.setColumnStretch(0, 0) + self.resize_grid.setColumnStretch(1, 1) + self.resize_grid.setContentsMargins(0, 0, 0, 0) + self.resize_frame.setLayout(self.resize_grid) - self.drillresize_label = QtWidgets.QLabel('%s' % _("Resize Drill(s)")) + self.drillresize_label = FCLabel('%s' % _("Resize Tool")) self.drillresize_label.setToolTip( _("Resize a drill or a selection of drills.") ) - self.resize_box.addWidget(self.drillresize_label) + self.resize_grid.addWidget(self.drillresize_label, 0, 0, 1, 2) - grid3 = QtWidgets.QGridLayout() - self.resize_box.addLayout(grid3) - - res_entry_lbl = QtWidgets.QLabel('%s:' % _('Resize Dia')) + # Resize Diameter + res_entry_lbl = FCLabel('%s:' % _('Resize Dia')) res_entry_lbl.setToolTip( _("Diameter to resize to.") ) - grid3.addWidget(res_entry_lbl, 0, 0) hlay2 = QtWidgets.QHBoxLayout() - self.resdrill_entry = FCDoubleSpinner() + self.resdrill_entry = FCDoubleSpinner(policy=False) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) self.resdrill_entry.setSizePolicy(sizePolicy) self.resdrill_entry.set_precision(self.decimals) @@ -3909,369 +3929,384 @@ class AppExcEditorUI: hlay2.addWidget(self.resdrill_entry) + # Resize Button self.resize_btn = QtWidgets.QPushButton(_('Resize')) self.resize_btn.setToolTip( _("Resize drill(s)") ) - self.resize_btn.setFixedWidth(80) hlay2.addWidget(self.resize_btn) - grid3.addLayout(hlay2, 0, 1) + + self.resize_grid.addWidget(res_entry_lbl, 2, 0) + self.resize_grid.addLayout(hlay2, 2, 1) + + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.resize_grid.addWidget(separator_line, 6, 0, 1, 2) self.resize_frame.hide() - # #################################### - # ### Add DRILL Array ################ - # #################################### - - # add a frame and inside add a vertical box layout. Inside this vbox layout I add + # ############################################################################################################# + # ################################## Add DRILL Array ########################################################## + # ############################################################################################################# + # add a frame and inside add a grid box layout. Inside this grid layout I add # all the add drill array widgets # this way I can hide/show the frame self.array_frame = QtWidgets.QFrame() self.array_frame.setContentsMargins(0, 0, 0, 0) - self.tools_box.addWidget(self.array_frame) - self.array_box = QtWidgets.QVBoxLayout() - self.array_box.setContentsMargins(0, 0, 0, 0) - self.array_frame.setLayout(self.array_box) + self.ui_vertical_lay.addWidget(self.array_frame) - self.emptyarray_label = QtWidgets.QLabel('') - self.array_box.addWidget(self.emptyarray_label) + self.array_grid = QtWidgets.QGridLayout() + self.array_grid.setColumnStretch(0, 0) + self.array_grid.setColumnStretch(1, 1) + self.array_grid.setContentsMargins(0, 0, 0, 0) + self.array_frame.setLayout(self.array_grid) - self.drill_array_label = QtWidgets.QLabel('%s' % _("Add Drill Array")) + # Type of Drill Array + self.drill_array_label = FCLabel('%s' % _("Add Drill Array")) self.drill_array_label.setToolTip( _("Add an array of drills (linear or circular array)") ) - self.array_box.addWidget(self.drill_array_label) - + + # Special Combo - it works by indexes as opposed to the items Text self.array_type_combo = FCComboBox2() self.array_type_combo.setToolTip( _("Select the type of drills array to create.\n" "It can be Linear X(Y) or Circular") ) - self.array_type_combo.addItem(_("Linear")) - self.array_type_combo.addItem(_("Circular")) + self.array_type_combo.addItems([_("Linear"), _("Circular")]) - self.array_box.addWidget(self.array_type_combo) - - self.array_form = QtWidgets.QFormLayout() - self.array_box.addLayout(self.array_form) + self.array_grid.addWidget(self.drill_array_label, 0, 0, 1, 2) + self.array_grid.addWidget(self.array_type_combo, 2, 0, 1, 2) # Set the number of drill holes in the drill array - self.drill_array_size_label = QtWidgets.QLabel('%s:' % _('Nr of drills')) + self.drill_array_size_label = FCLabel('%s:' % _('Number')) self.drill_array_size_label.setToolTip(_("Specify how many drills to be in the array.")) - self.drill_array_size_label.setMinimumWidth(100) - self.drill_array_size_entry = FCSpinner() - self.drill_array_size_entry.set_range(1, 9999) - self.array_form.addRow(self.drill_array_size_label, self.drill_array_size_entry) + self.drill_array_size_entry = FCSpinner(policy=False) + self.drill_array_size_entry.set_range(1, 10000) + self.array_grid.addWidget(self.drill_array_size_label, 4, 0) + self.array_grid.addWidget(self.drill_array_size_entry, 4, 1) + + # ############################################################################################################# + # ###################### LINEAR Drill Array ################################################################### + # ############################################################################################################# self.array_linear_frame = QtWidgets.QFrame() self.array_linear_frame.setContentsMargins(0, 0, 0, 0) - self.array_box.addWidget(self.array_linear_frame) - self.linear_box = QtWidgets.QVBoxLayout() - self.linear_box.setContentsMargins(0, 0, 0, 0) - self.array_linear_frame.setLayout(self.linear_box) - - self.linear_form = QtWidgets.QFormLayout() - self.linear_box.addLayout(self.linear_form) + self.array_grid.addWidget(self.array_linear_frame, 6, 0, 1, 2) + self.lin_grid = QtWidgets.QGridLayout() + self.lin_grid.setColumnStretch(0, 0) + self.lin_grid.setColumnStretch(1, 1) + self.lin_grid.setContentsMargins(0, 0, 0, 0) + self.array_linear_frame.setLayout(self.lin_grid) # Linear Drill Array direction - self.drill_axis_label = QtWidgets.QLabel('%s:' % _('Direction')) + self.drill_axis_label = FCLabel('%s:' % _('Direction')) self.drill_axis_label.setToolTip( _("Direction on which the linear array is oriented:\n" "- 'X' - horizontal axis \n" "- 'Y' - vertical axis or \n" "- 'Angle' - a custom angle for the array inclination") ) - self.drill_axis_label.setMinimumWidth(100) self.drill_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'}, {'label': _('Y'), 'value': 'Y'}, {'label': _('Angle'), 'value': 'A'}]) - self.linear_form.addRow(self.drill_axis_label, self.drill_axis_radio) + + self.lin_grid.addWidget(self.drill_axis_label, 0, 0) + self.lin_grid.addWidget(self.drill_axis_radio, 0, 1) # Linear Drill Array pitch distance - self.drill_pitch_label = QtWidgets.QLabel('%s:' % _('Pitch')) + self.drill_pitch_label = FCLabel('%s:' % _('Pitch')) self.drill_pitch_label.setToolTip( _("Pitch = Distance between elements of the array.") ) - self.drill_pitch_label.setMinimumWidth(100) - self.drill_pitch_entry = FCDoubleSpinner() + self.drill_pitch_entry = FCDoubleSpinner(policy=False) self.drill_pitch_entry.set_precision(self.decimals) self.drill_pitch_entry.set_range(0.0000, 10000.0000) - self.linear_form.addRow(self.drill_pitch_label, self.drill_pitch_entry) + self.lin_grid.addWidget(self.drill_pitch_label, 2, 0) + self.lin_grid.addWidget(self.drill_pitch_entry, 2, 1) # Linear Drill Array angle - self.linear_angle_label = QtWidgets.QLabel('%s:' % _('Angle')) + self.linear_angle_label = FCLabel('%s:' % _('Angle')) self.linear_angle_label.setToolTip( _("Angle at which the linear array is placed.\n" "The precision is of max 2 decimals.\n" "Min value is: -360.00 degrees.\n" "Max value is: 360.00 degrees.") ) - self.linear_angle_label.setMinimumWidth(100) - self.linear_angle_spinner = FCDoubleSpinner() + self.linear_angle_spinner = FCDoubleSpinner(policy=False) self.linear_angle_spinner.set_precision(self.decimals) self.linear_angle_spinner.setSingleStep(1.0) self.linear_angle_spinner.setRange(-360.00, 360.00) - self.linear_form.addRow(self.linear_angle_label, self.linear_angle_spinner) + self.lin_grid.addWidget(self.linear_angle_label, 4, 0) + self.lin_grid.addWidget(self.linear_angle_spinner, 4, 1) + + # ############################################################################################################# + # ###################### CIRCULAR Drill Array ################################################################# + # ############################################################################################################# self.array_circular_frame = QtWidgets.QFrame() self.array_circular_frame.setContentsMargins(0, 0, 0, 0) - self.array_box.addWidget(self.array_circular_frame) - self.circular_box = QtWidgets.QVBoxLayout() - self.circular_box.setContentsMargins(0, 0, 0, 0) - self.array_circular_frame.setLayout(self.circular_box) + self.array_grid.addWidget(self.array_circular_frame, 8, 0, 1, 2) - self.drill_direction_label = QtWidgets.QLabel('%s:' % _('Direction')) - self.drill_direction_label.setToolTip(_("Direction for circular array.\n" + self.circ_grid = QtWidgets.QGridLayout() + self.circ_grid.setColumnStretch(0, 0) + self.circ_grid.setColumnStretch(1, 1) + self.circ_grid.setContentsMargins(0, 0, 0, 0) + self.array_circular_frame.setLayout(self.circ_grid) + + # Array Direction + self.drill_array_dir_lbl = FCLabel('%s:' % _('Direction')) + self.drill_array_dir_lbl.setToolTip(_("Direction for circular array.\n" "Can be CW = clockwise or CCW = counter clockwise.")) - self.drill_direction_label.setMinimumWidth(100) - self.circular_form = QtWidgets.QFormLayout() - self.circular_box.addLayout(self.circular_form) - - self.drill_direction_radio = RadioSet([{'label': _('CW'), 'value': 'CW'}, + self.drill_array_dir_radio = RadioSet([{'label': _('CW'), 'value': 'CW'}, {'label': _('CCW'), 'value': 'CCW'}]) - self.circular_form.addRow(self.drill_direction_label, self.drill_direction_radio) - self.drill_angle_label = QtWidgets.QLabel('%s:' % _('Angle')) - self.drill_angle_label.setToolTip(_("Angle at which each element in circular array is placed.")) - self.drill_angle_label.setMinimumWidth(100) + self.circ_grid.addWidget(self.drill_array_dir_lbl, 0, 0) + self.circ_grid.addWidget(self.drill_array_dir_radio, 0, 1) - self.drill_angle_entry = FCDoubleSpinner() + # Array Angle + self.drill_array_angle_lbl = FCLabel('%s:' % _('Angle')) + self.drill_array_angle_lbl.setToolTip(_("Angle at which each element in circular array is placed.")) + + self.drill_angle_entry = FCDoubleSpinner(policy=False) self.drill_angle_entry.set_precision(self.decimals) self.drill_angle_entry.setSingleStep(1.0) self.drill_angle_entry.setRange(-360.00, 360.00) - self.circular_form.addRow(self.drill_angle_label, self.drill_angle_entry) + self.circ_grid.addWidget(self.drill_array_angle_lbl, 2, 0) + self.circ_grid.addWidget(self.drill_angle_entry, 2, 1) - self.array_circular_frame.hide() + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.array_grid.addWidget(separator_line, 10, 0, 1, 2) - self.linear_angle_spinner.hide() - self.linear_angle_label.hide() - - self.array_frame.hide() - - # ###################################################### - # ##### ADDING SLOTS ################################### - # ###################################################### - - # add a frame and inside add a vertical box layout. Inside this vbox layout I add + # ############################################################################################################# + # ################################### ADDING SLOTS ############################################################ + # ############################################################################################################# + # add a frame and inside add a grid box layout. Inside this grid layout I add # all the add slot widgets # this way I can hide/show the frame self.slot_frame = QtWidgets.QFrame() self.slot_frame.setContentsMargins(0, 0, 0, 0) - self.tools_box.addWidget(self.slot_frame) - self.slot_box = QtWidgets.QVBoxLayout() - self.slot_box.setContentsMargins(0, 0, 0, 0) - self.slot_frame.setLayout(self.slot_box) + self.ui_vertical_lay.addWidget(self.slot_frame) - self.emptyarray_label = QtWidgets.QLabel('') - self.slot_box.addWidget(self.emptyarray_label) + self.slot_grid = QtWidgets.QGridLayout() + self.slot_grid.setColumnStretch(0, 0) + self.slot_grid.setColumnStretch(1, 1) + self.slot_grid.setContentsMargins(0, 0, 0, 0) + self.slot_frame.setLayout(self.slot_grid) - self.slot_label = QtWidgets.QLabel('%s' % _("Slot Parameters")) + # Slot Tile Label + self.slot_label = FCLabel('%s' % _("Slot Parameters")) self.slot_label.setToolTip( _("Parameters for adding a slot (hole with oval shape)\n" "either single or as an part of an array.") ) - self.slot_box.addWidget(self.slot_label) - - self.slot_form = QtWidgets.QFormLayout() - self.slot_box.addLayout(self.slot_form) + self.slot_grid.addWidget(self.slot_label, 0, 0, 1, 2) # Slot length - self.slot_length_label = QtWidgets.QLabel('%s:' % _('Length')) + self.slot_length_label = FCLabel('%s:' % _('Length')) self.slot_length_label.setToolTip( _("Length. The length of the slot.") ) - self.slot_length_label.setMinimumWidth(100) - self.slot_length_entry = FCDoubleSpinner() + self.slot_length_entry = FCDoubleSpinner(policy=False) self.slot_length_entry.set_precision(self.decimals) self.slot_length_entry.setSingleStep(0.1) self.slot_length_entry.setRange(0.0000, 10000.0000) - self.slot_form.addRow(self.slot_length_label, self.slot_length_entry) + self.slot_grid.addWidget(self.slot_length_label, 2, 0) + self.slot_grid.addWidget(self.slot_length_entry, 2, 1) # Slot direction - self.slot_axis_label = QtWidgets.QLabel('%s:' % _('Direction')) + self.slot_axis_label = FCLabel('%s:' % _('Direction')) self.slot_axis_label.setToolTip( _("Direction on which the slot is oriented:\n" "- 'X' - horizontal axis \n" "- 'Y' - vertical axis or \n" "- 'Angle' - a custom angle for the slot inclination") ) - self.slot_axis_label.setMinimumWidth(100) self.slot_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'}, {'label': _('Y'), 'value': 'Y'}, {'label': _('Angle'), 'value': 'A'}]) - self.slot_form.addRow(self.slot_axis_label, self.slot_axis_radio) + + self.slot_grid.addWidget(self.slot_axis_label, 4, 0) + self.slot_grid.addWidget(self.slot_axis_radio, 4, 1) # Slot custom angle - self.slot_angle_label = QtWidgets.QLabel('%s:' % _('Angle')) + self.slot_angle_label = FCLabel('%s:' % _('Angle')) self.slot_angle_label.setToolTip( _("Angle at which the slot is placed.\n" "The precision is of max 2 decimals.\n" "Min value is: -360.00 degrees.\n" "Max value is: 360.00 degrees.") ) - self.slot_angle_label.setMinimumWidth(100) - self.slot_angle_spinner = FCDoubleSpinner() + self.slot_angle_spinner = FCDoubleSpinner(policy=False) self.slot_angle_spinner.set_precision(self.decimals) self.slot_angle_spinner.setWrapping(True) self.slot_angle_spinner.setRange(-360.00, 360.00) self.slot_angle_spinner.setSingleStep(1.0) - self.slot_form.addRow(self.slot_angle_label, self.slot_angle_spinner) - self.slot_frame.hide() + self.slot_grid.addWidget(self.slot_angle_label, 6, 0) + self.slot_grid.addWidget(self.slot_angle_spinner, 6, 1) - # ###################################################### - # ##### ADDING SLOT ARRAY ############################# - # ###################################################### + separator_line = QtWidgets.QFrame() + separator_line.setFrameShape(QtWidgets.QFrame.HLine) + separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.slot_grid.addWidget(separator_line, 8, 0, 1, 2) + # ############################################################################################################# + # ##################################### ADDING SLOT ARRAY #################################################### + # ############################################################################################################# # add a frame and inside add a vertical box layout. Inside this vbox layout I add # all the add slot widgets # this way I can hide/show the frame self.slot_array_frame = QtWidgets.QFrame() self.slot_array_frame.setContentsMargins(0, 0, 0, 0) - self.tools_box.addWidget(self.slot_array_frame) - self.slot_array_box = QtWidgets.QVBoxLayout() - self.slot_array_box.setContentsMargins(0, 0, 0, 0) - self.slot_array_frame.setLayout(self.slot_array_box) + self.ui_vertical_lay.addWidget(self.slot_array_frame) - self.emptyarray_label = QtWidgets.QLabel('') - self.slot_array_box.addWidget(self.emptyarray_label) + self.slot_array_grid = QtWidgets.QGridLayout() + self.slot_array_grid.setColumnStretch(0, 0) + self.slot_array_grid.setColumnStretch(1, 1) + self.slot_array_grid.setContentsMargins(0, 0, 0, 0) + self.slot_array_frame.setLayout(self.slot_array_grid) - self.slot_array_label = QtWidgets.QLabel('%s' % _("Slot Array Parameters")) + # Slot Array Title + self.slot_array_label = FCLabel('%s' % _("Slot Array Parameters")) self.slot_array_label.setToolTip( _("Parameters for the array of slots (linear or circular array)") ) - self.slot_array_box.addWidget(self.slot_array_label) - self.l_form = QtWidgets.QFormLayout() - self.slot_array_box.addLayout(self.l_form) + self.slot_array_grid.addWidget(self.slot_array_label, 0, 0, 1, 2) + # Special type of Combobox that get_value() by indexes and not by items text self.slot_array_type_combo = FCComboBox2() self.slot_array_type_combo.setToolTip( _("Select the type of slot array to create.\n" "It can be Linear X(Y) or Circular") ) - self.slot_array_type_combo.addItem(_("Linear")) - self.slot_array_type_combo.addItem(_("Circular")) + self.slot_array_type_combo.addItems([_("Linear"), _("Circular")]) - self.slot_array_box.addWidget(self.slot_array_type_combo) - - self.slot_array_form = QtWidgets.QFormLayout() - self.slot_array_box.addLayout(self.slot_array_form) + self.slot_array_grid.addWidget(self.slot_array_type_combo, 2, 0, 1, 2) # Set the number of slot holes in the slot array - self.slot_array_size_label = QtWidgets.QLabel('%s:' % _('Nr of slots')) + self.slot_array_size_label = FCLabel('%s:' % _('Number')) self.slot_array_size_label.setToolTip(_("Specify how many slots to be in the array.")) - self.slot_array_size_label.setMinimumWidth(100) - self.slot_array_size_entry = FCSpinner() - self.slot_array_size_entry.set_range(0, 9999) + self.slot_array_size_entry = FCSpinner(policy=False) + self.slot_array_size_entry.set_range(0, 10000) - self.slot_array_form.addRow(self.slot_array_size_label, self.slot_array_size_entry) + self.slot_array_grid.addWidget(self.slot_array_size_label, 4, 0) + self.slot_array_grid.addWidget(self.slot_array_size_entry, 4, 1) + # ############################################################################################################# + # ##################################### Linear SLOT ARRAY #################################################### + # ############################################################################################################# self.slot_array_linear_frame = QtWidgets.QFrame() self.slot_array_linear_frame.setContentsMargins(0, 0, 0, 0) - self.slot_array_box.addWidget(self.slot_array_linear_frame) - self.slot_array_linear_box = QtWidgets.QVBoxLayout() - self.slot_array_linear_box.setContentsMargins(0, 0, 0, 0) - self.slot_array_linear_frame.setLayout(self.slot_array_linear_box) + self.slot_array_grid.addWidget(self.slot_array_linear_frame, 6, 0, 1, 2) - self.slot_array_linear_form = QtWidgets.QFormLayout() - self.slot_array_linear_box.addLayout(self.slot_array_linear_form) + self.slot_array_lin_grid = QtWidgets.QGridLayout() + self.slot_array_lin_grid.setColumnStretch(0, 0) + self.slot_array_lin_grid.setColumnStretch(1, 1) + self.slot_array_lin_grid.setContentsMargins(0, 0, 0, 0) + self.slot_array_linear_frame.setLayout(self.slot_array_lin_grid) # Linear Slot Array direction - self.slot_array_axis_label = QtWidgets.QLabel('%s:' % _('Direction')) + self.slot_array_axis_label = FCLabel('%s:' % _('Direction')) self.slot_array_axis_label.setToolTip( _("Direction on which the linear array is oriented:\n" "- 'X' - horizontal axis \n" "- 'Y' - vertical axis or \n" "- 'Angle' - a custom angle for the array inclination") ) - self.slot_array_axis_label.setMinimumWidth(100) self.slot_array_axis_radio = RadioSet([{'label': _('X'), 'value': 'X'}, {'label': _('Y'), 'value': 'Y'}, {'label': _('Angle'), 'value': 'A'}]) - self.slot_array_linear_form.addRow(self.slot_array_axis_label, self.slot_array_axis_radio) + + self.slot_array_lin_grid.addWidget(self.slot_array_axis_label, 0, 0) + self.slot_array_lin_grid.addWidget(self.slot_array_axis_radio, 0, 1) # Linear Slot Array pitch distance - self.slot_array_pitch_label = QtWidgets.QLabel('%s:' % _('Pitch')) + self.slot_array_pitch_label = FCLabel('%s:' % _('Pitch')) self.slot_array_pitch_label.setToolTip( _("Pitch = Distance between elements of the array.") ) - self.slot_array_pitch_label.setMinimumWidth(100) - self.slot_array_pitch_entry = FCDoubleSpinner() + self.slot_array_pitch_entry = FCDoubleSpinner(policy=False) self.slot_array_pitch_entry.set_precision(self.decimals) self.slot_array_pitch_entry.setSingleStep(0.1) self.slot_array_pitch_entry.setRange(0.0000, 10000.0000) - self.slot_array_linear_form.addRow(self.slot_array_pitch_label, self.slot_array_pitch_entry) + self.slot_array_lin_grid.addWidget(self.slot_array_pitch_label, 2, 0) + self.slot_array_lin_grid.addWidget(self.slot_array_pitch_entry, 2, 1) # Linear Slot Array angle - self.slot_array_linear_angle_label = QtWidgets.QLabel('%s:' % _('Angle')) + self.slot_array_linear_angle_label = FCLabel('%s:' % _('Angle')) self.slot_array_linear_angle_label.setToolTip( _("Angle at which the linear array is placed.\n" "The precision is of max 2 decimals.\n" "Min value is: -360.00 degrees.\n" "Max value is: 360.00 degrees.") ) - self.slot_array_linear_angle_label.setMinimumWidth(100) - self.slot_array_linear_angle_spinner = FCDoubleSpinner() + self.slot_array_linear_angle_spinner = FCDoubleSpinner(policy=False) self.slot_array_linear_angle_spinner.set_precision(self.decimals) self.slot_array_linear_angle_spinner.setSingleStep(1.0) self.slot_array_linear_angle_spinner.setRange(-360.00, 360.00) - self.slot_array_linear_form.addRow(self.slot_array_linear_angle_label, self.slot_array_linear_angle_spinner) + self.slot_array_lin_grid.addWidget(self.slot_array_linear_angle_label, 4, 0) + self.slot_array_lin_grid.addWidget(self.slot_array_linear_angle_spinner, 4, 1) + + # ############################################################################################################# + # ##################################### Circular SLOT ARRAY ################################################## + # ############################################################################################################# self.slot_array_circular_frame = QtWidgets.QFrame() self.slot_array_circular_frame.setContentsMargins(0, 0, 0, 0) - self.slot_array_box.addWidget(self.slot_array_circular_frame) - self.slot_array_circular_box = QtWidgets.QVBoxLayout() - self.slot_array_circular_box.setContentsMargins(0, 0, 0, 0) - self.slot_array_circular_frame.setLayout(self.slot_array_circular_box) + self.slot_array_grid.addWidget(self.slot_array_circular_frame, 8, 0, 1, 2) - self.slot_array_direction_label = QtWidgets.QLabel('%s:' % _('Direction')) + self.slot_array_circ_grid = QtWidgets.QGridLayout() + self.slot_array_circ_grid.setColumnStretch(0, 0) + self.slot_array_circ_grid.setColumnStretch(1, 1) + self.slot_array_circ_grid.setContentsMargins(0, 0, 0, 0) + self.slot_array_circular_frame.setLayout(self.slot_array_circ_grid) + + # Slot Circular Array Direction + self.slot_array_direction_label = FCLabel('%s:' % _('Direction')) self.slot_array_direction_label.setToolTip(_("Direction for circular array.\n" "Can be CW = clockwise or CCW = counter clockwise.")) - self.slot_array_direction_label.setMinimumWidth(100) - - self.slot_array_circular_form = QtWidgets.QFormLayout() - self.slot_array_circular_box.addLayout(self.slot_array_circular_form) self.slot_array_direction_radio = RadioSet([{'label': _('CW'), 'value': 'CW'}, {'label': _('CCW'), 'value': 'CCW'}]) - self.slot_array_circular_form.addRow(self.slot_array_direction_label, self.slot_array_direction_radio) - self.slot_array_angle_label = QtWidgets.QLabel('%s:' % _('Angle')) + self.slot_array_circ_grid.addWidget(self.slot_array_direction_label, 0, 0) + self.slot_array_circ_grid.addWidget(self.slot_array_direction_radio, 0, 1) + + # Slot Circular Array Angle + self.slot_array_angle_label = FCLabel('%s:' % _('Angle')) self.slot_array_angle_label.setToolTip(_("Angle at which each element in circular array is placed.")) - self.slot_array_angle_label.setMinimumWidth(100) - self.slot_array_angle_entry = FCDoubleSpinner() + self.slot_array_angle_entry = FCDoubleSpinner(policy=False) self.slot_array_angle_entry.set_precision(self.decimals) self.slot_array_angle_entry.setSingleStep(1) self.slot_array_angle_entry.setRange(-360.00, 360.00) - self.slot_array_circular_form.addRow(self.slot_array_angle_label, self.slot_array_angle_entry) + self.slot_array_circ_grid.addWidget(self.slot_array_angle_label, 2, 0) + self.slot_array_circ_grid.addWidget(self.slot_array_angle_entry, 2, 1) - self.slot_array_linear_angle_spinner.hide() - self.slot_array_linear_angle_label.hide() - - self.slot_array_frame.hide() - - self.tools_box.addStretch() - - layout.addStretch() + self.ui_vertical_lay.addStretch() + layout.addStretch(1) # Editor self.exit_editor_button = QtWidgets.QPushButton(_('Exit Editor')) @@ -4286,6 +4321,21 @@ class AppExcEditorUI: } """) layout.addWidget(self.exit_editor_button) + + # ############################################################################################################# + # ###################### INIT Excellon Editor UI ############################################################## + # ############################################################################################################# + self.linear_angle_spinner.hide() + self.linear_angle_label.hide() + self.array_linear_frame.hide() + self.array_circular_frame.hide() + self.array_frame.hide() + + self.slot_frame.hide() + self.slot_array_linear_angle_spinner.hide() + self.slot_array_linear_angle_label.hide() + self.slot_array_frame.hide() + # ############################ FINSIHED GUI ################################### # ############################################################################# diff --git a/appEditors/AppGerberEditor.py b/appEditors/AppGerberEditor.py index fa7b2ef2..660da32a 100644 --- a/appEditors/AppGerberEditor.py +++ b/appEditors/AppGerberEditor.py @@ -4365,6 +4365,10 @@ class AppGerberEditor(QtCore.QObject): :param event: Event object dispatched by VisPy SceneCavas :return: None """ + + if not self.app.plotcanvas.native.hasFocus(): + self.app.plotcanvas.native.setFocus() + if self.app.is_legacy is False: event_pos = event.pos event_is_dragging = event.is_dragging diff --git a/appGUI/GUIElements.py b/appGUI/GUIElements.py index 0d0c3b2c..8759da42 100644 --- a/appGUI/GUIElements.py +++ b/appGUI/GUIElements.py @@ -899,7 +899,7 @@ class FCSpinner(QtWidgets.QSpinBox): returnPressed = QtCore.pyqtSignal() confirmation_signal = QtCore.pyqtSignal(bool, float, float) - def __init__(self, suffix=None, alignment=None, parent=None, callback=None): + def __init__(self, suffix=None, alignment=None, parent=None, callback=None, policy=True): super(FCSpinner, self).__init__(parent) self.readyToEdit = True @@ -924,8 +924,9 @@ class FCSpinner(QtWidgets.QSpinBox): self.prev_readyToEdit = True self.menu = None - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) - self.setSizePolicy(sizePolicy) + if policy: + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) + self.setSizePolicy(sizePolicy) def eventFilter(self, object, event): if event.type() == QtCore.QEvent.MouseButtonPress and self.prev_readyToEdit is True: @@ -1277,7 +1278,7 @@ class FCDoubleSpinner(QtWidgets.QDoubleSpinBox): returnPressed = QtCore.pyqtSignal() confirmation_signal = QtCore.pyqtSignal(bool, float, float) - def __init__(self, suffix=None, alignment=None, parent=None, callback=None): + def __init__(self, suffix=None, alignment=None, parent=None, callback=None, policy=True): """ :param suffix: a char added to the end of the value in the LineEdit; like a '%' or '$' etc @@ -1314,8 +1315,9 @@ class FCDoubleSpinner(QtWidgets.QDoubleSpinBox): self.prev_readyToEdit = True self.menu = None - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) - self.setSizePolicy(sizePolicy) + if policy: + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) + self.setSizePolicy(sizePolicy) def on_edit_finished(self): self.clearFocus() diff --git a/locale/tr/LC_MESSAGES/strings.mo b/locale/tr/LC_MESSAGES/strings.mo index 785c4d69f45b60a3206accc37f38ff1602b61ada..3401a59ad73acefba3602c398403baf12dbbc5de 100644 GIT binary patch delta 71638 zcmXWkb%0jY*2nQPL3c>U3^5EnGjz@j-QC@dbjJY^rMr=ql9E&bX;6d<0uoY!BGLvS zAaTFHXYKc&&)Fw-tiAR==K;L$i9;FA-p=6POdC4irS`l>-|4L9 zZAcpACB}`I3U^>LJc30rbFv^W2y5aftc}m{I~7m=D_pV8vn+0ST~Jb?}!@VL_C3`(gt~PSSekQR}d#)W!#1} z@F`Zr^67)TJ~#^N<2`Ih`(Eh}g1jm?1#9A2Y=D_F1bI!c7pB33m<7+FM*0YAWAcna zUIJ`^A=nNzWu34T_Qs631{2~w+=oZdPrb@GN0X0WOx?>hU$P43O6DKm`X?NpYjHLV=YhjM8 zHg`Qy*?b8#$4#>Zd53T@R>D@2IaJ5oPt^{`%$^{2sKd853?JRqfS&r zC1WjoiT$w%_6)b4FG5wY8Wr+ASRPMcAq>eC+kA+u6|B+}YOI+1b*Q_C#wEmur&UTQ!z*3Aa4SGQJD2#m4hNh zY;PZodTD%tn#*u9NLe0(xv>%kHWpN_3`TWeJT}GosJVZLy6-jS!^BZRUOYx&M;wUi z&`(jmT}TmaNl_moxX=&Ynb(hCX zlvNzHNcDWKE3d{Pl=q+-_#F%5OU#ZD#cXe{g0m@)Ms+l0aT|FKRJjnU z-tz8zZC7rIA)NPna8Qz6|#32ig6`ugjG=$HbX_Ct1FLm<;nPz^UF~$ zt2rg@rLzSaQr?BJn6OlkSB>_)Y8)uE(@_mAK{c=f_14>pO149&IlYWp_rIfZ0l2-o6ET#p&`{$E)p$jiftubnqAjB;>UOP<`QT&RuO51L^@ z?2p=*hN0$k0_wiWt~?L5jF+H7z1m%0hw9*V46OgX9BAZ+P?0!}s`xx=4sW6&@dPz; zubh>WqONB{b*K>Pxnih}#5!xa^G%%{QSJ3bzYzxmIZy@1-3_NvA-jU=&|OqRPhB~r zye-Gns2nJcy1yoBq|H$yZ0+pg?2GLuha)QodF}B5PQqGMg1mWn0f%Fcsh{^45w#U}Kt*aUmcnnb z96rZfTK~~CEObp!-vL7~66c_H!hKi(|3oEKmYOz#cvM6hp*qwBe)bRVBr1Vm4m}v=#5`v;rc;dZ@h~eu~CB{uO+_0ex!M` zhBl`s8U=a(TbJjoScc9)mXqSuBIYQB$!4)q&$y_PzTY=%extY7R4XGIL-u%6U*5RFo^1aK=09VqgH6 zhx-PhcFsju30J!EZ>SDGM75K$vm)d(cN{2L3Zm9?X;iY*LUo`is=|(_k@Q66#u`+J zx1e(57*@oKsQc4*v3jzh%K2QmD5|}(D$~AKodaceBUCPQM}^8qW$7H$4!6O16!k8+ zi3<56)crZTT0JqS2C8G=C4?GCS5)#1z%ZPMerXQYaS)EbpdJY7W)GxAHIxH&z7VRT z6;Mgm2-UHE&M6p8c`a&-y^LDt>AKraS`T&qN2n=Z)}8gQx&4L{3i$z4gC|iTzKq%r zZoBgjP$PTk$_aW{IUQ;$!cZeDh5Aaajar61U3sP}Z*k=dJ$$R+Z%!yg@30Rh?P(Di zhDxr*SRQv`Tl@=^EA@KWGVFkw`<1AMe?hJ9x2T9@=xz1XKrPo!sDV!PIZ&t;qegHM zm8Fkx5~gAwRRb|Ee-0~-(zyE|Aa$b5}_IlLv^5_GsaoQ8Hb8gbyP%}qvmo7*1$!m5#B~6YuGTeFe=B& zx^gv4sP*5N169xpwPW?b5Zr_s;WkuczD6bC0o0uShw5m9;nwlysE&0)CFej?gCC<- z#Vj0%pW}GUID++Gii5=*Xe8%Q*%~_1{_vRt;ggE2yn9*=REz>N_AShGPNLNa|pI?11q&1#{wQ z)P0Xo9Y{IGB9RsqsXVADE{K|%l4Dr^+Sw{|LOW6uRLJ_HreriKq*G82EOFP@qdKw^ zBk(&^5qxxB~OxQ7nlMQIW_s z&WuKFrE#v@8nxl{LUnusYWdDa-FL`&4YhnEu^0Ts&Js1bBUh3aD*gfmeQ z2>HlfN~uwii9p>~5*4|4ROsuXa-$(CS6ZPO?u(l0PjLb5dwV$u<3z&=7NUWuEp!cP z1cy;c`4=|ATpwF94Z#VNr=c25J<&Rn9@St@{19WXIIcn^=OwI-ka*$2vdRD?n&TL;phI-UpBa5L2N9Z<`& zCw`#yKZ*m**=*DtuFwVi8udMJ28-fdEQA@RSY#@rLOBqXRBKUN?JX>WnWx$>p2n!_ zQ&IcN3DkW_rm_B2aU~AqK-BVEjmqjTP(40}sqm`v0V;c6qmn4YbW5^qsF9XJMJygQ zpk}Dod_PnY55_=}PG|iq#IxOnWvG|NX4Ls4GwdVs1JqlwF{*<@Q4NhnRXEAH5Ea^W zsO9!Gs-F9(sd(E#39rsF968bzlZ6`xl`q zUW1CrW_Nvub3fML{0VG{sb<;pJ$(*>IWfpN6v-`b1ggiQP#u|s8p%vl14~g2u0l=C z7g!AUqC))yb^lY;vU`uJFY|0m@(9#2_bYRtji(c;p^s2EPDYJ%0cr!;gxaW1U?F^n zO3qAk?2m4vPz`lMMQ|J{atl!PY(VX_-=gY2gUz)5uW_JcikWLYu7?^?D^zHEVL=>% zi*OZ|!?N>i4u@hm(t%SaM_#p?XU?Qq# zD^YW~)%iUZrTnWi?PB{Ft%O}TKM8B%V~oO5ORRw&Sb*|8ROAk#I&uQl?xiKH|0*0j z=7d5Rv(&P;J}SgbP)XDQ>$5Bdq8>c*S&-KXe?}#5@nx2jO;A%e9<{@*M0Mb2cRh5u zy{4m49csRu^{7&lf{IU(e@2BW&aR5Y^x~)SOR6g>)5aBI zR?At}*}&Nt75ZjKyS~?!gEgG!?k*(zJjm-zIW2104RtO>eHR>Z-o)IL-(X1$TN~sx zCr6s&cFNn<*^bz8y?tNI$NZe%gS!6~rque+xWVQm!WoYmQ5#e;^+#<`GqEskLQTof z?t0RVc3*zfl+-{)uq~=VANBIuh#J6Ycm09RYyBtx!X7A!6(~1E?O-!ed-_5wg{M#r zhitO!E{_r>D40oC9Q48ug5?K>e7wVaz{EDmsPM_*g%-|j@=Ew*m^qSpIjtc@p8 zBluveeS(!nU7w1I&^`>qtJoa>L#=|w+iU}BkJ|bApq?9o^>FPr*1zWB87Guf1;4Z; zEQ{K+YoTszj#?G#Fbub&rszB>3Gbq^`YkH!lWn*9!co_wP*YPKL$M92{*K#yd+%ZyJ0P=!7rS1jF!eREX1l<+ff_M{+p} zp(0um8)^Nw=0Ks`iW=z|RK-_O4c&If^IK3!a}G7xaH7oa$~^gzCsTR0YRSS^ksr25O{tu{S=%IBdSpI<^QEv9+k2 z*n;ZlQB-bRLv{EcY)UAC_Ot#=aiaORwv)|7&E*fMj=e&?9TOg~9}=0c73FBua-D|N za5vt;H>kP2eb5Gy@Q`JH9@O_meY}W$Py?-WnDt+fgARx7*Y7l(O!*8d8Cx8&B8`vCJ9B<3DspL$+dIK8$ARXiDQd&%gNn$f zsL<}j8u%KcvGNH^sv)R|jCRgKb@+2s$9A~#_o&~1mrw)z6SX?tA((mlS9H{Ip zgvyDwsJWhxdhjn)gYQutP4~S`O%c?HE2ARN1U14w7>4uR`8}xIID?h&X`sydD|yoX zjHWf}!Ih}FJBgaR7pMla{9toe0<|%fL5;W`Dq?LgKTdMzccA9@knQ= zj@Ey54m85S&IzdBcymz8Z4oMD%TNt&L`C8&)LwoHwOVev@Ob=UZZ8>~NO#ul3xM6SZ(ADmkuV4R)yPKibCB?VRo1t1y`BYn_jN9-#Y>mUt6G7^|fZgzsf5HANxADaw?;tm9z%tn5lKr$=jYB9Wx@`ZfZVW2P z-e6UXxMCshgW3m%x$>u|kV`Be&Md~Lf!8lHK=+wqo(8-(jk8Tb1;b$zoSC=;Whgr z8iaKze}%D_;JW?Dtm>SJnzEmSVp^^L z-#Ad{U!WRDbIU5s?#zeUaH3HaRYQfk1uB%?U3n}PpgbK_-`A)JUBDb9TaMe-aD`uk zyjh&DjebuKu5+MdsrH*?d0o`Hu8&HR#?H>pL8u&5Vvbz&esFB8_Dr$`CKugqXwF^e!NK~?ILN&A> zqwz4R!KYXfga2TTu?!Z(Z%|45J8BC3ME7i6=0RO3kLqbVRKw#@Z>wpjjvm8`cp39x zhWlnYRFZZ;MPvx-?KuYZWwZ+O;z3lszasSmyFVF@aUm!Sr<3RT}RRL9R_R>kID4pc$9hqj!uIHOSy)IeQt zhJCOt7Qi1+p?{7Vz-v^;LLS)^q(Fr{8wTpZ2+GY+Nk0bjYi{OqFai(aNG$W%{-kmj z9;aORiG}PbYDDi)p$`7jawQ`wGWoGOMq_0hfrIf|R0m@IvVp`ot7G8(UylQYt_^B# zdN>E6DjthUwojZ3QMs_exevAO&p5APdCK=tzZvuX9poLujyMG){;}1w{U6r98a&Ji zjqEfkgg>GhzUurHHR1=TRq!6QJU@79Nfw1#eodT%oO4he-;P>UM^MlGgqqSnpR)cH znirf<1VW!#L#a^@=0*KfDv8>d8lmQX8urJpP&p9!+?H!$)CWm1EP;Jct7kQ8Szbl$ zg!i#8zV$g!1-)Nb==-BOGzyhelTo3agQ{Q!Dq>qv6@7!f@PDWQl>XPOf{J7V)cvhc z^>%gTL8vM8$8w;GXQP(cN>qndqo!oNyS@q4p}nZc9K~k%6XwH$FD>~RquvEeF%RxS zW&O{n_3yp1eI^2nYW>&XpbqDUqt^X#)Xwz;)seifZSD%7cC7NKov|gVL+w!w^uQK4 z6T9L))Bx)JXU{isc5x2Hz~BE*;y}qZKX8H#!}$d&bYHph5mcnkI&Y%h0gq85eT$lc zTyJcB7eP%?H4IDv7Np!2)$!SwQtN*S2im(gqPEIws4Rbl+9*=JwH+-V)}>qk_1+(j zO0Jox9qv2Kj}K6hO8?F}9F3ZiIMmd<~AekBf;auAO!=2vU~x>u2CU>Nk9w`wM@6b9mclEQ_ibhW$f>13$xOC$JG6!`$5W6Kdoyu>clM7#vtlEl?e5h3ar; z)b(Ddj?DKt2;*Qi29^~niGD&Q+bvWi{zUyEN}MP-u(ei0-9G^}m-Db19>;J@o;Wy= zLq$*ntAa|#-tN4Q?I`>6-Gyh)#7QjV*-)V?ikh={S00U8Ei+JC?gCWO?ndRt1=L6% zpf;etUHLy$B!ZJ#{mGEB@8xhO^4STmEGpS5J6oVuLtoSmHUX7Xvr!Fia^;h#4*ceP zjRPsCNfsPfB_E?gz8_W3NetHe|1t*(-BqlK;mIw@dSi9UUm-h{_a3WY(G)gCgHg+F z9BQv$gG$DqQE$EXs7RGdX~|m|HMKQRQ`!VGYW?@+Ks}p?>e(Dr)~`gpt#+bbK4(xB zBu>SHm>yLwgvy1|sE*b|H828|<#SN=Eki}}OVm`HKwlTmx(mOeDtd`(AW3TLSU74* zil7>-jB21hYF+n0CD(9_#Az6YyHUAw36%?J(%3+<;u6YD)3E;4!@oG8r1=lkKyX@{ z%ao`MC@*TRE1^2l!8rug@DxuoIwv&u zC$J!Od#dPPofm|HfTEgvy=oQFD6=SyYcJx^hiai0iuZ%~46(36(oz-1Ql#*YqM(z02M8 zt*FQxMC$duQyeG>FS!f%F^uwa)T+pk$wHnR^_q=EZ9H929h-n^Xof4#bFOfHfts@2 zsD{s>I&=dA@BhafXj#0*HJCbcuy+@Cp&D44#X`6a+fd$(Ls18j-&GDD0Wq1nv z;C*}-LY9XGd*4!SnkU#Bjp_2*)XhTW$}-dxt;eFc1vM2n^0NLFs{5RX#dHxCn#QQt z@MPSGr%}snXg=G57ddaBmT#^|o08V32rNQP#WGX}_MjR(gvzPYSf1tabEI!KWGG-8 zNf`FxhT^DYv;x)h4XBWAMeS&ZP)YkA>b{f(En*o_Ia36cWMxoORTH(08=zK63wOPz z&w=J>1Zv}$fof<2YG>Pv8p#>dy8Q#y@N>+Ei3?eUQK)quk73vVHPQj74vuwxij67H zLPf^E!+{=rf_mUBDpW}eTgNh>Hl%_WiSK3HPTb4hA*J%yN*ic zd#DH`E)rgQdBfG)t;I8*WMd}k&q?Wq!Zd4BafQr~N)PNEfwW-L6 z>Od}M5mX1uVrsqrD{-I)8#}uPF7Oi!HJ8&+bGZ;T!u6tI?`g%MZ_OQW8ffUH7qA}U!Y zqmphWDxwQe5#ERzz#-It{)fJj;06b3_z#T0r>JF>CB`alj9OOBQ6p)Cia>YNb7N5T zOm@yi&G9nS{aaB}`VFdM-(hDw6T|vflEf4X4*cdThw9-#r;jm|r=doC5Eb&I#cc%5 zQO|cr?eYCl&rd@&wAhtbq9U^e)uEjjg$IhW{&nM@?!pUH1wkdOft1c1sO&G|%FR(z z)EyO>HK?T8fExLis4ey|w#4_S23wZ2_NHKA%CmhAG^Ynq6`Vs=@H46-4^Uh0zo>@N zma@=iM2(~{Y5=8OITkgywNUl6LVe2hM&-Z+cYXikU{4B+4^)Q`#hrEU3iMD6|k zQK6fM>fjR8gR4;uZ$))!h2Q1^d_>cIa{9leQ4()*|mKDP6|_m+dedM#sSL{%7p z%I;#Q3QM4}xg09l>Y+N&0##vqSMKK=irTowxbjL=B-gw05e)qMzmx974OEEkU^xDV z>T&k6c0L@nu1h=XqUN*{YUFcKS-uDr@^z?)9YAeZC!DuX19**r|NbYmoIQ{VmCgB3 z*&KyoSO?XyzNnCXjEcm3RHQbbBCs2^ksU{M;Ad2a{&wfzV-?Ej%G+}-(AUeQt2;3k zBPdVBBDezw;ccvgO)J<|yBgK-X;i~MqdI;c)vk@c^N z>TyCz(i#=AZq5%eFXf@Ar27m5BS!5DyD<*$x%2sB?QL1oSsyQPy$9yQ*tp=pKUnOJ z`h+_j=i8@Il6dPtBr2(jp+Z;ISpzj^&D`}4uG}4!yaP~?8;9!Pden$_p+Q5{KM**caEHB~uK8%rtFavg&Da@yj2jMXU@u3~@CFa+yT zUWsw|1eIGwtJ((U*XAG(Cq6~(aGOy{auKzBvQ)F*Y!$E|T@ z)cT!_T27y1Q9OW}nkT4`zjP+9W93Yknhr)aNwU%cfrGyBbx<#d+`D4`r78!z!lWgBxqsZbQPWLQ2WMM)JtuP^B`(J zIEUInFQcaLQ46>J6SlPFmJSvAaMWsuMuj*IwJ+3iHgdLdc5?P|4s?!me&n3uoa0>5 zlJ&2OSGyBmICr2%uou;l)2JM|hRTs!s5yU(jqoLEWVKt_4%h(|*+Hm{YYS?J{024h zBd9I?y6+C2qJCN>ZEZJ3Vt>lfsC{5Hs^N{OhWDU4bQo3P3H%su;W+Ht#;)H*ZDbFf zuP`m;L~X5JKMM!S>Tq`=#+A#UMqUf`Kugq1r4K60KSqss5$e7zsQdP#?mLUR?+?^{ z|Dht0x}9CmX8K-n4s=5uXGg3^c_?b6yKx8}a^;fk?F%R#l`G9rBkYdKl_98P^HC9- zi0a53)D*09*SBG)*8gsIVJ~VVN1f+U72L*fe1clPsXJJ16vjf7V^Qn84=R!iQCsx} zR1O_Rb?5@B{-2%qF!101{L6tNkfLL-w*hk@o1b?IwKHbu66`I+HmDIiL*>L<)W}1- znrTrX4ns{rAymUvFtB=1?}|pK{bLRWe*d54KqI}5+KBFBC$`Gu-E7bA*WEUfrKph} z$JY249>h95g1vQ^yr=yM%1%5&xp}W(?@P?m+xC-FxSjI!KEd8rjP1+%*Nsp5+5_7^ zw2BA!v)Ad5*n{i;qDI=GzlHQe=QwQ6`8lrq0CnFRRD_ZauyPtyIVWl=BTxgbF~GM_ zHRXg}i+xccp6qUzg9_;iR0ubrLc0@{e5Wu1uc78Xc%U_u4mHM4z? zH_qokJ*k6*u_dYlpQ2X5EYuvHb>}allItcax&B3UB*`EfX=YS8AF6>;sCPhR)N1OB z`sp?twE_7vIMBLXiwfP>$kcl$P(A)0m7M3X82*78an`}su}Y{B)j)-|fpZ{gLz{whu_?|I;p5%x*+$w<5L2oB|Z$S51ZNYv_Bfm%jK zoWY~*Ps1vq-iq6B7T&{~IATn&w*y;@4fZC`p=9J-6UsBk5h2?5?r<;wgU9oQLTm;j zOWRBRG0Oypd=eb^FPHL64i5Y~fn_+7`!i0ld}+6;b{Q$ZITM0x2<`*KM&i?<%>tO}ds#uEC@FX_G zW(%#N4H!@PXN<(Gi|mi_t6&V}8K|T^?8?uv0p-ZWHl-sLGZ*DJv78g?;Z-b-nU|RL za3SRh7|43&M;lHhT!%~W2F8D8pV>K=+1GGiOiN_8V^gjlTOJ(v%jqmDY=aww^*Ddl z=Rg(aSZOy5#p$|$GqLR|o3qEL4i;H$e{a_pwPBq`?FaWzTXWDF8(|@AL3s=g#7o#8 zYkqE#+KUe<`@eBen}f4!t*2Sn*&oFWz@?nufPEQBmGxG^jt#-y=bX>IF*xvVIljk& zlpBA+$0hgqmp!GV7PS#pbgsNBU8+^@`LD*5j}IMA}0gsSK;YR7tvn$wKi z?4vRcb-o{V$Hk}!1$}9&W41Ht_F!)d=OtDWY>)leoR8}%_xUO~@DCf)e;w@IqPz_A z;@EG3y)pPXHrM*kwbzntB<7)mz4p~-qJ{%nQheJEC3g`133H(;``k+F% z8>?f2qc$~lQLAV)DpFsgJ}|DLR!zoZW<}HhyJ8KTa*XxAl7kDJSc`*?TZLIpm^HC3 z=Z9lFp1{hO_&eJd>Y#oTjzq2Z`KZH!V`bQ1}0UB{AtQ_P1&ASXJx)CI{+io?G@4ss~=7{1`RI zCvKaaezgtf9rhqXGk&vQ$N%05_V#n%j^FLqbHBS5v0{JN2DTBkEYG8+BJ`ep546T@ zJ{6_B&-)ngeUv};l9_Xk!1YKlBpi1q`VDN-~rT* zdK&dzkl=62_E^+TSOv8@(){DT|Fd$S4IvWsaaaU%=|&94?x>AuGOFRjsP+32^-&rB z)IK)rU|Py8oV}f6QAs)5xdu~H-u;yIuL@3ZA~~LO7j9w>%70>3O!>?@RseNh9IC>) zsEXR7w($O#3V%jzH1|=!}ZM@aL@myc~SQ2_@SG)W&ex-EbY%z+Kb^ z@-HgH-V581QlfUc2B>75j;i=PCd2E_d)SBaGdzwR|8<|~{!4p_ltMkY9`$nAj{03+ z^p%aYCibM<8ddReR7cLC*8MM-4PT?CEaPk2u*zT*( zx;XZt+yJNGKGfT;+8e8Q2Wo15!kqZjmD9bo24hgy8)G6Ih)T|psI7T2w#Ld zpgB$P&XO<-Y7WCt4@RLP6N?&oP1MMnq8jRqn&Xe~D^|yssI2e7&y68$qN}k1}>DO_eKq5h&%rgs-79B z)wLKkMJrIrxnE`WAMdt1@y^|lJ3&YwyW>y|HbOp^ zy#tn`l4=j;#`~zZVT!~dflsz>Sda1<)cNd5Lj1smp-DmlTjWhFz=hOFL+tMZkty{C zq9QRE)$_5a4tt|7`F|FyytVFIxrH|&_PsA{E2%09coo1Ol6TtkBUTQ)YKM0HCzIfr17ro z*W)0b6Rl9$`5CH#Z&1tVKB|G-sY3!kKnkL!q!;RZAJmi##z-84TIcI<6CT8J*gH)~ z;1h2>4yRlpF!#vCDm&+^rHjB<&bAzqjse9eK9 zE^C-s)!7g8aegt5#=|%bD~5-7pWrD}C>!OnWqJz7Q_h$>#EZklmvZK8=zK0M|XY*1~wj4MaxmEW(z8k zw~>_bk`=HdO@T_%4^TOf!t81dxErG|73I>-8mNj|xa+M@6?H;A*V{S3ISe(R zF{mwfB8K2JRIbdz>Ub2@PBOosHINlG^6aP)N1|>hgIcdOQ4Kdkjj%l?!O5s~Jr^Tz z1xDft=bz3@g{;HzsQas9RrDKkpo$lxdcN9~zd((AC#s>{s4ev%s)I*d`2vPgzJxjP znmhj=>b`fV0i-HyQ<@FcUQrCJ|I!?&;lA#|5L82BQ6V1h%AaC#dNc*K(=9Aw8`N5C zO!*f)%k^SKEs`P8_7X~o%KjKEipx<0JA+%aaDU|B4^E7Y3Gq&1w_+iI|B1z@;>;a) zoK8~}bn~!TKFF_?$#dw?h z>ZmMl|8R@5is;P)-sD>-Ia@V_H80Uxh9BADyaIQivr_HF)ZAW$B6n4O$Fc+4nY!$RX?TjNZ zA5KSwcsEYL1Xb)qW){|>{0e`=Dpf-Q|LEP1tQO+cWxe%7h5XwZmK@hmTWY$R_CBwU zibw~{k3&%%Ux`Y}O?Va0VF}z^%R2TeDsnGSTYAFUA%UOwnUN0rUKVh7At&ysTt>VxDwDxwcj9ZyhS--fKe z)EunmL_Vw?#Gizs-s4#t+I#;?)B|yiY|d+=lB*?ZkMD}w2l_Zip>kphs^bgs3tW%7 zzfofwKuZk#_rD`J(2dhDjt+c=s_;e=+Zi9BlIR&K=@K@z$fU=zluKe14nS=@t5H*V z05xUTQNIKJ!Q7annGK*Y2LAWI%Wx1_kIt&j+Rlc~=FYax&d#2gh>H8U@-XKZ=LF|u z=S=7PW^Vm2bthIi*E_d3cRIgu9&{deo^qaZUUuF<{ZRSM`3|+bGdH(Sw&>=p|2~}9 z&I!GrbF{EXG(?58InKdJI1973v}Lpzt5E(IH(>czmhHb|ddja*4X12vq0Wz*x)P|V ztc;&xQ=fytT%(fe5o+&$iPbT>O-SIsW*dR}g!%>JF?(CvVA`X;@p_^*o*AfRw!*ms z)sf?<`fs5+@CcO~{yPpd^7QTO#_FgFI-!=?5LDLAM?Lr%D#^B@Hl80``6lY6@*1_w zV%pn4>Yz5PiC7Xh;AZ>i)?08WFnnqP}gf=8m<5O93*DhbwoATtFwh_GR~kpAGOT#bg{W_kDALb zP+RlYsO5DS!|)1f`Mp9#GGkY}uK=!~TnrVV3mEwS|M8duh4v|iV}fp$rTLJ4d9kQJ z|Bpw7zFBwM2?t_6%1cpGb<~xAL+vNYdf4@>sFzV?RQA_JE%&bItKr@pB*HPyiO%V$ zisqw|bS>(^U8oT5MTPbtYNS7+lIk~9M_;+?AM~`Tiap9rRL9?=vO7^P3w1iw6lFt&x&UgKRzXGTF{;BUdi&Osu-;Zd z0cS~6$0}h*Y>Zk3yHQ!cAJyR>-T7;%2>pu6iN8_rfY+{^sE^g38g*YbXF;C>Ra_R8 zWbvqwk9JPOI+Q=d2)vImn7XgsR~ePGjZq^Vh-zROCM0K;ViU@%KeXih7xz%k)X#Fu zKg)qac@C8e7cmU~KqX7!{?n zL*oGI3+b{mXqZiLLDUq-U|#Htf&cz@E(eV{u^I`9_rl!}Gu+B8P+30@Bk>NZq7)-+ zeb+#RwmIV6KgL3S0f$qrG}b=#_MxVnuWvu_KesiCWvGrM7-z}V z67?GGhfVQgRQ6v*C0WpT`z4bU?@~U5GjRP!_EWCp1pA|$93O{xhgb!Zumsm@e!}yV zebkOR=~Eik+%KENvfxCS$svLN4=8_4u?IFz4e_RO{ufm8^`34!;9}GUvjWwjEvO{i zQF0rW4H$YX`4>dJoQ5DWWW%uXU3lF0< znnE+J!ZN638;`TGB^JPks0d}4WmC4+=^x@CoD0`bBYcb6U<%H*q-uxSSf*e;{2X=v zY1DmBFbc!x*uK#S>rozrb@2$Q!>Q-mAKMj1-9HS&wEj16paxE&meX&p{2F5^r=Mq8 z-2~$(Pey%E{DAu4c#O*ayz_09G(<&k6&A%qs0RN+MIwBG{c&F%tgrPym4g~wxP}ce z&qDk4I~220K8K3TV^qUg7uou)hRII6<<9?zyJ+9L z&4DUfu-JaTuS9JyiI&*N(xMuuh&izes-Z5Z+!=&=exf@+6ZQOZ)W9~n@;|5!y+v(Q zDVMtSpN|7IFbY-ic+^%p3$?Q?LRI)VD%rN7l5syOC(dJTe2v=Ka(rgzt2q0hrgk1` zXWfL#p(~%U{_}9~niIqyf_h*ss-wG6k-3WM@UN)l_75s@ zNmttW%%}+EM@>;IYTY+Pg}w{w8*z-!fo@!iS|;034V`i2r>>lOl|`Tg>i%Y^k@dm; zI0BXJ4^TU0meux0xbfJY@^Vz9-k}Ei!5VuF`_(uo#EA*0o$5=}93DgU`~hm2y+Mtj z_~*7PtD~-eih6!A_QDgWcS7`9`{VjLxSaAb)G{r<&i*W^2Nu!#-^alxTzG)halm@} z#q$lWq?~huy~PgUWXho%Z7ye^reFis3*s{z)zL(oZ0n9iZBRo{A>V-d5;}|>FvDhb zob@-11BLQ)?1tM>KeaM#u?L%>I@S-P@hjARa37Tm8MoS7Gbd`5M7VOav$Qi7^{%Mq z%Jrqze=~QYt+R`>w{xI#1gfLsoYPSaE^*h_IyXCaI`^Wc>M-j2-~y(=#M@Z^8fgX& z^g+=Cbzvqdo0mB^qjF;(YM(fZ%KD2~4J$n)BZH5kAL~IDCh>4K*cqu{LJf8RD(NE=Wpv33pk?5~KEq zl=3FR+%J!Mg)fh&3H-_RRtccf86=&IPMxd5w3@YhrI6Go~ z$|JESevVoVDg8Z`Ol46a?1B1F=;O-cQByJz)zDnj)T}^Nu+?3^>aO2I?eWi0kxlTG zOFE+E~)48!TDhPI-X&pFfxucDIcA!-0c z_SyMHs9focO47Ti4!=W9P1t_Rfs&X^>%RgA%Icb^p4LabELx!+9E{~~0Zzg5sFzFI zZ!I#TQK8+0nvzrQ{J+?Na>M}}*r%wSa4TvR)IG?6Xy0qjfqK>f2jNg`gbz^3R^gCM zO(mQ_c^Qtv@Wa-DWvF+@X;jDVqmnK05esz;jt}B3i1|2wR_ z@*KS4gqBmu6ZXeyLr@RyMa}U)sMmCf?`%)+=Uk1-g^Q>py^HGD2j5%rWks!?A{d6{ zQ3Gm=${GIspY2qW+zsyg>;0h`??xT|M8ES`ni(@hANh?prwv-p3mf15@ zgPDJ@EjY{>@!roN1WfIa^egs`)?rm&(G-wn#0|wWW0vT_K=%aL26VeqfiakKy|PkDuScj^%gjvb zmrUU&_E#=-umR>u?}8EO-a6|Hg#oDA@775 z@Ho`->wFHBEC*1_>lP{!FHox?^E1o(3aADuqgF!;)QAVT>q}5Cua(Zts2%ldOp4#3 zHmdW^>!_X6zw1uCbSHwJTSe(n9ScLfBPyXfPz@_%YgC9=ppx(kDoNjB6y|+l>%19i zzZig;y5*>P?;%?>zyJPqf1ig+rcti^C2C6kK)qI<<9tm1(mJ@>xfL}9dr_<7j5~h~ zt5E&}HRpw1S$&OBxz!N^|NB4VIM8yLjheG9&O@kdzTnCsukCsUXMWW6@~+$mRgdpn zic03MQ2WI1m>3_SK0uyh;Q#+up8sr)Dx&7FCTb*2-T6*fjB;P>gR4*>O!>wl6NPG^ zy0adJQf`VLVk=yNCs70J^450HVMzYdV-A!g6Hv)D0~ONs7=-&!bN?-BuFs>g_+L~G zWPj)88ntl^Kqc>NR8sFoZM~;Z1G|SB=<|21f9>T#?`qnuSqGRsq#u8;r*N*ae^9pV-(>5E^*0*Y1Njx(;6E7n|NmV-tLhSvpAt0Ya41OynxzJ zZo2Z{sL;JZEuZ8WY#%6t+5tzQp5KMN@Cs@wDrdAv_CsxS!%-XBI4q9`d=8Xk|Di^Z zIFt1>BdWp}R0NtiyQ4ZV9NXbq)Le#U4)rz$@m9myl#^u*4Q$=bQ8~~O6JQ%>C)7aw z9vr9xgHSyjhnsN{cE=LgND?Yuh9fb1j?loLU@poT8u;Ic2@bQ3!F@X>h*Kz(;3dtV_8iHpKPLSJ;Vi?MPd;TT%Btz}8y-rSn^o%tKYU3|HV9ROl)f z2n~F@4MlZq9BSFkK}BRaj>6rTAEOI~dV2r2M&(oo)N}nXFOGND*JI${|7_+!>-_-g z#_yazqn673CFwi&2r-fa>X9R0K|;HlWL>T=)x%V`#KZT^Uq|Vo~+Qqmr>D zYQq}ju8%}5%h5gunsXU~6HyIKMlH+vs1B?~g?1;Z!EaF&{)4*z6>8)OVyv7MwVd;z zrm84vKy^^hwL@*ieph#5hI2kDBA;Oi+>UDa4^(9SM$N5P%f5m9b zT+&8Z8`WT2ROr`XH9Uk7n5dNP7ez2q>%TPz3gO4@!You$ejB*K^KPL+nWVJcmj*Ru z*-=TC8>6rgD%5RJIWQ7c?`TwHCZRgI09D`jm|W}sM-G$>H&8in3ya_#)JrH`8Oz!T z%t^Tss)B*2sTk>;jmnt~sCstecKim_aPP9#;bo|)T!+3wzng5A51HPlvKAJtxOR0Ky=Wc}CSU_2*k;u#!^ znPRPig{YCPMP=<4RL^&zI(*c5(fJ1|Szn=+Ur3xam=(2L3!)+#i@L8-oNw9Kh7%fj zcdU+|<3)Ugv++p0EyE_2Y)-qPIyL|`wpCN9nMI>IR1DQ{S=0}W+OFKwITH1I zVk*YsU96(@A5qgS4^#-3p>kmxY6pCTMKM<`3uznAPDi=Y8JRa5I7N`*Sa*lLP zK_%f5)cxB~tKtMI`EH`Gy|`FC3u#5v4J}aT`(qg#h05;Ts3|&t?A_jJRMIA^Zy}FD zZMpSOBkqA+upg=;KVdDrkBUI?2CV-W4mvcjm&IJvy4;O=sT@STZZBdwn^eLX@JhtmvU8Xjz6R3 zGP;S9h7qE++PSEyTIt-5nxZ49E%+ji!kYF1<>@{Ls_0KtB;KG#T(p^e zR@XqSj?t+5rlO``5r*M9)N=g}^}`}nbKY(&i@KNtN4BsCEpBN!@+0cGTc{-WgId{$ zDkArL6HpCJMD5XYP^(}OYQs5$dGRW$V_s{!KNYHD*)SXnppvW(HpNw_Wc?S_;UsMW z`;PB5&XP9@ z3sEkEs;?WS*Sed;fkw6rmGv7@bG6I44|7sJ;>y3e@_kgYCTVXSNau{i2+mhPb)btY z4?*qypJ61Pz`&pX{iy>^BK*OM3%dChik+O$M)DN3z6*4>p7+DD zdH}z~uTT~D=wTfgjOy@ARAg45lI#E~i65dGPSw*agnBpBL`A%-&w*YFYfvNIg#Ga- zDs;trnenKe*TZ=1ftvF#P&?amEP~m4+Z@+HZCt}qAG1HABK8#3v6OvmAbt!7s-PmO z!EUJRAB3uKBx+r6L`C8&R8szfEit68ji@au)FV&>`WV~eG*^Cvnwn>*=iecb^Sx9b z+JiYUhzkW!NmmH9A5=nhtSKtlI-!ztfV(~fm2{Kb`3*=HG9A z4A0E*nLGFH#t%R#>tyz z+6`8R{h;`{VF9=v%FZT1S@9Dn@jgO%vSuEPy^BFk22xouD3w=$6=7YKM?qQn2%S%Z za_Set-Eaqd3P<>6;2&kz4N^9*!@;uizw!llqE`grpaREDz9dN2aEis$~9Yq=kR zY|UXP*ZvYL2Oq)SF#AyR#bgMSXZ=YiiEcr;y?ln5uOW6=lX*iZ3mO5dz>RP^ybTAE zFf_qxNn(C!B=`SR2J=Umi3^T4E3E?ME~pR7z-CY`!4Oy#j)6VlKG+6kAx=x!7jA`{ zpga${j4`)97Per%3pR)Ep*&|AxyG7@Xfl**^A(g=vAs|Z-6<$La~;m(_ILv2kh#X2 zZzN{Ic;-i;obsv@%)`|H%1$+da_xKRd=ZpK{5B}h1J^zV;&@qk8%l!5Fg1J)rJzqx z3d%ImoEK77gkslN=dG1}pcD|LoB-v?w;0Od-3#q<|6gDrkKX4nCoD0^TtQuE1ctSd zw}w*aWGJ`OTquREg<`i0%6)wR`oUYUC`>ciJS%=scCs^+Cv7M+zW;9w1G&~Sl=Gkj zUIOLXZ-U}*12;}y%&M*te1|?xxD1|grc7n3P{!r}0VL3Pg%FF53P*(gH z%8SiQC}-*;w8LyO&3ILy>`23z+^2Hw+9QxH4uleTAQX8#lme%~j<Fz&}HIu>1if zP@!37;&M<5ssZJB5CYr7olthf@|C$mIblhr1zZfI;-*km8UUq$K2Q>c!>lkK%7bSr zlr8=i+TlqkPr%1e9yr$7CW}IOG&jr~-4N4*Jpe)RlX^t5nJM4m>BJ2w%Ls{V? zC<*h;H4jY@D3u372{0AP7SDpRfb~!k>{k70D206wWk;VvIn}NP~K8)R(`MY7f?=jriEs_EKn{@E+{Ln0_9RRgR-z5 z(D?b^5ey{ZSSSyQX*%ByjR%I#FGG32+|>CqD38>)P;RqqZu7RP1tn2EWd~?y9t`D4 zIuXhxJr0e}|DR?cTYeMDwX`iVSD0T}AIeS)fUj!4dvDE1{C|8%gn7W4rPa$FXR4~N_rxY7m*=Q<_T&rTe%j>Gk>4*92EPX zq1>jwDPKa_$&b(uOD;Ees0EbgL3h|1u7R?kXD$Zvz(}>iWEJ?D`2bh}c3)|J+HERy zGJg&wL624D3MN1~ylyB3E{C#!-6}r=}J_%Nq`~NBf z*_t%#%xl>Zc4j^riu?*J4hyU|U%eW`V$5ejc@TXA#r_ubgB3QIpE>CRWoPHW&R#q* zVI1@9o6I+}(_ja=|Bo=}g(B0}=Ce8s4q$!=c7z2tn_D#m_GZ2b)`GSz=I4$Yz^cp> zU`@CKO2NNFDKyho^Eprjwqo7^%I&ud8h`(9Edx0WJD@yhPQg-Cd@lS;EV7dr>;Y*c&f>KzHou+?#D3_==bQNY0#y~2a39G=}P`36l zlm|?vT~^~)D3yg0$PFdYWhjU7Z#Whf+HHQBZnd(`H|90J4x6FRwZ~*%$hEhu-^2Z1 zoxu$R5-7`FbL;BBAm#&Ld3X}amcLO}+-KhJ;qVyp&C0MutK|T5zx`I@=ZPP|ip*;r zFb`cgti=2v6#1VAxc}t=QRtv~T6;rT*(fO2Xcd$P)JElZP%hCOD7V`yD21mvWcpWz zX_WhXgCGR1L*^l zI9^9heL5)e+)#G7AlxGNe?tZ{5d5hI!@o6OF2^Y6LV04XgR-SNp&jnm`3;@lhq4gw zW9Clegz`M_hjN&E!4hyh6uZqZm)!qH8I(qF4T_=VxM^4l%IkJ}DEdI`BNwltbEDb|Kiwzf!yc)p#&HSWvk~v z(JzKl`6eg{4??lO058Bl;7Tt(^g3ZRenP6pDXa05P7k3hWc+FKZki2cN8C{4n@)58 z%eCE$KoTE^a!9U0Dd0A23?C{>oiPguSB{32(a(mHDIgijGr!F_Q$8HZ^J6>g5AVXG zu>N_g@w+BJpLdyq1>akZUybH>!Tjcs2k;bzu8ZbMnqM;IkKlRa<1bq+hhV@D=6A`Y zzhb`1#lmsO6QP`iT35}TY6WHILZCd@hU@&Ui-8!vRDt)8<~7a<<>j{I}h zcSgOT9Kw-M&c{!+Z=Da*?#(Xf0fr-%N$Dr&lR^wZ%yTe_~pTWy;)kCXg6A7b#HBWiI$L9O` z@h}1XYFL;p%J-Yex=&2@duDzo)!4tx=Ruv9=BM9I!N&M?dS$-qx?ges*GF&_fhe;7 z&1b(!*c}dGe&)5g1GV3n@9~C1SyOSuHz6 zu8jO(?nuE;-2YuM?Dxt1Kw}@=#=P)n^JVfPEW+IW#e6T=81`Vk5GKJFP(JY3!<1@CB3ts@ZJDp^Js*m@kH6??`1cKAfKg_c8wyeunE(+sya>Ytz__t-lG|utf#a znhs&UHsjsyStzgTCDYlAHx5f+F!Lu+b|N6X&G-i7&2TyMW*N-FA3}N149HkA9}WWBsL zYzLs+@UfQ~TSDcS<#3FXZ9=eEvfMoJKGX zzJl*ye0lTG46a}^zS^}NT9Lni_uy-I0{&Rh+|s3$Y{tiSUtkyHag}YxlkOapvz4`q z&G@u?IFz??d!W2n-L1m!KP=85S5=$wJ)3o5Yvx};JG=#D3qL}+-SSnl8SfJU;dbV^ zs+%i12|3M{cd!jCU&FliBcYs?b5LH?yldKwx9O#!-0lrs4CDb559LK-F_im$9kjvQ zP@dTjU>aDu76IAXN>FyrS=-dlhjPE)g5qzjV>4bQ>%f)FyFz)x@&-!0-F3}F>w3o^ z2thzSbBp%C4$MEo{;*wr^RCzd<&@WHU^D*a+dR0Gd8dZv;d~C|w`Z1bWV5_QKBBSB zco~jqVqStNa4_-*P#*Q2n%d-1?y|TUWI?b8%G>CZFc7|jcG#<#xpgCzYhhs$omD<< zZnO9>&)CvtDGRfz}W*}Be99=)Sr zM|cpng&EqJTir`J3CeA`3(7Sw+TQf*0gEwT2qoSjD7W`R*boK>*o>F)4X_{c-=XpS zzb!kMg7r`m+d7)3vpZbRd=9(=t9LSQn;f0Z=fn{BE%LMQAe`34ycA8lvJ=cFLU|3;TJdt79V16`35Ndd!Zc8lMp+XT++hIaw@M0jlcidSQPEixRi$N#?2@nls>s(My^BkBHE`}0lCoBa|!>sTx zC|hhDV>8~4=YaBhe*?-6RUT_IzEQabEX4dOeFj!=Q&G^K^QYeS@9IOC8L9VF9f1{s!;CPVn?(oAGtO z{8P+Arb8)kKCB8|3mM2G_&k(CZo&HSIh3s`Kh@N?fW}<`Wkq37RuT)vegu?DbO?sQ zD^Ol`>rXT9_YqJo@kS{AdmxwAWjVq?4&7BKE4~M1Wq;{B)pYX^=7y4>5|rmbD_9<` zgk|7GC<)&~+3IRD%$=zRWyM3G6r2Dh&lqU@{Qq1A@*eLjya9iQZDG<(UN&KtSvKRN z<14TpbLUq!<8Q-kf(t}Hn-4hPMtB;wn`6G6&o$R({J3t8dFB}!2V>A*fx)o(eBMjC z7;I&*0uESUGrn!cYoX2fX0!RwhP3q0yEtHj>hqAB+t8B)PT-}3HnU7p;z8Ixi!~H)JLC_lW)$eCmig~`Z=8Bp? zd9~UC*T846DV(#;yw=xY8|K;8n@`IAumtl%P#(1ppda+zU_N21L&-M;UW3mzxXe?2 zVx#$v=Pq=h$g#<0X#hvShVU?yC)#Ia`mfDHlo!ea$PdZ`r7o01+5_6*5GZ%iT%B*x z`FSYsf`4@}ko&OoX7iNxgAy`BddRm<{=IC{M&)P)>U?lsG4$ z#JLV7&V49xep9*YnGXI@h4&WoL6io{waozA!;nFovF}X`K7VQH&3HaCX;$Xaev;q6SQV!TRx9_xrv>s66lBHcCHf8MyHh}UY)Yb+c9Qwe#JRvY6Y^z- zl;;ZigV-C_Ut}G$qOB>ay+!i($O{r+3km9wtP10IB&>mM2(rPA?HkerFbRqBX zvm=)lg{&Ap(p;$suova8@J9q6C`djD5lw)z7^P*kzUo*)ohD#gon#lWmCpl6TSFhk zxQp5vLjCUtc!i`c{G|2QqE^fIUuI(UNvv+F2KtTwKN6fz(OXKXq3Oo0%Ah;)pIB`e z1^z=o`Q5L;@`*$Z@DHN%0%|mQm6Mhk+x2iGeG~m_`YCJzNc;uA zrTA2>f>Bp`3A(gYdboPSFA@~lLX5Y-t@Lg5-18F7S9cv@G@eku(2p|ymVS(WoL-93 zj+3f6`{8LFup7%B^+Yy>@ne>Ehc2x=_R{{QKVg~j2Y{_)mzIe*@&}ih8K9PrsVQOoTsHFO4jcY|N?KKsh z#C}+6&fyBmT1J`AVLJ?Y&ug@71mX|yTCx&kfhI~ozn8>WrC4-f1T27`v?A(f&L|$g zmuy8Lcod(r^osZtXZ}vlq;U?PlDs7=*i6uaD6?SLn4swieoTXgA%9BGN&smY(6^)* zZ=Lg&!uSwEbYBr?6)~mdRbD|qltpyLK1h8^!;db4$~$6dqi~eg9ODHPbdn_B(Fdx0 z1Xc5!zbspjH79u*#sx^=N5T7ezGEbY1O%S@7a29_D z+47YJnWOv%<7ll~oaQ2*N1sn$Kwn7DLXmEGhLuZO%2>XFdyLgBhb!oH86O}~97Tj_ z(OvNCMf?Z!1uQ%r9|u{!Ws*??jbZC1&|9FafMZQFzU4V{%>HfR8nA=<9VSsx#^EIX zOLwpa4tyEY@)7Q*m=SFIVU)|v(GLN=<82H=n9T5JR@h4FO~Phxx<-Chzez(Lw0 zbOW$^fNl%AECd|O{0a$sq}VaB%}$K(e7M7N$vchCM5s$7`4H(d)_z*zE9TAdoJ{%B zx)ZgBIke0tLKiYs!?u>n3ZuV4KT50!Jw=1?&w*`qY%5bu5!i~N--XV%~kqR^z-3<)gQp8 zuoib0CemYxxl2x1O#=Oh@h&=lb=hKP%idzpmx}pHyQLh4=@|E>k04Pa>^EU2Z7PA+ zV(U*IkG>-bhhskkxu^9d?q}pxS@~6ZDdPWyt+adc;@=wsY2RbShvt@l=$`h4aR!`z zrVvldg?$J7t|PdMp6^Ms^rfIbHRwZhpV@&z$m9zU((d5HhxbO~J2fr+8UKu(OMcXO zq81?9LIin6LTSF5l;50a$%w;Zf(20hFywdei^8S{yDAlf>b76zow_Bd)i_KRrJ#EeJ3=oe^VTek|3IZ2^w%fiXG`s;O7L{r8*bm8MrQi z>(Cw71S{~r$ov`czS5mLiYzsL8;SP`X2Z6aE;vr&{d@m0K7i6nA*l&s$Kf*0#i-Uz zux~N0#QeYQeF~ZUgtN5bZ0##e@|l>OOtED<;}~{sC$Yk@T}fOc|09BAOtE6Im(Ng1 zdx_I>wmm&In<-3MA%cgH#)N4}59a)TuKD5Nb8f6@E1+L{!zz<5`d4Q(&npTUiU z%S4K1Msl8yMEP2xq3cWJN_a~ftil6}jqO`J&j6H2GfyNgvup9{Tw+R2aPd>5m|pZ?#rl(;AHIgajk=qgSD#t%&5yo^C3tTjP3lt*ylGtriw^xnD)`;lcK(K?E&Pp~w)^0BZU0e`RM7QjuQVfd{*ouv`N30|#x>^*L0sDm{F9g%$ zKOB8+jP567+tCFe_ao45=H3K3sdnO5kvKiD4I%M8ba~LtrP%e%AET4j8Na{jg|YKZ z&5c%?1drK)Vg#*E&&hZeh7aL*43Ft59^fEt8i6k3BdxI}{{^O1eI9nOD8AjWdyicl zy3Wj(V1J8#34JB*vKmRLjDz+bC zZtQ|6YCF9Yy$K0FP>eh^+G5)j*$GXWl~~eB;lk8uJ`EdA0%?nI8bh$NB>xTLD#%Nz;kSA)$HT$s z4#OD)3dKGh+(s{fT$+5DZ4|{`f@g_oW6ZY+Tk2yw5xe&q>mT&P<a z7@weka5bu|1?0eaCbFB@y-?j8WQ9q3OKrMQa11L<*$NZOm!0X3AMb-Ki|GEEiyyMG z9CB$ear#1^%DfkW`l@^gvKu6l_5|4*oTQ~DXhGPX6_vxj5o5k?WqdpyYM~Z z+iL#Q$qX@*~Yin_qAjD&TOHNfW!wlk5XY#k)NC;vkd zY{R)UvUMmb5wtB%cIH1)Sa-%Da1TKyBKwIhtv0s&ig?Q!Eh3B<@ytD~5c-Pvd0L2G z>b?}$fCU-(e;{ZlsfN}I=ie~efou=Kq}9b(+9i_Yq)WV#8YqD(MP~GnVE}G3N<< zEk#g~=O%D#be>j&d4>PGT0`{~`4;@&(CfHJlKgKqrfX{y-=}bV&Ca~WCW6&%!d}`x z1o1~c2>yiaF8VckJBn?D>@)WDw3tEI=j9SKVLpeV`EC!(_t+dKmMam%B>F)FOEJuW zp%00MF_-o=MyXP)^bN8n6zI@1VHok>5#1e`kEMu{%)i3dnZh@nj;j)XC_Pd>{Vi=S z!R$D7#K1}Ll`nel4A#;A+veerNU-@BdlRV?38YPd(G+n5pBn`J6`K_)RxdVt zkw3%l3-TYal~$H{J}6&#DXOyC#<#&Cte{&HPB15l>ydCAE3Seef6~G79Bx7`&0CV` z<+%bE(@*PM^p&vBL2(P=7UUi9J1ufzN0a9!{#%hPVeC3ZHQ7kk3Wr~)`naxSwnU<} zAc&_`ko}}hBv6Wc7JeqpXiwmE;@0t&b#g9868I7YJGnX2#yr7Grxv3o6SvhMgm%aTuNw^Q!7h zd-DH+AR|@(sTGQ%0zsu^#d8SB!bq?iI*|XN$(BHV%*RrZpcBwZyM+B2l9q+7;98YW zV?JK}&ce>vwnuhBKGQXs3crJ|S=j`X8R=ySDs2(teaLf>xI3(ld^fz9qFB?C*8z$t zg1xjD)rT|Q&3L57OM+su0@(n%vHw<*2P0iTlB*O`lgrRjw<#N|koFBp*JCpcN-L`g z%o%dsvHrx$K#XxD`kEC=8->qcWO*3JVz-Cb2TYyI@{B-p+5WFl3?W$&lwZ_QocE%W zmV_=R!T%(16gI8ZrV8@11b;-F{K&^rmNko z6S|tp8g!~M54ur||ANvST1+;A-DW&gBfg&2iUR&^=J{vK zaon83_#zfZG`JXFXXW28pANSX;1nyW%Vp|JvVF*c)pkGQ_KceutK&^aiWq&!Q2^iR z0gNR6?xXvyPG@ivgEO-U^6CceKCtgtyX{$E3~GmQB8Wj?*f zTYL0>;uE2yD`>~6yh#|2<06V`%=|8W6#=GV`5xz< zj5DJz$GjVT7>(1ns`+p$SR3zC%O(+5K zGd_snWgH^Vw_+^qZyd8QZ;4+y3h*Mhr{!Zjg#vcdzh!mOW@DF{SflAbAZtRLd{VF$ z>bk1|R-*7yr?n{Ok~oO~d2yUg_q3NfsDi#M9kYp2%v#7KaPS=q2N7e!7o4P~s*p4Updsvzt zgWWR<$N@cV21&m|))L<%*j6Uy?~DT&7e~%_>suDO5C*ZmT?t%}o)@RDFj_^FS&YwM zR0A7nEzrNid6Hg^-v|S0>!RU`@f0vjCmGxsj-t5K;MnL3b7v3U00Zt zAV4vk>Jnfnb7}Qi$toP(6j4tTt|Uk-wk6d@?9$>_13PJUXrri}*d&-D%Q*BmNF?nh z{Ws$6AWjC;$7Siq03V}m!+1W<(gejc@Mp%IQe3-|1o5k;y%-;cp?XHji;eOA%LrrsmyaM182(K$Jt)GB!)|&K z^J^sPs4G9h_>KlTp_k)pY;xoOH^m%LyW{BYl6W%n&W!!hrzYNdx-?fY{@X_-4^jL^ zmv#@@HK@!(=^NM0A zZdZ(&>QCeTT2CTb#)m1Q+i$eSUn#OlT|o~`z=Vn91hqIBr@Xu+n` z{C^6$l!TOj<)Yl)yC!AgwX;?99usWlb5Mp}1Q3 zj3(GH{2Hm>Xc7e>@2iEB(%r}dJL3N}D?UK?#eWE~gXm+?xhf*?w6-|EVt$1lK=oM& zxEjNw7J=yBE5OBG?Thz!WI$4R%c#e?yGvth_k|x)}e=xB+@!*aTT^Y~swH zQ|8pNy0i$_!DhOm+a$2zDD5W-_^2y8h&~mCEJC*oc^BA8bz=LM`mZICwBMC79)oV2 z3~2lDb;vg-NsAyrLn@bcio~5sFpUa7QP2;t2h4^;GlDh6b|yA|B3sSY?tvMxsfjKx zF)G82_-CWAmgqdK8}csLIq~tdcJd`NX>(9W%T5w$J(2IgIX{=+CXUk1k#w$Jf^_J5 zn_|mn#s>&mn1s8qnXd9a6uKB)0y1g4G?$Dg$$vCgKmOZ*QE39S*2=P|p^p|dNRxhx zewyLNw!%dzw!MXJdrR0(7ZIdvjjRnlr^dNX+)FH~n0#|udXl{-a2r*gL|K)BX0e)? z$a})4^sd-NGVes7>#!TE$^dI4Kcj{GgYO$`r8U%DyF#o8Y+f;Mh+S8F8k6fDWc|E3 zKpBss55k*_7s4OtZ*Uk-u&*%Oqrui8PojWxny?`W!;lRlNy@g9;;ys$jJov?@$tvb z4_R7rNNa$v@%;Y@ML{OVNp=cDUxJ^}gjRH()=tOGv74SE;Uavm(O2Pv(z%rhe|K=;OPE0?bTyv%$j#pEKNwAK_^TYe4N47PKCCNfoAcZ_Vh zitlkcLtknf814XAi$r5cdKr0Ug4e=!rxrg4ZleE8u;$pr5o;;>wyKvLAIK@~gna(* zM^@t?kf+Vot&;f%96ysFCWUiOoF@|0hv3op`si*n)&TJ=CKOpLc8xSvT4HoTwwO3C ziJ5?J2K26Y6d^eHup()NDC8i0F$wBpSdm@~-F%GuBOA%;3!)zlAK+V*-WmT31mwp- zEp@Ri1FJC~N&ks{lX(cf?IjoSq=idtIscESXd{ylls^$z+J1Nshh18R%L9fKP0KW#x_~jsvb$jRG z)C$FL0%pc>JF9$1l3mOv68tpt7R>9=mz#Mkf$G}_zoN*0hSCb--vj%Ts!xso3+A=4 zkyZ^p^?dy|9V<%N22sd+s$4~XPxXy(mKG%>h_onl((+TBw9_PBuE}aCe?=G0F5FX_ zgZM5}-AD>_b*#Iqe19rJmBrSxE zr`^^NV3orqJ5`Em-Y&p1)8|5pU4Z$ zMNpLCplsD5Zt2Q?Bhatd6d^EX|EHZxQA|lycBkNC#K?}{82t9qr_smbzZ3f?-O=LM z6qo1!S16O%4u6#S2=Y#Y29at(itE~)c^?WqBRfOoT^W1fyNG!N#g4%DJNguSrjX3j z;#l<$=(iKM2l7blLsXeZKL2wH<#C)^5;TGUf5B1kK1S`&_A$sY7B`J$SMz_lNLm*a`+BLChZk|zhj$#k1H>ek_2!O z_yXhlrj4Z;g%qOqz;P1B6&Y_JU>hor!uACmO!vb#l)f6jAlMrFbOgSkaRm3VFGq5z zuNlQii=>y4Z%!YNgESk#q?N$9I+jzB=g}1`N4A3iUN9^DXY^I+e~@rDg{5p4kqy8` z+BuRH;G9Gula`(w(~!le{;d!Df0Mv(NHiHm1;#_Q!fqI~)!;vBAw{&<4Xn`9p0jH; zNFr?sMU6Fw#{YTH-N&bj>c=qePcg^o?a5O@uKy2I)fj`q^pY6ZQM}NE^9U%duNEca z+}KEKti`pX(1oVR_`f~HUDOrM(Otc*KFx_6OF_xH5aaw^WAdDyANO}S)FA0Af`8H? zBx-wPo!Fg6u#y%f@+=gVp5SS*ZKkWdPOPTr@?!TFOoQJyT0mA-o~+{;o*zybieVvy zy>vyt;S^0FaTr%-CC`zM#%2WEMxtM^J;GetY*u>$o5ea`1czf6tFdZgKN)>??B-!_ zM?XP#^AFGcXD5-gc;ynDtC8d|bJ?N~IM-9%HyYS*;J@4yx*y$cdR}xPTF6_NgG5bq zSH%7>acZ(V*PziP_!73K7siz^&V^Fid4fG5SR3ZMsJ=U^koFCZ1+o1>iy4aV3JvxS zKBDNl^b1;q>BY;hC$1;4DqQUde41bja5}3-T}e1j56&ZssDh0hnY5K8j3>w@^w%{> z0c@tyGqcjU#0q45jedv)wPoI$J{H@Vn!G)_SmG>{`~LyKhiRZ#HAsttw5J&U3Z1%z zIdRI!xE++XgCZtin+878f<^uliBmDprg41LUUZ(8hS(AEWB47_NE9vDL9T=TRtK?4q=b#92v#NpKE!Cy@N2~{Kn|SM1|O6qoV8) zfsv^a?1KYiLlfVg_nP7D3JP@ug*k%#>~S#;d&y`A`w|ft6zYtmn3Dd!jaYV2V0d_f ztbC{}No%zSMGYQIIZ<)3G0tFzJ)m(Tdx#@2HjWT}zH!E8$#omx95_&dl04ifF(@jM zt)?PluPcd7q+^(AfTwZ64X0>)>@g7}cSQTiSTnl|=k>|eB{0@E$k=(=;s3My16W_Q zBiltW58|U@HJ0eY?Q1ewqy*4 zGbAcHB2bQsF|!-Dk0Zw4w|%68s~Trqy-?1pf0K@FxFup8kuh?vhK8EqI2*DxcEhA) zyJr70@wc>0EPTc5xGilk_fcSEki*}7<0r2H-jM?nE8p;HYby{rFgDcRE(;5H$k;e$ zvQ^zDUV1gNWz`JM7<-H(oLr9J#A5$=t?|xeUTTlf zKQZaO*RIqhyW4|gIUKEEOMCM=_4s%2Kbmm%P0z z6tT993<^zrUCevEZ`yxjCeAJI?UgYxvaa`tTt!pn>J;V}YVTn&ks{9@oxLk%_5?Q7 zQIYP!UA%L+b9C{pm;b*idk=dc&o-WPk&eX1UA)6Cr>Ru2R;5a1D^yP0SHkC1Y*ro_ z_T-%>RyytN!{bh@VMNJK#5;9Ermp`;^b--ub~N zZ=qmExHF7f&KVi(h_pAiw~h*qvqx!+xX8qf?|tgo+{c_g*%wT=rnSn|S}?|%J@L~Q zpQpb0TMi!>7#(O2b|kMPggwF$&r{5p@<{*9*Xm`<)+Hz|(k=&Xpd)FclL{k)-ODmr zTe~8i+{oe1Xp;N;Hqi*dfuV#;I(%Yf(%~?Ti-FWOAn?S>@W2G}h1ms+lXpeh84Koe&t$YCS3KzAREj|0YTxm1BTouw1O@#K)Pe*?rt?M%&W4 zoY659S+cckfjuBFI%#8|aWuj?1|{ubapB05cd;UB>?}uv2(qbu#zQ@6-*D~|Jrd4H zdvNlu6D!#vDh)Ft4hRgx6%WsrBshW`Vg9~Nxk5>Y6OwXs-Qtoq^8ENeS1jJ)KHuC{ z%w=3Y^MZ+=J=B@Baey=0eqyB~K{7-bS2c(W%#6n`*Oy_^K5pMIrvwfUv~!@H!@1%V zpI{t}|5PMm&Q5$_gq@AWG1kdic|ZmxRA&QXc}lW(oW}47$8gy!ebmQ#9`z9*wMG1%}Bv^|zc@;fx4&vbeCsCONDby-PH5h7aVi z&fUwUs>JglCV@@k42E%$xpc`~I=ipCe-~?xB3yJko9(a@O|Bk?zLArgU?3Z5UU7G! zQr6rhxqW&bf|N%EG@A^E^BhCEX~WP4)mq1G?y-HW?g zGq}r6v=&TkI>GuPOJe4Q*3Ws;Hcej1yW3bxclTIgFkMTJ%SDX-!+j}MB2CwtInpW^? zV;m0DMV-(B>66zJlj2}3g40kBJnTH`Jcb!)KaK_PDHg=E@j|@(SQiW9NX&yC#8@~JW8*^SO4I{>bjNq1 za^tY8|AxBnEz}e~M_vCn>b_wq?0DQ1A%5^iscFy&nNc~A7lTRSPORyUH$&a9BdP;^ zFg^~!rws8@VI|awtuZ_H!WuXiHFtMW z*<2@;&G9MRPd!oU5U&EB$BSfVvNYDAXK5`N1LW-w~N{&)(>D13{Z zaXTuD(`O9v3SkXYs79b7aSU}~l1#QN^Pr}p0&2=?q9W81^AU;bIEZ?jES6hiQBxf) zBB<{rw1SrgHMdz&JuHNYu{}Sb)+cjyz;2!*Us6+*~{6_IoRnt z$4Q>=O?C}4o%2x3WU;HSaISOy=-lqy<2>a2)p^Ew(Rtl@*ZBy2_56ivcF-MG%AO3<+SUfusHQrI2q^S7|fK5^7X!aUd;)8P`--o6`W;yYA_zA9iNpNp!0kGk&`*M7*= z&!M(_{|<$c6dqtE%uvwQeFap=24WcQK#gz@>V~ILk+|vVZ(Kd3P>A=I_T;FSRqVp{ z(uu(O)N^Aw9D!AMzPFcxLL04!Jt#5i0VzTi(0>}P`T0t6~SAmj=n){ zNPnU3;}x~*5?~0`boc=?U<$qeQx*&Hve1y<*%-sA4?!i*LR2msLhT2qF*-g*ZA>pw zbNUH&UPy7P$3-pU#HdiGMjcO&>R=8GuK$7*)brw~NR&a{xCUwto1h}m88z}ju0Glw zpN;C!_o(aEp&qo|dC;|=a$ZF}?;-jPC_JU08iXPbv;yvTBADB!_|kPmg59e z4y;F=e*iVoGpG?>aNck}#MZR`fqGu;lB|FAxKT+9SzFYB&Zr0WLfvS%tAFL{b6tHY zDk*1ytl(ys1%Y=AqsHa6G*HKgij-fhs5`(J*m5gst0}Cl@^+Y}eHH4$)EWfLlLM2a4 zoPrHeBe{d>@E@216PB}=P)Q7@-rUuPIv1iIybBe{H!Dr#2ILOu!=nW;!*eQyZ` zJ!m^B^atDtzu5`iLrhQmXN*# zB~eq*5VfjWVnd$qb)%qc+=DvtSL}@UP@%3~&FaswD)old?FWd3*o*ozRAidfuqpAe zAN7~0j&!JL5A2JP)P2-I_haz=f0M!i8t&r`Tv02;>w&FnTXrAEX4L!F;Q=A+fT%ew zTQ9^rg`M#o7Orpa^&AcOTIReBc!KuSjcnQdj;(3W+1TDW6PvL96}rPstcNF1A-aO< z`CU{_yh3GdXq44cqW1h;sMS*rwFTEjM~ zr9{Jm1?#LD_vAl?%5~q52DzrLo)F4j1k$g?bk>L4~{{>il`A z`>aJhU>~YuCs6~riCQ&JFdY9yzc_{T9W3dhP!|kFT`&ptpt-L7d(;EAqLS=5YU_RE z40N;~X49dz*t)21%gI;>kD|{1h???boml^x+X9^|R7Ft_ERPCtUDSTi%(b^ijjXq; z4|ny+sBE8)8sQJ9ujE6hWq8-sV|2E91nPLr&c5BS8x0!qKs#iv)5$;)UrwL>KUEco%v8XQPkDTIjcBpI~zG$INLkBVK9e+vi^os z&;uvA6XrMW$71K3zy+Ee1YVYH*An~Yy>8zJ{mOzbDT?1%XJlM06(IVb1Q0D{)5^# zk_s12qmrpFQ3 z3>RZ1{0sAA>0!1L_Ch^xHR@$`*r%WoJi*KuYq-7d^Pt}MjZu-9;#`PYw`*Pf2x_DG z4b|}%sO9wubzaU9W@Xg!ZHvmOA*g}*BPl49Q&A&0g9_Cj*bo0ko!E;=>1CvdDKaxq z=Pg4;ZXGK0+fli(3zaK}Q4hY1n(Eg$7qg5EzJz>l7X^jr25L`^H_Aqk3zd}3u>np& zCDUyjgMXqPIApYSWCZGg6Y&dNgoQEA7)#DbtV_KH&c_8fUGM)wW9@Br2sP3>s1dzD zW$oXn5yc+9<{&ZpJ?axL)~{h z`YPO@pyd~Ll4W&LRF6wx0<7e0gv#EIs3aPRO0us|BmEW?v2~~c?MJQitEeQtg~236 zMflSs*1rzKm~1bN2zC4-YGn6O9r%FC{=ihbaXeH+lB15Nb!NqC z)bpeEg~6`<0tTqx^j+Z&l3U(=RF5B`I`RfJlD|<8h&Ih07zZ^qNwE-SL4~?0>ikxy zW!DXLzcHv!wi&2pz5%uG_$MjoLC;YqzD14Hn{IQP47F3`$K2Q$m7Jro2rfW9=qxIN zPf?NcX4riaqqf>?sQVYkCRiECCEr^_K|S7q8qr}?Xn(_8cpJ4|ArteX6cn34$ zJ3NHRXIYM1LoLI5s0Y5sK^XYj?mHB9{a2Vw>wf_SZ7iEmq4~wte@Bh{UsQxL&9;u_ zK#iyfDx_6V8&L;TQguPyZy;)5Q&GwH4JwzuLq%*82EYH0yAv*|fdjXkPf#I!hl)(> zITrfVsCq%v@~hzLtxz57g&O$?*FM>`FGNLjJ*tCO(AN!KQc%xg&$XVVbQZ*XwAXSD z!^+gxV@G_0)iG+GExT_~4>*rG@iQuNIp$l3^P?UdiIp&FKI>m0Ttq_{{)`IQUQ`kt z$GR+w8>kC&F9`9PV?|W?1l>i8EJfeTR`I)IAQv4yOEh4Ly5 z@(F7F{*9W7&_&iB9~G(es7RGS-Jq(gH$`>4Gb#uAqOKo>I&TW<`o*a0cc2D%)OUp| zs0*H==KMY8$2f~^B&AWytqW>-E_QBq{^GoWy8bol!7-Lt&ZI;=I6o>`%c2JASD>Jg z*Fr6)miQ4z;AtGZ)UvnQG8PxZa+h$k?d`hS=M!&lh( zHBeJD3R7$S&j=QHYoSJT6qQWZP;a}xF%KqNX;V@Wb-cgxYt)o%Mn&)!)B~TOUS3I7 z*#L^7jyFQJ4^*A!d*4vd+in-?E%!GT!jRSOHRYd zyf_QB(Hy{Xc-@(1t?i^O(AR-^6tr$Hqt<)qI{U+dLfC-1k7_@U8hK#7Jt!kaQLli? z{spLwXC-RK`w4a3ZmfgPQBziGgIgsVSpQ1CQ8ehnnWz(&pjN{R495?ssY$ibk}nS` zn=7HRy#Z=YySn3FqNZdTYF}B7y8mj_bz4zMduSu;Une}LK@WWG{0D=}=Lc&~i5gL6 z)D3c@I$jc$%{5T#xsj`PMs=(=>i%D$Ixrb4;(XMPbT@no;S^GBvJIjnD*GF|`Vh=Y zeGX>8-Kf{^4OEW2bM4uGwDYQAPTK#6!6`w#4Oe0x{MprWZMKN{Whp3BwNX86kGk-G zSPF-tvUNLZk?dZq9zFhz>_3^LMC7zQ;IP|H-!6jWePi zlpPg;{8$@H;}D#Licqv|_Q1r>6sYslqJDtMj_ODi48i)SNHj#f1G=Ej8;zNHzPF5m zlIbw2XTRwHzC%4Q<#wC%2vlgxpdL^Qm6TDa>)WCt)EhNbU!wMnaj1=K8|r@N-SOM# zt0ylg=mv3i*bUP-v!Fto2YX;ajKn3V8{I}l>^UkY-l38+_Rp3ZnNS@rfsF}8H7rJb z$xfTXOFLQr!I18<<&zjwazYktj%85mbUs$W1NZ=A?zTC7ff_*KJ(l(PQQs3S@FEUE z9j~+3Hn^Txp89;8h}ZVA{xvrp_nCuG9|}`2FK%}AyQmw**l#0^z}(bJp{A;Kk?H3gkLvM4)LgG|^?j%* zJB1qI@2J)A9(8@lVY@CFDj74Qa-b11#lAO%f-Zc7y5LV#Ph%gk{U8E0;*zKc)I^Q2 z1BT-i*S-O@&W~UPeCq0Xj@rj&1Jrf%P*b-bGi&|7pr8jP`o-ohH)PNYW7^d|y&rl{*%qdMFJb>D&Lt1yv*Zny~b!LSvT#b;2- za{+b3r>Gl!K;0YuP1j6!WV z6HuX?>O6|t)BkhEI%yqCf_h+1R0oP;Oe}+1##OKe_C)2xb}We>k^RUka>}=_)?%m3 zlBf=pK|Qbn>V~yYp=^vlU<+)4aZVFC?$iYvQ6G6G#M_4#u>{UJYd1w@2*@y-+*ea8wd6K&_Iks1K4;s42UR ziqvz|`5#cv@snM!qzOlzm=C98Y1GJ1qHcH*l?yLW9SQr*{-Gj1Dq{1nA}+$(cn8a2 z-i!7#;up>xs3{3t3jR9I_i9tn&bJuV!?UPR-@t)*50yO4F5B_(sE&M%O3JmUk?uf! z;T%VuU;2tAad*^xzd#Le2xi3b7)$Ga4F!exCwIbO)X2}FZhQ^(py#O7@(~s4cvtPl z*-;TGjM_KKqONO*T8^Di9q#YylQAdt1(;gv{|E(z-TzyH-q-3*bSec za-!i4%iiXwW!e&z3vHdfog-0mJpAsH=qogTP>>%{8&C9`Hqz9n$mBug zKv~rO&;*s;y;1M~wW#H^88z}PsE8d!<;HLB_*D#0zmAI7t(&ZWh5E5;c#Z1FCufXX zmZeEB1MTTi5h#l~uQF<6^-nBa=0)8o67}FJsJCK$%#U4A*Uv{iXbl#?ji~3{!J_!mr=T3j zddFTeD^b~b9yNFGP@zwB*B+Dui%~C(>R3-Ki#}$-z0UinWQ=*wB9IO$W+G& z^t({d2&Q7N$EYb;gPNnwm>qYc=JX+IuHT|U`yO@PznBeU+_wnkLrqap)SOp9C2M6= zq^l$M^Sz!F)bk;zuhgZeDcFTtHV2(oQ5|^Yj(^6U)T2GH<cyx5e241TI#kHF zVlF(4!TVrV#r`t|g*f7&?agIyF!e4t1n=S?Z25bLcLXn@BDV06jc6q*)N4_>u@4oQ zb66FxqISlNk3+ov*a_8vYZzT~|5ycl=??sf3SHO}dr(4W8q|%mqNXaZvm7cH>Nz{0 z*7rc?7%WYF2I@z;Q+OC-Jtg-hQ8-OO%ca>fdtf)zT=hqVa1iRjqn(pbBc6rI`c%w6)C<60Pp;>~8zO0~(7Qv){*y^c)%8Ai`__pKCq@foLD^NE`^3o!a64jy1 zsH7@@3T;W$4XUDYp$Tf|Y=_-(0BQhtoX=5_{D3+?@XGER&!?bQD{Tl+<;{8=^YY9u=7$*aU}RHoSmJzE7wI-KrQQ^QB!jcb)Scr3twSOt^c&|?S>Ip zfCGh5TV!Wcc8^8fXaQ;`+l;kwD{6xZ{nL^vHEL&TfH`mgY71YA>hNyVRGdIf*#pe4 z_5Yqi1xil?XfTpMdi{a)b)o@5xR*b z@dakU?0>WV_424jL7^Fs3e_ys4OgOWv=24+=dmVUMlILOA1#S;VtwlMFu3)iu3v{r z#>1#p^Bnb@zfn^Z_KEecq)GV6B2Wx-Qy+pkN&i(Cj_3ceZ^XC%+DNi~wvDDJYQ)Vk zCr(GLnw_YQ>_&C;h&z4~)seq29K-%&{cA2F{<9txMa@+O)ClUMeq!m4+Co>O&VPvc z@lULR*~pBH_ysCwW}pVP5*5)?uKg~yrv8^}Z{mm83Efel9)X(EnW(v1?&`NttK$`F zYyE&q(iDL}FbRvGMp_HC(KK}RR;WmHboO!%MCFq2yTWYLPPYb?G~1o$P+9)W83+vo z|Cl5d>O*7-Dx`-|*PlbJlG~`r+{5aaBPi|^8rlLBw02SfYsCUjTETQ#(iGpsB zFos>27F92dn(Ii^&R8GyfKjL{UVysc3e=qMK!y6WYrpK;pQ7&L#kBh;LUk+$Ce`{c zNm)7HY0j#nMPvj<^6@p*r{hl@p<{?f$V*Q<)sK zpX9;d@BeC0P%?CN4#(g=fXeEXs0STGU3eac;!9Lg_K0I6>W8||NGy(XP;-A8b79K3 zf#4Qh303bFH{b_1jyW{wz5WP;TWUOeaB9>8N~4mp5-L)yQ6uY)xv>vw#7j_H_!?9M zuVXEIhRUhp@$I@6sQb2$?+1b%=uU%@X}3G!fIHzBDtXSL=Jpnb;3L#N@dVY852*A0 zbM5gG1cGn9w5X1Rqn34k*IohD;VQmssE-P9V|SnpDoeYgl4qPdJ{R@cU52{xN_Tu4 zDl)&IZhQfioVQ&2YYeCUFDm)cC$xzBxhUwhSrxUh^hDiYGU`EdU44;rm2)#{%J!fh zd==H9ho}dK|u=}X{#7t%p&5e5dRmDYG|6M3(?!%JXT*g9; zJR$0>mK=4wD{2mVVQ}k2bzn9s$$mn;E7+5R5h#m_P)$@Mx}cJKII2UlG5GWU4hq`K zFJMo6ji32uYMnCR?V;W(ZNM9bY0}w^=c96E1*)SzU_RW68u>$1q+Vk=Oq1Rs(*pIK zF%#F|Z|G}%kH}zK@G|E^)cVaCZd1|$6@g`_saS#Pz+Th?kD=!LH!RKaxa*Fm&t&^Z zcI?ja(x_Fm3f1vVnOOe{={6d)qa8zKZD?jYF*zz^8Bj@66qRJKKkqQ6n9U8p&7A z>DZ9^d{ktfqt5#i6`{}w>revJMwA7$rC0SSXbO6xIxq{>(-o*2Y)6goFzSIPQ8&DZ z%Hq4Ik%wfpjwVJ$EF5eyZ$Gc)MiG2zR(QMbS5tTfLP@#H(ia z4y18rLv^qasw1UP*VS^ib?yC8Q#cMag)@)=`ra}MS{@s)79PU#m@vCVpaH6{vWD?adPN>tp5xYYS2&sb>T2%^?4&uSvneZ z;|ZvcPDh3KJJb~Yj2h8V)ZAY}J@^i0#pkHilq9F!w-#zO)x+T5|1_qc2((3AI1qKC z(atHT(9T7Td=+X=H={bXA3NYLs2s_aD-isVtuU&CJ)DEEAoX#m0q;OxArH-MBdCYE zL0i<$)eUunai|B)a`kUeky(lA(0a^|+fnB|cI_`w*MCGsC`KML1uFZqR?6GjT)jpE<2)fU>Iu3zQ#Vd6!le{D8Jh`POzs199q?T@e$^-rklA`9Egq&BMF8M9(P z%!>=KAO4E9uuKu#VJBf+p6_j;pa&m7_52)aj;^8R>;-CW-=fY76g3m0I+_Xf;G(EV zR76FrjjUtbeW7Ry35uInIk%m3p$$f#5F| zT48PK6EG4lp?1g=Wo+Xrgxb;mhsurls8w?lOQ2WQe&Q*K<$1|;#?Caa_R9r=zZ^~w zY01$L>v3Qi*1*?T1xuH=`WOtSej2OcORS8=E7%v*2-JXnM!j@iqn2ULineTPp;l2B z%!mFc3Yvl+QK8=DJmI{K3F+}OT!{ZvvQW;iV#&H3wQSd;rtC-5efFYq;xuXsUZ9rU zJIsU8ss^9ydxa=yZpxtMxEh9IOU#MGQK4LoY4HT=9q<@6f(q5_cwfvxeGZPmeYg$F zRyW_HmgD*wmbBL~QtLluO?xdi!`z%O1vQsHqi%Q)Yhv75mi<)YOL7xBVcVGnq3T`r0TWTtgmb5oZ}^WoK|xL6)7>mnsBxY}9C#*q*cB6AQYHL1@y75it z1Jp>Lx#J&E1B%z!+B2c9D}ZXRgc?{gpMqX8ot(qn33Hrlu`I{;p?dxq2VkrwR`*dK zFq2SozYNvkO{lrwi^`p2sL-EAt+MN=Nck__2_H})`RopaMp@6}I@6$TkP|avG1PKw zhMMbvm>VacmhD#5dcT9(a$lp)i`~>ZlopAY?`5)rR{%AVNK}ZL;A-rFELAUQGu!Ff zv9~|AiFv7Q2obVair!1Zv|c zi0#?=8e=Z%J6hYm@BlT^_-z8gzXd6Q`>4;smDsqg{pRBzJVJsp}QjbK9bPXz`+nv8+6!q(_UZ|^`R~eP8 z4PCvtt9QlV&;S3Uppnl+g=z`v?Y0dS;`8qKbyP?nqeA!&b^br71WMXiFXs5wm8-P+Tmk}Df35|OBm zG(bhDy{q>|-G3x%OP_*TP20M&{*`nGXwZgo8MRLTK;0muhkZULK=n8gDml|&A+&q9&}4J<+^CV~Lyf37DwNewA+L)% zzl%HG6V<_CsDXTi>d0cefGco5Nj$ihC41uk>Fvk*t4pCgg&Ft{p2z?2OmF+LIn&2Z zjMFy|{BxXIs1Y1Ot&Yc74&(GQYhq98lTmNE4>$u0^bdHq@E~r+ZwCatG5XtwMgs%E zKb^YrrG+TZAp23OCN2z+{m8=bnhj-@;NIbZ;6KOr8W{-wGyU&4gd4UUWy|wA>fI4z zw0+~1N9B%>(TKoaY(xFOQydYpgigI&>L>|NfVJik(;$>vF@9pwypN{pml^c(Bom)M&6Hq?fd zY=P|u1yEaa4b%V!pze1R`(g$Xt2fSC$okJtA#_o|dxp8OCZ=3$J?)4^sqe&v_!@gL zlBrAV2A`G&yzgo6xh&vK!bIO%5-!4QoOcXU;;Zl6Yy0~^@b3qG)OSZde}(;SwmR0Q zL3J&gbC?Tbue2SjD5|4vF)vPZ?K`jw^?NuSYpk->an0Fqb->#|`$;T@L)HYmleig` zYrenMlHm;Mgups`$&_?1M};!(dh1Xz%t*Zh>h}QSum>)~|LMF90k0hn!%KJzSK(IH z?gVW0L%_R(zheZ?_kP(F@P^ay0;90UkCtSIP)XThvu!jZQ5{^4NeSt7)G~eblO&Y zwDs@0sTk{Jt>6Y z2Gly;j76v)*>4a0gu1Z$0ej#e45z*uwWHlct&TniZ3^NYvaPoWYT5O}MtBkx!HkF5 zF|qSu)_+?HKhq#nA2ElbR>KX{Nb(*H5J&#J2A@)I|BJn*Yag>4wMFI5PpD*#^Q%Ro zC?=v_AGJevz$Q2w^%{Tnt8a7S9XGRKIUZC8E90~iL;`<1X-OCRw5{U|X9C_{ZZHRH zV576&YK;v1NE;_bNUx5%Oft>@vhE! zsF%=DEQck3v(OGfjc^|-h&aMfIg+Hk5~W4|CmmvJZc$QuD~H-5rHxZ|cpY}hT^z}}#iWt!W;j`H`v6gJcF zJ^sLrqVDj1#u)bk-WJ-s+_w*tv=8jOR1fV#whW*eL6LNVjrI!QTst3)VJZ6mZ+VPO zeG{hx%Hch`Qli z)cLEiEB=fLFw=9}NeiNKDhjm`jYD6{U_Avz-~dM82~<+PMujT;g&mJTJs=-y1Bpb1 zxH^`{DAZ3<-=Nm{CDeV>{9zG^a27y)BbNDt^?!uIS{l^T-Y@MXG7@#+E7ZH;BkFZI z=#`Ch7IvflJu1}kUt32~qjtdTm=-IdrmQW7<7mu}%TWXQ?KSJa8HI;5Xrn3j#-^Yz zD%8WVJAQ+cFzl_p?WUt{{0TKR>E79|a7v@=JP&<78IVj z16AMKoHjuvVFy%Xx}h!{jEc+z)W~O{reF!`!Rt|Td;+(J@TXR&tpD*ZmLZ$yGpt9w z-ACJ+{mm4r(-7yAJ)kj$QtybG)KDC?sFM6 zuzSc9`QBp+S!js%kIh+5RK2RJ_e5p)MAQQpq9U;Zlj9alf+tXsx{XTem#7DZ{c9ae zfI2@7M#q8}{P({S6g1MBm>CsL)e1_M@?DWK&a>Igp?GN%{fpbsEG=3JIsN-u`4dXGZ-2g z8eHEOunF~)Vb-Dlp*lDi^Wjib)~`c#>?c%m{*1v0g@xLG|MNc@G@>}s?1E&d3(}!} zV#$n}<0y>69;glG5b8lOqg#iIqaIilwJPeOBGU>r(DtaQ?T3oMi0FQ3FiR)7hIv?? z1Itkx$V1cv0x?2^%cvmg0X?xS_D7BQC)d6eH6?p6J03-?^Ov{|W5x^(ej9GV71Uq( z6b4b48!I&UqgI00p~27RN;sGHl{g*C#0d@l;BX4#@WkP9LxbyhV!Y7c^1X(2IWJ3m zi%@?YO#LLb!zu|vgP-54u^06M2`$3@Qdd}k3e7sy$hKiOe2)XMO`_1?-hK(yp(Kez z?LQ=jg{hZG5*p0*zNn;LfwM6pX=w1nW2ZA-ve4j8+7@SN{Xe5{m=i}N5B0*aVhT&T zj?QV$9hi;d_iz}-P8k~fDR?}7MLlUMi{wJoGEJH~)Ek9uF%s`#7R;O`H24EcHEf`+ zZlR!_#z-3){FYmU8K^(PGHOp38vFyL%BU^&J5+8QKxOkSEQfK^hX(({L$z=z^}`rlt}dwT{2yvchN3p2uTWY14Qe&4b?tjGxbdKt z?IYBx`4hE#b7r(8ZG^gi6I7D6#^8VdvkL_+w_eVEs1pZc0vzR>iR7O5tvkLPb)$8t z>$f;}I`^aQa}>4Zo<_Y}E~0kEs~K7URVl>HWDjbDdO%0i$UCD(+{Yasje4ofLOpmX zYJ{s%`^R}yzNac4VJhbLwB?SdIJRHk7O>c;m_J%8rvZ&4ll2lb%O zs4X>S7VBUfR6Q+f!^wckp)9Vw5^5k-Q3Gg-n$k`_1wC*OY8j0}J$RdI-;28OFQ^_L zclEOvmmXa}?R0k{Y=im(8&c1nm93iN!%&f|l|9tcODGC^;84tm{v!$+S&AH?!Cw@l z!bjA9!C&!*oT0)0@ZjKF%pE5t$ZaD@lE<#g;>?OlzUzN}ST12{Oqe$`_#2VhsHFJ{b^K?Hz_*weQ{@W{{sTlc%t(CzcE)+AW%}8* z=guGM-J@Oyw`%2EQSv zVk7F0unm?j5*qw%*CNz%eS@hmdQp4(g=1Z<|Kb!hw-cPxoU>8i0Sho4o^^p3i`x4hC1;YDocMyy{F%zHkddi z?8X^U`$A4vFNsRRim2=AqpoX>>fk`ssu_=Z&P-QdUV`2s*@w(ktUZ!)utjd}#1DDeqAo%T>W5 zR}QuQ>-rQbP-u_p@d_M=r?5RXtY{tChRW*SP@(@5vt#s1w$bE6y#?!HRlI~%Fn#6F zV5B;slJh8P0BNdNME$}P)bl#1kHcoT3VUPC5WelI+S{>XHGA*>jXHl~b({0qsGRu@ zqvJ-@KCsn!7?l$jP#wR6Yw;CwzV9upVI%ks6_SIf6E9*U9e9YkVb)r5X=F+c7^Z9LCVQyHVSO<4qLprtUg)_(&E8o@x+G92xk;GE{1?Ofno=3MDq z@7#$JTJI0UuheMD`wUFzBc7NA193}@jvoPizd*)n>Mm8eJ74-Nj4?Ko7n=WP%g z{86j|>cLT{NcTle-G~OPf6e6-8ph)i49;~!JFy5Br@cHXtA}7GJc#;)%HGI6*E^#& znANCnyv?Y6pwIugIJ-9JZT*1tMXga)nWs;H5-LY+7Rb%S-70r#S^{1)oE zho~g`3pL^-O{|^`^{rPCwQ&ta4P*{#!#a&c@wHE3J%#L1c7uzkY<=R4(bPs1f%^EY zf$B&%48@748%;%hlpaQHRCiGkOV-T&1cZugdsJllIQ`M?gs)K}nvXGAc56`&{HeKx z>O4-PehW)tuNF4#-TK~f+C`4&nS+W&H zb)+X)o-UQU||0khBzqGaOgu5^s^#`a3#cgBt+^GGek*jw^<;oNc{{R1& zOF`>?BkI9hFa{oVo_1bB-RKr7lz*VE`xo_+3T7;JKh>KRsX}} zK7}b1)T8C@gbk=IcCTyy)zvRJZ#kb}UCw)l%7septmD;C%d8$M)Gbj{)Cm>oez+Q^ zqOVXDZErnpg6c>&)D8MMeN@s+#&);}wF*9?vOZb|>u@SmdlpoLa-lj<67>$K=<4-Q z_ixsL^{*2<(IESyZZHOwWRp-KKjOTIwWvSDtXQz4E!SqK^QNGZb`ff%yHNMNh|$TJ z2dKB;vrd+rk)8d};2(*#>ukxDvWtZ>H7XasqVC1HKkgSw$2G8i?-lTcH(%pG5c z8u>1qg@;k+M|HK0t1ITBzS5_luiW!k3KMj*uiKia2#iC$t@firb{UmC_c0H8-7Wd@ zBHt}uA=HSAqLR2W>ipWMr0k9haX5Z~eyScerxS1l4Np-gbn9uqK#11MKC6Ayjn_MO zIgg`8eihZx2dIvILVak&_`<%B!kslxQ`{dJpzjT(5JAH>)B|o{LwtscNV)&n@u8^t zx2UYYiPwqUJbx zU+ZaBR8r+}^;(#edP5wET~VQZf~oNzT!kt6g$DoSWFL;9KEJ<(JnaDcMa5(sr}ZB; z(B^y+PNaSq)sZ@1T5^4ddf*OhjHgi9pLviaSqL0js%5jOX~YgJGmJu)=-{|}_ZXuIGIPNqHk7)!n_V{He# zhuUBsqq6=_)KvcG+T)M2fuu!+z94EqRmQRY6}lEQC|kckExUoJiaMark-w*DT;bg9A2HKk`! z_ql8O-oNfZsu`idfA7nQy3uXyj89M-Oud;lvKFWZj7Pn^rlKCS0hK$uQP-b#?N?CO zKSB-cjjNZMr4F(Fs!-5Q6@^-My-^Q1jJol0R5D#f?QC~ZH++G5t9?KvW3;a=C(>YM z>J?Fu>Eha_I=7;B%A1&5>;D}EB~ixN_N`YDmE~Pgb3X|6pjoKUEyZx$h5D$xfqG!F zIdr9h z^`o@X7-g<5W3!93Q#Lcf6qeIy=rCq6)}>yM}hrI>H^ z(x`ef495|u8!ttTY%BK0gQ#pT^o{M59k3L*b< z)!(Q&jJMEwUI>d(uZ-nzxNF~oy6y~i$A3`!NtZ?TYx>c+g!%>4^6b0VeuuQgr=ZZj z#;-7ZiG8=P!cNp*;xcT!)ZSiy;za5tm)RU1M&-&atP{dUhU#FM?`+E+fZD*;p(1?? z8{uEr7X4bwt>+t1A-slKc8^d$V%7QHE}Vi@sjt8S_yV;{f4P#dFDZ;VYDQKj%up~|j9^j)BmBkmF_fR?U8lz#fRhI2>unzUisGY7aYJ>w(9rdvSPQgKV z2DL#|TTREc{u`)(tx#Fn)zy7hpM;w8Z*er{T4O)+ZFD|FO-b6d_AeiG@LTE&kd*LB zud|MoMePd}P*YV0gMa_u*d1tv8bLRV!d|F#dc=7J!>K>RFpRt2-W`cBxZyZkqLyV> zRML%b&chtkH(@utwx0E`7wSR3qNe5|>iP%nc*2c# zJU!}VlM@x$QmCn`f*G(mY9AT0k@cUI!crPC<5ASx?kVbRSosI{c0?`H-!MCdZnB*) zH)`jsgPMXqs9ai(#qlmGf~kMBj^shri=zfq)2E;wHFFJvQ5_nOioiw;$3v(GJwPQ_ zjLkN}gs9}oh#Ejg*FFK2E8n2DorU@zs{GJpP(tfC{_E8}lhk8lOz>K&S z_4$1gCt=Jj_EPy86`9Sbf!sw+Nyt`f&x38Lw?qwW4{9fTfUE-F8?((uG!@mex!4ca zV*?D|ZpqdUH8q293|_#Y7`4M5bOH6w2>fgv%YaI@vZzpZ#ZfGWfv8Wn4?8tr)?fH8 zo0F`l5SPHx*b=q1euE0t8dTD4a_&P#>@;fG{)U>eXQ+XAyY1bQ9JM7^MMcoZBDf37 z@ON)P=85bDVvzy`FnuLFy}oMAsrI@PPM}`L&oLBZ@3#lUN99HaR1)SyT~`Q4V5F<>!&cN!qLx|C z1NOkWs4cjOv+DuYzZ!b~ z$T-y0tw(*F9zdOU6ZPPC_%#+iWgajYyW=tHPdNkUEn@92 z*uO6fMdjM#3#@--am?RrB;~O-_3l^@cc32d43&(DE?TyiK;57UDwLg34<3Q);A~U` ze{{zWqmu3h>b%dcJ?SOZzZ!C1vbnB+%Hk;02SY#9h2v2VT7x?O0OrQa&algNegRZR zE2Bc+3k%^YERWYw%QM{-%dtq`6|a!b;$OGx{9F{2RHZP0{hR}xgPp@rx!|L2Gzrh)Le$Ho z*A4sE@cyVh{|YK{|2i|=w0e2WOM3^btoQ#c3Ijs80IzbO&TX6f?00OATVPJwhoVBe z61C%<#&Eojdf-2(InQ|4{f-9}xi**|hhiRF?~Y%?bXxz>?%9Ykqqf|_s0TJcg>*QE zCeC_Hf?%Qgqi0Z%~)bg8*I)4}HevhykCVpVQ`)PqywEkC6&<&rXk|Xg$ z>uC|x&+Q$s298Fp-&0r})BkRt>0MFDxF56Q3)FeZAKBk}bwRDBi>Lv`d~DCjhrVvy zfP!|u#i*=bhnnMkSOm|a&WrxUK1}MPR>NG>`5RF?3)GY?L=E^MYJZ5~|6yM|cX| zeg!L0e}J0v9Ixzt^-ww08a2iKa0*%`(@=A^*0~3j#b;gJdu_*)IJ2UTmvHrNsQV0a z&POe`EvWtB9_lUm1hxL(AR8R>|HkI16e{#pP$OyJ+S_0u>fNy?Egl z{oc(r>ZSArDtV`&l6o_0%RPn~*hADn-(U=_|IZXO$I<_^k)%Uim<7vVNi2zjP#yUR zHFw7_CtgL3EbK3v;}p&a)VrY&uEdJi2A`q^TH^!bk4B*b1+C9+sGg2Ty?nk$-C!^3 ze>{2`%Tw?2(e{NksN=VtFHy<$AL>ErKiN;kBd{a&P52U%{bMh?X#cYQbwR#=ZJE?T zbzmqy#`&o19rf9k)oP5QeiavDf&XkHIputaMQHyQl{1CNgxuH#b>G>jf&J*(Pk4S< zaJ_z@K^sbrkg#AfH9+M+Gt>xsx%T0xWjPkLfy_e9<@czp-h@iV+o*{Cj=E1+AS}4C zr9|aGDQ7jGf=+0R&9NKmg&Og{s3eIOEiAZ|X2o#oMNl1Ug1vDx>c(%K zF{0ap)1cZ*q9RoXwJO@W<71K4;`680VZkgugu3w`SQb;q2n(+BW~dPlMQyFyu^>K1 zou4LVSa9R1iUH~!FdRFh1~ML7;yl!HeTSODJh3!z)?XhlVqpxfPt=1t zpf2c+daI3h&PA>J6{vk-2P$_?pw`v8ZI4 zjau&qP@xNrXE!K~-Kn=lO~DCN1pmSq=*15UZd@_3G}S7o+!})#zzkGJm&WJ+|A~6E zlLm$Emh&a5173o#;Qzii4{8plU`>32Ay_1#&3Q4@Mpn`pi5g)Q)Pw7zI@TK3V`uDw zNfNRCeeN_gQCRRdlAjWX1^?SEosxtFH;`;eEz4VAFD^KVn%k1e!h%1j^g=yo7iubw zq6Tsm zpS(fMeVoi;!EenB7<~UXqM#l%N8PX`Dw+DDHlS(l_#D(0I}bI-3osOyp&s--YPoGf zbzl!FvZt{yUP0Y2UKTq)X%^PMMjq}OilWwO1=L7tpe|^M+DbdP`V{Bas7NfpBKQO9 zfe%p;d5N0Rc~MOdVBqTT_K5v+d|>d=r8TVgdFfeQ66sP+9j>fP`fwL|958W#Nb zzerq6eI#m!OrOnO$5E)|w#b(`}5J>qV&be+V_=SE$gY z%3&{|BpLiGpFl|L=CAa3=MrLblwVpmN|NY6_wkwvNU} zthb=i;Zv*YOY_Se)0(~Vk4~VY=lax4yXu>L`85ssw4AI z4_c0j$PQGJA4k1IUKeri|2##*yf0~}kLuyCs2-ogig*o!%d410APUv-rKsfFh@EsE zsw0ub?RZsGt~7D=UZ{;}n5$1M&iYr67tx?Cay^d0Bd8HnFJU)ojGFU~&c3dFq;tA! zUxHfK>ru<>D5^upP!B$X`nlkatAF-gAwfy|{triG^-!#YyRZOyr7VO6QMphFwd0M# ze7GGI(nt6|%v{s7ppx@B>NVW6tc{=# zDoIDX`W#nZi3;`4sJT9iitIh-8)u-LeZW48K_1hTy@BhcBWH(NW z%JPD!Q1-xZ9F1S&a*V=am2KHgN9D+R)YkeMm1Lit398ssg`>9ILO2wQp(61U`g%F+ zq|gqZp>9;WszsnV7NR~CwcHM%j-N%XhMO3U&#)@St!Cf-jWBlzKOJLw+*jQqb*qNu zM6#N8T|`aRzp}Xs4I0T9Osd*S$i3k?Ke@&GD$6at!6-VtTO8SMyQUp!;JVp z)RfG`#`rrbIZM~J4%eye+Xge2hHwsCLuL0T)SShyV?8d2x?u(EgB?*xb;%unh1%)( zIXn1(WT=5=T;R*!*tH^fI>m(rOB z^`Huv6&qr99D?fTa_1iGPyI3~Y5iLD?ZVZl_4+f0;jgHT=rlIK_zm1D!B*7QV;PLy zFf90&64g*IvH2KWMX2kqpgNMWk)2;26$u|nO5dA6LCb0iM&Ng-Pp@OBIemnh<9E)` z#`eBXj5TR5h&pcs>SZ+9)mJ;WViVdAqV|JSO>CgWF!=L-RSMdG+Mz-}7&SLzQ9q@w zM6LG&sPnF&rr-@~%KkxJ7c7R+zyF)LX;|?0d--t_ z2YR4xoVJ;DAUkSmDxxCO5S2uIQAxTKHS$BwJD7(0zo;on)!erDDAWMjU~l{qeTD8Z z1^FJ;^FRyxxj!w|pxzp_W39owcn&qkUQ64Ma-%*<$D$&(3e~ZLsDb>By8aF7IjLJ& zGG}YW`qvHf(x7$Q3QJ-SR5q`~X1Ev=JO^gL(yqNF>io8@-V61BKBy57L*>u} z)Ol;2+fmE<+fIMxb`Q zp{QlN12wg`P#aRbj+QfpaVGV)NXLEe4TUHgQg^bKPG3|HS71KejM_l%p>iNjXB%-g zoJGAZYQwsRnu15D0ldLp`2ViX0zS&4i`Sd5i@Q6)HMqOGySuwPEMDB*U5gf2+`Sa1 zcv~nGD8->jk^B7L_vE{|_xu>1nKQ>`UfXOo$v3D&*|meaGd-b>{TLXk=l?=FO;MbI zbz%CB?yYq&)YeXey1W7~1YU!M;Cq-A=IG>pb=w3^VmuvoAY<~*Ue9sHW4d{rkMC9N z?k2thRp=8Kk^G*wbh5zDPpiY`Recdk}OTqq(dqY+J z6zb%92lWv840Y^d^>fEnq3-dmpw5xbP<~^L)1l%o>c{o3$~K@-Mcbisz1sMy@e!2W z2OEDk#_8`SOlvF%b&gbnI(a+65I73z*1HNOgtws<@VdX>0;4E`;yYBOMFzMPmWN7Q z7wUR$3bVoCFfH5!Gs25dJNNbyc0V@ipi?h9A<=Ry>Ca z@D{3|7=zs{Om8d>by+nqwt?EI9#AV93@gL&P%p!;LdA(Y#CZ-sOxkcX!V- z#xY0QA%H4mG1S)YfX3 zDnUJ)?*dg=PpB=O26a}ifU@6c`T*3^@hr>&Z^P8kH-;@yfQ)0@hedhVpYcwZ3T7Sa zz9UivDsVsJaHxPk80SN6?FOhrxCiQ(AA`E8&OrG;fGX@6)IvV`>8OC1J~Z}>hhWkbvYe`N_5nC4Tdm&40Y#>Jl;Kb%0d-Z1!}9CK^?;JP_Ge}8IM7B!tZ%R zM_cy>hQOc+?scCAs({?aMo@RY5l~yd6lx_~q5RK6CAtZ9eZPd6VAP4OeIBSoS{8PO zZK3n?zZdDq@G(@N*pu8FPAaJDz6u-wC&0!qXtMjXYYJt*0BY;kL+#Kxs6y^RJv-jn z_>0ZQo8sDKfX>(dh19{YI+Q~jsFSFRu^-e{`e6v%2z6)t8R|Z82UdaUr@D8zUQqXm z3B~|?&-fA4v*FG(_uaDS)4BdTq3BIV3GPCzAkqx?BuWZZSP0aL@|nIW)HzWb>fEUh zb?591^TYm7H?GZ4hhjg}q59SIui#INzs=zK??GqBO!u-#Gs`_zIgBNtZX~s!wz@tH zf$d;vI1ZM8XJIuMWw!fs%mepBZRtzR2k~zCJokG#z300xTA#pL%qLsmep%fO>ehS~wuVU-y0`eDP&;%H zHiZ%Wi`=hx+CaVcvlQloH(((cW3gLl1(=R;H>m4>CRE{Dq3)ocp$M745vXr;wq0rur)BPr``^&fN%tMQ1&9>d@?i zso`0uLZ3lB#A2^-ceWhVeWe@h0w+M?_&x9GC{d1;?nzi1j$}LxE`;BW3s9kH8!--CB3Y>pJB5JB^O6^KkEH$`$|I;fXQ z*^FgP-xTWp&=w|v17J-!1L|aZ0Chk32&=;Ao81L8f;xxVK>2ltx}S{S%=NF=>B~@r zz&%hW)h*Z?{sr|kYqZ4;)B2zAR|1c$** zP!F-p{vGbi?7~n1>p*QyJE+2jLLK{YP?zUas2x~r;|);H^#IhNIbysDwV=PCF3-4Rx%tLnST@baW;ezp1+xF7x5qwa@H#vXGYR?p!m^f`~a=fY1g znXdoibhLH9L*1#~+PJ|9*RTuJ{1B*PJPqopxDuv@>!5b(EKCKjLp>wjL!BFOPr8RB z8PrKv0P5IRgnk(|preznFVvPzvhiW4E&mnj5Ztx#Yp9d)15_a2Dfjx150xMb%n6G? z9jdNS54XNhg>QyB#5+!L{p*Hs7=;4ef;xsz%-}OrVUbR|S3^pu%Q6#GfErNqO`#Uj z2P)ol<3`A#_nd%=e+p_L*I{Y+_i3*GTy#RuxOb=)#?DaJbw8-rhRa|GJY(ahFaqPa zXWj3PCxlvA5*w$4&Pfb)XUq<@lVzcvj+JfP!%s)I#(q!^BcN6^#m1}Qea72ij9@-Y zcFujdz2dz471KSal_dX#Z`-ld7RECd-1mZVU2-`Xj>GOaED0-Lc6ZD_iH;QOVR`rz z_JKLCxUYa#!#RvE!|kxcRj>28|0LJEp7kVr20Ngi{j2-({0kh!IOz>ePPS;aarbR^ zeDj|B0j1A>IQIj;XV-oAZL^XO-0S%~EJ}dbf4a~6YOoCBDX=FAFT-ApOFwdVU?;50 z_$|~qQ1LI(wOhuleqva$G8(z0b8L? zy65m`827zv{~Po-M-k~?uk%}Q+QV;*Q+#k=r6&LAZhakCl^vP~W&iM#`|7pKXZJC^ z9BN16{pWsbwJp?6oP~>E+Ar>>WDY|W-t4P;pPBQO>t7X~MG*oceRG)!=3`t5Dv%%6 zfw$lS82a7o{2`LlP&cd=TwIsoEGWBnK|ZI@y|6Ij#KG=-9k`Z-q>tcpeuwONFQ0$X zSzXEJbAF@Qe^4*MCP(yn%3>IRq3}y2pYy^ZOBA2;S1khY2kfRs^*KNLoiLiu`P#4@ z%#Z#E)H(41)`yj&`_SiM1+`&ocvkjl@3ZE2R5Le9k*2F_Zc{ZLu2*m&3oI zc5+fOx3Jw%h5Qcn3yfnV_v!ZxaQ{!?b8f*SU~UX{z$Wk!RDe<`ea>UEEBwUxCDb|d zG?mZ!aB9X7pL6T&1b;{09iD{MQ@cAFKaJ1%_}xILtK|jMjjn83ALka=-y}K}P&|UV z=ZB{AIZvwwFg@exuom16tH8+VeV!0l7itUpL0xXM;VyU^Zh_M?xC<(g(dV4Zy!FVQdzfF>f7whv=czUX>c!_usOxN&p>>JJoc zg4($US={*;S=~cW7wYmG29v;D(7%k%MLPRok8G|()=>AX?G1HOo`u?>(CqF`^n)!K zpN5lRrW~&QE_j%6^qfBDx<3y~Fz%R(oujbz@B`y_xqZ%K_@6xd{zF~gL3w@7cO;uY z-RsXo-OFR=^Es~vLZQx$60jBQ4MX5Hm;t^wCeQElq$W`rW4i)APXxw46!dwr!bydE z&TqjE6!v+3!LMWyu7BNXV;1!}Z$MUtN<0B7@LH(L>KCYo(!WsGb)I5A=WD=mP+NV? z_#Nt@lcl(O%ojuXU4gm<$135*%L{eroB8RKqH_=GIi9Md&-spKYpAQ>n2l4GauW}S zdMR}ou7OcY`<$PS-3DbpwTye8_#5g_lqu_TJ`WtBoO>t^!K~=N!6ne2rM%B`l&v`f z|3NXaqR;sq?*l6NoIe~^p|a0;o+qo~9-28&ceqbqxuYxtURM;IM8Zs49P9iXm;K`;Rv1+&BXP?z^O-B_Grw*b0}z zJun0|Xz4C+ARNJXX-lquZF#CzZh-7iXJ-lM>;%-keg@R#coAyl|3V$xOs##+Yro>K zEaO>F=fX`G3Ln9FFkTy<=Lp;cyTPt)-G|rhwtn}zjMUEEx@=I1Yd|IJXXC|CJ8%rf zgO{Mrjfb!W3~uips@71)egM=CjEBkK45)%PLmh(SPI#x1(KFF1BV-49}Sa}!j8Ud=-l&=%_4=w=)UwL_z!-e2%fr=w%K z(74tnc0d^(F#TDmK-Xae_y^Qk{1B#w-)tPx-QCH;P&?END$Wq->tEOVI}|#`A%ooj zp)eui{7_p}4Qj;=p;p$}#(t=ia0XO@O|ULJ4s{3;4{;yQ6`>OLf!gV06D$Cu4Rv4Rm4UYyw}#bV(P2C_;Y2tGRvqrXes};oGEPlg=_kUqFl21RQtOM`CelXV$&dY4iI#`u)%<*pACQu9V$C=m9~ICG0rqe zk4c`2PysSb_BkI$?E{xHjx@#Rd>DN_OvQNkRQEDm3Uz2t+xV?9`80Q-7XvFa!{{=o5Or?CDciJ6Dr_s zsAK*N>ZE-SeejFvgBQB<(V;Hegiv?HEKqTZLB%Nn{R&i*jsi7?3e*Zp-@(|+^h2O- zL?fY&?KoHi?tpq_6uihy5EtrXj1P4~N(&Rf;!ug}LS5GF7IFP+g*{QI(zQ?zhka15 zV9r2Y$6t-1i{0mTGpGO)p|*MstOeIWCHMqYK-4AfeI*Ih$}>O}k_qxK^%P&i^(jRu zQ#63ufyOX1Y-#$5P=TjF1zrkubHq)%iM>>UZ}J68IDe;KbK zYj=+EZu)t!ZvZ7a|2$7^pniA#ha|?B-y`At23uFdcPqJfCMVI)I$4mdmM}Aw{($Xu zinA$aei>sOPUl>JEt#xLi$y+uX5AAr8u=Tc;7v)-WQ@~NwGPK3EgiXpp`HU-Xl>DX zX&rH#%<4a)i_3g%ig<{AKRis+cR9DgbHuGj!I6m@i`I#Df%u)6pFqANwAy;>@>dM& zGueQkQD{6JJtqZ(lpD#6yBd4IQ_LNN8Cm{t3M*>GV(v&V zy2ZqjY^0bdw4^M;N9<|%q{L9q+Y9)0AkJp=PlGtu(opdh6u)E47n+`kv{e>p0!2x_ z5$p!s$M_iY<8gjW&~`L^WmyFK2NduIzQHCs`smmM5&I5(-hg%_GP<)C^Bw(9ehe1S z{$ZfMjT4>Vo$VmWqaoui=r_Z3*v%!0m3q62vQGF{=~f zOgO(;iyuXv75i#rzkW(IOnQmV?5d*#+3=G?+TY<7xWuN zdAr?Hp7AA|f40J>5I8#p9zdTF`xo?cQqTu%$}$d<80dBqXRqe5eMpYt`pj!v48se5 zBF`0!!z3OyK9YAN**OY}$`0gV{x(62(vL~Y&U`(_?UjTWV{!hKB1_;~l5s;4*Pz{H z{vx)~iQ}w)8%|kJRG~@g;q>MID{3kg=S6pd0Fo1o!=#XH?MM^_nJ-T~$pSk}uknjY zY`!VssiUOGdgjJJ=bp>UB@f@B^lZm)0>OU5Xf}c7z&HfEXFC#y`87DLQvliq+AiiQ zQ1DG+NETay`y}WrZU-z|@=Pduaz~ZLlj0Lue*! z1?!WM1juB%iHr^=Cp->uE+OUEjtpAQAeJ~1>lZ?-kARdALpr}9TPi0!7H57EzMeI+hJVbSpE2se?SIKF-*LiWKujNf9P6>cV$e=rlvEO<4mcpb$IvtsrT ztP#OtF|LGdK@wJ=WnDJC#aVws`BIbK2Lz0Hsq*nAVEO-bWO$h&) zeo`7=BYIY0GZULuEN7ML=9y%v_(r88D;PhsID8M#5&kZ$CpTqhz&``rN34JKeyn68 zM#;=!tZ_TKdGsgZAh|`6$I*=^P)z!7Xs4O4$UgiCM_Cagu^&iqNjYqO=jiN(UKS80 z*_p4;_>JBVX@+AQf?guX?!Rp#UP;TB`=69?( z)1H^iwRPq5fCfHdV zD_GDCX8ah(W0t%m43KOQ_WF`0Oh#F;8<_9SYX39e8}w^p-wMM>6vCHk9=>YwY$oR4 z(b)fU49*g$IIWCTnw?e5!!a2~0d)H0f#fuOKF8zPPLg8iDu!E)j{+LFW}aXcuoS!A zwBLy@`H1bIaP|eUKjnNq%w#VHB}kYC;~z*`j(!ICog`5$z;}`^WSokiRk7d6{AG44 zl(8f|edmJ(Bu_`b63GhU!=L5;pA;bOHd-&{KQmwX7yjdqQG43L*{tr6tu&9h{EXo| z+5w7a%-nPM1=}#GP4Y_YR_^Hfl7p9lMMX)K zdfNIXVykyz!b=O{+`;DvG5H;Ko-50uJKRj97?{g7|L1WrhoI8a} zdc|rl#vH%d&5;&1e~Uo7DMG@BGyW(2u*-r?K9a9vJ|^tVEFa2og!j5UnOVpR#-DUb zt-xSEZAZ8uZ3!+pL!e|7QJkQOEEyja^E4sI@9=l#W7&>;rC*R$4heSz%dwlk;a>z+ zBt|asNHSxa7TrAEQns4IAp$NWNsuLPz&Mw!`U;K}7>7{#7Td~p=Jx}^ZlYgi1zsoS z9g2#J?+w}o=JmG0b_(G$5}x_=cQap|zCQz#Ic){#Jy|X2J@orXt+=*6csg-S*cYpC@v z;G4h}Gg=GL>#x=XNJd4AapHH=d0NN-!ysBPtvT~knG2JH%r7L-Su0rjs{|W_?@YG0 zHvP)@%y3r76+rQlk#;D4Ay#E#yurqwl>dSWG>*x(1c-)HZu;ZVm1Ax;Y z3tU5vj1kDs8>61S1TH|Zzfnej<8b)bw(CbF#pVmlz}yHp!vgN0FS+c(vzYNfOY#-} zzij>|{3Rt>^+$A1DD;-%+xh2wzGxke8<;p?!FMsvMZz%Y$;y6W?mdqE2)LK=AjaS5 zC#V0I{tFgx5}qZ=F!UvfH`Nx>jCe8VcVxbW?XbTrgYFnfdf;%Iab4OLGpNqoVv4wB z+v!@eGJ^4|B0a&hHMYtJ*bWY7mx>tt9!y74p#PaTjTx7;g1QH@{(ne11VuH@(zzrK zv0(b0l7G{`gHushf-nOtm?EA+_Zjwf33c5~GNjrj8Wh{wIkc+HvB?-D>+Y_5M=*QB}&RiP$1!!{_e`4Ig z{4P?&ZsJI0(7(a_blNxyIH&xnG0w(z=44W$@3b7URbO&{0kYR#ke(2i|H?+t)ie|7{sRk zm?|aw?%MxJ8Y@(aT&(gZiaW%7WPB#$tM5feLO+iAi^TrOd=vBwDNqudKHuK)ywclE zk1$A!Lqoeu$>5V2s$YfquQ*&MctL`WXYMe`>fs|P%I;)lyu-HJ)v}8uJ&kTQeuZuB zE{i#gUvAn_=AG;BPXg+L3Sp9;Wcn5lAFB0Svz4|dh$K1V2DT$7N&3n3f8sNpv1F?Y z&mQ6~Bk?6{E}?6JUs7U9qG5ZBen4+XOZ2Cfzo6VtOGN)9)fHjo6SWE}f^RW<=9B0- zffl-Mo>;78kOj?#?@ikkAAU7xY0*idk|#iauwtPP6aNu{9b~eJCE3pSAA-y#*(P+E z8Rw>uwu~Q;JS$^9I?gXS<&6pK)-XOsv~09q^mEYuq?N^9GDbRfVuKYaU0y4IPu}w< zzA#8(lOG7$k0eRZCB`Tb=fo&!{pJtI&6tav!N6mP|&Wjlwu8%3QRT79={AcVaB*PU2$N zWrQaf-!*+b`uSymL}ZsCyqY+`qYZ}$oxRYub9_o z*fP-)Qq({A=fN*8EuY@w`+$Mu2|UbXW*C9VO!U*ihB#eeOC_zC%gi_vt7*?%c&UKy zCWR)#?;du8U}=&{S{cjYTLizz%!e@F+|OV+$~!nqmNM~xAn|SGe7xNA3}<~0Iz1~J zM}Hf(&m3#_zeLznM*jle@G=YgF;@5@eDqD!X4n*iDQ%aW1d;Y`j8m%4uNVMQ7 z{ra|(WC()}Fo^~4O5#2Q4kcKB67yYtPdmm#8J8o7%Je2_5h=6Ox$2~6<|+T8Kct#mkhR~ zW$6b9EXm-)Q;Xn|LIkXhZyVd8?AXP!{umaM(KYjQA?`XW*#Cq3(9IEu76Xij?HzM+`jGnM`C`v(hFsnV-ZX znOj1_B(@8yDdHxTU&FqvtxUGv2|irAhEG@YIV_$&2T&E?MYQ+m{-v#Bz6<*F=*sK* z?@E%Y1U(6p5Tur^@EH9j==kviPjcHXC6feENLGT?gp$0>CuaN;1xOyjgv^a2)_LY~ zvQwkze<5B)S}xnU+`9h5L?7WP&143u%Wo^zTx)EKQp^C;jUez_>`stmE5SQqGlJl6 znLmqu0j;IQU60>bRvg0$J76)&lcO*?zdl-Z5`%U)-G-BJNKLV zx(6J#K?^Xv)#AOzVyB8rzk8^h>kjzOeWI(vhqa!MYLrCn~*3iys!z0v~7o zE``3NJ+y)~^@!wU8P~VMhtuCi0?At922p5ad=Jn9*e-#^C}bJ)8H3sXz7}jShLTt? z0o8TG_y7fsM)!zMh4l(Z8j?+sJ%A0v{%D3n*D_g}EcX^k!}-b}w!9yTi?&W4CHB z=da1}i%#20qW^FRFX^auDNes)n3@SM{dE*`f&wJl@u{WVVm=B<_L_fG;`g8%k0(Sy}Iv27~Foa6=L#w002k_FgwCU7cg}*Yw?)W*bGZH-?1wVWNc^GrowGR34eJgGGnsL2`l&I9 zLcm3K%r0TPmwr;5lY}cqNv`8JAD;lLJ7V_Z@L!I;2+V0!V6-v;svOA;1Onl24Xg{Z06!C1FHM))~gJ1!=x7 zwzthbmA*eBS)u(vGE?=4aK^ur;1qK!Z6!(Qx3a)bte{XU_)q4}nQt_kQ_MXiJH`R) zNzq@iokYyv7&~J5Js&X2Yk{w`f*cq`q{YDaBtetGGT{o7a|DWdjc$__;6`-+|AzfY z;;dmVCvme-P;C17D545X2m9k6mfzEumH&xDEvx(tMmq@7&yp^se})wfB7RZ=4rDB8 z3QN)shAS>VzV&F5s4Q$a3#mx#Fsb~1`+m=da9bsVLrhj7;GgIVo5v;s{6vBh=+eQl zRKA?RU$LzZk7A#TR)R&uvBU%5EapbQUEzwmhfg!x>Hb>(H-bH-g-Jh>CBUf-P6=6Y z99nppNTM0oY=Z;X#xO~%-LY|3^XbKS0(LEJ#fRzlAZ{JAtEjJ!*II24bgnyV!W)Z()^UxG?u#vRI=4QB9mu>YWD9XRq1~QC-q6J%c z4Tt!wP}0?f=RaFPCsy`=U<+X`^NmeW&FnBnGCyD?#v|!%3OU1kck}(oikp+{5q_nxS&sc5^i$bR%waAKi}S%g z=%eaS&~L%$S60`7fHhD`j#;8A>_$R@r?Hh5Wv&EvISFvZw*DOjbYXr3#q_1^w`7Wg zDZfTRJ-(E&80uf7_12DR{oin^Nw71tK?FXf1SAf~8@Y)-31dl9oU&NI28nxfyibu} zCcMJ@HHsZe@t=wLD+yazk&ZL}1=+&pV*iRcXaAGasYj4nX7zx?b!pIGH%VywaT72}rpm%&ywB&T28 z3ja%AA4|3q@G*f_(0@d*6d0wZ)uG=FT@C`(uw5vI{uR2?P?DNtkC?B-_(wAIq8}z5 z=`SMLeUeM^!wuxAiQNv_DSs7`U&rVK;h&d${vG`HmZ0CvSpoKA(AkW)8)Ks@ zN|Jg64> z73}11K!7S#oDql7Ocb=>DRCHTN%z|}YFHnemDoNda7Jt{Q(#}ll75WykRXR88_ir% z#(Bu`44XU_X9~VMY0v!O0w=)WIBf?Gl4opTA{^&2en)FUktHeaA8ek}(xBVVd_oxA zRy3N#rwKfXov2Ony3GHF?JwjxiS8wKLl}Q2mc)MnXGu{44?y`J;|Mry#-UWW;(o!V zEY9Ny8eY=dZb|nS{y&pE6T1J1v4eh?#3s3 ze=r8)*@0N}H={d4YiB2w0zIaf)7VtT_aSpJZOfZ$(qu3CFlo;G9b4=rika^eWY_;W z2C*^M}kMUKuX+6Ouvnk?)ZSgSrk{<}(8r^ZmcP;ro`B3Cc*a;?whnVkdiG$4d zI(~;KzKK2`^$=wv6z4JSLc&P|TR@A!+%B5r30t{@elWHpNW2W^e%PKwUklrZ_{X#0 ze_FB>=%1N?MO%ns&7-hN#2ACl){hp$BhJa9A81Zaq|E(Y5$ z*aXWn-c3Qz7%!zsx|sbK0^X(YVH6fKT*7)3ESZLVfAsMgPo_;}LHu+6C`>Z+Yspt# z$A7l1<^zg&1nWd%Nmha{!LT6XA8Ai1BqI@C5;zfaEop7={|$XME1)a$0~m*w>BN1G z?I~hZrT;hW8aYej;~f73<}9auOnNZn-~S^ADJ&P7_SkM^@-0k2q9-siY=mDz`r{~Q zH$2XY$56}~^xf$XMK4J~;??M1U~^FKk3UB_mBA2PjsIG+iHiPb#@Dck&U{H?t)riW_>-_5NWYnWEN?oK|54E-+GzS+ zD5MWTE)(D@#-q?n?zrGjo#I1Lk}C95VCAj4^yBc~PVoHLmPRM( zhAtBQ%=9zDtMC*y)3G_uTsZN&KZK1YI|fOpy0AS^CZgMf@fecC3ipta^EPZHSqV7O z`mJsC-$=NHRVGkk<}<+0W)p`cd#!+9(L3k=agx?%MSsvFJB%v`lEw~CE-Roc0XLyf z4JB2fANziqQ&4EQ;3?2u#qJ0NeuC}YpiZnx;dZ4O zbDz-OV!jB)^dM$K=JV;taV77mE(O7hVxEz6t z)6dOh4s63qA}eG9`kvS{CdL+G6;rX6-&2Xn1x%(2=XsBQU0cy?3QB8znfy(gX~{MI z5N=mA{>I!$l7vY-#__E9p6qIS+8@LV%kS7_MJcIh$6fvTc4%@i_cyH!y3()-1q~$V zaFUc_g+ncPJo9Zu@H$r1c5F&uTZOr_u(%Z#IVzu6c!(keK?`6UF+yN%)Sx#l18chk z4J;ifwI!%otiY{q2>ui!aH(8y{Y2PQY8IS(-nwSN1p-l<2RFGKIak5L zIdf;tnLE%eM}*UT0~J{Wyu@i0ER#+NAYJ%Tr#FHkay*BfnJtN31DAX+kS z+z3H+<`s*@?6y?ijKP6cX}pPp0}0c6k4K#MEUUL$phGtA8DF4kZtvU(fhzgE-4X<@ zSMkn_7#LaGyCp)PVtw!6$Pp`c8r-UDt9g-Ic=OF`+rnFB-saO0A_Z=?@b1eHST)Z3 zF8aLWO(H}K9Gm5R6(?|GjrUfPcnw3!omkepQ`f$pMq#~qK}Wm==jA!-O+Ihq5pR(| Qfur6B{{)h4@$C%$KS|mf82|tP diff --git a/locale/tr/LC_MESSAGES/strings.po b/locale/tr/LC_MESSAGES/strings.po index 114a994a..c0119f12 100644 --- a/locale/tr/LC_MESSAGES/strings.po +++ b/locale/tr/LC_MESSAGES/strings.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2020-11-04 18:02+0200\n" -"PO-Revision-Date: 2020-11-04 18:02+0200\n" +"PO-Revision-Date: 2020-11-04 21:22+0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: tr_TR\n" @@ -753,15 +753,6 @@ msgstr "Üst Üste Gelme" #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:184 #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:163 #: appTools/ToolNCC.py:4206 appTools/ToolPaint.py:2975 -#, fuzzy -#| msgid "" -#| "How much (percentage) of the tool width to overlap each tool pass.\n" -#| "Adjust the value starting with lower values\n" -#| "and increasing it if areas that should be cleared are still \n" -#| "not cleared.\n" -#| "Lower values = faster processing, faster execution on CNC.\n" -#| "Higher values = slow processing and slow execution on CNC\n" -#| "due of too many paths." msgid "" "How much (percentage) of the tool width to overlap each tool pass.\n" "Adjust the value starting with lower values\n" @@ -773,11 +764,11 @@ msgid "" msgstr "" "Ucun her geçişinde uç genişliğinin ne kadarlık kısmının (yüzde) üst üste " "geleceğini belirler.\n" -"Daha düşük değerlerden başlayarak ve temizlenecek alanlar hala \n" -"temizlenmemişse değeri artırın.\n" +"Değeri daha düşük değerlerden başlayarak ayarlayın ve işlenmesi gereken " +"alanlar hâlâ işlenmiyorsa değeri artırın.\n" "Düşük değerler = Daha hızlı işleme, CNC'de daha hızlı yürütme sağlar.\n" -"Daha yüksek değerler = Çok sayıda yol nedeniyle CNC'de yavaş\n" -"işleme ve yavaş yürütmeye sebep olur." +"Daha yüksek değerler = Çok sayıda yol nedeniyle CNC'de yavaş işleme \n" +"ve yavaş yürütmeye sebep olur." #: appDatabase.py:649 appDatabase.py:1156 appEditors/AppGeoEditor.py:473 #: appGUI/ObjectUI.py:1679 @@ -930,12 +921,6 @@ msgstr "Hizala" #: appDatabase.py:704 appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:257 #: appGUI/preferences/tools/ToolsNCCPrefGroupUI.py:267 appTools/ToolNCC.py:4285 #: appTools/ToolNCC.py:4381 -#, fuzzy -#| msgid "" -#| "If used, it will add an offset to the copper features.\n" -#| "The copper clearing will finish to a distance\n" -#| "from the copper features.\n" -#| "The value can be between 0 and 10 FlatCAM units." msgid "" "If used, it will add an offset to the copper features.\n" "The copper clearing will finish to a distance\n" @@ -943,8 +928,7 @@ msgid "" msgstr "" "İşaretlendiğinde, bakır alanlara bir hiza ekleyecektir.\n" "Bakır temizliği, bakır alanların belirli bir mesafesine\n" -"kadar olacaktır.\n" -"Değer, 0 ile 10 arasında FlatCAM birimi olabilir." +"kadar olacaktır." #: appDatabase.py:759 appEditors/AppGeoEditor.py:475 #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:183 @@ -2101,10 +2085,8 @@ msgstr "Uzunluk" #: appEditors/AppExcEditor.py:4085 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:164 -#, fuzzy -#| msgid "Length = The length of the slot." msgid "Length. The length of the slot." -msgstr "Uzunluk = Yuvanın uzunluğu." +msgstr "Uzunluk. Yuvanın uzunluğu." #: appEditors/AppExcEditor.py:4099 #: appGUI/preferences/excellon/ExcellonEditorPrefGroupUI.py:180 @@ -2535,7 +2517,7 @@ msgstr "" #: appEditors/AppGeoEditor.py:741 appEditors/AppGerberEditor.py:5555 #: appTools/ToolTransform.py:667 msgid "Skew X" -msgstr "X Eğrilt" +msgstr "Eğrilt" #: appEditors/AppGeoEditor.py:743 appEditors/AppGeoEditor.py:764 #: appEditors/AppGerberEditor.py:5557 appEditors/AppGerberEditor.py:5578 @@ -2559,7 +2541,7 @@ msgstr "Y Eğim Açısı" #: appEditors/AppGeoEditor.py:762 appEditors/AppGerberEditor.py:5576 #: appTools/ToolTransform.py:688 msgid "Skew Y" -msgstr "Y Eğrilt" +msgstr "Eğrilt" #: appEditors/AppGeoEditor.py:793 appEditors/AppGerberEditor.py:5607 #: appGUI/preferences/tools/ToolsFilmPrefGroupUI.py:120 @@ -2900,10 +2882,8 @@ msgid "Rotate done" msgstr "Döndürme işlemi tamamlandı" #: appEditors/AppGeoEditor.py:1461 appEditors/AppGerberEditor.py:6327 -#, fuzzy -#| msgid "Rotate Angle" msgid "Rotate cancelled" -msgstr "Rotate Angle" +msgstr "Döndürme işlemi iptal edildi" #: appEditors/AppGeoEditor.py:1466 appEditors/AppGerberEditor.py:6332 msgid "Offset on X axis ..." @@ -2915,58 +2895,44 @@ msgid "Enter a distance Value" msgstr "Bir mesafe değeri girin" #: appEditors/AppGeoEditor.py:1479 appEditors/AppGerberEditor.py:6345 -#, fuzzy -#| msgid "Open DXF cancelled." msgid "Offset X cancelled" -msgstr "Open DXF cancelled." +msgstr "X hizalama işlemi iptal edildi" #: appEditors/AppGeoEditor.py:1484 appEditors/AppGerberEditor.py:6350 msgid "Offset on Y axis ..." msgstr "Y ekseninde hiza ..." #: appEditors/AppGeoEditor.py:1494 appEditors/AppGerberEditor.py:6360 -#, fuzzy -#| msgid "Offset on the Y axis done" msgid "Offset on Y axis done" -msgstr "Y eksenindeki hizalama işlemi yapıldı" +msgstr "Y ekseninde hizalama işlemi yapıldı" #: appEditors/AppGeoEditor.py:1497 -#, fuzzy -#| msgid "Offset on the Y axis done" msgid "Offset on the Y axis canceled" -msgstr "Y eksenindeki hizalama işlemi yapıldı" +msgstr "Y ekseninde hizalama işlemi iptal edildi" #: appEditors/AppGeoEditor.py:1500 appEditors/AppGerberEditor.py:6366 msgid "Skew on X axis ..." msgstr "X ekseninde eğrilt ..." #: appEditors/AppGeoEditor.py:1510 appEditors/AppGerberEditor.py:6376 -#, fuzzy -#| msgid "Skew on X axis done." msgid "Skew on X axis done" -msgstr "X ekseninde eğme işlemi tamamlandı." +msgstr "X ekseninde eğritlme işlemi yapıldı" #: appEditors/AppGeoEditor.py:1513 -#, fuzzy -#| msgid "Skew on X axis done." msgid "Skew on X axis canceled" -msgstr "X ekseninde eğme işlemi tamamlandı." +msgstr "X eksenindeki eğriltme işlemi iptal edildi" #: appEditors/AppGeoEditor.py:1516 appEditors/AppGerberEditor.py:6382 msgid "Skew on Y axis ..." msgstr "Y Ekseninde Eğrilt ..." #: appEditors/AppGeoEditor.py:1526 appEditors/AppGerberEditor.py:6392 -#, fuzzy -#| msgid "Skew on Y axis done." msgid "Skew on Y axis done" -msgstr "Y ekseninde eğme işlemi tamamlandı." +msgstr "Y ekseninde eğriltme işlemi yapıldı" #: appEditors/AppGeoEditor.py:1529 -#, fuzzy -#| msgid "Skew on Y axis done." msgid "Skew on Y axis canceled" -msgstr "Y ekseninde eğme işlemi tamamlandı." +msgstr "Y ekseninde eğrilme işlemi iptal edildi" #: appEditors/AppGeoEditor.py:1960 appEditors/AppGeoEditor.py:2031 #: appEditors/AppGerberEditor.py:1500 appEditors/AppGerberEditor.py:1583 @@ -3161,17 +3127,13 @@ msgstr "" #: appEditors/AppGeoEditor.py:4936 appEditors/AppGeoEditor.py:4988 #: appEditors/AppGeoEditor.py:5037 appEditors/AppGeoEditor.py:5084 -#, fuzzy -#| msgid "Failed. Nothing selected." msgid "Nothing selected." -msgstr "Hata. Hiçbir şey seçilmedi." +msgstr "Hiçbir şey seçilmedi." #: appEditors/AppGeoEditor.py:4940 appEditors/AppGeoEditor.py:4992 #: appEditors/AppGeoEditor.py:5041 -#, fuzzy -#| msgid "Invalid distance for buffering." msgid "Invalid distance." -msgstr "Tampon oluşturmak için geçersiz mesafe." +msgstr "Geçersiz mesafe." #: appEditors/AppGeoEditor.py:4964 appEditors/AppGeoEditor.py:5012 #: appEditors/AppGeoEditor.py:5061 @@ -3341,10 +3303,8 @@ msgid "Added new aperture with code" msgstr "Şu kodlu yeni şekil eklendi" #: appEditors/AppGerberEditor.py:3095 -#, fuzzy -#| msgid " Select an aperture in Aperture Table" msgid "Select an aperture in Aperture Table" -msgstr " Şekil Tablosundan bir şekil seçin" +msgstr "Şekil Tablosundan bir şekil seçin" #: appEditors/AppGerberEditor.py:3103 msgid "Select an aperture in Aperture Table -->" @@ -3701,22 +3661,16 @@ msgid "Specify how many pads to be in the array." msgstr "Dizide kaç tane ped olması gerektiğini belirtin." #: appEditors/AppGerberEditor.py:6363 -#, fuzzy -#| msgid "Open cancelled." msgid "Offset Y cancelled" -msgstr "Open cancelled." +msgstr "Y hizalama işlemi iptal edildi" #: appEditors/AppGerberEditor.py:6379 -#, fuzzy -#| msgid "Open DXF cancelled." msgid "Skew X cancelled" -msgstr "Open DXF cancelled." +msgstr "X eğriltme işlemi iptal edildi" #: appEditors/AppGerberEditor.py:6395 -#, fuzzy -#| msgid "Skew_Y angle" msgid "Skew Y cancelled" -msgstr "Skew_Y angle" +msgstr "Y eğriltme işlemi iptal edildi" #: appEditors/AppTextEditor.py:84 msgid "Find" @@ -5093,8 +5047,6 @@ msgstr "Varsayılan" #: appGUI/MainGUI.py:863 #: appGUI/preferences/excellon/ExcellonOptPrefGroupUI.py:33 #: appGUI/preferences/geometry/GeometryOptPrefGroupUI.py:35 -#, fuzzy -#| msgid "Create CNC Job" msgid "Create CNCJob" msgstr "CNC İşi Oluştur" @@ -6549,10 +6501,8 @@ msgstr "" "sağlar." #: appGUI/ObjectUI.py:724 -#, fuzzy -#| msgid "Generate GCode out of drill holes in an Excellon object." msgid "Generate GCode from the drill holes in an Excellon object." -msgstr "Bir Excellon nesnesindeki matkap deliklerinden G Kod oluşturun." +msgstr "Bir Excellon nesnesindeki deliklerinden G Kodu oluşturun." #: appGUI/ObjectUI.py:735 appGUI/ObjectUI.py:1790 msgid "Milling Tool" @@ -9206,8 +9156,6 @@ msgstr "" "başlatılmasını gerektirir." #: appGUI/preferences/general/GeneralAppPrefGroupUI.py:64 -#, fuzzy -#| msgid "Precision INCH" msgid "Precision Inch" msgstr "İNÇ Hassasiyet" @@ -12105,15 +12053,6 @@ msgstr "Kalan Parça İşleme" #: appGUI/preferences/tools/ToolsPaintPrefGroupUI.py:245 #: appTools/ToolIsolation.py:3394 appTools/ToolNCC.py:4338 #: appTools/ToolPaint.py:3079 -#, fuzzy -#| msgid "" -#| "If checked, use 'rest machining'.\n" -#| "Basically it will isolate outside PCB features,\n" -#| "using the biggest tool and continue with the next tools,\n" -#| "from bigger to smaller, to isolate the copper features that\n" -#| "could not be cleared by previous tool, until there is\n" -#| "no more copper features to isolate or there are no more tools.\n" -#| "If not checked, use the standard algorithm." msgid "" "If checked, use 'rest machining'.\n" "Basically it will process copper outside PCB features,\n" @@ -12124,12 +12063,12 @@ msgid "" "\n" "If not checked, use the standard algorithm." msgstr "" -"Bu onay kutusu işaretlenirse, 'Kalan Parça İşleme' kullanılır.\n" -"Bu, en büyük ucu kullanarak PCB'nin ana bakırını \n" -"temizler ve temizlenecek daha fazla bakır kalmayana veya \n" -"daha fazla uç kalmayana kadar önceki uçla temizlenemeyen\n" -"bakır alanlarını temizlemek için bir sonraki uçla, daha büyükten\n" -"daha küçüğe doğru ilerler.\n" +"İşaretlenirse, 'Kalan Parça İşleme' kullanılır.\n" +"Temel olarak, PCB özelliklerinin dışında kalan bakırları işleyecek.\n" +"En büyük uçtan başlayarak ve büyükten küçüğe doğru kullanarak işlenecek " +"hiçbir şey kalmayıncaya kadar veya önceki uçla temizlenemeyen bakırları " +"işlemeye devam edecektir.\n" +"\n" "Onay kutusu seçilmezse, standart algoritma kullanılır." #: appGUI/preferences/tools/ToolsISOPrefGroupUI.py:258 @@ -13827,8 +13766,6 @@ msgstr "İptal edildi. G Kod üretimi için dört nokta gereklidir." #: app_Main.py:8652 app_Main.py:8694 app_Main.py:8736 app_Main.py:8777 #: app_Main.py:8822 app_Main.py:8867 app_Main.py:9330 app_Main.py:9334 #: camlib.py:2403 camlib.py:2471 camlib.py:2539 camlib.py:2617 -#, fuzzy -#| msgid "No object selected." msgid "No object is selected." msgstr "Hiçbir nesne seçilmedi." @@ -15134,10 +15071,8 @@ msgid "Starting G-Code" msgstr "G-Kodu başlatılıyor" #: appTools/ToolDrilling.py:1673 appTools/ToolMilling.py:1355 -#, fuzzy -#| msgid "Generating Excellon CNCJob..." msgid "Generating CNCJob..." -msgstr "Excellon CNC İşi oluşturuluyor ..." +msgstr "CNC İşi oluşturuluyor ..." #: appTools/ToolDrilling.py:1791 camlib.py:3214 camlib.py:3644 camlib.py:5730 msgid "The Toolchange X,Y format has to be (x, y)." @@ -15406,20 +15341,12 @@ msgstr "" "Genişlik, her zaman bakır kaynağının genişliğinin iki katıdır." #: appTools/ToolFilm.py:160 -#, fuzzy -#| msgid "No FlatCAM object selected. Load an object for Film and retry." msgid "Load an object for Film and retry." -msgstr "" -"Hiçbir FlatCAM nesnesi seçilmedi. Film için bir nesne yükleyin ve tekrar " -"deneyin." +msgstr "Film için bir nesne yükleyin ve tekrar deneyin." #: appTools/ToolFilm.py:167 -#, fuzzy -#| msgid "No FlatCAM object selected. Load an object for Box and retry." msgid "Load an object for Box and retry." -msgstr "" -"Hiçbir FlatCAM nesnesi seçilmedi. Çerçeve için bir nesne yükleyin ve tekrar " -"deneyin." +msgstr "Çerçeve için bir nesne yükleyin ve tekrar deneyin." #: appTools/ToolFilm.py:182 msgid "Generating Film ..." @@ -15785,10 +15712,8 @@ msgid "Tool(s) deleted from Tool Table." msgstr "Uç(lar) Araçlar Tablosundan silindi." #: appTools/ToolIsolation.py:1479 -#, fuzzy -#| msgid "Isolation" msgid "Isolating" -msgstr "Yalıtım" +msgstr "Yalıtılıyor" #: appTools/ToolIsolation.py:1499 msgid "Following geometry was generated" @@ -16022,7 +15947,7 @@ msgstr "TAŞIMA işlemi iptal edildi. Taşınacak nesne (ler) yok." #: appTools/ToolMove.py:211 msgid "object was moved" -msgstr "nesne taşındı" +msgstr "nesnesi taşındı" #: appTools/ToolMove.py:221 msgid "Error when mouse left click." @@ -16820,21 +16745,16 @@ msgid "Import Excellon" msgstr "Excellon'u İçe Aktar" #: appTools/ToolPcbWizard.py:466 -#, fuzzy -#| msgid "" -#| "Import in FlatCAM an Excellon file\n" -#| "that store it's information's in 2 files.\n" -#| "One usually has .DRL extension while\n" -#| "the other has .INF extension." msgid "" "Import an Excellon file\n" "that store it's information's in 2 files.\n" "One usually has .DRL extension while\n" "the other has .INF extension." msgstr "" -"FlatCAM'de, bilgileri 2 dosyada bulunan\n" -"Excellon dosyasını içe aktarın. \n" -"Birinde genellikle .DRL, diğerinde .INF uzantısı vardır." +"Bilgilerinin 2 dosyada saklandığı \n" +"bir Excellon dosyasını içe aktarın.\n" +"Biri genellikle .DRL uzantısına sahipken\n" +"diğeri .INF uzantısına sahiptir." #: appTools/ToolProperties.py:127 msgid "Object Properties are displayed." @@ -18196,10 +18116,8 @@ msgid "Adding New Grid cancelled" msgstr "Yeni ızgara ekleme işlemi iptal edildi" #: app_Main.py:6351 -#, fuzzy -#| msgid " Grid Value does not exist" msgid "Grid Value does not exist" -msgstr " Izgara değeri mevcut değil" +msgstr "Izgara değeri mevcut değil" #: app_Main.py:6353 msgid "Grid Value deleted" @@ -18214,8 +18132,6 @@ msgid "Key Shortcut List" msgstr "Klavye Kısayol Listesi" #: app_Main.py:6401 -#, fuzzy -#| msgid "Name copied on clipboard ..." msgid "Name copied to clipboard ..." msgstr "İsim panoya kopyalandı ..." @@ -18631,10 +18547,8 @@ msgstr "" "ediliyor." #: app_Main.py:10387 -#, fuzzy -#| msgid " Open HPGL2 failed. Probable not a HPGL2 file." msgid "Failed. Probable not a HPGL2 file." -msgstr " HPGL2 açılamadı. Muhtemelen bir HPGL2 dosyası değil." +msgstr "Başarısız oldu. Muhtemelen bir HPGL2 dosyası değil." #: app_Main.py:10413 msgid "TCL script file opened in Code Editor."