flexdock-1.2.4/0000755000175000017500000000000012177715062014207 5ustar sylvestresylvestreflexdock-1.2.4/.classpath0000644000175000017500000000201112177715062016164 0ustar sylvestresylvestre flexdock-1.2.4/.gitignore0000644000175000017500000000000512177715062016172 0ustar sylvestresylvestrebuildflexdock-1.2.4/.project0000644000175000017500000000055712177715062015665 0ustar sylvestresylvestre flexdock org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature flexdock-1.2.4/.settings/0000755000175000017500000000000012177715062016125 5ustar sylvestresylvestreflexdock-1.2.4/.settings/org.eclipse.jdt.core.prefs0000644000175000017500000005205012177715062023111 0ustar sylvestresylvestre#Thu Dec 21 09:48:48 EST 2006 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.4 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning org.eclipse.jdt.core.compiler.source=1.4 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_assignment=0 org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 org.eclipse.jdt.core.formatter.blank_lines_after_package=1 org.eclipse.jdt.core.formatter.blank_lines_before_field=1 org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 org.eclipse.jdt.core.formatter.blank_lines_before_method=1 org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 org.eclipse.jdt.core.formatter.blank_lines_before_package=0 org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false org.eclipse.jdt.core.formatter.comment.format_comments=true org.eclipse.jdt.core.formatter.comment.format_header=true org.eclipse.jdt.core.formatter.comment.format_html=true org.eclipse.jdt.core.formatter.comment.format_source_code=true org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true org.eclipse.jdt.core.formatter.comment.indent_root_tags=true org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert org.eclipse.jdt.core.formatter.comment.line_length=80 org.eclipse.jdt.core.formatter.compact_else_if=true org.eclipse.jdt.core.formatter.continuation_indentation=2 org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_empty_lines=false org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.jdt.core.formatter.indentation.size=8 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false org.eclipse.jdt.core.formatter.lineSplit=80 org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.jdt.core.formatter.tabulation.char=space org.eclipse.jdt.core.formatter.tabulation.size=4 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false flexdock-1.2.4/.settings/org.eclipse.jdt.ui.prefs0000644000175000017500000000022712177715062022575 0ustar sylvestresylvestre#Thu Dec 21 09:43:06 EST 2006 eclipse.preferences.version=1 formatter_profile=_FlexDock formatter_settings_version=10 internal.default.compliance=user flexdock-1.2.4/FlexDock Core.iml0000644000175000017500000000150212177715062017260 0ustar sylvestresylvestre flexdock-1.2.4/FlexDock.iml0000644000175000017500000000221112177715062016405 0ustar sylvestresylvestre flexdock-1.2.4/LICENSE.txt0000644000175000017500000000216012177715062016031 0ustar sylvestresylvestrePermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. This product includes software developed by The Apache Software Foundation (http://www.apache.org/). flexdock-1.2.4/README0000644000175000017500000000227112177715062015071 0ustar sylvestresylvestreThis is the readme for the binary distribution. If you want to use the sources to build and run flexdock demos, then see README-BUILD. Contents ------------ The contents of the binary distributions are: LICENSE.txt the license statement README this file flexdock-.jar the flexdock framework flexdock-demo-.jar runnable jar containing demo apps release-notes.txt list of changes, fixes and new features docs\* user/developer documentation docs\apis\... javadocs jmf\* Java Media Framework used by the demo lib\* libraries used by this distribution Running the Demos --------------------- The demo jar requires both the flexdock-.jar and lib\*.jar. The manifest for the demo expects the flexdock-.jar to be in the same directory and all other dependencies to be located in a subdirectory lib. If you do not move any of the jars, you can run the demo jar using: java -jar flexdock-demo-.jar or if your GUI shell supports running a jar file by clicking or double clicking on it's icon, then do that. flexdock-1.2.4/README-BUILD0000644000175000017500000000340512177715062015726 0ustar sylvestresylvestreBuilding Flexdock -------------------------- To build this project, obtain a copy of Apache's Ant from http://ant.apache.org. You must use version 1.6.0 or later. From this directory you should be able to build everything by running the command: ant dist This will generate output in the following directories: build/bin The compiled framework and required resource files. build/bin-demo The compiled demos and required resource files. build/bin-test The compiled tests and required resource files build/docs The PDF documentation build/docs/api The framework javadocs build/dist Contains: - a jar containing just the framework code and it's resources - a zip containing this jar, the license file, plus the PDF docs and the javadoc (i.e. a binary distribution of the framework) If you just want to build the build/binxxx dirs, you can run just: ant To do this plus build the jar: ant jar If you want to build a jar without any native code in it, run: ant jar -Dgeneric.jar=T The generated jar will have a -generic.jar suffix. To clean up everything built by ant, delete the build dir or run: ant clean Running The Demos via Ant -------------------------- There are several ant targets for running the demo applications: demo <-- this one is a generic launcher for all the others demo.adapter demo.border demo.compound demo.elegant demo.jmf demo.perspective demo.simple demo.splitpane demo.tabbedpane demo.view To run a demo, choose the name of the demo target you wish to run and execute it via ant. For example, ant demo will run the generic demo launcher and ant demo.simple will run the simple demo. flexdock-1.2.4/build.xml0000644000175000017500000004512712177715062016041 0ustar sylvestresylvestre The file signing.properties must exist in order to sign jar files. The signing.properties file must specify all of the following properties: alias=[the alias to sign the jar with] keystore.file=[the location of the keystore] keystore.passwd=[the password for accessing the keystore] key.passwd=[the password of the private key in the keystore] flexdock-1.2.4/docs/0000755000175000017500000000000012177715062015137 5ustar sylvestresylvestreflexdock-1.2.4/docs/UserGuideOutline.txt0000644000175000017500000000222712177715062021137 0ustar sylvestresylvestreIntroduction What is a Docking Framework? Common Docking Frameworks and Features What is FlexDock? FlexDock Components Demo Applications Basic Concepts Dockable, DockingPort, and DockingManager Regions and Docking Layout Drag-n-Drop Programmatic Docking API Event Handling Creating a Working Example Working with Raw Dockables User-Provided Methods Framework-Provided Method Implementations Creating a Layout Managing Nested Borders Using a DockableFactory Creating a Working Example Working with Views What is a View? Adding User Content Adding View Actions Defining View Actions Changing the Theme Creating a Working Example Managing Docking State Working with Minimization Working with Floating Working with the LayoutManager Persisting Docking State Creating a Working Example Minimization and Collapsable Toolbars Dockbar as a Minimization Manager Dockbar Edges and Constraints Dockable Preview Dockable Restoration Creating a Working Example Working with Perspectives Perspectives as a LayoutManager Using a PerspectiveFactory Customizing Persistence Location Customizing Persistence Format Creating a Working Example flexdock-1.2.4/docs/User_Guide.sxw0000644000175000017500000227252712177715062017756 0ustar sylvestresylvestrePK319mimetypeapplication/vnd.sun.xml.writerPK3sLPP-Pictures/1000000000000400000003008BB71621.jpgJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?tIZdǿ=9R5._=IWzY{ =* i9>g.'/ ]N%0# sYk~7"~T*2R4Tvlbp7b3UӳMgѯɧSΚMLXBu? Xi,>2. .AЎ5!ּn!0lIMPTQQɝEwjzʏ*/ xEӡi绻HSG Fp~SNԼ%ךӭ/"7UyFD+Jg}_jrW_Tm]CWSYZ>E\iD!L)'oI+;ZDF$`3ʑ8N%g~I~-Wjzʏ*hMSQIqk>n.|+lpHĢ~ T?F+U|T0~֟?7[~_y?W_U?t;? Auy}PI]J3-([ OXF􆵎.oV;XY rX`d'3OC VN3jzʏ*Cдh˧;#[&X3lg(R0##8xGM_Zm=T" \|OX}ko 8*?'jI$Kn U<6?7Q7>Ь5 ֫_M.I r"X >VR{yJj~'?u=G?hxI]&+o݌Rs*k-"qOhP}ǥ\T]hFb#UNN͜?W_Uh3wӣ"-Fs~U q +pj}B[ ේ Cfʁ ;1,Ɣ$H+~ pW_Tm]CU+8Th.4@ ^dMw>Sr\QaF J9cN_E{\u=G?{ ocyijM&}NA!#JՏWL']Soyq C2ܞWK4;%%sytk;v9o*?&jXP/ ޞJNF3[׭jk^BWu+kdU0ʌYOr`9뷝Ӷk7kںO X[j76ڔVԳCM{Q.o$3U%c}JQ}kZ*5u=G?uׄO5캅ͼ:V 4+338V8 9 )KXخ?gR]tggL}:w!F7/_Sںjzʺ_\Zu'#z}l.d !#<15[(S Vu|F Xw}~*IÕ{K_2EB/m]CQu=^x+N|C}s6|d \I uڀW\z>4ZB\I y:w8g $3L4Z,nz_?W_Tkp5%X i#nب/Kd}oFI\Ai4jr} ںF,jV[i:*LbkLj$ "ZwY{q+2$fUvS9=ϣS9~=.-0bum]CQu=] ǪCRӤK]^bcI^?:IUgiS)g4gKsk/WV$~TgcATվDRWںGLt6fZ_ѬHd'Bd'=~"KѵOk$\<)+8pAf,PJo;Vk_sW_Tm]CZW?5> yS4}Y{)lFO.`ҀO 3;sQB5~+~-/Ojem]CG5zFE6=9DufU0T~2gftzj@KB dG]@9GFQy'4ܺy]hںJ6Jkdhm]CG5QQ`4?硣jz}(}(kYW_u= g>m>{5,hںJ6J=F4m]CYOOv #Cjz?硬ҍҏfu= W_~FG]ںk?iiٮdhm]CG5QQ`4?硣jz}(}(kYW_u= g>m>{5,hںJ6J=F4m]CYOOv #Cjz?硬ҍҏfu= W_~FG]ںk?iiٮdhm]CG5QQ`4?硠W_~FG]ȿu=OG?P}(}(kY(ںOOv "?W_Ciiٮd_ںjzҨm>m>{5,W_m]SU ҍҏfjzҏJQQ`/m]SQu=OT6J6J=EJ?*FG]ȿu=OG?P}(}(kY(ںOOv "?W_Ciiٮd_ںjzҨm>m>{5,W_m]SU ҍҏfjzҏJQQ`/m]SQu=OT6J6J=EJ?*FG]ȿu=OG?P}(}(kY+u뽳$H ?)cߎiF{Auo\>DΌ2>^OK?U FO 46˰Ps8'NWXW/R4@I(с=u ȡJRu>U5Э;#i|\G@F_Ķ!-c6׎+S:*TŜ1W\ Lv /mn5&]JfD̨rx*F^%vS>D[~9닱<FIyC#E9VWv;郷ٶyu41J|&ItW ..bnRc8Ecny-2Ic'> $i<2TW>QO#<)ONp\wSF੧+۱$"sq$DR.v('^ Ÿ ?/G+ ,LUi. JJR^Ḳb"SV~{S֮o\, Bm+iQN,ץL>AW"3ٵqڽ7υ?&_*W>Qys=4k.ūڦl޳jR4p.P|R Gjv WZDQ^xcr c'jOԚ?W>Q?\SGe⩬/MIRw^KSM:?Sam :S PQr\e{L].,~-ْФqFaN ^ sk\SGesO ys|Γ/˱iYTYzS,$ )K^Iggfo$rp6H3O~3^ Ÿ ?/G+ (LU5ejo{︿1O^yu Z]jIi(4 *O4 SW5yCQ).S'$ק¹Q Ÿ ?/S??]?y(hN,mkosy+# q'uuƓ*X("wyR{^ Ÿ ?/G+ (LULs7wwo{*X [Vy Kwpe0k*$I0~Ekpak1URZ&gG5|)@2T¹V ٻv3/G7?:?u[Yj HDTnQ*]ISFF:|I[Mouy Himpn$przNO¹Q Ÿ ?/XV2ZrOJ,*OQs./v]>fػk%T,% n6IqgOLTu$qVlK,Su3]=oL q^ Ÿ ?/G+ (LU2oI׿q,Mj{uqI&-lRT9$RVfEGtF]ʀv FIMz+ (LU|)@2U 8TM8yvM3J^Xe> Sh#q8H sc;A$8\SGesO +ioe}ԟKI9ykSVnfUD'#&oꭨͨ={mū<R; z+ (LU|)@2UβEERz+l;,.Mh.mJ8v_\jw__\&  8wυ?&_*W>QY?\Sge⫣f,0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?\xSGeY//Fԯfq?̿U<'@f,a[xԣjW¸f_*WWLQa_r0ƭ/^nYBk'QݵԯkR)F IZWVº>uNSќ랧֪F.=CT⳸yO2 #ƥkprN I$VY!/k-,H&uTi̪IPORfԕ#8]^·:Ƥ^L2+Y7ǔ#xIUbbD1[$ZBEC!Ҡ< \6.+OGc+ţ6mZQ7,p2qqڴ.;KUA Wvrv6%&'N&$K$uAʡl>w-['ϰ_7:O/-~]~wg۱1޺/Oem V1`82q4 IұYYv>nvt>WQp RtS~kǗv3W= i20b.YJ$`q+kxHBGjQ@Q n4yWFɧmTJȅFTds/q#w c l.mMV'ˀ׬a⼖񔺢B!2AVd\Fkfz{fz!(V!QI$8'j[+I:>mF7a=Wn14]Y+^X4Inɷ'h䌜ӮZӴu^G [p#)-V;98FܷQ|W }a]A#|gaNiqiGmsυ-# .ӕܠayEguӒ=&[ˋ8cЙqi 17.'q z^._̻$XTJ>U=[yuv#jzIqwxd9&U$20GR# lC)0H3xV:GK$!H9$>8%@svg52Eo{Ghg3 ;<ĉ/݁W䷑z]Lm;-U)CmF6B3Kqnx./Me <OV2[1O+#eP *;U]gOҧdfߖ0?4{wN98=3-QFѣ^X"i/ ȅ7!F_;9+*zK )/mo&kU]%+ K`iOzX[KԓBlm a +޼wD}=TKi Br2tt#|ew)52`12?g@NEizŕǑkoqƙH!|9M_,}ݿuP }e$Ɇ,h"qۓIKTH{I x;fRr Qӭq#.e̳>$XdH$³ rII>K Ym%bA$*ѻIR0Io>09}3Ğ"t&ϒL<ɦ."VdM',YʝܴOumHe>e֓[ iZk(l-`u]BB#cv\BahVbOXY"݉Y\ (yLf}B4mTrayʮA 409{>7%xu'T>X}öF0rr fe.%K&ڵV'_y[99^|8ݕo5u/Y"H1,7T:[DaoY'>ќ랧ր8ˍ[Z>)1Ck !DI.氓xG/2|>oΧCt)rG-dH%OPh>,[G͢+"mUf.0eV#Pz[[ooE J8Pp`exylmu$;@$I<~+xSѯau֗t6K"E 3;Q,I!UUFO@*nʆP&h–3n$ȽxɬjjDRhKxD BcGlmF.c’ ܸ0l# k9aCAA ZLNZ-XfthK%wMh:si6ћ_hU6²KG($ڶtN|ld3x}/ºơl@h ʅG~Ey}Kk-&uQd)6B% >\J^סzuKl\Ļ>Kw HN7.qn\̰o^gVnZ`` vc+NIy95՜vṴoUBq]8L[hݜaYӵ?1){G6J?U-/G] [CI[8`E[2|mW-Ad,5jfM>n3爔I<波Ӭ[ߵGqvd:I;6m Nӝ+ "R,?/WmcťYl么W+HrR>ԞMJ[.IlzƠda7mh!v)H#8?A(-gҮ~Ω"7@6xҹ=5PM-B+p:byzg)up:8}B&X&.CEqonWpw֜EkAGj|M!u 5(س:[Aj%LN??s2|mp0+4ur p~awlqM+nH%A4t +58" Ì -aѯSu6RvFzdcƸL1.7N} hxe.fHgz }iq\뿳,?/UFo _U/-{v3Vr*毥IwnN Tbe0I%Q;`SIlӧޯfKX>ɳ9v^̰o^a\kǃb,,|te2,gPAY>` fy= 0pۄ8D(\ 8A5J.4Dnֺ;yޏr)!cwCe r~f zTYis$Hۣ$jAEsXk%Kq5E3">\q*!0N憭x[-g6%r PsЫVm]%lnIa>6³g5)HmTf =EmWrAvyLӠ"|pTHBfweVeߥ m|5q yp[=v:9vKM,?/UeM ".L5m⻚V$ B3קXmAcU{[GE'_y&KJL̰oGeߥ ZZYB o˻{jj_KfXύ_GE椚~q\kGcS$PڐBFq6oxk\P]B6Q*e^4#>q!ʞn 4>iNϵ[￳,?/Qa>6­Vgw|?}I,x'rQc;N.PY<ocRfXύ_u/3)}I.v5<8QQ U{U@V~e€j[x\2}:?ٖm~(̰oY>"?sbZ_]YZW?'=mca>6 IIqin[h"7?BmErG3syvq߯jQՃ5RHnv#$K:6mП>A8޵>hVd]~dS[b]olm-ぁ{uXo--XcB~eNG۟?{ n:\W:oKhm4G "4gv 2S\F7yO2SXٹk{ݐzmhrF+ nd¤2Mӣ!kB-2٣C@##p* FRG>w?,??S!ٖm~(̰oXz#~?J?V]%ыJ\ KfXύ_U/OpgfXύ_2|mcx/AV4{3|gCj;~1Luٖm~+pyk&db *qgS"_KfXύ_TT\e_KfXύ_TQp*fXύ_2|mZW2|mٖm~*\ ٖm~(̰oVṴoGeߥ Eeߥ ?,?/U(,?/Qa>6­QEa>6Kj._KfXύ_TQp*fXύ_2|mZW2|mٖm~*\ ٖm~(̰oVṴoGeߥ Eeߥ ?,?/U(,?/Qa>6­QEa>6Kj._KfXύ_TQp*fXύ_2|mZW2|mٖm~*\ ٖm~(̰oVṴoGeߥ Eeߥ ?,?/U(,?/Qa>6­QEa>6Kj._KfXύ_TQp*fXύ_2|mZW2|mٖm~*\ ٖm~(̰oVṴoGeߥ E fՖX2o$e2a2:d}jcCDV^ſo.o~[iiziwI#ƥ )f zU:$v.yC#N1Sh/A-~_gw{nш`v@-}fh/A-~_-X2ƓDH2Xz\ׂ<n- "$u Am;_ iߗgFe LI?)N )*)nj[N:?wmӢ?wӿ/ΕӢ?wӿ/΋Efh/A-~_N_ iߗgG[N:,UEۢ][2"A. f~-tl]Yl]/7@h/7F * Ѳ~-tf~-tl]Yl]/7@h/7F * Ѳ~-tf~-tl]Yl]/7@h/7F * _tEfh/A-~_;Ӣ?wӿ/΋Efh/A-~_N_ iߗgG[N:,ӿ/ΏtX :+3A-~_ Am;tVg[N:?w`4th/iY Am;_ iߗgEӢ?wӿ/΋Efh/A-~_N_ iߗgG[N:,ӿ/ΤK)e#=`/EqM'$VWV pIJGlƸvʂXUu:{'wF--۸{xFΑv#?КMC=ŭ%C2f7\xXu {{sz׎|1q/ ^XB,?}%1–<BVhE 7 y_4X54g+D# I.R!RxfM>+.neomYbBNʞ3I#:cF+ ;>wmmMFu []2K 3Q!>aRF !`?7Ggfv9\VQuoG%[!zc(ٵp$ MV5|VC,aZEt_q99@6_Z$wi5ڣF(es(3#O˩Kj-Ve2Lyq\;Pm]@w6{o3oA Y$Edn$(QŮDHWa'pS/,S^Zoy Ѵc=s 2H϶meX`[-3+b`T" Mn}_On-4fɑc s%6sm'.OleY_|r[%DهV6,o?)ZxD4mW}Đܣ+r(:7-,Ja(xawH@ wKh4J*drHڊhĚM^廕"FĒ~WL5= oԖvifKdy'5m?r^%=:59^XbI'KۗX[#hhn׶nyr2fAHvc0:UK$ڝQQylRA= -vhqs Y[-մY% $R9 00@Ap1ѵ}NvvgL10X~-o+#ži' ;;VW ʖs؊tclH#N~@ 9@V[dMNɮn[·^h$:.rˀNG5ɵ(gImO&W;YnBɝixr w,lķvdvp%r=4BF<8__|ANJ, .-0I\]Xɸ94a<{GTx$X. t5NOxu,쮣>h-!wh $jYvzGG*īO.-P/8JȓY.T2e+6~x@gj=>xIn.l.X$e9c4Vcivs͝oTAAU}7zFjZn}ޘꗈ6p7c g٬4ӟRB) BKw+&Nsk/fi3Zޕ=_<0% g*XnFGA<}v&^qkwU*00a_rzՋowVZ]ȉ!{緖)`]:^A88+#{`nL!spp~S 3@|7>t俐N/[O$_i\/5&8xr*寊4b}.i. ᴕE]̍0_,0d%Z6~L ai~.M;ͻ$6'呕#!O5cW=W'vKx I唪mƬ2N08Q\3[,'_[#: FW@\F7Gרh<7xš2_kR},Є]* :lM±Y] WφѯP9XuIA%u]WhT(X!Y"2JR0Y3ߊ8Εٮ|)wLO6|_ݜFo66:4o"GsIH]x3^O> $?o~Ϸ;q3f3X!ӼQEKpIq3"KR"J̱р:K_~⾝tbikℨm+fpIbxԇǾ[{^H dddƂA## r#i~.O e`TqwڢL%626#Uf'y 6â:$.#~=L2"P U xmoo*_+q-vZl`dRdFǾ,K{nnk1 ]4f@9^X^#t۹9{Zh4Ҵ4OI(?7Ğ4=BH&-ek<@=!<]ɪ&r(gsyB!$s698u_\\Z~`zԀ|\𯋟!4[K[_:[ 80UI0,SZK{[5]dovbVbAڎB+0xa[)|-j i9 @'rImmtEe`r@ktgҭ5*K@O`iL ij34scMݤSjODiyw+ *rKmuożM9#ԌlGzngDWx䛕XlOy^#A s,&^iw2Hq).*7;{5ŤYC]p1ۼ+-ʉ.mm;엍qJM_;r/Fp# )OkY3+bMʬHRFJ}ҹk/o5|ۤ+mq&%TBUa-9b>Oag쎑"4ۿyk0Y"Ip piP;!deb8nv ȗ[uھeΦб)#FgaxJ,[=*-jp[Z\[L$.op2mn o+}FFH Nd>h,dvC,^:m5x4Έ lHWoC7V>ߏԘ}8Ǘܽ3zmnRXnu7X] oM1rEd$-/)6`njot=~K'R|GmdCz\Ky e]DϘPN#8^I'=k o\n.K3jAS+ u5kIo.`{Yd,ɜ>iV;YNs3]EXY&9,b_܅)FBA ʹ \mm;3rrq>jJk$ԼQbmRQf*1|0nbPfeV}SLMp>rߙ'Yc3Z5m/R4¨%(@Uk_zn纵 ([9W\~z-K59nx.n Ѽ *JzOiZE5l—7q8P|!!;VbHm^I DKMB蚟}|۰`|AwW +dV.ef8]V=w,nCZeޢڒ\Et 1w"Pt4巶Z vzn!t7:}la'M~͛˓ jnmj+k&+M#BL;)*rzdG''%,ͣhP̺"9k9YcFo(r&SA~]8Z?G ,yl2,g>Jĩ~EX* řW;sXZvhJV ess,^LֳNE bYd"pv&hPٷi~MB+Ka%]:[DY,GT`Xy~cJ*Mxt 6-f{URI|-.mյmBWt [`vkQchlnI&Qt?K|)e}i3۵>s=;OhΡk:WhCqA$yovI9^8;M ^Kj6qɎ>VYQ''(T__յ*d5cA>`c -m$- m#4R,SӂG_X5}wxjv[0mf{YnuDKEyX`eFqapX@w-f1Rf;BPdŨM"'6zBB ڞH^Wd10Ӆ7Qk ,B1̊w{}AJvAp3#c+$MA ?"MA ?"QQq~7.>7.E&G&VU$c($c*\ d?Ed?EZWBBTQp*o\1}o\1j._MA ?"MA ?"QEI!s|QI!s|U(~7.>7.E&G&VU$c($c*\ d?Ed?EZWBBTQp*o\1[Qt˶7 .J ZuWSUpOQݿSԺ=]KB/. eG t`MD#vO[u60`߆mFÚUѤY$?*JV"8L̄hXmv9+GbHLQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@7q 2B<|C1gIMJxŭݺ+8z(ŵ连i?jQK\fs[eԿ[Vu/V}ROo9ZQdu/V}ROo9ZQdu/V}ROo9ZQdu/V}ROo9ZQdu/V}ROo9ZQdu/V}ROo9ZQdu/V}ROo9ZQdQӵIm?rˠI=ݽi\n&{"^- r88[QʂOm+ʂ-H..Oo2Y]-JݢT9g6ǐUhxMSIw %r>~} K;L3HϧY4lK$}+&3-4jI[HUlhXj.?A+/"vZtUYo ^~Qc?(Ӣ 3?W_EA+/" vG;J:(3%yEQ+N,o ^~Qc?(Ӣ 3?W_EA+/" vG;J:(3%yEQ+N,o ^~Qc?(Ӣ 3?W_EA+/" vG;J:(3%yEU9ͦm񆏦Y:lt%yg/hjHԣHK+ 2)6ELc; =N îjcOԯ]E*GQ@ p\aі#;y/m5.n-A tlJGW.-ỷx'I2˰ pL?5k*^m'LMV^Okc%U@ \xlҹ~MN9Oo|YfI'kvB3 UXdz#sjX-q^54q@v22*A`F$-ɸVեqrȜn\0$$0at)lSJ|16J|/qgsykk%E"p.O=i(;&RH1mrR5,d9c '<;.3c;s¾pOTz׈=+Zm$K"yƊOx4s6D7vf=ݵs_J֨Ğx&VT&;c ̄d C#ñZ[k\us(3 xg=y\(:Lڤ\WOBYPʋ,2GqW<" eZT?GOQ2O*?ȣʏy( tVOQG<r̺+Sʏy(i|9]G<yQ4Es.i|<"@EjyQ4ET?G \ˢ<"*?ȣ.eZT?GOQ2O*?ȣʏy( tVOQG<r̺+Sʏy(i|9]G<yQ4Es. i|E/EvdʇB:wwoXB:wwoN)_ޛ_'EIWj}TvAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPK#ֆ[xer?"CԅΞ4b7NVB8RssrFvjmH7V{a;)IO@3J-XxKO4_%f7G2G;z_K i) rpqcO%jhsZ5 Ew@cq#GnʼnZf-֧89qRE]UFZy/t"lBCo_+|҃ܶƟ-Yke(F$68tm0r boxnoiQn<{Iv6' JF΁]x4:j^[K1v7d2@X+>j Ԇx{O?Y$vMy+v䢛PNҺ|Mlڶcr#M=tNv$0JA >@ m#ra|KY:ziK)f1p?9 @'hږ_M;]&WEK$:)ƬK0A-V+T6֗^c4tbH^3(&἗*$pb$?i_a|?/훳q@V}ggy|!csfP !y dHm4Q@20#/h 8?8)OtJ̋z+sG:VT@3VZ̮".vZYHs4^Gi;ı=*hSZ}y尷Erbz:S提Ҵ?Z1E&`UMafu܁F88ӻLX4i\HUQK)&Bcq OhPӠCyĶV,UD&~n 3m[^ $P1ɴ89RGc<}*ARY_c2neyV\}- \^yM1-5(lb(ù/qeJLImΧݽ VZ~-h|@* l$"%Q)0̡.wC cG y 8aNGLry-]lO 4F.Dj3'J V׌ tq uNT6?z ]F}o `o{B*wH8$Z:uW^Kq`ȱTL!%7QznOQk(]F}hbk~ 6W ϋv:j)I3F|Z@T3mX<"+I"0܆Vtbhu8nEhxÞ%6<,6R[}5bfc}2e$Pa;OPݽ,E<ۖ88q\ĺ :\:ޚ|ϲ+A<+=r-SMFi"m]fWah\9q<=_x_Ki! \<ˎ ƙbC ĜM[MTKPMBdLW^yTH[;J4[MmK-/W(Z̲lTq(.Ilo_JR#I6lom :s\xPG {HLo8J.,IDsBrZ1oD8?kgrߤ1]۠ZL7$l72{jmc.c,VIghٙfKO)cDad=Oᣨ7nQ[EK$ lI5QEQEQEQEQEQEQEQEQEQEQEKX%{IT_״ 'B:wwoXB:wwoQ WRUڥ}zo|%]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEF]B5i*=_?jTVV4X״_Կ+Z?,??Rv(QEQEQEQEQEQEQEQEQEQEQEVN![?7kVN![?7L%QXAw!?jo4)><Վ["1lsFwGI FZWrF\u"pm*O&E03:F@#DF9]DUI{$d.Xq8Zۭ͝Ōu4,y|2 . /^ $P1ɴ89RGc<}*ARY_c2neynG̻|9!hJ}pi-Hc`c.b enCmi:&Z=]^.-eIM1G22>݋V6mmڂgʃ##Dw#9 WYnյbS# bB| 䎼0#v^7'4P2.c0,H :>ufм۾=HeKU/H8B!6ZQG᣿xa_ dvB~͕,e&IXAo0 @Oqs7!t{-U%2ˇXu"4(=;:m׆M=&'P Yɹ8-+B-[MH ITI]Y<uDZ V\~%f"}ݭ8^ =kB ặXTeu# 8 s@QEQEQEQEQEQEQEQEQEQEU-c@'jR? ^&(ݿSbݿSD6)_ޛ_'EIWj}TvAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPztդIR6aZ_gAZ a^"RjhhJ;e(AEPEPEPEPEPEPEPEPEPEPEPY:luY:lu2QEbY܇`ѫY8ЧִTV;an$űuާ!$1#i]sUcMq<(g,!pv3 kh)uTA%~Ib?yXck6w n0=гIdH0s'| 2mx.$&He@&vI|umgOQT0H 3@ ƜOr׸'mO=ź<2]ŧ=2B-#9.ch[&>\to%ב]E$J*,e`#eG=igko1}+BaL ffK#NumqĢF=@,O 0,,q <<(n_wr9cUۓk=M%ԭ=,0o?*JV ((((((((((((((((((((((((((=_?jUXztդ0RjhhYvV4X״2QV (((((((((((KBo :֬KBo :lJŸ^nZad=ːF[0pFKn ^3D,?{L~jk~FH5k7֟{jjyl-đ\9ޣp$#t+|VjvI6n'zl噝@#w c&F~Mm.B$YO2,G8c`W=gKi^NerAJ@k[g6*=wVׂI"hdTrm'iTJOAoGHZFJ#_T^J8}[஋wCw^˦[4 H#F_)U#m*/ ]xji\C4&8Ywۻ8؎W=ͻɨBᡒI{:r9`sL/nA+w.ܩ Πdk99sK5)o-?#(ui6Z`xmKy\H+ +rGZMi>Bؾl|1ڶwmHH(6>D|}ۼ&e!uV仐vF#@RIb !UiwwVv6H]>@ȍP+s!Sk[+f[x{XiJ&jGtnHپ[C]ArUN?x:caceg:LLB)ID/͠|aHԯ-(ȆBJH!W'%i:vi P(Wc*Vo\xFmVk;M`&rw/LĠ 2?,4J0x"헉5khm]Cu!271Hߺ1p2GZYBK9U, 1_wjvv*qߕTE[_ȯ~x€5f >tR2Ma?)R$P mJF~hdW;Fb$y&iЁٸg><>(^"2+mpO䷕ܘxVBQW` ',L |yEPEPEPEPY:luY:lu2ZZ\wZ#FtFyHYdY8*˵Il:?5NetoUa `#-"7?x$QrFfBZmSX-+;nz4|`w!?jWQ)7oTX 3n r1֞4i\HUQK)&Bcq /y㶎YٖP fWU!7' p@ׂI"hdTrm'iTJiwTfW̤^G*:}*k4vWGL֞M&o?YDWO (!.ͽr7򑴒T T^Cm&%qu2ƋN7`@rėL@cl~o2).=Av|͡뺔˳DiRF2yq,ua=xzXztnvV>BJf94) i&GwaaIc &]_\=:y-Xˆ$!Hg6Qm{v2ΆvP kq܌ ן@-:Fڜ4y"t&9$ IFPOW# VP1|s}=ݽnFj\t'koeiW֣df57]d _I5YIZLd+(g0+2TɸռYK_M ^]yvбn`"rB+'E* 6@5+xm#fuEH5Y危6!vwxj 9mϪ% p(r04DBsr8=$.hɾ+FD򩜑 v>MS--KȥH#$eXe,1p,@ QM|vR?+J49d|䎣Ú7%L u ٝԱ(d*7ΑOquY6HJK|Fy݁ԏVe9r5KsoӀ Tp X@셑Xq0 RPEPEPEPEPEPEPEPEPEPEPEPT_״ KX%{I#vO[u#vO[ul}zo|%]WRUڱQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@a#VF%Hمk}kSG%{G˵KE(hQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@d_Qֵd_Q`BW:&(.J Csv&n>h39^\xoqlI4jF] .Y2nGCw!?jo4)><Վ["1lsFwGI FZWrF\u"pm*O&E03:F@#iLF9]DUI{$d.Xq8["MkZׯ仒U&c4rLIba"VAp65rgm'Oڮ͜kO 4gUD'G};MDOxUݛl(%崊 Kw^+mm;2\A鉪W"D֬>kaqus4 ?(cmlO'%:ipa\ڍl:46#Kt0dVw K1I=gykgbWq [/4d9e'# X"2]sۗ@nPVVhQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R? ^&-c@'h]E=m!]E=mCa}Tv_ޛ_'EIWjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQGЍZJW#f~j_M@+.?5/? ֦ KA]*QEQEQEQEQEQEQEQEQEQEQEVMGZՓVMGS- ^Y&]CzmnE ј#D.8ϧ [ "c0cR>+ϵM&;M]TEd/uExЁ$!Te d 1wrFgZ)9K_$<#bAzA#h]ZSR9F9]DUI{$d.Xq85Ŭuw,pݗDN SB.Op8ޢX8Kf%H5i# 1"mFAq1KN<:1ȥ nf/%/@ mq]7bna>́$5kmB]^Kk c˓ vcmȰTfm x;Z^ˤJ,5̓@8@ Zp7*ksĺ|ڝ˼z )Q a17(? \\he}B2d8S&[ˑ{A~C//-+OOӢK{ABe.<ķ awPhFlvJ$R%T[Xb1|<)=-'H)IiiRp3rFNry((((((((((((Z/OڥMQ?ӿ觭?ӿ觭l6R7O+*X(((((((((((((((((((((((((( 0IUa#VlµKEe_gAZ a^"w`˴QEX(((((((((((u/ (Zu/ (e!+oi1ofk&&t la w췦WrEoxPm`#kd%AGI ޲E}܇`ѫ[Ճw!?ji Š(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEU-c@'jR? ^&(ݿSbݿSD6)_ޛ_'EIWj}TvAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPztդIR6aZ_gAZ a^"RjhhJ;e(AEPEPEPEPEPEPEPEPEPEPEPY:luY:lu2zkZoC Z;G 3[`. 8$c8+δGI4)]GqJZwrFoV ܇`ѫ[դ6 (AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPT_״ KX%{I#vO[u#vO[ul}zo|%]WRUڱQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@a#VF%Hمk}kSG%{G˵KE(hQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@d_Qֵd_Q`BTpAv$Pġ#5 `ڤ,C_0խ5kzİ*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEKX%{IT_״ 'B:wwoXB:wwoQ WRUڥ}zo|%]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEuq,rF*cU)/. (9{ kW"w.Y9{L=EkhhX|'Z a^"ΎEUQEQEQEQEQEQEQEQEQEQEQEVN![?7kVN![?7L%QXAw!?j`ZbXQEb ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( M]Z/O!;z۬C!;zۨe+*R7OՈ((((((((((((((((((((((((((Cz-^oFjh橹kOOdKXͯ9\ipA[:|'ZP@ ;,/6)Z2-+H|?:wG$> ;7`FF͹"Q ;dKvtW1K?dV ܍k>`Z)K]m?<\u3~t?H|?:w^=e7ŸR%,unV~S !pvEH ,ܪK.rϣ[hҫCӿ ?!gyΪGR,i\0Pkq IDLee-%M wJbYF _ 8_J~gCӿ ?!gygUdgD1!V Զdt#`91l>.;Nȩ<;Ie0^y?p* ?NC(ߡ]o<9$Q4ND_4> H N>aU:}6(@J\H{,jvVGCӿ ?!gxƁ}o5_E*:o%>,d*'!p$5o +lm&HSxvR2rʸ[Ӄ t?!?3~t?H|?:w^YJ{oY??1Ouq]}%wl`mQ?+`2,4 fUgߡCӿ +onT{$> ;Ν~WQGK~??_H|?:wG$> ; nkOQ3~t?H|?:w^E/֟!g3~t?¼Mӿ/ẛɸH'XI$gXSxFtGf֔r+ԞՊh:ϝҩʿ?3~t?´4OAudyU2J`sZ GXèƿ1aL῀</"1wD63#wNOֹqM 4'Rm[߱ mJ# E$j(x.?Zެ|VXlK (AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPT_״ KX%{I#vO[u#vO[ul}zo|%]WRUڱQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|Ǫ3t׿~ҽ ?9nZS?w b䓀.'kM?>u?-xޡ4PJ $uO[ը{ |9v5G7@cct8#Zs 7<|pzu銛q>ӄҍ.ƬsOzNkZjT+gKi gqp-op!eBŊQ䑀4lUͽ;^*E3vѲ]V>Jdaak?揵@]RoO96Kx-CK[Aq[.v =~>]5(mp4{f%&%_ `m}q>r{>Gks~)8ikc~i:Id=l/ccs C@r j-;]Ҵ۫k-) Lc`H6}q>֟XVi]d74}G{&y ߗ b${Np;dؿ]Dz3O` +apR}q>n7.gK_RdvGͲ}Au.ہ>e?Ca++^o>E""ǃs/ߚ>R{y]k#/@G}/L9+\_4}/ߚ>/C/@G}O>9+\_4}/ߚ>/Cr5fc cً.N|NGN*_Q)gdX#>b p;V}5?Z_(`Ŗ01'k6{WKWm <.E=q0Ui/Lbk__ O$Iz"1 $?[Ѵ #] aY`B>f:8~>L44mo;0iƬe)^tQE|]X7rFoVؖQEX(((((((((((((((((ki?Wj KA4DGNGN!J>?*JTMb ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9?FяTfWF=Qz~sTܵΧ_%2oO?hd[gnۻktOw>ݚ'p1{T`%֓I+"A ,Z[9 廾.ɶ69 !cuqUsi.>:opc#,!xM߁`ϫ߷h?YWoש*FK eً-:A'7>@_'9Zרi=Ans#626ꇓeϫ߷h?YWo:]fK۝5Lk<|,؅U`p8$⚚[pNen3/ g v3sYxc^9Ur)wUOCxc^kXaE_)f UH/y}r5t*L[I~ɶ"吺 X.\mT 6rpNrj~,7خ"ݻ1N`Fݑ)' >A[g}_G!&Te ~>~g}_[j#/cSEoϫ߷h?YWo?̃`[??4}j 5;4V!&CMZ=N ~>~g}_G֨2cSEoϫ߷h?YWo?̃`[??4}j 5;5zR\+H$ *uSIЃq_?t0~ggqgWV1nSf$UˋJPIKzrhfQ^aAw!?j`ZbXQEb ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( M]Z/O!;z۬C!;zۨe+*R7OՈ((((((((((((((((((((((((((oF=R?FяTSr֟:~m_O?mЍysgJjQEaEPEPEPEPEPEPEPEPEPEPEPY5ۏZ3_QKjQE%]X7rFoVؖQEX(((((((((((((((((ki?Wj KA4DGNGN!J>?*JTMb ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9OoTeb7BZh橹kOOdKPs@6/|'ZßF3t5(Ȱ(((((((((((gJz%5(.?Zެ|VXlK (AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPT_״ KX%{I#vO[u#vO[ul}zo|%]WRUڱQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|oTe׿~ҽ?9nZS?> B56:~m_.}}] J(,(((((((((((+/fqRk=I} J( |VC_0խŠ(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEU-c@'jR? ^&(ݿSbݿSD6)_ޛ_'EIWj}TvAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP={'$$>wje\#F1[#?uuG+;[^7.jOOdKPs@6/ח>tQYQEQEQEQEQEQEQEQEQEQEQE3_Y5ۏUQRQ܇`ѫ[Ճw!?jk aEU(((((((((((((((((* KA5vki?@Ot)nt)n MJ>?*JV ((((((((((((((((((((((((((oJoWF=Q^7-ijOOdKPs@6/ח>tQYQEQEQEQEQEQEQEQEQEQEQE3_Y5ۏUQRQ܇`ѫ[Ճw!?jk aEU(((((((((((((((((* KA5vki?@Ot)nt)n MJ>?*JV ((((((((((((((((((((((((((o ꄵ~>ѿ7ףGG5MZ|'ZßFS?> B5ϯ+EVEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@en?=jV_G/ETAw!?j`ZbXQEb ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( M]Z/O!;z۬C!;zۨe+*R7OՈ((((((((((((((((((((((((((F=Q^7z7J(橹kOOdKPs@6/|'ZßF3t5(Ȱ(((((((((((gJz%5(.?Zެ|VXlK (AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPT_״ KX%{I#vO[u#vO[ul}zo|%]WRUڱQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|Ǫ3t~Mkѣ#?>u?-C#SijΕԢ+"Š(((((((((((k+/fqԗԢ*J 5kzn?Zޭa,(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R? ^&-c@'h]E=m!]E=mCa}Tv_ޛ_'EIWjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs~Mj|oT%FjO?mЍMΧ_%|9 ok˟__:WCR( ( ( ( ( ( ( ( ( ( ( ( zԬgR_CR((C_0խ5kzİ*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEKX%{IT_״ 'B:wwoXB:wwoQ WRUڥ}zo|%]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE7BZ{kѣ#?>u?-C#SijΕԢ+"Š(((((((((((k+/fqԗԢ*J 5kzn?Zޭa,(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R? ^&-c@'h]E=m!]E=mCa}Tv_ޛ_'EIWjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs׿~ү^7z7J(橹kOOdKPs@6/|'ZßF3t5(Ȱ(((((((((((gJz%5(.?Zެ|VXlK (AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPT_״ KX%{I#vO[u#vO[ul}zo|%]WRUڱQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@7Q1vo14Ep^j o=LjhʒezguZ6dJ2Jw:`)gQpZjUd.uݸ;W5_ßF9> B5˯ EVeQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@en?=jV_G/ETAw!?j`ZbXQEb ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( M]Z/O!;z۬C!;z`%f$ř-HC6;+iHK{~,*pzV{GcGe<Ip9ڞm-.[RM*)ݑi=(J)IǦQ\t-&wW-m[PL}p0&qFgAҭR{MIx54'ɖUW>'Q'yErcǶjVej[w_! ILBF`3 Tkxoپvc}/wɿfu'pĨ O CB:#&f8"\]7[o+c8ݑǞ N:SO.S;&0}{S?Uh6/e u8Ӿu 8}Upy<‚FP~(nEW՗q{SwNoJ5¬nČ cX;UNG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG?_wi|<5>NG8$ *?j_. [5pNRHM\P"GS$+ 2^A;5+7vE]% w8/Y9k؉kjyc̙j]؁fMR/Ž ȪZ_,$akwϧZOHlu?uFk:N*ȷN/R%9SNe}OԬM]JJ((((((((((((gJz%5(.?Zެ|VXlK (AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPT_״ KX%{I#vOT=Q9o,nR]Di8I Ϸ .gջHdHА;xSFAWued6jKkqhdZOCL$N2@'%ūjwz^Aez/Hwl9H]8E;FAWu4 Q䂲Mݔ,x~-ͅWp*"P6A*7`\q{F{{cYCE!gLVʒ؆Hd'';FAWu|gS!_oM- Oi7 pJʎ0@xvI/._R\'I+mry2qw_; ݡ ))p1=bH@i䗋ep2(GGH+B;:$Y$$NӰoZGR*ȇJ/qobf\*KFq~ Տ;4i_bjҋ+0 Ɵ]HugNvmWin e?ݹv*-I s㐹%ޙa?Ə;52Ԓ)Sz <%Ʋ?a?ƲeoO/;4}?焿_[??z <%Ʋ?a?ƎfFxKoO/;5a?Ə;4s05>ޟ_whz ;4i_񣙅GxKei_N,O>ޟ_wk/NvmWhadj}?焿YvmWhӰoG3 #S<%ƏӰoG[9YoO/;4}?焿_[??z <%Ʋ?a?ƎfFxKoO/;5a?Ə;4s05>ޟ_whz ;4i_񣙅GxKei_N,O>ޟ_wk/NvmWhadj}?焿YvmWhӰoG3 #S<%ƏӰoG[9YoO/;4}?焿_[??z 񪚄Ubmm.s:U?a?ƜjJ.N)Lo$[+s"yDqdZAVѦdvAtj`99lҦӰoG[x\N)ܯ[OiE f9C v##U?a?ư4-V_?mЍZӰoY_*O{~(Tgkvߢ?5o ?U*GAvoX* ~E 7 ~GmG]VmG?_߶QhH.+?_߶QQ⨴fQ(TZ? ~(Tgk-ٿE`gk?5o ?Uߢ?5o ?U*GAvoX* ~E 7 ~GmG]3_S?_߶U:H2 yۑ'(&N((C_0խ5kzİ*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEKX%{IT_״ E`ėDfK5x\䀎+$)^9# o]͏w?-ꆫ?\ԭnP]Zyd@(BXMYmmbܖ!Iu`Ahu-J""$*[nvzRZ,ZuֱØjE7@8nmm|3]fE*Wl|x"Rʺg kOqwqo47Q5kOm,s#0i,yl~ކ wn#ޏ 8x%d`r!r=7Ò\HjТƪu*€:SxSRt;?uˉhckLJ$#9$n޹xvzVaҦX7N$`ebhVrUJ/_[֑)IMt _3h@tI$<}0mNŶ&jo2^HyF@A|{x9=Tj }?%_<>=[<hڼ|Ʃ`5Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@UB_ :UdpB"Q@.?Zެ|VXlK (AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPT_״ KX%{I˻[⫍[nis] 4L Dl g:Waw6?跬_>'%bR+\ $`2~֟4;KO3ΎHqYp]@n0~RqW]oévY S6#*x< zj0Yksct-`3#f(1D=$WYsJ`Ə xc$ $灜U%<CZ kei6'¤h2BVgm%;+1¨Ga?&03ȫ^,v~ioijaqh9.79S\uENqz6.mZ $/Ȼ-I,&1TM:k"ӭQ'' 8[Mg9=Jx$UKWtl% #*{+ss ?uohrܴ: H8tUR>g-{]??ЅQZuEq2xWnewZX#]k *om2ph~֩u VgXy&;9^WQB,QA*2rHju?gOogkiû t+Լ]pZMkao\ڷ8cr"I#49rŶ6O2qZvop5.Ym&A–n,wN 0?qSTa+xne&Y &BC+8TWsM z~Ty|1s NFq8$,4TE 0AOUg`2Mqz_& ik)`dpI.e#W]* 19 t~kJV6\Ʊm2b۰fpځjAfybi?5<=o-C8S g}o~%ȭ!^pGPG)r 3i?NByc͍vtxY&͸B8'Vwf(,EhKQYѢD37?QGf+F9\,Ee(As;s}o~hQYѢD37?QGf+F9\,Ee(As;s}o~hQYѢD37?QGf+F9\,Ee(As;s}o~hQYѢD37?QGf+F9\,Ee(As;s}o~hQYѢD37?QGf+F9\,Ee(As;s}o~hQYѢD37?QGf+F9\,Ee(As;s}o~hQYѢD37?QGf+F9\,Ee(As;s}o~hQYѢD37?QLhX9`: jVN:ۗQ!fc$Ri KF:5ZN5knAB9nN/[[ZTb8E=}, Nh"Zus&Djs;QEq]X7rFoVؖQEX(((((((((((((((((ki?Wj KA4w6?跮O>#5xG./H%0,H`d`,y>loI]a^[ڽ<ǝ2!9$cҰ(1yY8Vv)VLYUXIݵIݝu1wNG #pvct$r;VX״ +0Z]ɸ;RF3jEXs;Vai,Ɠ2˹]gU<>hӬVDDIs1CI֩e`Ҫ}J{TNH-p+jRYvVw,,ۂ~Q܎@Г0-j̙'d"r+>f9??z\Ջ]CFE O=Es)[#!ҤH].̄|6 ְAs_ɫoCÖ}e>u-_?,yۯ9d7p8ʾΗ}inB\4Vѓ1ϱ0@  JEjPk;4 e*D%ll'V>}Z=.u bx,DD M@U 2;7"*<[F ve=pAl3l ͻ[Auå&F~ep9W=g&Ѽ;JMGN+.#m76#bm](cՃ%tK4Ϝ[C g*¤!e"ӑM])g7vy(??T2!/(ƶ41k`CqfB=|rJP:ȿ js4h6 5kzn?Zޭa,(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R? ^&-c@'h.>loTv/^x8/"IbـBQKHI!pT@%~?4u1[3dsw G L`I!z ((((((((((((((((((((((((((((++TrpqYS=]/-:Vʷp?2ꖊI*,fsPe_hj[ ZדīR2V(, 5kzn?Zޭa,(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R? ^&-c@'h.>loX*[Oa'7F'Y|y2J;Wc]zy5$wouIQ>.[va0Ȋ!|Ϗo 4hLTf+#ڳϱO,& $` ˟hwotI"]$$&_(yVFHlG`ϗP~~cDQcG ȅʌtOT]Csc$|I6˫Q+xaydBZ5#ʑpܠ>m:HMBx$h4hd?6s8BttI㻸2&2{n Fw*6PCTGG61N XwNHAb0?q|BGծm>$eը<0!-őHYXP6z=~)'.o gW8 g˦[촗,W$8[;b  `wsQd&Qym_Nt[dľfLadf`sƽ^KK/fa#mvR² fIʞ3t[+=F{wp/=̓l rv"5$ `1EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVe/=Tt":[9{Ӫr5mEg&fk~d[Feb-IOZN# :lأQEs]X7rFoVؖQEX(((((((((((((((((ki?Wj KA4w6?跮O~%l`/c4xmx& #FWYw6?跬_]Ig1it>^%E.%i#F?ǩ%/p<&=(mK(QS'@G%{GGtO){nȳH`H KA:hQ@W]uۈm۷1q|V*ӭnDnݸq}JXw: S_7q$"6U ꇩby?ArQAoNS*v%[&ycI9$I&Gº%aom{o~cNy]$an(*L ~y<No *xVVEKFKt(퍙9pnjY i1IY `uz⣲-:LsȀ*-c#p.co\IL,~~#Bl¾ZQL{K{ -gXTߐF V?Ϫ_I4èk>weo co%`%g%1J s%Ѽ+oq qeaI*(|$lwʭS Z9^y=C=K#3+ .ĒI'?I6kU 4w1"?3iGyV@ 02۫}:k#u4<2j};j}:䃻gZj*ѣ6zU{|:) \Nr\o -2V˻1#gsylNw6v+^It_5TTQ2S$2Uz±Kuq{"KG9ʱD݉xm }G uTӼY"UD |_1`T{((((((((((((((((((((((((((((*Uʧ7ĀkN;&ҲoaCZ[uqoX>nC)|09ZRM-A2j(,C_0խ5kzİ*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEKX%{IT_״ E`I b@2޻!Xb!|o]͏w?-꾡麝Bt勛i dHʱL32+/VnT%DB9%Wg(8lG%{Gtqi}uw pȏr"UATA<M A!@#!LEU(*ӭnDnݸq}JUflv%vm\#:PF)9N3çCF)9N3çC(__K`4e۷(۷n8cjAҝwk˞60Y^#ѢӭĻ"R1xہi|E4II.?At iѽԗ}4r tc?3X 6:-)mmHugj>{m*|!7mNj{LMRQ "$SȑGPD/U㚋 ip^nmHlUt9 d ,>m=h.?%Ztsj ˦LB;xq㌍F'k]Dc7OjM,"čO1+K. CGVzŬ1$7"k腊;]F \V5o.=. D]RU9X+)T"`F3Yg>-{ID01bw* Y"0(wRH{_IhC9"0K]'˽Flv+δj+EjV{]ggS"$" *>xc"M_WCQbI2k+{h] sn=/>ѽf呦Xdnp (êdm G'ԼUn~rD@\Yߛ͜0 CEpx#p[=˧|ZI!BBx\mh |u<5[eOJ/;Bo8_/?wfݽb:Z*ƗA+?GƗA+?@h___]li4li4vJJ*ƗA+?GƗA+?@h___]li4li4vJJ*ƗA+?GƗA+?@h___]li4li4vJJ*ƗA+?GƗA+?@h___]li4li4vJJ*ƗA+?GƗA+?@h___]li4li4vJJ*ƗA+?GƗA+?@h___]li4li4vJJ*ƗA+?GƗA+?@h___]ZV3 p ?:JN1ۨ[7qnure9oL +tw_)#g8CZ/ag!ȿjtenE̊ɒO8,fmV:Lԕ=zu{Һ1-{;S1EWu]X7rFoVؖQEX(((((((((((((((((ki?Wj KA4x@$ z[6w bIxβFV ƣts3*zfD\ɊAU; Ma}ȣx %X&]W*S\Z-[> ֬<]ai.4[=Af{䪹?2n\d.=+Jf_H8] ^6j2%gxX巚$Uǔ< 8.Euj?`(kߵaû>`|FH$0?t--[V{G4Pg,{W?sk^ MnR]l P mVaJ!t @4^J(T62vt=[MTKP}B-̦T^9d@;Z?mz4MRӵkHitYyE0ՙ rF%A`۞ݜ}7zh5mr]6՗PV3ܦOa㽋OL 3%m~uzeBi%H[djʹeAl`PNH9|[Eq"aERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUY?+o\%УUVO (B-QUg>߱G,(%I#8kpqҧҿ+o o7Ug>߱Qopڻ$UU%}N==ꔚWmMҿ+o o7Ug>߱G,)gJ|)WmM,(A~,Yҿ+o o7G[S ?>g>߱G; >Vn}} bYϤQş+ti_ϕ7`H?بžnڙU0U H*=J9X>Vn+u[}} bv,i_ϕ7J|)VA~`H?أ?WmMҿ+o o7Ug>߱G,(ab[S?oYϤQ ?9X>Vn+u[}} bv,i_ϕ7J|)VA~`H?أ?WmMҿ+o o7Ug>߱G,(ab[S?oYϤQ ?9X>Vn+u[}} bv,i_ϕ7J|)VA~`H?أ?WmMҿ+o o7Ug>߱G,(ab[S?oYϤQ ?9X>Vn+u[}} bv,i_ϕ7o.n-ltmﴱF3ϰYϤQ ?9XKvxUyWb@>e[CYϤQ ?/jvAo"D N#$ϰYϤQ ?7Sѿ\fA~`H?اȩh߮EO3S} bYϤQȩh߮EO3S} bYϤQȩh߮EO3S} bYϤQ{x#UAPAḖ%M>\mF1S} bYϤRnb?#M]\A~`H?آSB4ik`H?أ\ޢ*%'`)e[CYϤQ ?o>Ee[CYϤQ ?7̿koo"2}!w,(A~7̿koo"2}!w,(A~7̿koo"2}!w,(A~7̿koo"2}!w,(A~7̿koo"2}!w,(A~7̿koo"2}!w,(A~7̿koo"2}!w,(A~7̿koo"2}!w,(A~7̿koo"2}!w,(A~7̿koo"2}!w,*;[8-p6-, gҀ_ϵ7G>E=5v_pqR}} b /̿koo" ?>g>߱@m Q_ϵ7NA~`H?ؠm Q_ϵ7MMHwHJ6`2z{ԟ`H?ؠC|(/}} bYϤP1e[Cym Sg>߱G,(e[Cym Sg>߱G,(e[Cym RGgf_86sҟ ?7̿koo"2}!w,*9ky..!HI$e[Cym Sg>߱G,(2}!<)鲼6UIFlCSBzVYbO#>X ̿koo"2}!w,(A~_ϵ7G>E;}} b_ϵ7G>E;,'t0@/̿koo" ?>g>߱@m Q_ϵ7NA~G+ʑj lUTl8e8 C(/}} bYϤP1e[Cym Sg>߱G,(e[Cym Sfm<ƅ:QrHw$ o>Ee[CY٠O8?Տ`3ޟ ?o>Ee[Cky..!HI$OYϤP|)t4Š$ԟ`H?أ47s跷-R'[u, <(X+*|&V3rvz"hۦ8×e% ?5|5k5ܲu(cw8E@y^>TQǧַs2}Nj:FMν2>p,"RDea͝kS]@ŅB7+,6qITqY7  qc\ ȬrF7AkzϫM֒iN|[hAy?>_e|I/\w{]&th ;}8E pB=rP-%!}Z[ BO!"QcP ̟xP;Lto[iZ?9 ]E,ektd%_'rp#I$#gLuAcs>5W8p(P30n351O&Ltojޗ/}O[X-R3Fx@ x4SW3^iFTm} xC,~_L-NcAy??1O&WG0}+Y4ax:P{'t%.B0nH,r1PCj3Ȑ Y*s!_0$_6­BR;;jkYfS4'ɔmrß_O ?4_}9 mOUU}A%ԛD-U{s) ;k-t> ԯ-֫ebn0v2$1GvXd8e?'G&:soKnX_?'G&:s7h/Lto[hsoKnX_?'G&:Zޗ/ݢ1O&Lto=/_yEac_eV&: ?4}V?7h/Lto[hsoKnX_?'G&:Zޗ/ݢ1O&Lto=/_yEac_eV&: ?4}V?7h/Lto[hsoKnX_?'G&:Zޗ/ݢ1O&Lto=/_yEac_eV&: ?4}V?7h/Lto[hsoKnX_?'G&:Zޗ/ݢ1O&Lto=/_yEac_eV&: ?4}V?7j#Y_?'QxAX~˽ dc}V?>q*E Z$QEDO޹bMOV6^Ve 1XaNz'9Q'I ?4_22"1VVgc.fmDY!2/Qˋ+]{봶HkV)I[< vwELto[hsoK(k'_3?3n&—R,./cJAb,цdflcqLto[hsoKrŦ=<:]/!.U2`ͅ'$+u~ֵb 9.77 ΚM"3su?'G&:jޗ/:5uPo4>F-Ej\on\dY[ qvڌexoOqysy[+O7:Zniu=ZM<|GInߓmt??'G&:soKrU xDqXZHfX_e ?4c_2R^4=m^kt.&GǛjH@UK vZV=oJa"S4 |6{?Lto[hsoKsv'iJɎ(5+m^՗i$TѶEM_XNuC̼,BkKmqnFM2m(\?'G&:jޗ/{\Y|j]I,gT_Y@_\ީiK4{o i7cK 䯚cG+"%d6S;!ۏiK(<0Jӓ NaDX}j&:jޗ/|MC=F\,h֟V @Tc!TRB_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU#_ Ty?U=/_r9@5@'G ~oG>_RU +P((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 4%0gVk3Ocڦ\A%"3|%y+3F7 O0 Ӯs|C&542Odm$YT oɩ FN"-S[nLm>PRyNI:-2 8aVIyI3Wc9%9xҡ*xk.^?fQٱ͠-/:m,&9Ǖ(W|agoBn-&q<5e[%F&i/V&fU mP `GQZxbM"-Jl5P$0- 2,`%_'56]ا|XdXʟ:7qguVaEy"좳FlgX[̹! *8H|]Xt\4+2Ogi\G5VK$@D` KwP:.aOkEzJDy~ԔPOmCH쀑CHm-x!̃`^}jj(yLoHH:8IR4#e(((((u/ (Zu/ (e!+cQHSPa[kFPL(v&B Mo N6?f6rIJ;U F01Y"C_0լ^XjZan91ѮTH2x|Vu+H.bod@7ۯ5&HԯrhZraV̘!p̾&8!iiZ $LT.~NsՏN彵f;h" X('|AˢY4_I$<@;F9YsG~7Mewu2L?z[H1dRS* 0mH72Ɨz_pڴw3m*3F^p0Ab_UӼ;eo <닖y (d q[^I@{yRo :$FnDsaOߤ׽d֚];ģ$#ijn"%2KJR U !uކҳG^_e6n6&׬Ts  !y$($srcnxga#w>_qu'4ɵoZ]fz7Z~鮇n wOY\1Pm^6zmmZtdag|"ʨ<9lq˻7ףKi-a%1 9ܹ\]Q5 s$I*jynuS_HSI.k)%].!ȅfzN[-߈./:UۈE<1-őq!#6 ~dk,sB((((((((((((Z/OڥMQ?ӿ觭?ӿ觭l6R7O+*X(((((((((((((((((((((((((( 0PK3`-Pictures/100000000000032000000258D4442133.jpgJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/-B[X>Y\h4;2T0DQǧRs'1Xb 2HuvzpK:U<复uP_o\x?y^I/>nZQ{&*Ko)R|Ъ2G)Y~d<.5ۘk,6֫+iksMsKӿqŒȭߡG_m~Jt1'Xis!p pH3׭VmVKj],~i۸p3z#VgR(IߡG_m~^Ӽ/֩%ݍ8H2emFXϵi6oS+A}([FWҋ|УJ/B5;ɦNXN%HfhL0_v<+5֩-^3 #I=1W*o䉍I]&Wҋ|УJ/B4$ĶYKy.7r,zO7ij6fKG3(2C)댏~Zo_{ +iE>vQߡQǡjKo|@5rHF@'JmƍZ[6m2I*#{]徤QϝiE>vUk2NcskSωpqQUj,М-4;o(ҋ|Ь)rQϝiE>vVer4;o(ҋ|Ь(AiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~QϝE9M?( ?;o+29Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o)?K_+7)ZߡG_k~fcڌ{QʇiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9ME*3C$еE~{6؂k£*F-u߳А+Ԝ&4!8&̓ߎ0o9U& CZU%Y;|ϡ⥸ }+KBm%}?㩕ZW]"M&~iN޲[t{m~Z.sf{fiZ8KBO;Y-Fwswn'"av 9AZ6+[_ﹳSJWoٯ_SriVtF\gvێwgi=O?o9ZOvN&3d5m2Y 9imHdS[>VeT➗ߟe E/kRM+O3}VAZʥRX ]xJ3]tt(m.w`O8 B:y^mS3L>"?':fݵi -O `R-,演\.O JzqY>ujԝ.%RDsGO] 'Ū?1URj5*(- W5TV8c RNNO,1]zx-2PV3y#& ]p1/ҟW? &/*#ŧ`bUL ʬti|ٓXhV^iZd7r8XkA91E@# '$p2xb Х}u H[]+i syY?xb#ſ?X|:]߬z~175{Bta^յ8tLC!vyq@#p)KSVJ6vvVw'g)o#3sG&/*B<[@s1U%onO[cfίM/jhΒk^)Be!Xy`wIh.4%+Kˑn-I2' L_U?cr({eemkz>!vk zUŕ r=:WAxHaiFi\-"fGf()83Xxb#ſ?ZVX nu[LMZ4Z`D֭GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gh tbſ?G~A\O?Gi<]' -1?of/* އ\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#>xa?wm(/;:̇19JKFQdrޫ^!v.ә^dg}ڸqX5KZiFާ^h/zeoGAxE <>NGct'ݦ[տ:|-_0)|e_k '0<: bp i}\ٮ̯cUI˕m-ŕoJfYU0ڧK 7T۪O$qĒ66$Sޥc^]<}5 "+_ELqt{P~ΕY/c461MPFӑN֬4/V%ܪΟ-V?d] _>?+v}?6sRx̑|_;`^'Նdwo>*)a΍zsY-~oVk>VWlqOlۀnW}Xox>?"izNhrk h N@ø aq5*U%vƞ&:Tc$.xC䮺Xa*,66~liM2+ȝ]cFAz~ ǎ?J.3~\wh0Br[ :;;nWՕ@!ʳ"ALlť]˵u.omVI#kmZĚ %ݢbSK6 " wdQvk:am@ŷi\@, Vqt"E{k4Jx^Uvʊ;Vc3GOsj3F.$RCXؠ` h w=QeQ'o!i"_*YC# ]IYkWH!9EU4բueF=qѠ E\|* +FaZiw6/%W]@/W i[4m&E0q4v%HF6/2@fǡY.yH5\4wwu`;s +OEDXbR2|یܾ2 {%{whpT  02 I]ꚅŬ|o;F#۵W@ N2HPnӨ-zͩ<%XB1țcoɠ /LV 5OUF9wD~Yb8W'PR4[9"{xʫ?確*џO Cqu]B-L&YCՔ!psn+hsEF;6:\!v]CRI48NWK;;C"eDŽm#u )P#TV *sbv\$wWZry k,VE#YaB#I@F4f(0((((((((((((((((((((((((((((((((((((((((#ZOuINLlWDI,o8HqF^t"_*xA_R xȚjL Y>px>gUџeDUeDUq/5h7swsrI'tݫ^߈ї/+~:iM^ze>eߵ??7XaϹ}=u/T}U?PI#U IL9??7Gܿ=u/T}UCyk~#tAѬlgd@ե:rKȜ9UȿX?/KQX?/KT?؍@/tb74G'17`/G`/Pb74 G's}T}U#3K]E%wu(#P ~tX?/KQX?/KT?؇zgFf}|ցMX?/KQX?/KT?؍@/tb74heDUeDUC M}.}s,lwFIK9eDUeDUDtq+oGeߥ /`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/Xr\eC{mʪI#cGⴖibMVm"g$+dTo+0*NӁƙT}USB/I%mN8Z|G :!Qe>ekXK)& MQ[q"98qg}T}US}Sr:"_*"_*_J/"_J/"VAX?/KQX?/KW? O|EQ O|EQ>e>eA)>A)9X`/G`/\/%?G/%?G+,ݗ%,ݗ%⫟E"(E"(`teDUeDUsh_Eh_Ev_v_}T}USo/a}J")f"(<ɢv_v_SO֦[mN[U `=;gX ԺD[F2@ۜ QIX?/KW|q#ҶFokZH=Hܧ\FW;°%TFO~/x?iץca/%?U?܇^}=3^TxD{6gdU;H8,dk~ dž?Zo&H[i]7Nʻ3 ѧVoЃۻ⧓qy6Nom1 nɐ+fid~EtQOĿRyg}0%15,s4 Eu\ y||=y5tG*SGJ-jyP&/w6|ڦ2'a-߽\yRJdH|dJ'{@+h?4Qhb+U.x fUR|"C*W+g y||=y5qыm'͟9_FW^7WKb诣?{@+h?Bg|>s?o?Ə ]Ί3o?Ə@> ?)v>#:+@> ?{@+hХ_0诣?{@+h?Bg|>s?o?Ə ]λ }sEضoӠs778y\?o?ƦXRVi_13NϚv;]DM L<Wkoi~&ҕlng{kH Wib݈+ӿ{@+jxB[qJX2iiN7]H$¿tx6mjm pcfQ ,EnvYXiFiDb۲{nw?{=k IJNKU$ռ[>g[M(ح-5H'2͈BΟ;n .]^/WY䅡b+.8xM[+|F^sTyxq'ŭޙ+xG&Q"+؃zkߎ$)4<4@r+ CkK$n'/#yfc8|;yjW$[8J˹$I!9q\׼?Y72}^Whdx#d3|Γ "2k0 QFՄH]];JNZtZ.%q&-%`GGyL:L֫5DF6ͺĒ$M, P?@*[{KG)e3,*<(fIPK /XP}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /I؃2sL:pN2@.z7yүL}08zTf?熧|]VىlpEcM7eKRJ"Iq7DOioor&&t0p m<0F+6<5?ꏳiS.s vJ"t \.-0eDQ@Bp[xRɷcfh'0A?T@Lo iS.6<5?`9X^w&'uqqh"DDÿolm#xjf?熧|]Qz*ٴT}HuEEX6<5?ꏳiS.f?熧|]Qm#xjcG>ͤ OW}HuGٴT\ UiS.6<5?ꋁ^m#xjf?熧|]Qp+{觸ici$fE\rV{-Q=(IBa"| ռEi; 5_GyN ovX ۶.69cZ7>ͩϽڟKZRE,iƻkK$7i7L6_9~mMC^"V#Ҡ]6o-Afs@r$ 1;Ls6>njg->&5XSEvrCmlgY`H[Nyc :ۧKkژb6VH#IrOjg-6>n(=^?ٵ?t}S{? o7[QsڟKqk4^Cv$n` _ZݬkArǰQEQEQEo%hx$#E0-qr>[Pew@XO+KRmnn8jQ|8 $Pﮊ#!ho呢U$Sl.>:ԭjrl`iYT\YZD :>8`׹}S{? o7Gٵ?u˯K,4hC]wsI٥w]\- O k]5plQ13+KСSʚ9c5ImO}%f[rǰk6>njg-b9c5cS{? o7QN/cYfވvNčA[;VXr (4 ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPQZZj_iEpIf2WntϦYd/zŘZ5\Z^&{Gm$7h[ NTAN.ٕR]%ޣԋ!W9pikvC.I' 8$ƛEv 2ƙA?GƙA?Uh.fZ?#gh?#gj{E,_glR5+ 5i$i$IEvVQEdXQEQEo%vğ:GI]nF}B(0((((((((((((((((((((X#_?"v^^,i?J)8QEIAEPQZZj_iEpIf2W*Km gGK8CNrV y =᫫ l.5^Ky m}<[ϯ=iUE؛17:gey h$(d-&kT,hPW=)Q`l:LZ{x10%Ij:l IQAfbx=KII5 {E,_glglUhkcL_cL_Q`-li5KTԬ.,(om'}{E9XQEaEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((?t 7jO? ڷ[#>ESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVF,?Z{cIUY?봟Zv ((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)((((((((((((((((((((+#_?z}=ȱ]׃*׬Ox?ҭz{;QRPQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEֽdkrdXkE'iVe=(((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@NaWm\ISatVdg(c ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( }^5a_C@zO`2,i?J"v^^ETQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@dkrYܰ='?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatWo%vպ (Š((((((((((((((((((((5a_C@z׬X Ox?ҭzȱ]׃*׬QE%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^aESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVF,?Z{cIUY?봟Zv ((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)((((((((((((((((((((+#_?z}=ȱ]׃*׬Ox?ҭz{;QRPQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEֽdkrdXkE'iVe=(((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@NaWm\ISatVdg(c ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( }^5a_C@zO`2,i?J"v^^ETQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@dkrYܰ='?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP#jkh0RRVTy['jI'YOk wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8Ok wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8Ok wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8Ok wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8Ok wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8TJd9[k 37eM)?/G* hЏx_MXϏ{]\UWKKkicr:ve\c=73IfM)&t7ݍ˟3gs3%ܤ:ݒE@L,g,h'9}ArhЏx_MZKqqk]x@˵*|D )3$Ӯ~f=۱ sc޸&s{4(hG9?Hc3nhAPLD 0l9ܸ>+;^Yi AqɷgPр2ƭ :vN=?<#m^ޗkI, ƫ%K& +bHBɌɬx_W$Q6٢T.,T}G{Z;t}Q֟]UgkBo dbO.41Y@Pq _Aguqqo{mr4&_-.]"R0pH:vN=?959h-[;_I .g';3v Ph[j4&\. $3pbWyʪ@:(ӨkOo.?=RES{jevB33;BRνu[9ՋƩoj(x8=^QiwDI9xnb1dysK%~ۋnնscs3i#'o&m }Ʋ5/G5q:OO7B;xe2+ ܯ+FdbTl{uq.}vP$?f<6S$q{ڶ.|c ޸&sI.^ǻv6˟3=73IףY_W/qÖ1iE Ӂ% o UB> Jc_ѼA .YG%2)؊B]ɂw]}vm[o>f1zo\g?9$_}n/cݻVϙdrϯC%}ks"Re!Ѡ,ݣ1%Iexpr}Qv5{y頝6ٗk 0Fs&s߫l4ӗ7lB9Ž洧Gk5D8+?FbCcLNO5m5rV985 ;X 'dCa].xX.զ1̇qs' o?:v~h2`Ҽ]H"jA57KyaJ)^ZGz?n-Ⱥum#\eXbH{%:vN=?958RDy"[i^O+ڈʓ"̗rrK]l!S4)S=V4",qh0@2j EVeǎHd<*ۅcsqLnp>9C[[nېHPpA1LoX,>nOmnz1$٬6%Eye܉ͱwY?Է\cd ~"{b> n96XC_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&C_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&C_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&C_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&C_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&CsƩha6o6ݻRqt~_D؏笃[1qM5Ggy|ѹؠI}|~I4<.-4nm[v2\99w>wO\{k 8[g%XʧpNH9mj[;HERԷw/G9 ERԷw/G9,*9?-`.T-o/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kWA 5Q 5QE٘/{Z^ɿ^ɿŠ(ϵook?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 5Q 5QEx/{Z7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- _- _Qk k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵooo?_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_a\w}m;?}~VXj3fUnNrV_PK3ߕZ-Pictures/1000000000000239000001AE4F78B2F5.pngPNG  IHDR9\+tEXtCreation TimeWed 6 Jul 2005 12:24:12 -0600c%ptIME+oO pHYsodgAMA aIDATx]Te{߽Wz?ޛXQ=_c-1$[KQD  A@:\{u{o{w{5<OܾsHH ̟TF\DVe00U 4pyץOդ%k*Pe8oz$vo8ոIҕuݩR4I G @g&t0A؝sOB*ϾHMG0Hliq E v7zqG{GKMVjb>s[ϼ>ٍɁ_4M_Ed|4EAn{#"޿d2݊=BֶS&1Hӥ꺺0wHҨ:j GQ!4C4̃JxlFCy /JCj鴻W;=|c)yZzbI {lԸ(7G ZlBqZ}eTJ"?k,noj5Ek6"DQ]vA鼩Yzw\3Pec+7y}ǁwvsu5Zgg#{77߸|%kko>_nj*kܤ{W M Ę\Fj1ϗY0 W䧀`z3_ßRpU۟Y?M3Ͻ'_{_%{?Z9?uu]׭v@sづnO2kr=un*Ē︈A@[˦Jש^KEtX{ 6Xfg^N k AO@'l2(lWNh^vW>0}Z-x~!DzkeZw7yk룿_h{G^hux^\^b(Km]?#} t ϪmВ$գUΙ aȓljt\h)Yӯh}^?_37T6 $'0Ga?drpfNoχ =/~ₒq`ID934R3_p,^on{m /oc_׿ߕQcb/&i+g2f͋/:WW({)/vs7j15I=wZiɉJDmg__s$`@t V7P Y:u-9{wϟ+|ym׬ ǯNiUr O˫+O\@aմD?@,5Pqۦ^{П6mE57[uU3 ~JITUy\w;UmJO}w rtǾ^V\mk~Of}ßlW̸vh&P?xw؜um89aSǥ5;.*{\9_ϛ7-GVd%djRYiqw>SWB0w= <Bޙ$gK'zj۟ȝ灏7 amwo~% 25Qm t )W/.C^WIʅsiIn7FN 8x7;VHgjd&xIcdB!ibhI:|^NbO]),lxÞ<O˪WqmVs_CTe0Ha@a/JW)աʶ0=pH8}xYUC &vOYaX+D[[vJ/1>w^ +j_=M;߯ry/m,YO*0UXW8E{Aֽz|rࣔ K\.lN+4wb gN( 8ZB˧s uÏW.-RuUS;~K( Aq-v7H /퉲`gfM{׿ 3'gC;-(%u1 lDkaOA..եpQAqP4E&7oɒ_Ǡ+(dTwml}zBqړ/QJ]86_f{f=A aX06`}s~{ބ{nZw s 6YϿ7ǫ3RᛟR)YqTA|]HoBNd`B@{`XDq`6i^Ny`xAB}H7UA`}Οn{oÁsgt7B( Ahհ$8p8pM2 /YC!.Xgr~^s;A/1#=mxE7̛6F/8*ab#W4OeE8p85!zK{{`5K,+پucBцڣR:w3qj$Xj8娛[~w )9)(Ӆ>]JÎ.W|k1ʾ\2)1^1s"PE[xE|dD羴=qN49oo/oZ۷߷\}`\bؾߴWVnq.%bK6cWgvǴ/_UY]G#LL"ٲsSK.CT1DN7Xͻj|}}l8P* t:ad[ay~J>mտh8p8G {njFqHh}bEH2/OQA%?-2?#$Gdaf;;\G^,4sh_ۣv.'8so|rJ-אۮ?$r܎DN#<ϧ_nmPnOe7b&@EBDm$'#Dq67OĨr}'hh &@)gfGqbXļ#Cihbvz3zOns<{UFODmhYF boQA4PwL+ƍ08p8 џ lYp'WqSѹfWCW`vU$ꝼ'σ+Ozfa0QtR*K%LT;HEM>MVLer` TRHn;jE׭6G[;^g9brJJ ZZ;@( MSL(+ ߃+|>hyh0Zbxf.9>T(OӁy(01 m0Z2T0dJKb(=)d+) b(~*uXe}] @Pa8Nivga@8j+qi=cZ$N#_Pw` } @5B(54 @tjcQ^QMIGr(HPr # 'TYCQAqv }5QTV\e xlr t1;umf(B-P@plv:P'%hbaK+;eu BFHQ)/jG9‚`"@$a]/ ACA , U?9ޜ *EB06x1j|ia]UAv8ձQy V{D?< ֶvS:E<$i0$ٿ,0/[T PHQx}ҽT&3'0䰂݁gN*A}^]n>p Vq<铓᷀`j=-UP_ Λ=5*4j|6r}AuBk!R)tW@̐3U8d@`W \!I`C#w|'Xܜ ;(h697c$eWOdy}p{:*`! 7y<#h| oPFЀB<ǂ=8aL2> dУZZ"ɒI%9td焹qpc;J/Z ,`,J ]5lC#U+'Uxd1``~~AM74r3?&>$fLp]`?eC~hpr \5pIJ 6 yajNں&0R~P]St=搪KcC!?'Ff`Ew8jU:RdSa> 41J !Tp< =Խ-`'w"TVMLB1Y3!BhADjYIAXN@N4dAٙz'HMIOTmL 7F!na s5SВf~wa #A=ނ,0fƕ q{1Ap#kJ~nVjZ>'N8g68<NK'N#MiwzHC[4X أ*>NM$ jkN/ #{ 7Fg `XL\&1ւ&Su#䌄J)5=΁ى* îfXׅ89p! xr Nbp4orKB>ȱ "* &ub؝՘z( M8W 6IJӈBךĄ e2iQR'`.+ M6~%( YIH2 ?li>b-]Yp>ҘLR AZvŻ3R5Na_YS({~_"4) "0v{aᵸ4z nQܔS[ C#Ƕof͖*ui9 uhwM~S >.eVv|,K'thV M, r0RuKqچBbŞ4MU<26~Kv<)Pf_=@:nljHS`^M8NyELa|yTlrmnLH  Æ=+D*Q;TמxMΦ#]5n A(mUKƇ#`" urYcf F0Yzb^@'Ɯru*Z &3|H,q{ n wIۓ55:WH>.($dL9 &!W 4Mep ߎP#y;nؚ/tI2w{/.E&066We.@򆳁h>'~¥[$o5w>Ʀ术B9xYл׾*ʛX/"2U}J'YMRWJyyd\Gv~#N<L4T}B}j2IjLR~:mT!_7Z|qhFL.nOK<5S HW|_k\LJi4]DiVO-<\ {jDy M~ZV -@ \"(񼾀lT7D]kS-hĿ2W$If>˜aEBYjToXqjMsUT=|;L.ㄢNCu9w(/7{ë뎋Oy\MNHè9a6- K/aرbɴkfH1A{ Є _8A;)@7z?JPoIhᦚ(fDPzծU So1L9 ^/ Vg?b 1 hCHa#ve\2~R%֪4a<BR4E*$[vA`KV ].M[D‹yۤ ̝J} MjF3Em^+.1E1-ϼŰ&L"$L, vZKR2FRJa#=HbZybOd-&CiP>˩ h(\s?f^O-kvPvKU[SqVܼf|0o,$].׼G^bܲS[OTմj#u|fֶUGģ> 8usi΅p[|vN8ێ$]B"D  l YÒWu (JIm3 K3JS``OÂI%)x7j:V{ɏySg(*HÇF("Hz$!=k?^,X\CI x]u)iSh7Lzb(?4nFa{}8@ba` a<@u9.ܾQe"*e} OOI tu3CC?vw' K/k2om]nl27miO@$sb_D9& I"Tjĸ:j?vw?V_hl?= ~|4=?H:BJ3~blV'Q̭ YFRϋʿ0,Mg(膢L-4wzT 4T0vpg؞qu,ge E iy(o-GK3/JdsRyW)IS%Ņ7߯|>{ g{_?^xow\y'zys\⿆%F@NϞ{SI ͻ#?~GЅ ;D0ho-N/jk &u+ZPt ON9N) G+_G:i! ^ۏ}?/ ˩AMǪ .djL+ĭҀ 1|FE{L]4 ?|irXn1*{#lj05H`=&CL?yNW>n N[ HĬ)( ہIncHKBeD)9،C]B}igH_uފW>zCU6W$*;SoJ1Z)/Mk{X,u=Ojλ̬{so?75#w?>}ވ*9@w!Q$]~S sb^F1QфɆ5dH- b_V&}~ܶsժ32ow%7tOVʹsr/ ͠$nsu?0dg01`C/>#>џn,C*`NaRj 5Q߸( )D8˫;)qxLFG^)xɽnZYiqf({~ G쟧t@@wESk.R}_#3\T6m_\"3ֿk!)NsUhB]WeO> \GI!*oeaO#T~QǸqU>%LKmv'}if@9:A/jA`|N_0HLce 3|V] ?lc_ETQ4dm᡻ESj}?Tū1SG5 ?w7(8M䫬BIvC-]&-Iy`^߶Uoeq =4h?{x5?k=ɀs1{kG 1>oB8Tȟ7fu;ܥӋfsÙK&G-(-.4NLwKM.Mrßfib]x:]*"fg)jd0)T|V*+pϖ4 +ɳ'.f?`ӭZ|J>6@W)rTU,#֨UMbŕ0΁:rl&KINl;>x0P:` M0:P)֓H5ۈW[ud%;!/}\:. D?ol6޳oK;-5κ&O8eʤֽt ~QAy^3Ġ( }sSy7)!!>V M;Jnkl*,,߀I:1(fG%9ptMYq׷upRXmŋESˊ"EQ29eլ;y <_zT"/]<%Q.nr޲UÙU{0O ze|]Gr !ۮ .txycs06vϾmuw? xL.1aK’Sc\_4aZT0*Q!7^{G㡊Ie$`M5BZɌ,o5Df]߼uJ,ѻOlN⯖'FE$8,@Mi>g#Cs<C]|b;ՊAL<-c=\( MChQiȆk㻗짐ҁ?p2OP4Rw A'dhYZx%ey٩|𕿒/]>vڔl1wHdy!i xH N.(v. PBN۽N):" " {^ jqABH"ƍ_g)S#4Ao4WY͖6;JhNS"Tn{ۓF0Mх$jKhl50mӒ^P?T"(B[7  ͿE<ţO*4\*v\K|C! 0ʕb܃RVaO?ӧư)%Eѐ`ڔE8M9D\bU[hC8.74{!~ iS'N pjZZbbB8i&N | 66%|d:rd֢^"F}?)e*8 ܵbnv:Z&u׏gU̝KI777uttIƷ\0o ]fL0k .,&>7MQ@"U';[Q`S[ m ; MԅXTF/IIO C[`@`lUu| a2vZ9XpL.Fb=PztL@z:NvGoF(Wcofh7|S^ vhde 06xQB:ybP^YBTݵyfcX"<$Irpѥi un C KRnCCp֘`0cWqÙ ҂1ֲBKHGyN oYE8p̆Bј:]`1,#:@8\Kkhk8pa,%)\Nw8i>vX" }m]9Y *zrs#[D2D_D3 yrTCXbjcu1DXk =uM_1TRUT!1 ye_ܴ`k@=> :>@ {YA$9ؽt9ppRH$xxsg=!`JI0bKíhG]rC)-+NեhR4 $Em(x(&L2ӰA CTF@ 5 oZ y=+O$Bf>p9S 3@TJUdЇ CDX #U@Un3_*W١ç0Aא (W׶4CIoyUEMn[%Gb\Krw7bzUwMV aBjZZ\s|"x9?er8{U)AsozF6P{{O|\ŞDպok}] -T4Fɋl6V̐HmOxYǞ݌O@UAP h`j|?) ny߱' D~AmD(O2 _eCͅes:5N pxf;++ȮcۧG) }mC#H(VΘ&`٤.ܣz:L~˳t/d=??eW9*.#L+>Eg8X 8Iy4gOcHzVƾ#{UB6>=J3Ao7HE#?y;3S+z()op鵘LkRxÕ3ڟ1e „ Ig6|.U  4;qD&G[rlf0P"By ay~9}vKI6P?X]q+-n)Ob EbR R p8 :tXGULrqX,#lW#j3ض`P#}E-$ʕRőYe2 IE og>ٳlT]}4>D2&)#mC(Ȑ!ayy9׬ofs#1V/Eן?3#]T]4]TQ<  @ |蠽:3]agKgLn5֦ SgIwLXs83L? ,7HٌU:2='vXU*STqɩzO5 i3cJ, cos9Ƴ][PݖZqՄ?$Wd^/-ZxAOf=l9CFR}@$sa\XAF޿+{D蔇6ߧ QE;-3V?/>/˕GWEpEp'xί7n8l8Dz ZEVeioO^c%eXN.ɻ/Z~DqR?vp I8@Tڄda,eűיC ~'Ш|hD g dFp$D* H*xgF 5wp4EȢJ: r&.CK)pEc=l%%۠h~9 ,nç[ہ7Z돳t'ΌtcDץfN3E,kAF Y8lxު#Ͱ V t A jRl.,&0"-kqF 81N 4_MOxğcaݿC}Wh"oWΪWD]zd5{HZhd~\p% (Y 41; o07XWqLXQJ\Q\=^o[1Hc  |ۃ#:LCv{ dhsa#TJyyJfw`xd'p 5xBi}@(䧥&K%]r "Ntj_liɋIRǺ.((ڼy3~L(P(K1Z$ϫy<<-%Y&Yo6rU%DByǺi47HZq¤P(Tea]TƧ' (kYax6̌qsU llj-,*Ic]_(.X~el4thy6*-γٝ͆4Ɩ8H;ͰD00.Rat 5q81у0kYTd66ƊKMK F\ES4c]_z}:7]zz@R8^Sה) aSؒfahx|~*l74Qa[#|F <#$5[//'C&vo-v#Rck5ap4"H\SṮں:&>$bP$T |P5y#cMOKc-`e4ZmO?hr8`MAv8M-)=VqqjFt{D;oHic;I{4SY z hƃ`qVCz#<%>U2)[DyJ0P Сki|Xg,T䳦kˢlrq~Zmƕ屻WW$%'͞5 a_̙XO FBoM7G+S!U@TZ /K{jrsg;ΟdP>U~241zRp 3.KT&&-cw8F#222` w{} -9Yzߌ_v3s֜{ۏ[W\% qp_#D=nhm K[G=Tw,  Ǐ1UH> g Nj^D0H 뮿<>?ݞy]٬^4jHOM>]誠 9s玈8G }Ԋ7THl>j(Z^Vm1B]X[WJKd2)8] ?A"skΙbVm&9͎Zɐ{ Ø76읒ۉZ+ EDa03L}Jc3=4߆٩3d,%@[tʕ+{7=^]CsVfX$&O0I} #U b\ET^~Wkh3ʳfcSYY٥,'Eӝ]]<}ݪ*=+7ޘcr]-v-^n:HtE9r$3SazzPyKk>MwO&&hrC<q_JJV}O99F(.#v$\\lN| P_]>}BA=HEui;,ˮ]zÑҒV@$Atcl4BPLCdj fH&߰xmvv?_n=Se&$ɂp~Q(eJOAC٣z~1h ]kE#x8ZVꨍS] |w DHJ;p*QIĬ A`H%"Hڱ;qj%6 +$ ?Y+3 J) rJ&tzHbËvuYE" $bp 2ezmUgx ˮaf}"WB Zr2 ڲ $6Wѽthg-֋:Ȏ]+t0 Da0>_he5WiPUAldbb/V y9:oܖ \xaX^|I*.Ztтsi4R W_u%$WR$b1(O>Y Ӿ 뮽^K@erG}??ԇFRM"U 맦h1t6A%YmMVk$-͝3֖;q=Trm7‚|Fx Nhko2ۀl ]CuS钴F PJ&TG,Dx!$HP I;nJR|T͡GaW؜M~8+]PWV@Y B uy"ˎ{WqM-fƏ/3uRu:$mrϝk1mk(΄zy`TuvxΟ7',(n(@Y3֪s9Gр`6ArwZ y%`J,sݷV6yj}Vy/|(df裶Rҕ>4 Tԩ &.!pyFR)X8lS+|:Lwa1emmv9֣J`7(.&SdޓN`Լ8!D<==Jj˖Lf3{o;yRYYAparrRw/1hLkW``hXT|nܿRiM#2+< =*a|?pP׃c)U5ͦ.ۺ 7؉&kn>y8Ʌ{K;ȅx)1ePj@F] :C#@A@?=*JfP{Q j1qIx@a`ѵK7ܞhOݾ(FGQ1JKD<^TՠXcb!E ĸhPJ {Oj_^ױǃ |&@Wk ;%>p/#\*e'X\J;E-jajOG(99YUOY џA tO S_א]YYɉwݹq~\* u]KZOy|ޘQ#RW_$)n̘>*m߱ho(:Xc7o !mP6''_t5fT f\k$hRQ`#  e}N2 TjA }9hiX>;u:=TUwu leߩ9 yo IY1diTi4F/ 8 s%@7H3B, n`[LD#8* TL >^ 8/1k&}Eh荖&LiA#Jot惹}Q`NFx ˃W*G5HB/(80WXBV(ca9~T*MMMf,--ٱc;tC{tUZjRd0/=s*t==&T"u[Od/>7 ;3h5I1ٷXE}Uگ~䈢܎آh(Hb]oyZ Ò|JtJNnKɟ@TU=/s18Mi)il)=W߹My(1ܲ"RabP #5EtK:W-nh,Bs= B>;fORvU?voWP~yyyE  *E-L) (jOA0AۨK2yʹԞGTO d"F}X[sCEzܞ@g0@F ,:veia^WcSk%KPT@-r iyj9}٦M 4f*,>dv 6Ujh);- j"!QF$\jwde!6"+#(X̋ (K"@ 5-fS:4l6b0Xc:;3F[90}NOs֑5qR5*0cx9SaLp̳DaYd|bd& InPR_KYW'4f/Wqy\>].w;"\AA`2SҺ:( FA49 ;InDKEE 8q2!Gd6X:v ) 1kǃ\nOL nD)ts(+礥NB(N"Tތ9ieB 4 :]$CE-#|ތ6pTh)@BAuz3/ã8̴v9G`hC;L=oݭSD|SkS%;]t Â6E*Gs18;aT% $ɄW7tZMCڅ"Dq8KN\11TcHKMgHЈr($=fvgt&*x0[]z!8L@ a26T]| "EE%ɧY/LPp&,)J86ex1/IN3bZkB1u|a}!Ⱥi0w32qY:kAxj 1zvV.3_|V]῿h+bbĂz2%|qkg_j*kǃc˽&_ M[&ҽ' 'bU}Nj#e an7$ tIY+N@QJWWmD-o@h׾|qJrnet4ZAؼNbԱX1q;dĖ͢G4FEݟ^&"l޲m㭳F*xX(01Wy<^E\ eBXt`xL Aw]. 6fbk)QPƏO (Ń{ \ڽtwF9T°,Z/ MRGA7$\.צ_~KJJ>lv}ډuCpXT,ԈL#{vZ.E&膮x*97wr˳iws]OKBѦu9eRFlM5AWH9NqêZ|m)2] usS` f{dIfw !yAW;jDQwOWX9WH"n받#tVj;rhyĽRTizeD]`s8xVwyR7{5SE͕Imz2U w4&N(Q֪Bۨ2U7rS&M׾_'F9>ǎQWI3IjspDKj'F /JA1< ˓Xu5+QݱYdЦC );=ICINT#+Ylsq%l&m|$5~h$sfEs :+;]Ry$mxDg¨T2NZ"􄝇Օf$TUoWh8}|z '1CbP (3CjQm|'%"0usZ9 OjkM:PE:R9RA J6ٳS_C*y?;\\E'NzH$`1FҼ`ă" O8(APp8S8&2وAؚٚApH/k:}2".C!8j\E#\FS]G>‰U#"x#cr'#nIђxK?gk<$7 !t GjlN=8n;-Lg<:8׍,6 l)܋M$[u{$zň&Ǥ'mbf3arW;B )G$@LV pA*qrqB89!+>jp(c9`$e& bâ ;<{IGz\jsBԧ K,ⷯټiB>a84T$JTpb@wQi ή\e#=n؝ذN89ܐLd:,&q qS5]QBE> ,Z@1\`\&Š(c!"\7^|JCMKL7V?]}O@K럫h$],h%¤Nd0"4PFۧ\2'9J3@W@0ln_hUUjh&jhW^CU-EC. 1GAhT)89˙b*4nhn6m1CU@Y9;<.=nؙNZCi-զ'ʐ 1Θۭ8Y;41s$/GgӮ,l%q[Qth.Su )Ac$8ʕNs%ږIל4:ءtSF@;:38dx{;'MnV:| AX E08V?A>i%^\8(?W] ]nTuk֢fłk<,r{NwhI~mypq:J7X6iҦ@ 6K&ѨA+<4_m.ErbxМRqP&X]I:x|(*R1 (43zvP:syI`'З *R F%qP5dAR沙8N|\@U[(԰d d(C7FZXn 04!&xE 2_Wï_:4Q]%n{Qk|vfC@ Dh0 p t_9(0ŀt͇6⿷Ta'@ۡSNw HtXjc>^?~Y 6esxr:XL*UD+%v+A(ٺa4?wU!Ğ$*p8{U'؜pU/:3e]"_ 1@6Cu =}<9]WT&%Efvج&'&喖֢AaAܸ1@:>qD XZUa2P 45Ԉ0Wk%%e '+0֞<A76]%@Ɛ\18Bq9-u5֖QcY,+SDh4\T^2U:n~9@Ә,9hFl]ǾhB4@@[dL\>`W8lhd4rIv[|^n{+~t]en/~gϕJ2\Xq_[^;}yAsV֛:s\,+O־#͹# Pb#~]}ݘ =NfӧOlFA\84'K><@oOj##E;> Ќ/Euv3zgW)M u}㙌ql^+ֶUv׫iT[K(5Rf0i?нݗ)[ZZ^!/`رMM A>㯾jٲe/M63&''/;f, Aї^z riE e=C^/)-mmmjժp?Px6v8X4|؀K-e;?54zHpOLMEui 0^V,>Hsssiah;6U&CpQ 뵵gIbqj%F N:8_yΜ~=z4Ξ-eܤ$`>Jb6BƎa"F1g.k:Ӓ( bzeVtt+-Z!+H*[uݻwz7=zyHXQYaÆ [ܹkSODDeP>^1@\>g% <>~RUNeniEQ1( 3fp[۶ 7ךbLyw}>vX$mjjtt@ hlld p hn|a;˗ /^V<6vi4b%`0@nb49NVv++*// p%0sfuy0^mFUfYAW1@n_` kLW\1@ 'K,RY𢢸4\ ⡱8\:0XΆlF|{͛7L2%/?hvEx/_0&Nsrr(eE>ѣ/A(5jԨe@xٲe_|;z饗|M>VIEEE@fo~$?e1(#5$"#~? @NC Quzr]L&sҥ _x%T ##_bJRYY X KSeffV|йTfe?DuܨGs""2+^N[$pg3&N\N$=L(c{+ICbp!dɒ{.kZnnx=xHLDA> n)8PTBV XxTʰz#1#cyX($Ox,=j=nNgą9;4 E'-5aA_FUDp%99 ,n].= a/c0Ý!`04ͽ?= =|?n׋{FCM6 `O~ښZNI8qDEEEN}rEyb--;vеu:՗{쩪 _ '1M^C!IEˋъV455dΜ9˗/ki uVPW#G+Pի/ݷ/)1iࠁjĉC|}-߼eY^EaM<?(5kl /T{ﵶ.6懕+njyǎ:tE>|6v-俞1hqQdeFToBMʁ/v1pf m>VcjRu 4maOnOo<9.c]7uxpǘ|s|aکw[:1ȲVWj7DD.;v=ԉsMm*Ό 7pCGx0 7)mJ`AOgXnݮ;Ǎ-Fn/R 㡏_@Q6*k/-pawuwш'OdXa]we(-. ߶d(x oZzA~ b[NaQ蘘m۷}'ǎ[r%|#F 6mڼu+ }0bz-"ӆ%lܴ[At | v?3tм<\yB~޸qC#G.&q!5(%7/\=j(Q;r;}Ĉk׬}w*+*BBV?6lذcAi:4PEyũS~a4&xj;I&=f{,/?`eNII}ͿRTT: /H#rرv!sݛ7m; k{.;v777?sƟ7B )?}狄Ygϛ77t:ݻdÆ IOIq z}|K8H#Ixu>IʆJeڨӇZK 5U%JPuP@џ}"&3 2QYiiNvv|B@F?3<S={?F; @l6}˯B7^7K.\.ڵ?,\n4|o@T}}=62v?v}Q㰑ӴjgݥC\ˉmgF@T:Ol?5Tp)&tfJbӘqmA^p8#*[TFIVlr 1W&rDQ ̙CoXܠTVTVBc>ge˖ B TNJɓ֩j* IH>}:-i"ϗ,>H^ӧOgddL6 ?qS[oC>A p9=w %ESF1)@"A׆674:+6 EıNnU6o 'v###-_]"(R$Ag.NV NC[qEm%w^t9Ϛ5 Ȧ9CAx"nHj\a7Z(Wo4|ۣf[w}|DZ!2s=a-[̞3F=DڻÆqZ|*ոq v:{}vՌ3Q̡R1T< 2p!qRe!OlȑK!؂uѣG$O9Lw;(LJxǒ%GURRۍ V]=rn&.}Gs#./GڶQeuUt^Y|.!p^ {" A9ۍЧzouAh<_uzz>ŋ׬^N$,hJ$NScTK;=ytD*jzDEWZdHEafn7YT8^sL:7vԤ( |#$tPܤ=X)P!$nB“ LJ/J <3kF}}5L37雏B> Y:1_Iu۴fAv`T% 050+!J ,Mc˶S|HX::#U[׳Q n6H> 6^A͹ykvwo :t32DB}{:Z|ȇ3:N ,h323 U(.5H"//H( HP;`ժU1a6tz=U*jՔN 6+(&b!g^d0A>=I`.;QlCeHI9 6appCY`2۶ 80++ Ch"&:-_ )C*P\Ey;ق%+͠Ct)8ܶ6d.MS5/CP7N#t:QT:/?Ѯ֡ӦvGMF#dU|i^~ V:*F_}E6'r+j2IX" D,ͨ o@0^/^wWaL2#F-!„\=K7nn1ڽ@ѣ  6t]LMM]ʳglYfРAV5)1 h 0`**Rb#Q)Ѫ3 d(~i𢅒tX3\cDy=9#%\,.(ҧjۈC 4:qQS:LS_D8YN'S Jn9F.M.Z: w[Q??B+ [ӺgΦ$L6_0qDgϞ#Go?v7M ^uC;;^WW7oޭB6e(tr@ZhL9lH}t߾}š(LdmXd2>j xHt* &NH#*))ٵsWZj|zTZB"p ]G4Z |_ X-wCG6 :99F Ϥ3FQ:xhȑС!a…*|۶o{\T>B࣏?qrCUA T&RAхu`PxcFv>U?w01@Fez V+<b_[]If!L}s0Z[^^?q~bd :2vlĔԔ>'v_!u)*.|j=gp 2—PYzayXuiIaw\ӕqIEW?$ $˯^+q& I2AgMTZ_:d1WtÍ*DA\y8mCc/^:Bw' : SSVs)C~Q1>pZ}{4tΎe^okJ]ڬ6߶aEA7!<;c4rܹ2Q]._&e (F'(*|b^@?/A_MuUotCKsseH-\YYUw^*}v^ j`Nl5DMMMc4۶m7GA6[_gw+2>n`04lT*jzp[ӫ:Yꌖd4^༮ɓB25 , 7‹/;z4@ywy |\*@p>F,},BUjJ~:.k>V"^_vmWM=|wSfÇϜ>2"a:^ׅRЦT*8~8~;A*L+/<0@e:-MYYYgLwaا} f5kX /`-\H)&G}(7^xL69鴺V|yQ<[˘5?D <2k,*a!-J@'OsWJ'35!?\u:ME8`y㟙qz&3MCD;Kk"Y}|\.w96k6ǃ /%TPPbE|I%,fo:t_1cj^1@JUVZ\ zU *Ngz%tɤ{ɳ}j@HNs5yQ˖-KhyYoO4iĉ.]t?ܳjnرr#Ǐoȑs?{ Z D'O`PÇe'xW_y>(!\w'N8NI0mڴI^.Zˆ=?B-Ik?n(sHƇSw9.^ 5k3ۓPi nְ2:?Q_r0IWO>l߾]QxKjx̦ҲNv{U2K󦧧o}? vP.Hxr$Oȳi̚^:QYYyۺZD^b2YDv%4`]01@9 K RT1++;M_rhTX/abVFR _a?gZxk,I=3uk:֬Ǒ{ `4Z^~Nz4z  ј!B#2DrǀDA  _{'l]nkmqfw0C?@jWY#ͼY;TTV[S[RR"˚[Zvݷ.̵i&~"Q**;ڛٳ//_N9 "qQtR{4_ئR)bz ,Jӏ;VYQqǒ%,  K(X|sWSLO?ҁ~GCP?lmiZ֕+WN:9rpI3g̀Kχ+VR Tj:k5O<ֹsݻ~:`k9r_2|^zi̙,k˯ObW_*8u+˗UUU_3֭$񬙳&#o Pl#/Tv@!zKq -*G̟#İ5#+D"[ ج$'&&"p-  P"pǏ eԨQ LKK ?@}o6?@'Oa?zv̨PniiB9`ႢEv}={,^xҥ v$,32dر'::Κ5 ^BPQ*o}-h^"\VgfbuKFdJb&r[$5&ad&fq4?4>;8$c6'Tg.3qd&O./ipۗNAs7HE?s9QYm@TJ-?ޛ@ϭԜ?wA^?k~\cP%ZQjNnR4Q g PH$y |+BW4ξVdMs8D:r0'l-q\tTT(,^8!!'z ~@T6mڬ) _~Ν;LcwWZ؈;w쨬:իWCTnSMP(:ˮW5yc5t&x2!*lo!3:{ *_A/W~j9x e{r"òFM@#r?.`mm RS[3i$ ?ǣ_u!A&j`2Hݚ`߀[lT"(d29|pϘ139kڠ>Vu:8dVûbX! *1@bKu}E ŅNG{&WvL[ق9Aǐ&W↥Q}s N%htUER5ʚiNRLAҁ7Z J<O4:qmTBK h}FD$= (Ho:I0}j3C(B~_Y |/H i |޼yT8+;;}6*]g)YS }olH[1` [&L p?<#0}% DAgՁ- `TNc.y|tA46ur4oH".%I8*mmO~SLxaɲ3s?1/>r s*=tum8X\o.>O縬:@$OgqQQEBNi@qڱs'NKpPau0/A?@,8LsQ4Giin^ҫBn={B+\.*۵'Nu:'bN,oՒ-7mBO.T] I  :ڀi]vB1-?3oΛvA t;?SH pAR1:;A'2D|N"Q@@ .\H{HyRxAYYY`-}bwqUumLʕ+lgk644x˰a6gϞ33gLq۷\|}}222|ƍ/^ y'VZe]ti||Ɵ7^ORӖ=ޫZ7nҥ^^`n&MOKY ʹ߇y1r$d]S.}0g͘1*0/KA'aZe ׄ A -quV'0[x d4Ԫ}{p޼x7'$$)Jx f@)BU2<,!{Eb>S .*,*-rvxz+"" c裏r;׷)@Y^+˗bPÇGGE=ą(LAYp  0 F%'. Aw`>@&t&`ɾRooS@gbBBxjLI *Z3T*`7XQh2]9qΝT N]iӦ]ꫯN6mY;vhP,ԨK.=rt:.N h ŲO>@$HD F6eoCree9% }RP0w`q\GGG Q-X$ctOahjjcг;DpXRR͵Q"֖V,ଙ 'On8* 3_J>v(.*noowݶtAxmm-PBG!.rwwo@뛒P*6e2GG'8>D&^|ϒ,/j5B }$H |_j~>@K lP<@6Tר4F= ˓Fٽ`H>mۙLƊ_Í?otF !%++ II^K/t߅Zf=2N4eD2p-<`!QDREi89uԟ~I.e !!!ǏW))+ZdO?xE]sRRYKrqOI 1PjطKbb aaJe-t`QY%Q/k4EX<"?~˺jј5b7o}s55z45  vX,]B.mo c, Ag5KLA%::[Ubb,U}؃cx|5T|7QF*0AXx?OΥO>$`"  Abybdep_x7.ȨSx<Jڱ{v DQ+]h0i#H $bhGD "#Y=0nTJ,S-:zY[4j2]'|O#-A$A}yl{4쾲R J!ˠC.o1C{SYpڳ柛O|OT5 e I 1Pp5[!Q<WW_ߠR(OͯoQ1\Kή6ݦb%MM߹ {|tnvwT yIYyECWT<@<~v H " uC(J[Z[?^_[K<-' ΡS^[nXW[_U].;wu@Q]{ {M[wNa' *ϾDowF뎠I A`3$>Rp/>xTm5()`4is]}ѣ' -auP*A]{<_IIGfxرFeϭtxY_}]Cfd\d>" ; J5"cOAe/x_66 6@ZhH2ydhni7fżK--m3>類5uĄ8˫=7i؎.+hY[ H "px^5Lpsss%:>l0H)--uwsSypp0tٿMF|}Ǐ 쨨/OOau:YϿW9{JX ``Az ɏ 𸐛k/+U"""żssA(u_|{~GGa@~ Sp99757ZML }eU-Q欟6jBbafx|f y?PPl۶ >?sL:::oߞ=ؾmGZzUzIdƌ}\.߱cGС(f/2َ;322ٺuwjjUɓ'ZۦN:`_޽wSL!Zu=Y~~lڴ icǎ#1i$Z[Zc>"#G#F @*i'wq`ߺ!"<@OOO0ԜD")Lsxz,HCċR\;Ga?$)LFhH0qƽ0 ޞMqqS7Y77WM_Ȉ0[MwtH$ `uӶ,Fݺth@6l ^=٦_Un, d6f>b}+Ẇ,Z&(4+A!0*qN);t#UQQ}B@@eD΁ JA:d٨L ;>@@||<< sСl& -)Q"phu<Ō56Ϯ--ee >^!BzA.-?;;5zԈ_̵+}8*t qq1:V]]laY.BQ.8 be'y[Zƍ 0'itlKE翟K@+UYt<A(5Z-qïs΅Ο^xXN3f4 3v̘w:xFDF>|>J'M 3+Vw,wӧO:xE(^tilL7n Z~qdPXZvِe 11Pj)5;6_8|ҒR}=0K.Y$66.,,@)(LDD9h4YڱqqK/1qf׿|)[{8v+X'O\v-=-Z:3 #ϟŠ`7W7`6m2dhԄڶu\`P7%(n.~Ju>Ĥ H w^%z:iР ꫳg>uj*VJmٲQA/+pdĉW@+]Xys?qbXSXxRh ڊ̛ )kۖӧqdhFI#yG9R>[RB` &ẀP*m-iO/,(vffftT65YrJ YlT/^@ Nt3x>@x7z>˿o2n,t4<6T&&+#9g.l6kԉpwʣKL?a|7~¸12<%ypTT#֏DEEݦNlɄZ#%9i҄- 9$b &M܌e9Dbr0u4hJ89uvsp5 Q)@R\.Bbp9m4@Pl6@ԶRmBgSNO׬x5?ɜ39׮^ɓ'K i2}ƌ_|X6bÔbE~)HTJ%:;J~: .Yr@7oèg -Spr{1n"Rl_zH8~ "##nmXR Y-Θ=kZ#ೠ̉baVY-ͥ a֌VYY3M 2k'OV%=YfVJq{WX,d4證?OaK/d>ѣG >, ȿsSQQ8O7,4NxlcYC_-wQn)b/<̲@66oFӦOc2{O6ݲU#;sUUac #/Oϴf - 9{28Й5dX<@]`8:N)Ez{p $4`1A}>:- ,ˁG)7oJN #АٳgXG+H$dsNlٲ%22RTmmmp8iިR2,{X\ҟ~iqqq<<ram嗐'0]h8b(N"A@OLG5:u^ۙ́ 2[[Z~e-$nggT l`چGDEGAu;q(̬L(.;v`VgʕW"#@ffs̓2pf0|}g =&`(xI-kd2T*0d^4N  ~3_3PvyY9t#GR)Y# ŋ/\VV)))هYxqQQ1t"ӦM 01[EsNNR 0jӇ]=AgKs8;UjP0`^zظXt9pP)T(9;v,T T;3x<^/e6g3 Ti*l{Mx%߶䭲~!fѼ<={`LCy*<'OƉ&Vضuڵk U+ͫ)n iǏHZT;K..2*s2|׮]d@SW}H{RӖ= U͛7lذ߁O;}>@l޴ʿ?u[]]d)]zqcƌq;v 46.Q!#}$HsU`t n9w܋MM@gJJJ@ɩTj\BTw __R|y̋al͛'kZ^oFEG}'R`Ǭzk0޽< KP~~~7oW^jUddԃ9s"`ZzzyY v!![ؙ`m7yT*y[Vb+~,O z8uZMqI A}{QHԳGW !W)p+|.="3/淎~ќۈ0M<6=E)5('Ng'O²_,O~N9^f<@]>@[H~P{x S\bͧkVD"y{GTCCӶmV2o߿S!L}mQ[[ W{y׷m ?=@@ll, iii( p.^,P <_«j 20\\\&o<<<"h3gܲeѣǬCR]ZA)q(Bg"diu:h4ts=nݺ[sppr`@L8>,44ie`0uB55Pv5t\ l 0(ȽQuvP)dD/uKgTzBJsaAfE ,mr|])Dg:>v%i5__P:HܹOann@DDDttt1rH֖Vg~ ER]\ЗQ3Jh4E ^wv͚KVrl itCmnny<T*Êѥ;v쨪JQ %!bYʜ^ZZ!8{jjj+>_ N]١>h`R8\.'LIIiimqe ΅BՖFGE,bTTT@S ϟ?P(=`}e-tm(!dRGQ(T:WǛ?qoɐoѮ]@/ phz;oMG쌾%''h={H}b2/ҩS.!ߴioZF[DILJs}*900U€4kA PϛЋB4h+4f˲`YYI>)4ht;Ru v0iUS@VtS٩Wi"ժw89Wl2Ag_̿>Uxx[$xt|3"ĎM7j>9zlZͷ3k21n݊ep@qun}}3gΠi2lREE&Ng(1<>vXh_ RǍ Ŵx{?w~Hꐭ[@wL 34J7nرiٷon^.ޔݻww;`ݷzpH7n h9 6[< 6|~=Wۈהɐ}6s)xmJS1p]ʤ I׹{0z (e AMZ /_w2ԧ~ Z~]MW ߳<ƚx$rG[x~n>NnB2g\D@+K~Bk׮3_9m8#^WRA6=ڇ:o̼ɃT {je?37ɑ׶R:eWFVB4;ͱ9o.6ڳgw^^%֖V*oPjjoixl_`% 3GD]d瑛A"oDQ4^}U\W :G{hڶ6!Ks Q( /ZC+NmV35 ،.gj,n] s"Zl0|쒮_)3\Nc(}59PPWĖNr3)xYsX-SF xXLo HE XJf; bdm..9grXLfXMJ(L!,][9R{\\#4/LNXiK/~뭷77vXQp.˱/yfxrZܼyٳ*F!r\CHA Fϭmm>P(4'%9UhFsʨQaDܹiӦ-};c0!߁jOjkk6^L(v~:(`TѣF8;ds !Ů]uڵwyg挙=x 4QLb.H2o}o޾lnn&"hWJH%1Q)m)UpR{471YlxW&Qw4Bn:e2V*hSҮQ>7:68 Eyz9؃ȭO`K.uJpwG[TcL.x%eTVV"8i"J1@j#v#"^[se)F.w*TݩT(ŖEYcy\e9xРVR<O,pAhni3o ]\\,S@}:tnkmEy@$''755A7G eRḁ|[%!"<tmʑGZZg̘a}nذZ/}K650Y*:dRCeJWeybΌMW(--HaN>//zCiͩ{3_936Diii<0Y,62ik ӏ?ՒKhw .>6vJ~Hը`"-ܦ]jqtY$̵>`kE@\&31h%z6զҞV̧J}?IܥG;SG:رcVS[Zh'LvZϝ DN0@K<ؼ%>h] x[LE4'LP,|[?[Nc8#p+O[ݍ9|&PR7 @" Yds<vGNQ3p;ВkСCFfm۠gc{SMx~@( bʕu: ZǗSy$HhFVj`I U%9,vOP(Qչs .]ٲx x4N& (Tgx<ݻw3^} (~sVV7_xy>tY>gn8#ToH훟SO|ǫ?NLL4ir{{u RӦOuMMCf̜53;;{޽Y5qİ?xI@P.[6cƌ),_2Kd޼y`5J'M吸`L˫x_Z[&y$HO$2{׮]`2/-..*X]#V_RiX<@ #XZ-_o%b\J#xsߊK`0~81`ǀNMKOl!CR:5k}}}z뭈W=|'N@\; <ٳlQ*y:8 Hu}C4gU`$i}joH "uq% ٻ $G%V\V<*5IvG2sqvkbΜ9˞[P*{ j3Fc;+8ҟzi__􌌌ӧO !šk duuu>֮]k:wG>@$HAPE譈? 果ţS:MsEMuGhWNг_|*4,4&&t`O/Ϛ<4ڌӷlݚm"J5uuM:&(A{ 6bzy{WWUY, !=th\gJD>w}Ǐ >Cye+=ܺYfٮ2ǥ ,H.G;Fϟ;_ZZ2s,"kH qWqW}}Sq}$h<==(h J5 ><.juk@%ĠB &@7tpxҥ^z ̣88iV iq)nnu II!/sgQu@Ehx b̘kJ 0 ҇f R , G5jٵ+NE'Ѕ@/_eeffY^ѨU0%%8. SK$"$Hhj5}VL$t"٫^|BeXl7v-c<@?g-!eٳg[c WטLs=>k=Y@@hmNAI4(1,& >4cr+B \gϞ}GAZ]´iUVYÆ knFAղ9Z` `d H $@հz[ || B!u-\*nEa]:HF|3l Zc)/n .ҍy[?A`ݰa <@WBl6G 00lqCRqJr> F)Vmu79yH,^ AAx/! XlJ}޶F8x~X3@asxV%}$H {xv~V(gQAκ:\&khi+zy[MD #8G5Mjkk ;8j4jm Fă<a~w. wQRP7{5~eRY^nk29*-JצPA]]rʩ{_Dt̼}v$ 7mMjvm={9y]Z>px$HypWMWL.A"nיK wj[1!!ATU*huVdۿx BY 7xVm޴?[ԩSh_c Ng`+uH "c]}⁛X\TDZ`Puٛ7o>cX<@:WL4INN嗿曏VV(_>OKO;g.*g6uڌӁRΛm[[;Ǐ1}zgּy5B<3O? ^`4gÇm#~~!!!@Ə\ ߚgM<>@$H<8}..<:pJ)*,I/X@VT,N=W]f-[ϟcǍ7m14h4(o,P`EEEHO&9s d;wljn,?(uk#cU j\y#f0‚˜/>=Xwn1:@{<>@$H<8x|΄u9j ʼ.N|\zSW<@O^g"_9/ NQB(,Y3~iRA0~>Ĥ$x¢ظ8s(~HKyyG Ab@l=1Ap_`>:B###MF۠AP<@$f ,ºx<bκjyh"`mMmnn. uswCBB@zWUUj)ϘuCinnnPJHpbnJ(J<.Pj( Y@-_k]E}uǕL&*f>lƁS!s@z.]d߾ _'B.N2ٳ!e"LMM^huz[x5;ݰa(cǍuttƦ&#hs^~#/Rpɓ'#Օu* 4GG'J*=-پUՙY%V w;Hy A]] L-+w6Ifr d5Lw^oii!)lݭh4`7X%:fsʌݛ?4e`0x߳E~uU7Ԣ1k^> @JqX<UU?o tv-0"dmZS"vthtz@pO$srra>ao߹ SϜ2IL{(BĽDKS=V`H%2Fݝv.~)7}9FA_-`Qa! +zlO/,l\gA;PVkh[c w(Xv~~HQG>@ރ+Ve.XV?#zv1jafceo .ɽ sXiCH+n)+eVo餱EJXW 9T!C9]$cW :z {,k6u'R@K jսQ<"s(J%=Nh:֪5M?sB$0 _S<@D>@+XYKDqݩEC٘5H{8:qyЙp^}2K]xz{{{zzZqMTM9_&08/~?O$7UWU݇@0qbtه£`2!UU-Ȍ >9sÈWӧD\J|nwb ('SzJU*➽ĮPTr~o|1F ~jݞs%FBWW״$Nh(| D ƶàB)rQ'|4(JT3 dQ3Ršpnk)Bm\*].ׯ_'/"R9ĽZ`mwDs<@3щwwsy-@Vԙ3g {1PфtiTJ*-)5;w8p /"]~}SSSMM?^C)))SM7o^hh(|;yȨ($۶mS/*Z;k䔔 6\v->.N'''0@+g,Wgjʏ?DR(6 /S&OcիNڙf VSFauUU?m駟ijn"}NZYTl,KH8dݮD"}Dn߾=77T^?azzx* LP<@s* 4NO?7g}#DGG駈GGEGAJeeell,R`\* J2E>rHʐHu ZWޱcGJrQ@$/^|饺ںwF蘐hAٳOfB,]Y̛M~QP*)IN;XXjfu'R*,Ъ5|t=}Þgo}Q T((ՍaEfu.,EMt{V(r05:9MD*,'11qƍO=FM0 k>lAiiH,h#LnZT\w߃ j_V={b1ѻ,*H >]obRRP`}y:Ng!8?-<E}1.\El&(;x|||@ĀK,9px }ΝW!eIcǍE)ÆeLM d0x饗d8DgCSV?C]q(UƁA<ρCͶ)[`C lɐ6gYB*looGSM3gzxxt=?$>~ߩguE><<466OH8gx6KBw DyG;3Tm6C_\OrɷӨT{D}˚.aCyyeÇ %7asdD ̃91b/1n q p8[L&S%8=; HK d( EN\h>@=N|g%myY_&I^BƱCV)qΖ^,e $(\QKD_T>tss#(' H1aS Ʌ!-iAMٹZ{K^29$  ə]2,Ba'I-EDy: TWVP/nRyntv\~L X\ζ`4K*.[UU..`>ͽyy)-eeaa}*w*:dԻD`2鳧 Ԡۆ/.?ˡH 2OKط9={r\!JJK-˭ki^v(i4 U[MLNΙ3g*+*oQQQ+Fϻ˽vg[m6~'|F?(ʞ7:yd͖ >;⁝Pj;:W;IChwG]Eܳ+g}}6y͛7 n &-&j0*(#1\ҡU)6 4dTՈfx4 vfx̘xL&PP DKS?s)<,| 3V?), NJ" vGo?eVöhIOٳgyϘur(9E@ >14>>UTIc zNSv 6-PomnnNJJ>}򗗧7ˇd0׬]c_zlZ$`]Nv2P'55L0>ҥ#G@qUUY4 J4{Cه fO1\ts>,_YY7߶Q5nܸ۶=z0|5k, bG_{{\v <rHKO3f_ޞ2yF}m04 _H(8eҶ}{3ёĺurs%ʊJOOB(ׇ_=I^Eue^oh *M!i;lA;wΞ5+6.nڵ>ޟ| EѬxmWXv՚OhuzpO׬6m6|O?*͕+>o#QQ ɓEk999̊.sN3}> .@{M71|7WNe僂G=w<ȤO 7ȜJ{}媕̸\Wvvv\L$ ix> )$ZA놠Q~bRe 'PK=fs(.q:yF3ړbACnAKͭ`7H$ /ሑ#AeFGEo@pt:ӳv+ƍPa/okƟ7BCWO+Ғ]]]{_Hph5(:mw~OW~0.>BPpPK ͇y d`2b{\q^8n)_QY١P0t>m>l U(Sll'x￟>}X a~~~Rd 1,9sҥ`)i4FxD[YiY[[iiӦmۺ!@@)JeYy&h˜sGTF3gakk+|XXঘ@?s…[i߸íI%G]U`*>@P+͛7/?uv:I!S5=]iSAdd`QNЭ/Y ne$z*:::6.`4,Z&Ozhw7W:Ng&yiN qb-_wD4-`G@X]lޭ/E"8&ܗO4l4jdGiqhܮD=$k׮]4k+V [_|9yWl2_.$uNN.`8ꍦk@v O"B24jDÄaf"ؼ?vF IKWGmR7['vW1woWjb}XEEXag+jԪ~GŴ^a;|GRR4cW֨oRmU5k]Ծ<~m'FcaLj%ʍ)T;o/n}(pQTX*&.;H}{DK*jTn8F d$$$BGaϊrk- +N7T)ԣR1'ҖAg\nHrmikIc Q AuwfTH4d.r8p;`c`G6BNg,v4jIR)^G$`zZS9D<,&55޹Ci!Ϋh%U>bNCZ˝kg{v E~YIZzf,/[ :082=ݸvy.J1l=T+1P)7gvRHrZڵpmayr ZYȑNy\nKiP76-ܦhGw^Jm(Q~FL V< \Xb\2Jqa =jj%mnNr]f1\6pX(yxXkshO$2R*C<|GG~{[GIi (ЇMxTwB0$Dy~!VN}I%uO,3C|v$~!OEEdJ:db&P!bNgr㫪W\6/\^*LJuP،F9i!`@'u*Y7)0NvT)#y ̃1<ۤ7}":yLPcC;ȻQ`l4ˑsG^+\,s+dTGDž;/86W3ZciPTw[FxI_y@bfP HY.!raaRpEѡ,,i`4'$899tP(!!^0quu˕EŖ<"gέZTt`LàW+-1 G~>[k,>"C<@xL&KKz?.-4Zourgt4ovNQ&AȆqK汙ЕN4brP?ULD3ro`{]M/<鉝a3jɼf4ɮNl?/^lM;:]cC?+3nbrh3c1i :>r-ń86f30`8/OM/U?U@1&D(U@NΥ&5<0vFWgyL:EZ,=Ǯˇ`P~;=1+UĮ@硘X&2@V,`!X@o4 M57K6*asxƤm{(,ms uKDј #'Owwvgvf&Mzl1'lrI9RSuRAj 6ѩscUsϩ{+3IRr<}4Ь>P4 ^dEAc/\I+%aS]nxWP||eZZ4Y>o޼LˣTI"`Fzzdc0hŊV/ )p >…92YN$iq ͒MM͓QooL.t~UI?6s*iwXyJ$P z u:Q[[T*9XUUOZ[[aN4xM&6oOҢPĢsƈ:}ڱ^ cSkd x0TFeCa f}?)-WRZT7ECQ }("#WfS_e0{?z:0#< hPKX%P7H5:.!8=G/=&[>=~I5][ uꊦWV ;'T0=n#iC!X ưAΛ%~xb`z}_k?[I:i&7../ԀuDg,1\ħ6ęVѪՙ@$t@s8x&dHU|A*njvvv -#6>oQ£b0ٷjx;>V.^XWWNTT׬XbLkr:?aVUWAz'^OxHv^C_\Nױ6l}+>M7edt3ga4裏Xs݃b1@h{0CY 4֒tV埝-Z:Gzbpy C#, )KK0:@‡պ6 m?j'#hb:]QmH"2bsaD*bTID%$ m҇ zAM|` h kz Z0`8":ћz]~ a^VOj:E!P`YnDۍ:VK,ȗzΠ7mJ3бDgXRy7 :ЁUo  H b!~ՠιP;F,lN H⤘?"EcD:!1|.\`D-pNiNwS)d`PA"ߜ>5ܬb[7J.MQ\!^23=JDBp$ɨꨯ\ <64.6`0T^ƄI8p(T3v1}_(%HK!>7f__XI *t & [[cx9ve iOv)X0tgbaEեK[Ex$MZ=&E"'#R! \Lj8_`%Hƒ𒃁q?.A)DʏsYyٺu2C5$KKO˃:ƒ(=0!w\B0"IK|J9JtJI Jc~A*X6Lzvb6\r,3YYjk8 NM ;5 eD0gzwX |iuϥӧ`1h4b\!'ª~FakAm~A>.^kׯ9}9?xFт"O?N/Zp=.Ap'(B͞={Cۏ;v9&i&ڵkW+^ (VP ;wN=, ]ں /`ʕ+׿T5\w9۶m;v(z=,6lmi m6n?0oL0ؒUJ%Lp<@!ϸyˁΎ>7+J&[5zéϋw3ۡCm݊n٬֥˖)UW^0Qx&ٳjJpn@k}|AsArxG~655]p?ka8cx.]eGaw}w߾JKJ?O qHɧܹ+#3noBӟS j.sĉ/(lԁ'G#~e p*gaN3M&v] y\0PD&XSh8$x0LP3Wc,!Regj5gP`%oR0Fu1 i8@W_xv vp$W"DRJwS9l'ʳO? {=J.f$4D:CNm 21@Lٴ$%%"3*W^dcI\k Z[Lf3:>oP(q8p\R(F￿{sΖ-[̓"[=(5K|_BxGO<į~K("99#NIe0~YR .id*q&1G ,Ke+z{ziPyaKk+Ӂ~&ɰ|Cˊ@$.WΠ% M+fTLJ81+Wd20==aCx7nHF.[,5-u$`'|mK,ExK.MHH@:]ַGߵk\ڼ \^)t rT8|;w FT97+رc𽽽V4 H$,kÆ ˊɤ&6`  +bbm6ꄄt5ݻw//.Fp۷oy VG} /._^BHl6 Dba pofhءhbZV4Uh<*//X 2;0O~ɿ?SIRZ}r}t_I@r`C \nxӽڎRD4-DO}~g⭘@ 4Vi -ث~Jssw[ :%Np4w2'#[Z'E^4,^cz"KSJlb$OLSzv_SIj2;%S';/&1(;`a 顶!B!e& tFOVq;zle:ϓ/׵"&HH*Lp8+$Ჩ9B`-Qj7QADmVp9U ïKںRJ]{-)3/=r.-/;S>qlm+\,Vϻ(r)  gzb,etBK7[GW61\Z: IKn60 qk8TjwN=*9ܸ,a`}B`+6(mq4T5wNْ5L|֊N8qMJb8"U;^Eqh/j͖Jil7߬3$ ijLp >Oz SwsXX>I4od.d&2NvLV7-Z:|.-T'4[xbYZ(tSt[M Bd>ԵL^4u 6-.\lXV A7ՕxJ$FdhsГ> â%IJB`|4ZOg 'MuX谩C<^3'.h+4ַ^>CRX:,9Cn[3PKOŌr @ʂ?)@<6R]t@`5M23miBufTghT} }H]:8`}}}RhxQ`IL3Maƍt:Hcbc!By^taث:fE&GrI+oϟXZ[ lq81n%Jw`x\_?l-b0$.(xrHalђ97u[VJ!Lj.NALLUPa X\:AA \pO!!aBJRrP*H#7w<^h\ɢ׵Kzwp9yHAs(}jUjSllsC.cRkSxPӇ$ָz^W5M& O 8.} C{hAVjjnn(`?si053=wxDubUUUx_#V׌xQx Et;zt#%}'Ax%O=NxU);mn~gߏ[#xD:n*J?uwpxHӍ6;'c<, 7rdT0,aa{t]mݖ#LcfjnనijމKu' 80E:`L ! q 8RIdaSS0G-GǺd*Gǻ`2v8rd p] E # ),|gZ|,σbC_![ BR,a+XBc ;0w\F_%|/6,)yx|Ģ< t58HzcA,4 t,ʅr$ٺRcoWWXjз:,TAfSg??[Q{~}&E ՋA17DYħA?:Փ,X/L/<'ZfHKX頓%QA~7?7Gr +gw؉>ܶJ \G/* *3SvKw`snbώt}Yɼ$Fy">rTqXxEmu^1$[~|~QQ4Y^^KBUu|Gq(4jgS7 )YI,Irĥhmm}o^ٖ-[~,Y䁵kVT\xDk7o*_椴tTO?BP/Zo[Mx$'?x={ymv1`06l~UVf捛7yTDKs˞ 755._EYlti{?۶=z`yϞ=FnۺM|SO3Yw}d2575?lj[(H3P 0!SF]_][>7N52`x;Hgtuپ8<D`̮L&cv8L.:FX_GYLn~lք7 86ɀnӜNhGhI[>1@+ܼy Ԅx0<.W(utggg8Z>RgGu2mzC%OD矃"(..VT"1#ȕ^;`졇Bx`0.\ 1NRVg URp6C3 Hijby`KK$nGal¡/BBѩ)h$ήk LNNnni1T왳AS?xP<}ݷswg8j` ӅټoppAg@=q%* erxQϫ;v_ HMImlhlРפP)׃t葠R)Z*RP=JE!LBq]iu}=qx|[uTܩ K^`lia%<@.'ZM ҥKb]`F4 -F1 ,..NIM݆caxO< B0H.[>-[> hg̝3v4 ح6t$--m箝(g0 1<@0Tf i&: sU'`v޽yfglFʐ9۴yr&Q~A;[nR /Wi#t< j7lܺmT(6裌Li S":C34C&;<@Ն<׋ 8Z98+tm^տ}`$ pBʼn?47h OiV$hIimۘ2C<ڝ#;}~GMjfh:N^ FT: oxM{qIe:[(:UoŘ:*8c}S%M: n_M)!C 3JE.Ť",Ʉ\ҜN_]+ݗɠdE}o50LB>-:pyǽE7ֵ/Y7T.W+ɽdwx܉Nyjx}ĨP" 'j0IuC^X,Es=_퉵y y#0B k U{mο}"q_^m6"ZIUZQ&%M~`0$>Gznw4iO-]EvZmGyo‚e9{u0Tnx>=Mz{uZHϷ%'ō6wkV{kk9鷏VSf$;m6|ͣ}k1Q>p'Je)^73hV! &5 D"&3)Eq5Cc]^ԑn,8e-9b%a+vf$-$<6-;вS$7 _]0X=^pE,?mιiƲTv)V֍:WeX>Y &aء7V,ds5Z;4*K+}>JT SXZ$Aǻڡ[+Z>_Dz"^cnd.% 5ܓP^zl;7*]-'{>kgҩ\(OP/^ijNyIAC&2W*GR{t \Rwmg[V(I+Ғx9 f:5R(xk$Iߓ@!h̉*4.'I j6-ǰf\ǁƍgϞX`NP8I|v61im^Rl:KқM UJ40NHQ`=:'8v:pƐǩ%zkĚidXmvU5T26-+U4 ;|KRAOwh{WC>utzFB'\X$ʖ~$fѲy2uzKss~IN?wBJ% 'ǰ>LgCsbU j]!e̓+ v0/=yLSdh^ffXyq26Cz^z&%MmyVSM`\hʹFMUtKOg_f : V&DeP 3d |_9c|Lt"jko6[|:XwZpQ jN~vm~޹g+*:1|7#]3vHW:DB ?q:W+8l}ɯvz;(wm1¼\̣Z~Da\;(K_PVҹR>+(O r( 󚀷#,;| ӵk┣ f$!d?d#C!!8+jXiħ F UQlaLKc"pP8+!NSIOmT|& bNVJ51?F22B xiC2CcICǑQ<-8Nt( % m Cw1%~-cNH?É#pP6[C<^q+q<@5od`F)T*mXxofyynݼEì  #p ]M(` *"0 e6/˷q{I>rI~Agx}^BA!<@MTT\iN] 𞬗C38]^ٽfxԏJ!K*Q$z -JVt !8" 5'rHdxQ}N_xؗbCL`0y)49} \KHɣbx;Hl6[Mp%&F9|[SӶ({82懊A=ZXMA>}AaIuϡe&A`|v&VV/CG)8\>҅ \ˁq2Ocd+Kn8qMJAX'l>{j{Gc5ýĻ 2_x{oz;/ҩd7`[zÏ|fެ7*bIJ.ۇ!=l>=:,3qb̠ 6N3$xlQ^bnp>~kB+oqFJR"|CuxཎNb P fYx~ 䆆:]vo[[`ڼy~K>W˯a~Rт"}|IYyv7 K߷o݃A2/>777F1;;{۶mǎ+//ujYYgw?ojj &0ׯALΝ;l6F ߷媕_Tzg99[n=zիW/Tq{Mf0k֮w3[juwyNCL&P}G`vA?RgO,8m x!9cvnP#Z4,ٱ>+Lܯu)|WW4_@ ~[m "CͯÙ99C( dVāӰf~=8R)q`@b.a$ɘa.YWS&'"tP nlǖHt_0})Hϒ荮Et\zzKR^ kis&.4ЄB&$zIH3n]QGf`Fd"[2Ԯ".gT*) BݸhQn}]GRRrXMc^/7RI޲ !Bu.F:t˳Wn@'%7uv᧒C) \.K dW5/ԡ[_dR =NFLK%g|kH00N]vA}dhn~b^x8?lx( CtPVGo( =_~Pza8?} oUMMM3ztMUJX[¤NS~HՕsǃ?)dJGG/~uB,y&ZLRS?!2|K/Gx/կRRSҏ <@+ X_/A~׎9fʕIII?<իV#`i/V߰./YL$l07lDx~_B0KgK-7#<-[ [VrdUV$0ϐL 1t}qŝUwNk3s+2Cclr:lfY ˘zdqitqWE/M2 n3gٳ{{zm!l/AG[_[뎫妋s'-|hKsrBmVHr8(Z4ɓ)^_!lpZZ9ED"pRc 6g(0T僽{}1޽A:QAqJhN㏝gܞ73dŘ1T E{IV%;28VBSF,8^cI  Ѕhl޼9^Sjjj}C}`R*E2 W_}~_Ciiij_gG'ܞ8eV '/oT* >֡ 74|H+jjK6 Im28Ru]C:ϝhJF苜bX/>𜼏oՌ[1C34C_Wb&ϧo1dDb⅋B;.I360,_}v<.m]V\jݻwAu )dΝ%N} 6p9\R[f@frL&$V qF.P_4?QޱcFgݸidV޴y-[ <@`b?8Vw&`A,/X !>$!<Ê0AYo "ӕ>w\|'zrʕbxhOCaYV ~^4C34C_'y=T|*P79/i]z ߵ:h0h:u_TݘVD?S*ǕA *1nҥT3@+ug-4jf(Xl+[51@D :J*)SNK'I<K`{6赑RMs+͊t]P8$WnZuAA ZR|_樭i_V?Tv̄3ry;>}ݲq#I*l%'jӀyrIV*!(F0_3jb՘uѬjC$Gy4yk M =pZfӗ:lk k)2#`uzzT U(vD=d20Pt:&Da?t`mMb2hAVw{|K MAl wЩ&5Bs5Hj(ddPn\'40<1Šu0,[::,@:9f3T*\hX0;2,:J Cc6ۚ{L|o1Mc20>}Bʅr lszYL 4'Cb=tcQ^$R4*e˦FNOZ [R90mysFJ/,tl;-GBO niXZ|NIqC cCH{2HIP*z`2AZŀKUmmmQF3:* ֬^ @&94ġ ˕Hz ^YmDuث E$׮͙;w­,UYm&%0).jF[H8\ C)״taXR1sEnŭb&,O#X!^@eN_մdb&H`z&@p:fiQ+ABN^j>'UPnq *9;CxuG4>[Ō1ήN/ }ގ3orc3`6dӑ<~}ykH[hk3g:Μ>bYY뻜ηzW_ {O<m `?/RN/غmZ4&XD (3E#cs1h"fv@窨է%`3iY)\@9ݖt򲦣OuL) ܼ ! ]Ќ`fu,9 ^!VSjwV(_7۞LbFrΐUbBmxcDYc)zhv9}&t@`vKzؤȥ8'zzG[)(/~=VES_/bb^*V]]Ɩ!{OaxNl6fljRt:OׯsOպu7n𭲠C&B!Ix6LL"6ppRFiBYT 5/??Te+AvxɈcB]&9\.7b%%^BO~TzO),7 %q- $.;+QQ?`ߎ疂_".dxBHq0prs@bu`8xn6NƂ7IN\1Ys]D yCf%¡ieN0P TЄ.ᐐjiQŰX&d"NɆlO=O5$$Fao,"`tJ CE=z# Pu\[C /*:WN[5ҫnfW{#R(BrBu3M]4{,0 :rP}@- peݞ%|<~U|mfϡ% ʡIRu>͙[矠+7'{pe ̒$FBFr,Y|ׯ]x7۶m;z(\b0k֬/]gP ?6lGݸ~L#>ao6@N}jժ*U<4effmݶȑ#!0g1֮}W^o6[~z/~n7R4:G% .|'C;J]4 r wW;Y:ɈEbWlfVn(ڂmE70ُ9L$;\2 ^PVB!hZž(T\,:0I᝺g f kXb$i .9]ڻL<.{(yk&S5W&aaY4D%ON#AM퐕F9xz"zcѢgn2YthN|(,>: B8(.O'4lsߨ3I(CpԨ %WșKZݧ~Cٿˏ)VF FU`ꓓ5&sss808`j"S}`3v vn'+Ç7n܀;:;]nwIIRpX=[t[okǏۻwի ťKk*UCۧ^z*HmvpI?!REEEuU֭[}v_P h-"`H.ZS=O[.3,DYluw76+}F$ e+,&=33ghΎ(IR20Q!,!ωA8j\VjN"YXaaF;1R͎A cD>\UH1}qA qQ Ixb~0d'`z OBJB;$N~M4?STYoHma87S(~ 9 F&f:P~2SBW,cX4wZ<3["PX>VA8&+)W̖d`bc% }]V<% H$(*bHSTFq3CD&j5Ӂً_Rar{q<@M _6`ll,؉P<@C=e's$?AldkKbCHD3229oĤuKMI1 uuu׮_{'^J]dQ!,S_>Nr$ࣔt1ķhb] y8.NƎ @H,5\_]ѐȤ_qTltx 5^* Xo*{? ŒKbmID &T'[#ۗ) YPˉGZ':%#3fx405I `FA$W͌!j%~l%*Lj|%*C4d 1ޮۂ0:YibheJMM7oqJ%B#Fy`!*4JJB: K"w DHKKkhlh0<^ 'N_яfdݍ~'*0 HR?% |\~~(򬫭p@.ښhoFzxk׮i 74|HE|-CHO7PziLҥK~232 F,0̌LY/1]8l`Dƿ}'^NRqw\1u-fh4U1@FTyVss38"8ia}x&0nkwhݺu'Oi)))<0 7xxs'߁۱|y2JJJڵ t<쳷nnItkσC=l2znʕ))X r pٌX~AyE;.\8SO=W%0BHyƍǏ۶};_b ,{챋.8!M@Y/\-Kǎ֬IT'nݲ,^.i.UU~7XO_??A34C34CPyyy}TkF2cQ 0yĆP¡N>Ovp$h3f Yt6L"cxtg1$pXM~R_{'n_ڵ8v.?^nZmvTKx^7_3Mp,FYOτjDBU I} S%4Jth&2NgЩ;GK[g&#.dEvWWW?ǽqݚ_&TtF>D#a[UM-T*5F"R!hPUr-6B2Q veɸ^0W8 bq2ib<.{Ri=w /@Gg/؂iH0?eKu㻍q~r8o' ֔<'au7SfFwܽ  ?%r|kN$O2㋂B׀ :rvA:#'Qu9wf_'Ϟ@? e! ="Bh %𛆆 QNvO_z^N1@7̣Fa<cg00{?:u1P4H\p4_e;HV,Hͮ߅/vĖ*+"v9d6`Po=E hFXA'bITadh34NCa 1 2(f ~acLh@(zKm }qx@;qÃگ.)%=#Tc7"XtVL>\H:ӄjZu&lVlդG `,F3Ux+eeVK9ΰ%o@`2HdLŖvfGsǔ+& j@>-%8|_3Љ {p^Warr[w]0\##ӆ6eqez=v̹˵bGRddc䲻I]ѯ&=[Zlf¿׵8k9lvXƑ M/NpmVm;@cR{۽ 7*R}F })F"8w P$_x F%s":3KD"!NbKf9C34C346Ѩq*?$$$E\ҽ7o}^2Ki)'W[,Is8=}^4d9qg}W<^oSScgG4I+Bf `"z4qq@JzuӢEs9N$IRC*B #jjnW+LgJյwƦ$Θ !Y52iL*a vWii)y]o 9d"}N4BOsp*oi X&noI\6;-Y#wC'W(KJW:F$>裏su;\vDҼWs,f1"s*ʝ8-JeCEF<27N[z4~/KEYJg;8ҷջ-ɖ{b10r$zzW+! @h@0ƸnUk{Wkp7Paov杺y杝yt~ "cgͮ+,)9;OכJ@T͎ή!M +!8$KeRז@nQ؉+􀏗; cD\Qk!";DVܨ46w{TQ]hu:-FfQTJ_ziUWWèy,(>Dx)r7t OLFh.NRfFF"HajQds8܆.;MTO DPR'G{g'јChrK2)ۧ7ru=M1vHվ#$SVY\P*|} ĩNΠܕ{ssSOqvv"÷qB{ R l}RE g,{7{V__,]UUY\\ze[@KedwevM`AҖ-[, -UDt@q).MQ.ihۦڏx7L&2 b/1fr$q8x_N?i{b̹zY1]55e{yyZd&MPPpE8ں.[hOIˈטNjSA٠qmTЩk<Ӡk(Qؒ9!ΙL&F7e& ?20%S?Uw>`D^sNɆBFgٰ矏bc & H*JZ|!U_T%H |hʶ6P([Fcg;aժ5WՐ̙KJˉޘ4+'""ΥS}#Pf/*Ŝd PIuzWۗ_ 3ɜKuI665 |*?D -萴YB!֭By@Rr9v^'/`Pa~p^V0cY9Yy蹦MwNkc23F+\!At:dz m<'h2hipD^$ɄT% 4*aE%'bz8^ pu{,>E׮^:~s JnAo0Yd:8ؗw[x1{)~BmJ*\\-DP(S203.RYjZfJJF nS2ZZӰ h`2p_p)/}}z nάw|(@piY_ь'-*)z.LyhLNIS??ń 'A328yOHG.W?:jֲ 2 Fd0h5:50Qt)|=߈5frXTsIt >JkΝ>k4=L7]LW/_(&ިy9Ć{LvЛHp2|5J%ǬAy,-N*Xg Pcb>=Kpedf?w-[@[` 2 C,"2%-#̳9Dt3h4ΤTR`z͛69u܄&oy"Q}]7\@KH(Y)pǘ,44di &s=3+z";d2 +W\V)}l  4AN'v%N[.LqzA]E,  bb$#bVvΕܫ]>f͌Y| \;wing:ivI[%m t:%bfL4 Ep06:sF4;:tA>?\΅3r7X,9z",4Zd0#R`[CdPWs닮U{#$Y{#Uχ`$6ӭC\bEY1[=3W")~QlOIֲ"+{UchήukWժ )$*,* Q|9!oaY`̅"'O2 _tgDRBfўZ_[h|Ob2ppqvJpK+Ud] ve>G;r݂/OL׳8 0i>8HנfD*)-=sFO?[Jڳ{ 87^R PZ^ce (ݾ zly$nnn_oEb3,ѕ ѣ'lbPS2A (ԝt6!.w? ?9>>7,DŽ`Ӄw̫<,!LHp i8HhI?: +-b{B0tzDPRY,ЧldYPidJiT0wR_2}rވԷMSyuLi{FTIsCiSYaA/뗙6O#8~8 1Lum^B-~ iYxcKӯ[o3Y+[LގZzqTT vv;4Z0l. Zf@DŽ*J"9D#6b2q¨_.W0$氥RJq?h`9}&aԥ ;تnTVQɠSEB:fy[;:MP^o+PM^&\f{@j, Ԡ.P`'[TRXjo0 fmlM&S{48^4.4 ͅU &y\JD{=h;mbI2D:K(ZQ(a(Ͷ>Vqy7acn*2m~[>ӥj9Cjd]r E?gzTk*A<4umĄ>Z웫C50HUXb1q\ޞjIX_g?G?tƂ^np)N1Vstqz∀FpEbF+jkd dʈqFmmGe^oTjZVN%0\.hatU۬r?R"j4r?Wgyy`n.ΣWTedBk7D1 :x#<f<.\E¬ 2#&μ`X9컃QEti%ţ1DJZƞ"i6W؉SW"ȵr򊪡yBGg'k4|UN+:hjPL8PT]lStZ.QYhB+.\HeY/ٲudjO:SRRjR}X?qי3 ]S)ҕԴLm, hWEM3;oZ׿}ogR(7 4Jt0/ֶ i\g"f1DlnsFL.:11~ztTsv2s z҂DZ9IL߾\va_HI{ 11Ӿޱ~w?@U@B@W6IF.Mc13+Rjx h,)JG>Q_b4Z[qH$ɹbӦM[[۠/hnN Brι|1rx 7Bi4Dv SUURdGG['Μ3 h ,L0=::R.W)2YӧYKzV!cރ$T#+ZiuЕku:׆Nj> XfgcG&'K||X,&r [ZEPHL"iuqq  trrqr%(SO9ru:]hHBAegDwtvUB `tuu PkW\3 h]ɓ{ m -4$X(NWչݱ`$QWpAΧLcCMb(LXX0ͽE93t8.a% |8q @z@IdRA]{B 'A'j=bmkN<ܿ\f?1yb^X&ct]qtue]Aケ}JQlt9ݜ/iWyCeeuQQ JUX|ϠxdS 8*j}-?*..O2iH-+*ZTjUrJ:lRHnjnrJ)[R->)i*) ,Vfce |YZV~ę *P>v4.s U@_kϾ%e@Xe(+U2@{; U%իMM$ϐtJ7T&6+Ch1 nV_J :AӛL&u;,~ Phj/ sr؆dI~sJpU9]@΀ӣ NjP]_֘RT\0@mmoNOϺtT*vEn..sfτ zF 菀0`v8ِ J`Pj6EΥ+/h<.HdYm%?uLXZV pl4Aqv]1Ѝ:Bl^DO  @4'֭] גEwOZh*gdA@eK>g>-Ήa 0_v%r ʀP@1ͬn^[kۥW1,xPB{{;Ta(EE19 Ձ=x]5p (r.) JV!F[x{y89g<NߡUьtzAg۫Q1-Z]SV b"Zةe:lFe :8܎5q=z`-mF +5^9t 2Lo؟GAy?,bϏ?upk3+hΊK̞"uF yۇR0> 1(bA)[Q$d#* W_`m͈NjøXTs t-"GGA%jյQWtх,~d 4(bL#grY:ĒhWi&mQH=lX*=5ň Ak5cpv[{]` k7BxdRxi#(EjQjZ$1b,?VhTZnHIMO-nB_̟3gų|r v漹$t_-\%(sbge9 ~=A5sG.B^zĹq_=F2AY{)φe 6h  J܄96:!>6%-czNgGFKAO] $ހw7S&O IMȿY ֢ܟ܅?8<Ѩ4C-ţ :=tE<.*Ƞ3@ƣ?AkgқQuNMvpcO)$7QALvl?HV$rB'ye@))I6L2iܖw3(.SS52 &T'E.Y jiC¢a!PI1Gx0Z`\IQ>Qt;=tvLfg~M>}W<.\=r2twZet \wƚ1EVsL3 Ks,対?<;AsRx.҂2s3 j 7u^T _vhqX}+z|yYлP$qO&#965)I"E%w{,2Y!Aj2?abvV'u MM0WPwuFWs"!~ a=W#b2n-(!ՆA_5"x{؎ͲU }"}Nx\JΈpM_2'g%!.vjy;drُ~z/z/$8FϘ c'+~,}%[Up<44x;{-L&jRBHWZFC){@>ZKJƻ%}G0ٳb'&_HIKZcs璹\s6BvuIb}}w}|V\VTTBcJZfQQ1ɼ3{ZW߀ sRln/O~d^ϽGBppK/l%NC >w!",,(|?T:::+%{z$ @T;ߣVasժaoh=zaCjkkg&>{Rn@@ܳ$,?Z Č&$< ;ٲE'1?YXTlwfJ(Rf;MR<>n֯j`w@y gPS\/OQ{Ͼ%KUŒVu/= ܸaFDq+}ٮ v@$9e'L:qbBmiiHkU : JYbEQQcYY@zzzgvS\\]i֯G}嗸Lxx˗gΜi2pGZZZWgWZzK/P{1~˗/t e'wu떻Ю'A`4|i]] .r.Sh'z' 8debG鴥˖#5%U*̶' j@$ioKʡ|g.,]4~hֶk/Ճ9tl ]]?j .± |! 0q |\?z{O>C#[clׂR!\ӪT*Ik'FP='N VKJJ@a:L&ϟ;opy\;{rni &d4Nj a޽&L@ ݻ H/^rsZ<}}uigΜfml^G,fXw{葍7B~ܳQVC_5$4*kTTV}nZ.W,57hTrprrmjiz:Mw;+5n0b74ǻ%*5v"Vc~MFboL7B ZEWgg{{{oG lGٳ@2nniNԩ|gL 8ﭷҨ@Bżya}YgWWCCXVV֑#G~+SN>:b===BBBMuh:/Y.O]N4Yx3谱j[k"hr1謭A,6wGzA0j?q֪cMd 3HJZw? a*iZԢxD"J>=m{&N,,,ttvBGY]]=gF_ɓs( ϡZCZzusKKŜ!?hv=/&f嶶.,4?aK1e/k $.ז: Ba2G dvd~H:k!Y]EL&` *`0$2NgHfF#hTٳ͛AOϛwуVTVΎ*--UI ́}|}V\wիV~,h9sbf@*gxGٿo?@" jGGش=;5=teN+c 0^ulVOQAX"0^3-:jj>95sHU.C"*J?z”7&p0{~66vt%:CsˣCtq˜9}nt̙.=Nt @0'ϝ?iqN^ZftZWt Km}h4~gV]vooo/VEyL6 FC}WVB po^.] 8p]'%MC?X,A0<@aj陑d0yrDNQ: Ó*/+ر;W{w-[fD2/1B\Q^Q\35%%11ˠ?,ɡHpHN<~3 @[R7jFF*+AacTNeNKKO< 9Awuօ}C/o6n|NTTptBُCnzD#@Ë{|񥗆%o4 p!E[N0c} 4_ٳg{ 瞻x".pÇ]zms7A #ߴy{f5k,(7A.p,Z{쩬H ynpŇڽgw``V;;vh5O#RZ/0=T ;#aM41 ^7ta@մZ(a`Гdr!{X0o^ ӵC0+̖,0 +W8Eer vr A:'R`2{ɓ'le0J%x(C + OW(jCh v:Aђ$H2R(t;Ah&0S qN j5}:N=@!f!nwv> h4 C=PȤ*A <ƨ*{555>>5ީn]o@zNow|?\e4VgBooo)oq[X; fXn9#Nw8f#x2[ [k/hj0~鹷җh*uo.L`)qiL f ||_K(4vPp/ 7}ﳔs(b 1jkk5hT][Zix,TI3"mX2;`sl9@v v.* U..t4xȖrq%WS_\!]?mxך@7t`S @X^!5\TokuRuۼAN! jګBx|~QK4Iv}O! +WR?pGo/߲e[o՟d>x vǎ<7z ׿em=U*fx].11Zlm3fvo~!&s~<'OW^(/OHq܍7wvv~pG Fí[D @0 hAAjP&*.^ls* (d JB5a*//[Lm۶M|!>]$,(.)' qqq3gD?|0 [Fusu[HyfIIk wtbv͛goo_ZZƟd4c,WȡťG:TXXbJl 6{SSJwFhX%99ˌ]͵bfXlY@` m̸C]vbښ4sx1*L 2B Fa] (ńdsJGGEE]ryoڵkpJ ɏ{~55EEE$KGv<n6vΜ̌ZǃqKZZOugsuPzz9rx={a\҉:522wb6 ~5(6ą(_ (5--!>aرcwر(*%%Y"#  ^:sFӖ^9sëTv\茚VDg St=CPe~+B쀑~|Mgggg~!a])+/y3uC\Rr\.R(x ]ͅŋܼ;'NG\Agwpjll,.)}Ԟ{5kW*]Ү6@;hu-V@W|, B]| pyyy@{֮t2?a„ ɠV)9@<{Nv$Q\u,Щr,Z, Ry>DQ* z@LbHh˗+oq9`6&&iv3&pTŋUUb@@B\XS]#5Wff\ƠDe0._4;6hn.lmmU(Вt:? ]&o޼I2H!SZw#Ơp\adw'O:֯_ 5kSOnvswʖl6>zk:hިoI)4JtYge߆q&M%܂E ? ?e tV^n`tvt8(fwPsurnUݦ͛<-Ǐ߹sStŠ ̟ڀ[ٲeFςJ#as֮[  i󦬬,}07yǎ-Z?> Bi4:m  0= \n͆O FU[X93 rW8J0MUuSmP-)K,m#˥R:NQ4fas82 (8 (/;? ;{'1Y˥ g6كhAuyaAcftJ(y.A';`H:º'֍Y^&j$soWr%7w &8'~hw &Ce[}ZivT FmRX|ѭ3v8 vxv9,8uo^E&;q:{Q,M/vMQZNabH|"Սw=i53~]b c:`'|qzG|P,m6QGpV۟MN v{D`2Mѷ$@cԹ E޽4`_0TwM)K&;y qL ;cvuW~ #۷ΞjVZF?ww+rEl)Fv*9@< J ,^H+--=anbBΜzlKՐHlf%[~;c9eJ2!!зefd'$LLN3b$>>ܹs'O/Z{ gvvtFDL ^^AfΚ  C9UUOJJXO9!  P`!v`LV`^ Vպ<ÃB'yvkE,g;-gev%nΜ)WsFQUrprs8:8DSNi47wv ˻qST0ܽgOVf;ۿo5__iQEGm6otfF=v 'n Bo_X϶Y?}šܓn4IR4vAY$$?k֬g}_~%bo&.`ɒ%{s w|뻰0OOOKbAve>8^x~7#fd{ܝC ̵K; R|I @c (;~JoP(jOUy(SQEyIT3ڤX& ׄ.<hflAt:Ntֶz(6cؐ da2dc)j@$i3Tq̅!(h4;8QT8ؚQ)pm? vEm4W={BB_[S;hc vJfMRJ  mޱľmkmetQAN;SIQ}Ѡ09| O2h4RbP0c4.7,yAB,')M4c73vρS#&'L\N0΁];W;k-uu4m5ÊtEFh jڿ?-mdc' ħêKZ̿yy҄%@˜ttpv,IUP_:=x+FB7oy.܅1=ybRYo(=oN^*j˒?+/>~xzb *0U+2IdšOlfO{sӂ)^3֭۶[Z;8:ؿڵk/Mbb/aÆ˗/WWUgfeBb0_|?"hΝd֭b>!%m[]rb͚={6/"$#D۷/ ]vyzU!ۿYn݉' k-[yZ89@`Er8S&~3;̟jۭF&gO: T}5L1e Tmm/G.ZN(TT@*ؾc%sN:W^qvv]*{~g55AP_!eHӠ͙Dgҋ/_Kq?wbF^E={"##CB*Մ QqqqžO$@1ă:3LJz>Ñus|a 4&x]]-ĉd^ >3ld1| "$R)^xyAzM}n&^_RZz왹 T!e'2z]qIsg<=f@^Nsssr8S&GDGE3n2hjJ9lò9e;&+K+ɖORl12)MpLh @I`H9L%І&$ 2I31G!4$SvZc1 4uake}\AI^ɖ7k_o}iߧog,'wjڍO| | ,2s[ֻܾ}ڍM +BO֕˯~9cDqž‘"nbl|R*h3!1mtX|ʟꕈ[ƍW9-oV`Ƕ @ ^ .Bc{x388ĖɝJƐWɕ bUZIUBac+(S[op!ˎePF X,f?K( %I-!+A J-QFc9-AVUה!ww>\9vY'ksRQS J*(1^Qd% i0zٮ뫗2 LcՅ%Oűp`Q3!4{S2~?$'`h%̍7zABud"x}}\ 3_1±}y֙/\AGCmKu]!a*7?G__.uhH8`:J۶usl{0<V;΢ŋ >P!OMv }B=`,u,xẵٮAo[dtípYAdx>ﺁpQ A]QM?wӭ==$*UW6#a LRU^Qa}& A).cM_snvfd`5 C.>_JK ѭO_V'"Ѽi(40jX#n[nF>?G__pkI=\`˯*.n %8+Nh=bɋ|tjvGƈMөWD)cDh0YGo)&ovTd#AM\ML$V֟[68VvNs88E bOfw)L{@F2R">! D*OLJ6tkv:$dGaK))"G7i 1舗tHSJ,=5mVƪvdڌ9e3gXؙ:mGAx#{+  w0V! k wDBCC>5ߴH ɾ=&5JUFVmA-NXF#]ZZZI[T*5~񎧇nniTh4d w*x1 X_ =lQZvCbMplHH[8Z,,BPU. :|TT:>₧Gp ĹhiqI@+>vbA|"E}~6~O bwn7+*@]َY׼=+7߀2SphXBW@+tI d yDj$XV\~^=6@R%& -)rJJO;e H!#;-oyu(9p%MΎ=QOddD~NVbb<دY@'N 5c}]! nےh3r]YyHZg]w7>O >K%?jup¢9 %/l7ߞ칯s&JSB9p/EQ?ܼ}9 bSR'\}x Mf3ϦkA|*d r-Y3-|NRs_X _`#x< m 5uM+ ?`/월lܰrI:Bl&܌;쳮Oi/-oF&Wk_W:qn޴U ~$}kڵ2qW.yON@$J__iqt:]{ٸaoڰ+tSݧ>OS_2` JRS'A;qa.4mBB:oS0qB Rb+i[~7*2ҲbǯZ̺fTy9ָzR"x:t(^&M @Kys]egʝ4Iex[u2}ʲФ5QQinnJ Y3$ DGG/?R|S՗kj͝m_CshC#V6Κ+WΙ*E!{^cXxB&';JQrbOgIt=/hTD(NhSиxKjE@~%/+,`P[ʋ1 kJkLƍ5 T 0EBLIENDB`PK3d͡-Pictures/100000000000032000000258944E0B39.jpgJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/-B[X>Y\h4;2T0DQǧRs'1Xb 2HuvzpK:U<复uP_o\x?y^I/>nZQ{&*Ko)R|Ъ2G)Y~d<.5ۘk,6֫+iksMsKӿqŒȭߡG_m~Jt1'Xis!p pH3׭VmVKj],~i۸p3z#VgR(IߡG_m~^Ӽ/֩%ݍ8H2emFXϵi6oS+A}([FWҋ|УJ/B5;ɦNXN%HfhL0_v<+5֩-^3 #I=1W*o䉍I]&Wҋ|УJ/B4$ĶYKy.7r,zO7ij6fKG3(2C)댏~Zo_{ +iE>vQߡQǡjKo|@5rHF@'JmƍZ[6m2I*#{]徤QϝiE>vUk2NcskSωpqQUj,М-4;o(ҋ|Ь)rQϝiE>vVer4;o(ҋ|Ь(AiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~QϝE9M?( ?;o+29Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o)?K_+7)ZߡG_k~fcڌ{QʇiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9ME*3C$еE~{6؂k£*F-u߳А+Ԝ&4!8&̓ߎ0o9U& CZU%Y;|ϡ⥸ }+KBm%}?㩕ZW]"M&~iN޲[t{m~Z.sf{fiZ8KBO;Y-Fwswn'"av 9AZ6+[_ﹳSJWr˩gE[Bݘ۷ŜU?Ho-khy?gqDo8͐մg2j奵 eO\wlY{_ [S^ߟe E/kRM+O3}VAZʩQfx\v!9:|:U6;g0 Bp 'v?o|۬Tڮg:|D#e#L~OG uͻkmӢ[*AZ:Yy(\$h/$|7:թ:]JϚxʺOT&bVjTQk_gqlFL>Acp^3ۥ?L_U!GOTMSXt&~Au4% 3DҴnq%L6rckf FA`NHdOM~J[E 4̎Ͱ PS7qfoQG&/*-Ӗ.i4_.[Cyo=žV.2¶ 1zZcj%['4dzʓHZ6h`8޹B<[@s1T _z#le??-xZ$Ӭ BItX"e!bG\]!-9?oWn HOZUɜG]!-9?oWG~FT#sL_Uxb>GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gh tbſ?G~A\O?Gh tbſ?G~A\O?y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>G|/-я1k~Q_m/wuݜ+{~u|colmH0KƽxjE#xW]n%䊘0Z˝*_irmb#]Xi:_ڭKU>[e鑞Xq5_? ^Vwm͜<44+sl =۬Y,>ѯ Wnq7 +RR}Sv+un8X}?mx7_+>u۷}@m>tww%*4CkgE)9-=k]ًKg kB!p]Z28yʐqREK fIq0MӾ@*6D(_ے2|FQҵ4KE)o<<0l"DۚɓntHn6\# "X9:Ehi6<Evf&gfH]Ha*رɱ@UDѠtzʢO%.B"DTwF@`02 ֮ MjCs$kˬi` ëD،z K3@ HX3`d n5 YvrGj"1+d kQ[ Ry`\J).c6}ϗ߂M͓@ ^[^'kx2r(pOmD:hs^Ek`"V#EugYU?*AG0꺄ZgiuL)S C#V?ދȌwm tB- * thq.wwVEys$iZpIF\1(Il-aC$Җy"LB$dYT3*6eñ\| _[^G{]A -u$RG7S&A>U<džI,XF…Gʒw27uphQHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^G_'T}UXjj>g}'͠šgn\n$kgQT}Uf7?5Y紐Sl2 e>eyA?3yA?9X/`/G`/\o?#s'Fo?#s'G+,ݗ%,ݗ%⫚n$hn$h`teDUeDUsYMMv_v_k77T}Uf7?4f7?4r:_"_*"_*FO&FO&VKX?/KQX?/KW5IћI~e>eyA?ڶQ4 ۻg;ysG+,ݗ%,ݗ%⫗yyզ(ԳT Cs2GWK"D&<o d~bVSX?/KQX?/KVM%ޗsHN]#_YTouDsuKX?/KQX?/KUEߵ}___ξE"_*"_*'񵷖"BI$q*I)5'"~Gr_ξE"_*"_*/?n42Z5",c"0p~SڴU\^*2e>e_Ff}2&,ݗ%,ݗ%Ff}?_bo"_*"_*oik.NYej7!qΗ se>e/L[ O9e>e_Ff}9?v_v__鯥ot.b 8r1cv_v_`>m~(̰oS%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%[`mUI;B9hV,IߖLwbFIp84X;_"_*"_*_J/"E $7mGkO(dGD<C9X`/G`/\ZMkt$ X*6 yx$B9',Sr:"_*"_*_J/"_J/"VAX?/KQX?/KW? O|EQ O|EQ>e>eA)>A)9X`/G`/\/%?G/%?G+,ݗ%,ݗ%⫟E"(E"(`teDUeDUsh_Eh_Ev_v_}T}US}Sr:"_*"_*_J/"-0\E,E8'4YT}Uiڜ2Kmb71j2Wz,:Xȋs(Hs9X\>eo1$v:V>vwH<MvIǩBxVt':ull=%'4Y/:9+kUPA*_yI;1g88b CE/^CRnD8]/ lu?AhfI=[ڐPN(rˑEnfNgl/k'r6vQ^;AQB+>͡ O6Ish7)d,i.WGhREoYBJ2 ZZCid6nv2 _ɜ;ln"7>͡ Or_K$b9tkF6¢4pw mh_S.6<5?hfп熧|]m xjQ}BwGٴ/tFm xjfп熧|]*ٴ/t}Bw@hfп熧|]m xjQ}BwGٴ/tFm xjfп熧|]M Z1TO֐-_$ѻxPIg rGJ͡ OOx5??o/8\SZ0{XAO֧afѡ@ WP+Xl6e ndVn >ǣ pDb16ssOVy&/ >nvEii@19?lGBtparzE$- ;Y\qn[6O!|Cuu$ص?p~o\ڊ$^cw;|VR7m{\Ė"&熚(_%a౶pthmcidv>}b9Ow3^U#-JqYw9$UI$0<55B+&So`4p|Q{5;;FMwPyfQa";݃: biPixPNCE$1ű@ۤW; i'G[=Jߺ;udiev ˤP_;i.bA>%t[ҙSдT]:U 0HPB1q4v֖kocip<9 fwP9'pL?xi*v?I>ֿ%kWػz*I>ֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%hZ  z*I>ֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%hZ  z*I>ֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%i>tFY.v@N H4YуqF6U~,+xt뵝̞^ VQ8DB#rdڜoCzq[tԻIOw_jGѻ1-zHwɦqqwj]^)@vـdI6;7uIۍ-^Y.Zڄ&\ uf?熧|]Qm#xj.a}}V DN<] %ż UȊ6@o \6,wL["gb S ^m#xjf?熧|]Q? 8.$..7mvHp7w퓱V>ͤ OG9EX6<5?ꏳiS.f?熧|]Qm#xjcG>ͤ OW}HuGٴT\ UiS.6<5?ꋁ^m#xjf?熧|]Qp+V>ͤ OG.z}3m,qM"Y$ȫT2m#xjf?熧|]Qp04=B^Msu7+fa v!ͩϽ"kwW:s|Ћhof8R9H4H6!pTai7 tV`9k%ŬE$[w/|]9cZ:ϳjg-6>nCZ70HP5*,@Ϸ$)jSxCYQi|  bh!I vB.<1s6>njg-JFQdq+ȻaoB N-QsڟK>ͩϽ(`׹mO}%f[rǰk6>n_Ʋ읉/Bַk?ZwF'~QE`hQEQE`:GIZ6+I/uH沑`r-\\y?/];880:JԼm>98xtyIQw!ܒ4jd6IZ;">ES6LbV$p*^.Ц.2̈yB&hdrcrmn3P>iZUadnk7R].T 61./sM].vd*Wk !e źnkMWN^fЦ@v̆m\粒qA#2x+<p r46XVfA=pfH`vd"Cb29lfj4q=.A;anr: x`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ Yl?[{cIUY?봟Zv ((C]Mw$Z+I)_X aOjj]7B J$ޤoٵ?t}S{? o7^o{V,\z1n%B3 **#Dv`; t6.9 O(`kdw.]qӖ=ssڟK>ͩϽoN_/I&-5;뢶ndhA$ 6[ϺNavu+hܛVeUV2ꎏ3>ffv9c5vf[mO}%rNj;.>,_yki]{7 H08:7Mk%\*[,}LL#zt(TX {}S{? o7Gٵ?uE1ͩϽڟKآX {f[SXY#sPzg_գ=܂( (( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQETVnatm.pghnyq}&eiܻX0I# Kyne=9.Y e[z7 zUE؛2)wyz,QK4:ICagȾ’^]^IWq.feѐGn`.f66:ڤGIMBd-ژĮpԏx'glUhkcL_cL_Q`-li4li5V=e36ƩjŚ 4U${Oh+ (,((?t 7jO? ڷ[#>ESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVF,?Z{cIUY?봟Zv ((o-m5["8\3RUYR]%ޣԋ!W9p=(Ȱ((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)((((((((((((((((((((+#_?z}=ȱ]׃*׬Ox?ҭz{;QRPQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEֽdkrdXkE'iVe=(((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@NaWm\ISatVdg(c ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( }^5a_C@zO`2,i?J"v^^ETQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@dkrYܰ='?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatWo%vպ (Š((((((((((((((((((((5a_C@z׬X Ox?ҭzȱ]׃*׬QE%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^aESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVF,?Z{cIUY?봟Zv ((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)((((((((((((((((((((+#_?z}=ȱ]׃*׬Ox?ҭz{;QRPQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEֽdkrdXkE'iVe=(((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@NaWm\ISatVdg(c ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( }^5a_C@zO`2,i?J"v^^ETQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@dkrYܰ='?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatW#v.Wb6NMu_gm?oh_gm?gm?1h_gm?gm?]li4li4vFF*ƙAOGƙAO@h_gm?gm?]li4li4vFF*ƙAOGƙAO@h_gm?gm?]li4li4vFF*ƙAOGƙAO@h_gm?gm?]li4li4vFF*ƙAOGƙAO@h_gm?gm?]li4li4vFF*ƙAOGƙAO@k#_?_gm?f֗f-b ?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP]Y`񔻝ϙ MK?"6^gf$]BaX|aiw&+ c$ Hr??Ga_Vm4~uJf (YF SNI?޽[??GacQn,^Q?[HVDV- #T?}k?"?U~o0Eه'#+(]_?f97vOO|GQ?"J߀{u>??Ga*?~o0Eه'#+(]_?f97vOO|GQ?"J߀{u>??Ga*?~o0Eه'#+(]_?f97vOO|GQ?"J߀{u>??Ga*?~o0Eه'#+(]_?f97vOO|GQ?"J߀{u>??Ga*?~o0Eه'#+/=km4$G4lTmp*)<^%Jf.rE|RkZZ|4ج\Ovnc(ra:\>jĖ|g}or#9hQ\J ~MkXu#p3+f; Ny7S;? o7Gϝ7>I||Amc)Rgo3}gMu?t:+h~!_:kf o00-sw2s1lpB@P3_[SHu?tyS?y$Q_[Svn??gWn>vn7S;? o7Go3+7S;? o7Gϝ7OEϝ7}["gM>|E}ogMu?tiwV>Hu?tyS?y$Q_[Svn??gWn>vn7S;? o7Go3+7S;? o7Gϝ7OEϝ7}["gM>|E}ogMu?tiwV>HR}棠ǦڮǗa{G*221JSgM^bõ>V-tN,wڌwprߦkC^'_ڨXKyΏU ez0L>n>vn7S;? o7Cwp PkD _k2 i;vyRI9LG:dt-QE# ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP,aFk6 ) ((((((*0i_CLdbbTd^$V++Zk~!I#5,9$1ZSD.OmK\Ik,lUH8%:fsy^Gkk3E'x{XZnnuYk۴JQmc[.emêm5a fM֭YT5$n+n#%(JN±Zi=3׉%ܦ||ǟO\U^}q^-ev{&Vrw+cZ[y847U}G\Ҥ"+[\3OV< /F{(o ^~Q4h γ#ow#Ot9-N<U#I \[Im? 6ѕ2KxF A+/"ZtQ`(o ^~QEv  A+/"Kz}iHb$ R5Y:lt EVEPEPEPEPEPEPEP.0_7ѭ? `5M(C ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP,aFk6 ) ((((((*;,r%!3CRQUrko?8?_]GEW}I o~qu{G9|?_]@/.h/'6]ytQ`$o~qtko?8=d@/.K<hR8Rd)b?5-:rQYQEQEQEQEQEQEQEbsڬ]3`o[T؂(0(((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEb.?XˏnmSb (Š((((((((((((((((((((( ]3`o[UkjQEQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( X?7?^q׭lAERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEkjt9mSb (Š((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEFkb.?M(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1t9mV.0_7ѭlAERQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (1`zڬX?7?^QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP.0_7ѭ? `5M(C ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP,aFk6 ) (((((((((((((((((((((? `5XgFQHaEPEPEPEPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((Ń\#sj`zڦQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@gFL/h6 ) (((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ˏnmV,a؂(0(((((((((((((((((((((L/hbsڦQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEb.?XˏnmSb (Š((((((((((((((((((((( ]3`o[UkjQEQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( X?7?^q׭lAERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEkjt9mSb (Š((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEFkb.?M(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1t9mV.0_7ѭlAERQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWE Q$\OZkt!H5| C#_\F%DKPyOR_'E|6;B?}S4hGf1MRg9}٠GB?}S4hG{cjA3qL/N}unԃϙf3z9T_y\)?#7VmzGw .$9G:_|iOn}ڐ|1zo\g?9= #7Gj$[.n&PM U`mV4 \*>ȿZav3B?}S4hG:ǎmz~5+>:ǎmz7?%د??Pr-zΥs\bo^]_<5!rרbX2ۺ#m3z奘T|6qwеyye6v q0|(1x?Q]{R=c֑y$G|u  #,jтӨkOo.?;=΍O=:hE]q)Zj_D`$/̚DžE{Ky>j+)H2,*IQLwi絧GuiPV~&&މM>.`註ʀ݃IٞMP wW+lBe%ّ%* ӨkOo.?=Sk]n.Ӽr|ó;morUNm> }RPOBViٷ[65\64vWh^5;o",Q~T4 #[!d_}n/cݻVϙdr%~ۋnնscs3?_ +eV{>[6Ioum!]\3Spƍk~8C|E;6"N.h.^ǻv6˟3=73IKݍm2MRg9}ףX}^_̾\Hx񼽻Fͻul33eivI}uwtN餒O"V ZTU2MzQLAEPEPEP+*P[˖R2GpKyq<‚zӿ-vo/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - _Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj3??zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵoo;>Vٍkv}֊+JX,5Jp^oVL9+JW_/?PK3yjaǜǜ-Pictures/100000000000032000000258FC016A33.jpgJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?n3j753:IrA* m3u\ģ=-V&€ A]]ΕO9i#g(]Tb9;WGF).Haj+IEoШo=-ЦJ/Bʭ'd^V-oncİZ[7e@Ν5/N 3"_m~Qϝ)ĞMbYu?m ;1 ch^Y=Y.iwp#n{=ZRJ'_m~Qϝ{N𿛠_kZv6vF#3x?:-c>' ·0=e[HLE7 꿭7m_J/B( H&]:ya8"=0:~WPi,ZH x.9'\RI&4e%t_J/B( DГSTw&e-`G{S? Zɧͨ1-Ԡ 2=]j*~ͽ'ЭߡG_m~Gq-zU X!###})6inn.t` $ LdftGiE>vQߡU4;uͯ O>&MuG=EU\WBpҋ|УJ/B(ʅiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~QϝE9M?( ?;o+29PrQϝiE>vVer4;o(ҋ|Ь(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|Фҋ}-ЬRcڎT_k~Qϥj1G*)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr5PG`glN [B ~\ۣb o ^?~kBB Rp:hЄܛ2N~:mT -jTd>BJ1- 㨗T9CUjA^Iu}6U:zH_cyl?za׭?WqhΚ.홥h.A OE?ެfhiݺ,\dT$kڎ\=m~WoM+_qf}Liɥ[Bq۳n9ݜ{զ?Ho-khy?gqDo8͐մg2j奵 eO\wlY{_ [Sz_[~~Gdt1I4o}< XgGk* k%I`9vY+ og|\- XyLu0F7 }FћwvD$U<+]HtQpI>3_*H doAuRt/K5>?t+?LWIԨךx%^3VQX$7=I99<0rstqoahBP}X䌘|9ugJ!^,1C U0.*ѧfMb[ixKfiKmalA8➚xB6ZRM#IoatKvfV-< d L_Uc8e{ew~XTF o'u Yӵ{VpKi3 A 1AdKm/QMZ;*YJ7o A:V7!-9?oTF\:=?nSz?:4EjW:JIE{ 4c޾`v='GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gߐh tb?oS>Gh tbſ?G~A\O?Gh tbſ?G~A\O?y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W(^"<[K?bIݴ\h_+8V2xI),l]EA?z xػNgcaz녜jbp/UkmzxjU?M [s,9tqvMПvo'_V(| _HR@m|?0nol8sۇ$+5ø({Erf?2U'.WOdW j6q+d9VX#j/,4Sni<۬QK| aOz{t%F| K1a"C:Udۤ7ANF ;Zt[7Xr:|#=XW4Kt -|+9ssJ<=Q2FE|mxGVuݿ0:5⾋udOiZz[u_ݱ=nɺ_g%cټ9FMoi:۽"=0 )8zWG%ԩVl]{sx4Qv;cQīg$m64p"uu&,La+/:9+s޽wC!O3Uo`r>_9p_?͘Z xkKX,;И9 %|?6K|,a)^KVTi*hhRr[{x;Ok2κMw.օCີdq ⤋–+47uwѺ`}8U lP41$dZ$kh(WvRs)yL ,x`(D3߷5'-Eݬ3mpFAD0![stMlm+HxxUڊ;*(YM>;ͪ4đITcb3@*=EDKy\D|ev'd`dA]#Ԇ;xI+YT/V՗x^FS/u2'sNP*"VVto,Ii]\ۦ$~\qwsF\-oZP%;[h0eؕ"%ؼʸ=wUd5"֗mp+ +]94 0>#i{`[{g4r:H\rn2Wr-}KdfR/(2gx($&> skuwjnE\bW918!@׃N<6"bSm \3"m/&425[&2Og<=I$8]],, HpҴL,cP: Z748tI,DHȲgTmb8Q.&ZHC,n5PZL|y͋ IpY]i%Ye l%p en (Š((((((((((((((((((((((((((((((((((((((((yi?i׮Ws-':2oK9_/$!{+>e/}K^3񮩤z+`EH,N]RrOjhJaUE-3MBw~e>e~9'Xnu` .x $e]VdOu+l+$NKcau{qgյf}X?/KQX?/KWƲiWǓ@`qiF|1g? 诲"_*"_*xԼu"u]V!R` ?|r-: ƒ=##z_UC]g`/G`/^1oxZ6y(kym6FAk4[d\-1NI*{? ӖuM֓UzeDUeDUP^߈_??/_ξE"_*"_*/?n-pqdgDWxqnUbB6dU=J>ܾaX?/KQX?/KUEs[tD #vݽbtF`/G`/P 48?ΏFf}0&,ݗ%,ݗ%Ff}?_bo"_*"_*oikm:^@l((b"_*"_*ŧ݂zu-"@S؏ΤoikeDUeDUC G#3K]>O@&,ݗ%,ݗ%Ff}?_bo"_*"_*N`-HcHB)ٖm~*]~e>e2|mٖm~)hT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhUbHt|yxHbH`GņX#޼x?iשBYϊ~h_^7G y|s<]v)ҭKy~4^ef%Ie~}Í&v v}`j&;d7hv#R(R @> ?{@+i}f?g?#4Z/uwu =BFY!bT, ʕ}^7G y|\qbI3gtWџ|=y4WhR#:+@> ?{@+hХ_0诣?{@+h?Bg|>s?o?Ə ]Ί3o?Ə@> ?)v>#:+@> ?{@+hХ_0诣?{@+h?Bg|>s=SC$o"a+m,IFx\s?|=y4W'Oў!JUפ "4K|]00!Wy5t]HԋR _0ǨW^7Q.;^e{)s+a2vfNw܂{?/W%KºG-.{i2!ApC?s Կ_\Ƥ/ks}'Yexey&mqۤIPT@U05?I.k6"x cm͵x/ǿ3,~b V&/&Mj>#̵Ԣ+n@s =awXb C7Cko&< eQ25pYVpw)qeow=ǺKILlr獩X q?>4yewvn|kz-Z&̍7e`&,IPhgFXo+i[ "+6GL㧠˿x~Z˧KBn3H\rwf́^o[i}͹oIvʙxTg'./_24TԬ쮭@ " b9$mKhA,2if9bǓ?)r?>ݰ*t;u+ߵv%ז;X$y*FM[@-]@cl[Yi0]fC.7}1Km=[bž럲ֵ-*[׮$VE>Am4Pr$_8ҧ6̒]!)Pjz*pdMwn rZ3U[L)Z+i"1,;\XAc}|[ϫ GmJ?;+& ykncK>V:I[+;Ө\-ͬ2C܂!VSppnKv.G=m'"Y5+89&F 0 GдE_ڒYͻ.#HGm1aN84n⸏Mٶ %lpIm\is5EMT6=k{m'#bS}KrNLk<._&IWwDTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+C5OZߎo^wu,бY#d82 0x?i׫CY͊~eKI??Pr-z65|$?௟˴QEy'PQETSI*PƏ$Por|@?j3!;z$ޤS{? o7Gٵ?u5KjlzG[5M%Eʡ#dF܃ZF4Xl1<5IEܻ,v0~};^Xϳjg-6>nteKھs|o0y[<6{o515 ]'L 말ĪURMb%F1s6>njg-듹k55;[8o&)-@C : 3YԧU֛$vcdZZV-,(app&2gX {>ͩϽڟKآX {f[mO}%lQG,{jg-6>n(=^h}|Wۜ#5-U?g\Aje-(0(}T}s|RH۫"wK.اnv"F}T`څwvR#2Ќ֞̇b:F5EDҸR#3/cfTW$+7 di0/qwn-cuAd~k(ރ/XHυ%Ȑ_G Z5)co$h́B6wM\/t]-o/^k13@N{ӊ'ob`{y呥Hxb0hRob_@n$Un dG*>Wi h]|>ҵByA4de۴;sak->GI iWqآ32J2Ɗbf9 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hc[Z[^g_+Q^IQE^ii8svݿsV(gq5rap y`'tTyI* Hq󷆮%:Lry-1nTIo>QZ{E؛2x:KKК{$D (P1ڤ/ \Km,Ik+OnԟžbG$֦ho HtGIQeJvaG,Z}őm}2BcFN\X>(Y4?4Ev 2ƙA?GƙA?Uh.fZ?#gh?#gj{E,ʺg"QEfJ(C ()_ޛ_'EIScV_J>?*J/Vd=(((((((((((((((((((((((((((((((((((c[rG?o^hmyOӮ|O, C_zI_3ׯ9/9kѴgѯK;_?͗hN(((((((((((}T??j_//M1RkOfCݢ*((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':ao, 2?܇^Ǥ?zKI?/v($ ( ( ( ( ( ( ( ( ( ( ()_ޛ_'EIScV_J>?*J/Vd=(((((((((((((((((((((((((((((((((((c[rG?o^hmyOӯC)}7?Pr-z65~ dž?Zm/=$k>_+Q^IQEQEQEQEQEQEQEQEQEQEQER7OK}T??j_/i{QEXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ʒ!5?IN3[rG?o^S{Ig>'o~ dž?Zm/=$kל C_zI_3ש|$<We((((((((((((}zo|%OZ* * Կ_Zِ7h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9oCCok:ǎmzf!5?INK9?/̳_<5!rףi'|^xjCFOF,C|6]+:((((((((((( WRTUҠ7OK=sv(((((((((((((((((((((((((((((((((((4?ܶƼx?iצk[^g?*J/TRTUҵ!nE`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs8יt':oCCok:ǎmzO?%ῗY/9kѴgѯ^s_<5!rףi'|^;_?͗hN(((((((((((}T??j_//M1RkOfCݢ*((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rףi'|^xjCH;l͋@#'^mKfU~H0WgQ^?G"qp}S߁zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~vwRTUҸtM'MO&,ekW쳜dʻ Կ_S*~ٻET((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸchOw/%uh-c:+#}{'G:O.Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'E8יt':{B aLljqDO8:Oue?s_gxjC孍=?'}R??܇['{^NJF~_+J(sp(((((((((((1o[ڸU{%Ð̶l^Nko7_-S$װ_dQX,IA x<1)lt_o?M$MyQQ[,[BnRh"cTI29PۀYtH$- A2Y܊ W7aqO4}DoI7\$]jI fW򢸙y0E"/,1º@q*!U֤LAIIJC!-s  #~@o& &kjŚä\4Rs"74~aU.K:;znۂg5>`TL`=y֍{$Mo?M"-I M`E(g;wn끻WHno+X糸21[1UOI;Qp6~ߢ7$'I5Do?M$MAE " &h~@o&{?O4}DoI7PQFȟ'I>ߢ7$(^dO$Mo?MQp'~@o& &j (׸YDoI7GO5k,ߢ7$'I5Do?M$MAE " &h~@o&{?O4}DoI7PQFȟ'I>ߢ7$(^dO$Mo?MQp'~@o& &j (׸YDoI7GO5k,ߢ7$'I5Do?M$MAE " &h~@o&{?O4}DoI7PQFȟ'I>ߢ7$(^dO$Mo?MQp'~@o& &j (׸YDoI7GO5k,ߢ7$'I5Do?M$MAE " &h~@o&{?O4}DoI7PQFȟ'I>ߢ7$(^dO$Mo?MWSK-8B`:ThDoI7GO5xcTP]F>sf6ŠF|7o>S$NVr@2@nsGCCMYR 㒼ן|t':tt4ުU*7ی=8kx?iץi,;w_, CǵZ/9kcDk TӘ¯D47 ( ( ( ( ( ( ( ( ( ( ()M#O%s*6-kiDPY&.QwRo7_-tV\KDX?zިO\XiF%$Y.Y6[E*IÐTEV> EF_$|х 01ӊwAk7Gٮ-y|CdQ7I.$GZ[?7ɔ0SmU?1Bfcump^kFʅ#z#!t}ן?nd+uŔvE}8C]& jH\1\m?Qm.nUQ7E}*e (Vu!t}ן?nd3o\GoN$e"2 A_-|ʧm?AΧΏkuq5t4Fv^yA:]Zk ^9bԿ?Z'uk ^>wAk7G2Z't}Rd/.~wAk7Gٮ-y|C@c}Rd/.j_ Eٮ-y|C5? oj_ E-Kȿ5?f-Kȿ>ũ2[?f!ts 1ũ2Gص/O"g!t}ן?nd7ص/O"@_]lן?n]Z̀@_]bԿ?]Zk ^9bԿ?Z'uk ^>wAk7G2Z't}Rd/.~wAk7Gٮ-y|C@c}Rd/.j_ Eٮ-y|C5? oj_ E-Kȿ5?f-Kȿ>ũ2[?f!ts 1ũ2Gص/O"g!t}ן?nd7ص/O"@_]lן?n]Z̀@_]bԿ?]Zk ^9bԿ?Z'uk ^>wAk7G2Z't}Rd/.~wAk7Gٮ-y|C@c}Rd/.j_ Eٮ-y|C5? oj_ E-Kȿ5?f-Kȿ>ũ2[?f!ts 1ũ2Gص/O"g!t}ן?nd7ص/O"@_]lן?n]Z̀@_]bԿ?]Zk ^9bԿ?Z'uk ^>wAk7G2Z't}Rd/.~wAk7Gٮ-y|C@c}Rd/.j_ Eٮ-y|C5? oj_ E-Kȿ5?f-Kȿ>ũ2[?f!ts 1ũ2Gص/O"g!t}ן?nd:nB5.d)tKm%yy,e op1$w5ן?n]Z̀wZ 6KHLdS"P$<&?#i G09qRGS562Y}oe٨@ѲFbnH+Wb5<}>Cݳvq*Ծ`ӯ$mL$n;WjNH cGN'Ra5 }(IJ:oX=gA<3wKNdDbԷ"1݀]ٯ {!h.cF d8ʑ}*;C])d'#O@F9=<\[a77 229Kp|%wP0t˽-VRnܴ/~ԑy@ #,+t,9/|-΄|ϲ+<+'n}+B ;Fh%@HFA G9BV) fK>2F$AE~Fv7gt; ]>p;]cP#J.ȷ:/Q:/U( ">@?Y(""E*nti&kTmW'+@(((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-lhya;* dž?Z?wU-vf?0_௟*(Š((((((((((( SIn+OFrIn+OFp%eĻEW)AEPEPEPEPEPEPEPEPEPEPEPEPEPW4GYw dzzԟiRTҲ%N? rg)h$Og(N? r= O~,iRGr>өş7:Y3Z(T'u?f}S?o9KEAʄN? rwgwbe'֥jH(((((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, CǵZ/9kcDk T٘¯Da47 ( ( ( ( ( ( ( ( ( ( ()M#O%KI?M#O%KI?ÊQ\Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a?wrUSU6F{I~q"u!b`3G<)MwOk&ugGܢ6G q|.@؇'=Ib/,p@ondvk7^E?n3Ok&tk']g"7x_d F vA<7V\[J6 dGhXdvk7G;[5Ln3Ok&tk']뢄K \\OVOjv{\UG֭|MwOk&uQE/G֗`gMwOk&uQE/G֗`gMwOk&uQE/G֗`gMwOk&uQE/G֗`gMwOk&uQE/G֗`g ۼS)OD6$> Q$\OZkt!H5z+XcH)i$g8jm#ܢYè sUev=hGӨkOo.h NCGԮ"2Y.ڬ2*}MэBA!KPңN=?'Ԭ \fqÏzTkWT CMx^M-TvNQ?H=ᫍw?zyR.|Yy\73#ڣ`uo?uo?_ 6}-zR]S桧?1Imh&-6+Hxl/ <'k;M:(lf .kxL"ZPdDS0[?uo?uo>eѼA .YG%2)؊B]ɂw6uzye洖 6VH_.Yr;GWVpWVpI,>/_z$S'|OZQ]c;z[KZZQ@Q@Q@Q@Q@6gR17S1,smBS߽TZORYn^IK%dnoQIȉa9 "[bp$bXJXt6mMfȺ9i.<F ca _G{Z;t}Q֟]i<5,ѤȒyo0}ĒBL QMG:#$uk)ed"Xl!68:vN=?958[O^{XR+{)Q H@4m=7ksNҵ?úԺmԏ$W @$œ0B$>fN=?ז[<dB$Gcp)|@&l/#-nu fMnF0dҸR=C".&]n]6{F,kwVqĨdA%X' ]Xpt'Jz?uo_ :>}Nm%Lj-&L]ހX $7;auemE:/J5XcFfHePK%`iEuo?uo>e_yx>ͩOxkso*X>|uţмY]BE7m4V'J%rC23""a}nڭqet[ǷlZ9TL㧠_j[1H8>Q$W/?Uim=ޛ`2Lur,nŚX,z&9utđp<-b}y9 uo{NXH(Fp *}vI,>/_z"^u4ւ6ڀ0x\Ī:{vdkV~zUAi8͒Fwy 1$pTx퀗o0^WB^J%* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ?o^^G/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kWA 5Q 5QE٘/{Z^ɿ^ɿŠ(ϵook?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 5Q 5QEx/{Z7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- _- _Qk k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵooo?_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_a\w}m;?}~VXj3fUnNrV_PK3}"##-Pictures/10000000000000FC000000541FE466DA.pngPNG  IHDRT)ͳ,tEXtCreation TimeMon 23 Feb 2004 21:38:41 -0600(ltIME&8C]j pHYs(JgAMA azIDATxON@7(R. #4+dI,{= P/GY ʟ~dOy 831'vtqu:?8$*}ux<f~N{ǺO.Ѳt\.l$nY'L&ϯ ~>/w|6ɘ^jm$ՊJPy}kt#oM};֟̍A0|L3Jzcxss{_NOU0,=zy(;{EQ,]\]o{#OLJo`8F#Y&Ibxz#8ȟ_[\hs,Vp^$B\w ]7;fEg1&?mO?&V3Sp¯*s$xk)x5f{tD^9$ʙ6;:dx-L*9cjzX#PnsN&9zz8M>j23Y- O|xxgggCp@{/d]>M&},s2}|vwL +u^T[I'\ N/3G>ӓ;r3zjYTRkGw浍m0˲ ; 3^8PȽUwUqdGp=qb8PGp8d!KBz#8!Gp=CB||],涵oaK}B4ꚙT$ $o`8F#Y&Ibxz6Ax#8y6%2w<$/BW&z&лe B:˼?@=ba~~7!ȺR*l:N&Yb8DR%S ,u<DZHSBnСTKű(Q$XV $^- %=u%G7K(FVtVuՐxtL{)#hmIyYvQߡR I-O7Sφ\16UCՒڶz b6'ވե+T;iE>vQߡW Iwcgmlai>̮YA8'éx[Q?b}@+sF_ͅdPspnxz*Vѕ;o(ҋ|Ш-NiӮR(3 W5u qu} DHyAUʥ("cFRWI;o(ҋ|ЩM 59uAwq-iRK DxܡK/vTqZǥ_<%mܲ221 қqjML@ʠHjD{9o7_m~QϝZLӼXd\dsUZ%t' h?( ?;o+2|\_m~QϝE9M?( ?;o+29PrQϝiE>vVer4;o(ҋ|Ь(AiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 O( &=AiiE>QZߡYrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SQuv v5t-Q@ߧq%ͺ0 E_ы]lt$ J' #N-ɳ$㭮?UI༂閯,|IVN+) xn/$JЛji:uCO8eV_7ȯnɾESk7gzh߭w\YٚV1Sm<-&}6]ۢȘ]EBNP{ֹavlTҽGkƜU](D*Wݻ;vǽZok*yV'wFӉ [L}>C&Z[RY;qϕg𵽕8wzvGCKԓJ@Նtqoֿri~0T#m>Rn!2@3i>*{A!B8{~;7?ПWTSl}?iaNwm1tBKeS"X5ԋGK9% ē?VOgZ'K@TQ1WB j_U{xԚJ-ygBUs:pnqEhCsԓ c'i1Sr{6d/9=UAhV ܎$FLmld, )ا4)_]Ce$4JfeiBzVO!-9?oV3_*Ww߫5Ld`}g^е;X_WmNG-ޕqeo1Bp8Ni)-.-4ZQiW6|ȡٶ$ c 1/!-9?oVe:rV?Ɩ%5huO6ym[Gܱ]Vf##֯_xLm_ķKsqqqR| F Q'?G&/*B<[@s1U[_3_meVduqI>6Ҽ.L,Y~|=#ſ?G!-9Wa^*3==#ſ?G!-9ꘟqyy L_U?1?==#ſ?G!-9?0?zb9{Q{WGG&/*B<[@s1Th`~T#sL_Uxb>GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gh tbſ?G~A\O?Gh tbſ?G~A\O?_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?⏅#ź1F-tJ5Nooγ!omhхY׈]v9f>Y@V' RVQ׆Z ރ[^ n幷1(Gn iuo" k %AE$ZF>w9-prOX;Z_W(k+RrzdKoqe}&om,wYCe6M6궓=q$'͍׻xOMB_Ho ySF?+^;߹sVK.MLSkӵ 'KUuw*l23Տk|=DY@@Ϗ򳝟8͜<<ԣ%$i/$W{j5aY-Oʳ X|3^+VK_Zǩ@>ϩUS>U]՘ xڬLѩ I%@;96(*8Z4CYTI䷛Zx$HʖPlF@_ *egFr중/iuͺbK||}w|zG?h xu 2[h.cc \M.R"Q̫7uYVK^iR+iv 2`r ecB 6|-yxnG#-%,6-~j/BoitFh="i+q ARm6Wz}qk?сHDU%sx43}3jO,+V%6Хs2&o@鹲hK#Uk{+soUQ]X|D:"_*"_* RMG/DYzy񫙼My|:_"_*"_*FO&=pXB͚&R=Qx9Xw`/G`/\o?#s'Fo?#s'G+,ݗ%,ݗ%⫚n$hn$h`teDUeDUsYMMv_v_k77T}Uf7?4f7?4r:_"_*"_*FO&FO&VKX?/KQX?/KW5IћI~e>eyA?3yA?9X/`/G`/\o?#s'TV٪&ڝ~6!;wco8h`v_eDUeDUrO=/4EwsԒWHnfY dRȄǖ m Q~e>ei0i ˠ$t5wyk~#+*-nze>eߵ??7Y}aϹ}KȿX?/KQX?/KVd6\\YCH^I$%TP2I%0^߈X_r0KȿX?/KQX?/KUERKFDEdUF{V˗K/"pWO"`/G`/Pb74 ]ֆ\eDUeDUC G#3K]ցMX?/KQX?/KT?؍@/ui֋# C.2Twab`/G`/Pb韋?_Z17`/G`/Pb74 G's}T}U#3K]5mΛ` A'.@,}T}U,حٖm~*teDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KWFݞHU0,<kv#FXXxKt~goǗ]t_eDUeDUs_o_W=3Tc??LcxeGt7Ox޿:zg~~yqy`.UL1./,Ӹ`/G`/\.UL1./,=z韺c1w,ݗ%,ݗ%⫝=z韺c1_o_W=3Tc??LcxeGt7Ox޿:zg~~yqy`.UL1./,Ӹ`/G`/\.UL1.//nẘHf L"[  4-$}T}U2񟋭>":%y`&#tN72f{%> OBm%FPUY rF9jI&dE;YX?/KQX?/KWzgO꺭5l eP./5tIgGE2#NT{` ,ݗ%,ݗ%5O|A/5xB+HduuUOR`( ـNBtf}X?/KW|q#ҶFok E:=*Eush䳍 9 8 Eot':hJ: Mj*S4Y/:9+kUPA*_yI;1g88b CE/^CRnD8]3/k .͵{;o!GP Q#$XIk&+^O6Dl좼#*vzWٴ/t}Bw^mΓoS?tRYn\Ф4- eA;rφ)̆le e D&<9(wEzoٴ/t}BwE/I Eq ͡ O 4Uh_S.6<5?(W͡ OE^6<5?h_S.{>͡ O 56. cp,v6y{ y^q+6<5?h_S.Z;X˻,sQeGE1C!uIkw~4ɵH v ow-./D?kM7 4P!qJþ=cm)B$ogeo1#}Yg*r,g𼫧GuZ 87RrI$+dH`yklkW?%hVM̦W)hw (>jww}gh!#ETwQuabWr6ҠӶwuIqb;c4Sʌ#bb@ K,Vq+I$ip_,<ʑna$gm !ԭ#y tu!{9BJ]:b/\kH o1@[S Ŷy#17qngTlVtUЌ,vͼ!kia.om;l,I${3My mvUqY?mE? q=x_}?7qhߗ;1>:I%TF\,"%'|lC:+{-[B)o^9_,qIt-[%u"t10WbJGE)={""wLݿw6@U'񎥨i3YZJL&dI2FA`HZF Cv#+XPy3^X"h&hu+mbӥadpQX)KƌQpjIň]i\[k涕|1)ViW!IӮwQ]‚"|K~ϑ3nGh1$uIb%0`! =(cjh,,%y$rr 1 rO @~T2sw4}Kֿ%hZ =x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]1㩼+l}1c?&<>ֿ%k$&N6.s1b8pl^As[۩<{{9e|b$rx]Nwj/;9^9RFGF8Xeb9u xCW.n.{*&1pFBݽ* w5GK*IcҝV<¾)]X\ré UvD !B @x'լ۹R'uYL2DDpypq2?^7G w5hПc>#ְšQ-ݦ?.nD͉s(M( 馱&mL#IďD3 ??Σ}K/vض3g*} y|xW֫0̟˹7 w4?^7G.|E} y|xWKayw>ynƏ@<@+hѥ_0<_C?^7G w4h}^]ϞjwkysCr9o˭{ w4?^7Ci>:ezl$v,K0I/(  ~gPx_;KRWHXnƏ@<@+j>Ggt򴻂⶙{oMGqJ& ȹuc_q|t':, [}"]mq׊:ǎmm |KkŪM˫_, C_zI_3ׯ9/9kѴgѯ\O|6]+:( u5ܐ[C yh$~`1?ݩt )*z!f[mO}%g[u 彴&[C{41‘DAF&ۄ* e ;ISmຳȳY.-b)'?|By|׹}S{? o7Gٵ?u*׬!IEn(=^?ٵ?u5h-dHzY?5ha; +@((0:JѶZI{G5anZ}̷E.x 9NaVmPݙ-HyoȒJ䑣P&mPJϩA*>`e&WU(H #W"v5w!dF7;F#GMCnq*JҬ &w^ap1vHIqx׳6O*o_ηW9s!URXgi uc/^-u]0n"p̈62;d6ߛnjf4=o Y3\3OS=Ѵ]ZR2 -2C!2;Fxg4tWd{ r ,+s=׭[L 0)hL 0)hL 0)hL 0)hL 0)h?Np~(jgWDGzo1ط+Ӥ Y|*~~M>]=&P`QKE&P`QKE&P`QKE&P`QKE&P`QKE&P`WDəX|ݝ LgSbzyY|Ѽ+募7gC)G3ǘ?Qڥcz|]aERs,o"p1RNnOj_jg-]#Qיhi^YjS F0ݡd}6Bjg-6>n>$twVwڶږ9cz:Ojg-6>nx|I >X-b}OSt}v15>ZD#ў2sPh/Q6)Cnf*[u0ݲ@ͲYFc4rǰk>ͩϽڟKڶٖ0BуHVgXd#dpwdpEjQsڟK>ͩϽ(`׹mO}%f[rǰk“@W( s fTw֦5a_'EIQuMXq (5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQE学ua[| 4jZ*+15r)}G_Aɹby#w.<HCD1xR[aEKV{EdVޮ} y5~v&̆/ ]Gys5R"ΒaFǐD/𤗗WGF b/4dQ۫.Wm~^6n8LSh.f65|t&Yn$Tb=B$ВEI ΁o"}2/D`cƾTgnQqW^((YAֶ[XCH8Q@'ƙA?Uh.fZ?#gh?#gj{E,_glglUhgu5[3J c-⤢KiX(ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEo%vğ:GI]nF}B(0(((((((((((Ӥ Y|*~~M>]=qt/E\ocy8˿;b߾簠(((((((((((,Loϛ#cOC/*:TR,(@QEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~&~(jgWDGzo1ط+Ӥ Y|*~~M>]=QEQEQEQEQEQEQEQEQEQEQEegF|.|ݝ LgSbzyY|Ѽ+募7gC)G3ǘ?Qڥcz|]aER((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)(((((((((((3CV_3?芸ߟ"8~q~vſ}a\~&~(jgWDGzo1ط(((((((((((("΍_,\:O_2>^1<߱KG+Կ` (Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a"΍_,\:O_2>^1<:ψ3yW>nΆS̏3׌g)17RJ>/*:X2Š(EPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((?t 7jO? ڷ[#>ESQEQEQEQEQEQEQEQEQEQEQEg↬fq?tDq.~¸:LP՗"71ߜcߝosPEPEPEPEPEPEPEPEPEPEPEP^y_&to7bzz1'מ|EɝXvt2d}1c9Lycz|]V?QQE ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatWo%vպ (Š(((((((((((?N?5e3#o=7wl[g↬fq?tDq.~€ ( ( ( ( ( ( ( ( ( ( ( ψ3yW>nΆS̏3׌g)1=,Loϛ#c@ ԿRKG )QEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEqt/E\ocy8˿;b߾簮?N?5e3#o=7wl[QEQEQEQEQEQEQEQEQEQEQEW|EɝXvt2d}1c9LyuegF|.|ݝ LgSboޥ_#EGWj}_?TuveQH(((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEo%vğ:GI]nF}B(0(((((((((((Ӥ Y|*~~M>]=qt/E\ocy8˿;b߾簠(((((((((((,Loϛ#cOC/*:TR,(@QEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~&~(jgWDGzo1ط+Ӥ Y|*~~M>]=QEQEQEQEQEQEQEQEQEQEQEegF|.|ݝ LgSbzyY|Ѽ+募7gC)G3ǘ?Qڥcz|]aER((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)(((((((((((3CV_3?芸ߟ"8~q~vſ}a\~&~(jgWDGzo1ط(((((((((((("΍_,\:O_2>^1<߱KG+Կ` (Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a"΍_,\:O_2>^1<:ψ3yW>nΆS̏3׌g)17RJ>/*:X2Š(EPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((?t 7jO? ڷ[#>ESQEQEQEQEQEQEQEQEQEQEQEg↬fq?tDq.~¸:LP՗"71ߜcߝosPEPEPEPEPEPEPEPEPEPEPEP^y_&to7bzz1'מ|EɝXvt2d}1c9Lycz|]V?QQE ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatWo%vպ (Š(((((((((((?N?5e3#o=7wl[g↬fq?tDq.~€ ( ( ( ( ( ( ( ( ( ( ( ψ3yW>nΆS̏3׌g)1=,Loϛ#c@ ԿRKG )QEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEqt/E\ocy8˿;b߾簮?N?5e3#o=7wl[QEQEQEQEQEQEQEQEQEQEQEW|EɝXvt2d}1c9LyuegF|.|ݝ LgSboޥ_#EGWj}_?TuveQH(((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEo%vğ:GI]nF}B(0(((((((((((Ӥ Y|*~~M>]=qt/E\ocy8˿;b߾簠(((((((((((,Loϛ#cOC/*:TR,(@QEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~&~(jgWDGzo1ط+Ӥ Y|*~~M>]=QEQEQEQEQEQEQEQEQEQEQEegF|.|ݝ LgSbzyY|Ѽ+募7gC)G3ǘ?Qڥcz|]aER((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEs7ek&c^,}v!{gOJX/˺;'s܁o/?Zikb%GyXph+MU_?.}C >J QV??]@}_c<85Wyy?,*?G%GyXpj>!to/?G7Y-T畏&J_}C_?.o Z+Mc@]Agܵ QV???*?Uyy9Ϲk<84T畏&o/?G>!tsyr%GyXph+MU_?.}C >J QV??]@}_c<85Wyy?,*?G%GyXpj>!to/?G7Y05fHKjNUV\ND. BgoV1Bv#gb>~:Lgz+:t'v3K,J-8ǣl#ͤɿnvϛ&}|ņh'n~6q#cwFh'n~6q#cwkLn߻v`;oݟgo6&3۷ݺg>l'3 Pq޹Pq޹i2o<=~ۡݿv~nsɟ_1r~:LgzoV1Bv#gb>~:Lgzͤɿnvϛ&}|i2o<=~ۡݿv~nsɟ_1rs0a!Z. ۟,n1둾!Z. ۟,n16&3۷ݺg>l#ͤɿnvϛ&}|ņh'n~6q#cwFh'n~6q#cwkLn߻v`;oݟgo6&3۷ݺg>l'3 Pq޹Pq޹i2o<=~ۡݿv~nsɟ_1r~:LgzoV1Bv#gb>~:Lgzͤɿnvϛ&}|i2o<=~ۡݿv~nsɟ_1rs0a!Z. ۟,n1둾!Z. ۟,n16&3۷ݺg>l#ͤɿnvϛ&}|ņh'n~6q#cwFh'n~6q#cwkLn߻v`;oݟgo6&3۷ݺg>l'3 Pq޹Pq޹i2o<=~ۡݿv~nsɟ_1r~:LgzFC2F# '͸\g d]In vs6L㗥tНf \HB1.INoSG3 !R\) $IT|V?4]@Xe36Ə36ƪo/?G>!tX _glglU_?.}C4?4]@`-li4li5Wyy?Z?#gh?#gj>!to/?EFF_}C_?.kcL_cL_@]ƙA?GƙA?Uyy,36Ə36ƪo/?G>!tXR(F'󯎟o^K=A w@$tbzڼx?iקYϊ~h_<5!rףi'|^xjCFOF_Muowf-Zr̛%i.:xt/ ͦBaӴHj[g>ʭfjEQSfjGf<3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g*0K"`#h@[9#N+?EٚQt1k=B8L s'PiHo{+[! YR#8=#Q$6aFN>!ouJ,Vܪq~Bw- }y.:[^i Nej__+Q^IQEQEQEQEQEQEQEQEQEQEQEaD^EI5 \q v%⪔a؊_v%˷/WhqKQo=/?2_*Eo=/?2_*yUv./yTeK Qp)eK .z^dU]K.z^dUv%\ _v%˷/WhR˷/G]E]?KU(KQo=/?2_*Eo=/?2_*yUv./yTeK Qp)eK .z^dU]K.z^dUv%\ ٭4}}nU#O?ֶ/g5؛Lz%>qeiy{v;uQM\?$1nA']^ƺ ֝oiu=0i@eDBWr60vZ,)wVwQ[HA p {!Fᜠ2]?$1nA']MxQtge0E,LF%j3n;Ӯ͋:ٍnv[9R[;IQȂ죷HO.G2ukVZǚlZy#LG N3  gBDg#HO.G2uQG" ۤIc'F#O?먣?$1_v%_X%{IS5e)eK .z^dU]E/yTeK Qp)eK .z^dU]K.z^dUv%\ _v%˷/WhR˷/G]E]?KU(KQo=/?2_*Eo=/?2_*yUv./yTeK Qp)eK .z^dU]K.z^dUv%\ _v%˷/WhR˷/G]E*;X)nGu#  ל|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((Ń\#sj`zڦQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ m!?_ :mv[[I ,W-ll -|x#$.Ӥ\K @ O"+hY",Rךvgm n;E! waE=?iXC(ԛ4>l`1F/?'s|EQ 5sWKm.Q&pmq>t^|YNݬAg! _Gw4mF7}c.n~qt\^N"(pױ<6Q{ ϰ% oi\&GX*@lAXF/?'s|EQcn1yA;/"h {tV&/?'s|EQ sGkؽMUCsq˨ܴr)Fb`XJI(̠(((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEb.?XˏnmSb (Š(((((((((((((((((((((((((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEFkb.?M(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP,aFk6 ) ((((((((((((((((((((((((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ˏnmV,a؂(0((((((((((((((((((((((((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEb.?XˏnmSb (Š(((((((((((((((((((((((((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEFkb.?M(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rav*47dKYn)Dkķ(@p3>{9I_DhGӨkOo.h I4uO?M+si'BOhy~7ټóǗָRs)r'1`v >QNտ?5xɛFj_z8>qgbwzIp3ium.ϐqmV͍_z-̈́MN0[ȋo) ;~WVpWVp?_ +eV{>[6Ioum!]\3Spƍk~8C|E;6"N.t?ں]ں]^Kay2rB76C-u #T= h*&Ly]( (((}Tvj-c)I#%[A=HږiERԷw/G9Vvo/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯?oo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵokk?0_}0- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- _- _Qkߗ/K_aG/K_aEeaj3??zZ& ?zZ& (3>/kW/^ɿ^ɯŠ(ϵokk?_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵokk?_}0- _- Qkߗ/K_aG/K_aEf`aj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7WA+[D߻vF>E,8Y7[&S+PK3DM::-Pictures/1000000000000400000002E2444DEB20.jpgJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?w| I1P2=Ej ~ HPqڡs=qWH>ٲ/b[PHw i+yggp[{nf_1wy%TS6]d08y$ur&[:_ FyawnP9\uc]gav!nUH;7@+Am3ׇç7Z;XJ=xJv~+:8(ԜҕvlOu=G?e[֐$I=R%xTCRw#)oo10x׾_dhߙo})PSvںjzʺ&(! S}Tw~Լ3FoΩb$s#cֲX /ñOQ+ںjzʺ'^tak_W^#[cҍ/ž΁6#h<">OԶc]?&$X 9*? |ш$piX gb~&/}>̈́7!$\:m'c8ٴRnױwj+_*?-}~t/U`~rIg8I'Ҷwى 9=zK12joШ.y/nm]CQu=Z@+$x퇃<lnm]V{y6#ό*AtjE_%187*?Җoi%A.bićyLndi~=6]:O5VI9#9ۜW2/ʽ6,o#g;mqW_Tm]CWk:]扥hEakI,.b*X63؁KB|gN=b%u} !|bL iův4z~V>ޗoǦm]CQu=Ufn $rPz dU}F*I4 FƇ?W_U\*??e(]ںjzʳQE,*??e(]ںjzʳQE,*??e(]ںjzʳQE,*??e(]ںjzʳQE,*?硬4r.dhm]CG5QQ`4?硣jz}(}(kYW_u= g>m>{5,hںJ6J=F4m]CYOOv #Cjz?硬ҍҏfu= W_~FG]ںk?iiٮdhm]CG5QQ`4?硣jz}(}(kYW_u= g>m>{5,hںJ6J=F4m]CYOOv #Cjz?硬ҍҏfu= W_~FG]ںk?iiٮdhm]CG5QQ`4?硣jz}(}(kYW_u= g>m>{5,h:5QQ`/m]SQu=OT6J6J=EJ?*FG]ȿu=OG?P}(}(kY(ںOOv "?W_Ciiٮd_ںjzҨm>m>{5,W_m]SU ҍҏfjzҏJQQ`/m]SQu=OT6J6J=EJ?*FG]ȿu=OG?P}(}(kY(ںOOv "?W_Ciiٮd_ںjzҨm>m>{5,W_m]SU ҍҏfjzҏJQQ`/m]SQu=OT6J6J=EJ2]i&lI$(EBOA$}+ѥ0^t{s[..(w3 Ϯ׶;UbQŅBdM;20 G#ӭ2C7ԍffP:qfho4`O]BF-r(EҔ+OMEkot+kk_@sq-fKm捳J<1g(sD87S+].t}6%dIR3*)of꺊Q׾]FO6ߥzO=őhA$FPFU݆1A`mm2]M R0ɒ]2cˋ[ h#l0LAn]˧\-dmqa']2L%MisE;'ۡM"f9 pK3-fV;) "FU@r1wW}$^hYE q??j5ff9,M$ׅ1RvlxJ!J)vW˧gԟI _l[nBBtwYhUd֑@IȟG=^ $i<2TW>Q Y\JfyYGW彑g -3+9ڡrJݔSZY:F81.` ?yֽ:x> ` fBw)aGb¹WRpVZ-/f'˝]}?=Է>X!V+H`㯖S/gൽȶmP{c2r@Mz+ (LU|)@2UK0I$E'bmkv'uMyf):LuqhY q'k\Sֵ-;3\Rgϕ}O@^ Ÿ ?/G+ (LUBβԬ?x cާ8#S׊^ Ÿ ?/G+ (LUt%//=yyikGQs8E 7Pzpkzd70F|v6ѩFC*^ Ÿ ?/G+ (LUaϧemi{qzڌ\\B ȈсY]zZD׵DLo /b2mQxM=m] `|+z{T|)@2Ta<]ԭH R"ZFH5^R)ov?* UQcOEDT}a^ Ÿ ?/G+ (LUTsd/1-8|׵4Eiōǖ ۷:Qij6V1<0v)e$W¹Q Ÿ ?/I{VtmO.e&$Khv1$:ZxY-MĒHxk`]N#zW>Q?\SGe⩼/K-'uSJ_W>Q?\SGeYp/cVe5QW¹Q Ÿ ?/G˅Y}/񯒏υ?&_*W>Q?\/_տ~'|||)@2T¹Q_r0ƭQ?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?l/0ƭY?\xSGeY//Fԯfq?̿U<'@f,a[xԣjW¸f_*WWLQa_r0ƭ/^nYBk'QݵԯkR)F IZW9o%^6^M%^%39vB x7_ 'G?I9-msZkk+([qu0OLoA'#͍YvEu4yx4M s*=p!#ݠxU~LH1ddgXj^iama^/Rⷂr |b+4nĂK,@Wyu4yx4My7&@k"Ku$i32|c!0 ǯT^x7_ 'G?IW5?to"G3IXTpz&kg@>BKh{41<Шmx7_ 'G?I@ppk~)m{=Ūn`u 2,Rwym#Wb kƣ}L.W*e|%6!H9e$4."Vl + r_޴\j=@hȑefq!eDc\(=bPm>kjtM% ۉR$XIT0ڤ8<18Dgykp.PUe\3Ov!̓\4O3TڴY)z%E-ռH#I ;x*ZuAwu$s e"ݒ9UTKMA|q"e/$4z O OxӛmRYDFa-|7$[QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE^#kC u6>5Ԡb6*Ж $zBKF?FvZX}+ʹǀy_oi|6lnFFm*r |k}={'!F&uS:1;ח@Rh^BM6¯Rqdrkeq4h%{j^g%|d(ϑݯWz}C\[ųilbɹAX]'#e fIo,Vkp9JV결> u"dž=?^>ksůAU.-G?=> 3MR1rBs߁R¥ X`UksůARV_j=Rl}:}?PKK,N8a8 AE[$$^ ο?G':ZE?s3&RH2J?*x$ x'':ZEkռWG?Z=g Y] Gk#5R28w;P( ZҼ=/ F+cj. ,dd2mXz<׍kůAUg7Y"ZQ*"g"a.GE0+^mu-AUO7W(xi>ix K@['51Pnjzu YK'ȵ3Ѩ=RấոnZ,MdʫE\FvW5k5n2+7XjP7[[_OqZ7[;_Y<4RD(_XY.vgl "PA}3×s_hO;nvkGkQ\6Mir–1mc\IYǡ^ywk4lZ$_Mٕ{Yc<ٻH?n-/&ʽDZtWlZ$_M7~ Ge^c:+?n-/&훿K_2u|1z7~ GߥEWA=훿K_f"h̫_ {EyߥEwk4fU}f=Cf"hٻH?*_>ǡ^ywk4XH?*_>ǡQ^|5{$_M8j_ݵH?j_>!v"iTEΩ"wtW 5;Z,_M8jSrbigT Fk4M<?&{xƋ睯Ӆci}Bt'aEr"Ok4xci}Bt?mQti獯GAuW2.hp_)AtW:& J%i}N}:+H?煯G> Q9AQEbOxœ ϽRF<t pϵQYwF/t pH)}Z]#JA>N>Kb  om>?˸j-'S߄ ^]ÝQQ KO gi>v?—}ÝYYϕ_ / {>a( /+ύ_sQS:|m8ik~W){6j*4+^kIVȊBQӹEqw1)$v/nIdX ], vq* w[]'* H8\C]qITrI>NR=&5ž721+AJ  f"kEjO#:+?n-/&훿K_2u|1z7~ GߥEWA=훿K_f"h̫_ {EyߥEwk4fU}f=Cf"hٻH?*_>ǡ^|궿 SpzymU"wTWǬv S-쇬V RT?ouc_lj^ kQXjz<S(t ?jj*kk2?¥亏"ų=lLG_tZ+eG-0cΖ8{}d]ۭ0Ai?^w ĮL #JQӹ? Uv P' I/I]R[.k;b^Dȿ,r A#lhkqmM{uu q)PH@g%FI dV{cz=WK?:K3=LJ֭ GW7N $H˶UNr yk]%я\76۫ ;ɸFD wg-n!u5ōR+US+xp]e9Wb9bX $GWeUpԩ.e( G*jMjt\ZiLaOdžSX{?Ϧ\HsdoS۞9$u)4|qjk c>/$:{WTpuagM}Ε|'q1h4S!w˵Wjx}nѤ56V]]wc1PduV\N~ŮXRH;dG z;7l\-IBʣ:\pTR*t.-+R[mIJ ϣ9%oeRzլ3Ms&HV㷠i6Ay ϝiqޔsܢӏ/*s1 O.h nlIëc(A"žo%*o썙4N爀l2Ȭ|Kj6koumx,B Ǯqڛ7k!toQ6m]P͍̪XI v tk:餴NOjSPzyms}mcjF8 6Gp0b5kΝcX̅@f 072n9<ib)S:1I9)Mlz~*jc3HW8aTbW:&vd݄sPUws`26C\`$h4d9ſKC-C\4==I/y\A5GE?y\A5GE?ૹgY褩/ ]Clޫ,dy88+NG=>!\ ITlZ x]^(ĒH#B4 ˷V=Hq^taʯHFr{Yl&KHˊd2}nj Pqbi%OWDi%k6wb,K$ICq-61 m9SV(&s5mM3ybBٰqF[ҭ! ҉nĿ0a cUu "X ]¬Uӭ %%H.~c'=1T>EجlifG Ҳ.F3u'<ޱg\F=ܰFXd1t+&Ӂ]6$ihn ":`?SmV ˍi ~)P2;^IŒlJJ5;BʏpV-'9?nȉ 2 :#"VdpYNAěױmeK 67};t l$"w%BA [RiP\ #x, N޵oq-< EF;RYe Ђ# s 99FMq&vNQi2Ň s S4hfco"" no}qjbpppø8>⤇UnɲUC' qFdx[ʳB#A96{}:bYБ"FTcgHaUN.*M8S4SPppNN-fvqަǶ{+ .dp09Vlڅwˌ?6(ONmV ˍi ~)8N]M72+IZȤXQ +9leG]j۹zABy' 1c})re""@8)ϸ%WJr,%YJe+ R(O@%e"FB^7\3xn8n{VUXTa@$;MZJ[om>1"qQ8OU]rq +M[Wyy$6w%)Jsӌ⧶yr \S^ՓE T-s$*K3Lzxڬ?'_JC5^Mr^ /'?)_O +L;k]MAonf^d>^E9 v\cwAS.}}Pa ubV,Ɍ8 *+oJ$MztF=yt xskpW(a ?0I!H⑟vȼ@__/zog:>6ߦ4  *]bNJ(ȣ\Q|=gmF Bc.r ko@?ʗǚEr h$ Roc܊7}  k/5Ko[}a/|Ix_Xu?{7i]v {c7^?]iE`f}GzuE]Ϲ7^?]c֝]v >gzt}ZtQu,c7^?]iE`f}GzuE]Ϲ7^?]c֝]v >gzt}ZuzT]v >\`K X Ẇd`_ڏ}j?G?/ [D"7jĠ$O@[\ȶ?]tqjMߔ?Ua ~PU}PCz(ޱ)Wa ~PT}-CVMQcwS^jg-CQZ>7GMQzaGߔ?UhoX]E>7E醦ߔ?Ua ~PUcwSoX]Ea ~PT}-CVMQcwS^jg-CQZ>7GMQzaGߔ?UhoX]E>7E醦ߔ?Ua ~PUcwSoX]Ea ~PT}-CVMQcwS^jg-CQZ>7GMQzaGߔ?UhoX]E>7E醦ߔ?Ua ~PUcwSoX]Ea ~PT}-CVMQcwS^jg-CQZ>7GMQzaGߔ?UhoX]E>7E醦ߔ?Ua ~PUcwSoX]Ea ~PT}-CVMQcwS^jg-CQZ>7GMQzaGߔ?UhoX]E>7E醦ߔ?Ua ~PUcwSoX]Ea ~PT}-CVMQcwS^jg-CQZ>7GMQzaGߔ?UhoX]E>7E醦ߔ?Ua ~PUcwSoX]Ea ~PT}-CVMQcwS^jg-CQZ>7GMQzaGߔ?UhoX]E>7E醦ߔ?Ua ~PUcwSoX]Ea ~PT}-CVMQcwS^jg-CQZ>7Vwg"7d a=Gj`IPygl${n|G[h=ԛc Xl;I{rZY^GgQ}꧆ٔ4Ζ {9txc+ƙEdx?=:رbZ? Xkθ66⶷i`F( 'kӾg>߱OUǮGNos;V+~i-[!~|ĨTgW ?>g>߱TuizUشcrvm Yfv$+E$ o8m,bNk7{f'$3 ΒFu Y}} bYϤVt+ѣHe Rf n 8?uoNl5Y.kYZF$Ved$nOpTe% }} bSƖ0sO`,HVET͈mtS"ݕkJ}YtݱAIJ.wɉB,l",(A~U.Mvz6 :HP312(;qkX.chyC^MQ2a;׏e A~`H?ج;еA Bb@b3)F6qZX$ ʜ2vfGl/ֈ1 j_oKſhdH^gKhbg =&iڧ+/v63g9Qd_-hoZQhRVDkGP|=;Sg>߱M?g\Aj; j`H?أbC+} bYϤU(,(A~X+} bYϤU(핢X\2D85ORI[OaxS<,딟S:/^Bk¦^Ko2k\m$5~MJk9TnQk^uhۥXn!/' @|üVĦ UǮmՊO c{}R#X"|I;=WKXZv^.Eq&$T7@ ]@Rt¬vܼ'ӵ[4՜'hCA͖cb6߰83+v;zz<(| c*szBUیZ^LTh䷴WԚfT1c ٨)bX oͻ'ž_\}֥}[qO[ܤgʍ ;F̜˫vg|:@fn/fMs-`׵i/+dռg[ܧd>~>ž_\}֏쪯G?C=oAG"oğn?ھ˷߷vqǽP]/&k=[|eD_Q砯]/&LuidWש_E=hz Luh]/&A}=AG"kw~h?1?"u}zg|eD_Q砯]/&Luhȯ~?^_3~}/+ƿ1?w~h?+_ש_E=hz Luh]/&A}=ALXD.YH]/&Luhȯ~?^_3I>ѭJjn5uu&`s?/םZp{rR^m髙m`{|&-}2+kJd[K@0U?($qsE5{ k;9[k:F3c89]^_iy\_/f~9XΏNojSIy 0+;Suq4Rx v<>-6To{'n>M=7}xMкh+Ӓ r tb U#a<ox@Hӡ]in.dKyk䬒璹 $Ҿ︹|[FKˇ=ιMe=/Po12,K:bRRմ~)NO> dEFs*i8)S]_ Yke/w߷k} ["x\x|]7%Zo,݂!@+)s 8ͥc.;UѾ^ȳ[};UѾhȳ[};UѾhȳ[};UѾhȳ[};UѾhȳ[};UѾhȳ[};UѾhȳ[};UѾhȳ[};UѾhȳ[};UѾhȳ[};UѾhȳ[};UѾhȳЎ_S??LuG}\G-5VTgV:pF80;,ڧ*YeW**d?*ԝӷ#n%=7"\FKGpk|U8kw]ŋ3jeO~(̩3ztF=q_RuNϻ[ 0$Q4ǡs=WK^ jx kR-f[Y4*U#Lҹ7$cx"ʹuhRMFȏq%D~apN3㳢yiOUeMKfh6"; dwQiVR[nv͙S~3^G|> 4xtXCJD[ƻ cop4r7vM2nRFA8az.&F42񥔄L)jȐ+*IJ6۷n93LwmOIQKq.Fb#B"SF_ {j(e͐Im`u-,"9#8N  KLkך#~-h#b*e^RA9whRa+_^sho"UlɂTHlgt_\)rp%"1UT,8?.\\1}\1]w { ?Up%c@%Cww)lQE!Q@Q@Q@u\xY)?$]'F)_O )j˭19ŕ%),dF ͲWwE$o3aV@;@=x{ /?vhS(WMo` ľ[2H>u]"щLAk]%я\WG^Wլ[eAosi%>ގZJ, _Zh&u'~f$lsr@ d=xւ$t#ExGAA'ϳ͂x%$g=^jemcu$sdHܺoϠ,-SY1ޤ[1xsyz\c)2ٯ6h]tq,>u轼:& %{JlE nMAduz]2z\:‡ ^o1ʂ `]rnsMH|'H%IϘPyz gP~kUjlO +y_g/ϙ##ֶ,mj $q^ |lo!lHҹ} Q[S()P:qӑR(эRW(E]d9pNPAl ]?)p"Ӯ-|~r{<⫞6}V:>r)'s& r';Nu[Whv'F-i{H^${4VŖq,?jO*( y7d]?8 EsJa0x~XTrri{X^IZ3(=CAIJ<_Gux =̊ĨܤgxeTdkFQEP(RO^m&oȿY>IͿdխkǟ=zE릮fE릨Ž9m&Pմ{x]v2OJqӡѥī!M5e[;И],-F%uCcD]UB?@ rAmҴ6o\, PlH]WI)}vGwiڄ%.] mI)Fjib{.$|0Ň:qET_z ̻#6ln4%5:>aFxg}1FawꭄN9Z(˥%\%m4B$ic*;U[;N$y/t&wB6Yn INWp23],wRz ̻#M;N4&[{iD4 He0NG<(5 W.mOѰr2 `+W4AvGMZxx[r'-)e\>ax>ZH/Heîv NQ^E?/}b]Eigttic*mMqV&0rr;𕶂8 5`]/*ew}r4y>/]dQew}r4y>/]dQ˲8=h}/_&(ȣYdq{ϥ_Mv4QG?>.K9h"w}f]y>/G}r5GE ̻#}/_&=k=AvG_M{ϥcE{2;9<KƊ?(ew}r4y>/]dQ˲8=h}/_&(ȣYdq{ϥ_Mv4QG?>.K9h"w}f]y>/G}r5GE ̻#}/_&=k=AvG_M{ϥcE{2;9<KƊ?(ew}r4y>/]dQ˲8=h}/_&(ȣYdq{ϥ_Mv4QG?>.K9h"w}f]y>/G}r5GE ̻#}/_&=k=AvG_Mkmd;,bK%?mQ[4}3ZSVf6ZԿ5f^3ܵΧ_%ǵwoZ|'Z{]vuT =WK뤿1ZXQE((:Njn{jh+qf/Y?$a?6o[ ⿚uLgBcC%!a|6d;]c{M,["tAkXOu,;?ѹr ɐs!vo\[A=V&Iڊ,{- < ,SMucc4SyF$D×_64vR&θqRtKut̲$q*&T?2 Řĝ[Xn-ZWblu]W#'v6z:^!n}b`&CvyȌv>XdbtW7bjO KkDCp7Jۗi\^c/岎Yg>_^iYQ8bAFYXWڥĖZ4vq2D /)x?|6ٵWHc#TծhL7s sDr6 ueK1`:+׮&iಙAIÀp8SU헊JK[ugbRt岱gF,QEq3@94KVkI*Vi!+& KA&<#o#-aQ@Q@u\xY)?$]'F)_O )?PXg/ C 'ВI,Av?uE$o3aV@;@=x{ j:%Exf9o0-{cyws{١1\Id#M1oB0'(GqX1 VŌ0IrٵK0JvxjOˠᲾ $Z`ǖͻtIEzan"?;>.{R ЉIx6 r9 Vh=qZަ,fK+kfY \a0e=ޜE*_+L7*I;ƫ%β5)aGbTmᷱb9y O '*TRi?T3~[?{Z}3w]%Mv8ʜê]A+[=^T-(9'$00 O '*zdE:HO2)b=2q֟pAjrEhi֙T@eI$Dzɪ `X6 g9$]*)?4 ?QIAcR}^o^C~[."FPǜ 9X;NO8 8@ie`펵Zuk@[Wrr3֬¢IM?:^OrYIPHD?0H$'+Gr K{h>V⡳)<,K|)8)v1E'KX>! GogU̳5ȅź!%IU\s% ܳK+Gi%N3p@kE'G*)?4 / t1qW!{8}x 9㞻>Mz_*)?4 ?QIAcUGȗ_W¢IO?UWBnߑW¢IO?Uokv#"כɫ[?/vZAt4&0 9i[OIk2R)-=j)i2m^#EM\m^#E֖]F[}S[lgd]$LW$d SԢvqX]wk&vMDlppAXxnP*d,V*Îv ( *9'%4ydJv[ v%U{{I!M]am'{iʌyX*g%|#Ee$+.O0pzji>ȮN>^xAn/u6 m$H2' 0zZԢY2K;iVQ|3@#*NFA =2K--cFI V<,ݽ ңy08mNcgyawݬ4 H8a~b˳.[\YkzmHn9raI>cMմfݮ4Br%*8%I.QQ[ic3eU 1{nc wxJ;!9 8Prp?lQQ<6\K0DF dOj武o9Ti a9cz*g%|#Ee$cgyawݬ4 H8a~b>cmK=gO5:6pj@Q@U{;}BO25HIF7hsq@( &n9MG.&7Xxmm常8` $Q@$ԔQEQEQEQEQEQEQEQEQEQEQEQEQEQEfj͛ij_ٚf^ܵΧ_%ǵwoZ|'Z{]vuT =WK뤿1l4.[n;X RQv$o ^~Qd7?(~o":*OGCJپd-ѭ6У)?:U U'w+Ffɞ;dtyP@Ğj֐ݙW_E A+/"f7 Ӭy^vkog>dcrɻhifcXjxkH>`[O*9"XP6W]@(E o ^~Qd7?(|sy6:Gqo D䑃ݹQ$` TSF%ErZF(!- =(}CJ!%yERosy6Zagwi/,7^]LbP!d,Hڪ1di*]lʋ$B UR7mnd7?(?W_Eo# O h$H֮c*Hu$a| g$I%ܟٞ] KڡϒXX;Y8c[!%yEQ(osy&,Fȶ .6ۂHJ* mM\.o9I%ch3,c5W_E A+/"f7>iri Y'7,S/:7cG{{i.msOu,6@;p's1(o ^~Q{79)|)Lr֮4"ĊoeC"w;*7Elԟ A+/"G}ÛȎ!%yEQ(osyRd7?(?W_Eo"#X^ /'!s  xY)?$j ;sKeemc}_(]UL%c <;w_/\X3*/P B-["8۱]ǫHbS`odeʻn3V ^$,׃vX]I#J&zvmm.dsn F#+3+gn WEx6wZI@]X`7de3 z(1i5}nmgf<qtD,=RO3jww^ {ڤ }4o1ȯc &#kVTxYL'Sdl2:y*ÐIۑqiEy=ǃ($ݸ0^Š7cjzU>s#IG"A$g_÷mh~(W?g<% ΩI+q3|z2>K5xv?bH"y>k L9$(j֕m{G ukH#ILe@Xj (֮m5+5>ed[NuU C##98ԵfFM7Q3$KƊ;[[dP$rrʮ)սL;k=OK ۣ!YVRmxVXD(91)O Y4uieR{pX[~Ds8\tB#vi4g_o||Lmmⷷ8`GjQ@Tzơ:^Z$Pi3joqݓ1nLa@e,eI'tԿHQa(20G,,]Ex'Xlku/]b[c]#&HpFGIiW>Gu)ۧIUo;O![n#a^EyyiQXԍjzb#o|o4Bs ![tSRx#v$3c  #@EQEQEQEQEQEQEQEQEQEQEQEQEQEQEaj_ٚfZ:~?fWGG5MZ|'Z{]vuΧ_%ǵwo^UO0-뤿1 KAB=WKhU ((((((((((((fOoY> /''7{Hռ3pΰ\A#F@`IgҲdדy-ԿhY wVnHA3*ȧljIuf7ǫHbWw{u~K5#ʗ΀HdzӮտ_1)1ztF=R52mTcI qztF=p~(VhnfHGi$6eSv 훊qy$HpyV@"ZVi]0Eo* 42ȀD R,6\36bŗ97tyt >|MZĽO=$b+KK-KY_UMϘ! ^kZ:GZ%yq%ɸmgx$zer|B6?Ъ]_x;]f{ļNVٖ;UIJ4K!󼝇&'G 費_-}]e ‚Udu8nt0zOQ=\2NIB@vw<bNkc} <BxDu\F}:V[q_(ۖa[h.\j: [k/="H. #n'2H6?У͏z'(u!:/俶I-te0ZT *U F9w5={ek^ykg;Y} Evø Dl?EॶOX}x1~=yD6"5n4rQ:zjB[(G'Ѽ)?|p,lb.xV;{HEдZ,*o&#ýc} <B&.u{+c5wGI׆D$oYl`p"5SvVҌd):,X& &rm 6?У͏z'(ZθCg+y$-'1c"!)l?GOQpE3͏z'(c} .?^i+;?/ֆC^jGӑm+??/sqؽq"׈uW3q"׈uUa=ŠOi"=+ sGݧCEPV_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:Q usEeCE_7@V_$:U+}B7{fr0x8`B?:5gMkGS՝7"? 9nZS?G}?>u?-dx?=:|LAk]%яWX״_G%{Gl@.E@QEQEQEQEQEQEQEQEQEQEQEs2/P~CzxY)?$i?sdS<,딟VSݎ;#xWqڛksFB;V/HvY 0;oJ\"&U#0" /]ǫHbT-뤿15a/M,zpSS~fmt=q*-GUǯ?׵hYO'F:U]!!&XFHA\ۢID>kɕ%HoORZu {1lOۼ_K*ȝrG'- KtaFc 6` dM$^Iտoo>-ֹVȑ:w5pؗ|MK2yBu 1,6[u ,G!l`5r^:=R/lA GEWE˅-Id_=ZSXY?\4['u! [h-LYǴ $?(XԜn9f'qG^`JɵY(-f()3G\ >KXAKM{, . n@9e<|&tWRd}} efϹ1@gAnԵ ;{[XV%#AFpr7nxzUj{ 9 /not>ύ29϶*凃uK˽3WԬཽ76IRJwl6@ab9]~ghmY{l}g~~ٷ>^7y~]69S^/i{և+ci?7͸3m߷=rt47۴ n e7a"lǕe?(a9jm6x㷴7l*Y$ wv#AkAOEܲ]ϧ7%3>L211j[xFWiKoPm _.6+ ۻq _L,%mml*CT`K*%O.E2 ~e?.\h 2B^ ɕ!Hwo\d o|5=i7($~TdTO1߂}:^_SeKK[#YcTP=jooE}q>qV(숄ǾO1;dawa3Ꮚ:߉ZK${a-\@*8PjmuyMε4t˛;n(0IES$*-sluTEe ݡ- j>^v'~!hW-=x$K#Ihy. ePrdpAoş>"͵1&2@c+mBރ&iK ԡk 3吾9]b7_?n.5mU4)+C G18`G=@AğlNy,mc*7L>,~R Nv|7gῶEIz}!`x|뚺V# pH㐥q:;@_+pS򞁤~xL>d+u۵W=Vqin$%͓4 1+WGb[L>g1Kx%yvX.C6  jPڠӭn, (hRk),##Yk#7<ۀy?k/Wr]K6EJ \WX9KƷVZHdY/muݮoAqYx$+Kˋ+yc/!x.U"<3%wLveY ^وʶw q\`%oJXf,Kf46#Q"Ԟ0Bk|Y]M5Ojjș>|cgm5tSC &%m'C`^OD+hLrGK09^ztszrjz^$u{oo*(yզp=v-j[M>(qzm|fQneɉGνy ,*ZFыseX/rY]L)[#  ,.jΙ|2 4,"HDyx 8v@p~mNQ6\>042!+q4i[|u @]O>Uk>]yskq%ݛ:`a`W毫ɩ6`sv0gۿT/562 }_oGH\(R|\rynOoټiCHe˾]zOZ&o;&|l,~fZ,WzMpg7O4rH| +}_Qд]OW +Gi>|s1u;WJ^0gYRA-U$9^@$I, ,ckX9>}ި}>X(?|Q`Ezc_6EG}C m#d_OioG?1 >,ckX9>}ި}>X(?|Q`Ezc_6EG}C m#d_OioG?1 >,ckX9>}ި}>X(?|Q`Ezc_6EG}C m#d_OioG?1 >,ckX9>}ި}>X(?|Q`E֯|zz(?|WM$MUS&I9@}68ށ7q}?fkKR՛-zT~rOr֟:~<ݿkk#w]וSgL6: __/zEPUǫ?,??UCgv((((((((((((Az?O?I%kI C 'Ÿe\Вqoo@XwVV] ynPGVįfۓ}MjG0QeP йoSTdvռw6j6G4j\Ou+]o&mr|\)*>NXgnaԢs<76T8>fMc0~'<7cyc|ƂcXG1.мH<ƃZ}"V؛p?o4ۆaӼQyzo[-!2n,je;wb_0}.,/ZAqJFˑ~z0!dha`p3Ҁ8u 췳 f{;[o l;xQUb\붞fƫfQukVV`+A\ .4-iҬfvϵh<̏ol??s~=:@ʎ};"̆$Y;ufۑ,d8J)Z牼Q7"T. m0];/r55O:FPgP3x$).l,7} D60ٍ9ڹzP's㹬F ޕ,.+і;y#[J5N7Ws&m-5Yw&6rR |9-_hZ>_V7q({t4B X( V|nր9}tNŭV1;Z+l.3dfA?)7]R=Út_ukK=[yeA gl.~Z ,/-&K]g0Xut^OHTB #@;b׵J ME2o1A!q:&lrmvSt>O *3d,rZ@Q@yԬȿZ:~R#"e=-x]5s7-x]5\vO C:[kx`q@6 du_CZEpbMw3U,: |aíf ǕJfQ&ݸ>R\fSkZ\lRA;9\zrpA"e&OxoRO'r>dd_<[\4JƥH, r0A#H__S@J-t֣|u^\yc>r۝׿;: 6fayoxLA@# 6y9G5/%vǫ[\[O+{vA{dkGjl~RS6xsǽC}wj-5tbn/3%_x]1-,Py=FqrXJz= ^}}.8"/6D˳V= `]On[5E}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fGX?C nC n}voyy?Q?Qz}fRx%]xUڹ@wj&x-nSu.Bq^]4/Yt-DxId:bHoh(穹wOOdKYkεO䵑ʩ3ztF=_ a^"ZǪIc@*ܻEUQEQEQEQEQEQEQEQEQEQEQE C 'Ÿe\В^tߧ /&8å|ajnљs ̡A* AS]ǫHbQu2T! >#=WKZ?o4E}J(!m'|:ǪIcמkEvXIڞ$tU F Cmu|5P< B0+0zz vV7+s=٠!/?hl]C)‚|Kщ#$Vjx冕>kϩ %ur#x-kKզXoMbP*Gr1pOM{O tIl[[]jG0R9$$䨪㱿C(!5S]Z4z|/mZu۳f=rzgwOfݞyzcWWxo޽i+Ocu6q w,$ vҹ$)bυ<1e[jvVA$ZAԨϝ䳫OK3\;z?=_O͍=_FEfcWS3cWQC)Q`C(!( !lo }Xlo 67>,7 ^jӓm+??/֎yԬȿYqbm^#EM\m^#EMW (sO}ޛks&vXRF 8xZM{ ^>{A7UÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙTV/1y|C=/?9Eb?nbÙD n08##75~00!le3}𣚦?>u?-dx?=:S?G*Ψlt_G%{Gk]%яWX״rQTEPEPEPEPEPEPEPEPEPEPEP3'7 DžrBJ֓Az?O?I%e=:Z(+__/z\[x.KKd.]IB __/z5=?(kau 5٤0U,>[O?mRxjKaӤ}) G%w)KdI+R+m-O>^\#6uV28zw͹"6yMO*_4˽76IlĜ WW:ZOj/mnuutl!Gsb^%mm常`$H$8R[k]7{eF} |n1{` &VQq뗄wsk$[fbs8ϜA ,n_/k]/_CF^Y#[ $4A$l iyΫc Բ%+S)9-C:q6ħFkMMyxAXXC,H{^;]jVA[G *JqS+rCr"wq-@b[eKr%gI- q܅@@p=nhp RzY.I3NH8g?+OM[|ٛ$eWzd.\T׍ψgѤү&O!dO#2\~@_ Am\XOgOݮ;*O7I UX%{w44t`H !V+ >kk:ouVHUܼlX Te\dv&vŲA*v vԖZ{6=E$@'ә)'ˎCxXSvYcft:Ev +"܋awd.I VZP0%%˸-V|y7EV88\ f̒_"{ˁ/q, 891 -i=5Ƴꖷ1=IHdh)WI^Iإ C v@Yz/tOMӮ.m4ɶ=X IX٧$XǨ5}r`+2OpN9`L+kZ)ki%OpFA Fqu:?ios=ۘ>ՍC`lJ֗&iVsd7q!$_EA3oe~7e!tV,7QxnwȕnUv#7g#8qN0 +7PWxtItR8#x ,ʫ,$`ɒ_ԺmZ,-0YWA Cpn6 c6Ak۩s1AS:f%7%H߂Un M;N)gEoQʘq܌KEq׍t+{y.Wޖkyru1swwngVAmfI m#qBʭBGٙ.O eGLrE44{p%@bȮyEe$)1QY, g= 0$ڞesO4\lׇkY֧s-PEA75W{6Uw rHW W5k+nE""hf2:'*?*9ռJ!!&4OMIG<<`\Ɗj0EnAk ZmAXk:Q=ޝ "#'H6F7nK!Hrv4W-o/SI}9i嶂| $jo/߅U;IxRӮFI"$YWn׍U-Ȁ|Y\w\w#Anc"B?FuL8~5LNMx{T5ڃɘ;85i|W{}%4O3wʞ!($4y6Nڡ{]gMsii^^fYI);l | y(X(ZG .!x8b`!b)1p5+hgҦnYq9yWr2F N|_suefnl帊TUb`AԼ!]\A4 ѩ'=*2ҠӞ-3=ۤdiU,r:»Q\w|AfS"QῒDJI9RcE ˄샸}էjkmK򅵵ʭ 2G?61p7w^"./!R۬l]ϸ%'P6pJH*\[*]=ⳂkIK{B#oeWp5w~6N5\4 FDʞnٰ՗Tϭx?M [뤑$[A8)8W[ar0+X-jm⫍ *kR3'6ŒSwBz15gZ >Z)ZS?G}?>u?-dx?=:|LAk]%яWX״_G%{Gl@.E@QEQEQEQEQEQEQEQEQEQEQEs2/P~CzxY)?$i?sdS<,딟VSݎ;#* "UǥIi!IQb+ɞFGlF 嵴$O,U 4wI5ʦ%˝GUDOyo+4iT-!~- 'חynF?{/FO1yw&eg܋rʍK. 'dm=Ǎ| oiy-n\O6!znO{'בxo }'ö0\櫨Yk7ѴuG;rj>#k5lt4y5Un QDTflwy??Ƽk>$:xQNcB7Mc_ U?J-ƅ 6!o˭jCtM#Es,~Xwp(=o7xg^}\M6 &Lk{v[(P}Ӝp7>!˩iO}ζMJk$dH˺HaHt&={'ѽckϴk0x]!m?[K{;Obf>/xMӵ _NgǷլe  O.AY2 ʚ<FO*־"x@]*l-dl®eo)-|:W<]-;Am[LlF2X`n4y??ƍ<^ ^g$ng\V߳}nsQ X~c _#gw]ٳo7x6{o}>Ѡ># }1]癣{cp T1$d:sWE=ƙuuk[C&reR>fp2@;<FOSڢxj]KW}+q"L 0rɟxrI{g^tgo'Öձ7biXܸ@s3;y??ƍ<\uֿh3}6v(DANIF02x}+ⷊ8\E˝jP֒vH ={'ѽckȵOZƏcus-ǝ}nT<~G2">f1N;Hݑ:TVP6r_kv}9 wFQϙ hwy??Ƽi|_M{~ὂUۆH6^DH.pyj~$_[ xVc摭0YQӒ7&B\hm֍uIyI Ca `ӊnm-~]$/  ?) Gi][ɦO aUdNVG@6HrFb,|wa<\X$J#~vY B8oГN_ ir[ySĶ-_*0vf;9#54i#YKd!YFԍA̹88fM+]%5 6^[PED_iDc X* 5_ZI[\ijDH܌h Oz.pZH̒f;#ĈF@FHʹm*y 6}Lj@m#(N덮ap̤2uMeyN^0cp%WTE㊒Z-B\܉d[͈0d\lT˸ v>,Qx.R{U;Ge'jcѦkiREicmFZ2J.U`<-ƙjuYwܬrD3mmR{x#G4lKVF`nK/4hZ-gxг#V#R`C(9d^x@,㴺$grMgMdp;>L8_`qRiq/.->{ ŻEb\yʕ9VBJ08!9/ke0^-Z0tc`r$D0ޣ@9FwzCjDBl$H /-cS00 |Wcw֤O%kHiKpmqQ0Č?#J_Mk-pB]L@8ݟ`h=S[y^8De1\IlD-9sc9Z]ʉalJxmyT55W̓Y68!%gkssq60۵™0cBSR2$ K{XeRG"WR0AY#š@xwNhvRbb6s-~!iW&[Y$\tðjޭ4=2RDMoLzFE  |&w#Fz?u ŵ))v# @rh"ey(bf?vvUE=ukjfzv`6W6Ϗ,$rD{v /MzP֋{fС7"Y Vb;6ÙdU;x'rnb0ʱ",J BDOºg' ;i$]N12 29rw>Iڬ{QLҼuC4mʑ X)}1@ šEwKk 7 !v.BrR r i qrW!&Bp..rŀbr>J{۵6 6TO!dʱ\l,̀&#L8Ehadhd,d sw($閺6oXV 0'vs5/Om> ?ˌ.qQy+j2gi_dX,ce` M'458M ic"YNr%pmͻ6sMZ^N<1yRGȞc6W!pA˪Zqhv76iep \;Øɇc"۰`>2H^Qt嵒dSmDb rJ&i[kuAe#`@! Ύ4EgB%:>62>A0 xڦ ʢ#Ior#'r'fm&s/oorvUTv}rHυ4{(;ɞH YsI;;h~a/]>Ѹ |_0|ux{PX5^&$zHA;߉z=üi{gIm 2 g ^MSlxoN[,{2cD+aTpĀ$ O ijqj;{:DJ2ۛwnlq`"5GN:QYv2cTF!S\ hZ:eƝ| TIZ2nRB3<|)5wRK<,d˜:8%$Om{cY0MP6*?yÅoqb޷^jqFi#ndN|yeY';KjEXیӧs{˜_'YL¤#^>Qz,!u-B9g-墅ʖ XPo .f9_ ''$úuX÷ӕzgn4k#0I"{fW4Xj,UP),$2xE6%.Fxϛl#G#|8li>i|O#.h,N`.whz]kYm߻u*vI#z:]]L2Fi$v2@3( @ɬY|g-o鬚7xyʍ_WZ}yrZD#I4$0T2vɸsz4V`36,VWQ}ysLa,Vt7@G"1GCFUA F fxVl ^+Y#wc! >;pf`@$_ 鉩XcH`rYcv.cjGTZN 8 [j0wrF-~e1Vp  l?0~ f$ZQӢba,M&7>c4j> >n$::v w ` ]T~e=Z|'Z{]vuΧ_%ǵwo^UO0-뤿1 KAB=WKhU ((((((((((((fOoY> /''7 DžrBJ{dtQEAF|V^aBM6eM;eXO\G<M"6ڀ)8OҜĥH fbFXgߗtOڂB:/m*ɞ]K2qga? dX=Iֻgt{[mN{K)v\T} i {EօiiךUŌ|ihڻT @AQxkA-mtM6 Dm֨ # 0`zJ|A.好RDqUo8=y(X0.~S1zKX|'8Mh\_ BgkuFakFy,%Iv*>ۧx/ JqiZT2Ki$ [ƥ"1pH\>OM&r}Vҙ>g夢H&Yf 3.nu!dR(n<O)Ѩe`ULlxᶁymE~]Q@[FIQ{aF:c'=DwדZA%ծnmy\:כj^5OWtzE ˼%r~o>݋Z_|:yU[KۗxHɀYPA 6Guu$`nVSNIB*ol_nsqګ^]^JҾǶ{x3* s;WiKc]ؕEL5nkem', DRQBr>,K uX-VHEi^ GU}=>?Ou Gʱ߳vnurrj(-&-;$D*milh&.(ؤnYY"Ktm-iC'&S)gj럘Kk giMj|1GEΉGܿWIcM>`w{ ;8×szaOg ߧ$eyaW^N?ںmj MQ6=jP 2J;3BO7'J}"ߌ;@2zZouoei]˘DYaa#ԚFE-; yr2˴0I<Р D777أm߷ݎ3$>m&v*Y}Ē $֥*=>ǧz{U{o no|?ATyVQ$L~]̓dlQ@skADf[u$rZ+F qxkA>˨Woj(eӼ`` Ԣ9!R rAf2;$ܒj_W?uOOY~ƲGG; e՛[I0CH`, g= tU OhZrde~k=SP7wm%.-"Xʻ(A_Ld!Qoqj7o}أBf3櫂Q'6M)4=K{"$w^nrrj |IAiop#wB3ByA#*̼1EKK>j-dQHC!~b6FW|%q4jڍO*OIAHrd*P㑎@3$Dw:dWvd{2  \" M|-j>{s~wa'lEurYjNn۵ŦA:DhhY  > NM.jY;]h&I!CQ b0sFW bV[&Q,dPF"dPʻs'𮤚mAti*eEcdo8.-2%n#@όR@q -jdYMcs,j[h݀XhݍXG[Děڊ'kUzEj6)<]MU戦G!N'65?XisO+[XM:VU jNràrgWu &%խ_-TetG3h ~fRXѠ4/ ji-ާ2Mu 半\mɜK"8 '|'{hQZjV"h-P>\g Ku3FD`ƒ9Ef85i~*յYl"G\XIu:AɴX [99Nfug5C,Ζvr3QJ;MLM[Qcy>mXAF#aa >([zVjj l>w$L6 Kk_uo?gwE- ( R)%Ū0^,/Uy]dei#&@]WQi]6ZxI;s B?w;w|[7%.ϛ7/ v\Zg}je#`i71gUSjVw_o'SI BtsR5w ko* #ttTqh2r 㥢'-ZX:{q91^im(a6pG -{/ krh\ӷZsieZ?81hsFWPӵ${#mge1#eq~^jkUM[Ns۬'NrQPw$~n065QNqqx;NFGCfcH Ռ>!𽶻&j) QV&m+Uf`~x?(-JsrYpg;x|ʹ4./mY궰}ēY4dh? 20K d4Q`1oF{ BN -ImH]d1YN99#"O/o׭]k,q, "<*'Ȉ7 Xl<>UƯse*-22ϴxNy *j`px+\FNl#=*ڹpJy}1kI᩼!AH E$A#;TmRKź*)X.sQbl4J~Kqjd(\F$R:9{uGëZJm#HĢ@]2y1ξI+Um;e nЍ9usJCybx;A݌KO ~fe'صKEgnA|<)E7Z\GI,%ӬX$ CIX# iuV_M<.:-z6VX,bOW1ī-ǖp-p983SE0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ((__?&kBz15g]4e=Z|'Z{]vuΧ_%ǵwo^UO0-뤿1 KAB=WKhU ((((((((((((fOoY> /''7 DžrBJ{dtQEAAEP$OڂwƝ[\761nEwjgλX&6'9q֮'חb 6WCKyED@(@;Tr힝kXlCM{ijZooh1ƐFAoټK) 0e <9(<@ֶH'AIn%PљLp#C8J4&ݜm$횅&q$>N8L#SeauLחwIۈ4X" Ab`e,խ֠ӧelm+h^;a;p0#5-I5^Dƌmy,c+dCGׅn']Q\[n6%SLu{whY?yF0*0!ڭEGu?-dx?=:S?G*Θlt_G%{Gk]%яWX״rQTEPEPEPEPEPEPEPEPEPEPEP3'7 DžrBJ֓Az?O?I%e=:Z(('yAXzϦC 5ɸ^q#-aɍ]C`NǞxXOڂiwvqsiE<[b=>dFV؇ə-oǚv|lf̂D8̇ʕVહg@,lwgG[Zc6|W3%wx-t0^Dq s,:Ur]J:[2ȭ]3otͿj]9,7NHOHAp` Û> 5K6jZP'˼~k'/8E} y;_Owc};G怳Nm/eEw[n[&t۝,is­UѰ```c rfupÏ%I@McMnZ]B١}ky7ՍB`ߚlj5mamhm DD+_Y]w/]dzN6hɲ[DpόN nQmD)eIv JɩhVWY]s*@|1ds\~jO|!as%WZ| r@Р! [>B b]XYylȕgΌ?"\a9N?6Z+UY;€1/Z‘Jxdkers6I@dNByK[{ösQ_j{j^5nQ(2L`ZR;~9曤5[z} ;XV%-2B3}Guhtucqc&ktx6#1PxXtՖ KBћ' |8^ak^4,5b d.ԋ$. 0R|UBcvmOl=v\t N,(,6pstR\-WIӼ?K/u(1^IamY̪y{9*vaN; i[_gZOuX|q]Y Hy$ (H.r^6&~ ydVo$ݍ%pJ 3璏ÚƟ\]bGAKrϨF  VVA 7QEpH#fBNFGN  xRTuΥgyܙnٛY~Ȥ$ @p6EEӵwΐeѬt9z}L 7,HK:FpKR9|EvQHݖDCr3 d㭢to?m n>C.Fôo |-:&ᇼ4a(mZ@FT. hJ Q`u#ZȞE̊Y+09#9y"5-8e6&`*m牤2!#ƒE#Hl 6xr 5ofif[IL̊Htr7FމTf˺b\dXF$1V6pX缢 4,>=ͫ '2l 69ۑY74Rֱx?0ߙ4.~؞S(;UMha=B索m?ÉqXUd%PWBb+ʀ / \ͧqi^YѡKramKkιg4Ak]%яWX״_G%{GlB{h ( ( ( ( ( ( ( ( ( ( (9?sdS<,딟V ?߹޲|)_O +)EQ@F ?j /g5 :D}0G ii1a602FF Oڂ4_ykV؇"L[]WWJK%m(gџ>Jsk <:Ko%̑ja0wo-|}aggiݬ AS`y #{-SY^46w2q'P)TYN&}ry4-՗(/Ϸ?VH +{x$qơU 8I@Q@Q@Q@Q@Q@Q@Q@Q@,{gE|کl_w4kh_Qָ_ͪoibW8:-ӝti)r:{ERpl=["Nj_MW߶#"pV6GGvV -?EoV -?Ek ɑz(I ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (YJYJ41bGJ{]vu??ZVZǪIc@*ztF=_ a^"?((((((((((((fOoY> /''7 DžrBJ{dtQEAAEP$Oڂڌ p&-a#\W0m)eU^,ǜEe~*o*+γj_&?yIͷy~+o*Ьγj_&?yIͷy~+o(AfuV4mYK'~mأ_߱G: 3ڳj_&?/m~_9Yg՟<$MV5~+o(W?6Q΂?%hڳO_߱GbtgYgO? /G՟<$Mr~_<ͷs:?yI?%kW?6Q~mأmYKgO? /\b/m~,γj_&?yIͷy~+o(AfljNm']g!Y~l9rz9b,pO£W?6Q~mحU˜:S*Lֈ͌ʫ r988#"U2ѽűVH ֮a&m)+rw4GG;  Oh[Ճ OhZrd^+RB((((((((((((((((((((((((((((((VRGVR XQҰ|ݿoE|98t_G%{Gk]%яWX״'v((((((((((((Az?O?I%kI C 'Ÿe\Вq-QPPQEsx, ـ9^IA ZR9kQ ;Ff?#a-6^yPArݰ3HFվRbs?#__7G$vk}K ; C V 2v>\=,&!M?ΥX[[;H? ZR+,񬑠 >5T\ J! }?]+/D{y;/H? ZR餼[yb|b3Ai?ɓ޸>w|vů/!?$ĈD2օGAt\:T>*h֗RO yIfCLmbLn( v6-`nq)CVe>GzhzNjivWV|[3p8)Xk[}QZ#|mH2yjtֵ;DSVdG/pȍ3z[ՙ4;}LphtWZY9999&<<\j~%H%*v!G<QѮb-w[/(-®Z4(s! WhzE\i6e3.ƒ#baV5+NS[zs ȡF@`FpO>@9kkv=6^j˪ 8K #}x^`:nWKjZLd;eOF 7msdzOOO]o{m:e]%ͪHrN`N2O02mM^Y4˫"Hcdrb߀u:n/ENwJ11Fl6- gwR%vMswfBF@\0xTpxsCFӢBGq,v ǧ(ͥ\۪5h\ :dd* ,,9heozuGn:e9\.Ϳ$NWrgx{?:_ؼ;c1q=qE}rú0DuŞbĩ#~X挍3 =I($Y~4m:Uo֨ # 0zU ;{x(bPTP0@Zqw#%ޛo@IoE&PrDžCj_Tkif5WN$Kwق[ϡ2]]d7qn&kt/4dQeGmFӠJA$Vą eA,SFb_մ췲:Ztjg6x<^K:ϊ \7Eu"F#{A>+'VҴk [[}BжA2 r=PpsHª{U CL8tjipi_,R$dWc}A+ՙO^[7M%,f{$w -yk)¦W+m ^'49^'Fӝ3Z)ҾX08#3oy>Oy^NϱǷl>7s֕;P{`.v&,XPR?xRxsiu;_[fEi.F2r ^{዇?4\*gUP9^_Dz&k#Vo.%n~sڌF dq'bп;1^nsJGѕBwbC^76ֺF`n#maoel񲑕z$!M,?_]=T;,˴ .Pyf=8ⷉ.|?_kcEfx՚K*ÌN]֮%X6e'gQa|P.?10TT/O֝ޕ_[\^XZjvP9=( K}iݽPGssȅ2Tt&ky9ȅ[F{dgUOsl"챣H|ж*71 ӜߪxoźnuNӤ&yV Or]ǜLmnm˪|2nT"qniFU،*kӶ\'-v\I\Jn>`LH=ݏsQyz]3gqV֡e6oa f"˒2Sh+5t:6y hC!],$b',<Kg;r|V[ake 6K` }g(tKl>׈3yy|"DeA KCu+SK%ٜgp?!VHBGjQ@bؗOkQyӴMae0fDr J8\;qg5>9ͫ[^y1ΐ"ɶM+~UXx$4;}LphtWZY9999&;ÚpfYL˱HخA*@P'].>6.jVk؃L9d* RZ$xQj>ma->$xF1 YscJӬ..n,-mmC L'.@>SogK}q~f1n1g(ko`)`duSÚdZd6Z Hn@}jCkoI1(HB(vki;gXM$m<41Jb 1,Ne5M3P:޳}fgŰXtU.eI' S6-eqt҆\m;FxZtZv2aQ+HW{J,HV(H"rIcI']Ji6[đC8*pW1??ZVQҰ|ݿDv: __/zEPUǫ?,??UgܻEUQEQEQEQEQEQEQEQEQEQEQE C 'Ÿe\В^ORIYOv8쎖(((|AG-yW7V4ۋG;f0yq9W05+7Yq*X˗ G'Wu9RҜwٳ%b5x u~?wti𧯃Ba*K~dՍJmb8+hM2r ! ~VjL{ e/ dS?3+C +FV`G' ֒*NVihӆ[a)EVgdg."D&,V?3!y?~g)g {~2Z[A k“oQc5*u׃Sƅx?ft{e*SSZjѯx?ƕx??MCR˱SbT(ŀ?bԣN+kγAk]%яWX״_G%{GlB{h ( ( ( ( ( ( ( ( ( ( (9?sdS<,딟V ?߹޲|)_O +)EQ@F ?j WMI$H ^I-tR'ח+q\"ФD~7.>7.񥨛L\^"C[`Ks8;g*H8*t:Lxf$DIz2mR,t_d?Ed?EpxYm3APk)[W?,@76O.?!X1N-kw`d!gk] uA#\&9$+}.KI!s|QI!s|RiwkY^$p$4qk epV$9 $U\,U$c($c*s0WBBTQ_MA ?"MA ?"QG3  0>X}o\1e_?S ~7.>7.Ȳ]ܸKnaKiK5|Ue6"W|$rB\9ad wn݅BBwڭxu(n֖[wBKZ[>b+Xj׋m.}^,l֡oQ6@й>X 5nCo\,gwn]L ӎGE?? yުxGE?%ؽq"׈uW3q"׈uVؗWw8R0 =0\ 2#A8+Լ%ocwmsbʛ܍pOJO6e.ùh]i-wA l ƥuM>nvȤ>_uܛN/ӹNae=ƞR<<İs" 2Z-B\܉d[͈0d\lT˺u Cj;4 Y$h5F1V or zkmR;FI"09O3foqoTm7LK+ =JHg'842ʧN )"}BVCg>RKm!C9mktI& Li#Vlp HC\Gver҈wDvK Z`'IPk#ZbxƖȰyB6(]9Ƥ5KKuFWDolcRaLAݓI~μi,yK hh[ws8c;Փgz-N;BHYPw;YAl6Úu/>ըO+\;#IXa@&uyt-Q{"'v1*?"nQ@mǷ^קѮ .;$JPOe45"}1ﮭ!VfxJP`.43u6zvBerIO,t9@Yto&.v.O"G*EH:T5Yx ]Mu3Fh7g:(X +_$|䴳v'$Òx(qu%٣0 #Pzѫ8A mV Pɤc%]zaWx638f (b ެ_ ZAͦw{uYGg,c6]YPg,eBeҥH-dI$W lba||LxQoİ T]@(H˴08$G""\ڌ|n9n⏵--,~t3a[;N]Ӓ&>K{Y-FNLV+lcR;-6>o5G~6!_/Ɲs=1Ep*kڍYmc< T!R̢1r/~kWVR^ aj2ٴ|J+`QG v_a6=ժHѸ@U89Q*}BUj֐Ce#bc\c'#VwhiWVCPL-"2wn]HimSH k2VjZ ǦY!XI>-yk,3]EkoVSI*_*͞g9χֵ1,PNc-1'vG8"*C-3× 5\}hqL"il/’ La*i۸k˫%$*v|/S mIo\#o. -E$ۘ~p7r2 [i6v:ibg$6f"ep\ۂUB*M@eO׮][Qiԍ7 7#POCa/cOMeZ}NPL2ڣ8cUAqB6[5u d. 35T#$G3:"*~e6pzcu>Ȟωendu8#v^֛CF--G㕘dft(;\ol>?.%$NP<Ybֵ^U9-`14q!>hK$6~cc!iZ c'Ȯ0PXdn /?_4W;b{&cs퍙 i~K fQMkQtMhͱc"0D;_ Aoͥ˨^Zb8#hUeA' \I<Ѩi>-~u+hMц`YvvSpʓj0EnAk ZXF>zhKrvɍHS;/o}CQ"a¬{pCH\9QL(VRGVR XQҰ|ݿoE|98t_G%{Gk]%яWX״'v((((((((((((Az?O?I%kI C 'Ÿe\Вq-QPPQEI?`2Y`zTOڂ[]ktՙ#51TH=/k>KUgcH$m"W RO# { A%ZLO  |{ZY9dηw_e&HCb3O9È^Z4X/?.7090rGo~N_K?t6+-%DXCm< ;s7gב|?xjOJ&}2A^[nO?15kᛇi%X_!]F~\nas`3,>&*4@nIU#۰xV$g ?~焿ɣgxK|3N]e&mc"FXYʌL7{FEVYC0ڥC&\=~X*vu?"j焿ɣgxK| jvgBm[s~I?C{6&ťиUIX\8tT`7 I(;Wd-i>焿ɣgxK|*+_oH G5TQ} %O/s)pQR6;8M*Ms%"h( w_y(4%̴?+[WK>ʾw^UQ -ۯt F4(!IpH =Z8.tf+Kռ/~\M)僀=Y9Zdym58/`9x;[' ,0e-}}w׶ZW'^sv3 /'ch( I#q8Zxt*ېɲFKݐs}kO$/*)f I&5Xʀz+1':p]*khsǔ' W1O'd*l[LUTmA#lq'1$h]r3k&3n b7$ox[SiƤ!{Ib& t_ [$-c vFmHk  +h?G7?pQ7")WE-ɌۡD<exvFhkIK2Ƿb2^N}D(ͤjQjb[2deea! C1ݞ9]gƒ q>`RCe_ޅu j) \.u/rIУzwuflƅq )v0a-A29'_XE{e}eaPG+@tVd'i: :(d0!))uS̤P,JǑ?xvEFfZJMe*~PC6Bmtx }kXٱbpw>s8މj0E C,[tfVb@r7mN/Yi>Law!9!]\$|~#Ct[՘o&z M7YM?WOiwcg s,V\I HY9BoO}/IFy?m,λ0Vʈ{)&(z6u9/~=r`&< ;S9΅ڳTQsO g7 [ Z[tY"[yB`Ɍ3.r^sk"Դٵf NM;\4߻F #C4K2n(Ih*K&:=P7Ė/n9?h 70'ۂ?@z(S)-VDf=u$ctKiakht?Y9:_·{Wk#p4{05?Ə>_њ~9:_΋{Ck#v(Gs_΋{ChF|Ü<?Ʋ7 7 ^9:_χ{WkY<$"G).켃>akxt?Y4st_G/F7|Ü<?Ʋ7Ѻc濝/C=5QR>akx|?Y4{05?Ə:_ѻst_G/F7|Ü<?Ʋ7—s_·{Ch(Gsa\>8>ӹR?c.g&bE~}(Ҭytyu<*+G>cˣˣAʊQϥXr>sV<<9ϥU..y*+G>cˣˣAʊQϥXr>sV<<9ϥU..y*+G>cˣˣAʊʇ.Y#v z"Z֋Oi}ݵԁy}GZu&Y''Q(8#I2sW^DH!vs5Wr7[)]bpcSTDk).ۋrZqBSXkζ?);=WKhT-뤿1 KAp.E@QEQEQEQEQEQEQEQEQEQEQEs2/P~CzxY)?$i?sdS<,딟VSݎ;#* ()'ח[SIH+*H8u`ObH0I^_PT3SiOmou#Lk'3WbN$i ɑohu RODլV;"ђ>Rcj}&=.Qla6v<`A|Oۼ,4ͭɒ%eaO#,s݊MfH?akƇUD{"{YHq7 7XKiM˪FRc "Dbīz^aAq}"kxl4"&ݮ)*T0?_ K\!R$Ua'c$>M۶wݷ{݅Z-K;%eUtlNm

i?wZӢ*XEmgnZԿ l?R351Osb6bZ*F##hQ0(a:͇x_ƷF##hQx1 է% 0+h 6ao' /''7 DžrBJ{dtQEAAEP$Oڂ-ۘ摡8 , : A#C>6 X4R0$ƲyPS1z$Fܙ !yo#d*2m򼽤Ay W;[4 OY$*,Ndʈ8-ԼysK&H>ܱj%Gv0 b&$aaN"[[8Y\`?)͈]'Fmsy46vegi3EB3Jv.p9$;6ji$gYem ] 8V&qef҄5; cW rT](5FwKy/7@xO@To i 4˯<*Bmiʁ!dᜨ-Zq :CM#VPyQ6Aʱ'Vy^_YXE-+}2a*! @5ω:ʢO%.BJ,Ht ?p$A i/w8_86eZl?YZ7,LVi ԉ*cTq"4.\b=yD>gOQ=(l?X:,Kt췱BɶDoIQ9Bx\t5k"Դٵf NM;\4߻F #C1f/=vتU@w6?#]N#ŶV(Pܬq~R>=@#:}OXB[:SiחZۨ! fe[QC,rFUym&[3SKߍfߔIo>OȿVo>OȿYKv8썋O5? KR[P(.3Ќ8{O{1z>g9fϯ^kR)7qz2]jjh6d}GE\]O³^'ؕd9 <>c?iD6q 1Kz RWhn%bBʅ pF*j) c mp)$"MTSFeGJx JBm1Qzl_x(@wօsBgQ4ҺT]ҝE6ieq m, / [QwX@0C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ݿtx?=:-뤿1 KAB=WKh[Cg!]*(((((((((((d^ORIZ/P~CzxY)?$vGKETQERO$/)eNas#DDWHUАp2ڑ?`nu)uAmh@knc!w@X܅p2CrdOs--J$TOd(ʔ&1jO b R펡6/-oBOL&?8PI[T`@5KJt2Y؝F^yLw,Ab$&W @6K T4zWĝYokI/W"˜q'7~n@lE#-w6ڭ|ϵ4^ey מB6l9 k[}rkn&/ }5(Yr7#-oYm).KK b)l; @CsĚ֧j1i>Ps}qyln@vccP>ѯ4.d[Ud2 ĊH# $h5]VSf9<˦!PTE@.II#Vվ!h.} OMĞb.ur\oJ(\DL!˘W`X6Tl^^_[^%x–.Fƴ<BOƢO[. IAte-Ԋ1ݞ0Fu<1 3_j[k]Xf¾vл%[ۆ2@=yDqkkfP3owqd-lEr$mr x݃\ƋYɠꫩ*F2ty^ }^@:_6?У͏z'+${K[x̱n#x;0; 6{vL9QDFgOQ=(oU<#"[oU<#"e-5#+m&R(bGI*OީAG$4q6 rAGokF<-?bͧY[]yZIߜ җQ^[+&na&0xG.&7O^g[_5ˣoIOq=lW$cr14<+?&ABj8{5</7e3(ޥkeqmo3q4y T.ppn+MŖwҭd9"FE .rT-kx5gcx5h {eFǏv<_q4XJz_ç\kr5Jwʖ0و>~u=u}vIfIA=>uL`kg;[&XrH$W#@$`x:j]5(ⶺuqVH3(bGKlZL\`P1N j2_wo=ܚ}֤F#U6RF9Ɍ6>\Wea%nV\oG"uykVnc.GfSuÁq@:w~Ǭ_togSwJ}Q5ӢXɥ*QwC@rIi /s΃?'Gt߹?uqtyUֿ#/ 14Wm6bA 0 妹ak2KqimOiTri8}c Uw,:LU~d⫈ ˢ6ӥԶ~|LQiP4?$1 ~ZM..,T֟ND-J7(=~:j@[Q7DP,~Ts3Jw13SDku{nҢ0{+d2H z`,7D] #΃?'Gt߹?E+*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[*gA :LU[)Y/%a&wb=IRkw]ݯ}_qұ<ݿLv: __/zEPUǫ?,??UgܻEUQEQEQEQEQEQEQEQEQEQEQE C 'Ÿe\В^ORIYOv8쎖(((0I^_PR{s42G2AqBA  `TQ?`:z橥h [UQfmkRH6N9֐ܙ ZizĚ귗yh1`Shm9+>uk#K(ZX^=(U_09 _W &HcnxZ ,xd.C$ M~%4os]o2t(ui0ÿ.eKk+˨5M-Ԇ ң$(E\ '755ϬEa,F|r3̃p;N^:`Oյ m44R c2Gq|Y`;H I%+tUR2DRLdlG1LLKv2 (-$T  t%}jovV渏̐dm8Rvm9sN)(Sm..M.F . 1;e  kWzWua$9\F rOBwdյNf$"DDH(3-eָ/5.1Fpƨy۸H |FO^x>6d^[Dܬ0jD,@pGIe}+P<ǷRV7VS Ghؕ*~W# bj? |;,u,ˍf{i ΩqW/!4}^"kID^_ ;S8ft+B{w]FV6H<˨&3&'J.yq>|tR\Fej,d]0ܲ*@L&2^ert$f۴(;k-ѯ_<pI<ApxN-^'{x^2r(pOm!r2ډ,--e)69 V=>8;.<ݿƾgʽ'j-bi.-Pm3RT~NP| i*R؝Z269*n1 -6mYFӆrD*7у(||/uYx]`v*UE͏H?X펱q4_@V(^=p؍)*?y o+M6uo4Hn.CsA(MO Dh?(nxpj:yg'ofw&~6V 9s*IomQ. ķpY3C<IeᘨpnOVUy7u]*h`K[[K[wF%id0b> @ c} <BE3͏z'(c} }}n?7~ƭ}n?7~Ʋqk\#KTD:Y)B#MBGEI(o ^~QDu&K Ȭ!QU,*J(o ^~Q{79?W_E A+/"f7G4\ II2WP@e!=d7?(?W_Eo"Eso%I,2I#C+ v*OGCJپGTmE0}ټT3+K!%yEQ*Z&RoͿkoo"d7?(?W_E>Wϵ7G>E]o ^~Qd7?(9_/6}!<*CJ!%yEQ)ym Qϵ7WW_E A+/"WKͿkoo"6}!(o ^~Qr/ ^m[Cym UGCJ~ RoͿkoo"d7?(?W_E>Em[Cw!%yEQ(~_(o A+/"G+@ϵ7G>E]o ^~Qd7?(9_/6}!<*CJ!%yEQ)ym Qϵ7WW_E A+/"WKͿkoo"6}!(o ^~Qr/ ^m[Cym UGCJ~ RoͿkoo"d7?(?W_E>Em[Cw!%yEQ(~_(o A+/"G+@ϵ7G>E]o ^~Qd7?(9_/6}!<*CJ!%yEQ)ym Qϵ7WW_E A+/"WKͿkoo"6}!(o ^~Qr/ ^m[Cym UGCJ~ RoͿkoo"d7?(?W_E>Em[Cw!%yEQ(~_(o A+/"G+@ϵ7G>E]o ^~Qd7?(9_/6}!<*CJ!%yEQ)ZG25ē*+K&ŀUz=+w]*]<)B8ࢷ`Rkw]R)lt_G%{Gk]%яWX״! ]*(((((((((((d^ORIZ/P~CzxY)?$vGKETQERO$/)fգt8/lFF3iF ?j _ZNj\=eYf6$d i ɑxvPT!X&(ue$Īw0F i%կ ncifXdx'u=^XK;M2.wp87/uaws=`Jڬe'ဆ^YUNÆsb5u=:RKl!Ȇٓ̌67/Y[*8ܪF>uK9ZwhlgO.UX6@ ?7$xFN4SxgĆ5c(DVvU Fx Tw4gMHyHdc܊3 @t>mP#˯2Mn_:%wj+oi4+++2aYʀcԴ/k+AN-u #͉ʖ;wm#vvs_~# J[#*HFr#vy1*PŲV2[}-5M H\ݕQ[ك3PX ՃJkwV۵X+?|.5<B;ɼ[SCZZ[1.cL 8]gOQ=(l?GOSXqT~5lqT~5cȽq"׈u/jҭ^kc3pk0U Ꮍm^#ED nbNT@֑OsF,#m&yĠne*GA*`_ß:ơsYeԣ%m>㑷wzU]ZD m<1@DleW95OC.+ 2Q< <({s$04͒r }h^#i68S{ I+ݻ[ZI*\\d7 -" nOIn%&o$*ѻIR0Io>B㼵JKH-0&8 $};SXhiF{bH̐ ,)WϋZޭU-`Dê; 8&2peQon=Il$ GHUfg*\IbIgB㼵JKH-0&9=kľ(/^ KMA,"H"uw̷+zc Ij"&Vyy~>[7|5Y"hK/f1nŃ!,#5'c?gO;xӊV,5?ڮicm;d;Dx0e,c 9jMWXԏfMBZU]T#W9't۫n.4I$3NLd:mt4H!Ugp0rr1Mp7ZM.p/f Ұhx5T2.PjĺZ4XDM<+0 bo-GY[?x66wixlޜ m\=+VvhpheclpenXKr74)5s 癑mq]X5K HҚ!(2I"y`:&Mw!Nľ(7Qi֖zqqmNrɌ$vyi8S Aj_$`Xm$pIΫYRKIlYuB{C!;Jx 6ЧImEd6 E[;1rj"~JQ~f6یnkpz2Kio5 Ib'#'wePxăNuݠKШh#n,Yr#i I46mRR]>SdWm Qy_n}j9t-oUt?f1cjEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP ]E%skκ!GJݿe==WKhT-뤿1 KAp.E@QEQEQEQEQEQEQEQEQEQEQEs2/P~CzxY)?$i?sdS<,딟VSݎ;#* ()'חX[:]ԍ o##_RFA4#>? )*,RtS_ϸt6<8o7'#\ӛM|<"IWVUe\ۡE㱖>4Goi?wZxrXy$K~{,n F(9Ū( oڥpJM*4pJ̧oxyVr>.Y-˪^Ck4F XeO.#RW!y?*풊9%kf1yH*W 9y,~\jyDeG8Xc} <B補,jyDl?YtQ3Go>OȿVo>OȿJ[Gd^m髙mH'QE@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEb?RW=褮{w]Sq-뤿1 KAB=WKhW OrQTEPEPEPEPEPEPEPEPEPEPEP3'7 DžrBJ֓Az?O?I%e=:Z(('yAOB/ Jb'yAOB/ J%Z*J ( ( ( ( ( ( ( ( ( (3Go>OȿVo>OȿU-1?[o.jn?[o.j; QEPQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@B:w_x?=:Gu)+{]vuv: __/zEPUǫ?,??UgܻEUQEQEQEQEQEQEQEQEQEQEQE C 'Ÿe\В^ORIYOv8쎖(((0I^_PSpB0I^_PSpBl{(((((((((( [ϭS?/ձ [ϭS?/KvLvEGG{QTEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP ]E%skκ!GJݿe==WKhT-뤿1 KAp.E@QEQEQEQEQEQEQEQEQEQEQEs2/P~CzxY)?$i?sdS<,딟VSݎ;#* ()'ח+q\"Ф'ח+q\"Ф[2^(((((((((((4qT~5lqT~5RݓzE릮fE릭#EUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE?#uI\GQǵwoYOqcUǫ?,??U __/zE\6!=˴QEPQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@̟ ?߹޲|)_O +ZOoY> /'ch( I#>? ))#>? )*̗j((((((((((((oU<#"[oU<#"Tdd^m髜0ƆTɌ >VnV֢>VnVO[S?u j+'J|)WmM>Vn+t]wZҿ+o o7G[S.Edi_ϕ7J|)]֢>VnkQY?WmMҿ+o o7Ep5+ti_ϕ7VO[S?u j+'J|)WmM>Vn+t]wZҿ+o o7G[S.Edi_ϕ7J|)]֢>VnkQY?WmMҿ+o o7Ep5+ti_ϕ7VO[S?u j+'J|)WmM>Vn+t]wZҿ+o o7G[S.Edi_ϕ7J|)]֢>VnkQY?WmMҿ+o o7Ep5+ti_ϕ7VO[S?u j+'J|)WmM>Vn+t]wZҿ+o o7G[S.Edi_ϕ7J|)]֢>VnkQY?WmMҿ+o o7Ep5+ti_ϕ7?RW=~1i8TrHǵwoYOqcUǩ4WNGGW[x+Lpy뤿1Zq(5rƙA?GƙA?UhaY4?4Ev 2ƙA?GƙA?Uh.fZ?#gh?#gj{E,_glglUhkcL_cL_Q`-li4li5V=e36Ə36ƪG]̵FFZ(Y4?4Ev 2ƙA?GƙA?Uh.fZ?#gh?#gj{E,&|)#{+/Ÿe\Вou\xY)?$nE# ()'ח,p/hrIIY2qЏSQ'חvVW>LU~d⩗ڏ%f&8!۹rG$~BZSjg>LU~d⪷?kǨ~B>Z^=|?߹??Uo+jQ_mO9jwBQ&O*W[Rz+j_QSo&O*s2UW ڗԿoV/߁g>LU~d,/)E$2E!Xetn0ppHA*,U#g#1jve%_>LU~dOƏϼp+g >LUY_Eos2Tg ?y?5?}>~k4^]ȭ&O*s2Ug'GOƋ˸YQ&O*(y0=iA #"iw ")o!DRX ϋ_;yg^8흂3>ݤR~? QQE%6[h ˜=@R@i$?/s}9qhشЪGlʌAUǾKUojł *p(<Q`/m/T2D\ BFQIx?=:k{]vtt_) u뤿1;DefUpJ<Ȍ3ER\HM\޿󨇄0I6QjoX{1$OY4fǧjǿivSzx~to_ΩYh>m@'FH*T`AHAoVWš{-{#IJlulۃȣǿ9_1?b}:O й MS|%cu,X "L13Z={C]' G?\??&go&4GαgCbrnvޡ[DwM#ٻFA挓=O>oaw 5Q/'20{~cK%ޙylq0 Tq5K^"R$Դ:/ 7ORto/NqP($%g?nkiX)?Kӿ-M6M60nm !2X>p?jRެsNfZ7 1PP{Z]]G W`7 24ʏ#(%&OKuiuy\ZHEU%s>?oٯ$R30*F&px>9e9y6V\Ss"$? EشzWż|2*}-N BMK0m d7H i<+w.oVKc~z`rx郖]=k_ sO?5 O]=iGvQh+bӬeZkm$($,=FajقhyVGT%7d`Q?%ÃS+;gr! 2*G=[V*Lo 3B)2d#cR~~$(I/Qt#OhelQᘜ,;"glbGĈ|mH| s_'EX%},̧a d Zk C2! OğAbUoğ S{;c8 W5륮kw]Ԍ-뤿17|i6_SiZǪIc/m19VRA>Qvl+ţC`M.4?kk[<'L"28xXѣ-c5?&s: 6 7JZI>< 1$͑#9Te}gӇ~~iᡐ$"?qC[.}/0'o"Xcݬ6koF̆ta& ]EM7qcj_F fŽ—hْoH`qb?[? ZK.}/-jNͥy~]Ȇ0!W{1Zgs3Ŭ-c4i S4c=Mij_^ .OH9 =^A4P3Ye`#N0*LetZylLss:_\YaIqow_Ems7yK$>f虸 {Ί%~յcﲏM7Wl\Ǔ+\u9 3oTQ5> : ajfĈ|&'iW9r{^u{; ;<; ^F)\l|{} - kӥ ۛX"6 "jB-]\^? Jɥ%,IղlGS4gة 3|+],ڼܨ%~HҴۆF$h*Y)# dzVEP0(#X^ /' ?I%0:Z(Q@$nXŠR 8t5$7"­O KtQ &Bu?dVFlX-wgp I$=.3?]IoEh c`oD-E(_ID"kMwI It;6PtmJVk;+օr20u!@Prjk g3ٿ߮zشTO -<5?GZZ)eeez+;,Yػ!bK19'\В8K&Gk?ఒI!dXe ?xT@ ϓm jzf≯4C@>Ӽ!?/&' 1y}n(<>_]Hj/iT\.̖'^b,*|÷o)AFLIu/<36cmȽE (!f^>~Qtx#\ֵ[5+)L$lVq$w|r`'O&mf}W2ٳv?wy}n(<>_]yljhKx34  +̚l|eLNui.8l[O?uG  5 Hd|(ʌoGyhKx34  +}M Tڱ6o3=89>y[?.<ϭH 5OքT%I'L0!گbGQV䳳}d]djv}g>߱G,*ߕ'I<4 ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?أoʓyho|, ?>g>߱V?&*Oɢ `H?ب糵m P?xʓyjubyuhHF:Cs230<y IKBT _oED(D+r./ 'G/ '[Qp0Q? <Q? ܢKBQKBV\ ?:_O:_O(aТyТEΗΗ(~t(t(nQED(D+r./ 'G/ '[Qp0Q? <Q? ܢKBQKBV\ ?:_O:_O(aТyТEΗΗ(~t(t(nQED(D+r./ 'G/ '[Qp0Q? <Q? ܢKBQKBV\ ?:_O:_O(aТyТEΗΗ(~t(t(nQED(D+r./ 'G/ '[Qp0Q? <Q? ܢKBQKBV\ ?:_O:_O(aТyТEΗΗ(~t(t(nQED(D+r./ 'G/ '[Qp0Q? <Q? ܢKBQKBV\ ?:_O:_O(aТyТEΗΗ(~t(t(nQED(D+r./ 'G/ '[Qp0Q? <Q? ܢKBQKBV\ ?:_O:_O(aТyТEΗΗ(~t(t(nQED(D+r./ 'G/ '[Qp0Q? <Q? ܢKBQKBV\ ?:_O:_O(aТyТEΗΗ(~t(t(nQED(D+r./ 'G/ '[Qp0Q? <Q? ܢKBQKBV\ ?:_O:_O(aТyТEΗE7жRDv{rsZ$B`yyn {3iѦ(ȟ_ķZq}MT2(<,6LqdeX[k.cqFɹ28#q*kO7݋) \KIӑd`F;Gk# :MnZA{3+_( \evSX HfR\c72HU^@U@9'iCI#ahk9*>oahm,ŕf0ç'!UH=~QGk#{z_̾ O4>Oy GN;Nܑ lfG2*gJ-o^ : 7:dW6tR:K-]v&86vgO>׭$@rlܒ"HP4;>Ύ8-!F>zZ}_TPIVHP]h0Ys/zQVѮk%%rilPhxl yH`aּ3l:LbȬX7!zQUy/|.$:{Bm5H?3s֏G0}73[CqlKqgG$r};ݺ׼Ag[h;ˋ'Ȓ(9"oe60m'߫^xGU!epcU j;=O:ti9LȰid+8mz⏪G0}.nnO Ū *Gn|^!(U$B}ZkLڭ}0#m<|Ò"3տ̻|Ot) FʥbY ԒI=&>naag ;r~UqAGk#{z_̾OjǮIiiEgq{*4nԠ3pĝ_ { FGdZ2eFc'?^pe˕):*C|0&G$ǹ//;3xӊ>_e/|Ohz#a[+WdjF̰"[ e 8'Kú֡][_[$OgI;"2wʲHAJ~-5?ZK1eoleY0}1R_zUOᘞWm2J *;QZޗ/ݢ.Z_&K=A/Jޗ/٢.Z_&K=A/=/_yEc] 䴿Mx{_-/G+#{z_̾fi?.Z_&WG0} w%4] 䴿MTa2͚+K%hi>_e4V7%KK w%4}R?6hoK=A/K%hsoKlXx{_-/G%KKJޗ/٢.Z_&K=A/=/_yEc] 䴿Mx{_-/G+#{z_̾fi?.Z_&WG0} w%4] 䴿MTa2͚+K%hi>_e4V7%KK w%4}R?6hoK=A/K%hsoKlXx{_-/G%KKJޗ/٢.Z_&K=A/=/_yEc] 䴿Mx{_-/G+#{z_̾fi?.Z_&WG0} w%4] 䴿MTa2͚+K%hi>_e4V7%KK w%4}R?6hoK=A/K%hsoKlXx{_-/G%KKJޗ/٢.Z_&K=A/=/_yEc] 䴿Mx{_-/G+#{z_̾fi?.Z_&WG0} w%4] 䴿MTa2͚+K%hi>_e4V7%KK w%4}R?6hoK=A/K%hsoKlXx{_-/G%KKJޗ/٢.Z_&K=A/=/_yEc] 䴿Mx{_-/G+#{z_̾fi?.Z_&WG0} w%4] 䴿MTa2͚+K%hi>_e4V7%KK w%4}R?6hoK=A/K%hsoKlXx{_-/G%KKJޗ/٢.Z_&K=A/=/_yEc] 䴿Mx{_-/G+#{z_̾fi?.Z_&WG0} w%4] 䴿MTa2͚+K%hi>_e4V7%KK w%4}R?6hoK=A/K%hsoKlXx{_-/G%KKJޗ/٢.Z_&K=A/=/_yEc] 䴿Mx{_-/G+#{z_̾fi?.Z_&WG0} w%4] 䴿MTa2͚+K%hi>_e4V7%KK w%4}R?6jH?קְ.Z_&<<+K{Kа?<'֌Z(>d2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}h2}hPK3 $G -Pictures/1000000000000400000003009FA5091B.jpgJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?0}(WU[6RW{H6|碱(WHu+ Nb2?J-+UOfg0ൖ@I# W[cFP$u{Wo€>9?em]OQu=?AC_J]Z^0&thO- >oʷ(ں8 +6oc cq*6? ?)G^0?cq*ںjz~}- <W_}G=ga/lPwASYV$X1I<~9 3W_m]OQu=?AYS˥w ']Kᅌ-oʷ(ں~g_c 7Goʷۺ+}-ߕ[q*ۺnzʏ-L5I8̭,H߹qds^|BPUw_TmCW=\SFx35? |9KMl%p7s^Iyfmn^%fP~Y#9 ?kmCQu=UK-pZͿ_b*yސHQ*?oe_c7Goʷۺ+}-ߕ[q*ۺnzʏ0|~Tyo{nzʏ*>_p{WQ*?}_c7Goʷۺ+}-ߕ[q*ۺnzʏ0|~Tyo{nzʏ*>_p{WQ!G?+{GQ!G?+{GQ!G?+{GQ!G?+{GQ!G?+{GQ!G?+{GQ!G?+{GQ!G?+{GQ!G?+{GQ!Wu=bHw~ dԁ9 R1WoAɻ$r[q*<~UoFpWf{)=5MFG7]y}qmEdSLhR@3\cX$h]7y@Ucx(B.s抅:Ӓavjp[נ6/^ӿ5RE6Xf?rHQls\_yrWteoFq4TR^yj6_98JO˖+MnQEd ((((((((((((((((((((((23sJtM>MBcHZe^Yp9~Χ7Qc+rգ1G&AWHֽ s(:Z-׬^ x.I.lI\4t[HMoNCusLpBq4oCw,Q=ZDi{"r`N3x֎پM ʋW~нxGm'TmKwspad_%G9R=U<Ku>c,VwD줪\y:桷"!EYY,9?^OK+ f6WF6tq)ӀkJƖfO7Սל!HT#,rSԟjaxL MZGkC (L6XnoNvv{MoTI_no!.{mXPaMw{ZU杣yEC,+Dd`T a͸{ZĖu変^Uܨ!d͐F{ ry+W+;=N]VGNL$7,GF6y*qi5-t]|!Aa䮭h˫Eܻyݷ=*,%Ěz&lM7z֕ωmd6qi#K& R |Һ@#nk]S&n,LՇfnq%_nD߳o k+ɇ~!4HTPAQXrE$R4r#$JR:+niW7Vh"ovk 'a\Eܒ_KK'd !w-=WF&]}8PS+oCELQ{Q{Q詊1VjMMΊخeդlJ!?&4?{-nOK$҈k L/NkF&Wג9,XsHؑ]v54STӮ$S>qnKvHǕL\Xgy8r5no^\4sw"~I$ON("4n|G dVK}"Y]'?=ޣߘ)FȶT#)ٻk,{Ƨ*vV'e.K{hQ3XG7=kVsP*jw-ViaX3gκ-Vqm=N7kѯ?}:_iI;d+dE}?A~_-a٭mvY0Zw#;~`cvm$.|,C(uRUF\|oHA&3[~SƫU?,O( ((((((((((((((((((((((## c϶ zB-"$+m?W:ۻnf~w|5aWQߙ݄ӯ~uS?Yx~'AeC/Z_MOY[ۨvv&ї&6F!d`%oixkĩIel%0J>,nve_+֗d(aOEumeėY0O4"Ef601cĺ{ui$HH|vc}q IlnWDHgXGI"GeC(r o㻯?ݎ[?K°'iO"K_ƶZ Z l; o]+r9ͮ#`sxi "J2EUZ+'RUc /G^*3]/+3(((((((((((((((((((((( Hfc|d;C|oʾ%߄ P4zo~+M#Ћ"yHnIsX0*  h֯jZ%Ʊ.$<{Tð,6/?(Ƨ-'QK_ VF oY<לpx Oqgou5GKYLМ2_s}|d;_@rSF\iEKf#H*D,v>To`&a/7]Ew/4{pv99K_ }|KP\YMk4S4'$mrv)d;_G-'P-CAuKgI52NUH'-#n>c] KڡϒXX;Y8b-'QK_ g6T!$9aI-h<[1 W GM4:Uk@@*Wd;_G-'Qp2=4wR!Ki ,N@7vbBe"Ho .D衂 G#x~k>v?ZϝO ngyLK\I<pfm,B99Q}|d;_@Q}|d;_F%%߄ >k>v?얿k~(%߄ 4Z*/ZϝO얿k~( hk>v?£=>jNx "EPF3h?E*4oit}F|G+ȿEPF3h?}hѿ1gs"C7:>ѣ{Lcd_}F|G4oitr̋Uh?F3W9~ghѿ12/T>ѣ{Lc7:9_`E*4oit}F|G+ȿEPF3h?}hѿ1gs"C7:>ѣ{Lcd_}F|G4oitr̋Uh?F3W9~ghѿ12/T>ѣ{Lc7:9_`E*4oit}F|G+ȿEPF3h?}hѿ1gs"C7:>ѣ{Lcd_}F|G4oitr̋Uh?F3W9~ghѿ12/T>ѣ{Lc7:9_`E*4oitNp!K  N?G+?J9]Dr6aQ@+W;_gS $|'l(G8QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEU53VX^\ZJȅb\^D?'s5wOߚ=<?Ecg{T֛ 3pYDjh# AT̖I&Co*9I$sl09H4GOg{^gFdy>`& $@Kni^-NUtkźĻ#b|T ;~lR?ПJKEŧIuTwlN%u琽H[cQnnKok)Vp\ `ȧ~ Ӯ8&E\$|! "w) 0NyoikY.m "3`Kwyc9࿙&uM6UŎw%4-y9!I oaտ6O*m_6z"3an$s+x;No%xpM{B͏K|KCT[_uo z*;[dĿ0'XQ9scëlU[d=;3l[_uo ëlUcG`}͏K|KCT[_uo z(pϹ oaտ6O*K|KCUE6?-/ :Q oaտ6O*ðs>%%V??-/ :V={8vg좺TxD&{oy Xn>mfxzv8կAbpK?mz:dm>m`lc,ũ^ky睠3Z] }[;SZ [m+KzV\g`NN3k׼{y{qw4S]pz^'\oIs+k3znW;;6L[k[hi4\X$iڝw]ɝAp#`ppAOtPK{k:eBX(Τv;Mq$D$3P^[-]JBHeHbBLI ^'~gj<Td:fsykmM3ElzW'wgEm][nf0'!ŘT6f`l`m5jzw$'dڒ$?_?tG~az#AUG(^ ZYP;!dV*ÇGb {%6s?f?i~?O3<75/ ISCyA5m$xqӨ ~jj +%KdHO2e,F{'տ^N5B+z٧Yg1]ǨEI.״ F˹w32m:!N0\|3Iݝ_/?oS&qokeKqSrE0 3u)t[s[Ϫ-rn,̢2E.m*1Yy?]`o.Y|CtVI>ti@˺ya2 mkmTOuklt^b V'*id)Ja(w**/?ۻuGSlVC];R~l̊=m;kЂ( 6ciߓʊ,;t}mcdhhm+{py{7,h92N 䒱>3fӮoN"Mo̐ۼdR#`Tb@cq,v`o.^^{?u}CE[wyg;}?.644?j!bKT& Jgw%Uid[4W$xB$E?x"x&Ky<=R({+ Vi0vX *zS֢i ETQEQEQEQEQEQEQEQEQEQEQEQEQEQEVO (UB_ :&x)7?WG?JMDsq?G_Š(sQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_Kklz"G8 Ͻ|oʾ7Oڕ{Gc?ГkU_$-]-]O# 6 kQBMUGpG5BMT?ГkUtQ%9Q?ГkU_$-]-2\ƾd@W+xo[V̝;# 6 kQBMUf6m4s?_$-G# 6 kWE%/ K#"V'WM֝o-E EmN-Λcay#v1пI[_*G/m6mٷm(acB&m?пI[_*oVfg _B&m鿳o[Q? rv9G/m _}(fVHHT5L5i'пI[_*G/mi.G5BMT?ГkUtQ%9Q?ГkUNV;M";+45A"Bpu[Հo%TdՊI$vtW- =i$-y2YYa #eQ1?l.5[ е\mϝ$Mրv0Cl 89TP1fqo:&Lewm!̺Fq$kC4PgNP!c&6۶Zh jwznxbȾTF0xAztr1jrMFƹFA?+>J&-<1ۈ$qۘ6NH穮ҌJ@r:?pZ>෌  9øϣtLXφCfR.ȈQDTv<=(sVZ5Kf8Z8(wcjHx.9y?kuǑml\kQrxQ8`zQE殡)WMs$ySMԴMgwV|E3sgzQ@sZUw/`\K${NŲ0I# H0"'B$HbmtCʏG6QE#((((((((((((((((((((((u*j>?*J?q}5}zo|%yߚ=l|RQ_8zEPEPi? ?'&Ͻuֹ/'XxbM*\yIy:* iY~d 2ڌ p&-a#\V5њjjZt_ݝ5RԭcvTx%F22plc3ߏ>omOs+\}\T=~zy/3ĸGulR<61uL7N΃~>aq^->s=΃~>ap-͌ftv ӊQi_w{~? e+mc]}t[)[n:!xVۇ3:}R<61uL7N+E}B,-͌ftv Ӂlmx>lc3ߏ>oW Qmq*۶w.>u:M}J+i[QEhfQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:?q}5}zo|%|oʾ7OT?[_v(=P(((((((((((O+~? 2AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|17yxiٌvg~g/YǏu f3qQEQEQEQEQEZbOj[\$~F'?JMDsOs+\}tO1?W)EPEPEPV,fl۶T;m#\}wUŃlmvJvsˏjj|к+EDQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_M_ޛ_'EI_2_?򯦯M;<{G]+T(((((((((((+0:J߬O*L;j(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE x ^7Z@c8yݰg齱V|17yxiٌvg~g/@Q@Q@Q@Q@Q@rV%i!?ߺѫIOs+\t?J9_]S $|'l(G8QEQEQEU٨6q;]:z`5fݷݻn9r}GZ.ƊQEQEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP/WWRW̶+?Cekh ( ( ( ( ( ( ( ( ( ( ( ?t 70:J{-ڊ(DQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEg?*JP4zo~(pB(((((((((((? ?t 7c+QQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ǐu f3qgW Qmq*۶w.>u?BhEUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:?q}5}zo|%|oʾ7OT?[_v(=P(((((((((((O+~? 2AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|17yxiٌvg~g/YǏu f3qQEQEQEQEQEZbOj[\$~F'?JMDsOs+\}tO1?W)EPEPEPV,fl۶T;m#\}wUŃlmvJvsˏjj|к+EDQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_M_ޛ_'EI_2_?򯦯M;<{G]+T(((((((((((+0:J߬O*L;j(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE x ^7Z@c8yݰg齱V|17yxiٌvg~g/@Q@Q@Q@Q@Q@rV%i!?ߺѫIOs+\t?J9_]S $|'l(G8QEQEQEU٨6q;]:z`5fݷݻn9r}GZ.ƊQEQEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP/WWRW̶+?Cekh ( ( ( ( ( ( ( ( ( ( ( ?t 70:J{-ڊ(DQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEg?*JP4zo~(pB(((((((((((? ?t 7c+QQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ǐu f3qgW Qmq*۶w.>u?BhEUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:?q}5}zo|%|oʾ7OT?[_v(=P(((((((((((O+~? 2AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|17yxiٌvg~g/YǏu f3qQEQEQEQEQEZbOj[\$~F'?JMDsOs+\}tO1?W)EPEPEPV,fl۶T;m#\}wUŃlmvJvsˏjj|к+EDQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_M_ޛ_'EI_2_?򯦯M;<{G]+T(((((((((((+0:J߬O*L;j(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE x ^7Z@c8yݰg齱V|17yxiٌvg~g/@Q@Q@Q@Q@Q@rV%i!?ߺѫIOs+\t?J9_]S $|'l(G8QEQEQEU٨6q;]:z`5fݷݻn9r}GZ.ƊQEQEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP/WWRW̶+?Cekh ( ( ( ( ( ( ( ( ( ( ( ?t 70:J{-ڊ(DQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEg?*JP4zo~(pB(((((((((((? ?t 7c+QQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ǐu f3qgW Qmq*۶w.>u?BhEUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:?q}5}zo|%|oʾ7OT?[_v(=P(((((((((((O+~? 2AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|17yxiٌvg~g/YǏu f3qQEQEQEQEQEZbOj[\$~F'?JMDsOs+\}tO1?W)EPEPEPV,fl۶T;m#\}wUŃlmvJvsˏjj|к+EDQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_M_ޛ_'EI_2_?򯦯M;<{G]+T(((((((((((+0:J߬O*L;j(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE x ^7Z@c8yݰg齱V|17yxiٌvg~g/@Q@Q@Q@Q@Q@rV%i!?ߺѫIOs+\t?J9_]S $|'l(G8QEQEQEU٨6q;]:z`5fݷݻn9r}GZ.ƊQEQEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP/WWRW̶+?Cekh ( ( ( ( ( ( ( ( ( ( ( ?t 70:J{-ڊ(DQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEg?*JP4zo~(pB(((((((((((? ?t 7c+QQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ǐu f3qgW Qmq*۶w.>u?BhEUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:?q}5}zo|%|oʾ7OT?[_v(=P(((((((((((O+~? 2AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|17yxiٌvg~g/YǏu f3qQEQEQEQEQEZbOj[\$~F'?JMDsOs+\}tO1?W)EPEPEPV,fl۶T;m#\}wUŃlmvJvsˏjj|к+EDQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_M_ޛ_'EI_2_?򯦯M;<{G]+T(((((((((((+0:J߬O*L;j(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE x ^7Z@c8yݰg齱V|17yxiٌvg~g/@Q@Q@Q@Q@Q@rV%i!?ߺѫIOs+\t?J9_]S $|'l(G8QEQEQEU٨6q;]:z`5fݷݻn9r}GZ.ƊQEQEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP/WWRW̶+?Cekh ( ( ( ( ( ( ( ( ( ( ( ?t 70:J{-ڊ(DQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEg?*JP4zo~(pB(((((((((((? ?t 7c+QQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ǐu f3qgW Qmq*۶w.>u?BhEUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:?q};ym-xeHO0B#޵*K]EGA$X$lcz^vy*[-_/Աjg(?V>Sڴz dQI\yL3< 2\]uc,%}Ie;0=+Yg[WmZO^2j2Ey8mETĒn 8IfiZMFH//R;6\ɵwp,8h?VyZY+.K]ugi1]a N:*kkKɧUymdD# px=} tV? r+S?o9X^[IQTUnZY+iBCV墵bZc$S2KHgdU#KXA$dW |;vpp:г>iBCw춟,;.г9E]- ?춟,;.`)QW~iBC- ? TU߲г>iBCw춟,;.г9E]- ?춟,;.`)QW~iBC- ? TU߲г>iBCC]k*9L6ͿmH|[uڬmpbV!Kv3Z?eg!t}o Mỻ 3{ca>zQ,~Sq95?Iz[OD,:I.ҬG2h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3!H~g7 =73S9} φ?*J?q}5}zo|%yߚ=l|RQ_8zEPEPVso S1\]ҦͿoo9X!Wo?4_EtMZZhRGnÏ%3e+˱꧵SIUE$ds$Iu;$ydJ]XvZ.lڧu$Zޑ?KTʟh_5wp|O^i4mSXk+]U ߽a? rVֽ/ PX~ݦ ہk?3X;B$:c4vueaK,o$bgg٤S › q)e6mٷm*֓3\3%n5I*@ *]Ϳoo9Gm+֢.df6mkQE`0.mobidJSR_QVSZ!ETQEo%oSatt&[QZ((((((((((((((((((φG6QE#(((*ŃlmvJvsˏjXmnۉPݷsq>MOOEz((((((((((((((((((+[U}Tg¡o~hߵKQE|Q@Q@ڌ p&-a#\V5#mYKgO? /PQG]fOgO? /G՟<$MAEv 2?yI?%j (YmYKgO? /PQG]̟j_&?yI=dWqjv Ͷ8d ^@ )Z(ƕ(QEVSatXNaUܙlvQEj ((((((((((((((((((>Lc=73IhQYiOn}ڐ|1zo\g?9$Ӯ~f=۱ 3c޸&sEgɧ]>{cjAg3qL/N}unԃϙf3z9T_x&t7ݍɟ3gs3M:oݻR>f1MRg9}V|u۬Gv6&|c1r4߷YvmH>Lc=73IhQYiOn}ڐ|1zo\g?9$Ӯ~f=۱ 3c޸&s\$~Fnɧ]>{cjAg3qL/KIf)\ ]#X?yy0{v^g^ez*Dsec~qO%ۛ(Kw?~U"an"]8}ol q͔ g%?{`}aʻW-K6P61mn"]8}olϳ?9WUv3o]-K6P61m탙*^X6FٷmĨwnێG9ܸQօv3o]o #-bV @r6}q2mū~_TRRNV( Š((((((((((((((((([_?򯦯Mm/WWRW ~.EQEQEQEQEQEQEQEQEQEQEQEo%oSatt&[QZ((((((((((((((((((((((((+ğծ+O IZO`ۡC'_Qp-}BNGt/UV5E_nA*Fȵ :Umп!UZ(׸YۡC'_?uE "t/T}BNUh^dZnA*_⪭k,_mп!Q :UU{k?u>ۡC'_Qp-}BNGt/UV5E_nA*Fȵ :Umп!UZ(׸YۡC'_?uE "t/T}BNUh^dZnA*_⪭k,_mп!Q :UU{k?u>ۡC'_Qp-}BNGt/UV5E_nA*57KU E3>7O@ ~P֝=cw Q$z Ƿ4+ #W?u`t,*? &HIAWxE4伟7 {Nwn輌yڋpL}; $%&V'I蕮r?§HOQEp((((((((((((((((((((((+[U}Tg¡o~hߵKQE|Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s*ͧ۔G})f]bD$vghC\!`9#DLŇM^$/f)b|_8M0AQƱ[Y4TVc@BSݗ:+ʮd#c1>novдѪl# y۸3-l Z;fdٰc I=u_VgU/o9OVk]-XZB`HFDl+ dsݶCO^iGXsO%.@(I'Ϋ?v_ re(@pܿ#_-b]7۹1(;wduEfx^;[}2 M%$hsBShЖ?,QD8';+:+3ݗOI?3'^$Mt[QW~.d3̟{4fOI?3ݗ:+9dK2ϥIAW~[Q̀'^$M}/O& e(Ϋ?v_ rd??$h̟{5gU/o9Fu_Vs 9> 'FdK:+3ݗOI?3'^$Mt[QW~2ϥIљ?$kΫ?v_ re(@s}/O&> ']u_VgU/o9G2̟{4fOI?3ݗ:+9dK2ϥIAW~[Q̀'^$M}/O& e(Ϋ?v_ rd??$h̟{5gU/o9Fu_Vs 9> 'FdK:+3ݗOI?3'^$Mt[QW~2ϥIљ?$kΫ?v_ re(@s}/O&> ']u_VgU/o9G2̟{4fOI?3ݗ:+9dK2ϥIAW~[Q̀'^$M}/O& e(Ϋ?v_ rd!;"K}9N3Y-4ˋx;bW''.$MW~[Q̃SŞsquui=ԁD7f=GvO9WE}_vɀG2DP%kc:+ʫZan Q6aT2'S0o ¦ =._*Z| 5ԗ1?iu ݙGy⼾.>ǣ/؅ծ,]yP=1Y@Pq$u OV6ww׶+jBe%M#dJV1\R@adtضrTbW-'Re>]iNiܾt\Ovg|-@*j&Ӡ]n $,r'΁AU%YgO?/G-<\UhQEYضrUSQӠYkq4@s#  `Mm~ oZ(4 ( ( ( ( ( ( ( ( /o *Tݯ{MEB?J9])7?WT;# (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:?q}5}zo|%|oʾ7OT?[_v(=P(((((((((((X?7?^qצmQEQEQEQEQEQEQEQEQE =ͭC 2 cOj)VWJ|)WmM(\i_ϕ7J|)%{Fi_ϕ7J|)%{Fi_ϕ7J|)%{Fi_ϕ7J|)%{Fi_ϕ7n/o!X^5#rvbnKEч(QEAEPEPEPEPEPEPEPEPTݯ{MEWji(B<Z+%&VX c#q?~aER9Š(((((((((((((((((((((([_?򯦯Mm/WWRW ~.EQEQEQEQEQEQEQEQEQEQEQEFkb.?Ѝ(Š((((((((((((((((((((((((K!_B)7k^QPx7)7?WG?JMDs?G_Š(sQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_M_ޛ_'EI_2_?򯦯M;<{G]+T(((((((((((+q׭Ń\#sTQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@RCv7]RnТoRn%kZ+c*䏝ͅQH ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (oʾ7Oe_M_ޛ_'EI^vy*[-_/ԻEWQEQEQEQEQEQEQEQEQEQEQEV,aFkB6C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( /o *Tݯ{MEB?J9])7?WT;# (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:?q}5}zo|%|oʾ7OT?[_v(=P(((((((((((X?7?^qצmQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEJ_ ״UvK!_B#'I蕮r?Rn%k?>wG6QE#((((((((((((((((((((((u*j>?*J?q}5}zo|%yߚ=l|RQ_8zEPEPEPEPEPEPEPEPEPEPEPXˏnmV,aMڢ) ((((((((((((((((((((((((*i(RCv7G|Os+\t?J9_kS $|'l(G8QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEƺ0wzF+r>sc}k[+& $c1P \}/}zo|%yҵ?zs7KQE|Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@a YH]F.뻚ݬî-rr\ʌC9<`hLFF7hqYBϱdx#R'DZ-f>ͮIal/m_"ȿ4?4g{S #ʌpp|ǟO >3vJɓ#mڇw/ȿ4?4uož4ʁ1 + 'wA;/"D)li4li5{NPMrG)uPFK@:~{cL_cL_񮆊=\翶4?4hم{cL_cL_񮆊=\翶4?4j#!462<8? 36Ə36ƬmFۿ \qW?#gh?#gjۿ \mE5+li4li5cm6J4?4W?_En%s|EQh JglglXwA+/""({36Ə36ƬmFۿ \Z=RƙA?GƙA?V6Jm-_cL_cL_n%s|EQW?_EpԯFFՍ"(wA+/"GjW?#gh?#gjۿ \mE5+li4li5cm6J4?4W?_En%s|EQh JglglXwA+/""({36Ə36ƬmFۿ \Z=RƙA?GƙA?V6Jm-_cL_cL_n%s|EQW?_EpԯFFՍ"(wA+/"GjW?#gjs mleqWJʒYZY%V ttn)7?WG?JMDsq?G_Š(sQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_M_ޛ_'EI_2_?9Ni8݀Rw5g¡o~hߵM *ƙA?GƙA?_9c.T4?4,*ƙA?GƙA?EER?#gh?#ghh_glglKcL_cL_]li4li4X U/36Ə36ƋvFF`.T4?4,*ƙA?GƙA?EER?#gh?#ghk&?uli5Rp- #*eOE6tQ ԋ>hn%M띞[YI*~nXiōmbNI,̍Rvwۗ!VtFBQ}zknW?ÏΗo VDLvxI{uԡfe6m\$hFW ūNDQEĦXu5+cbb*Dg~o Q(t;d-gs&1ՁXQr|Z}\Wwmc3r䙉~ e}[C}|!.,5%q&s[ݛK>k(S,X"Qs)n55ͥ2YYD[fǞ2sҒ=i!y^-&Ty|.BNNQڹ猣N\nBQx[!єY}[<$@̯2o߯"r`6_ԏ&6=N7,Ń;i8x?wy%[۸yuiQZGᘖ!g0*$`qɪd!b|g/|n늟 ?wjW=ƛszgoyq[ޣl>).Jӛ /=n-aekXYP\Su&}A^xf+673Y=rb$총&YԵG%PIcdˑ:.2B!s^['eAjXֵxké\.cO)񁼞q_6:F-6ܵ 2]䙁ݻ`"7vYŧd6jV"`L`cOggg/77xm߷qC2 ^ߊ)xXմ}f,mlޝm5м?E3,.r)?|%rYn^k?,ƟeO]aFp MJ}HR \rJqћw~O,=HQV@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE)7?WG?JMDs?Gb_Š(sQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@r$W4v8+?qky_uO^I{84 _hF"X~Κ8RO_}|G#.?%|Z#SG#|Gא`\ςKG/g`={'G.O ?.|Z?.?%;<5 -?x}~^|G _! _h#?z.O ?.\7]y/`\ςKGv_#׿rxkxt#.?%|Z?O _'^Cq> -࿒GH\7]<5SG#|Gא`\ςKG/g`={'G.O ?.|Z?.?%;<5 -?x}~^|G _! _h#?z.O ?.\7]y/`\ςKGv_#׿rxkxt#.?%|Z?O _'^Cq> -࿒GH\7]<5SG#|Gא`\ςKG/g`={'G.O ?.|Z?.?%;<5 -?x}~^|G _! _h#?z.O ?.\7]y/`\ςKGv_#׿rxkxt#.?%|Z?O _'^Cq> -࿒GH\7]<5SG#|Gא`\ςKG/g`={'G.O ?.|Z?.?%;<5 -?x}~^|G _! _h#?z.O ?.\7]y/`\ςKGv_#׿rxkxt#.?%|Z?O _'^Cq> -࿒GH\7]<5SG#|Gא`\ςKG/g`={'G.O ?.|Z?.?%;<5 -?x}~^|G _! _h#?z.O ?.\7]y/`\ςKGv_#׿rxkxt#.?%|Z?O앬UI}I󻔨ߘ"}6fv)QW/ٿ1GE7( ߘ"}YTUoQ>,**E7(ȿfabw"}d_ϳ~b0J>?/ٿ1EXE]ȿfߘ,Rd_ϳ~boQf)QW/ٿ1GE7( ߘ"}YTUoQ>,**E7(ȿfabw"}d_ϳ~b0J>?/ٿ1EXE]ȿfߘ,Rd_ϳ~boQf)QW/ٿ1GE7( ߘ"}YTUoQ>,**E7(ȿfabw"}d_ϳ~b0J>?/ٿ1EX1IvɽAEZ>u_kxɥ[*ASZ^/^yBg53Djr6zxjV4n? Ȧb|{[XMj6խ^(ki=γѧ)I7ࡆ{ǵFE^Օ{wku|,F[Kf˸؃3ҐdkWu2-n%fT^H;}7~L($?')l?OEj^rC⩴}2+H# $ pA펄UkO-gżJ]:IqkDsbҭ?)M/Y*CyKqPJ)^zgsvݬE$rt>/ 3iD_{c qD%.NG=4QmR U%%?Kğ8Xy>2|ӕ+vp9O76ƗszYi>6~yԦQM3M :jrn9}+6ڻoDZڊݕ )5O7ιG2,-4Kc (l0"^t5%y!foY7;5y4f[&f3,&d ۶= POmwl,Dc* $dyz؃7;4}fƬ,ip"\Qmc#Ui_f&MMOc̷љi#erJ>gDfS0Wyk7R FTFٛGٛSkwmROo4Q7D΅C9:zֵQշ76ƙ,b/!(pP^m%fy'#??v=btU"sH< ϙ6k썟ks~ְ?_%.v!(RLe@8歭׷Z[crc2xk*UVzW OkSOZzߺ??.gɖ|1Of̓8ҲHϛfCְ?ks~꽦}f.㉣i$ ޳Z -s4 v7!8!v޳Gٛowj[6/aLR]P7:>wm~M%yDgdgd[хS.n->롅\<}n3޳Gٛowjӵ(& s?oZ_2CMMszѹi>! goR`PY֟c\I*dؤWL6 _rPdbHUUcI'+Dh.tվ{I2\s$,gP syZNS߳F_ٛowh3z2 |p1(î XqtomLl,A8$7 svqr3 #;%MN=߳7fylc9S|rǝ+rrOLuO[,۰($#$dfO.*}fƏ76ƴnۭzBFLHqU}?}mqP_Pqk[MMsiڕG=RLvį )sQ֠YUJ4՞M5#3owh3owh޴noZGC%B3N⥎I#*ϱA!FEV$KZ&v(l"Iȫ+\:}fƷ9Wsj[ogX2"T}~x?>t,R4r+$J AOAffѹh޴p!ˀ+̙H^i}I TɎ?&OZrn'KQVğϵ?!XX dֳЮldf13%Q c/Tq&5Oa}I <_Jc@7ge  5ٍ˲Y[21.{ r{*%R=fH'U,1Ł?7!?·?Y-kao"YOV9d-Qe@S5*V[+5zkoSϭʭڽU6{)>~Ice.;@vcqV>K2*z@8?yYg3 7u1r)}(o/kygΡGLwgV[6QFRTpi5x]"gdGܱ,y=~Vnx>SV- v>䜚{Z-oR-.SYFmZVNUn&@={9 }Zo{zA7$Cק=ki>S/mI# x(m& oѮC-N ر:sW%Wa}5llaydV퓀Ny}̮Wh R$^n^S;S˽f-Y9n\(Rm`jm'7GTU}FiWҐj0 J\ҍ1Vu!R̪1Xՙ5=.ӕcő[& Oʃ6F&F)Zh`""j's*x!O8xS{zТa%C&ӜW,n aGknѿ1[.2kcѡIӯ#/%l\l\nV䜡,}k%妫%M&  ;;[sOj0C*O'wRTtVw0iΒ"P̬ðGc0nF{3Jn"Xùd?2dǃ'o?1^ ;¹CB#feݲe9dB zuﯮlϹ,cTs17ݿO(۷gzVB]jV{1h-o3(o0ɍm.x-CRɶ]ȭ&RJGއdWo1Gݿ~bѧ+ߨ+[j{<^[~Z CEDyc瓞p _G?#~?ݏ8Xv?TbL5$3#LX_?w?knKG q&/ۣtoQom%c}J+{# #[`#yzQ7_ھZ>|1o8k۷oQoߘ;ۛvziI0{8 0C8fǸ9h\|Wn㧽bm7(۷oQB a.y;i/m7*9x%dZ6BiZz\Pd.=Џpsp^՝!c'v79jQ8Wr=pssJ-Ôꄹgt#Pڛg A8h`8n% W#6!Ү%+7qK#'bk1$D9 DZ ̬I!;s4RC0l+gF O?ƜhF*ؿ>ʊO,ŎU'A `T{{5nrG<m7CU/5?14yQ̖u[?+dFyne<x>ZɱԞMPTK)otECoߘmf7|Wi)M٧tYv6 nJ7OFZ%݆X]H|`X[#8[v-$D]қQV@f-a# =)v?˩a%)sJV~[-:"1Xגq*[/]ߩ)mpoئI;\I3}8K1iA.yg!)/S򲁒qgݿO(۷v{ W]njخ-˴pyD}$b߹v(RuֵY`gxa8S]I]g|y6.|gvѻmǶ+#nѿ1Gݿ~bYuu~UFF)pvd 4L$YўTbȬ^PGypm%ri?^FgJ9e=,0F]/oӳFLy`gv(gké~{f#\ rZQ_WFK G&mz6r+ԭSd$v oEfyeY3E*q3/\/ Ӝ;.C % lN+۷v?aI] 6{mz/3D17orŒ3t$p5o]>RՖI8E 2.˜s o?)0z_Oa'5H# #dcص:h\|Wn㧽bm7(۷oVw#]v~̛|?{o6|v ?m7)]#ҙgDy?Pڷ?"7ֆcP`ixY_ 0y[]Ij/|R!&p`qZ=TRm[nqWdqjt~Hqcհ"nީݾnzfv'X{FI!A1(8$<N)ڎe{b,LcB$[XҐzqv?n{wO|-kf[`<2nVc' 8iweX;ٮ]:%ԩEpŝ3SHdI.m,e fU`RAWSJMoggq a q$@sTfۭ~tnפ{?m㻹[=kw-f[oOMml ߘT91*ߌzGۭs?:-xH4l/"ӮRhľMSG!EB댵Y--.>Ώ+,ŷLE59'28no꟝K;RVH6%F* қs-}Э"I-rkVPK3ӌ.-Pictures/10000000000003200000025824B9E9A0.jpgJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/-B[X>Y\h4;2T0DQǧRs'1Xb 2HuvzpK:U<复uP_o\x?y^I/>nZQ{&*Ko)R|Ъ2G)Y~d<.5ۘk,6֫+iksMsKӿqŒȭߡG_m~Jt1'Xis!p pH3׭VmVKj],~i۸p3z#VgR(IߡG_m~^Ӽ/֩%ݍ8H2emFXϵi6oS+A}([FWҋ|УJ/B5;ɦNXN%HfhL0_v<+5֩-^3 #I=1W*o䉍I]&Wҋ|УJ/B4$ĶYKy.7r,zO7ij6fKG3(2C)댏~Zo_{ +iE>vQߡQǡjKo|@5rHF@'JmƍZ[6m2I*#{]徤QϝiE>vUk2NcskSωpqQUj,М-4;o(ҋ|Ь)rQϝiE>vVer4;o(ҋ|Ь(AiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~QϝE9M?( ?;o+29Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o)?K_+7)ZߡG_k~fcڌ{QʇiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9ME*3C$еE~{6؂k£*F-u߳А+Ԝ&4!8&̓ߎ0o9U& CZU%Y;|ϡ⥸ }+KBm%}?㩕ZW]"M&~iN޲[t{m~Z.sf{fiZ8KBO;Y-Fwswn'"av 9AZ6+[_ﹳSJWoٯ_SriVtF\gvێwgi=O?o9ZOvN&3d5m2Y 9imHdS[>VeT➗ߟe E/kRM+O3}VAZȏw^~Eʒ0:799xOJ~Mp'cʳzJ+hcz8(B7wm1tBKeS"X5ԋGK9% ē?VOgZ'K@TQ1WB j_U{XԚJ-ygBUs:pnqEhCsԓ c'i1Sr{6d/9=UAhV ܎$FLmld, )ا4)_]Ce$4JfeiBzVO!-9?oV3_*Ww߫5Ld`}g^е;X_WmNG-ޕqeo1Bp8Ni)-.-4ZQiW6|ȡٶ$ c 1/!-9?oVe:rV?Ɩ%5huO6ym[Gܱ]Vf##֯_xLm_ķKsqqqR| F Q'?G&/*B<[@s1U[_3_meVduqI>6Ҽ.L,Y~|=#ſ?G!-9Wa^*3==#ſ?G!-9ꘟqyy L_U?1?==#ſ?G!-9?0?zb9{Q{WGG&/*B<[@s1Th`~T#sL_Uxb>GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gh tbſ?G~A\O?Gh tbſ?G~A\O?_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?⏅#ź1F-tJ5Nooγ!omhхY׈]v9f>Y@V' RVQ׆Z ރ[^ n幷1(Gn iuo" k %AE$ZF>w9-prOX;Z_W(k+RrzdKoqe}&om,wYCe6M6궓=q$'͍׻xOMB_Ho ySF?+^;߹sVK.MLSkӵ 'KUuw*l23Տk|=DY@@Ϗ򳝟8͜<<ԣ%$i/$W{j5aY-Oʳ X|3^+VK_Zǩ@>ϩUS>U]՘ xڬLѩ I%@;96(*8Z4CYTI䷛Zx$HʖPlF@_ *egFr중/iuͺbK||}w|zG?h xu 2[h.cc \M.R"Q̫7uYVK^iR+iv 2`r ecB 6|-yxnG#-%,6-~j/BoitFh="i+q ARm6Wz}qk?сHDU%sx43}3jO,+V%6Хs2&o@鹲hK#Uk{+soUQ]X|V 5*r,ݗ%,ݗ%M|}i'Cnqq 3o\k/kgeDUeDU| 3oG,e_M?DOv_v_?fx-~"jwtVJ#0??/Gg`/G`/_6[E 3oO:u|>,ݗ%,ݗ%Y0߈?fx-~"hΫ_ Oe>eg?2/&Y0߈?_>?"_*"_*l g?2/&DOv_v_?fx-~"h :u|>,ݗ%,ݗ%Y0߈?fx-~"hΫ_ Oe>eg?2/&Y0߈?_>?"_*"_*l 6>?v1 @K0igU}b'_eDUeDU|xzE'@B00!A D~ [Gru 9%${Y2قFG,5|3ϲ"_*"_*c2emfQD$l9קiO5ƶ"2Z%fcT ~ɉ,>&=46>e>eߵ??7\X_r3d}eDUeDUP^߈F<}aϹ}/_{#Ov_v__%Ť  )2G){9}y}?"_*"_*)`iZp؍@/uhaMX?/KQX?/KT?؍@/tb74heDUeDUC H)U,t4 ?PQheDUeDUUO'@ZE90I K9e>e_Ff}|ցMX?/KQX?/KT?؍@/tb74heDUeDUAb[,Q3S,?/T!ݒT}Ueߥ ?,?/R5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/VdKi;%(Pd<ڝ eDUeDUr!}>a ڕReRHq6pqg _E"(c:"_*"_*_J/"_J/"VAX?/KQX?/KW-jzit]B x /^j/%?G+,ݗ%,ݗ%⫟E"(E"(`teDUeDUsh_Eh_Ev_v_}T}US}Sr:"_*"_*_J/"_J/"VAX?/KQX?/KW? O|EQ O|EQ>e>eA)>A)9X`/G`/\/%?G/%?G+,ݗ%,ݗ%⫟E"(E"(`teDUeDUsh_E2[ay_RY2pO2h,ݗ%,ݗ%⫔8dSncubel#N9Y&u.Q6#r}UbHt|yx;'R7) U߂+:OudzKIg>+O~h_8wF'VmMq@ %]˵lC3g8d &ڧj(Eq|=y4W+POe?#S\[O"գh&KhY#m*d xI[a 5//\kh^Pӣ|I8t/9[}W`dmQ] y||=y4 ?{@+iF+Ktw ަ펑 E+6+y-!L]uj7}A츖C.yC U\0G|=y4W]$6|E}^7G y|kKd^GtWџ|=y4WKay9_FW^7G.|E}^7G y|?Wg y||=y4hR}^GtWџ|=y4WKay9֞ucki7N6$ ?{@+i}~ѧ|vgMeG%^q.UA,AzܼiljGm$* T* Z5}Qw<_hy߻ݻfw~>m]xt=qTBI~fFL eC$ 4h|#,7- ՑmvHqVe߇fܷ[KL| *Q3\ u/EMZC*jVvWV Iv]Co64I4۳]BɟpnB:C{:wYE,0SiwrwjbcBkhZ 4uHBRb?.16l-[.!wzy񞂀-}bXLukZ-kwW+Yy" 6(|/͜kS[fImՎu5R=ED^U2&Ow;7۹-ܪBQOUq-&stmg4`vHU\.c 1-Նm6Puֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%hZ  z*I>ֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%hZ  z*I>ֿ%h}螹l5HtE$.緑FI+ɪ6oFVF#W-{6s?jQu9R/4FhtB+pm%hFa#ORWڅPi}1IPݼ/ÀD6<5?ꏳiS. 5_yS\aӊpy2LmXeV\cr+-H,V% >b0 TFHc6<5?ꏳiS.t VZ\p]hXeGj*ee`$nb= }HuGٴTs^m#xjf?熧|]Qp+V>ͤ OG.z*ٴT}HuEEX6<5?ꏳiS.f?熧|]Qm#xjcG>ͤ OW}HuGٴT\ UiS.6<5?ꋁ^m#xjf?熧|]Qp+{觸ici$fE\rͩϽo\^WnnXh$I/@3@P^X@6>njg-^#Rl?4m#7s(|) a?Q֥o 3^kL&F"WP,{γڟK>ͩϽ_U񦱦Zke`-nۧ|s ힻe$RE2qI<P rǰkܹmO}%f[jC H' Z#wv0V+LK-`^I֧:lvS\\Uh湋bږ?,rǰk, iRHY!'q7ٕ8}S{? o7U ; _[5trǰk6>njg-b9c5aMHg۷E}23R]3AV?V+6R(C ()_ޛ_'EIYɭ`7>\$ͺ-tmvi˲/dhޛ_'EIQi6 X}we*jR:OjN9 H)i{/njg-b9c5cS{? o7Gٵ?uE0[-"\.búԗ?Ф撖ETQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:(4V"Grj&L5no, 72%A9;n>Nh)q-G%=LR3ogR~Z.ٕZ̗Kx8qp'bNNy9څslhupa@j=fO?[IYG]yި$ov^zp[Z5[gIGjcK` >Ev 2:_-lv[~ CIv J~#K;$1klW!A@Y F0f2z6.f7LFҭ^ Rݑ'%Ұnr:glUhkcL_cL_Q`* Eww)+ ) (}zo|%OZ* * Կ_Zِ7h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQER7OK}T??j_/i{QEXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ ?*J/TRTUҵ!nE`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfx@Hbչ]"ыXq;ST`[QEbXQEQEQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( ()_ޛ_'EIScV_J>?*J/Vd=(((((((((((((((((((( OZÏa?:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQER7OK}T??j_/i{QEXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ ?*J/TRTUҵ!nE`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfx@Hbչ]"ыXq;ST`[QEbXQEQEQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-jZ9.DI 4ðj8>$FV=Naol[qP}OeP5}Z]ΏhX / /Ey?_O77 NmfE?c'VpZ+'(>'(>.WOeP4}OeP4}Z]#('|h|hGQ^O?煗C?煗CiwhX / /Ey?_G_Gե==b<, &<, &K{DzoxY?MI(r~kXp2rJQiwhTk93X ##ii,dV X'}Z]{DzE}T??j_/#Ԯ.Q[b:Xa8PGA^Z(pх(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ ~SQ>~SUf=>͞yEz#MMG#MMGcهgQ^>~SQ>~SQaW?τߔ?τߔ}f={6y?75?75Yf͞yEz#MMG#MMGcهgU `7)O@1{]#MMG#MMG!هgu~l#@hhj{I!UEj77zsں_GGֳ+4:աA߯'<װcV_J|Qi3[ZXgq5xcV_J5-PYETQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfx@Hbչ]"ыXq;ST`[QEbXQEQEQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWE6o҉+/9kf(;_?͚QEy'PQES2*(,큸t'SoZLwu<ʺpmIf-A1F*=S'6ڞgn%y,DҨ 뷈Anʺp]8j70cooW7<;O du55ۘ|]f[<(fa9Gt[ʺp]8k.Z큭|ۈ?Sɋg2oiwwI<7ЬnYNI#|}ޤ@M]8h?5Fhz*n.<ف|(b2 giG\7i{$fG|lR*p /Y]8h?5r,]8h?5r,#zS+oU-CQEQEr;Ö9kKQ}Qp-AE(^>UJ(׸YנϢ}AE*k,k>נϢR5E?EkE "_"?ET{oz/?G_"QFȷ}z/?U(^d[^>Q}Qp-AE(^>UJ(׸YנϢ}AE*k,k>נϢR5E?EkE "_"?ET{oz/?G_"QFȷ}z/?U(^d[^>Q}Qp-AE)h@=hTck'*}Th <τ/o"7ß Ro??GUz(<τ/o"7ß Q`,y^Eo??UX|9>ཿ<τ/o"Es|#{y^EWcG(|9>ཿEǛQs|#{^,7ß G*X o??GUz(<τ/o"7ß Q`,y^Eo??UX|9>ཿ<τ/o"]N+.kHc;qrx뎴X /7ß G+Ʃ1 }j&m` ncK}}3k4I.T0' d+ל[L!1\lcdS 9*0s^}lckdv <' -YE[.ge 1"w;[ n` _EaG0O'GIfcN:qSW>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`0᱾!O2ELKNۆXɻ@ߌc=pHk o?>qA[/"`9?D $KD*+:Ou7Q\GQ!WXCHz = ^m%lRcQߊAImhݭ'6:H$z _m-B CHs(&f9 ~6Np㓓j:2^%t}*M6v& c> $͂jd>W嶝r]Za0r0USw$u\g/#M."3xcUpAYׂ.Kqo@?\57S&]Ȓ1O*|vmp=adR?g~(?g~*]KLu_Lu_QvE/}3³,QcDE q0UQ +M_3֩ۈ$OEVEPEPEPEPEPEPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Z= ٿJ$xjC ?JB|6jEAEPEPEPEPEPEPEPEPEPEPEP+9atgѯX^;Ö9kwKI?ERQEQEQEQEQEQEQEQEQEQEQEQEQEM4AQ::]*'u?f㔴U)i1>өş7:Y3Z)I*:Y3>өş7i B}S?o9Gu?f㔴Q$Og(N? r= O~,iRGr>өş7hb*تf-hڳ ((((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-wlyW_<5!r}_ןQ%VwS!`5hN(((((((((((x[_zI_3׬/ǎaǤ?z}]) ((((((((((((((((((((((((((((((((((ǤJo^ǤJo^M{Ig6+O?܇]7^D Cx{AIU~HX?௟Z((((((((((((|w:/,?r5 rG-n'|^AhC ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!r}_ןQ%p?Pr-wlyUg>_+V($ ( ( ( ( ( ( ( ( ( ( (9_ǎaǤ?zx[_zI_3קE(Š(((((((((((((((((((((((((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, Cx{AI\?܇]7^DYO䅃 lբ+:(((((((((((WrG-n'|^w:/,?r5v(0((((((((((((((((((((((((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-wlyW_<5!r}_ןQ%VwS!`5hN(((((((((((x[_zI_3׬/ǎaǤ?z}]) ((((((((((((((((((((((((((((((((((ǤJo^ǤJo^M{Ig6+O?܇[w|/wcYuؒ'~T?_<5!rףh}q".@fgp|UI<}K~H#ك +1tg v?h=P^j^hHCHnI#,F;’pzWʎ?ex3;_Rچ[R5ڼ/hߎLg#qZk g v?C]G|⪮k}:h/6e?j.Y^ W?c뾢As?ex3;(h.p?CG,c}}EW?c﨣٠g v?C]`̸\պ#4R ,c} +1uQE/SS?ex3;?/>ȿCS?ex3;?/>ȿCS?ex3;?/>ȿCS79 L-.\E 8KI?"[_Ks̴HgIRQ [ E)pQ֟]i絧G4{q[t- lcdlj%0#CEҮ4jPͦZL P 6efBAC6tt_i絧Q]ky',T,e/Vͅ~eΡa ɸpzWGzZ˭˦h2c?8 0\d0eJ--l9Tiκ@NXVk%XDG."?ؒ4#G%lO#'!_=@Q8IdO }z/D^ ]ofP^f> TOnvL?jZJh-4ܻH.!f8djF bjUtQkXRpյdQEQ!EPEPEPTgѯWk*;XXk# A.SERԷw/G9Vvo/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯?oo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵokk?0_}0- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- _- _Qkߗ/K_aG/K_aEeaj3??zZ& ?zZ& (3>/kW/^ɿ^ɯŠ(ϵokk?_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵokk?_}0- _- Qkߗ/K_aG/K_aEf`aj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7WA+[D߻vF>E,8Y7[&S+PK3@_~// layout-cachep+P F!PP FT!RP ,P :P MP [P lP zF ZP F 1 pnF 1 nP P P P P  P T P ~T P P P P P :P pP P F!PP F !PP F!PP F !PP P PK3 content.xmlH&<6fLƤRQrVdD 51{΃ԓ ISY3ݒH"_fqpߛۧOSxMj_stpp'} B})V`~֌M?e_wL/qʿ(rFGHtf=W/l{OW#j,?Qʢ,f*]dʂQu~ouބSau<ŜOi gHeIL}l8F&n1Fa1L$KD-WOkWF۸t9|`_Ug (%+ޜEj o~Z#pQ܋hOCqF[мJfȷ~j͊E#gpf(ُA"&Sf|r_; hbd|E}{q_ h*-Y(Z,Y6~D6S~v48: }YΉpydSKAݐCGvc.ec73u_+҇lZAh8 4F?f-,Y8Q`vhx1-aڃgL 9>=uƳNy7ݚg7%<{rTL;<-imvzaw˷o0۟*^a&۷ݿE:?3o[;zu&м9^D㔣IkN9X6.vt&8y^'խOo$N70gG"Ꮅӎ^D&%eߤįIJm(%N@9^ ;]W8:>߽r֑1+T9Mlͳ6ًzB|\:gg1,S}nʹ3A{pz{=<{nͳG"])nB??.}eܽ ѝ#̱;J uy72\v3m/|6? ᳑7#|6dA5Rҵ9<9tۿ7-m ";:gaz_mbp*T+nPί⊻kf$ S|)+}a2 ,Aa2_ӆpy7 a>Keqw9Po5Qnh;S Ѽr?̣0_<v?u]"3s2P+ҚD8ȋh|3j8W-\169%q?`ɢ|msV>GD0eەWW~¿0j'ģaz~j}vKJkώO3MĮW<iꚴ#߬_ccy> c5譨\S9yW )w^;I:%i2鯃)kLN~Xw+]N1x;_qm;W-:7rvxys#ѯ-vo=b4Rȹ z#rYvjU+:W<ޅS}x^'֨߿:Dkyre]_yqy+vj{ӵي)_%]zӘq6@=YL}`<!LwM._  c!.4{U?WGktMw||y8ԧ;_O)M릚5Eij%42Lh ,n>j|No>dGUijG˨chϪZo3W̷KY7Ն;BWK&#z "n%`k;"ag+nj >5=:ZLeWlcTauXR[\_-Gx-mnZ~[ ͵Xچ4*/TaϢ,CZ3?L 'Y~/fQ&h|=[0/25r5ɔJ$B6x?JL{Mɡ/EIN{SgJmh wf߀8a?O26Sq_SQ8Jg^e"~M}gl&ؠ#61mE7 laPSfz@VUa?<=.}a;Tt+fXgųDѶ>]]X@A\u/Q1qÀ>E<EAX"ʠx XNkntFAgA^ASmΏGppM:Z (|6Jv!w3Gf+G"äiXQtof]}gWsޏZ}#O$WE8da91FU`$Oy8dN0p>A L鋗jf*|E|4 ~z/?g/wY/`~Fq\ ( t3&E0w!E1U8"'ʙarN3@pF#s *,0߻h8KpF@|LԈVL4I<`a (#\ Q &'g ә D$Fdoow#ɊN G(xgHqZp12rSywxzw5Gi52jR>76DR0ښ+w-튃Ni%ujF),rd1܃9c$NNL-21(C_&27̸=`9np&QlMTVyfU"3Z~T iAVFO\q2&H p&Q> 8NjBC+Nf~yR+C~$ʙ%FT!3[58!XiFo)h{Mug^rs<'qF'5)޳'|_<)PHҒޝJqw@B!8Hݦӻ&Vz/?.0"™8qiK=rWyi.&Sޥ$P3{ *r^;)0&GSp9%WKPV X'6 n; OZ{%[LQbmyU+ɹs݂2d/:60[23cILנz/ o֥]6[Н3a#LAxL23a|PnEw8/+},è-Gh94) &.L2۽{ n"Ri#9 fZD}DN0 E,NC!K8 GDr>ST_~ V *CaiLS/H0-3/ݒ?j;L94- W!J%O"W@1&#+sK}xK$>g%$'Hvd!"Fsj=_!mme HEB#5|ObeV~5 (ῷ3{Z;X1Rv4<\ժ_Y0Ң8c(7Ū>ٶxcVX)w}Hw׾C-ryF%`}й0#/R𶙃j /#*Me=p*Y#<~LSDY ьi:EyVI rT(a>c!0N Iem/ j"v-.T BE̻x٭w%TWd/!2@7"lL YIiRXɊD,Ta׵*%N B:.PtWĬ9||ίH,%)ko O^ƙ)uƨ,~j 0N(J{8?עUT!td;B=j3|pI :w8~;R v?# }yā&i={o'+TIآB%4( 9i~w ?=j%~gq.H`v401Y܎&FpD \UJfmn{]5 'X7Dk#\>l YT $=܄`"_X\!6Tn /?_y4I:`$4x8 u"d+Hv墾n<ջEmϷt]2bP Rl{xGpեn0ٜ3؁ f" ˮI#`NOS:') 8嬍T8qpi+\hUlZ}8 "F7흃F{w h0QMIz1 -$MqdL9dWF"S!8)sU@j_'Q~@VYvh4sDut> hI#R*LT~`಑˛q(Yf|_%Jna3oSYz4>BRh~<ǭʔ!fP9"/θ8 =$;{m߰ۢ k2A3Guf^q ux"c"/Y7X[X[BvYvˡ%)2Ũ HES /<*s,׾ 0)0: .Fcwf$B? _wȍvR9nw bp q˘/ &D̹JPhD b=80"аTHFƽ% I[;QWޗ!\i\Ez-Q2 %nݩ84$pނ+ k^0 ,3%kR:Z3[BB%^!~ktTİe|M=oUɲ(04\*BaLP8ӷ uwDR4at[/ARsA E`͠bLXݺ=<@I = @Sži^e0n\{L"FO1lJ@GXC4YmA E"p|.aD=㑩Pԏ(poWh$@Ȅ ;QB-(Ž+\*PM`17qfIknTWǍɖW1leˤ{?{y 658XТYy11<9ѐ_&r3ATk2G-]3ٞ+&PjjDž$Fx֫6{`rWJ=J +uܴ[QCvÑOI1U} V=.yZƯ i(|T2~+(.<=XymNora~]\U 0ړz8ns.h0"tacX 3/q$5  {¹h{eΰ11o2܎|Шn@`Y cMnz΀w BY{I 7kԭؠzc@Ws1 (O1Z3oXjc~JȒ έb Ef)yiiCȻ8cg QnxFiO;AoN[م'w"rU+Jg0%P-rV{(Q0c[5ˡu; K"vA#JOW:%gH>w=_L:S.T1q{ q,PtR.()9eB|LґfNpvNRiSJ>(Ş Ч@om% &YrYi#-ό,>>@A[H%CLިk<:Md_iKdV?$0G0"~Ā0a"panD(gƛ1AV|1Ms,<]<iv UTUB<Q9$>k!0%AagMU 2MdZ)Wj/> eױ[i3Xc|ώk l|@ Y/HQ.+MC'a{GV{<X!E:.Q#>M*(k-?ntf{Ur w9v ޜ Zǹrs'nUMI@&mwjG&c_ڭ o~xWJwt75X+˗ɝ.uDHκ(hDc?}D %=4HcJ"`<ҳ4Dd#>`0E%j>J?s[Je4ڐa2TM5yjW!B֕VARby/)ٞ35K1btW(`P}W( dIآӳ5GLj=-य=k$dN LkGig;nN!~r+'^y5%JR̀``j%9fMӇW^&btmVwέ't = &xrȫ_Q4|Ah!6%Q2nڙiuh,^> B9ujE]X\*~qH o:f^ ɜ8l(L( pdFj9X5 k&,B(DTdըT ̘\rHpb-`B2,>",]sWyFEņ5rʖUAgiUV77@ӳO-d65̬kݸJjYO ½CiBˁ UіH5)1w[C&)} [uu5ͲB0+Zq1KQx'yϭ]K&Pkc0ޓod&2aKNO-%kSi9^"?c^0 {&^+'!WB-ص 2WXLRm\2A̽g+úxxiשNg0E(%?B 2 OS5BAhv\)Dܫ!j/WLǰ#28@S󚀽uJrbo O-VR\}THhsI@F) k"4U.ti_5dh%mV4ӳ\7Au:8Jk-t7F:vE3^RE0Nŭd/+Tj4&J@Fcd|#o.?޴{ӛk-l懛78(ӗyi3'J5?*xHP/*%ۄj"ulwvJ5ֳ,!DY+]( ݛÔ[?TW#yEFQ訦qo_'oߜϓJӒ0!/W`J'sK9 cwT:t%^׾2;zv!Ƥ MXi'TB#W[-N[/Dzcq(W\枸*u_"[XQ ^eX|H8'Gw@ˈa]qtj^C̽C,Mq:m Q=eA,//褑8:>ONNP3yV*݆̎tz0Ic9cݳi[89ysfۏ嘪~ם/tJX2A s,f'ˎ)nl&2vc-C R2a3/8KZ-\ |{u:ܚz)nZ{QepxiU Epһx~?oB"s iӽbI0 _q_|C^ &/>z:dqOiycK滟W;_ g9hg jա7;u'ad7z4ؓN1&DC N~2p_rܸF4VXe9ܥe;7 ^lsT epK4ƾr)>` +%0,оT+< us xĈ=u͆)QJ{uCvA`^2ʕJ$moԯQ+hK o` FnXB)ޅf%k5Qx5dUnQ "8;^hX։_~'B`M"!:0Xj_~..[ER\.Ru+ _UǸ~~>d+SX{z\'-4oe4!5yJI143; Wk7 W +䘄FWGj :IB8i+;}/AS_sTLٙԃdwV-=PǛ{jS` +>9p=p Mcrn5A=&~^[yi]Dz3F%Qg/i(giݿsJW8 L־r{]?qy!W~OQ:NtabW{3ҰoKiI Eétigr䙚)O|?c'FmCGWfsЯBN KrxinU/C_uIT}A՗4R3%ߡO6+UBѓk=@Rdp UDsjs U&/S{j"𔛂8})B!swjLa1HP;7iз9a)C 9(!hLғ"O׍\{X'W:jLCыeniHΧN`XRQVp8s bYćDXjZ\6A!"D~w 3wl82~_/f\jӷZ~tKgXH aFXwQ٨qLڐuh]dF0urG!5*5:I@賓RQξH^5ltmHpzv!&&0'|e _RVK׼\rbWLHx4! <UDoyL)Byt1tQz5*TM^ު$Bn(W98+WS #*Q݉z_)Ke?$LC R>Nҭ=T揰XA.)J$flDy0brQt5ޤ)wCȭvQI0 &WUVQat>Oe9RwO+> LKxNپV [et(}ti/* res*Y9r /H`USQr/GPmS;RCɻEt sLK@nMv`Zw (K:iW}b u'6+X:cvt`4@J;Q2b.<µZG:( zOH!2`4v ie*h#/ؖHvyx֛/CW߳0{]c)WwL [U@@}ImӲwV=p!KL3uc\V-#'"5g?nrLZ{v-:8ZttbIު`{ r؎ձ:!'NT*4}}"_|VDz&1G AT@2L#֦15}xiRxak݈56F Pn/ӱq} 'q_9-H`o=qG/+ΆEVFy3xE囁[M1`_q:$eFz7ùXM%'7W\JC`석#9*2p20@j[BjA!b:]XVOv[-om1<< !vE-%8ˎus؆qmYBBH?\~\T)Pka\l/::`ղpq 9'T<\k;[u~F~7jYܦc2/Zܰg1Pғ3NFSv.Y'Ժz-ntr.^^J2 3kӥI? i)<ٓTp1[sISnL\wFGWRQdWc7$9¹앩ldRi:6-Wf|ߠ9J@OfQsyWd /)5# (Hm@7hfgYɱ7Ú]cr|_{I0/wis/n $#$ c Ŋ=O.AHgt;a˔w.Oɰ>[aɋ^tJwH?'+8-9JKRGwY4GrW6P]'m}ev AH=W2t)6L3s݊̋<2lDm<#c ?ΝhD5L 0A,dG%Ȑtƭ޷@\V tY7~3W8{O\ۼ1rgM t]1_95,ŪtMfW{$dXkvBz?Q<*3Jv(n| c0ڶ_~~ 5FWXkc"+K*+ɮZ}r˔Te]x%$ݺeeB7ۆl1HW#,TRPW{dԨ O`KjR=~8nn 0]wEY_Rљ;%Y[q!Y$KGEqdaA z벖afG5Mlqr);{ a`S;fA^I$&)?e93;7pI.))!CՈh:Qy:ʁ)\Ώ?^& %qt}W\MmSnG\!|ד_PBKg9'!#ס:m>emY,ev`v}DN$S!!TUoTNnV3Z l#JnO~)#B2fӥV-1ci'&zu7l:oL FG%3ޤ_bY` n4he!Io#d W:KuN&Ы.Մi9%VvW|E#FפG[VT)^s.zUt\S<ׁBU99h%N !{Wlr=5G3ZמRTןl{ WejhZt;0ck^wc;eS}ᬥ١鑥e_[{j(U߿=|Sac{u5ax^Ĵ2*)q':ŕ6Y|؄E1JULˮ+Ar^S+#Oݖ1'Ey{ t9Â*(IQ/ s>Y?]UF0QיͯIb ~00o&Wc" fw Ltr;b[f\8'+bA4=Ip@ )_츁+`n/0wf#˨"\蜥nyySuM4!F 0kr,Gtfj۝0 CX&90A4 ' dm%3:.ULJ;f ^pNƮ\I]Klnr^TlydR}c_I&;me@J}IL@j9uwF 5f~M%a6 N]`6$;B4ح i }21*6% jY墥mM@]8WorsӍFh$ Z_bןImťy>VeJ$Άϋ4MKR/d\337 ^҂elv% sFe6eJ-u&0/xPw`LsAbD-M1(G,ʧX (2d[eǘk>tC%te7C4i]~vD(%{Ni( R`TwQ.bfw! JGF4ҾqW  S~ R gЅ~6DN淶g&k\G{Nf)隸]1Ɔ*S+e2&,H&eS;""]W, c=A&r{Pij|l!0bXW/ḯ ȱ,TJYvq(ˏz˥uFSC_b EiWr:ykJo}[0F-W_v>YmgKZ92m|# ,}w_iƦ(ho_Ьy͗[ޅޗ~eiQ̿}wOӣçF2 /~Q{ EQ\u4&lJ!i~JlEfziY ~ /{?a^ΝU=+0uLCn2 Y5-ZiV =oPgPLfY| 0[C Tpu$}efaG44JvHN;Il@!o =m:MHX=쐕\*﫱Y"2*<;Ǿ#V;wiƂ~LǧyB= Iwڋڥ|⼕|KGVpTk\+cGEF:a&}6YDCY/׺n^\%U[< ce7Ljպ7O  X-SzG#rCέ@\(livx(B]95&21Q0GS\gj,x#I8~t+ؐG1*WhMV2PTj|*qGeȁ*WtuuQHu/b,E"{<kGu^ܟ dHڄG-NwRXRID€#DW*ФcíLXY>"]*)Өr|L\GTjJ8%6}47*'T;AUkusނp$vaKtN7՛7='9DUT[%~ZȤĦ#E*jfLC,.688_͌&ageS=++(ᭂ"X&# U:;9]` :^s:v/Xj9P6Jˋ*a $gd ᖳ+pk6gj#’1!,*)d5gaQgY$cFJiK^N%Ĵu ]kﲀ+B)6"1V"[pOv1LRf%^ "ހM4[ʖ27\}6aRqvǟi4Ukd8M3qjpf{A~;.{g>=?Oic//v ]G̟89:?/ߜ}viLa#CMG\/ز{MZ5+։/}31RALeM 7x4B4:žݙoŬ{=zWG>f&{T&o4nďS,unyΗhJbȂ.B`x(B1F/I/@" pFyODFC߰U!'f,W4Js8FVZ!M嬣8rIxJ gd;%BZ`@IcHY11./؝|F L O;~!&PG)RC}my%ǞT!б@](lnlW0^tx4`_UCFS5oK‘7 &[_)d}#l@y~ukOfu4:5mA 0­O7uXޘ̈4 ZdXM>rtA6YS\#:8>?^;;;э9 MpJG5HR<2 Yʂ( ^Rdh>;ץsi.5KB:Ds*PFCND#C]ݛc61(hK(nSm?Ta2bWBulR,<[=Yz Oo>69MۊrVIEn_zTsI{nP47It* G`?wru {ڡ`!B;n.S5LЦ !W3'ǖ,E C5\_FG{/X/(TK`%w߱peMR+"Ք KV*MM0G0'[v7rUU&ףҦssojw9zB^Uccena s()ym:o?کu\p{yFOh:g=0zJˉr~#5++M$66u |F)e۰W1PK ѶGۨtn-b &l.aJYM7$DlĢ:`=KJ]j区r|@=6Pؐ]4QrA4λ.(trp?(F/Y sxL.I`pu\p௃#3['4h#5!%cjagO pN<̓($:Q–iA$*WV5J]_,E\\\\l &n|OɦeXix@8 I`Qd3QGҒFaY+V0Zm+ZJŜxHq,)eө,g}KmΕv!N6ͮ3S3ް\zwФF͗dcmA{I;~52烔8AUZn`/m4U躣o=V6V􅔡Cbc8UB.6KvV1Vo2Y@٨M 8]~bYSkZĮC^6jD-20%i*k6>ygFDV:k]Gߖ$(Vߌ+a^BF5sHzxT7[z83^I BWTR pD .*V( TsZTv0Mjfi{!5y[zA4_&OM#7r^εG0P Tk{UQ|8 k!LH1q8!_~z&fM2'iR'4(Q|z ZybsFVL3f 7[³x '\[[7Yo֤bh?IyhXѬA;`K{آ\qPsIgF}gg-NhJN1 ڇs\:v6݊@~]PnYN-kժzvݫW[˽;suUJz̤;#]jK@áraLFŽl :u-7Jv{0F u,],='O]9@,wx.]^[ӿ]UnC7ZBK$]_?%=ɕ]VA]e˧{]xz*v.q #U ӝ/+~)W<$ #󤸓c0;導+.؈{W gavIQ}XgD0oop!p1%Fv#Ȯ`A >މ黣N8eKNAF s8EHzƭ[HQq![h7+ʽzu*IgI]!RLTv52I%0é<)U򆵝6،m5ed@> LmECɊ+SO^USlc@)n3>Iː&Ҁ^iρaI] `~pE E=E+,bZ%'=Jn# RF/ dp#Y.uIF 8agH#PtBZh?Btp yX䊿2Et!N gm`2$V.fh%s3 xZPcgSTsM =JsH C)8r-N6xŰƎ}$(~Eģ׮kzMLyx5J|pi\x~U ` noV|SXhJ{LV){_t ~aNq=Kx_}F/??=>lfi>(e1\dDr&O n v(Vk<ٷ8˶mC"r~(RyU9N 5xKMwPrlv>\o<{q8A7ivɭ ܤLOh"qː&W|e]#b\TI :g I8ia g=dN"buMxxEDRL:쬔6(kQ%H CїuJٛX \GsUOU&j!ߔZl`o=~gXBʏ"Dk P2Ǟ9"s/eZ8ġG\5*8*DC7uhM1FN2nUv{0>1wAqAV)1 a)L /rX LaYtB I8 xY8S3'#b;gr^Tz** /R&*Q*1];F`&M Z`~ -T듃 ^ =G'//\\tr=}^+}ym`ep xj^DERhMElTM꬜'FK Cp3V C_Wk1GL`R*!2'Ɲq}p H`Kyk *.?+e NC Tn!lc럋w871;Rf x.]а Ɯڟ¬+cy'SfIsN{B;ϛkDdbTAAGvY8ԡx` jLLXtEq>؏ߺ;G#$Da)%LDۆyߺDɠmvq$O$_w~zG?'\nO}~P%c]ɂ0JcC" B#6ET 9G= |3ew 4hWzf-h|>]G2!ohNUdqڒ,t/Ap6?x`%Pתt_QG/ɡƅw0X΢n ofol~Ec;PY:ԏ6sXMĬ8V}fiR@VJ1mlm{fipMf6R &CH_z~Hw#ԫd>87GUj~4m) f7h -y։چCtf߿`(:ZG |KG=vKJ 9jueWbˇ2ap& To-3*:9#+9᠛ Wfrv~|5HN lT f Ց;d氝G$ޫ TYR[~'NsmE.fļUu+ϲ4dgQ9QpHg}}TCZGt[b$oEuȠI,4C?Xp]%%"Q+xf ACܫ?j1]މ?ua4)o0 }HMCl#V컟"(ظ~-(O_i i,x0P>9(AQL $|;Nh'!lVW86 s"I!/ñsAωt|I:\:- )+G#i<؃"بn!M&mKIۑϭ ka6"Ik1%m1Yo (m)*DTUDƮG/I}+)aVlpv~BŸ+A_v(fxxC3zSD)y(yN˼h#<E1~V.yVqtm&S*[dNRfssF1u*[17%8^>k!) pH)S,~]|ɷѮ״Xl2ݸPN''wz;)~H{L[9`9f)9?E`qFvnfW3ԋԢu@9Sh={3X^[Ӡ?IVӠbO#+`Xv](kn(SGy/ wh7~~L~SC.n8ݕ[y-5Tr@6G\Q\P=7]W5Rxe1PBMĶ͘ϣԙj^oP"oh{?%e6v|C[Eύ#uݲUFgzzVYoj=?YQUa%QLRQaՋa>jnGHy=9bj4jE`frNK hLf|Gua`–XvRF#|6`PGLA]3F:8i aΉKn &9ص.ܴsM8զv4k3m εs@\hY Z@CuА@]צ"M,8 4ESh\uc2YJRzҳ,g)=Ky,erKY6raWv"5* 8:¦#}CzӚ齃߾?I.*ZX/˝j.U7Teh~26`h \k7Z> x =Vr/6Of3}2iM,k'6ٜ ؟fZgsr`2iɁɤM6'cmt9YtnӹtnvtnvtnvtNC+tN;AdCtN{:'\9wd]..i].YKRK6d2]U%_]2]29]29]2]29I偋x∱fBeeL:\\⪏.{t)9]ʁ}'.eCGrp]J%d{8<WM猫s99999T:9vN>}ݽ7j+<Ϳc{ ;ߕ^IywW_%qNmp/Φk蓂IB~W$!{}Rߡ>Iwu+J篕[uP@[jq\!Uqaƣ>ָ&e*gQ3tEBصYB-rqUQY$VV>ք!VkUdCKkGtSM*bD@T+O=5+*ZĐ̈o0Yo\3N%j  8 7"B5`0fӸxI𨬆'GR &lKk[A9mˤF4 5#֦0_`28Ǔ%碓c1'Or9am{Z`{$BQk-{yG"}P02AK*c/ q2wDi%x#D Bl&iEr/*@8}üw(F+@ @-Ĭtd]P Iq2&PK gPK3~meta.xml OpenOffice.org 1.1.3 (Win32)What is a Docking Frameworkcb81672005-06-21T20:57:002005-08-07T21:53:28en-US261PT23H12M14SPK3 settings.xmlYnF)Z6%YvlV@QCǶ$Kv=5ň%NQ iӴZm1RQ+tIIN"KE;r曙c%\ ":Җrnj;`L6/bQNYR&k [5YqS<7!rӘh<-gcl[)yiq]i\z)YeJ$8}z ՎtsƗM,,,~k_ThWNN]oCN/u{S:uo>kl&t<%7L^ [ZtDD|fvf9=ܥ^UZ=ԵA'RKU܄*(VҠ5Ҕ4`x P!T !i1KR k M9idu‰OՁ9#Auc:+ՁZx˓4yAΔK̇ rd|>+ЕƂ`Jq}:&‚`\/3A{b~=P(&aUT(Ts#^A=-kAeYAU 2`vP2rUg <$x7[ (.[,ä*D,Lfl:cs WAqZ Pw t>Vl|ɧӋ룧Gv_;Înwn: >p[}DZu{ѱv;#sv_nۺ{n7um=v[mm?qnp #!i}_|uyc?pێcu{cnn۾ﶟG24inhyY[J`9#t GXu`ZxzJ6c$fڏHdAjOˆ KRAqG4z3FTHKetV8ǫEY4$sm\5Myr}MCd^Ij]%$BF3 Roui=R"4xE ^/;>&H-cVz}y'7Y!7KmٓUAS5 i_7ַ3h}yzV 1(U@S B&/i[$Y@#BNeD+kpGl^ +Y1ppF"ӓ bIzk1%Ԍ4aٖxn%8EK16w5ɅB, *8^ӎ(5PFM>"eijT (`Vu%!n:X(@#rbem uDI;odVe݁})ICY`P7 $@v.1Ge 9V cۻT>pPK]xPK3META-INF/manifest.xmlŕMo0+X8)TFZiwCzأ "-~Ji*"s۲wfdϻ{]Z I]u6ۛojNhU^o}~Xzpe^U*dv5&~Bx`\ J[4[k5>AqyRKmSIJT· 4e u{8SVvp7o&xډZ#㼵*쾓=w"1vD;$o̢RJp~Y蓤Izr_E1q10D%t#'j3sN,D#">YF8q<㌠ɵtb.qe1ӯim^i ڽ Ql V>[Zqpjr{;4?;v'8ZD/PKumD(PK319mimetypePK3sLPP-DPictures/1000000000000400000003008BB71621.jpgPK3`-PPictures/100000000000032000000258D4442133.jpgPK3ߕZ-Pictures/1000000000000239000001AE4F78B2F5.pngPK3d͡-Pictures/100000000000032000000258944E0B39.jpgPK3yjaǜǜ-$Pictures/100000000000032000000258FC016A33.jpgPK3}"##-Pictures/10000000000000FC000000541FE466DA.pngPK3-Kkk-Pictures/1000000000000320000002588B82A40E.jpgPK3DM::-kPictures/1000000000000400000002E2444DEB20.jpgPK3 $G -UpPictures/1000000000000400000003009FA5091B.jpgPK3ӌ.-7NPictures/10000000000003200000025824B9E9A0.jpgPK3@_~// layout-cachePK3&_/dJ content.xmlPK3 g DW styles.xmlPK3~`c meta.xmlPK3]x !h settings.xmlPK3umD(/n META-INF/manifest.xmlPK"p flexdock-1.2.4/docs/images/0000755000175000017500000000000012177715062016404 5ustar sylvestresylvestreflexdock-1.2.4/docs/images/after_docking.JPG0000644000175000017500000011124012177715062021544 0ustar sylvestresylvestreJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/-B[X>Y\h4;2T0DQǧRs'1Xb 2HuvzpK:U<复uP_o\x?y^I/>nZQ{&*Ko)R|Ъ2G)Y~d<.5ۘk,6֫+iksMsKӿqŒȭߡG_m~Jt1'Xis!p pH3׭VmVKj],~i۸p3z#VgR(IߡG_m~^Ӽ/֩%ݍ8H2emFXϵi6oS+A}([FWҋ|УJ/B5;ɦNXN%HfhL0_v<+5֩-^3 #I=1W*o䉍I]&Wҋ|УJ/B4$ĶYKy.7r,zO7ij6fKG3(2C)댏~Zo_{ +iE>vQߡQǡjKo|@5rHF@'JmƍZ[6m2I*#{]徤QϝiE>vUk2NcskSωpqQUj,М-4;o(ҋ|Ь)rQϝiE>vVer4;o(ҋ|Ь(AiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~QϝE9M?( ?;o+29Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o)?K_+7)ZߡG_k~fcڌ{QʇiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9ME*3C$еE~{6؂k£*F-u߳А+Ԝ&4!8&̓ߎ0o9U& CZU%Y;|ϡ⥸ }+KBm%}?㩕ZW]"M&~iN޲[t{m~Z.sf{fiZ8KBO;Y-Fwswn'"av 9AZ6+[_ﹳSJWr˩gE[Bݘ۷ŜU?Ho-khy?gqDo8͐մg2j奵 eO\wlY{_ [S^ߟe E/kRM+O3}VAZʩQfx\v!9:|:U6;g0 Bp 'v?o|۬Tڮg:|D#e#L~OG uͻkmӢ[*AZ:Yy(\$h/$|7:թ:]JϚxʺOT&bVjTQk_gqlFL>Acp^3ۥ?L_U!GOTMSXt&~Au4% 3DҴnq%L6rckf FA`NHdOM~J[E 4̎Ͱ PS7qfoQG&/*-Ӗ.i4_.[Cyo=žV.2¶ 1zZcj%['4dzʓHZ6h`8޹B<[@s1T _z#le??-xZ$Ӭ BItX"e!bG\]!-9?oWn HOZUɜG]!-9?oWG~FT#sL_Uxb>GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gh tbſ?G~A\O?Gh tbſ?G~A\O?y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>G|/-я1k~Q_m/wuݜ+{~u|colmH0KƽxjE#xW]n%䊘0Z˝*_irmb#]Xi:_ڭKU>[e鑞Xq5_? ^Vwm͜<44+sl =۬Y,>ѯ Wnq7 +RR}Sv+un8X}?mx7_+>u۷}@m>tww%*4CkgE)9-=k]ًKg kB!p]Z28yʐqREK fIq0MӾ@*6D(_ے2|FQҵ4KE)o<<0l"DۚɓntHn6\# "X9:Ehi6<Evf&gfH]Ha*رɱ@UDѠtzʢO%.B"DTwF@`02 ֮ MjCs$kˬi` ëD،z K3@ HX3`d n5 YvrGj"1+d kQ[ Ry`\J).c6}ϗ߂M͓@ ^[^'kx2r(pOmD:hs^Ek`"V#EugYU?*AG0꺄ZgiuL)S C#V?ދȌwm tB- * thq.wwVEys$iZpIF\1(Il-aC$Җy"LB$dYT3*6eñ\| _[^G{]A -u$RG7S&A>U<džI,XF…Gʒw27uphQHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^G_'T}UXjj>g}'͠šgn\n$kgQT}Uf7?5Y紐Sl2 e>eyA?3yA?9X/`/G`/\o?#s'Fo?#s'G+,ݗ%,ݗ%⫚n$hn$h`teDUeDUsYMMv_v_k77T}Uf7?4f7?4r:_"_*"_*FO&FO&VKX?/KQX?/KW5IћI~e>eyA?ڶQ4 ۻg;ysG+,ݗ%,ݗ%⫗yyզ(ԳT Cs2GWK"D&<o d~bVSX?/KQX?/KVM%ޗsHN]#_YTouDsuKX?/KQX?/KUEߵ}___ξE"_*"_*'񵷖"BI$q*I)5'"~Gr_ξE"_*"_*/?n42Z5",c"0p~SڴU\^*2e>e_Ff}2&,ݗ%,ݗ%Ff}?_bo"_*"_*oik.NYej7!qΗ se>e/L[ O9e>e_Ff}9?v_v__鯥ot.b 8r1cv_v_`>m~(̰oS%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%[`mUI;B9hV,IߖLwbFIp84X;_"_*"_*_J/"E $7mGkO(dGD<C9X`/G`/\ZMkt$ X*6 yx$B9',Sr:"_*"_*_J/"_J/"VAX?/KQX?/KW? O|EQ O|EQ>e>eA)>A)9X`/G`/\/%?G/%?G+,ݗ%,ݗ%⫟E"(E"(`teDUeDUsh_Eh_Ev_v_}T}US}Sr:"_*"_*_J/"-0\E,E8'4YT}Uiڜ2Kmb71j2Wz,:Xȋs(Hs9X\>eo1$v:V>vwH<MvIǩBxVt':ull=%'4Y/:9+kUPA*_yI;1g88b CE/^CRnD8]/ lu?AhfI=[ڐPN(rˑEnfNgl/k'r6vQ^;AQB+>͡ O6Ish7)d,i.WGhREoYBJ2 ZZCid6nv2 _ɜ;ln"7>͡ Or_K$b9tkF6¢4pw mh_S.6<5?hfп熧|]m xjQ}BwGٴ/tFm xjfп熧|]*ٴ/t}Bw@hfп熧|]m xjQ}BwGٴ/tFm xjfп熧|]M Z1TO֐-_$ѻxPIg rGJ͡ OOx5??o/8\SZ0{XAO֧afѡ@ WP+Xl6e ndVn >ǣ pDb16ssOVy&/ >nvEii@19?lGBtparzE$- ;Y\qn[6O!|Cuu$ص?p~o\ڊ$^cw;|VR7m{\Ė"&熚(_%a౶pthmcidv>}b9Ow3^U#-JqYw9$UI$0<55B+&So`4p|Q{5;;FMwPyfQa";݃: biPixPNCE$1ű@ۤW; i'G[=Jߺ;udiev ˤP_;i.bA>%t[ҙSдT]:U 0HPB1q4v֖kocip<9 fwP9'pL?xi*v?I>ֿ%kWػz*I>ֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%hZ  z*I>ֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%hZ  z*I>ֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%i>tFY.v@N H4YуqF6U~,+xt뵝̞^ VQ8DB#rdڜoCzq[tԻIOw_jGѻ1-zHwɦqqwj]^)@vـdI6;7uIۍ-^Y.Zڄ&\ uf?熧|]Qm#xj.a}}V DN<] %ż UȊ6@o \6,wL["gb S ^m#xjf?熧|]Q? 8.$..7mvHp7w퓱V>ͤ OG9EX6<5?ꏳiS.f?熧|]Qm#xjcG>ͤ OW}HuGٴT\ UiS.6<5?ꋁ^m#xjf?熧|]Qp+V>ͤ OG.z}3m,qM"Y$ȫT2m#xjf?熧|]Qp04=B^Msu7+fa v!ͩϽ"kwW:s|Ћhof8R9H4H6!pTai7 tV`9k%ŬE$[w/|]9cZ:ϳjg-6>nCZ70HP5*,@Ϸ$)jSxCYQi|  bh!I vB.<1s6>njg-JFQdq+ȻaoB N-QsڟK>ͩϽ(`׹mO}%f[rǰk6>n_Ʋ읉/Bַk?ZwF'~QE`hQEQE`:GIZ6+I/uH沑`r-\\y?/];880:JԼm>98xtyIQw!ܒ4jd6IZ;">ES6LbV$p*^.Ц.2̈yB&hdrcrmn3P>iZUadnk7R].T 61./sM].vd*Wk !e źnkMWN^fЦ@v̆m\粒qA#2x+<p r46XVfA=pfH`vd"Cb29lfj4q=.A;anr: x`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ F-`R@ Yl?[{cIUY?봟Zv ((C]Mw$Z+I)_X aOjj]7B J$ޤoٵ?t}S{? o7^o{V,\z1n%B3 **#Dv`; t6.9 O(`kdw.]qӖ=ssڟK>ͩϽoN_/I&-5;뢶ndhA$ 6[ϺNavu+hܛVeUV2ꎏ3>ffv9c5vf[mO}%rNj;.>,_yki]{7 H08:7Mk%\*[,}LL#zt(TX {}S{? o7Gٵ?uE1ͩϽڟKآX {f[SXY#sPzg_գ=܂( (( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQETVnatm.pghnyq}&eiܻX0I# Kyne=9.Y e[z7 zUE؛2)wyz,QK4:ICagȾ’^]^IWq.feѐGn`.f66:ڤGIMBd-ژĮpԏx'glUhkcL_cL_Q`-li4li5V=e36ƩjŚ 4U${Oh+ (,((?t 7jO? ڷ[#>ESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVF,?Z{cIUY?봟Zv ((o-m5["8\3RUYR]%ޣԋ!W9p=(Ȱ((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)((((((((((((((((((((+#_?z}=ȱ]׃*׬Ox?ҭz{;QRPQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEֽdkrdXkE'iVe=(((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@NaWm\ISatVdg(c ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( }^5a_C@zO`2,i?J"v^^ETQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@dkrYܰ='?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatWo%vպ (Š((((((((((((((((((((5a_C@z׬X Ox?ҭzȱ]׃*׬QE%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^aESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVF,?Z{cIUY?봟Zv ((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)((((((((((((((((((((+#_?z}=ȱ]׃*׬Ox?ҭz{;QRPQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEֽdkrdXkE'iVe=(((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@NaWm\ISatVdg(c ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( }^5a_C@zO`2,i?J"v^^ETQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@dkrYܰ='?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatW#v.Wb6NMu_gm?oh_gm?gm?1h_gm?gm?]li4li4vFF*ƙAOGƙAO@h_gm?gm?]li4li4vFF*ƙAOGƙAO@h_gm?gm?]li4li4vFF*ƙAOGƙAO@h_gm?gm?]li4li4vFF*ƙAOGƙAO@h_gm?gm?]li4li4vFF*ƙAOGƙAO@k#_?_gm?f֗f-b ?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP]Y`񔻝ϙ MK?"6^gf$]BaX|aiw&+ c$ Hr??Ga_Vm4~uJf (YF SNI?޽[??GacQn,^Q?[HVDV- #T?}k?"?U~o0Eه'#+(]_?f97vOO|GQ?"J߀{u>??Ga*?~o0Eه'#+(]_?f97vOO|GQ?"J߀{u>??Ga*?~o0Eه'#+(]_?f97vOO|GQ?"J߀{u>??Ga*?~o0Eه'#+(]_?f97vOO|GQ?"J߀{u>??Ga*?~o0Eه'#+/=km4$G4lTmp*)<^%Jf.rE|RkZZ|4ج\Ovnc(ra:\>jĖ|g}or#9hQ\J ~MkXu#p3+f; Ny7S;? o7Gϝ7>I||Amc)Rgo3}gMu?t:+h~!_:kf o00-sw2s1lpB@P3_[SHu?tyS?y$Q_[Svn??gWn>vn7S;? o7Go3+7S;? o7Gϝ7OEϝ7}["gM>|E}ogMu?tiwV>Hu?tyS?y$Q_[Svn??gWn>vn7S;? o7Go3+7S;? o7Gϝ7OEϝ7}["gM>|E}ogMu?tiwV>HR}棠ǦڮǗa{G*221JSgM^bõ>V-tN,wڌwprߦkC^'_ڨXKyΏU ez0L>n>vn7S;? o7Cwp PkD _k2 i;vyRI9LG:dt-QE# ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP,aFk6 ) ((((((*0i_CLdbbTd^$V++Zk~!I#5,9$1ZSD.OmK\Ik,lUH8%:fsy^Gkk3E'x{XZnnuYk۴JQmc[.emêm5a fM֭YT5$n+n#%(JN±Zi=3׉%ܦ||ǟO\U^}q^-ev{&Vrw+cZ[y847U}G\Ҥ"+[\3OV< /F{(o ^~Q4h γ#ow#Ot9-N<U#I \[Im? 6ѕ2KxF A+/"ZtQ`(o ^~QEv  A+/"Kz}iHb$ R5Y:lt EVEPEPEPEPEPEPEP.0_7ѭ? `5M(C ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP,aFk6 ) ((((((*;,r%!3CRQUrko?8?_]GEW}I o~qu{G9|?_]@/.h/'6]ytQ`$o~qtko?8=d@/.K<hR8Rd)b?5-:rQYQEQEQEQEQEQEQEbsڬ]3`o[T؂(0(((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEb.?XˏnmSb (Š((((((((((((((((((((( ]3`o[UkjQEQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( X?7?^q׭lAERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEkjt9mSb (Š((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEFkb.?M(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1t9mV.0_7ѭlAERQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (1`zڬX?7?^QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP.0_7ѭ? `5M(C ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP,aFk6 ) (((((((((((((((((((((? `5XgFQHaEPEPEPEPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((Ń\#sj`zڦQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@gFL/h6 ) (((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ˏnmV,a؂(0(((((((((((((((((((((L/hbsڦQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEb.?XˏnmSb (Š((((((((((((((((((((( ]3`o[UkjQEQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( X?7?^q׭lAERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEkjt9mSb (Š((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEFkb.?M(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1t9mV.0_7ѭlAERQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWE Q$\OZkt!H5| C#_\F%DKPyOR_'E|6;B?}S4hGf1MRg9}٠GB?}S4hG{cjA3qL/N}unԃϙf3z9T_y\)?#7VmzGw .$9G:_|iOn}ڐ|1zo\g?9= #7Gj$[.n&PM U`mV4 \*>ȿZav3B?}S4hG:ǎmz~5+>:ǎmz7?%د??Pr-zΥs\bo^]_<5!rרbX2ۺ#m3z奘T|6qwеyye6v q0|(1x?Q]{R=c֑y$G|u  #,jтӨkOo.?;=΍O=:hE]q)Zj_D`$/̚DžE{Ky>j+)H2,*IQLwi絧GuiPV~&&މM>.`註ʀ݃IٞMP wW+lBe%ّ%* ӨkOo.?=Sk]n.Ӽr|ó;morUNm> }RPOBViٷ[65\64vWh^5;o",Q~T4 #[!d_}n/cݻVϙdr%~ۋnնscs3?_ +eV{>[6Ioum!]\3Spƍk~8C|E;6"N.h.^ǻv6˟3=73IKݍm2MRg9}ףX}^_̾\Hx񼽻Fͻul33eivI}uwtN餒O"V ZTU2MzQLAEPEPEP+*P[˖R2GpKyq<‚zӿ-vo/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - _Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj3??zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵoo;>Vٍkv}֊+JX,5Jp^oVL9+JW_/?flexdock-1.2.4/docs/images/alpha_preview.JPG0000644000175000017500000011630712177715062021604 0ustar sylvestresylvestreJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?n3j753:IrA* m3u\ģ=-V&€ A]]ΕO9i#g(]Tb9;WGF).Haj+IEoШo=-ЦJ/Bʭ'd^V-oncİZ[7e@Ν5/N 3"_m~Qϝ)ĞMbYu?m ;1 ch^Y=Y.iwp#n{=ZRJ'_m~Qϝ{N𿛠_kZv6vF#3x?:-c>' ·0=e[HLE7 꿭7m_J/B( H&]:ya8"=0:~WPi,ZH x.9'\RI&4e%t_J/B( DГSTw&e-`G{S? Zɧͨ1-Ԡ 2=]j*~ͽ'ЭߡG_m~Gq-zU X!###})6inn.t` $ LdftGiE>vQߡU4;uͯ O>&MuG=EU\WBpҋ|УJ/B(ʅiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~QϝE9M?( ?;o+29PrQϝiE>vVer4;o(ҋ|Ь(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|Фҋ}-ЬRcڎT_k~Qϥj1G*)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr5PG`glN [B ~\ۣb o ^?~kBB Rp:hЄܛ2N~:mT -jTd>BJ1- 㨗T9CUjA^Iu}6U:zH_cyl?za׭?WqhΚ.홥h.A OE?ެfhiݺ,\dT$kڎ\=m~WoM+_qf}Liɥ[Bq۳n9ݜ{զ?Ho-khy?gqDo8͐մg2j奵 eO\wlY{_ [Sz_[~~Gdt1I4o}< XgGk* k%I`9vY+ og|\- XyLu0F7 }FћwvD$U<+]HtQpI>3_*H doAuRt/K5>?t+?LWIԨךx%^3VQX$7=I99<0rstqoahBP}X䌘|9ugJ!^,1C U0.*ѧfMb[ixKfiKmalA8➚xB6ZRM#IoatKvfV-< d L_Uc8e{ew~XTF o'u Yӵ{VpKi3 A 1AdKm/QMZ;*YJ7o A:V7!-9?oTF\:=?nSz?:4EjW:JIE{ 4c޾`v='GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gߐh tb?oS>Gh tbſ?G~A\O?Gh tbſ?G~A\O?y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W(^"<[K?bIݴ\h_+8V2xI),l]EA?z xػNgcaz녜jbp/UkmzxjU?M [s,9tqvMПvo'_V(| _HR@m|?0nol8sۇ$+5ø({Erf?2U'.WOdW j6q+d9VX#j/,4Sni<۬QK| aOz{t%F| K1a"C:Udۤ7ANF ;Zt[7Xr:|#=XW4Kt -|+9ssJ<=Q2FE|mxGVuݿ0:5⾋udOiZz[u_ݱ=nɺ_g%cټ9FMoi:۽"=0 )8zWG%ԩVl]{sx4Qv;cQīg$m64p"uu&,La+/:9+s޽wC!O3Uo`r>_9p_?͘Z xkKX,;И9 %|?6K|,a)^KVTi*hhRr[{x;Ok2κMw.օCີdq ⤋–+47uwѺ`}8U lP41$dZ$kh(WvRs)yL ,x`(D3߷5'-Eݬ3mpFAD0![stMlm+HxxUڊ;*(YM>;ͪ4đITcb3@*=EDKy\D|ev'd`dA]#Ԇ;xI+YT/V՗x^FS/u2'sNP*"VVto,Ii]\ۦ$~\qwsF\-oZP%;[h0eؕ"%ؼʸ=wUd5"֗mp+ +]94 0>#i{`[{g4r:H\rn2Wr-}KdfR/(2gx($&> skuwjnE\bW918!@׃N<6"bSm \3"m/&425[&2Og<=I$8]],, HpҴL,cP: Z748tI,DHȲgTmb8Q.&ZHC,n5PZL|y͋ IpY]i%Ye l%p en (Š((((((((((((((((((((((((((((((((((((((((yi?i׮Ws-':2oK9_/$!{+>e/}K^3񮩤z+`EH,N]RrOjhJaUE-3MBw~e>e~9'Xnu` .x $e]VdOu+l+$NKcau{qgյf}X?/KQX?/KWƲiWǓ@`qiF|1g? 诲"_*"_*xԼu"u]V!R` ?|r-: ƒ=##z_UC]g`/G`/^1oxZ6y(kym6FAk4[d\-1NI*{? ӖuM֓UzeDUeDUP^߈_??/_ξE"_*"_*/?n-pqdgDWxqnUbB6dU=J>ܾaX?/KQX?/KUEs[tD #vݽbtF`/G`/P 48?ΏFf}0&,ݗ%,ݗ%Ff}?_bo"_*"_*oikm:^@l((b"_*"_*ŧ݂zu-"@S؏ΤoikeDUeDUC G#3K]>O@&,ݗ%,ݗ%Ff}?_bo"_*"_*N`-HcHB)ٖm~*]~e>e2|mٖm~)hT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhUbHt|yxHbH`GņX#޼x?iשBYϊ~h_^7G y|s<]v)ҭKy~4^ef%Ie~}Í&v v}`j&;d7hv#R(R @> ?{@+i}f?g?#4Z/uwu =BFY!bT, ʕ}^7G y|\qbI3gtWџ|=y4WhR#:+@> ?{@+hХ_0诣?{@+h?Bg|>s?o?Ə ]Ί3o?Ə@> ?)v>#:+@> ?{@+hХ_0诣?{@+h?Bg|>s=SC$o"a+m,IFx\s?|=y4W'Oў!JUפ "4K|]00!Wy5t]HԋR _0ǨW^7Q.;^e{)s+a2vfNw܂{?/W%KºG-.{i2!ApC?s Կ_\Ƥ/ks}'Yexey&mqۤIPT@U05?I.k6"x cm͵x/ǿ3,~b V&/&Mj>#̵Ԣ+n@s =awXb C7Cko&< eQ25pYVpw)qeow=ǺKILlr獩X q?>4yewvn|kz-Z&̍7e`&,IPhgFXo+i[ "+6GL㧠˿x~Z˧KBn3H\rwf́^o[i}͹oIvʙxTg'./_24TԬ쮭@ " b9$mKhA,2if9bǓ?)r?>ݰ*t;u+ߵv%ז;X$y*FM[@-]@cl[Yi0]fC.7}1Km=[bž럲ֵ-*[׮$VE>Am4Pr$_8ҧ6̒]!)Pjz*pdMwn rZ3U[L)Z+i"1,;\XAc}|[ϫ GmJ?;+& ykncK>V:I[+;Ө\-ͬ2C܂!VSppnKv.G=m'"Y5+89&F 0 GдE_ڒYͻ.#HGm1aN84n⸏Mٶ %lpIm\is5EMT6=k{m'#bS}KrNLk<._&IWwDTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+C5OZߎo^wu,бY#d82 0x?i׫CY͊~eKI??Pr-z65|$?௟˴QEy'PQETSI*PƏ$Por|@?j3!;z$ޤS{? o7Gٵ?u5KjlzG[5M%Eʡ#dF܃ZF4Xl1<5IEܻ,v0~};^Xϳjg-6>nteKھs|o0y[<6{o515 ]'L 말ĪURMb%F1s6>njg-듹k55;[8o&)-@C : 3YԧU֛$vcdZZV-,(app&2gX {>ͩϽڟKآX {f[mO}%lQG,{jg-6>n(=^h}|Wۜ#5-U?g\Aje-(0(}T}s|RH۫"wK.اnv"F}T`څwvR#2Ќ֞̇b:F5EDҸR#3/cfTW$+7 di0/qwn-cuAd~k(ރ/XHυ%Ȑ_G Z5)co$h́B6wM\/t]-o/^k13@N{ӊ'ob`{y呥Hxb0hRob_@n$Un dG*>Wi h]|>ҵByA4de۴;sak->GI iWqآ32J2Ɗbf9 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hL 0)hc[Z[^g_+Q^IQE^ii8svݿsV(gq5rap y`'tTyI* Hq󷆮%:Lry-1nTIo>QZ{E؛2x:KKК{$D (P1ڤ/ \Km,Ik+OnԟžbG$֦ho HtGIQeJvaG,Z}őm}2BcFN\X>(Y4?4Ev 2ƙA?GƙA?Uh.fZ?#gh?#gj{E,ʺg"QEfJ(C ()_ޛ_'EIScV_J>?*J/Vd=(((((((((((((((((((((((((((((((((((c[rG?o^hmyOӮ|O, C_zI_3ׯ9/9kѴgѯK;_?͗hN(((((((((((}T??j_//M1RkOfCݢ*((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':ao, 2?܇^Ǥ?zKI?/v($ ( ( ( ( ( ( ( ( ( ( ()_ޛ_'EIScV_J>?*J/Vd=(((((((((((((((((((((((((((((((((((c[rG?o^hmyOӯC)}7?Pr-z65~ dž?Zm/=$k>_+Q^IQEQEQEQEQEQEQEQEQEQEQER7OK}T??j_/i{QEXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ʒ!5?IN3[rG?o^S{Ig>'o~ dž?Zm/=$kל C_zI_3ש|$<We((((((((((((}zo|%OZ* * Կ_Zِ7h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9oCCok:ǎmzf!5?INK9?/̳_<5!rףi'|^xjCFOF,C|6]+:((((((((((( WRTUҠ7OK=sv(((((((((((((((((((((((((((((((((((4?ܶƼx?iצk[^g?*J/TRTUҵ!nE`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs8יt':oCCok:ǎmzO?%ῗY/9kѴgѯ^s_<5!rףi'|^;_?͗hN(((((((((((}T??j_//M1RkOfCݢ*((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rףi'|^xjCH;l͋@#'^mKfU~H0WgQ^?G"qp}S߁zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~zxsW)i_QO~vwRTUҸtM'MO&,ekW쳜dʻ Կ_S*~ٻET((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸcxcV_J|fQX((((((((((((((((((((((((((((((((((5 -q3:Ou8יt':2K9?/̳_<5!rƉןҩkxjC孍=?'}RFc# / ٥EW9QEQEQEQEQEQEQEQEQEQEQEJo7_-vUҸchOw/%uh-c:+#}{'G:O.Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'EVG:O.u]@kY@??׿t]Edo$_^It}{'E8יt':{B aLljqDO8:Oue?s_gxjC孍=?'}R??܇['{^NJF~_+J(sp(((((((((((1o[ڸU{%Ð̶l^Nko7_-S$װ_dQX,IA x<1)lt_o?M$MyQQ[,[BnRh"cTI29PۀYtH$- A2Y܊ W7aqO4}DoI7\$]jI fW򢸙y0E"/,1º@q*!U֤LAIIJC!-s  #~@o& &kjŚä\4Rs"74~aU.K:;znۂg5>`TL`=y֍{$Mo?M"-I M`E(g;wn끻WHno+X糸21[1UOI;Qp6~ߢ7$'I5Do?M$MAE " &h~@o&{?O4}DoI7PQFȟ'I>ߢ7$(^dO$Mo?MQp'~@o& &j (׸YDoI7GO5k,ߢ7$'I5Do?M$MAE " &h~@o&{?O4}DoI7PQFȟ'I>ߢ7$(^dO$Mo?MQp'~@o& &j (׸YDoI7GO5k,ߢ7$'I5Do?M$MAE " &h~@o&{?O4}DoI7PQFȟ'I>ߢ7$(^dO$Mo?MQp'~@o& &j (׸YDoI7GO5k,ߢ7$'I5Do?M$MAE " &h~@o&{?O4}DoI7PQFȟ'I>ߢ7$(^dO$Mo?MWSK-8B`:ThDoI7GO5xcTP]F>sf6ŠF|7o>S$NVr@2@nsGCCMYR 㒼ן|t':tt4ުU*7ی=8kx?iץi,;w_, CǵZ/9kcDk TӘ¯D47 ( ( ( ( ( ( ( ( ( ( ()M#O%s*6-kiDPY&.QwRo7_-tV\KDX?zިO\XiF%$Y.Y6[E*IÐTEV> EF_$|х 01ӊwAk7Gٮ-y|CdQ7I.$GZ[?7ɔ0SmU?1Bfcump^kFʅ#z#!t}ן?nd+uŔvE}8C]& jH\1\m?Qm.nUQ7E}*e (Vu!t}ן?nd3o\GoN$e"2 A_-|ʧm?AΧΏkuq5t4Fv^yA:]Zk ^9bԿ?Z'uk ^>wAk7G2Z't}Rd/.~wAk7Gٮ-y|C@c}Rd/.j_ Eٮ-y|C5? oj_ E-Kȿ5?f-Kȿ>ũ2[?f!ts 1ũ2Gص/O"g!t}ן?nd7ص/O"@_]lן?n]Z̀@_]bԿ?]Zk ^9bԿ?Z'uk ^>wAk7G2Z't}Rd/.~wAk7Gٮ-y|C@c}Rd/.j_ Eٮ-y|C5? oj_ E-Kȿ5?f-Kȿ>ũ2[?f!ts 1ũ2Gص/O"g!t}ן?nd7ص/O"@_]lן?n]Z̀@_]bԿ?]Zk ^9bԿ?Z'uk ^>wAk7G2Z't}Rd/.~wAk7Gٮ-y|C@c}Rd/.j_ Eٮ-y|C5? oj_ E-Kȿ5?f-Kȿ>ũ2[?f!ts 1ũ2Gص/O"g!t}ן?nd7ص/O"@_]lן?n]Z̀@_]bԿ?]Zk ^9bԿ?Z'uk ^>wAk7G2Z't}Rd/.~wAk7Gٮ-y|C@c}Rd/.j_ Eٮ-y|C5? oj_ E-Kȿ5?f-Kȿ>ũ2[?f!ts 1ũ2Gص/O"g!t}ן?nd:nB5.d)tKm%yy,e op1$w5ן?n]Z̀wZ 6KHLdS"P$<&?#i G09qRGS562Y}oe٨@ѲFbnH+Wb5<}>Cݳvq*Ծ`ӯ$mL$n;WjNH cGN'Ra5 }(IJ:oX=gA<3wKNdDbԷ"1݀]ٯ {!h.cF d8ʑ}*;C])d'#O@F9=<\[a77 229Kp|%wP0t˽-VRnܴ/~ԑy@ #,+t,9/|-΄|ϲ+<+'n}+B ;Fh%@HFA G9BV) fK>2F$AE~Fv7gt; ]>p;]cP#J.ȷ:/Q:/U( ">@?Y(""E*nti&kTmW'+@(((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-lhya;* dž?Z?wU-vf?0_௟*(Š((((((((((( SIn+OFrIn+OFp%eĻEW)AEPEPEPEPEPEPEPEPEPEPEPEPEPW4GYw dzzԟiRTҲ%N? rg)h$Og(N? r= O~,iRGr>өş7:Y3Z(T'u?f}S?o9KEAʄN? rwgwbe'֥jH(((((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, CǵZ/9kcDk T٘¯Da47 ( ( ( ( ( ( ( ( ( ( ()M#O%KI?M#O%KI?ÊQ\Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a?wrUSU6F{I~q"u!b`3G<)MwOk&ugGܢ6G q|.@؇'=Ib/,p@ondvk7^E?n3Ok&tk']g"7x_d F vA<7V\[J6 dGhXdvk7G;[5Ln3Ok&tk']뢄K \\OVOjv{\UG֭|MwOk&uQE/G֗`gMwOk&uQE/G֗`gMwOk&uQE/G֗`gMwOk&uQE/G֗`gMwOk&uQE/G֗`g ۼS)OD6$> Q$\OZkt!H5z+XcH)i$g8jm#ܢYè sUev=hGӨkOo.h NCGԮ"2Y.ڬ2*}MэBA!KPңN=?'Ԭ \fqÏzTkWT CMx^M-TvNQ?H=ᫍw?zyR.|Yy\73#ڣ`uo?uo?_ 6}-zR]S桧?1Imh&-6+Hxl/ <'k;M:(lf .kxL"ZPdDS0[?uo?uo>eѼA .YG%2)؊B]ɂw6uzye洖 6VH_.Yr;GWVpWVpI,>/_z$S'|OZQ]c;z[KZZQ@Q@Q@Q@Q@6gR17S1,smBS߽TZORYn^IK%dnoQIȉa9 "[bp$bXJXt6mMfȺ9i.<F ca _G{Z;t}Q֟]i<5,ѤȒyo0}ĒBL QMG:#$uk)ed"Xl!68:vN=?958[O^{XR+{)Q H@4m=7ksNҵ?úԺmԏ$W @$œ0B$>fN=?ז[<dB$Gcp)|@&l/#-nu fMnF0dҸR=C".&]n]6{F,kwVqĨdA%X' ]Xpt'Jz?uo_ :>}Nm%Lj-&L]ހX $7;auemE:/J5XcFfHePK%`iEuo?uo>e_yx>ͩOxkso*X>|uţмY]BE7m4V'J%rC23""a}nڭqet[ǷlZ9TL㧠_j[1H8>Q$W/?Uim=ޛ`2Lur,nŚX,z&9utđp<-b}y9 uo{NXH(Fp *}vI,>/_z"^u4ւ6ڀ0x\Ī:{vdkV~zUAi8͒Fwy 1$pTx퀗o0^WB^J%* ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ?o^^G/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kWA 5Q 5QE٘/{Z^ɿ^ɿŠ(ϵook?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 5Q 5QEx/{Z7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- _- _Qk k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵooo?_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_a\w}m;?}~VXj3fUnNrV_flexdock-1.2.4/docs/images/before_docking.JPG0000644000175000017500000011376712177715062021725 0ustar sylvestresylvestreJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/-B[X>Y\h4;2T0DQǧRs'1Xb 2HuvzpK:U<复uP_o\x?y^I/>nZQ{&*Ko)R|Ъ2G)Y~d<.5ۘk,6֫+iksMsKӿqŒȭߡG_m~Jt1'Xis!p pH3׭VmVKj],~i۸p3z#VgR(IߡG_m~^Ӽ/֩%ݍ8H2emFXϵi6oS+A}([FWҋ|УJ/B5;ɦNXN%HfhL0_v<+5֩-^3 #I=1W*o䉍I]&Wҋ|УJ/B4$ĶYKy.7r,zO7ij6fKG3(2C)댏~Zo_{ +iE>vQߡQǡjKo|@5rHF@'JmƍZ[6m2I*#{]徤QϝiE>vUk2NcskSωpqQUj,М-4;o(ҋ|Ь)rQϝiE>vVer4;o(ҋ|Ь(AiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~QϝE9M?( ?;o+29Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o)?K_+7)ZߡG_k~fcڌ{QʇiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9ME*3C$еE~{6؂k£*F-u߳А+Ԝ&4!8&̓ߎ0o9U& CZU%Y;|ϡ⥸ }+KBm%}?㩕ZW]"M&~iN޲[t{m~Z.sf{fiZ8KBO;Y-Fwswn'"av 9AZ6+[_ﹳSJWoٯ_SriVtF\gvێwgi=O?o9ZOvN&3d5m2Y 9imHdS[>VeT➗ߟe E/kRM+O3}VAZʥRX ]xJ3]tt(m.w`O8 B:y^mS3L>"?':fݵi -O `R-,演\.O JzqY>ujԝ.%RDsGO] 'Ū?1URj5*(- W5TV8c RNNO,1]zx-2PV3y#& ]p1/ҟW? &/*#ŧ`bUL ʬti|ٓXhV^iZd7r8XkA91E@# '$p2xb Х}u H[]+i syY?xb#ſ?X|:]߬z~175{Bta^յ8tLC!vyq@#p)KSVJ6vvVw'g)o#3sG&/*B<[@s1U%onO[cfίM/jhΒk^)Be!Xy`wIh.4%+Kˑn-I2' L_U?cr({eemkz>!vk zUŕ r=:WAxHaiFi\-"fGf()83Xxb#ſ?ZVX nu[LMZ4Z`D֭GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gh tbſ?G~A\O?Gi<]' -1?of/* އ\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#>xa?wm(/;:̇19JKFQdrޫ^!v.ә^dg}ڸqX5KZiFާ^h/zeoGAxE <>NGct'ݦ[տ:|-_0)|e_k '0<: bp i}\ٮ̯cUI˕m-ŕoJfYU0ڧK 7T۪O$qĒ66$Sޥc^]<}5 "+_ELqt{P~ΕY/c461MPFӑN֬4/V%ܪΟ-V?d] _>?+v}?6sRx̑|_;`^'Նdwo>*)a΍zsY-~oVk>VWlqOlۀnW}Xox>?"izNhrk h N@ø aq5*U%vƞ&:Tc$.xC䮺Xa*,66~liM2+ȝ]cFAz~ ǎ?J.3~\wh0Br[ :;;nWՕ@!ʳ"ALlť]˵u.omVI#kmZĚ %ݢbSK6 " wdQvk:am@ŷi\@, Vqt"E{k4Jx^Uvʊ;Vc3GOsj3F.$RCXؠ` h w=QeQ'o!i"_*YC# ]IYkWH!9EU4բueF=qѠ E\|* +FaZiw6/%W]@/W i[4m&E0q4v%HF6/2@fǡY.yH5\4wwu`;s +OEDXbR2|یܾ2 {%{whpT  02 I]ꚅŬ|o;F#۵W@ N2HPnӨ-zͩ<%XB1țcoɠ /LV 5OUF9wD~Yb8W'PR4[9"{xʫ?確*џO Cqu]B-L&YCՔ!psn+hsEF;6:\!v]CRI48NWK;;C"eDŽm#u )P#TV *sbv\$wWZry k,VE#YaB#I@F4f(0((((((((((((((((((((((((((((((((((((((((#ZOuINLlWDI,o8HqF^t"_*xA_R xȚjL Y>px>gUџeDUeDUq/5h7swsrI'tݫ^߈ї/+~:iM^ze>eߵ??7XaϹ}=u/T}U?PI#U IL9??7Gܿ=u/T}UCyk~#tAѬlgd@ե:rKȜ9UȿX?/KQX?/KT?؍@/tb74G'17`/G`/Pb74 G's}T}U#3K]E%wu(#P ~tX?/KQX?/KT?؇zgFf}|ցMX?/KQX?/KT?؍@/tb74heDUeDUC M}.}s,lwFIK9eDUeDUDtq+oGeߥ /`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/QfXύ_2|meDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KT_ٖm~(̰oF/`/G`/Xr\eC{mʪI#cGⴖibMVm"g$+dTo+0*NӁƙT}USB/I%mN8Z|G :!Qe>ekXK)& MQ[q"98qg}T}US}Sr:"_*"_*_J/"_J/"VAX?/KQX?/KW? O|EQ O|EQ>e>eA)>A)9X`/G`/\/%?G/%?G+,ݗ%,ݗ%⫟E"(E"(`teDUeDUsh_Eh_Ev_v_}T}USo/a}J")f"(<ɢv_v_SO֦[mN[U `=;gX ԺD[F2@ۜ QIX?/KW|q#ҶFokZH=Hܧ\FW;°%TFO~/x?iץca/%?U?܇^}=3^TxD{6gdU;H8,dk~ dž?Zo&H[i]7Nʻ3 ѧVoЃۻ⧓qy6Nom1 nɐ+fid~EtQOĿRyg}0%15,s4 Eu\ y||=y5tG*SGJ-jyP&/w6|ڦ2'a-߽\yRJdH|dJ'{@+h?4Qhb+U.x fUR|"C*W+g y||=y5qыm'͟9_FW^7WKb诣?{@+h?Bg|>s?o?Ə ]Ί3o?Ə@> ?)v>#:+@> ?{@+hХ_0诣?{@+h?Bg|>s?o?Ə ]λ }sEضoӠs778y\?o?ƦXRVi_13NϚv;]DM L<Wkoi~&ҕlng{kH Wib݈+ӿ{@+jxB[qJX2iiN7]H$¿tx6mjm pcfQ ,EnvYXiFiDb۲{nw?{=k IJNKU$ռ[>g[M(ح-5H'2͈BΟ;n .]^/WY䅡b+.8xM[+|F^sTyxq'ŭޙ+xG&Q"+؃zkߎ$)4<4@r+ CkK$n'/#yfc8|;yjW$[8J˹$I!9q\׼?Y72}^Whdx#d3|Γ "2k0 QFՄH]];JNZtZ.%q&-%`GGyL:L֫5DF6ͺĒ$M, P?@*[{KG)e3,*<(fIPK /XP}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /I؃2sL:pN2@.z7yүL}08zTf?熧|]VىlpEcM7eKRJ"Iq7DOioor&&t0p m<0F+6<5?ꏳiS.s vJ"t \.-0eDQ@Bp[xRɷcfh'0A?T@Lo iS.6<5?`9X^w&'uqqh"DDÿolm#xjf?熧|]Qz*ٴT}HuEEX6<5?ꏳiS.f?熧|]Qm#xjcG>ͤ OW}HuGٴT\ UiS.6<5?ꋁ^m#xjf?熧|]Qp+{觸ici$fE\rV{-Q=(IBa"| ռEi; 5_GyN ovX ۶.69cZ7>ͩϽڟKZRE,iƻkK$7i7L6_9~mMC^"V#Ҡ]6o-Afs@r$ 1;Ls6>njg->&5XSEvrCmlgY`H[Nyc :ۧKkژb6VH#IrOjg-6>n(=^?ٵ?t}S{? o7[QsڟKqk4^Cv$n` _ZݬkArǰQEQEQEo%hx$#E0-qr>[Pew@XO+KRmnn8jQ|8 $Pﮊ#!ho呢U$Sl.>:ԭjrl`iYT\YZD :>8`׹}S{? o7Gٵ?u˯K,4hC]wsI٥w]\- O k]5plQ13+KСSʚ9c5ImO}%f[rǰk6>njg-b9c5cS{? o7QN/cYfވvNčA[;VXr (4 ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPQZZj_iEpIf2WntϦYd/zŘZ5\Z^&{Gm$7h[ NTAN.ٕR]%ޣԋ!W9pikvC.I' 8$ƛEv 2ƙA?GƙA?Uh.fZ?#gh?#gj{E,_glR5+ 5i$i$IEvVQEdXQEQEo%vğ:GI]nF}B(0((((((((((((((((((((X#_?"v^^,i?J)8QEIAEPQZZj_iEpIf2W*Km gGK8CNrV y =᫫ l.5^Ky m}<[ϯ=iUE؛17:gey h$(d-&kT,hPW=)Q`l:LZ{x10%Ij:l IQAfbx=KII5 {E,_glglUhkcL_cL_Q`-li5KTԬ.,(om'}{E9XQEaEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((?t 7jO? ڷ[#>ESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVF,?Z{cIUY?봟Zv ((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)((((((((((((((((((((+#_?z}=ȱ]׃*׬Ox?ҭz{;QRPQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEֽdkrdXkE'iVe=(((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@NaWm\ISatVdg(c ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( }^5a_C@zO`2,i?J"v^^ETQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@dkrYܰ='?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatWo%vպ (Š((((((((((((((((((((5a_C@z׬X Ox?ҭzȱ]׃*׬QE%Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^aESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVF,?Z{cIUY?봟Zv ((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)((((((((((((((((((((+#_?z}=ȱ]׃*׬Ox?ҭz{;QRPQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEֽdkrdXkE'iVe=(((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@NaWm\ISatVdg(c ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( }^5a_C@zO`2,i?J"v^^ETQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@dkrYܰ='?봟ZcIUYOq`*J ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP#jkh0RRVTy['jI'YOk wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8Ok wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8Ok wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8Ok wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8Ok wcqsyvۻߘ>I a7Wnn.q3;wt}; (oDŽ\g]vwxXMۻc6nŠ񆰛+v78Ǚlm>0~<%|6:퍿3wGۿ0}8TJd9[k 37eM)?/G* hЏx_MXϏ{]\UWKKkicr:ve\c=73IfM)&t7ݍ˟3gs3%ܤ:ݒE@L,g,h'9}ArhЏx_MZKqqk]x@˵*|D )3$Ӯ~f=۱ sc޸&s{4(hG9?Hc3nhAPLD 0l9ܸ>+;^Yi AqɷgPр2ƭ :vN=?<#m^ޗkI, ƫ%K& +bHBɌɬx_W$Q6٢T.,T}G{Z;t}Q֟]UgkBo dbO.41Y@Pq _Aguqqo{mr4&_-.]"R0pH:vN=?959h-[;_I .g';3v Ph[j4&\. $3pbWyʪ@:(ӨkOo.?=RES{jevB33;BRνu[9ՋƩoj(x8=^QiwDI9xnb1dysK%~ۋnնscs3i#'o&m }Ʋ5/G5q:OO7B;xe2+ ܯ+FdbTl{uq.}vP$?f<6S$q{ڶ.|c ޸&sI.^ǻv6˟3=73IףY_W/qÖ1iE Ӂ% o UB> Jc_ѼA .YG%2)؊B]ɂw]}vm[o>f1zo\g?9$_}n/cݻVϙdrϯC%}ks"Re!Ѡ,ݣ1%Iexpr}Qv5{y頝6ٗk 0Fs&s߫l4ӗ7lB9Ž洧Gk5D8+?FbCcLNO5m5rV985 ;X 'dCa].xX.զ1̇qs' o?:v~h2`Ҽ]H"jA57KyaJ)^ZGz?n-Ⱥum#\eXbH{%:vN=?958RDy"[i^O+ڈʓ"̗rrK]l!S4)S=V4",qh0@2j EVeǎHd<*ۅcsqLnp>9C[[nېHPpA1LoX,>nOmnz1$٬6%Eye܉ͱwY?Է\cd ~"{b> n96XC_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&C_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&C_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&C_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&C_D؏笃[1qMe܉ͱwY?Է\cd=~"{b> n96E7r'6}7=dRqsl:+%,>nOmnz1$KX|ȟߜ|cKu96I<,?w9# sla/Yaw"~~slGsA-8&CsƩha6o6ݻRqt~_D؏笃[1qM5Ggy|ѹؠI}|~I4<.-4nm[v2\99w>wO\{k 8[g%XʧpNH9mj[;HERԷw/G9 ERԷw/G9,*9?-`.T-o/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kWA 5Q 5QE٘/{Z^ɿ^ɿŠ(ϵook?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 5Q 5QEx/{Z7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- _- _Qk k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵooo?_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_a\w}m;?}~VXj3fUnNrV_flexdock-1.2.4/docs/images/eclipse001.png0000644000175000017500000032422312177715062020765 0ustar sylvestresylvestrePNG  IHDR9\+tEXtCreation TimeWed 6 Jul 2005 12:24:12 -0600c%ptIME+oO pHYsodgAMA aIDATx]Te{߽Wz?ޛXQ=_c-1$[KQD  A@:\{u{o{w{5<OܾsHH ̟TF\DVe00U 4pyץOդ%k*Pe8oz$vo8ոIҕuݩR4I G @g&t0A؝sOB*ϾHMG0Hliq E v7zqG{GKMVjb>s[ϼ>ٍɁ_4M_Ed|4EAn{#"޿d2݊=BֶS&1Hӥ꺺0wHҨ:j GQ!4C4̃JxlFCy /JCj鴻W;=|c)yZzbI {lԸ(7G ZlBqZ}eTJ"?k,noj5Ek6"DQ]vA鼩Yzw\3Pec+7y}ǁwvsu5Zgg#{77߸|%kko>_nj*kܤ{W M Ę\Fj1ϗY0 W䧀`z3_ßRpU۟Y?M3Ͻ'_{_%{?Z9?uu]׭v@sづnO2kr=un*Ē︈A@[˦Jש^KEtX{ 6Xfg^N k AO@'l2(lWNh^vW>0}Z-x~!DzkeZw7yk룿_h{G^hux^\^b(Km]?#} t ϪmВ$գUΙ aȓljt\h)Yӯh}^?_37T6 $'0Ga?drpfNoχ =/~ₒq`ID934R3_p,^on{m /oc_׿ߕQcb/&i+g2f͋/:WW({)/vs7j15I=wZiɉJDmg__s$`@t V7P Y:u-9{wϟ+|ym׬ ǯNiUr O˫+O\@aմD?@,5Pqۦ^{П6mE57[uU3 ~JITUy\w;UmJO}w rtǾ^V\mk~Of}ßlW̸vh&P?xw؜um89aSǥ5;.*{\9_ϛ7-GVd%djRYiqw>SWB0w= <Bޙ$gK'zj۟ȝ灏7 amwo~% 25Qm t )W/.C^WIʅsiIn7FN 8x7;VHgjd&xIcdB!ibhI:|^NbO]),lxÞ<O˪WqmVs_CTe0Ha@a/JW)աʶ0=pH8}xYUC &vOYaX+D[[vJ/1>w^ +j_=M;߯ry/m,YO*0UXW8E{Aֽz|rࣔ K\.lN+4wb gN( 8ZB˧s uÏW.-RuUS;~K( Aq-v7H /퉲`gfM{׿ 3'gC;-(%u1 lDkaOA..եpQAqP4E&7oɒ_Ǡ+(dTwml}zBqړ/QJ]86_f{f=A aX06`}s~{ބ{nZw s 6YϿ7ǫ3RᛟR)YqTA|]HoBNd`B@{`XDq`6i^Ny`xAB}H7UA`}Οn{oÁsgt7B( Ahհ$8p8pM2 /YC!.Xgr~^s;A/1#=mxE7̛6F/8*ab#W4OeE8p85!zK{{`5K,+پucBцڣR:w3qj$Xj8娛[~w )9)(Ӆ>]JÎ.W|k1ʾ\2)1^1s"PE[xE|dD羴=qN49oo/oZ۷߷\}`\bؾߴWVnq.%bK6cWgvǴ/_UY]G#LL"ٲsSK.CT1DN7Xͻj|}}l8P* t:ad[ay~J>mտh8p8G {njFqHh}bEH2/OQA%?-2?#$Gdaf;;\G^,4sh_ۣv.'8so|rJ-אۮ?$r܎DN#<ϧ_nmPnOe7b&@EBDm$'#Dq67OĨr}'hh &@)gfGqbXļ#Cihbvz3zOns<{UFODmhYF boQA4PwL+ƍ08p8 џ lYp'WqSѹfWCW`vU$ꝼ'σ+Ozfa0QtR*K%LT;HEM>MVLer` TRHn;jE׭6G[;^g9brJJ ZZ;@( MSL(+ ߃+|>hyh0Zbxf.9>T(OӁy(01 m0Z2T0dJKb(=)d+) b(~*uXe}] @Pa8Nivga@8j+qi=cZ$N#_Pw` } @5B(54 @tjcQ^QMIGr(HPr # 'TYCQAqv }5QTV\e xlr t1;umf(B-P@plv:P'%hbaK+;eu BFHQ)/jG9‚`"@$a]/ ACA , U?9ޜ *EB06x1j|ia]UAv8ձQy V{D?< ֶvS:E<$i0$ٿ,0/[T PHQx}ҽT&3'0䰂݁gN*A}^]n>p Vq<铓᷀`j=-UP_ Λ=5*4j|6r}AuBk!R)tW@̐3U8d@`W \!I`C#w|'Xܜ ;(h697c$eWOdy}p{:*`! 7y<#h| oPFЀB<ǂ=8aL2> dУZZ"ɒI%9td焹qpc;J/Z ,`,J ]5lC#U+'Uxd1``~~AM74r3?&>$fLp]`?eC~hpr \5pIJ 6 yajNں&0R~P]St=搪KcC!?'Ff`Ew8jU:RdSa> 41J !Tp< =Խ-`'w"TVMLB1Y3!BhADjYIAXN@N4dAٙz'HMIOTmL 7F!na s5SВf~wa #A=ނ,0fƕ q{1Ap#kJ~nVjZ>'N8g68<NK'N#MiwzHC[4X أ*>NM$ jkN/ #{ 7Fg `XL\&1ւ&Su#䌄J)5=΁ى* îfXׅ89p! xr Nbp4orKB>ȱ "* &ub؝՘z( M8W 6IJӈBךĄ e2iQR'`.+ M6~%( YIH2 ?li>b-]Yp>ҘLR AZvŻ3R5Na_YS({~_"4) "0v{aᵸ4z nQܔS[ C#Ƕof͖*ui9 uhwM~S >.eVv|,K'thV M, r0RuKqچBbŞ4MU<26~Kv<)Pf_=@:nljHS`^M8NyELa|yTlrmnLH  Æ=+D*Q;TמxMΦ#]5n A(mUKƇ#`" urYcf F0Yzb^@'Ɯru*Z &3|H,q{ n wIۓ55:WH>.($dL9 &!W 4Mep ߎP#y;nؚ/tI2w{/.E&066We.@򆳁h>'~¥[$o5w>Ʀ术B9xYл׾*ʛX/"2U}J'YMRWJyyd\Gv~#N<L4T}B}j2IjLR~:mT!_7Z|qhFL.nOK<5S HW|_k\LJi4]DiVO-<\ {jDy M~ZV -@ \"(񼾀lT7D]kS-hĿ2W$If>˜aEBYjToXqjMsUT=|;L.ㄢNCu9w(/7{ë뎋Oy\MNHè9a6- K/aرbɴkfH1A{ Є _8A;)@7z?JPoIhᦚ(fDPzծU So1L9 ^/ Vg?b 1 hCHa#ve\2~R%֪4a<BR4E*$[vA`KV ].M[D‹yۤ ̝J} MjF3Em^+.1E1-ϼŰ&L"$L, vZKR2FRJa#=HbZybOd-&CiP>˩ h(\s?f^O-kvPvKU[SqVܼf|0o,$].׼G^bܲS[OTմj#u|fֶUGģ> 8usi΅p[|vN8ێ$]B"D  l YÒWu (JIm3 K3JS``OÂI%)x7j:V{ɏySg(*HÇF("Hz$!=k?^,X\CI x]u)iSh7Lzb(?4nFa{}8@ba` a<@u9.ܾQe"*e} OOI tu3CC?vw' K/k2om]nl27miO@$sb_D9& I"Tjĸ:j?vw?V_hl?= ~|4=?H:BJ3~blV'Q̭ YFRϋʿ0,Mg(膢L-4wzT 4T0vpg؞qu,ge E iy(o-GK3/JdsRyW)IS%Ņ7߯|>{ g{_?^xow\y'zys\⿆%F@NϞ{SI ͻ#?~GЅ ;D0ho-N/jk &u+ZPt ON9N) G+_G:i! ^ۏ}?/ ˩AMǪ .djL+ĭҀ 1|FE{L]4 ?|irXn1*{#lj05H`=&CL?yNW>n N[ HĬ)( ہIncHKBeD)9،C]B}igH_uފW>zCU6W$*;SoJ1Z)/Mk{X,u=Ojλ̬{so?75#w?>}ވ*9@w!Q$]~S sb^F1QфɆ5dH- b_V&}~ܶsժ32ow%7tOVʹsr/ ͠$nsu?0dg01`C/>#>џn,C*`NaRj 5Q߸( )D8˫;)qxLFG^)xɽnZYiqf({~ G쟧t@@wESk.R}_#3\T6m_\"3ֿk!)NsUhB]WeO> \GI!*oeaO#T~QǸqU>%LKmv'}if@9:A/jA`|N_0HLce 3|V] ?lc_ETQ4dm᡻ESj}?Tū1SG5 ?w7(8M䫬BIvC-]&-Iy`^߶Uoeq =4h?{x5?k=ɀs1{kG 1>oB8Tȟ7fu;ܥӋfsÙK&G-(-.4NLwKM.Mrßfib]x:]*"fg)jd0)T|V*+pϖ4 +ɳ'.f?`ӭZ|J>6@W)rTU,#֨UMbŕ0΁:rl&KINl;>x0P:` M0:P)֓H5ۈW[ud%;!/}\:. D?ol6޳oK;-5κ&O8eʤֽt ~QAy^3Ġ( }sSy7)!!>V M;Jnkl*,,߀I:1(fG%9ptMYq׷upRXmŋESˊ"EQ29eլ;y <_zT"/]<%Q.nr޲UÙU{0O ze|]Gr !ۮ .txycs06vϾmuw? xL.1aK’Sc\_4aZT0*Q!7^{G㡊Ie$`M5BZɌ,o5Df]߼uJ,ѻOlN⯖'FE$8,@Mi>g#Cs<C]|b;ՊAL<-c=\( MChQiȆk㻗짐ҁ?p2OP4Rw A'dhYZx%ey٩|𕿒/]>vڔl1wHdy!i xH N.(v. PBN۽N):" " {^ jqABH"ƍ_g)S#4Ao4WY͖6;JhNS"Tn{ۓF0Mх$jKhl50mӒ^P?T"(B[7  ͿE<ţO*4\*v\K|C! 0ʕb܃RVaO?ӧư)%Eѐ`ڔE8M9D\bU[hC8.74{!~ iS'N pjZZbbB8i&N | 66%|d:rd֢^"F}?)e*8 ܵbnv:Z&u׏gU̝KI777uttIƷ\0o ]fL0k .,&>7MQ@"U';[Q`S[ m ; MԅXTF/IIO C[`@`lUu| a2vZ9XpL.Fb=PztL@z:NvGoF(Wcofh7|S^ vhde 06xQB:ybP^YBTݵyfcX"<$Irpѥi un C KRnCCp֘`0cWqÙ ҂1ֲBKHGyN oYE8p̆Bј:]`1,#:@8\Kkhk8pa,%)\Nw8i>vX" }m]9Y *zrs#[D2D_D3 yrTCXbjcu1DXk =uM_1TRUT!1 ye_ܴ`k@=> :>@ {YA$9ؽt9ppRH$xxsg=!`JI0bKíhG]rC)-+NեhR4 $Em(x(&L2ӰA CTF@ 5 oZ y=+O$Bf>p9S 3@TJUdЇ CDX #U@Un3_*W١ç0Aא (W׶4CIoyUEMn[%Gb\Krw7bzUwMV aBjZZ\s|"x9?er8{U)AsozF6P{{O|\ŞDպok}] -T4Fɋl6V̐HmOxYǞ݌O@UAP h`j|?) ny߱' D~AmD(O2 _eCͅes:5N pxf;++ȮcۧG) }mC#H(VΘ&`٤.ܣz:L~˳t/d=??eW9*.#L+>Eg8X 8Iy4gOcHzVƾ#{UB6>=J3Ao7HE#?y;3S+z()op鵘LkRxÕ3ڟ1e „ Ig6|.U  4;qD&G[rlf0P"By ay~9}vKI6P?X]q+-n)Ob EbR R p8 :tXGULrqX,#lW#j3ض`P#}E-$ʕRőYe2 IE og>ٳlT]}4>D2&)#mC(Ȑ!ayy9׬ofs#1V/Eן?3#]T]4]TQ<  @ |蠽:3]agKgLn5֦ SgIwLXs83L? ,7HٌU:2='vXU*STqɩzO5 i3cJ, cos9Ƴ][PݖZqՄ?$Wd^/-ZxAOf=l9CFR}@$sa\XAF޿+{D蔇6ߧ QE;-3V?/>/˕GWEpEp'xί7n8l8Dz ZEVeioO^c%eXN.ɻ/Z~DqR?vp I8@Tڄda,eűיC ~'Ш|hD g dFp$D* H*xgF 5wp4EȢJ: r&.CK)pEc=l%%۠h~9 ,nç[ہ7Z돳t'ΌtcDץfN3E,kAF Y8lxު#Ͱ V t A jRl.,&0"-kqF 81N 4_MOxğcaݿC}Wh"oWΪWD]zd5{HZhd~\p% (Y 41; o07XWqLXQJ\Q\=^o[1Hc  |ۃ#:LCv{ dhsa#TJyyJfw`xd'p 5xBi}@(䧥&K%]r "Ntj_liɋIRǺ.((ڼy3~L(P(K1Z$ϫy<<-%Y&Yo6rU%DByǺi47HZq¤P(Tea]TƧ' (kYax6̌qsU llj-,*Ic]_(.X~el4thy6*-γٝ͆4Ɩ8H;ͰD00.Rat 5q81у0kYTd66ƊKMK F\ES4c]_z}:7]zz@R8^Sה) aSؒfahx|~*l74Qa[#|F <#$5[//'C&vo-v#Rck5ap4"H\SṮں:&>$bP$T |P5y#cMOKc-`e4ZmO?hr8`MAv8M-)=VqqjFt{D;oHic;I{4SY z hƃ`qVCz#<%>U2)[DyJ0P Сki|Xg,T䳦kˢlrq~Zmƕ屻WW$%'͞5 a_̙XO FBoM7G+S!U@TZ /K{jrsg;ΟdP>U~241zRp 3.KT&&-cw8F#222` w{} -9Yzߌ_v3s֜{ۏ[W\% qp_#D=nhm K[G=Tw,  Ǐ1UH> g Nj^D0H 뮿<>?ݞy]٬^4jHOM>]誠 9s玈8G }Ԋ7THl>j(Z^Vm1B]X[WJKd2)8] ?A"skΙbVm&9͎Zɐ{ Ø76읒ۉZ+ EDa03L}Jc3=4߆٩3d,%@[tʕ+{7=^]CsVfX$&O0I} #U b\ET^~Wkh3ʳfcSYY٥,'Eӝ]]<}ݪ*=+7ޘcr]-v-^n:HtE9r$3SazzPyKk>MwO&&hrC<q_JJV}O99F(.#v$\\lN| P_]>}BA=HEui;,ˮ]zÑҒV@$Atcl4BPLCdj fH&߰xmvv?_n=Se&$ɂp~Q(eJOAC٣z~1h ]kE#x8ZVꨍS] |w DHJ;p*QIĬ A`H%"Hڱ;qj%6 +$ ?Y+3 J) rJ&tzHbËvuYE" $bp 2ezmUgx ˮaf}"WB Zr2 ڲ $6Wѽthg-֋:Ȏ]+t0 Da0>_he5WiPUAldbb/V y9:oܖ \xaX^|I*.Ztтsi4R W_u%$WR$b1(O>Y Ӿ 뮽^K@erG}??ԇFRM"U 맦h1t6A%YmMVk$-͝3֖;q=Trm7‚|Fx Nhko2ۀl ]CuS钴F PJ&TG,Dx!$HP I;nJR|T͡GaW؜M~8+]PWV@Y B uy"ˎ{WqM-fƏ/3uRu:$mrϝk1mk(΄zy`TuvxΟ7',(n(@Y3֪s9Gр`6ArwZ y%`J,sݷV6yj}Vy/|(df裶Rҕ>4 Tԩ &.!pyFR)X8lS+|:Lwa1emmv9֣J`7(.&SdޓN`Լ8!D<==Jj˖Lf3{o;yRYYAparrRw/1hLkW``hXT|nܿRiM#2+< =*a|?pP׃c)U5ͦ.ۺ 7؉&kn>y8Ʌ{K;ȅx)1ePj@F] :C#@A@?=*JfP{Q j1qIx@a`ѵK7ܞhOݾ(FGQ1JKD<^TՠXcb!E ĸhPJ {Oj_^ױǃ |&@Wk ;%>p/#\*e'X\J;E-jajOG(99YUOY џA tO S_א]YYɉwݹq~\* u]KZOy|ޘQ#RW_$)n̘>*m߱ho(:Xc7o !mP6''_t5fT f\k$hRQ`#  e}N2 TjA }9hiX>;u:=TUwu leߩ9 yo IY1diTi4F/ 8 s%@7H3B, n`[LD#8* TL >^ 8/1k&}Eh荖&LiA#Jot惹}Q`NFx ˃W*G5HB/(80WXBV(ca9~T*MMMf,--ٱc;tC{tUZjRd0/=s*t==&T"u[Od/>7 ;3h5I1ٷXE}Uگ~䈢܎آh(Hb]oyZ Ò|JtJNnKɟ@TU=/s18Mi)il)=W߹My(1ܲ"RabP #5EtK:W-nh,Bs= B>;fORvU?voWP~yyyE  *E-L) (jOA0AۨK2yʹԞGTO d"F}X[sCEzܞ@g0@F ,:veia^WcSk%KPT@-r iyj9}٦M 4f*,>dv 6Ujh);- j"!QF$\jwde!6"+#(X̋ (K"@ 5-fS:4l6b0Xc:;3F[90}NOs֑5qR5*0cx9SaLp̳DaYd|bd& InPR_KYW'4f/Wqy\>].w;"\AA`2SҺ:( FA49 ;InDKEE 8q2!Gd6X:v ) 1kǃ\nOL nD)ts(+礥NB(N"Tތ9ieB 4 :]$CE-#|ތ6pTh)@BAuz3/ã8̴v9G`hC;L=oݭSD|SkS%;]t Â6E*Gs18;aT% $ɄW7tZMCڅ"Dq8KN\11TcHKMgHЈr($=fvgt&*x0[]z!8L@ a26T]| "EE%ɧY/LPp&,)J86ex1/IN3bZkB1u|a}!Ⱥi0w32qY:kAxj 1zvV.3_|V]῿h+bbĂz2%|qkg_j*kǃc˽&_ M[&ҽ' 'bU}Nj#e an7$ tIY+N@QJWWmD-o@h׾|qJrnet4ZAؼNbԱX1q;dĖ͢G4FEݟ^&"l޲m㭳F*xX(01Wy<^E\ eBXt`xL Aw]. 6fbk)QPƏO (Ń{ \ڽtwF9T°,Z/ MRGA7$\.צ_~KJJ>lv}ډuCpXT,ԈL#{vZ.E&膮x*97wr˳iws]OKBѦu9eRFlM5AWH9NqêZ|m)2] usS` f{dIfw !yAW;jDQwOWX9WH"n받#tVj;rhyĽRTizeD]`s8xVwyR7{5SE͕Imz2U w4&N(Q֪Bۨ2U7rS&M׾_'F9>ǎQWI3IjspDKj'F /JA1< ˓Xu5+QݱYdЦC );=ICINT#+Ylsq%l&m|$5~h$sfEs :+;]Ry$mxDg¨T2NZ"􄝇Օf$TUoWh8}|z '1CbP (3CjQm|'%"0usZ9 OjkM:PE:R9RA J6ٳS_C*y?;\\E'NzH$`1FҼ`ă" O8(APp8S8&2وAؚٚApH/k:}2".C!8j\E#\FS]G>‰U#"x#cr'#nIђxK?gk<$7 !t GjlN=8n;-Lg<:8׍,6 l)܋M$[u{$zň&Ǥ'mbf3arW;B )G$@LV pA*qrqB89!+>jp(c9`$e& bâ ;<{IGz\jsBԧ K,ⷯټiB>a84T$JTpb@wQi ή\e#=n؝ذN89ܐLd:,&q qS5]QBE> ,Z@1\`\&Š(c!"\7^|JCMKL7V?]}O@K럫h$],h%¤Nd0"4PFۧ\2'9J3@W@0ln_hUUjh&jhW^CU-EC. 1GAhT)89˙b*4nhn6m1CU@Y9;<.=nؙNZCi-զ'ʐ 1Θۭ8Y;41s$/GgӮ,l%q[Qth.Su )Ac$8ʕNs%ږIל4:ءtSF@;:38dx{;'MnV:| AX E08V?A>i%^\8(?W] ]nTuk֢fłk<,r{NwhI~mypq:J7X6iҦ@ 6K&ѨA+<4_m.ErbxМRqP&X]I:x|(*R1 (43zvP:syI`'З *R F%qP5dAR沙8N|\@U[(԰d d(C7FZXn 04!&xE 2_Wï_:4Q]%n{Qk|vfC@ Dh0 p t_9(0ŀt͇6⿷Ta'@ۡSNw HtXjc>^?~Y 6esxr:XL*UD+%v+A(ٺa4?wU!Ğ$*p8{U'؜pU/:3e]"_ 1@6Cu =}<9]WT&%Efvج&'&喖֢AaAܸ1@:>qD XZUa2P 45Ԉ0Wk%%e '+0֞<A76]%@Ɛ\18Bq9-u5֖QcY,+SDh4\T^2U:n~9@Ә,9hFl]ǾhB4@@[dL\>`W8lhd4rIv[|^n{+~t]en/~gϕJ2\Xq_[^;}yAsV֛:s\,+O־#͹# Pb#~]}ݘ =NfӧOlFA\84'K><@oOj##E;> Ќ/Euv3zgW)M u}㙌ql^+ֶUv׫iT[K(5Rf0i?нݗ)[ZZ^!/`رMM A>㯾jٲe/M63&''/;f, Aї^z riE e=C^/)-mmmjժp?Px6v8X4|؀K-e;?54zHpOLMEui 0^V,>Hsssiah;6U&CpQ 뵵gIbqj%F N:8_yΜ~=z4Ξ-eܤ$`>Jb6BƎa"F1g.k:Ӓ( bzeVtt+-Z!+H*[uݻwz7=zyHXQYaÆ [ܹkSODDeP>^1@\>g% <>~RUNeniEQ1( 3fp[۶ 7ךbLyw}>vX$mjjtt@ hlld p hn|a;˗ /^V<6vi4b%`0@nb49NVv++*// p%0sfuy0^mFUfYAW1@n_` kLW\1@ 'K,RY𢢸4\ ⡱8\:0XΆlF|{͛7L2%/?hvEx/_0&Nsrr(eE>ѣ/A(5jԨe@xٲe_|;z饗|M>VIEEE@fo~$?e1(#5$"#~? @NC Quzr]L&sҥ _x%T ##_bJRYY X KSeffV|йTfe?DuܨGs""2+^N[$pg3&N\N$=L(c{+ICbp!dɒ{.kZnnx=xHLDA> n)8PTBV XxTʰz#1#cyX($Ox,=j=nNgą9;4 E'-5aA_FUDp%99 ,n].= a/c0Ý!`04ͽ?= =|?n׋{FCM6 `O~ښZNI8qDEEEN}rEyb--;vеu:՗{쩪 _ '1M^C!IEˋъV455dΜ9˗/ki uVPW#G+Pի/ݷ/)1iࠁjĉC|}-߼eY^EaM<?(5kl /T{ﵶ.6懕+njyǎ:tE>|6v-俞1hqQdeFToBMʁ/v1pf m>VcjRu 4maOnOo<9.c]7uxpǘ|s|aکw[:1ȲVWj7DD.;v=ԉsMm*Ό 7pCGx0 7)mJ`AOgXnݮ;Ǎ-Fn/R 㡏_@Q6*k/-pawuwш'OdXa]we(-. ߶d(x oZzA~ b[NaQ蘘m۷}'ǎ[r%|#F 6mڼu+ }0bz-"ӆ%lܴ[At | v?3tм<\yB~޸qC#G.&q!5(%7/\=j(Q;r;}Ĉk׬}w*+*BBV?6lذcAi:4PEyũS~a4&xj;I&=f{,/?`eNII}ͿRTT: /H#rرv!sݛ7m; k{.;v777?sƟ7B )?}狄Ygϛ77t:ݻdÆ IOIq z}|K8H#Ixu>IʆJeڨӇZK 5U%JPuP@џ}"&3 2QYiiNvv|B@F?3<S={?F; @l6}˯B7^7K.\.ڵ?,\n4|o@T}}=62v?v}Q㰑ӴjgݥC\ˉmgF@T:Ol?5Tp)&tfJbӘqmA^p8#*[TFIVlr 1W&rDQ ̙CoXܠTVTVBc>ge˖ B TNJɓ֩j* IH>}:-i"ϗ,>H^ӧOgddL6 ?qS[oC>A p9=w %ESF1)@"A׆674:+6 EıNnU6o 'v###-_]"(R$Ag.NV NC[qEm%w^t9Ϛ5 Ȧ9CAx"nHj\a7Z(Wo4|ۣf[w}|DZ!2s=a-[̞3F=DڻÆqZ|*ոq v:{}vՌ3Q̡R1T< 2p!qRe!OlȑK!؂uѣG$O9Lw;(LJxǒ%GURRۍ V]=rn&.}Gs#./GڶQeuUt^Y|.!p^ {" A9ۍЧzouAh<_uzz>ŋ׬^N$,hJ$NScTK;=ytD*jzDEWZdHEafn7YT8^sL:7vԤ( |#$tPܤ=X)P!$nB“ LJ/J <3kF}}5L37雏B> Y:1_Iu۴fAv`T% 050+!J ,Mc˶S|HX::#U[׳Q n6H> 6^A͹ykvwo :t32DB}{:Z|ȇ3:N ,h323 U(.5H"//H( HP;`ժU1a6tz=U*jՔN 6+(&b!g^d0A>=I`.;QlCeHI9 6appCY`2۶ 80++ Ch"&:-_ )C*P\Ey;ق%+͠Ct)8ܶ6d.MS5/CP7N#t:QT:/?Ѯ֡ӦvGMF#dU|i^~ V:*F_}E6'r+j2IX" D,ͨ o@0^/^wWaL2#F-!„\=K7nn1ڽ@ѣ  6t]LMM]ʳglYfРAV5)1 h 0`**Rb#Q)Ѫ3 d(~i𢅒tX3\cDy=9#%\,.(ҧjۈC 4:qQS:LS_D8YN'S Jn9F.M.Z: w[Q??B+ [ӺgΦ$L6_0qDgϞ#Go?v7M ^uC;;^WW7oޭB6e(tr@ZhL9lH}t߾}š(LdmXd2>j xHt* &NH#*))ٵsWZj|zTZB"p ]G4Z |_ X-wCG6 :99F Ϥ3FQ:xhȑС!a…*|۶o{\T>B࣏?qrCUA T&RAхu`PxcFv>U?w01@Fez V+<b_[]If!L}s0Z[^^?q~bd :2vlĔԔ>'v_!u)*.|j=gp 2—PYzayXuiIaw\ӕqIEW?$ $˯^+q& I2AgMTZ_:d1WtÍ*DA\y8mCc/^:Bw' : SSVs)C~Q1>pZ}{4tΎe^okJ]ڬ6߶aEA7!<;c4rܹ2Q]._&e (F'(*|b^@?/A_MuUotCKsseH-\YYUw^*}v^ j`Nl5DMMMc4۶m7GA6[_gw+2>n`04lT*jzp[ӫ:Yꌖd4^༮ɓB25 , 7‹/;z4@ywy |\*@p>F,},BUjJ~:.k>V"^_vmWM=|wSfÇϜ>2"a:^ׅRЦT*8~8~;A*L+/<0@e:-MYYYgLwaا} f5kX /`-\H)&G}(7^xL69鴺V|yQ<[˘5?D <2k,*a!-J@'OsWJ'35!?\u:ME8`y㟙qz&3MCD;Kk"Y}|\.w96k6ǃ /%TPPbE|I%,fo:t_1cj^1@JUVZ\ zU *Ngz%tɤ{ɳ}j@HNs5yQ˖-KhyYoO4iĉ.]t?ܳjnرr#Ǐoȑs?{ Z D'O`PÇe'xW_y>(!\w'N8NI0mڴI^.Zˆ=?B-Ik?n(sHƇSw9.^ 5k3ۓPi nְ2:?Q_r0IWO>l߾]QxKjx̦ҲNv{U2K󦧧o}? vP.Hxr$Oȳi̚^:QYYyۺZD^b2YDv%4`]01@9 K RT1++;M_rhTX/abVFR _a?gZxk,I=3uk:֬Ǒ{ `4Z^~Nz4z  ј!B#2DrǀDA  _{'l]nkmqfw0C?@jWY#ͼY;TTV[S[RR"˚[Zvݷ.̵i&~"Q**;ڛٳ//_N9 "qQtR{4_ئR)bz ,Jӏ;VYQqǒ%,  K(X|sWSLO?ҁ~GCP?lmiZ֕+WN:9rpI3g̀Kχ+VR Tj:k5O<ֹsݻ~:`k9r_2|^zi̙,k˯ObW_*8u+˗UUU_3֭$񬙳&#o Pl#/Tv@!zKq -*G̟#İ5#+D"[ ج$'&&"p-  P"pǏ eԨQ LKK ?@}o6?@'Oa?zv̨PniiB9`ႢEv}={,^xҥ v$,32dر'::Κ5 ^BPQ*o}-h^"\VgfbuKFdJb&r[$5&ad&fq4?4>;8$c6'Tg.3qd&O./ipۗNAs7HE?s9QYm@TJ-?ޛ@ϭԜ?wA^?k~\cP%ZQjNnR4Q g PH$y |+BW4ξVdMs8D:r0'l-q\tTT(,^8!!'z ~@T6mڬ) _~Ν;LcwWZ؈;w쨬:իWCTnSMP(:ˮW5yc5t&x2!*lo!3:{ *_A/W~j9x e{r"òFM@#r?.`mm RS[3i$ ?ǣ_u!A&j`2Hݚ`߀[lT"(d29|pϘ139kڠ>Vu:8dVûbX! *1@bKu}E ŅNG{&WvL[ق9Aǐ&W↥Q}s N%htUER5ʚiNRLAҁ7Z J<O4:qmTBK h}FD$= (Ho:I0}j3C(B~_Y |/H i |޼yT8+;;}6*]g)YS }olH[1` [&L p?<#0}% DAgՁ- `TNc.y|tA46ur4oH".%I8*mmO~SLxaɲ3s?1/>r s*=tum8X\o.>O縬:@$OgqQQEBNi@qڱs'NKpPau0/A?@,8LsQ4Giin^ҫBn={B+\.*۵'Nu:'bN,oՒ-7mBO.T] I  :ڀi]vB1-?3oΛvA t;?SH pAR1:;A'2D|N"Q@@ .\H{HyRxAYYY`-}bwqUumLʕ+lgk644x˰a6gϞ33gLq۷\|}}222|ƍ/^ y'VZe]ti||Ɵ7^ORӖ=ޫZ7nҥ^^`n&MOKY ʹ߇y1r$d]S.}0g͘1*0/KA'aZe ׄ A -quV'0[x d4Ԫ}{p޼x7'$$)Jx f@)BU2<,!{Eb>S .*,*-rvxz+"" c裏r;׷)@Y^+˗bPÇGGE=ą(LAYp  0 F%'. Aw`>@&t&`ɾRooS@gbBBxjLI *Z3T*`7XQh2]9qΝT N]iӦ]ꫯN6mY;vhP,ԨK.=rt:.N h ŲO>@$HD F6eoCree9% }RP0w`q\GGG Q-X$ctOahjjcг;DpXRR͵Q"֖V,ଙ 'On8* 3_J>v(.*noowݶtAxmm-PBG!.rwwo@뛒P*6e2GG'8>D&^|ϒ,/j5B }$H |_j~>@K lP<@6Tר4F= ˓Fٽ`H>mۙLƊ_Í?otF !%++ II^K/t߅Zf=2N4eD2p-<`!QDREi89uԟ~I.e !!!ǏW))+ZdO?xE]sRRYKrqOI 1PjطKbb aaJe-t`QY%Q/k4EX<"?~˺jј5b7o}s55z45  vX,]B.mo c, Ag5KLA%::[Ubb,U}؃cx|5T|7QF*0AXx?OΥO>$`"  Abybdep_x7.ȨSx<Jڱ{v DQ+]h0i#H $bhGD "#Y=0nTJ,S-:zY[4j2]'|O#-A$A}yl{4쾲R J!ˠC.o1C{SYpڳ柛O|OT5 e I 1Pp5[!Q<WW_ߠR(OͯoQ1\Kή6ݦb%MM߹ {|tnvwT yIYyECWT<@<~v H " uC(J[Z[?^_[K<-' ΡS^[nXW[_U].;wu@Q]{ {M[wNa' *ϾDowF뎠I A`3$>Rp/>xTm5()`4is]}ѣ' -auP*A]{<_IIGfxرFeϭtxY_}]Cfd\d>" ; J5"cOAe/x_66 6@ZhH2ydhni7fżK--m3>類5uĄ8˫=7i؎.+hY[ H "px^5Lpsss%:>l0H)--uwsSypp0tٿMF|}Ǐ 쨨/OOau:YϿW9{JX ``Az ɏ 𸐛k/+U"""żssA(u_|{~GGa@~ Sp99757ZML }eU-Q欟6jBbafx|f y?PPl۶ >?sL:::oߞ=ؾmGZzUzIdƌ}\.߱cGС(f/2َ;322ٺuwjjUɓ'ZۦN:`_޽wSL!Zu=Y~~lڴ icǎ#1i$Z[Zc>"#G#F @*i'wq`ߺ!"<@OOO0ԜD")Lsxz,HCċR\;Ga?$)LFhH0qƽ0 ޞMqqS7Y77WM_Ȉ0[MwtH$ `uӶ,Fݺth@6l ^=٦_Un, d6f>b}+Ẇ,Z&(4+A!0*qN);t#UQQ}B@@eD΁ JA:d٨L ;>@@||<< sСl& -)Q"phu<Ō56Ϯ--ee >^!BzA.-?;;5zԈ_̵+}8*t qq1:V]]laY.BQ.8 be'y[Zƍ 0'itlKE翟K@+UYt<A(5Z-qïs΅Ο^xXN3f4 3v̘w:xFDF>|>J'M 3+Vw,wӧO:xE(^tilL7n Z~qdPXZvِe 11Pj)5;6_8|ҒR}=0K.Y$66.,,@)(LDD9h4YڱqqK/1qf׿|)[{8v+X'O\v-=-Z:3 #ϟŠ`7W7`6m2dhԄڶu\`P7%(n.~Ju>Ĥ H w^%z:iР ꫳg>uj*VJmٲQA/+pdĉW@+]Xys?qbXSXxRh ڊ̛ )kۖӧqdhFI#yG9R>[RB` &ẀP*m-iO/,(vffftT65YrJ YlT/^@ Nt3x>@x7z>˿o2n,t4<6T&&+#9g.l6kԉpwʣKL?a|7~¸12<%ypTT#֏DEEݦNlɄZ#%9i҄- 9$b &M܌e9Dbr0u4hJ89uvsp5 Q)@R\.Bbp9m4@Pl6@ԶRmBgSNO׬x5?ɜ39׮^ɓ'K i2}ƌ_|X6bÔbE~)HTJ%:;J~: .Yr@7oèg -Spr{1n"Rl_zH8~ "##nmXR Y-Θ=kZ#ೠ̉baVY-ͥ a֌VYY3M 2k'OV%=YfVJq{WX,d4證?OaK/d>ѣG >, ȿsSQQ8O7,4NxlcYC_-wQn)b/<̲@66oFӦOc2{O6ݲU#;sUUac #/Oϴf - 9{28Й5dX<@]`8:N)Ez{p $4`1A}>:- ,ˁG)7oJN #АٳgXG+H$dsNlٲ%22RTmmmp8iިR2,{X\ҟ~iqqq<<ram嗐'0]h8b(N"A@OLG5:u^ۙ́ 2[[Z~e-$nggT l`چGDEGAu;q(̬L(.;v`VgʕW"#@ffs̓2pf0|}g =&`(xI-kd2T*0d^4N  ~3_3PvyY9t#GR)Y# ŋ/\VV)))هYxqQQ1t"ӦM 01[EsNNR 0jӇ]=AgKs8;UjP0`^zظXt9pP)T(9;v,T T;3x<^/e6g3 Ti*l{Mx%߶䭲~!fѼ<={`LCy*<'OƉ&Vضuڵk U+ͫ)n iǏHZT;K..2*s2|׮]d@SW}H{RӖ= U͛7lذ߁O;}>@l޴ʿ?u[]]d)]zqcƌq;v 46.Q!#}$HsU`t n9w܋MM@gJJJ@ɩTj\BTw __R|y̋al͛'kZ^oFEG}'R`Ǭzk0޽< KP~~~7oW^jUddԃ9s"`ZzzyY v!![ؙ`m7yT*y[Vb+~,O z8uZMqI A}{QHԳGW !W)p+|.="3/淎~ќۈ0M<6=E)5('Ng'O²_,O~N9^f<@]>@[H~P{x S\bͧkVD"y{GTCCӶmV2o߿S!L}mQ[[ W{y׷m ?=@@ll, iii( p.^,P <_«j 20\\\&o<<<"h3gܲeѣǬCR]ZA)q(Bg"diu:h4ts=nݺ[sppr`@L8>,44ie`0uB55Pv5t\ l 0(ȽQuvP)dD/uKgTzBJsaAfE ,mr|])Dg:>v%i5__P:HܹOann@DDDttt1rH֖Vg~ ER]\ЗQ3Jh4E ^wv͚KVrl itCmnny<T*Êѥ;v쨪JQ %!bYʜ^ZZ!8{jjj+>_ N]١>h`R8\.'LIIiimqe ΅BՖFGE,bTTT@S ϟ?P(=`}e-tm(!dRGQ(T:WǛ?qoɐoѮ]@/ phz;oMG쌾%''h={H}b2/ҩS.!ߴioZF[DILJs}*900U€4kA PϛЋB4h+4f˲`YYI>)4ht;Ru v0iUS@VtS٩Wi"ժw89Wl2Ag_̿>Uxx[$xt|3"ĎM7j>9zlZͷ3k21n݊ep@qun}}3gΠi2lREE&Ng(1<>vXh_ RǍ Ŵx{?w~Hꐭ[@wL 34J7nرiٷon^.ޔݻww;`ݷzpH7n h9 6[< 6|~=Wۈהɐ}6s)xmJS1p]ʤ I׹{0z (e AMZ /_w2ԧ~ Z~]MW ߳<ƚx$rG[x~n>NnB2g\D@+K~Bk׮3_9m8#^WRA6=ڇ:o̼ɃT {je?37ɑ׶R:eWFVB4;ͱ9o.6ڳgw^^%֖V*oPjjoixl_`% 3GD]d瑛A"oDQ4^}U\W :G{hڶ6!Ks Q( /ZC+NmV35 ،.gj,n] s"Zl0|쒮_)3\Nc(}59PPWĖNr3)xYsX-SF xXLo HE XJf; bdm..9grXLfXMJ(L!,][9R{\\#4/LNXiK/~뭷77vXQp.˱/yfxrZܼyٳ*F!r\CHA Fϭmm>P(4'%9UhFsʨQaDܹiӦ-};c0!߁jOjkk6^L(v~:(`TѣF8;ds !Ů]uڵwyg挙=x 4QLb.H2o}o޾lnn&"hWJH%1Q)m)UpR{471YlxW&Qw4Bn:e2V*hSҮQ>7:68 Eyz9؃ȭO`K.uJpwG[TcL.x%eTVV"8i"J1@j#v#"^[se)F.w*TݩT(ŖEYcy\e9xРVR<O,pAhni3o ]\\,S@}:tnkmEy@$''755A7G eRḁ|[%!"<tmʑGZZg̘a}nذZ/}K650Y*:dRCeJWeybΌMW(--HaN>//zCiͩ{3_936Diii<0Y,62ik ӏ?ՒKhw .>6vJ~Hը`"-ܦ]jqtY$̵>`kE@\&31h%z6զҞV̧J}?IܥG;SG:رcVS[Zh'LvZϝ DN0@K<ؼ%>h] x[LE4'LP,|[?[Nc8#p+O[ݍ9|&PR7 @" Yds<vGNQ3p;ВkСCFfm۠gc{SMx~@( bʕu: ZǗSy$HhFVj`I U%9,vOP(Qչs .]ٲx x4N& (Tgx<ݻw3^} (~sVV7_xy>tY>gn8#ToH훟SO|ǫ?NLL4ir{{u RӦOuMMCf̜53;;{޽Y5qİ?xI@P.[6cƌ),_2Kd޼y`5J'M吸`L˫x_Z[&y$HO$2{׮]`2/-..*X]#V_RiX<@ #XZ-_o%b\J#xsߊK`0~81`ǀNMKOl!CR:5k}}}z뭈W=|'N@\; <ٳlQ*y:8 Hu}C4gU`$i}joH "uq% ٻ $G%V\V<*5IvG2sqvkbΜ9˞[P*{ j3Fc;+8ҟzi__􌌌ӧO !šk duuu>֮]k:wG>@$HAPE譈? 果ţS:MsEMuGhWNг_|*4,4&&t`O/Ϛ<4ڌӷlݚm"J5uuM:&(A{ 6bzy{WWUY, !=th\gJD>w}Ǐ >Cye+=ܺYfٮ2ǥ ,H.G;Fϟ;_ZZ2s,"kH qWqW}}Sq}$h<==(h J5 ><.juk@%ĠB &@7tpxҥ^z ̣88iV iq)nnu II!/sgQu@Ehx b̘kJ 0 ҇f R , G5jٵ+NE'Ѕ@/_eeffY^ѨU0%%8. SK$"$Hhj5}VL$t"٫^|BeXl7v-c<@?g-!eٳg[c WטLs=>k=Y@@hmNAI4(1,& >4cr+B \gϞ}GAZ]´iUVYÆ knFAղ9Z` `d H $@հz[ || B!u-\*nEa]:HF|3l Zc)/n .ҍy[?A`ݰa <@WBl6G 00lqCRqJr> F)Vmu79yH,^ AAx/! XlJ}޶F8x~X3@asxV%}$H {xv~V(gQAκ:\&khi+zy[MD #8G5Mjkk ;8j4jm Fă<a~w. wQRP7{5~eRY^nk29*-JצPA]]rʩ{_Dt̼}v$ 7mMjvm={9y]Z>px$HypWMWL.A"nיK wj[1!!ATU*huVdۿx BY 7xVm޴?[ԩSh_c Ng`+uH "c]}⁛X\TDZ`Puٛ7o>cX<@:WL4INN嗿曏VV(_>OKO;g.*g6uڌӁRΛm[[;Ǐ1}zgּy5B<3O? ^`4gÇm#~~!!!@Ə\ ߚgM<>@$H<8}..<:pJ)*,I/X@VT,N=W]f-[ϟcǍ7m14h4(o,P`EEEHO&9s d;wljn,?(uk#cU j\y#f0‚˜/>=Xwn1:@{<>@$H<8x|΄u9j ʼ.N|\zSW<@O^g"_9/ NQB(,Y3~iRA0~>Ĥ$x¢ظ8s(~HKyyG Ab@l=1Ap_`>:B###MF۠AP<@$f ,ºx<bκjyh"`mMmnn. uswCBB@zWUUj)ϘuCinnnPJHpbnJ(J<.Pj( Y@-_k]E}uǕL&*f>lƁS!s@z.]d߾ _'B.N2ٳ!e"LMM^huz[x5;ݰa(cǍuttƦ&#hs^~#/Rpɓ'#Օu* 4GG'J*=-پUՙY%V w;Hy A]] L-+w6Ifr d5Lw^oii!)lݭh4`7X%:fsʌݛ?4e`0x߳E~uU7Ԣ1k^> @JqX<UU?o tv-0"dmZS"vthtz@pO$srra>ao߹ SϜ2IL{(BĽDKS=V`H%2Fݝv.~)7}9FA_-`Qa! +zlO/,l\gA;PVkh[c w(Xv~~HQG>@ރ+Ve.XV?#zv1jafceo .ɽ sXiCH+n)+eVo餱EJXW 9T!C9]$cW :z {,k6u'R@K jսQ<"s(J%=Nh:֪5M?sB$0 _S<@D>@+XYKDqݩEC٘5H{8:qyЙp^}2K]xz{{{zzZqMTM9_&08/~?O$7UWU݇@0qbtه£`2!UU-Ȍ >9sÈWӧD\J|nwb ('SzJU*➽ĮPTr~o|1F ~jݞs%FBWW״$Nh(| D ƶàB)rQ'|4(JT3 dQ3Ršpnk)Bm\*].ׯ_'/"R9ĽZ`mwDs<@3щwwsy-@Vԙ3g {1PфtiTJ*-)5;w8p /"]~}SSSMM?^C)))SM7o^hh(|;yȨ($۶mS/*Z;k䔔 6\v->.N'''0@+g,Wgjʏ?DR(6 /S&OcիNڙf VSFauUU?m駟ijn"}NZYTl,KH8dݮD"}Dn߾=77T^?azzx* LP<@s* 4NO?7g}#DGG駈GGEGAJeeell,R`\* J2E>rHʐHu ZWޱcGJrQ@$/^|饺ںwF蘐hAٳOfB,]Y̛M~QP*)IN;XXjfu'R*,Ъ5|t=}Þgo}Q T((ՍaEfu.,EMt{V(r05:9MD*,'11qƍO=FM0 k>lAiiH,h#LnZT\w߃ j_V={b1ѻ,*H >]obRRP`}y:Ng!8?-<E}1.\El&(;x|||@ĀK,9px }ΝW!eIcǍE)ÆeLM d0x饗d8DgCSV?C]q(UƁA<ρCͶ)[`C lɐ6gYB*looGSM3gzxxt=?$>~ߩguE><<466OH8gx6KBw DyG;3Tm6C_\OrɷӨT{D}˚.aCyyeÇ %7asdD ̃91b/1n q p8[L&S%8=; HK d( EN\h>@=N|g%myY_&I^BƱCV)qΖ^,e $(\QKD_T>tss#(' H1aS Ʌ!-iAMٹZ{K^29$  ə]2,Ba'I-EDy: TWVP/nRyntv\~L X\ζ`4K*.[UU..`>ͽyy)-eeaa}*w*:dԻD`2鳧 Ԡۆ/.?ˡH 2OKط9={r\!JJK-˭ki^v(i4 U[MLNΙ3g*+*oQQQ+Fϻ˽vg[m6~'|F?(ʞ7:yd͖ >;⁝Pj;:W;IChwG]Eܳ+g}}6y͛7 n &-&j0*(#1\ҡU)6 4dTՈfx4 vfx̘xL&PP DKS?s)<,| 3V?), NJ" vGo?eVöhIOٳgyϘur(9E@ >14>>UTIc zNSv 6-PomnnNJJ>}򗗧7ˇd0׬]c_zlZ$`]Nv2P'55L0>ҥ#G@qUUY4 J4{Cه fO1\ts>,_YY7߶Q5nܸ۶=z0|5k, bG_{{\v <rHKO3f_ޞ2yF}m04 _H(8eҶ}{3ёĺurs%ʊJOOB(ׇ_=I^Eue^oh *M!i;lA;wΞ5+6.nڵ>ޟ| EѬxmWXv՚OhuzpO׬6m6|O?*͕+>o#QQ ɓEk999̊.sN3}> .@{M71|7WNe僂G=w<ȤO 7ȜJ{}媕̸\Wvvv\L$ ix> )$ZA놠Q~bRe 'PK=fs(.q:yF3ړbACnAKͭ`7H$ /ሑ#AeFGEo@pt:ӳv+ƍPa/okƟ7BCWO+Ғ]]]{_Hph5(:mw~OW~0.>BPpPK ͇y d`2b{\q^8n)_QY١P0t>m>l U(Sll'x￟>}X a~~~Rd 1,9sҥ`)i4FxD[YiY[[iiӦmۺ!@@)JeYy&h˜sGTF3gakk+|XXঘ@?s…[i߸íI%G]U`*>@P+͛7/?uv:I!S5=]iSAdd`QNЭ/Y ne$z*:::6.`4,Z&Ozhw7W:Ng&yiN qb-_wD4-`G@X]lޭ/E"8&ܗO4l4jdGiqhܮD=$k׮]4k+V [_|9yWl2_.$uNN.`8ꍦk@v O"B24jDÄaf"ؼ?vF IKWGmR7['vW1woWjb}XEEXag+jԪ~GŴ^a;|GRR4cW֨oRmU5k]Ծ<~m'FcaLj%ʍ)T;o/n}(pQTX*&.;H}{DK*jTn8F d$$$BGaϊrk- +N7T)ԣR1'ҖAg\nHrmikIc Q AuwfTH4d.r8p;`c`G6BNg,v4jIR)^G$`zZS9D<,&55޹Ci!Ϋh%U>bNCZ˝kg{v E~YIZzf,/[ :082=ݸvy.J1l=T+1P)7gvRHrZڵpmayr ZYȑNy\nKiP76-ܦhGw^Jm(Q~FL V< \Xb\2Jqa =jj%mnNr]f1\6pX(yxXkshO$2R*C<|GG~{[GIi (ЇMxTwB0$Dy~!VN}I%uO,3C|v$~!OEEdJ:db&P!bNgr㫪W\6/\^*LJuP،F9i!`@'u*Y7)0NvT)#y ̃1<ۤ7}":yLPcC;ȻQ`l4ˑsG^+\,s+dTGDž;/86W3ZciPTw[FxI_y@bfP HY.!raaRpEѡ,,i`4'$899tP(!!^0quu˕EŖ<"gέZTt`LàW+-1 G~>[k,>"C<@xL&KKz?.-4Zourgt4ovNQ&AȆqK汙ЕN4brP?ULD3ro`{]M/<鉝a3jɼf4ɮNl?/^lM;:]cC?+3nbrh3c1i :>r-ń86f30`8/OM/U?U@1&D(U@NΥ&5<0vFWgyL:EZ,=Ǯˇ`P~;=1+UĮ@硘X&2@V,`!X@o4 M57K6*asxƤm{(,ms uKDј #'Owwvgvf&Mzl1'lrI9RSuRAj 6ѩscUsϩ{+3IRr<}4Ь>P4 ^dEAc/\I+%aS]nxWP||eZZ4Y>o޼LˣTI"`Fzzdc0hŊV/ )p >…92YN$iq ͒MM͓QooL.t~UI?6s*iwXyJ$P z u:Q[[T*9XUUOZ[[aN4xM&6oOҢPĢsƈ:}ڱ^ cSkd x0TFeCa f}?)-WRZT7ECQ }("#WfS_e0{?z:0#< hPKX%P7H5:.!8=G/=&[>=~I5][ uꊦWV ;'T0=n#iC!X ưAΛ%~xb`z}_k?[I:i&7../ԀuDg,1\ħ6ęVѪՙ@$t@s8x&dHU|A*njvvv -#6>oQ£b0ٷjx;>V.^XWWNTT׬XbLkr:?aVUWAz'^OxHv^C_\Nױ6l}+>M7edt3ga4裏Xs݃b1@h{0CY 4֒tV埝-Z:Gzbpy C#, )KK0:@‡պ6 m?j'#hb:]QmH"2bsaD*bTID%$ m҇ zAM|` h kz Z0`8":ћz]~ a^VOj:E!P`YnDۍ:VK,ȗzΠ7mJ3бDgXRy7 :ЁUo  H b!~ՠιP;F,lN H⤘?"EcD:!1|.\`D-pNiNwS)d`PA"ߜ>5ܬb[7J.MQ\!^23=JDBp$ɨꨯ\ <64.6`0T^ƄI8p(T3v1}_(%HK!>7f__XI *t & [[cx9ve iOv)X0tgbaEեK[Ex$MZ=&E"'#R! \Lj8_`%Hƒ𒃁q?.A)DʏsYyٺu2C5$KKO˃:ƒ(=0!w\B0"IK|J9JtJI Jc~A*X6Lzvb6\r,3YYjk8 NM ;5 eD0gzwX |iuϥӧ`1h4b\!'ª~FakAm~A>.^kׯ9}9?xFт"O?N/Zp=.Ap'(B͞={Cۏ;v9&i&ڵkW+^ (VP ;wN=, ]ں /`ʕ+׿T5\w9۶m;v(z=,6lmi m6n?0oL0ؒUJ%Lp<@!ϸyˁΎ>7+J&[5zéϋw3ۡCm݊n٬֥˖)UW^0Qx&ٳjJpn@k}|AsArxG~655]p?ka8cx.]eGaw}w߾JKJ?O qHɧܹ+#3noBӟS j.sĉ/(lԁ'G#~e p*gaN3M&v] y\0PD&XSh8$x0LP3Wc,!Regj5gP`%oR0Fu1 i8@W_xv vp$W"DRJwS9l'ʳO? {=J.f$4D:CNm 21@Lٴ$%%"3*W^dcI\k Z[Lf3:>oP(q8p\R(F￿{sΖ-[̓"[=(5K|_BxGO<į~K("99#NIe0~YR .id*q&1G ,Ke+z{ziPyaKk+Ӂ~&ɰ|Cˊ@$.WΠ% M+fTLJ81+Wd20==aCx7nHF.[,5-u$`'|mK,ExK.MHH@:]ַGߵk\ڼ \^)t rT8|;w FT97+رc𽽽V4 H$,kÆ ˊɤ&6`  +bbm6ꄄt5ݻw//.Fp۷oy VG} /._^BHl6 Dba pofhءhbZV4Uh<*//X 2;0O~ɿ?SIRZ}r}t_I@r`C \nxӽڎRD4-DO}~g⭘@ 4Vi -ث~Jssw[ :%Np4w2'#[Z'E^4,^cz"KSJlb$OLSzv_SIj2;%S';/&1(;`a 顶!B!e& tFOVq;zle:ϓ/׵"&HH*Lp8+$Ჩ9B`-Qj7QADmVp9U ïKںRJ]{-)3/=r.-/;S>qlm+\,Vϻ(r)  gzb,etBK7[GW61\Z: IKn60 qk8TjwN=*9ܸ,a`}B`+6(mq4T5wNْ5L|֊N8qMJb8"U;^Eqh/j͖Jil7߬3$ ijLp >Oz SwsXX>I4od.d&2NvLV7-Z:|.-T'4[xbYZ(tSt[M Bd>ԵL^4u 6-.\lXV A7ՕxJ$FdhsГ> â%IJB`|4ZOg 'MuX谩C<^3'.h+4ַ^>CRX:,9Cn[3PKOŌr @ʂ?)@<6R]t@`5M23miBufTghT} }H]:8`}}}RhxQ`IL3Maƍt:Hcbc!By^taث:fE&GrI+oϟXZ[ lq81n%Jw`x\_?l-b0$.(xrHalђ97u[VJ!Lj.NALLUPa X\:AA \pO!!aBJRrP*H#7w<^h\ɢ׵Kzwp9yHAs(}jUjSllsC.cRkSxPӇ$ָz^W5M& O 8.} C{hAVjjnn(`?si053=wxDubUUUx_#V׌xQx Et;zt#%}'Ax%O=NxU);mn~gߏ[#xD:n*J?uwpxHӍ6;'c<, 7rdT0,aa{t]mݖ#LcfjnనijމKu' 80E:`L ! q 8RIdaSS0G-GǺd*Gǻ`2v8rd p] E # ),|gZ|,σbC_![ BR,a+XBc ;0w\F_%|/6,)yx|Ģ< t58HzcA,4 t,ʅr$ٺRcoWWXjз:,TAfSg??[Q{~}&E ՋA17DYħA?:Փ,X/L/<'ZfHKX頓%QA~7?7Gr +gw؉>ܶJ \G/* *3SvKw`snbώt}Yɼ$Fy">rTqXxEmu^1$[~|~QQ4Y^^KBUu|Gq(4jgS7 )YI,Irĥhmm}o^ٖ-[~,Y䁵kVT\xDk7o*_椴tTO?BP/Zo[Mx$'?x={ymv1`06l~UVf捛7yTDKs˞ 755._EYlti{?۶=z`yϞ=FnۺM|SO3Yw}d2575?lj[(H3P 0!SF]_][>7N52`x;Hgtuپ8<D`̮L&cv8L.:FX_GYLn~lք7 86ɀnӜNhGhI[>1@+ܼy Ԅx0<.W(utggg8Z>RgGu2mzC%OD矃"(..VT"1#ȕ^;`졇Bx`0.\ 1NRVg URp6C3 Hijby`KK$nGal¡/BBѩ)h$ήk LNNnni1T왳AS?xP<}ݷswg8j` ӅټoppAg@=q%* erxQϫ;v_ HMImlhlРפP)׃t葠R)Z*RP=JE!LBq]iu}=qx|[uTܩ K^`lia%<@.'ZM ҥKb]`F4 -F1 ,..NIM݆caxO< B0H.[>-[> hg̝3v4 ح6t$--m箝(g0 1<@0Tf i&: sU'`v޽yfglFʐ9۴yr&Q~A;[nR /Wi#t< j7lܺmT(6裌Li S":C34C&;<@Ն<׋ 8Z98+tm^տ}`$ pBʼn?47h OiV$hIimۘ2C<ڝ#;}~GMjfh:N^ FT: oxM{qIe:[(:UoŘ:*8c}S%M: n_M)!C 3JE.Ť",Ʉ\ҜN_]+ݗɠdE}o50LB>-:pyǽE7ֵ/Y7T.W+ɽdwx܉Nyjx}ĨP" 'j0IuC^X,Es=_퉵y y#0B k U{mο}"q_^m6"ZIUZQ&%M~`0$>Gznw4iO-]EvZmGyo‚e9{u0Tnx>=Mz{uZHϷ%'ō6wkV{kk9鷏VSf$;m6|ͣ}k1Q>p'Je)^73hV! &5 D"&3)Eq5Cc]^ԑn,8e-9b%a+vf$-$<6-;вS$7 _]0X=^pE,?mιiƲTv)V֍:WeX>Y &aء7V,ds5Z;4*K+}>JT SXZ$Aǻڡ[+Z>_Dz"^cnd.% 5ܓP^zl;7*]-'{>kgҩ\(OP/^ijNyIAC&2W*GR{t \Rwmg[V(I+Ғx9 f:5R(xk$Iߓ@!h̉*4.'I j6-ǰf\ǁƍgϞX`NP8I|v61im^Rl:KқM UJ40NHQ`=:'8v:pƐǩ%zkĚidXmvU5T26-+U4 ;|KRAOwh{WC>utzFB'\X$ʖ~$fѲy2uzKss~IN?wBJ% 'ǰ>LgCsbU j]!e̓+ v0/=yLSdh^ffXyq26Cz^z&%MmyVSM`\hʹFMUtKOg_f : V&DeP 3d |_9c|Lt"jko6[|:XwZpQ jN~vm~޹g+*:1|7#]3vHW:DB ?q:W+8l}ɯvz;(wm1¼\̣Z~Da\;(K_PVҹR>+(O r( 󚀷#,;| ӵk┣ f$!d?d#C!!8+jXiħ F UQlaLKc"pP8+!NSIOmT|& bNVJ51?F22B xiC2CcICǑQ<-8Nt( % m Cw1%~-cNH?É#pP6[C<^q+q<@5od`F)T*mXxofyynݼEì  #p ]M(` *"0 e6/˷q{I>rI~Agx}^BA!<@MTT\iN] 𞬗C38]^ٽfxԏJ!K*Q$z -JVt !8" 5'rHdxQ}N_xؗbCL`0y)49} \KHɣbx;Hl6[Mp%&F9|[SӶ({82懊A=ZXMA>}AaIuϡe&A`|v&VV/CG)8\>҅ \ˁq2Ocd+Kn8qMJAX'l>{j{Gc5ýĻ 2_x{oz;/ҩd7`[zÏ|fެ7*bIJ.ۇ!=l>=:,3qb̠ 6N3$xlQ^bnp>~kB+oqFJR"|CuxཎNb P fYx~ 䆆:]vo[[`ڼy~K>W˯a~Rт"}|IYyv7 K߷o݃A2/>777F1;;{۶mǎ+//ujYYgw?ojj &0ׯALΝ;l6F ߷媕_Tzg99[n=zիW/Tq{Mf0k֮w3[juwyNCL&P}G`vA?RgO,8m x!9cvnP#Z4,ٱ>+Lܯu)|WW4_@ ~[m "CͯÙ99C( dVāӰf~=8R)q`@b.a$ɘa.YWS&'"tP nlǖHt_0})Hϒ荮Et\zzKR^ kis&.4ЄB&$zIH3n]QGf`Fd"[2Ԯ".gT*) BݸhQn}]GRRrXMc^/7RI޲ !Bu.F:t˳Wn@'%7uv᧒C) \.K dW5/ԡ[_dR =NFLK%g|kH00N]vA}dhn~b^x8?lx( CtPVGo( =_~Pza8?} oUMMM3ztMUJX[¤NS~HՕsǃ?)dJGG/~uB,y&ZLRS?!2|K/Gx/կRRSҏ <@+ X_/A~׎9fʕIII?<իV#`i/V߰./YL$l07lDx~_B0KgK-7#<-[ [VrdUV$0ϐL 1t}qŝUwNk3s+2Cclr:lfY ˘zdqitqWE/M2 n3gٳ{{zm!l/AG[_[뎫妋s'-|hKsrBmVHr8(Z4ɓ)^_!lpZZ9ED"pRc 6g(0T僽{}1޽A:QAqJhN㏝gܞ73dŘ1T E{IV%;28VBSF,8^cI  Ѕhl޼9^Sjjj}C}`R*E2 W_}~_Ciiij_gG'ܞ8eV '/oT* >֡ 74|H+jjK6 Im28Ru]C:ϝhJF苜bX/>𜼏oՌ[1C34C_Wb&ϧo1dDb⅋B;.I360,_}v<.m]V\jݻwAu )dΝ%N} 6p9\R[f@frL&$V qF.P_4?QޱcFgݸidV޴y-[ <@`b?8Vw&`A,/X !>$!<Ê0AYo "ӕ>w\|'zrʕbxhOCaYV ~^4C34C_'y=T|*P79/i]z ߵ:h0h:u_TݘVD?S*ǕA *1nҥT3@+ug-4jf(Xl+[51@D :J*)SNK'I<K`{6赑RMs+͊t]P8$WnZuAA ZR|_樭i_V?Tv̄3ry;>}ݲq#I*l%'jӀyrIV*!(F0_3jb՘uѬjC$Gy4yk M =pZfӗ:lk k)2#`uzzT U(vD=d20Pt:&Da?t`mMb2hAVw{|K MAl wЩ&5Bs5Hj(ddPn\'40<1Šu0,[::,@:9f3T*\hX0;2,:J Cc6ۚ{L|o1Mc20>}Bʅr lszYL 4'Cb=tcQ^$R4*e˦FNOZ [R90mysFJ/,tl;-GBO niXZ|NIqC cCH{2HIP*z`2AZŀKUmmmQF3:* ֬^ @&94ġ ˕Hz ^YmDuث E$׮͙;w­,UYm&%0).jF[H8\ C)״taXR1sEnŭb&,O#X!^@eN_մdb&H`z&@p:fiQ+ABN^j>'UPnq *9;CxuG4>[Ō1ήN/ }ގ3orc3`6dӑ<~}ykH[hk3g:Μ>bYY뻜ηzW_ {O<m `?/RN/غmZ4&XD (3E#cs1h"fv@窨է%`3iY)\@9ݖt򲦣OuL) ܼ ! ]Ќ`fu,9 ^!VSjwV(_7۞LbFrΐUbBmxcDYc)zhv9}&t@`vKzؤȥ8'zzG[)(/~=VES_/bb^*V]]Ɩ!{OaxNl6fljRt:OׯsOպu7n𭲠C&B!Ix6LL"6ppRFiBYT 5/??Te+AvxɈcB]&9\.7b%%^BO~TzO),7 %q- $.;+QQ?`ߎ疂_".dxBHq0prs@bu`8xn6NƂ7IN\1Ys]D yCf%¡ieN0P TЄ.ᐐjiQŰX&d"NɆlO=O5$$Fao,"`tJ CE=z# Pu\[C /*:WN[5ҫnfW{#R(BrBu3M]4{,0 :rP}@- peݞ%|<~U|mfϡ% ʡIRu>͙[矠+7'{pe ̒$FBFr,Y|ׯ]x7۶m;z(\b0k֬/]gP ?6lGݸ~L#>ao6@N}jժ*U<4effmݶȑ#!0g1֮}W^o6[~z/~n7R4:G% .|'C;J]4 r wW;Y:ɈEbWlfVn(ڂmE70ُ9L$;\2 ^PVB!hZž(T\,:0I᝺g f kXb$i .9]ڻL<.{(yk&S5W&aaY4D%ON#AM퐕F9xz"zcѢgn2YthN|(,>: B8(.O'4lsߨ3I(CpԨ %WșKZݧ~Cٿˏ)VF FU`ꓓ5&sss808`j"S}`3v vn'+Ç7n܀;:;]nwIIRpX=[t[okǏۻwի ťKk*UCۧ^z*HmvpI?!REEEuU֭[}v_P h-"`H.ZS=O[.3,DYluw76+}F$ e+,&=33ghΎ(IR20Q!,!ωA8j\VjN"YXaaF;1R͎A cD>\UH1}qA qQ Ixb~0d'`z OBJB;$N~M4?STYoHma87S(~ 9 F&f:P~2SBW,cX4wZ<3["PX>VA8&+)W̖d`bc% }]V<% H$(*bHSTFq3CD&j5Ӂً_Rar{q<@M _6`ll,؉P<@C=e's$?AldkKbCHD3229oĤuKMI1 uuu׮_{'^J]dQ!,S_>Nr$ࣔt1ķhb] y8.NƎ @H,5\_]ѐȤ_qTltx 5^* Xo*{? ŒKbmID &T'[#ۗ) YPˉGZ':%#3fx405I `FA$W͌!j%~l%*Lj|%*C4d 1ޮۂ0:YibheJMM7oqJ%B#Fy`!*4JJB: K"w DHKKkhlh0<^ 'N_яfdݍ~'*0 HR?% |\~~(򬫭p@.ښhoFzxk׮i 74|HE|-CHO7PziLҥK~232 F,0̌LY/1]8l`Dƿ}'^NRqw\1u-fh4U1@FTyVss38"8ia}x&0nkwhݺu'Oi)))<0 7xxs'߁۱|y2JJJڵ t<쳷nnItkσC=l2znʕ))X r pٌX~AyE;.\8SO=W%0BHyƍǏ۶};_b ,{챋.8!M@Y/\-Kǎ֬IT'nݲ,^.i.UU~7XO_??A34C34CPyyy}TkF2cQ 0yĆP¡N>Ovp$h3f Yt6L"cxtg1$pXM~R_{'n_ڵ8v.?^nZmvTKx^7_3Mp,FYOτjDBU I} S%4Jth&2NgЩ;GK[g&#.dEvWWW?ǽqݚ_&TtF>D#a[UM-T*5F"R!hPUr-6B2Q veɸ^0W8 bq2ib<.{Ri=w /@Gg/؂iH0?eKu㻍q~r8o' ֔<'au7SfFwܽ  ?%r|kN$O2㋂B׀ :rvA:#'Qu9wf_'Ϟ@? e! ="Bh %𛆆 QNvO_z^N1@7̣Fa<cg00{?:u1P4H\p4_e;HV,Hͮ߅/vĖ*+"v9d6`Po=E hFXA'bITadh34NCa 1 2(f ~acLh@(zKm }qx@;qÃگ.)%=#Tc7"XtVL>\H:ӄjZu&lVlդG `,F3Ux+eeVK9ΰ%o@`2HdLŖvfGsǔ+& j@>-%8|_3Љ {p^Warr[w]0\##ӆ6eqez=v̹˵bGRddc䲻I]ѯ&=[Zlf¿׵8k9lvXƑ M/NpmVm;@cR{۽ 7*R}F })F"8w P$_x F%s":3KD"!NbKf9C34C346Ѩq*?$$$E\ҽ7o}^2Ki)'W[,Is8=}^4d9qg}W<^oSScgG4I+Bf `"z4qq@JzuӢEs9N$IRC*B #jjnW+LgJյwƦ$Θ !Y52iL*a vWii)y]o 9d"}N4BOsp*oi X&noI\6;-Y#wC'W(KJW:F$>裏su;\vDҼWs,f1"s*ʝ8-JeCEF<27N[z4~/KEYJg;8ҷջ-ɖ{b10r$zzW+! @h@0ƸnUk{Wkp7Paov杺y杝yt~ "cgͮ+,)9;OכJ@T͎ή!M +!8$KeRז@nQ؉+􀏗; cD\Qk!";DVܨ46w{TQ]hu:-FfQTJ_ziUWWèy,(>Dx)r7t OLFh.NRfFF"HajQds8܆.;MTO DPR'G{g'јChrK2)ۧ7ru=M1vHվ#$SVY\P*|} ĩNΠܕ{ssSOqvv"÷qB{ R l}RE g,{7{V__,]UUY\\ze[@KedwevM`AҖ-[, -UDt@q).MQ.ihۦڏx7L&2 b/1fr$q8x_N?i{b̹zY1]55e{yyZd&MPPpE8ں.[hOIˈטNjSA٠qmTЩk<Ӡk(Qؒ9!ΙL&F7e& ?20%S?Uw>`D^sNɆBFgٰ矏bc & H*JZ|!U_T%H |hʶ6P([Fcg;aժ5WՐ̙KJˉޘ4+'""ΥS}#Pf/*Ŝd PIuzWۗ_ 3ɜKuI665 |*?D -萴YB!֭By@Rr9v^'/`Pa~p^V0cY9Yy蹦MwNkc23F+\!At:dz m<'h2hipD^$ɄT% 4*aE%'bz8^ pu{,>E׮^:~s JnAo0Yd:8ؗw[x1{)~BmJ*\\-DP(S203.RYjZfJJF nS2ZZӰ h`2p_p)/}}z nάw|(@piY_ь'-*)z.LyhLNIS??ń 'A328yOHG.W?:jֲ 2 Fd0h5:50Qt)|=߈5frXTsIt >JkΝ>k4=L7]LW/_(&ިy9Ć{LvЛHp2|5J%ǬAy,-N*Xg Pcb>=Kpedf?w-[@[` 2 C,"2%-#̳9Dt3h4ΤTR`z͛69u܄&oy"Q}]7\@KH(Y)pǘ,44di &s=3+z";d2 +W\V)}l  4AN'v%N[.LqzA]E,  bb$#bVvΕܫ]>f͌Y| \;wing:ivI[%m t:%bfL4 Ep06:sF4;:tA>?\΅3r7X,9z",4Zd0#R`[CdPWs닮U{#$Y{#Uχ`$6ӭC\bEY1[=3W")~QlOIֲ"+{UchήukWժ )$*,* Q|9!oaY`̅"'O2 _tgDRBfўZ_[h|Ob2ppqvJpK+Ud] ve>G;r݂/OL׳8 0i>8HנfD*)-=sFO?[Jڳ{ 87^R PZ^ce (ݾ zly$nnn_oEb3,ѕ ѣ'lbPS2A (ԝt6!.w? ?9>>7,DŽ`Ӄw̫<,!LHp i8HhI?: +-b{B0tzDPRY,ЧldYPidJiT0wR_2}rވԷMSyuLi{FTIsCiSYaA/뗙6O#8~8 1Lum^B-~ iYxcKӯ[o3Y+[LގZzqTT vv;4Z0l. Zf@DŽ*J"9D#6b2q¨_.W0$氥RJq?h`9}&aԥ ;تnTVQɠSEB:fy[;:MP^o+PM^&\f{@j, Ԡ.P`'[TRXjo0 fmlM&S{48^4.4 ͅU &y\JD{=h;mbI2D:K(ZQ(a(Ͷ>Vqy7acn*2m~[>ӥj9Cjd]r E?gzTk*A<4umĄ>Z웫C50HUXb1q\ޞjIX_g?G?tƂ^np)N1Vstqz∀FpEbF+jkd dʈqFmmGe^oTjZVN%0\.hatU۬r?R"j4r?Wgyy`n.ΣWTedBk7D1 :x#<f<.\E¬ 2#&μ`X9컃QEti%ţ1DJZƞ"i6W؉SW"ȵr򊪡yBGg'k4|UN+:hjPL8PT]lStZ.QYhB+.\HeY/ٲudjO:SRRjR}X?qי3 ]S)ҕԴLm, hWEM3;oZ׿}ogR(7 4Jt0/ֶ i\g"f1DlnsFL.:11~ztTsv2s z҂DZ9IL߾\va_HI{ 11Ӿޱ~w?@U@B@W6IF.Mc13+Rjx h,)JG>Q_b4Z[qH$ɹbӦM[[۠/hnN Brι|1rx 7Bi4Dv SUURdGG['Μ3 h ,L0=::R.W)2YӧYKzV!cރ$T#+ZiuЕku:׆Nj> XfgcG&'K||X,&r [ZEPHL"iuqq  trrqr%(SO9ru:]hHBAegDwtvUB `tuu PkW\3 h]ɓ{ m -4$X(NWչݱ`$QWpAΧLcCMb(LXX0ͽE93t8.a% |8q @z@IdRA]{B 'A'j=bmkN<ܿ\f?1yb^X&ct]qtue]Aケ}JQlt9ݜ/iWyCeeuQQ JUX|ϠxdS 8*j}-?*..O2iH-+*ZTjUrJ:lRHnjnrJ)[R->)i*) ,Vfce |YZV~ę *P>v4.s U@_kϾ%e@Xe(+U2@{; U%իMM$ϐtJ7T&6+Ch1 nV_J :AӛL&u;,~ Phj/ sr؆dI~sJpU9]@΀ӣ NjP]_֘RT\0@mmoNOϺtT*vEn..sfτ zF 菀0`v8ِ J`Pj6EΥ+/h<.HdYm%?uLXZV pl4Aqv]1Ѝ:Bl^DO  @4'֭] גEwOZh*gdA@eK>g>-Ήa 0_v%r ʀP@1ͬn^[kۥW1,xPB{{;Ta(EE19 Ձ=x]5p (r.) JV!F[x{y89g<NߡUьtzAg۫Q1-Z]SV b"Zةe:lFe :8܎5q=z`-mF +5^9t 2Lo؟GAy?,bϏ?upk3+hΊK̞"uF yۇR0> 1(bA)[Q$d#* W_`m͈NjøXTs t-"GGA%jյQWtх,~d 4(bL#grY:ĒhWi&mQH=lX*=5ň Ak5cpv[{]` k7BxdRxi#(EjQjZ$1b,?VhTZnHIMO-nB_̟3gų|r v漹$t_-\%(sbge9 ~=A5sG.B^zĹq_=F2AY{)φe 6h  J܄96:!>6%-czNgGFKAO] $ހw7S&O IMȿY ֢ܟ܅?8<Ѩ4C-ţ :=tE<.*Ƞ3@ƣ?AkgқQuNMvpcO)$7QALvl?HV$rB'ye@))I6L2iܖw3(.SS52 &T'E.Y jiC¢a!PI1Gx0Z`\IQ>Qt;=tvLfg~M>}W<.\=r2twZet \wƚ1EVsL3 Ks,対?<;AsRx.҂2s3 j 7u^T _vhqX}+z|yYлP$qO&#965)I"E%w{,2Y!Aj2?abvV'u MM0WPwuFWs"!~ a=W#b2n-(!ՆA_5"x{؎ͲU }"}Nx\JΈpM_2'g%!.vjy;drُ~z/z/$8FϘ c'+~,}%[Up<44x;{-L&jRBHWZFC){@>ZKJƻ%}G0ٳb'&_HIKZcs璹\s6BvuIb}}w}|V\VTTBcJZfQQ1ɼ3{ZW߀ sRln/O~d^ϽGBppK/l%NC >w!",,(|?T:::+%{z$ @T;ߣVasժaoh=zaCjkkg&>{Rn@@ܳ$,?Z Č&$< ;ٲE'1?YXTlwfJ(Rf;MR<>n֯j`w@y gPS\/OQ{Ͼ%KUŒVu/= ܸaFDq+}ٮ v@$9e'L:qbBmiiHkU : JYbEQQcYY@zzzgvS\\]i֯G}嗸Lxx˗gΜi2pGZZZWgWZzK/P{1~˗/t e'wu떻Ю'A`4|i]] .r.Sh'z' 8debG鴥˖#5%U*̶' j@$ioKʡ|g.,]4~hֶk/Ճ9tl ]]?j .± |! 0q |\?z{O>C#[clׂR!\ӪT*Ik'FP='N VKJJ@a:L&ϟ;opy\;{rni &d4Nj a޽&L@ ݻ H/^rsZ<}}uigΜfml^G,fXw{葍7B~ܳQVC_5$4*kTTV}nZ.W,57hTrprrmjiz:Mw;+5n0b74ǻ%*5v"Vc~MFboL7B ZEWgg{{{oG lGٳ@2nniNԩ|gL 8ﭷҨ@Bżya}YgWWCCXVV֑#G~+SN>:b===BBBMuh:/Y.O]N4Yx3谱j[k"hr1謭A,6wGzA0j?q֪cMd 3HJZw? a*iZԢxD"J>=m{&N,,,ttvBGY]]=gF_ɓs( ϡZCZzusKKŜ!?hv=/&f嶶.,4?aK1e/k $.ז: Ba2G dvd~H:k!Y]EL&` *`0$2NgHfF#hTٳ͛AOϛwуVTVΎ*--UI ́}|}V\wիV~,h9sbf@*gxGٿo?@" jGGش=;5=teN+c 0^ulVOQAX"0^3-:jj>95sHU.C"*J?z”7&p0{~66vt%:CsˣCtq˜9}nt̙.=Nt @0'ϝ?iqN^ZftZWt Km}h4~gV]vooo/VEyL6 FC}WVB po^.] 8p]'%MC?X,A0<@aj陑d0yrDNQ: Ó*/+ر;W{w-[fD2/1B\Q^Q\35%%11ˠ?,ɡHpHN<~3 @[R7jFF*+AacTNeNKKO< 9Awuօ}C/o6n|NTTptBُCnzD#@Ë{|񥗆%o4 p!E[N0c} 4_ٳg{ 瞻x".pÇ]zms7A #ߴy{f5k,(7A.p,Z{쩬H ynpŇڽgw``V;;vh5O#RZ/0=T ;#aM41 ^7ta@մZ(a`Гdr!{X0o^ ӵC0+̖,0 +W8Eer vr A:'R`2{ɓ'le0J%x(C + OW(jCh v:Aђ$H2R(t;Ah&0S qN j5}:N=@!f!nwv> h4 C=PȤ*A <ƨ*{555>>5ީn]o@zNow|?\e4VgBooo)oq[X; fXn9#Nw8f#x2[ [k/hj0~鹷җh*uo.L`)qiL f ||_K(4vPp/ 7}ﳔs(b 1jkk5hT][Zix,TI3"mX2;`sl9@v v.* U..t4xȖrq%WS_\!]?mxך@7t`S @X^!5\TokuRuۼAN! jګBx|~QK4Iv}O! +WR?pGo/߲e[o՟d>x vǎ<7z ׿em=U*fx].11Zlm3fvo~!&s~<'OW^(/OHq܍7wvv~pG Fí[D @0 hAAjP&*.^ls* (d JB5a*//[Lm۶M|!>]$,(.)' qqq3gD?|0 [Fusu[HyfIIk wtbv͛goo_ZZƟd4c,WȡťG:TXXbJl 6{SSJwFhX%99ˌ]͵bfXlY@` m̸C]vbښ4sx1*L 2B Fa] (ńdsJGGEE]ryoڵkpJ ɏ{~55EEE$KGv<n6vΜ̌ZǃqKZZOugsuPzz9rx={a\҉:522wb6 ~5(6ą(_ (5--!>aرcwر(*%%Y"#  ^:sFӖ^9sëTv\茚VDg St=CPe~+B쀑~|Mgggg~!a])+/y3uC\Rr\.R(x ]ͅŋܼ;'NG\Agwpjll,.)}Ԟ{5kW*]Ү6@;hu-V@W|, B]| pyyy@{֮t2?a„ ɠV)9@<{Nv$Q\u,Щr,Z, Ry>DQ* z@LbHh˗+oq9`6&&iv3&pTŋUUb@@B\XS]#5Wff\ƠDe0._4;6hn.lmmU(Вt:? ]&o޼I2H!SZw#Ơp\adw'O:֯_ 5kSOnvswʖl6>zk:hިoI)4JtYge߆q&M%܂E ? ?e tV^n`tvt8(fwPsurnUݦ͛<-Ǐ߹sStŠ ̟ڀ[ٲeFςJ#as֮[  i󦬬,}07yǎ-Z?> Bi4:m  0= \n͆O FU[X93 rW8J0MUuSmP-)K,m#˥R:NQ4fas82 (8 (/;? ;{'1Y˥ g6كhAuyaAcftJ(y.A';`H:º'֍Y^&j$soWr%7w &8'~hw &Ce[}ZivT FmRX|ѭ3v8 vxv9,8uo^E&;q:{Q,M/vMQZNabH|"Սw=i53~]b c:`'|qzG|P,m6QGpV۟MN v{D`2Mѷ$@cԹ E޽4`_0TwM)K&;y qL ;cvuW~ #۷ΞjVZF?ww+rEl)Fv*9@< J ,^H+--=anbBΜzlKՐHlf%[~;c9eJ2!!зefd'$LLN3b$>>ܹs'O/Z{ gvvtFDL ^^AfΚ  C9UUOJJXO9!  P`!v`LV`^ Vպ<ÃB'yvkE,g;-gev%nΜ)WsFQUrprs8:8DSNi47wv ˻qST0ܽgOVf;ۿo5__iQEGm6otfF=v 'n Bo_X϶Y?}šܓn4IR4vAY$$?k֬g}_~%bo&.`ɒ%{s w|뻰0OOOKbAve>8^x~7#fd{ܝC ̵K; R|I @c (;~JoP(jOUy(SQEyIT3ڤX& ׄ.<hflAt:Ntֶz(6cؐ da2dc)j@$i3Tq̅!(h4;8QT8ؚQ)pm? vEm4W={BB_[S;hc vJfMRJ  mޱľmkmetQAN;SIQ}Ѡ09| O2h4RbP0c4.7,yAB,')M4c73vρS#&'L\N0΁];W;k-uu4m5ÊtEFh jڿ?-mdc' ħêKZ̿yy҄%@˜ttpv,IUP_:=x+FB7oy.܅1=ybRYo(=oN^*j˒?+/>~xzb *0U+2IdšOlfO{sӂ)^3֭۶[Z;8:ؿڵk/Mbb/aÆ˗/WWUgfeBb0_|?"hΝd֭b>!%m[]rb͚={6/"$#D۷/ ]vyzU!ۿYn݉' k-[yZ89@`Er8S&~3;̟jۭF&gO: T}5L1e Tmm/G.ZN(TT@*ؾc%sN:W^qvv]*{~g55AP_!eHӠ͙Dgҋ/_Kq?wbF^E={"##CB*Մ QqqqžO$@1ă:3LJz>Ñus|a 4&x]]-ĉd^ >3ld1| "$R)^xyAzM}n&^_RZz왹 T!e'2z]qIsg<=f@^Nsssr8S&GDGE3n2hjJ9lò9e;&+K+ɖORl12)MpLh @I`H9L%І&$ 2I31G!4$SvZc1 4uake}\AI^ɖ7k_o}iߧog,'wjڍO| | ,2s[ֻܾ}ڍM +BO֕˯~9cDqž‘"nbl|R*h3!1mtX|ʟꕈ[ƍW9-oV`Ƕ @ ^ .Bc{x388ĖɝJƐWɕ bUZIUBac+(S[op!ˎePF X,f?K( %I-!+A J-QFc9-AVUה!ww>\9vY'ksRQS J*(1^Qd% i0zٮ뫗2 LcՅ%Oűp`Q3!4{S2~?$'`h%̍7zABud"x}}\ 3_1±}y֙/\AGCmKu]!a*7?G__.uhH8`:J۶usl{0<V;΢ŋ >P!OMv }B=`,u,xẵٮAo[dtípYAdx>ﺁpQ A]QM?wӭ==$*UW6#a LRU^Qa}& A).cM_snvfd`5 C.>_JK ѭO_V'"Ѽi(40jX#n[nF>?G__pkI=\`˯*.n %8+Nh=bɋ|tjvGƈMөWD)cDh0YGo)&ovTd#AM\ML$V֟[68VvNs88E bOfw)L{@F2R">! D*OLJ6tkv:$dGaK))"G7i 1舗tHSJ,=5mVƪvdڌ9e3gXؙ:mGAx#{+  w0V! k wDBCC>5ߴH ɾ=&5JUFVmA-NXF#]ZZZI[T*5~񎧇nniTh4d w*x1 X_ =lQZvCbMplHH[8Z,,BPU. :|TT:>₧Gp ĹhiqI@+>vbA|"E}~6~O bwn7+*@]َY׼=+7߀2SphXBW@+tI d yDj$XV\~^=6@R%& -)rJJO;e H!#;-oyu(9p%MΎ=QOddD~NVbb<دY@'N 5c}]! nےh3r]YyHZg]w7>O >K%?jup¢9 %/l7ߞ칯s&JSB9p/EQ?ܼ}9 bSR'\}x Mf3ϦkA|*d r-Y3-|NRs_X _`#x< m 5uM+ ?`/월lܰrI:Bl&܌;쳮Oi/-oF&Wk_W:qn޴U ~$}kڵ2qW.yON@$J__iqt:]{ٸaoڰ+tSݧ>OS_2` JRS'A;qa.4mBB:oS0qB Rb+i[~7*2ҲbǯZ̺fTy9ָzR"x:t(^&M @Kys]egʝ4Iex[u2}ʲФ5QQinnJ Y3$ DGG/?R|S՗kj͝m_CshC#V6Κ+WΙ*E!{^cXxB&';JQrbOgIt=/hTD(NhSиxKjE@~%/+,`P[ʋ1 kJkLƍ5 T 0EBLIENDB`flexdock-1.2.4/docs/images/ghost_preview.JPG0000644000175000017500000012102712177715062021636 0ustar sylvestresylvestreJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?/-B[X>Y\h4;2T0DQǧRs'1Xb 2HuvzpK:U<复uP_o\x?y^I/>nZQ{&*Ko)R|Ъ2G)Y~d<.5ۘk,6֫+iksMsKӿqŒȭߡG_m~Jt1'Xis!p pH3׭VmVKj],~i۸p3z#VgR(IߡG_m~^Ӽ/֩%ݍ8H2emFXϵi6oS+A}([FWҋ|УJ/B5;ɦNXN%HfhL0_v<+5֩-^3 #I=1W*o䉍I]&Wҋ|УJ/B4$ĶYKy.7r,zO7ij6fKG3(2C)댏~Zo_{ +iE>vQߡQǡjKo|@5rHF@'JmƍZ[6m2I*#{]徤QϝiE>vUk2NcskSωpqQUj,М-4;o(ҋ|Ь)rQϝiE>vVer4;o(ҋ|Ь(AiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~QϝE9M?( ?;o+29Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o)?K_+7)ZߡG_k~fcڌ{QʇiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9ME*3C$еE~{6؂k£*F-u߳А+Ԝ&4!8&̓ߎ0o9U& CZU%Y;|ϡ⥸ }+KBm%}?㩕ZW]"M&~iN޲[t{m~Z.sf{fiZ8KBO;Y-Fwswn'"av 9AZ6+[_ﹳSJWoٯ_SriVtF\gvێwgi=O?o9ZOvN&3d5m2Y 9imHdS[>VeT➗ߟe E/kRM+O3}VAZȏw^~Eʒ0:799xOJ~Mp'cʳzJ+hcz8(B7wm1tBKeS"X5ԋGK9% ē?VOgZ'K@TQ1WB j_U{XԚJ-ygBUs:pnqEhCsԓ c'i1Sr{6d/9=UAhV ܎$FLmld, )ا4)_]Ce$4JfeiBzVO!-9?oV3_*Ww߫5Ld`}g^е;X_WmNG-ޕqeo1Bp8Ni)-.-4ZQiW6|ȡٶ$ c 1/!-9?oVe:rV?Ɩ%5huO6ym[Gܱ]Vf##֯_xLm_ķKsqqqR| F Q'?G&/*B<[@s1U[_3_meVduqI>6Ҽ.L,Y~|=#ſ?G!-9Wa^*3==#ſ?G!-9ꘟqyy L_U?1?==#ſ?G!-9?0?zb9{Q{WGG&/*B<[@s1Th`~T#sL_Uxb>GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gh tbſ?G~A\O?Gh tbſ?G~A\O?_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?⏅#ź1F-tJ5Nooγ!omhхY׈]v9f>Y@V' RVQ׆Z ރ[^ n幷1(Gn iuo" k %AE$ZF>w9-prOX;Z_W(k+RrzdKoqe}&om,wYCe6M6궓=q$'͍׻xOMB_Ho ySF?+^;߹sVK.MLSkӵ 'KUuw*l23Տk|=DY@@Ϗ򳝟8͜<<ԣ%$i/$W{j5aY-Oʳ X|3^+VK_Zǩ@>ϩUS>U]՘ xڬLѩ I%@;96(*8Z4CYTI䷛Zx$HʖPlF@_ *egFr중/iuͺbK||}w|zG?h xu 2[h.cc \M.R"Q̫7uYVK^iR+iv 2`r ecB 6|-yxnG#-%,6-~j/BoitFh="i+q ARm6Wz}qk?сHDU%sx43}3jO,+V%6Хs2&o@鹲hK#Uk{+soUQ]X|V 5*r,ݗ%,ݗ%M|}i'Cnqq 3o\k/kgeDUeDU| 3oG,e_M?DOv_v_?fx-~"jwtVJ#0??/Gg`/G`/_6[E 3oO:u|>,ݗ%,ݗ%Y0߈?fx-~"hΫ_ Oe>eg?2/&Y0߈?_>?"_*"_*l g?2/&DOv_v_?fx-~"h :u|>,ݗ%,ݗ%Y0߈?fx-~"hΫ_ Oe>eg?2/&Y0߈?_>?"_*"_*l 6>?v1 @K0igU}b'_eDUeDU|xzE'@B00!A D~ [Gru 9%${Y2قFG,5|3ϲ"_*"_*c2emfQD$l9קiO5ƶ"2Z%fcT ~ɉ,>&=46>e>eߵ??7\X_r3d}eDUeDUP^߈F<}aϹ}/_{#Ov_v__%Ť  )2G){9}y}?"_*"_*)`iZp؍@/uhaMX?/KQX?/KT?؍@/tb74heDUeDUC H)U,t4 ?PQheDUeDUUO'@ZE90I K9e>e_Ff}|ցMX?/KQX?/KT?؍@/tb74heDUeDUAb[,Q3S,?/T!ݒT}Ueߥ ?,?/R5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/VdKi;%(Pd<ڝ eDUeDUr!}>a ڕReRHq6pqg _E"(c:"_*"_*_J/"_J/"VAX?/KQX?/KW-jzit]B x /^j/%?G+,ݗ%,ݗ%⫟E"(E"(`teDUeDUsh_Eh_Ev_v_}T}US}Sr:"_*"_*_J/"_J/"VAX?/KQX?/KW? O|EQ O|EQ>e>eA)>A)9X`/G`/\/%?G/%?G+,ݗ%,ݗ%⫟E"(E"(`teDUeDUsh_E2[ay_RY2pO2h,ݗ%,ݗ%⫔8dSncubel#N9Y&u.Q6#r}UbHt|yx;'R7) U߂+:OudzKIg>+O~h_8wF'VmMq@ %]˵lC3g8d &ڧj(Eq|=y4W+POe?#S\[O"գh&KhY#m*d xI[a 5//\kh^Pӣ|I8t/9[}W`dmQ] y||=y4 ?{@+iF+Ktw ަ펑 E+6+y-!L]uj7}A츖C.yC U\0G|=y4W]$6|E}^7G y|kKd^GtWџ|=y4WKay9_FW^7G.|E}^7G y|?Wg y||=y4hR}^GtWџ|=y4WKay9֞ucki7N6$ ?{@+i}~ѧ|vgMeG%^q.UA,AzܼiljGm$* T* Z5}Qw<_hy߻ݻfw~>m]xt=qTBI~fFL eC$ 4h|#,7- ՑmvHqVe߇fܷ[KL| *Q3\ u/EMZC*jVvWV Iv]Co64I4۳]BɟpnB:C{:wYE,0SiwrwjbcBkhZ 4uHBRb?.16l-[.!wzy񞂀-}bXLukZ-kwW+Yy" 6(|/͜kS[fImՎu5R=ED^U2&Ow;7۹-ܪBQOUq-&stmg4`vHU\.c 1-Նm6Puֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%hZ  z*I>ֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%hZ  z*I>ֿ%h}螹l5HtE$.緑FI+ɪ6oFVF#W-{6s?jQu9R/4FhtB+pm%hFa#ORWڅPi}1IPݼ/ÀD6<5?ꏳiS. 5_yS\aӊpy2LmXeV\cr+-H,V% >b0 TFHc6<5?ꏳiS.t VZ\p]hXeGj*ee`$nb= }HuGٴTs^m#xjf?熧|]Qp+V>ͤ OG.z*ٴT}HuEEX6<5?ꏳiS.f?熧|]Qm#xjcG>ͤ OW}HuGٴT\ UiS.6<5?ꋁ^m#xjf?熧|]Qp+{觸ici$fE\rͩϽo\^WnnXh$I/@3@P^X@6>njg-^#Rl?4m#7s(|) a?Q֥o 3^kL&F"WP,{γڟK>ͩϽ_U񦱦Zke`-nۧ|s ힻe$RE2qI<P rǰkܹmO}%f[jC H' Z#wv0V+LK-`^I֧:lvS\\Uh湋bږ?,rǰk, iRHY!'q7ٕ8}S{? o7U ; _[5trǰk6>njg-b9c5aMHg۷E}23R]3AV?V+6R(C ()_ޛ_'EIYɭ`7>\$ͺ-tmvi˲/dhޛ_'EIQi6 X}we*jR:OjN9 H)i{/njg-b9c5cS{? o7Gٵ?uE0[-"\.búԗ?Ф撖ETQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:(4V"Grj&L5no, 72%A9;n>Nh)q-G%=LR3ogR~Z.ٕZ̗Kx8qp'bNNy9څslhupa@j=fO?[IYG]yި$ov^zp[Z5[gIGjcK` >Ev 2:_-lv[~ CIv J~#K;$1klW!A@Y F0f2z6.f7LFҭ^ Rݑ'%Ұnr:glUhkcL_cL_Q`* Eww)+ ) (}zo|%OZ* * Կ_Zِ7h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQER7OK}T??j_/i{QEXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ ?*J/TRTUҵ!nE`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfx@Hbչ]"ыXq;ST`[QEbXQEQEQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( ()_ޛ_'EIScV_J>?*J/Vd=(((((((((((((((((((( OZÏa?:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQER7OK}T??j_/i{QEXQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ ?*J/TRTUҵ!nE`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfx@Hbչ]"ыXq;ST`[QEbXQEQEQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-jZ9.DI 4ðj8>$FV=Naol[qP}OeP5}Z]ΏhX / /Ey?_O77 NmfE?c'VpZ+'(>'(>.WOeP4}OeP4}Z]#('|h|hGQ^O?煗C?煗CiwhX / /Ey?_G_Gե==b<, &<, &K{DzoxY?MI(r~kXp2rJQiwhTk93X ##ii,dV X'}Z]{DzE}T??j_/#Ԯ.Q[b:Xa8PGA^Z(pх(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ ~SQ>~SUf=>͞yEz#MMG#MMGcهgQ^>~SQ>~SQaW?τߔ?τߔ}f={6y?75?75Yf͞yEz#MMG#MMGcهgU `7)O@1{]#MMG#MMG!هgu~l#@hhj{I!UEj77zsں_GGֳ+4:աA߯'<װcV_J|Qi3[ZXgq5xcV_J5-PYETQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfx@Hbչ]"ыXq;ST`[QEbXQEQEQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWE6o҉+/9kf(;_?͚QEy'PQES2*(,큸t'SoZLwu<ʺpmIf-A1F*=S'6ڞgn%y,DҨ 뷈Anʺp]8j70cooW7<;O du55ۘ|]f[<(fa9Gt[ʺp]8k.Z큭|ۈ?Sɋg2oiwwI<7ЬnYNI#|}ޤ@M]8h?5Fhz*n.<ف|(b2 giG\7i{$fG|lR*p /Y]8h?5r,]8h?5r,#zS+oU-CQEQEr;Ö9kKQ}Qp-AE(^>UJ(׸YנϢ}AE*k,k>נϢR5E?EkE "_"?ET{oz/?G_"QFȷ}z/?U(^d[^>Q}Qp-AE(^>UJ(׸YנϢ}AE*k,k>נϢR5E?EkE "_"?ET{oz/?G_"QFȷ}z/?U(^d[^>Q}Qp-AE)h@=hTck'*}Th <τ/o"7ß Ro??GUz(<τ/o"7ß Q`,y^Eo??UX|9>ཿ<τ/o"Es|#{y^EWcG(|9>ཿEǛQs|#{^,7ß G*X o??GUz(<τ/o"7ß Q`,y^Eo??UX|9>ཿ<τ/o"]N+.kHc;qrx뎴X /7ß G+Ʃ1 }j&m` ncK}}3k4I.T0' d+ל[L!1\lcdS 9*0s^}lckdv <' -YE[.ge 1"w;[ n` _EaG0O'GIfcN:qSW>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`1@︿>@︿ o?>qA[/"`0᱾!O2ELKNۆXɻ@ߌc=pHk o?>qA[/"`9?D $KD*+:Ou7Q\GQ!WXCHz = ^m%lRcQߊAImhݭ'6:H$z _m-B CHs(&f9 ~6Np㓓j:2^%t}*M6v& c> $͂jd>W嶝r]Za0r0USw$u\g/#M."3xcUpAYׂ.Kqo@?\57S&]Ȓ1O*|vmp=adR?g~(?g~*]KLu_Lu_QvE/}3³,QcDE q0UQ +M_3֩ۈ$OEVEPEPEPEPEPEPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Z= ٿJ$xjC ?JB|6jEAEPEPEPEPEPEPEPEPEPEPEP+9atgѯX^;Ö9kwKI?ERQEQEQEQEQEQEQEQEQEQEQEQEQEM4AQ::]*'u?f㔴U)i1>өş7:Y3Z)I*:Y3>өş7i B}S?o9Gu?f㔴Q$Og(N? r= O~,iRGr>өş7hb*تf-hڳ ((((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-wlyW_<5!r}_ןQ%VwS!`5hN(((((((((((x[_zI_3׬/ǎaǤ?z}]) ((((((((((((((((((((((((((((((((((ǤJo^ǤJo^M{Ig6+O?܇]7^D Cx{AIU~HX?௟Z((((((((((((|w:/,?r5 rG-n'|^AhC ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!r}_ןQ%p?Pr-wlyUg>_+V($ ( ( ( ( ( ( ( ( ( ( (9_ǎaǤ?zx[_zI_3קE(Š(((((((((((((((((((((((((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, Cx{AI\?܇]7^DYO䅃 lբ+:(((((((((((WrG-n'|^w:/,?r5v(0((((((((((((((((((((((((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-wlyW_<5!r}_ןQ%VwS!`5hN(((((((((((x[_zI_3׬/ǎaǤ?z}]) ((((((((((((((((((((((((((((((((((ǤJo^ǤJo^M{Ig6+O?܇[w|/wcYuؒ'~T?_<5!rףh}q".@fgp|UI<}K~H#ك +1tg v?h=P^j^hHCHnI#,F;’pzWʎ?ex3;_Rچ[R5ڼ/hߎLg#qZk g v?C]G|⪮k}:h/6e?j.Y^ W?c뾢As?ex3;(h.p?CG,c}}EW?c﨣٠g v?C]`̸\պ#4R ,c} +1uQE/SS?ex3;?/>ȿCS?ex3;?/>ȿCS?ex3;?/>ȿCS79 L-.\E 8KI?"[_Ks̴HgIRQ [ E)pQ֟]i絧G4{q[t- lcdlj%0#CEҮ4jPͦZL P 6efBAC6tt_i絧Q]ky',T,e/Vͅ~eΡa ɸpzWGzZ˭˦h2c?8 0\d0eJ--l9Tiκ@NXVk%XDG."?ؒ4#G%lO#'!_=@Q8IdO }z/D^ ]ofP^f> TOnvL?jZJh-4ܻH.!f8djF bjUtQkXRpյdQEQ!EPEPEPTgѯWk*;XXk# A.SERԷw/G9Vvo/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯?oo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵokk?0_}0- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- _- _Qkߗ/K_aG/K_aEeaj3??zZ& ?zZ& (3>/kW/^ɿ^ɯŠ(ϵokk?_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵokk?_}0- _- Qkߗ/K_aG/K_aEf`aj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7WA+[D߻vF>E,8Y7[&S+flexdock-1.2.4/docs/images/rubber_band.JPG0000644000175000017500000012525112177715062021221 0ustar sylvestresylvestreJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?nuuY%DJ$@T\ģ=-V&€ A]]ΕO9i#g(]Tb9;֫G/m.K>yѯ͹km_Ȩo=-ЦJ/Bʭ'd^V-oncİZ[7e@Ν5/N 3"_m~Qϝ)ĞMbYu?m ;1 ch^Y=Y.iwp#n{=ZRJ'_m~Qϝ{N𿛠_kZv6vF#3x?:-c>' ·0=e[HLE7 꿭7m_J/B( H&]:ya8"=0:~WPi,ZH x.9'\RI&4e%t_J/B( DГSTw&e-`G{S? Zɧͨ1-Ԡ 2=]j*~ͽ'ЭߡG_m~Gq-zU X!###})6inn.t` $ LdftGiE>vQߡU4;uͯ O>&MuG=EU\WBpҋ|УJ/B(ʅiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~QϝE9M?( ?;o+29PrQϝiE>vVer4;o(ҋ|Ь(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr5㾊Do_|C_m~Rs ۜFq|qc+:q\rZGf_m~qϝ1Zr9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|Фҋ}-ЬRcڎT_k~Qϥj1G*)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~KaEx䎽?+=3܃;?9׊ReӏKQϥiE>Vf=ǵiʈ4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎTl홉!kpZO=KtaApA5Q~bHA\NQGM[fI[][y-^Y*VRAR_HIR>6u>qʭH+.o_Wݓ}?4CYi o-L:=GZ-BE޳{=4b%!UI՝xZMm#TEˑ0LrQ˕ǭ੥{+7ׯ94v#pPT3vv;zTmO';h],|MB v)+2kk{*qOK~쎆"&o> ߭rZH-~g|\- XL9:5}?r*ғ|4脖ʧEtks^J.'%@= 8 :εjNesc9#|ɘ1U5ZWt㚊*+1'''Ny=m< c][<G.O+ş?H|0c1U*TV:4]>lɬ_sPz}w]M/ xL42Im5 ٢ X8GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gh tbſ?G~A\O?Gi<]' -1?of/* އ\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I++qHwof/*|cKK[+#''k:#$GgO SM漓G}+ſɘ?of/*菪7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W(^"<[K?bIݴ\h_+8V2xI),l]EA?z xػNgcaz녜jbp/UkmzxjU?M [s,9tqvMПvo'_V(| _HR@m|?0nol8sۇ$+5ø({Erf?2U'.WOdW j6q+d9VX#j/,4Sni<۬QK| aOz{t%F| K1a"C:Udۤ7ANF ;Zt[7Xr:|#=XW4Kt -|+9ssJ<=Q2FE|mxGVuݿ0:5⾋udOiZz[u_ݱ=nɺ_g%cټ9FMoi:۽"=0 )8zWG%ԩVl]{sx4Qv;cQīg$m64p"uu&,La+/:9+s޽wC!O3Uo`r>_9p_?͘Z xkKX,;И9 %|?6K|,a)^KVTi*hhRr[{x;Ok2κMw.օCີdq ⤋–+47uwѺ`}8U lP41$dZ$kh(WvRs)yL ,x`(D3߷5'-Eݬ3mpFAD0![stMlm+HxxUڊ;*(YM>;ͪ4đITcb3@*=EDKy\D|ev'd`dA]#Ԇ;xI+YT/V՗x^FS/u2'sNP*"VVto,Ii]\ۦ$~\qwsF\-oZP%;[h0eؕ"%ؼʸ=wUd5"֗mp+ +]94 0>#i{`[{g4r:H\rn2Wr-}KdfR/(2gx($&> skuwjnE\bW918!@׃N<6"bSm \3"m/&425[&2Og<=I$8]],, HpҴL,cP: Z748tI,DHȲgTmb8Q.&ZHC,n5PZL|y͋ IpY]i%Ye l%p en (Š((((((((((((((((( W϶M#Rczq靣R}zh߷}ߍߺ=3?LܷhQE ((((((((((((*ecf\qwIP3 c;ڥ'iٿ0lT9])QEQEQEQEQEQEQEWs-':?^M{Ig6+OQ$7$8#/y?Ez`/^e_e>eA)>A)9X`/G`/\/%?G/%?G+,ݗ%,ݗ%⫟E"(E"(`teDUeDUsh_Eh_Ev_v_}T}US}Sr:"_*"_*_J/"_J/"VAX?/KQX?/KW? O|EQ O|EQ>e>eA)Q{u-1.8UBO$tY}T}Uj][jMxA*AV@AȩN ^C2(v*p#G+ '`/G`/XnܾaX?/KQX?/KUEs[tD #vݽbtF`/G`/P 48?ΏFf}0&,ݗ%,ݗ%Ff}?_bo"_*"_*oikm:^@l((b"_*"_*ŧ݂zu-"@S؏ΤoikeDUeDUC G#3K]>O@&,ݗ%,ݗ%Ff}?_bo"_*"_*N`-HcHB)ٖm~*]~e>e2|mٖm~)hT}Ueߥ ?,?/QjCxu`g(A۶dt%X?/KVm`zh-#nԇܹagha>6ž/`/G`/QfXύ_2|m-R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/KfXύ_@ԗv_v_,?/Qa>6R_"_*"_*̰oGeߥ 4 I~e>e2|mٖm~(5%,ݗ%,ݗ%/K|@u/ 6GI$F6fS0 }Uӧ$'.]Y}T}UV8@ìGmKinB 38w-Og%a+>꿯#ٟG}T}U-Og%a(O ?E?D;v_v_?9ҵ[:}mkI -*YX#(8Ȫe?3V"D;v_:2Ƣ9[6,d9Ӯ:Lo_jx?+RK]Ԧ;R)ceꥐH9S{5>,ݗ%,ݗ%Z4JQ SƟX{/D;v_v_jx?+G-Og%a(Ϋ_ Oe>e?3V"D;v_v_jx?+G-Og%a(Ϋ_ Oe>e?3V"D;v_v_jx?+G-Og%a(Ϋ_ Oe>e?3-]EmYF2rWWADT}U> —CϏ͉KY$d2::'ǏjKJGYDQX'eZkdz>,ݗ%ɾ8đ[ #75R"4rYƅwx":ǎmu%G&RYymw_,CY\j:d)]ȫvn N=:_<5!rm,Zԧ2K'u˴F41-\Lcqٲs 6KrA g, =+G>ͤ O>Լ9sOۥ5( 3QJA jٴT}HuG0f?熧|]Qm#xjcG>ͤ OW}HuGٴT\ UiS.6<5?ꋁ^m#xjf?熧|]Qp+V>ͤ OG.z*ٴT}HuET8&+c<0_tЙA s^r9>ͤ OGM14; -a)i\ n.Tб=1sk E[K;7*O6#e>ͤ OGnWwGI,f F *D_gV_JδJwk3#3N7֏j_/-Z)O缳r%M9HP`Qw<_hy߻ݻfw~>m]xt=qTBI~fFL eC$ 4h|#,7- ՑmvHqVe߇fܷ[KL| *Q3\ u/EMZC*jVvWV Iv]Co64I4۳]BɟpnB:C{:wYE,0SiwrwjbcBkhZ 4uHBRb?.16l-[.!wzy񞂀-}bXLukZ-kwW+Yy" 6(|/͜kS[fImՎu5R=ED^U2&Ow;7۹-ܪBQOUq-&stmg4`vHU\.c 1-Նm6Puֿ%h}~$c~7~Co\03crݬK1J]r*̇agh /O=x]$Mk_w4_`'Z k<._&W.>ֿ%hZ  z*I>ֿ%h}螊k<._&I9_`'Z k<._&W.>ֿ%hZ  z!]z[_DKRB{yd 4YƞfKywmB^jRȚVGϠZf ڥ6[tʦY$ 4lArB?K6kW%}cӶJ~4RBfn݃pc%ϛy|xWס,m5=lj:MZ9//e⅄SFc3b_ie7\si[kɤiSPbf]LnƏ@<@+hk>/lh<ޗXL/$Ҵrax|S WxWy|8cd7 ??ѥ_2~.4WxWy|4?Ws皷˧;3oXc;Lgo} o:4HRݡ17 18pR)՟$ϟh? 4?/˹7 w4?^7G. ??Fg||E} y|xWKayw>ynƏ@<@+hѥ_0<_C?^7G w4h}^]ϞjwkysCr9o˭{ w4?^7Ci>:ezl$v,K0I/(  ~gPx_;KRWHXnƏ@<@+j>Ggt򴻂⶙{oMGqJ& ȹuc_q|t':, [}"]mq׊:ǎmm |KkŪM˫_, C_zI_3ׯ9/9kѴgѯ\O|6]+:(IVH"4y&r{fKQݿSA&%?ڟK>ͩϽ_ĉ^xPc^=*٬m'y.@h.U $B6"׮5Q֛g! rL.Y` 9غǰn}S{? o7Gٵ?uçu[y1Ip~h|QiZ:dwX__]<%RvhC϶N*6X {ٵ?t}S{? o7\όX ݤBy63Mo0RM|iΥ?I#%ڱiaGT ;1W]<rǰkܹmO}%f[rǰk6>njg-b9c5cS{? o7Gٵ?uE0E3"j ?U)lQE!Q@Mt.jE\ysYv;v4oM,u㾻5)'e  $a`Fd=14 -&R]|S2!Y&Oxy{qh> #YF/2r@f^|,/.D8RѬLL }#Fd + j|joB\dpxu%İ}pA$R9WF6RHm B$wΒ &Wfd, .ݤ)ܭ  YiZ=rHSJ{6AT!4T7Q眀mQKE&P`QKE&P`QKE&P`QKE&P`QKE&Pv/߷}.7N1wt03czh`U FMJwݲ~wL;F7&P`QKE&P`QKE&P`QKE&P^+9M*6~6 AgM/i}KSlWXʦ0XlG%Fp\nX {}S{? o7Gٵ?uE1ͩϽڟKآX {f[mO}%lQG,{$yK{GDW9 5%h))k9QEQ@Q@O`ѩ^aqA[/"( Yx]8eW 6' dd噘4@&2_ P;V7b+UۈR'Y6Iycxnf V 3f?ɬ`yl7.117b( o?U#*.-h&\ Y_ނY@ٻ%xfΝ.G3گdY&V]Azw7b( o?~g>߱G,( o?>qA[/"߰YϤQ ?9@qA[/"Vw}} bP:/V7b+A~`H?أ7b( o?~g>߱G,( o?>qA[/"߰YϤQ ?9@qA[/"Vw0Z<}@I,,㯡7b( o?4t乗NB#ƀ8ᶌ=Wu= H5aS9BKqc qa-'lc ؍L;9gMu?ts-|-abwvn`9߷Q? O|)n>vn`9߷Q? O|)n>vn`9߷Q? O|)n>vn`9߷Q? O|)n>vn`9߷UMG;R0Kzd004'p#oun>vn7S;? o7Cw1iEAx$ym/yb #''f׺-o,78pvn++!{2'2|cn>[A8#ۚ|1RV]w6Z3 ;Y>UҪ.dѻEUQEQEQEQEQEQEQEQEQEQEQENKSa"<Ы+rۀ`8u9̱\߶cC8̸靉y١Eg6vy6+;c^~g3:o;2s~lݏ 2v'MfXخvx{f\t#X;<ov?t3ˎ؝7P|skgcbۿm?qq;m`,lW;wv3.:gbtvhQ@ͬenWeLN9̱\߶cC8̸靉y١Eg6vy6+;c^~g3:o;2s~lݏ 2v'MfXخvx{f\t#X;<ov?t3ˎ؝7P|skgcbۿm?qq;m`,lW;wv3.:gbtvhQ@.QV)hmpr2dSÂ]L3}t>qq1;W㳩Ŭ8_)e-i.vyvk1ݏ݌2cvM`ggfۻm}3&:gjv],ggfۻm}3&:gjv .vyvk1ݏ݌2cvMe(KenLq7cc8̘靫q$Yٮvtsv?v3Ɏڽ7h I.vyvk1ݏ݌2cvM`ggfۻm}3&:gjv])$Yٮvtsv?v3Ɏڽ7KenLq7cc8̘靫qvggfۻm}3&:gjvAWjxt2lbJ GʼzUvmQG}̓]y;ç73>i&h[ lʃ=*{G9|?_]@/.h/'6]ytQ`+H0 Պ(nZQHaEP+* Կ_P_ޛ_'EIScV_J֞̇EUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE]"ыXq;SV?'tF-a0MS=nlQEaEPEPEPEPEPEPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((}zo|%OZ* * Կ_Zِ7h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (3?*JIuug]KdJa_t n&"gM}z/?^|'ӧ.a$1$hRn^@hX.V櫫RxKmBU`$,ʀ'΅d I*N[{~נϢ}AE+[>嚥 |Me,IZm$6đ`5 A?l(>3^dwk>נϢ]xXYrGvQ}Qp-AE(^>UJ(׸YנϢ}AE*k,k>נϢR5E?EkE "_"?ET{oz/?G_"QFȷ}z/?U(^d[^>Q}Qp-AE(^>UJ(׸YנϢ}AE*k,k>נϢR5E?EkE "_"?ET{oz/?G_"QFȷ}S>m?Q,X|9>ཿ<τ/o"J,y^Eo??UX|9>ཿ<τ/o"Es|#{y^EWcG(|9>ཿEǛQs|#{^,7ß G*X o??GUz(<τ/o"7ß Q`,y^Eo??UX|9>ཿ<τ/o"Es|#{y^EWcG(|9>ཿUu;t#!:`4τ/o"7ß gZ0Ǭ&k0xR31x/ͬZ$r˕Rl)s^r:mopZu0KV)qL6xyOӮMO,O `meRwӊ:ǎmzYB6Yωw_, C_zI_3ׯ9/9kѴgѯFwS!`.EAEPEPEPEPEPEPEPEPEPEPEP++t93qϙ) Xp{r+7O9%:ǀFQ z#_ ¦&:-ӼmI%w-719/ON)>ww.{ RvЂȲb6,  qA[/"VMYt2|*ɟ9xNN[EAV] bEv@ + o?>qA[/"`9ОO?v9#I͍ǖt㞦}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Ecqt}qu 1}_Eac}B5Ӯd)tH 䱖?wzC 1}_Es~-AkkIkn . U?x\03W!uu*ZEn6f0ę]YW{rFQ_u.tmW'$*hJA#a}6Hi\PK zb/`2̮23ĸ`^0Lp>Rh6Pi7s-D&P \cax"K-]A}).e5>g ٦Nrrqcþ4GFKıI47\d `G[8Uجӣ}"?.K@ 0N\f ~$ AwVrIդF{Y `]ת9өş7i B}S?o9QU;U2[RI͵f $QEIAEPEPEPEPEPEPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((}zo|%_zI_3ע>?*J4gѯOQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a.EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( WRQǤ?z/MKI?ERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( ()_ޛ_'EIF57O/=$k"QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((}zo|%_zI_3ע>?*J4gѯOQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a.EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇]vK]F\|$,WfKRyMږkɱ]j[;RyMKRyMږhh_ږhԷw/EERԷw/G9,*9?-`.T-o/kW/^ɯ^ɯŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵokk?_}0 k@o(k@o(_|=_/K_aG/K_aEf`aj7A 7Q 5QE٘/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QE٘/{Z7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QE٘/{Z7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7Q 7QE٘/{Z7M7MQGf }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQG^ }_֯?ko?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?_}0 k@o(k@o(_|=_?zZ& e—r"p>]  9v4.)Io>yK\BIk.J@B)]US|0V9菾[Zg#N--7a^3͂?c髿I%`©Ǐ. ל.WI |TџEq?ZvGAW0y2TA"Dh;do{ \džzsƒkj()pzO(sz)=D2ZQ1 qN :3' 9$Q=TYEѤSJW-/gmie8Ylƻe=ʆe~Y; YxM'Css_ڽA8UG\ʼt^z &9 %~Qj% 2_}93Jcf֒]y1ЙOH1IVF@DV԰uxq{ccTm2sUAI̔ >Jg <[8,j+N?Ζ 3H7/q9~2[;tA6gYO_'2|ӈN|XiDes>j9.6'A MXL¬?^8(;|E:|Kqpq9$(8ף]'oz:,XUNFAA?`v4NwB"}7.W p8wUO Vc]e:>v?hwui}Dw/?( <{t (y#]ffK1zΟE%(^D%_,UTY.pru=Mωs; :{uf -b1`V_ `8k_Loж%C|Vy^𶮄!F gOC _'+| 𜒱d S&{}OOX2oǹOn{Sn "Dgvd/|W :7w7a*FW8*:.l-3}JpcFfwѹfD|yo='.voY0Űq9}b8"2&ENЏW} >?o:9<%w)-)&*Go$(&@2,OtPבs;}[_̣S/ŏ:Ms,nX#:e7@ƏP%_ZScp/#K&tk#/xMjė?r `3dxPnY5eDZ$/^K￰ 1O.5p AE^p{Vxٟ8u5W<U\Yo_u.4io#_8Ԯ¢o_+>< LXePS_ 7DuX2l^T~s*r?NO%0LZgvK@ PÆ 7|y r`l'W6]*&'%L`ҘE5hbx+n<1HEwz ߽ @4yqܚ]=3\{kY%w(8;vUgO};pW_k{8}\@ȴ+5"}[3w}ۄM[„nPϷ^:UOgG)UB(h!_vAi-(&h]sz?&(xNշw ڱ )pǮÄh;\;?FYB A`wC"x9G+z?ADG`5wƊ8'0k]⦟(}tsu9 {G)ψ@tfNQv?l.y{nloґ*Bxs [)";y>O]ੇS*|}i%L[us_tS걀J/jQE^Q vEAď>%,+:qUA߷7#t}/CY@]@t9kIb! 7wNV*9oR+F@!C eMG }2CÖp }s" ~G/]or>:owa{,GT+ph1+7\AM/+~c sɾ׎{ԛ߼k.0v̛>y)ژEA|pz+@~HOz`;W`s{)8W{}g:zck68Ə*(j+S;c&W189Tw hAA ι~zQpɿl.QxA\Y/{0O~jv?@;~|'P~0mW\MzwiRち-_xo9bs6{87y"xng ?}.ÿ\1T~>swB\ɣv?\n}^t(LiԮ@|[2UKUp9sș^,.=_ߺl`ϙyw>AK'@;j@?ٵ,Ϫ&yT=d~+kAePzN `S REŕsD%|坼seNǮpK8e숋=rY|4f<ְ],]U$+/Uq/Wҏ)^=#bRGJzk`~~|@#¸0Aph oDa'Nri7?mu|禕yWoyWo^+"baH=}̀ Ai5(]ݰ P O:QJae\à|ga?VjDwt%1d,lia 3E?MDisu_=jѺMdRq|}a1IeoWswQp~77"Pqͻ\z3s7mR6 t_ pѽ2 {1mxeԟhE'w QK-^?L9{*s7:w~-E*T*{|U%فCoK3iաZ2^waK𽳽mskkC3fWÈ%|؜ _|9m)`M>^CMQ(t:AEQ3u5bdU.a'_U}XM:ʴԼƂ8'/7C&(.LW-1GY'TEt:l8'Y'0/ٽ|aQ3x\iӸWHhH0O0u>??vu՝E ]89*#*b ["r w8`ٹ7 oX.@3FhROCV@{]"]~%n!s9:uL5dYY| }K?fQ%qtF?]>wݫNnMӂw?.iI-AT?+) r Y>eR16*eOؓYw/&<aj7%{u{7].`疬 7zqfv%F@i7XHJ[2Coe)hp_ڹ@E֣N_75 hĚv{T~nxgVjXAigP)dYl?iuK'ѱһ n**?~^u+N##Nըch\ܳWߒ7ʖEP~tUCMT~9]+^ZxTr՜+FWd~B+{8?{*Ü eF4.{GcqO9 :ڇNqak;ۓ-Dg©ǢnKCunyP{Mn|gS NNOCo}N"rG(/E~]Eieîl2@/K\CV8qdX@̤*%-34hbܠ7io|BߐK Y=wl/ž8P]Sy(sw\Cc m[1eitܹq :ed{ˈ^3@|R+Nt[01oUc xyJ_aɃ=1Z d?7v y$5~jQIC ?OX5؆ >}AZg}wb<{MTKCGÐcȿ,oM&H1*s?:@n?CcF_wz"ԧkE_V=E(x*'ݣ|>](}BW wC1N{y㵁8* ߅aisNF t^U㫌3N/6u鴯//Cl&b]* aNqqT;9{) 76 'd_LN,l|Ózd?cuF{葕]/Ϛ ȹb;.ݕUov3XSgl\ Q9)0fS(^- &.]5nM ${@ZQ}MFCk9ǺD Z; jw,?[`_3&XzKkiX3hԒ"aMʮzS }WUIKc ,4+`@_z4֫U'zfaƪ1ZBQmmٮ5)Ib;MV_<<7a`D4A T MV_x ߄_wvSRR?nPvQ Ur?m՟Br"t dXcKv?  OvhzSr)a7i~ȻZ?pF& BV+YZN <1Z4)2i~Z2x}[Ϳ  vК_~XM%!  ҂x3Mj)=Ai9Xֲ7 O,zAAyAAAA GAAg4AA䙠=AA1VY];.vZJ ]ZZÇ##ÛEAAyIʯfgesVvg:vԳ[?'{WFWOdd8P< ʂ5CfO\hŵjqZJsj9,  jȤ%w/Ok삝;nNՇ:T{SUVY%]Z<$"g)~]hY+3?3VF%g)+R4̧xshkFuͥB%*sEc{;U{k8/>s/ϡ2W͉{ذcE4Pzk tط9@Thև ZҺYEgN{"sr Rf—)R׎{þ{>ݺuٵ3 _~#C"BoP).9!4P!}'%8 gOo4i,21D {-~JjC%OeG5}p<LNuVvj;5*_IMa4k7SV;8MfFoTښ%CE枆F}BCiwoADvi1M4x,F0@J>RՐB3A1Y;řn=KV.Wm7B8V\"XRX ަHCO9uP{UtrBhb;~cgmZvGB잪/Yo_lg8w\z IDATH'YS9{*yr 4g",5ްJn{E3v{.NQ=NLڴ0Be|ޞC?2r:bՙON22t49Jwl0i'!9aft$$cJч׌sa5fmb9Z1N 2ӈ-+#NDeXg.}^B_Rf˅AFVŋWJ2{npe\ ]:Fy,x6GL[V=$*ٵ%T5}Î}AQ'7ٰ)RHYl1.Ħw.&C7]#KEy& M=z kZQ aUA|t?POq<)>zZE.w_б[DrB(0#,Oa (L8~ͨP(բQ+Me49bD4eP,)StLKƿtl8+zvذgPXn*Ml]\WM}U=:1Z"}(t{c * d*U,@AYҲsq˗Q  ";?)ݨY8  .wwt ӽia`g Nb54:ʹk08ߨ."v5Ԩ-"aJ ]_3JqS8*sEhdBÆ;L :3Fbڙ S>!}'M?Iw)(& K9fjZNͰEoXz8͘ i?@y6=+z;gyZ@([ؗ׻w٣lJ˿r^Rr"|Jî=8;Km33QXiz/m:LEC: .!aJS]spo¨k5.!~UʸS''h;6m4@s9-A3 EefdPsa[]mE5{_v5SB#z*'2[ߠJvO<9aT'N_qԴbhRZlh'QCÙZ1NgҾQ+?OlFWop~bUÊ>m1Ejy.\p"t<)K0j,6Aq흛ܶ{:\+KnńfO]gb˒{p&$ 1G\ 2\mc%;e;9yЩs̢ef,z/2p*@g;11:n©#"`RdB̹@VF&=rp$H7S><`2$Cg:H̬F?'MF;VzB\Ff>HcsEh!Ն⸇Y}3tLtʊ~jm2!s4"R*gw־aTqi;ڭ%%'5LT4/ctaZzigߣkZuW OqհvjhTNRU&-VE'7a/Z"a=厤ArDUM ׆gkmPV|..^I}zrVsC_6:K壹9oKP6E@ȦޮM4'GG'{_ǯ6T3/h(*s{&̡|JvO] IJœx)! OGn.;˗qDz-S'@nͣ[g{^{~ߵ[×ʤs> }mAUAlx^|9fPjou0%%ұSEe~hѲBDJ Ry-}h-R*[yֱNdGx@xrfb (\jck(.8wgX /F5I?z:Ϊ EQCɁZߦo[STm)BR6G4.A/\Z^ ;"w)! O(\ee%++v89|nozǗWf8ՋlY8:JEgzn6ߕQþH%z!XZޙW[\T Va[}*:;sdr#.p 9   @t|mKow<׸{N*].:d}Nr?Nnz>e.坨k%qjr1_4AAe/vwuyN΍ڢmC\=?jK0CRpms)w .r׉9pzG5Vb.k^GAAcHd]&M =E[v\ʯWdstKN]C^)&E鎵%m (n{]n˼\<N&HV#j?  p.ޮr/\|^ةk[~/!E+ҝ+К!e[ H)n%lt)9y~=ml\u}(GAA}(P䄀L*nyБ^yc~0v6ʻvyS17Ǖ8ts!d#%29^Bq\;z(s,=lAW*Qf W7mژS< DQMK ҪQ+Im]:,itzZiB }i$@(E!  C-. $5D$*횧'PeԘ e/vi[_j(~MI1 R5yO"1^ v+|6e<:>&-%u{[wt^y1k!@Q©d֖WZI{m/ex.\MyO$HL@K!t'ib+̀L߈JJ $ @Ȍu# YH0BsYLńB ؜y:9;))HLLRf Ǯ@7 ͂Qֿ״̫ϴcbb44 v?$%P`vaKBy *9dߦjHY/ӽ`H&{TSn^Gu2:p) @"X SlMmʡԪ{Q]:uq.4 xSSSRf&!I$B!C5NQDM0o|.eSEHE5Z$ylo*Yv?hِ^>-~V ՁBHHNL'l_uzB[v!b5FR =6DL<d4%(E.dD`찪qOJg-lڬ~.mB?Hn7u<$lu+jSRRRSSSRRH 5d 0i”kyϜO/ EzY@He]by\FӟRKPͻ~?<D}å2#\JA}GxZv1믜ћ ,%5bҤkHpKO(,;ǘPC"ss5'ՙI[P|o 4T+%8M b7D/ PoDBQ^z0WjbԹV+{vU2D@HOh?!1%I-V?T9%%E9G+<t鴻ցR&'X#S"c6tZz=PJ*zJgMPW@3v=MKE(d/HȴAy 1" k߰&z[(h}G`CC($$DJ|{fmsBj%t"oq !~>ݻgff^?/³w^HlJǿPr;+N@`?ڵkaa}{kIDŬ$1,gP&+H2

z,js4[BbΕd&Ə=h/"G-Q/ aDٯAB !WM^2\^f2GJN)) B  H󃃃df:]|Uw)OmW9^}̭Z1TxppP6m,^ <̨r6y "QІYG !OYjFX:$cџsKDyf!.]:c؅0'g[~þSqG egg<o=輦5m}ӝֆY `4B#,/E8NJ jAt7˽Ns^/o~B! Cd\L}בSw1ۗzd_L~[g3];}h%KW Kes.pIZCa<~Tc9 Tz)+;%T}}}LtTHpm3yi:bUBi v?5ZҜ ,34Ax>!}BCZX-AAAZUU%w9B"9%䎎}r!5!aGyަd2ܣ:Zvd   */-1i Cd2\N5Eǫ{#ysg@mm[VYY0ޭ?,+ߒjj5[q<kΝ;  rrtTash)\*0i@}ꅱ  R_/)Am#>RD !O7nm$OM)xmݶҺ LK$􆳳~4^᧦QʉS2".7'o?g; os 0:ZҿSylxe)20XS2e)1n^SGJ=AA30&a3v[JAZ7oSϞGlmm͙姺Ҩ>_7,H֯i LSibL}oG[$b\ tF,eʗbMZvL~ )bsײBYfJ}XhT-KOA[(ٜB~)FEk[gP=І>(|L]PV.:|;@wb3bPzr֕ e_`EeggfggEh! Lbjfh)F+s D--P'y8we iyYM=4mqM0afy?f} t<V^?U 3 IDATUUUUUh#ȓ~O-%ݽ{e|qモWK˖Ȉ0L. BP1CQ1.t0f弡浺ZݩxɌ0<ˬ#E(}VDhr@o# b|=1MRU7'2^>^Pk0{}2"d2.[W[G\p(~(zXSSWW'H(/ oe=|ǣ(JNQ2޾G'g "۶Qj}#J kk۷ߘ!^R/H۶sx-cjУh\ |2-$CXW&fפzf1*SMĭ3\EPkp+ 㦜]!zZuJ!hkFLt5w/Qo+$OБ?OFAZ++ٳ)\&p9 $R899~<kgg$郇(kk>occM/ڣ{x<>OPHR4ǵ*D #c-mk/AM7- h2h Jc"554 +Kg7f1U YwEWʔzZ24}=z˙GXw9)ǩ Qf7WAbug7hok}xP(`M #gןF݋Aoc4T'UkTX3붽h#H+z~;geWKv\Sݺu?BN|+Gh[KՌQDdWCwϓb^:l AOWCWgEa%lޛ2O6 %EK&ށy Ww`l=:x5qrjS 7˕L8 ذrhC!߭caM>>="{, osB /,J/=`6!FTtY&_1[T t7ngm:#z:VkUcyZ5;&M0OyT6n?WnkiBKsl@o;88j&ѧ,AGuۜ3{@7>G;::X[[@UU [_1M6rEQ2J"AA%J.@r8:++>ǫyCGGGkk+=57u]K-8fl+'1E ;Y**ӠV2K`^zhJ3n#D2m3C槅f+1Ӕ\K`X3L#?(VzޅM ~z[AuGļPdRmvvß>:t(kkk{gͣvef^6$XʉpiuuN~~~ݭûuJF>{/n]o?|[ROE"qŹ ]/\8z$&/ - P K HLTɌ&e,bLY1BC׉bIlh'7 nfb\4FD!fO(u_C0(I"ig?A#(8ؘ#GZv?ria;wo\Gs;6f_64.$8qcGmӆm{nj~ؘ}FMXb999bI[T8Miwsv27.,B4d&5l5}5=ahkg6%fL"tcd#ȫە?Mz7__ yy^ѡ!G&++3W3_~ޡ]v`ŷ*))щC8t+;z?~OڮmӧعQҽ{W\^]`=%x<@dccC.{- #99:Y׶~SA20Jrxpi^,XS=Y ՒkmBL^Xn=6r0˒ gkN8 gϝ?3(JH[OuС^RokkwYWz<k{A`πrQ]}=z/}XSs^Y6mޜ;.0ysXo|~]#Hd2YYy}uj_o++wވRLoFT,`6k8sl٧KܼXerUS!!ͣBXk[B,AnK[Ƣ##zws;vؗ۵?t_Cp}:xʉGV.6m3RRRZUU_~qc|378&O,+/_,xze؝¥66q/gDGuoߵjKޡz:MGϋpBS-iFڪ)j2W4mep rfc]qKYw-;\"uev3&AZ?w_XRzã?k۶yskr\&x;wb K X`GIW.[;}?l gemIɢ`qIZmN?j`VGسSSA̎zPA'|!Ra7YH2,mr˫{ j  n0nu4A0-$" mA˙Mv{BQ'6O0$lЖ)Cdg Ϋ:Z{&0$B(j;JɾnpXt%BJg@yľӦs}tQ}=߇RH}hCZ 9-2YSR{6әCcbb!BРk(*syHD`ԓӔdۮCKb<Ԃ׽| <.""Ǐ۲a ;b䨪'-EkEljbf042;zuMڸD#k^|ozCE1E~]3"kɻky+^n]3H!dwwDDGn|rڦ/^{OAhѿ:7ڨ*"|ASSSW'^ZȾdީ1 45W( w{ݩ{˴/ҒVú;6|2X_w[.rR/CܲYw>k<彍?[_9YSZo*YR"#v{c^EY/r ߻* <=E񑞵kdF[-ַ~sY7_{POXd+{䥿G~GEPUsYVUb܆oW(7b̷| s˚}G`rkEUNi'r]ӟByѿs^s6qd@""[^٫ح\} o[xi;u\w't_muJ_ʍVT4xI-lC8䣔CVT| ϻ#O86(RQ7s{~UDKG1>஻ʚ|OKJ)Zt;˃m>>Oٌۙ^-5)[qd:3w貽Uh=ӪZEp3I0vED6l{tWogeCڳ_zo`zyzY Ekjxez淁ɺ_\/I"n$:S}8\w=(7Tu=ڞ3M#!"'?Pb9w?y(ZٸTDEcͼh6j^Kk??'.oOae:DQL=G<%9̖;a6v 럌GzDDe/k?SƆ>ZzܿWLumlh?3#Ȁ6?]?@޻dDq#DdˆzwGzQƺy*J]pbtjb[E^9_~dQmYϵe_W>1UuLzS;<>:t㝙Kl/O{Wwiܦ8 m?͵rV]]{#vY1m@dכ}ߌ_xEv@de3")uK_4ԭɸW\b+ƕxCM""cߐ#*ʩ_]]es˪jƛoR`n7h7+mכ-cZ0cb7o8[ok9urVN:] ;xY<)Ju{{sZ{MƯȕҶRͥ_ܯqyH6q믔o U?p/r{Ʈ1UQuhO)#E/f[ɗW?_yo(et7YQ!~wcgg\ŧ&F?.m("v]("ݖ> ?=?zGDN?J mQ=?x昶7/3el*9t;o`RvF-`?^["2ݚ: z"u~2n&G9:g,"E.ͲζQR3'M@TuđG>ymc,IK(_,+ilw@vFU"see7~19#LDj3" ;[S}I80*F_{=EDTM$8nLvyN̡ZO55w29#D?L̅"|jթ֓H%mR'lmqrǤAIwӈfR)k_߾wx: "EhlO| *ثm<0~(G޲y-e_^gE`MSSoii޼1l~NmQurJ_n.EnQDG.-OɐBJL)cocFd $gGv$S蜂?^nOe/"7|}6o C-;io%{<ֿ@If Ue鷟޽Q(Ju݆&9 PQ3>/TV[|mhqEQn+1r5Op(Knxˌ *{z 5BDDr'wQ N>+(&QN,^ԯnt]EHb؛Ŗ>(|g1?웇O~cA3FN˖nYGȜOFvGƷdt@ַo߾{O6}YШUvϟ<|r;ydI"t6vLdYsæ} 1EFh:.k'6ܣ{l*S:}ͼmTzHwUP.#wTRy`ҦsŢ$? 'VeCzz]QoHֺO=IǝmȭN'bںa6iܵ;ܔD,@Śi:r'f9X4WU=Ft+Som8s*RnKsXm杁<bxv ~ Yk&v\Nu 3z(-e_WUFM{vݾ`lA̅$uva6O%Wck&>M,dO<3o{/dc'PXBE[U(u}/3f7GfGQn%P" ,}co",ț_=3߸Sg ?@}C&vNi1vt[r?}S[s˝]$??Fs2O.kme}`~Pի<Պh?r9|Wg.sue7Z7'뀟z섈ވ\oB<6S([K,${\oKۏhM>U\(׭w3o+-_WvOEU>!wL~:ֿٟn_d}o\l.`:m@b @`#<B'E?xP,?CzŊ?'@x? '@x? '|-.UgNhgc濹bE.0O@&om(uLOOO?dA?`q`? [a{,Bpe!`/a @>՟mld @?䣱ASTDv1U-HjN@]/i'oO^(.W/}$HCЮr:^-D@^F߿yg7Lm9艨y_/<ꉗZܔot}_>SȊ?GǴ?YF݌]}vOkW׮S_]&ǟb݆ɤv^RED=GKG=)C}msLU͇\J(u_m]۰5vcjb Hۍrѩ(./?N['^Z{9GmT9ʡSz37vo20~^Qc'I1{ꉗL)Ou_Kd](لZo`G@>2c'>JlsYz;ƯOCÖW~R}]uuɌ2(wvvIg=q?#~`( ?N6==d#q;ƏNMNMNMhXR>\h;DUgK:-+N2zK]`"|^yG9o U?%UU;$9=c~옪(ux/f2%'RѷW~~Ŧ?j{nyccRvϟ 6VȖ[V)k_߾wx: "EhlO| .)|ۚ=>]6yˀhfA=V6·?@~ 'v?*J]pNLS|[|S&}8,?-kh)qG~ǔOĔi]pb4("" CL9;E2(?䣘EHx? W8xPK ml,uy"z,h ]Ow@R@>zzzJ]`^1_b!%˶CԾ1S򔰾ܔg\,T9}_En+Z)+u`-n<+hIٹloI&bi`Tr~muMiϪ@[/{$g_ `"Q_+rTUUA=Q 3kn7-Y5cv+ш~[fUsR2+5<߳[N]% LXl(,5*Zd8D`Bg;Uê)ƀt=k?!Ӿ֠5*P}l*-`i៯5?7lIŪs?iXf_GgM`ﰬq{L0tڳ5d9z%ߢ$r8ϛP8 ʀ\sSLHl(;8|咯c,J,_ fΎJs p/+OjVU֡QqeKy4C}S3M'uOKDÁ@MODVVI 6hT-e`MgGE"ӉlS2~ ej2_""RqxW\c^.XH HD=l9d]ܤG4(禝3 g?"Ȥ6bHl]ݾmm_뛮wVmsGdd_Q96mկ8Gx;EW1-6T=chi_J2{eUsDŪ])flO.YUpMrl6'}Rz}S/\&5ipDZ gƌbJP\{bM8 ~jNpOM4%j/ Xշ695Vtb{VOOO=\cgNBr%B!+@mXϬ(SQEJw[ibUZϵݒK揶ɝMKtb)Z `j:cb;1JUN+).^#8pq |ɘtDRMʲTEh0qjulԼ ;^JK\-Fy?+|}jԶWEs["tlᵰZ ?}1U.xo8 Q|"PAT-qSL VMkmH,j_D]dU-HʚZlWrNUjU,KSuN)Sz-`kYO}R~ۑ8S-#e։nnL]7Vp\DÃtTJdbUC3v/V 0kcSlֿFwTXN'*pR;20<|s ʪ>\Y `ʟ%QlTII{]j+}8% {?ǤҴ:Nt%lZ͓6K|xڷsp zcfrﭔ-+欏Ú{; H-*::dat0? [s*|s"s-ml(\IĭXljyGd䟲ʪfy2N.y`#::aS7'6f43M)c;EN 91.>A(@Wl_˙wHLd h) o,RTBvvT:T'ԬCg*RDJ<2Q&4߲f4Ƙ S9@Cis!&" Hs]߾DB~Z/z,zpFKh><7fqI5t%h>Urr"ȤȐhH|-`-e{,iqra95f BgXܶG1%|KHQ̲13W[0YZdࡑ0ob.~z\ +RY[+Zo%/fߘmiH35/%,X_+u`yJ>U-uf V\.jGNb~6M'@8/ˣfQX ژ TY6clo&McQMh6}%^ P{(W`aR>BpM%`t9[hb>i&pf=b~Z}B&!P^Cק᪵|OshVM, UMeӊLK`O{uIVQ¤,|Vo8h #1%:/ k \ k_>ھ2n$w6-k)錹ҋas5SӍ;nU-Y`[eT,3%mR*:GdSc; TiK(OugaʊU5* m.5qBPXZ~-q1mw -CksOMW"Դ`_D$HD_*q *Ԩh,[ ̯Q>${ɨ[ 5w#Ad1D/sS2UmT`km͕ܞ5عOo;>Zӡe n5S#DEvÃtTJܤq7XVj5XUPw_:inLkڅU1Ԫ M7Σ~ ϣpOXWx?̒id ZU*ۦQ=h3-15Ć-ȫ \bC`*+g)+J){] i9,YcL9&q:-Y׻5]m28ѵoaSMj>1ZbJ;)XU|c IDATnfy4.!GqN!MΊ~CnU5g}8)Zr4'p荶8jPrQWYriԽx9e2ߜ\|K 'dĭH,TyS5w],쳲\=b_kڄg1ҜT?%Kz,zpFejB+|"b8<}8嶅tBZ)R+:ejbt gN6 &<힍G1́3ƌ!^rP˹m9*PG9[Dbbj\ hw yv߲Z )I`x(Zbl$RxoL߶ hkL̓` 5xק.OD+Fn΃D 索Qĭ͓,lx? P(&((H]&2b!>,xKJiӉ\XJ ?B;cӦZ'wHz,-𓶱2.NFYɦksaβcsjFQ3. oQB1e?Jg?ͪXGt-N0Xs4Z }}]1UygyTD|}j5J8vX_*}>})\g 5VZpXȯEӑDL`O{u] {At>s󺲾ϵ,~_+vArgSXʾΘ؎3 eվJiJDHN-\q-dm-mLM~JK\-FR}DΟ5ҫ-4L<~nR_ɫRܖֱ͝lahhsx %(JHmƹc!Ex?et [""a@"YQMa,[5Vh hI}~Ij'Q;W +kF>km_9-"VZjU,"]suN)Sz-E֌ XEG$/H¾OT&3L?\*V8TקNG#ګs589GzYJpnF[E,۵,ҝ k`L,]ZR96kƆ‰_֠ZPx8P>ĆNMWV5%|>)[LeʱVHŪԺ')٥"iAn,X:+dp8.Ak߶@uxrKJs.z9L+JHWBڊ *tVUsa]Љ,GAqkoê%GG|5%"VǜJS(<۩;?SYYsU+o﵄8P.§W x%dʢ0) ? aLm4/[SDT9P(*+ý b1чUHʐq+{93ISɟLs-ca)gI㱡6 ^x>J;CϬ&G %[N<òf9f6WB v}%8[ Ń\`L<8e׷/_p7]իg[/5PL|}Zs~c>D,_Y&[_e(g*Ǻ+RLj Iйd7iL[ؓrHa[`=+F䟺*yf KbOo@Q`ã$psJ5M$%ϩ=*Jp4Wv-< ,J[Μ+luuu6Mx\OOO=\cgNBb!e5 csrT_lD T-hBe*`+!=FFF ey Bs|A,'S㜳n]hK f_߶Ȥ|myМ_ Z O#Iļ 0SO?OUg[jegMm(l'@s&eXHq@ *ge3zK[\s_?R㞜xdd: e.wcL{?[t_^?6SQBCzӑIPy2Sw9nrn:sCpeYwRJ- `.lF<YUZuh XH Gæ+9 UYm{z9WDM]RrDA:.0g?J1u?[b!%:Sp _ͨ[E+u uё)TaitB~mԈF· (PJmxl`۶dmj,IIɶ9EO5 ViGL Mv:Va-K~ow.C3sJVPpP8تľٔX3b";)MbU5"ĆN{$nDOU֡t]iTtt*b&CRd)suDPx8P(TϞUa}!-/ZÈ=0+ϵRԒ|z+T (50a^n ZYͧTI(FBQbZө5h C~J_1X2d9SN%q}?mP_}>_ b"mmx!T&pE*:"I,|}Zs^r0a.A%雮k[/+mNDyQWm!J)@- շ695Vt*l𸞞{60Μ3䒛;DQ8 hwLyv'GVEVj_ '@x? '@x? '@x? '@x? '@x? '@x? '@x? '@x? '@x? '@x? '@x? '@x? _+u`8sjܻxX,v[xk-T ,0շ6٭'iD#Eh 78?ʋUkOrb?sy-*B(mvXJ1/Զ ?1\*yļh^@V0+DpyM}2#g '%kFo%?䏙G̋5C#Ȁf8LM? h࡮¦ igk sH=i <422J] [SO?Rc< x  BHt ?ų${<BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <BO <S"?XPͦ ˚}G`rkEUNinڍf7)"wuź [GEr7@ۣ{TմÞcGo^{?v=.בíEsˁ#lX''N9ꉰu"-_DkWc{rlb|;fNn@tF/cuNӓoUhF?+Gce*/nCFFFFF鮻9}[6+yѩCϼk) G&FO(rG$rtjbtD~sy^(_~䳧ߝQ(͇cOld鬇mwnG_Wp]]UUވGFF>%|鋆5 *J"|7n+㍗"6-11xm <#"Nqjc_[/v Dv nY]O3_뮻UUJա{""&ojkkկ44y\VH#|z?㶻;}eȍ˖xy`| {cc)lꉗ6k~Ι;Ƭe-q9,L7cg7}x7W$nw}yMc'NW[ݩ_?wiӮEGQ~թo3c2d_A<-cRRs ;ްL)O_N>M+ʖZŊ?CzzzEURtg>V)Kjp/r{Ʈ1UQuhO)#E/f[ɗW?_yo(et7YQ!~wcg,6I+N?KeM cxщ+ʵ'?Q3TG:K֏3do/k': ľ*_;q&rE#1*/JijjƦ|zzz$M,koW:Ʒ{/n4>nDw>kED6ߦ(#kZEd歶{_uzw&5~k"-כ7ѯr@n} ojjUu_<i{R.[[>ۊ^ȲݳWڞjW*/[[wӠ4μlG۵C}[Qԥ˔/n6XSA2!^LM̩¦;xW({6׿7?eXɫ_DE1]海k׻/"EUs:v>x^XaQ폱7$ʲܯ-|x艹\ En^-݊Rk!Lܿ _Ũ}8?X{i#'"+3wPo+J <dYۜO66>@8l_B"W*v%1fu_hQ%!a_dYuQ˘F0'$پ:1̷ {s 2s 2s O?`[S_?܍O\|v-ƞm,ۏD@4Eu_R*vYFot@8#{gW>6Ӝ^SG7=ϰ[Em<dmɪ~g-/fW_k-GSz``G+R^-Y/'ڷ9ߢj遷r˶;{jfM@ɍ֣YzѪՏȊMdH"c"2rH;dL끷Vm5/y$:1*),7~i|~+=C#MDJ|wd謥]STXZ[hIDATw]/'U"g";mgGvk">;|H G"/GDJl;ȒԔe;ZfI( dvgtz R?QfWWTWpo?y^:8}dcQHSv,<꘶ gNÑ+(m)/ƪM"" V[ED wߩƍrwJLU[UR|֭!%oP5Z 07y;*YBg[ҏ6fT.}v>U)O=a-/̜ $áFz+wԱ*׭q?"$H]:O3jI,iՑ곫+g E3 f<Lu_/?` *\؉SQQ"^Z )<Fu80(Dqֿ>zB`۽D㻯.LBEGs{@jw)O!g2 Jsj/iZZZ높P:qԩtH TҠ;š /<P26eAYvu)iН1%1S$GFkݙm}Sui,x|F:Q@HNc-e$^3[j|̔ )S~1$,;`HZK;gkEm9:*lR fܡӭb?o""+pg.} "4͸1*$@u/yXRJ=J=SutV@s1(i)i[N- ""E$ͣsR?J %ڷ ?` D)S hQ(j7-L?R\e,#"ѿAk;k3įwYYk̶sBQ ~&O8 Zx(?%x^R^I#8`L?)R4<W#G(r`etpHtތc>\ 9>֝;QW*ƂǗ~jSΣ}zKŻ $G2ct-5KJJEDruy4:;/=Q崑' ~*;ŷ̥|: {E8)iНd4AwNqԹ{B_PtRR+"r{?z4lWw8/.NjPM4hzm987N>4n $h *)S @L0?` D)S @L0?` D)S @L0?` D)S @L0?` D)S @L0?` D)S @L0?` D)S @L0?` D)S @L0?` D)S @L0?` D)S @L0?` D)S @L0?` D)S @L0?` D)S pc@P+׭RB@` њ)p?ZN_6//ѡx7ъ_~q=J='3FA` DD5!+ ^[oc'Nsk oٴo03f<@gb[TG2'v.DVܢEf)<e,WJ' -ݫkn" h=jm~0'/-J _@eUfzCG6l΃)Dgk=jmvmE뼇e_\DE?S{г@OO͔'C8T]2\?DԊ]y G;$}ٕ ʭ|rkr#ҕrw=z=--oىn>Xdɂ(gYxp#(=E;ksz)7gp߮TqWW=O>RdYDD 8"wg ?Q_qu۪-mA^1ߋW2F[e_:,E}T"Rоj?^^upxBd=ܶ~ѷ׻{^l:oGw^eR[:;W I\ɧN~|3RϬr\=4ށ5u?H^:Po_UZ{<{lU=͔h^7"߶Z+6ϝ,}=쑿eMJiPjˇO3bA +ެ>uҟt9,Ayy_Rzxth:G[=VyGdAolð骀_]Y3omW'dƓ~۪9,fjK+(ەM8D6UߗmiomwT| ZW.x=Z%""&״~bw[yWMF?u7MHԾ笲̜ `UB{}J0C 9ەzA~9oїQTJKzRX*){J,Z⮮bc릛|:MÇS}OtHg~nm>\_Byy'S`ajȃ93"#RoaA/GDlKGHdIjʲAiӿnм]ƽxj?GωtHyd-jq#mzc3'Y?!E>Tr;;\ӡ֣xɂkfm~'ٿ@;K0|rVr1I&?F7rS"ҖBl$"jkaUDpj(Q*ww7.WϺ7 FKau`6%OԼ5[w=R^jfKvڭk~<9GW"Z^ɩ0V|üO>gJY,GkLy-k@.YTvUkM歏OjdVO} S=Yv4ߩ=$Fz+w"%?~goW|y_=9LtGD(1E4;t'{9q?n\&};q+d%~ q̜yI27hI(f7|nBf3s b!$$@6 ^[,W U.@|%~KI)ZFw[ߎ8Dɗs”OO4o{sM6k./ϊ(I%FbD gNH(vK2= \F?t?Mzodd? ^MuG 2mOJc9e9PnWFP{kܝd˗FZ=u޷lyӿ<@0K_W|wM8vW`G`F| EWK#^OCL}CUYpIFflwg}'qF#|~i|A&B;~?H'š F0. -y;lAlv̘|bIF{8`&6lAOlA<r h?r}O 0f#=zmIFVWWWqqqqWMl6-YC#c]E#~"(,h9b;X6oOK2DtW5bjfˊ p؈M?@"6~y}O-#B#C+s%a.uwh<0 {"o-"a~?/00_Tc\+"GܛW?vL.Qj|뷳]eB^&bE:Q}@?q=3ZFl4ZFl(^bUU,iUn."xVag[κ/q(a2'XUCk^ ro?!\D:(a"@Dv_dɷ1mea-tBn4:A6"; ^r?%oE$DN X0@o2c[[?Ǒ$9 L_7} |{=y_H޳ )Q”Yc'Nk U[#'^-d[g.@Dx&pF>x|ږǑD/7pĩf(L7qV[]<#Lw{L'^=4kc?H }Mo<AWUY{ڦUJx?q)ٷKww􁥻;V8Z))q.]⧓Onqqlȫ p;=?yo_98- ?# bq?g_w˂~;c.Or綜=O7^6.سP) ``M^}T&tNqF#[w7Xˏ)y37ܦg{/d^ߕvYT _+"m?r)0׵u"-|?ׯw5j=qR~HJai}Mגq,E.6c[7t־:6XQIa,i=h閍mGljS@MD3/(E.6ZɷuHh^ݑR>+Eڪ-m"Us@B,۵_ʭOߍ}(^WD$mGkP[^MtMݕŨ)9Vmyn}{5Sը{[2yGF OM?ټ… "bk<pa )q_ xWzH;z>dێw=71Gyn$`mgtw?Y}s*=C#Ջ?9hzѠӿZi;~U`sUOa~{oB~>9+7y~zOeo^Zdk~ ~o3Ͻn~ϯYZ5IxFfw۞MZgg+/̲l?"mՖxmޜKUץrWųGl兙9YqUs9{1Jq>[Uy?I{tn綩yhWsO85iT(%4?0NG*H[g$rkzGzG6\8zy"-J|wd謥0'ǵvYx#{ߵB)\ޔDJI;sMD&z:{2/aגJp+-{䩞$"@6;]yo{#t_h*^RYv^~m%jmWSrwJ:_ ݦ[ĵMTܲ`=qT~oq)Ӭ-um䗟J7Fk=666C*M;,rO%ލ׫ZrʒϷJpwt.YS.YY>.ĻtJYzK*?_~_(9/_t >׫=`[|y9MwޕZD`{f81C\k;s*..DHacIENDB`flexdock-1.2.4/docs/images/xor_preview.JPG0000644000175000017500000012215312177715062021323 0ustar sylvestresylvestreJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222X " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Ϯ]= p:q`REs'1Xb 2HuvzpK:U<复uP_o\x?{RR$(oJ0? aԢ;o*bpVEkA v8K ż3vZD`\p9;/+iE>vQߡR I-O7Sφ\16UCՒڶz b6'ވե+T;iE>vQߡW Iwcgmlai>̮YA8'éx[Q?b}@+sF_ͅdPspnxz*Vѕ;o(ҋ|Ш-NiӮR(3 W5u qu} DHyAUʥ("cFRWI;o(ҋ|ЩM 59uAwq-iRK DxܡK/vTqZǥ_<%mܲ221 қqjML@ʠHjD{9o7_m~QϝZLӼXd\dsUZ%t' h?( ?;o+2|\_m~QϝE9M?( ?;o+29PrQϝiE>vVer4;o(ҋ|Ь(AiiE>vQߡYQʃҋ|УJ/B()ߡG_m~fQG*SOJ/B( ̢T_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 ?;o+3bT_m~qϝ1G*SON/B8 )ߡG_m~fbQʃӋ|УN/B1F(Aii>vQߡYr4;o(Ӌ|ЬQ9Prqϝi>vVf(9M?8 O( &=AiiE>QZߡYrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SOJ/B( ǵ)ZߡG_k~fcڌ{Qʃҋ}-УJ/B1F=AiiE>QZߡYr4K_(ҋ}-Ь{Qj9PrQϥiE>Vf=ǵ9M?( ?K_+3cڎT_k~Qϥj1G*SQuv v5t-Q@ߧq%ͺ0 E_ы]lt$ J' #N-ɳ$㭮?UI༂閯,|IVN+) xn/$JЛji:uCO8eV_7ȯnɾESk7gzh߭w\YٚV1Sm<-&}6]ۢȘ]EBNP{ֹavlTҽGkƜU](D*Wݻ;vǽZok*yV'wFӉ [L}>C&Z[RY;qϕg𵽕8wzvGCKԓJ@Նtqoֿri~0T#m>Rn!2@3i>*{A!B8{~;7?ПWTSl}?iaNwm1tBKeS"X5ԋGK9% ē?VOgZ'K@TQ1WB j_U{xԚJ-ygBUs:pnqEhCsԓ c'i1Sr{6d/9=UAhV ܎$FLmld, )ا4)_]Ce$4JfeiBzVO!-9?oV3_*Ww߫5Ld`}g^е;X_WmNG-ޕqeo1Bp8Ni)-.-4ZQiW6|ȡٶ$ c 1/!-9?oVe:rV?Ɩ%5huO6ym[Gܱ]Vf##֯_xLm_ķKsqqqR| F Q'?G&/*B<[@s1U[_3_meVduqI>6Ҽ.L,Y~|=#ſ?G!-9Wa^*3==#ſ?G!-9ꘟqyy L_U?1?==#ſ?G!-9?0?zb9{Q{WGG&/*B<[@s1Th`~T#sL_Uxb>GG]!-9?oQ}S9#ڏ#ں?B<[@s1T C?c'sGGtxb#ſ?G~ALO?Gh tbſ?G~A\O?Gh tbſ?G~A\O?_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?OI&bſɘ?0?z7J<]' -7LQ? 1Th`~U#o>y'ҺOA[@o&b>Gߒ}(Ot3G -7LQ}W9$QJ?of/*A[@oC?c's~I>_U3G~A\O?G}+ſɘ?of/* ރ긟q'ҏ$WI? 1T_U?q?⏅#ź1F-tJ5Nooγ!omhхY׈]v9f>Y@V' RVQ׆Z ރ[^ n幷1(Gn iuo" k %AE$ZF>w9-prOX;Z_W(k+RrzdKoqe}&om,wYCe6M6궓=q$'͍׻xOMB_Ho ySF?+^;߹sVK.MLSkӵ 'KUuw*l23Տk|=DY@@Ϗ򳝟8͜<<ԣ%$i/$W{j5aY-Oʳ X|3^+VK_Zǩ@>ϩUS>U]՘ xڬLѩ I%@;96(*8Z4CYTI䷛Zx$HʖPlF@_ *egFr중/iuͺbK||}w|zG?h xu 2[h.cc \M.R"Q̫7uYVK^iR+iv 2`r ecB 6|-yxnG#-%,6-~j/BoitFh="i+q ARm6Wz}qk?сHDU%sx43}3jO,+V%6Хs2&o@鹲hK#Uk{+soUQ]X|D:"_*"_* RMG/DYzy񫙼My|:_"_*"_*FO&=pXB͚&R=Qx9Xw`/G`/\o?#s'Fo?#s'G+,ݗ%,ݗ%⫚n$hn$h`teDUeDUsYMMv_v_k77T}Uf7?4f7?4r:_"_*"_*FO&FO&VKX?/KQX?/KW5IћI~e>eyA?3yA?9X/`/G`/\o?#s'TV٪&ڝ~6!;wco8h`v_eDUeDUrO=/4EwsԒWHnfY dRȄǖ m Q~e>ei0i ˠ$t5wyk~#+*-nze>eߵ??7Y}aϹ}KȿX?/KQX?/KVd6\\YCH^I$%TP2I%0^߈X_r0KȿX?/KQX?/KUERKFDEdUF{V˗K/"pWO"`/G`/Pb74 ]ֆ\eDUeDUC G#3K]ցMX?/KQX?/KT?؍@/ui֋# C.2Twab`/G`/Pb韋?_Z17`/G`/Pb74 G's}T}U#3K]5mΛ` A'.@,}T}U,حٖm~*teDUeDUEa>6KhT}Ueߥ ?,?/QjKX?/KQX?/KWFݞHU0,<kv#FXXxKt~goǗ]t_eDUeDUs_o_W=3Tc??LcxeGt7Ox޿:zg~~yqy`.UL1./,Ӹ`/G`/\.UL1./,=z韺c1w,ݗ%,ݗ%⫝=z韺c1_o_W=3Tc??LcxeGt7Ox޿:zg~~yqy`.UL1./,Ӹ`/G`/\.UL1.//nẘHf L"[  4-$}T}U2񟋭>":%y`&#tN72f{%> OBm%FPUY rF9jI&dE;YX?/KQX?/KWzgO꺭5l eP./5tIgGE2#NT{` ,ݗ%,ݗ%5O|A/5xB+HduuUOR`( ـNBtf}X?/KW|q#ҶFok E:=*Eush䳍 9 8 Eot':hJ: Mj*S4Y/:9+kUPA*_yI;1g88b CE/^CRnD8]3/k .͵{;o!GP Q#$XIk&+^O6Dl좼#*vzWٴ/t}Bw^mΓoS?tRYn\Ф4- eA;rφ)̆le e D&<9(wEzoٴ/t}BwE/I Eq ͡ O 4Uh_S.6<5?(W͡ OE^6<5?h_S.{>͡ O 56. cp,v6y{ y^q+6<5?h_S.Z;X˻,sQeGE1C!uIkw~4ɵH v ow-./D?kM7 4P!qJþ=cm)B$ogeo1#}Yg*r,g𼫧GuZ 87RrI$+dH`yklkW?%hVM̦W)hw (>jww}gh!#ETwQuabWr6ҠӶwuIqb;c4Sʌ#bb@ K,Vq+I$ip_,<ʑna$gm !ԭ#y tu!{9BJ]:b/\kH o1@[S Ŷy#17qngTlVtUЌ,vͼ!kia.om;l,I${3My mvUqY?mE? q=x_}?7qhߗ;1>:I%TF\,"%'|lC:+{-[B)o^9_,qIt-[%u"t10WbJGE)={""wLݿw6@U'񎥨i3YZJL&dI2FA`HZF Cv#+XPy3^X"h&hu+mbӥadpQX)KƌQpjIň]i\[k涕|1)ViW!IӮwQ]‚"|K~ϑ3nGh1$uIb%0`! =(cjh,,%y$rr 1 rO @~T2sw4}Kֿ%hZ =x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]P}K /G+DTk_w4}K=x]$Mk_w4rtOEA /Gx]$M]1㩼+l}1c?&<>ֿ%k$&N6.s1b8pl^As[۩<{{9e|b$rx]Nwj/;9^9RFGF8Xeb9u xCW.n.{*&1pFBݽ* w5GK*IcҝV<¾)]X\ré UvD !B @x'լ۹R'uYL2DDpypq2?^7G w5hПc>#ְšQ-ݦ?.nD͉s(M( 馱&mL#IďD3 ??Σ}K/vض3g*} y|xW֫0̟˹7 w4?^7G.|E} y|xWKayw>ynƏ@<@+hѥ_0<_C?^7G w4h}^]ϞjwkysCr9o˭{ w4?^7Ci>:ezl$v,K0I/(  ~gPx_;KRWHXnƏ@<@+j>Ggt򴻂⶙{oMGqJ& ȹuc_q|t':, [}"]mq׊:ǎmm |KkŪM˫_, C_zI_3ׯ9/9kѴgѯ\O|6]+:( u5ܐ[C yh$~`1?ݩt )*z!f[mO}%g[u 彴&[C{41‘DAF&ۄ* e ;ISmຳȳY.-b)'?|By|׹}S{? o7Gٵ?u*׬!IEn(=^?ٵ?u5h-dHzY?5ha; +@((0:JѶZI{G5anZ}̷E.x 9NaVmPݙ-HyoȒJ䑣P&mPJϩA*>`e&WU(H #W"v5w!dF7;F#GMCnq*JҬ &w^ap1vHIqx׳6O*o_ηW9s!URXgi uc/^-u]0n"p̈62;d6ߛnjf4=o Y3\3OS=Ѵ]ZR2 -2C!2;Fxg4tWd{ r ,+s=׭[L 0)hL 0)hL 0)hL 0)hL 0)h?Np~(jgWDGzo1ط+Ӥ Y|*~~M>]=&P`QKE&P`QKE&P`QKE&P`QKE&P`QKE&P`WDəX|ݝ LgSbzyY|Ѽ+募7gC)G3ǘ?Qڥcz|]aERs,o"p1RNnOj_jg-]#Qיhi^YjS F0ݡd}6Bjg-6>n>$twVwڶږ9cz:Ojg-6>nx|I >X-b}OSt}v15>ZD#ў2sPh/Q6)Cnf*[u0ݲ@ͲYFc4rǰk>ͩϽڟKڶٖ0BуHVgXd#dpwdpEjQsڟK>ͩϽ(`׹mO}%f[rǰk“@W( s fTw֦5a_'EIQuMXq (5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQE学ua[| 4jZ*+15r)}G_Aɹby#w.<HCD1xR[aEKV{EdVޮ} y5~v&̆/ ]Gys5R"ΒaFǐD/𤗗WGF b/4dQ۫.Wm~^6n8LSh.f65|t&Yn$Tb=B$ВEI ΁o"}2/D`cƾTgnQqW^((YAֶ[XCH8Q@'ƙA?Uh.fZ?#gh?#gj{E,_glglUhgu5[3J c-⤢KiX(ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEo%vğ:GI]nF}B(0(((((((((((Ӥ Y|*~~M>]=qt/E\ocy8˿;b߾簠(((((((((((,Loϛ#cOC/*:TR,(@QEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~&~(jgWDGzo1ط+Ӥ Y|*~~M>]=QEQEQEQEQEQEQEQEQEQEQEegF|.|ݝ LgSbzyY|Ѽ+募7gC)G3ǘ?Qڥcz|]aER((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)(((((((((((3CV_3?芸ߟ"8~q~vſ}a\~&~(jgWDGzo1ط(((((((((((("΍_,\:O_2>^1<߱KG+Կ` (Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a"΍_,\:O_2>^1<:ψ3yW>nΆS̏3׌g)17RJ>/*:X2Š(EPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((?t 7jO? ڷ[#>ESQEQEQEQEQEQEQEQEQEQEQEg↬fq?tDq.~¸:LP՗"71ߜcߝosPEPEPEPEPEPEPEPEPEPEPEP^y_&to7bzz1'מ|EɝXvt2d}1c9Lycz|]V?QQE ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatWo%vպ (Š(((((((((((?N?5e3#o=7wl[g↬fq?tDq.~€ ( ( ( ( ( ( ( ( ( ( ( ψ3yW>nΆS̏3׌g)1=,Loϛ#c@ ԿRKG )QEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEqt/E\ocy8˿;b߾簮?N?5e3#o=7wl[QEQEQEQEQEQEQEQEQEQEQEW|EɝXvt2d}1c9LyuegF|.|ݝ LgSboޥ_#EGWj}_?TuveQH(((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEo%vğ:GI]nF}B(0(((((((((((Ӥ Y|*~~M>]=qt/E\ocy8˿;b߾簠(((((((((((,Loϛ#cOC/*:TR,(@QEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~&~(jgWDGzo1ط+Ӥ Y|*~~M>]=QEQEQEQEQEQEQEQEQEQEQEegF|.|ݝ LgSbzyY|Ѽ+募7gC)G3ǘ?Qڥcz|]aER((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQE`:GI]q'NaWm[P)(((((((((((3CV_3?芸ߟ"8~q~vſ}a\~&~(jgWDGzo1ط(((((((((((("΍_,\:O_2>^1<߱KG+Կ` (Q@Q@Q@Q@Q@Q@Q@Q@O`ѩ^a"΍_,\:O_2>^1<:ψ3yW>nΆS̏3׌g)17RJ>/*:X2Š(EPEPEPEPEPEPEPEP-S=#?jW|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((?t 7jO? ڷ[#>ESQEQEQEQEQEQEQEQEQEQEQEg↬fq?tDq.~¸:LP՗"71ߜcߝosPEPEPEPEPEPEPEPEPEPEPEP^y_&to7bzz1'מ|EɝXvt2d}1c9Lycz|]V?QQE ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEPSatWo%vպ (Š(((((((((((?N?5e3#o=7wl[g↬fq?tDq.~€ ( ( ( ( ( ( ( ( ( ( ( ψ3yW>nΆS̏3׌g)1=,Loϛ#c@ ԿRKG )QEQEQEQEQEQEQEQEKTH?IN?TH?INLlWEKI??Pr-z65곿/ v($ ( ( ( ( ( ( ( ( ( ( (0? ڸO+ϨQEQEQEQEQEQEQEQEQEQEQEQEqt/E\ocy8˿;b߾簮?N?5e3#o=7wl[QEQEQEQEQEQEQEQEQEQEQEW|EɝXvt2d}1c9LyuegF|.|ݝ LgSboޥ_#EGWj}_?TuveQH(((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEo%vğ:GI]nF}B(0(((((((((((Ӥ Y|*~~M>]=qt/E\ocy8˿;b߾簠(((((((((((,Loϛ#cOC/*:TR,(@QEQEQEQEQEQEQEQER??FyOӯO??FyOӯS&|'gxjCFOFy?܇^Ǥ?zB|6]+:((((((((((( O+$0:Ju3QE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~&~(jgWDGzo1ط+Ӥ Y|*~~M>]=QEQEQEQEQEQEQEQEQEQEQEegF|.|ݝ LgSbzyY|Ѽ+募7gC)G3ǘ?Qڥcz|]aER((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEs7ek&c^,}v!{gOJX/˺;'s܁o/?Zikb%GyXph+MU_?.}C >J QV??]@}_c<85Wyy?,*?G%GyXpj>!to/?G7Y-T畏&J_}C_?.o Z+Mc@]Agܵ QV???*?Uyy9Ϲk<84T畏&o/?G>!tsyr%GyXph+MU_?.}C >J QV??]@}_c<85Wyy?,*?G%GyXpj>!to/?G7Y05fHKjNUV\ND. BgoV1Bv#gb>~:Lgz+:t'v3K,J-8ǣl#ͤɿnvϛ&}|ņh'n~6q#cwFh'n~6q#cwkLn߻v`;oݟgo6&3۷ݺg>l'3 Pq޹Pq޹i2o<=~ۡݿv~nsɟ_1r~:LgzoV1Bv#gb>~:Lgzͤɿnvϛ&}|i2o<=~ۡݿv~nsɟ_1rs0a!Z. ۟,n1둾!Z. ۟,n16&3۷ݺg>l#ͤɿnvϛ&}|ņh'n~6q#cwFh'n~6q#cwkLn߻v`;oݟgo6&3۷ݺg>l'3 Pq޹Pq޹i2o<=~ۡݿv~nsɟ_1r~:LgzoV1Bv#gb>~:Lgzͤɿnvϛ&}|i2o<=~ۡݿv~nsɟ_1rs0a!Z. ۟,n1둾!Z. ۟,n16&3۷ݺg>l#ͤɿnvϛ&}|ņh'n~6q#cwFh'n~6q#cwkLn߻v`;oݟgo6&3۷ݺg>l'3 Pq޹Pq޹i2o<=~ۡݿv~nsɟ_1r~:LgzFC2F# '͸\g d]In vs6L㗥tНf \HB1.INoSG3 !R\) $IT|V?4]@Xe36Ə36ƪo/?G>!tX _glglU_?.}C4?4]@`-li4li5Wyy?Z?#gh?#gj>!to/?EFF_}C_?.kcL_cL_@]ƙA?GƙA?Uyy,36Ə36ƪo/?G>!tXR(F'󯎟o^K=A w@$tbzڼx?iקYϊ~h_<5!rףi'|^xjCFOF_Muowf-Zr̛%i.:xt/ ͦBaӴHj[g>ʭfjEQSfjGf<3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g(5?g3SV.3SV?5?g*0K"`#h@[9#N+?EٚQt1k=B8L s'PiHo{+[! YR#8=#Q$6aFN>!ouJ,Vܪq~Bw- }y.:[^i Nej__+Q^IQEQEQEQEQEQEQEQEQEQEQEaD^EI5 \q v%⪔a؊_v%˷/WhqKQo=/?2_*Eo=/?2_*yUv./yTeK Qp)eK .z^dU]K.z^dUv%\ _v%˷/WhR˷/G]E]?KU(KQo=/?2_*Eo=/?2_*yUv./yTeK Qp)eK .z^dU]K.z^dUv%\ ٭4}}nU#O?ֶ/g5؛Lz%>qeiy{v;uQM\?$1nA']^ƺ ֝oiu=0i@eDBWr60vZ,)wVwQ[HA p {!Fᜠ2]?$1nA']MxQtge0E,LF%j3n;Ӯ͋:ٍnv[9R[;IQȂ죷HO.G2ukVZǚlZy#LG N3  gBDg#HO.G2uQG" ۤIc'F#O?먣?$1_v%_X%{IS5e)eK .z^dU]E/yTeK Qp)eK .z^dU]K.z^dUv%\ _v%˷/WhR˷/G]E]?KU(KQo=/?2_*Eo=/?2_*yUv./yTeK Qp)eK .z^dU]K.z^dUv%\ _v%˷/WhR˷/G]E*;X)nGu#  ל|t':S=#?jW|t':2oK9_/~ dž?Zm/=$kל C_zI_3ת|$,We((((((((((((Ń\#sj`zڦQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ m!?_ :mv[[I ,W-ll -|x#$.Ӥ\K @ O"+hY",Rךvgm n;E! waE=?iXC(ԛ4>l`1F/?'s|EQ 5sWKm.Q&pmq>t^|YNݬAg! _Gw4mF7}c.n~qt\^N"(pױ<6Q{ ϰ% oi\&GX*@lAXF/?'s|EQcn1yA;/"h {tV&/?'s|EQ sGkؽMUCsq˨ܴr)Fb`XJI(̠(((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEb.?XˏnmSb (Š(((((((((((((((((((((((((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEFkb.?M(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rףi'|^xjCFOFVwS!`.EAEPEPEPEPEPEPEPEPEPEPEP,aFk6 ) ((((((((((((((((((((((((((((((((((ǤJo^ǤJo^M{Ig6+O?܇^Ǥ?zKI?YO䅃 lEWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ˏnmV,a؂(0((((((((((((((((((((((((((((((((((5+>:ǎmz~5+>:ǎmz7?%د??Pr-z65~ dž?Zm/=$kg>_+Q^IQEQEQEQEQEQEQEQEQEQEQEb.?XˏnmSb (Š(((((((((((((((((((((((((((((((((( ZzG_0ԯ0:OuzG_0ԯ0:Oudsb_, C_zI_3ׯ9/9kѴgѯU~HX?௟˴QEy'PQEQEQEQEQEQEQEQEQEQEQEFkb.?M(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()j|Rx?iק|Rx?iשCY͊~h_<5!rav*47dKYn)Dkķ(@p3>{9I_DhGӨkOo.h I4uO?M+si'BOhy~7ټóǗָRs)r'1`v >QNտ?5xɛFj_z8>qgbwzIp3ium.ϐqmV͍_z-̈́MN0[ȋo) ;~WVpWVp?_ +eV{>[6Ioum!]\3Spƍk~8C|E;6"N.t?ں]ں]^Kay2rB76C-u #T= h*&Ly]( (((}Tvj-c)I#%[A=HږiERԷw/G9Vvo/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɯ^ɯŠ(ϵg7M7MQGf }_֯?oo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵokk?0_}0- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QE٘/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEf`aj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- _- _Qkߗ/K_aG/K_aEeaj3??zZ& ?zZ& (3>/kW/^ɿ^ɯŠ(ϵokk?_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (/>/kW/^ɿ^ɿŠ(ϵooo?0_}0 k@o(k@o(_|=_?zZ& ?zZ& (3>/kW/^ɿ^ɿŠ(ϵokk?_}0- _- Qkߗ/K_aG/K_aEf`aj7A 7Q 7QEx/{Z7M7MQG^ }_֯~_- - Qkߗ/K_aG/K_aEeaj7A 7WA+[D߻vF>E,8Y7[&S+flexdock-1.2.4/lib/0000755000175000017500000000000012177715062014755 5ustar sylvestresylvestreflexdock-1.2.4/lib/LICENSE.txt0000644000175000017500000002613612177715062016610 0ustar sylvestresylvestre Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. flexdock-1.2.4/lib/jmf/0000755000175000017500000000000012177715062015531 5ustar sylvestresylvestreflexdock-1.2.4/lib/jmf/doc/0000755000175000017500000000000012177715062016276 5ustar sylvestresylvestreflexdock-1.2.4/lib/jmf/doc/readme.html0000644000175000017500000005160512177715062020430 0ustar sylvestresylvestre JMF 2.1.1e README

JavaTM Media Framework 2.1.1e API
README and BINARY CODE LICENSE

Table of Contents


Introduction

The JavaTM Media Framework (JMF) is an application programming interface (API) for incorporating media data such as audio and video into Java applications and applets. It is specifically designed to take advantage of Java platform features.

The JMF 1.0 API (the Java Media Player API) enables programmers to develop Java programs for playback of time-based media. The JMF 2.0 API extends the framework by providing support for capturing and storing media data, controlling the type of processing that is performed during playback, and performing custom processing on media data streams. In addition, JMF 2.0 defines a plug-in API that enables advanced developers and technology providers to more easily customize and extend JMF functionality.

The latest implemenation of this API from Sun is JMF 2.1.1e, which includes several improvements to RTP/RTSP components and numerous bug-fixes.

You can download all of the documentation for this release, including the setup information and sample code, from:

http://java.sun.com/products/java-media/jmf/2.1.1/documentation.html

Quick Install

Here are some quick instructions for installing JMF 2.1.1e. Complete instructions for setting up and running JMF are available from the JMF web site at:

http://java.sun.com/products/java-media/jmf/2.1.1/setup.html

Installing JMF 2.1.1e or JMF 2.1.1e for Web Servers (i.e. Java versions)

The install package for Java clients is a zip file. Use a zip utility to extract the files and then set your class path to reference the JMF directory. For example:

On Solaris and Linux:

setenv JMFHOME /home/someuser/JMF2.1.1
setenv CLASSPATH $JMFHOME/lib/jmf.jar:.:${CLASSPATH}:

On AIX:

setenv JMFHOME /usr/JMF2.1.1
setenv CLASSPATH $JMFHOME/lib/jmf.jar:.:${CLASSPATH}:

On Windows:

set JMFHOME=C:\JMF2.1.1
set CLASSPATH=%JMFHOME%\lib\jmf.jar;.;%CLASSPATH%

Installing JMF 2.1.1 with Solaris or Linux Performance Pack

The Solaris and Linux install packages contain an exectuable installation program. Run the installation program to extract JMF and then set your class path to reference the JMF directory. For example:

setenv JMFHOME /home/someuser/JMF2.1.1
setenv CLASSPATH $JMFHOME/lib/jmf.jar:$JMFHOME/lib/sound.jar:.:${CLASSPATH}

You'll also need to set your LD_LIBRARY_PATH (shared libraries path) to point to the JMF libraries. For example:

setenv LD_LIBRARY_PATH $JMFHOME/lib:${LD_LIBRARY_PATH}

Installing JMF 2.1.1 with Windows Performance Pack

The Windows install package package contains an InstallShield installation program. Run the installation program to extract JMF and configure your environment variables.During installation, InstallShield should automatically set up your CLASSPATH and PATH:

set CLASSPATH=%JMFHOME%\lib\jmf.jar;%JMFHOME%\lib\sound.jar;.;%CLASSPATH%

set PATH=%WINDIR%\System32;%PATH% (on Windows NT)
set PATH=%WINDIR%\System;%PATH% (on Windows 95/98)

Verifying your Installation

To verify that JMF is set up properly on your system, use the JMF Diagnostics applet at:

http://java.sun.com/products/java-media/jmf/2.1.1/jmfdiagnostics.html

Security Note

During the installation, you will be asked two security related questions:

  • Permit recording from an applet

    If you agree to this, JMF will allow applets to capture audio and video from the local capture devices. It is possible for a malicious hidden applet on a web page to quietly record sounds or video from your system and transmit the data back to a system on the internet. This is usually a risk only if you visit unfamiliar web sites.

    You can disable or enable this feature by running the JMFRegistry application (or choose Preferences from the JMStudio File menu), modify the setting in the User Settings tab and commit the changes.

  • Permit writing local files from an applet

    This is a greater security risk since a malicious applet can overwrite files on your hard disk without your knowledge. Enable this feature only if you need it for a specific application and are sure that you will not visit any possibly malicious web sites.

    You can disable or enable this feature by running the JMFRegistry application (or choose Preferences from the JMStudio File menu), modify the setting in the User Settings tab and commit the changes.


JMF Install Contents

This release contains the following directories:

  • bin - contains scripts to launch a few java applications
  • doc - contains this file
  • lib - contains the compiled java classes and the compiled native libraries for the JMF players

Distributing JMF with your Java software

Sun Microsystems allows vendors to distribute JMF 2.1.1e with their Java software, as long as their software uses JMF 2.1.1e and provided they follow the terms of the JMF 2.1.1e Binary Code License agreement. This document uses the term "vendors" to refer to licensees, developers, and independent software vendors (ISVs) who license and distribute the JMF with their Java programs.

REQUIRED versus OPTIONAL FILES

Vendors must follow the terms of the JMF Binary Code License agreement, which includes these terms:

  • Don't arbitrarily subset the JMF. You may, however, omit those files that have been designated below as "optional" or that are removable by using the JMF Customizer Tool provided.
  • Include in your product's license the provisions called out in the JMF Binary Code License.

Bundling JMF

This Solaris, Linux and Windows version of the JMF comes with its own installer that simplifies the installation of JMF. Other versions of JMF are bundled in a zip file which needs to be unzipped to be installed.

Vendors have the option of delivering the Solaris, Linux, Windows, and/or zip install binaries with their software, and having the user run them separately, or to bundle JMF directly with the install procedures of thier software.

Required Files

All the files and directories in the lib directory are required unless they are listed under Optional Files below or are removable using the JMF Customizer Tool. Likewise, this readme.html is a required file and must always be included with JMF 2.1.1e.

Optional Files

The following files are optional:

  • doc/*
  • bin/*
  • lib/soundbank.gm
  • lib/sound.jar
  • lib/jsound.dll or lib/libjsound.so

JavaTM Media Framework (JMF) 2.1.x
Binary Code License Agreement

READ THE TERMS OF THIS AGREEMENT AND ANY PROVIDED SUPPLEMENTAL LICENSE TERMS (COLLECTIVELY "AGREEMENT") CAREFULLY BEFORE OPENING THE SOFTWARE MEDIA PACKAGE. BY OPENING THE SOFTWARE MEDIA PACKAGE, YOU AGREE TO THE TERMS OF THIS AGREEMENT. IF YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, INDICATE YOUR ACCEPTANCE OF THESE TERMS BY SELECTING THE "ACCEPT" BUTTON AT THE END OF THIS AGREEMENT. IF YOU DO NOT AGREE TO ALL OF THE TERMS, PROMPTLY RETURN THE UNUSED SOFTWARE TO YOUR PLACE OF PURCHASE FOR A REFUND OR, IF THE SOFTWARE IS ACCESSED ELECTRONICALLY, SELECT THE "DECLINE" BUTTON AT THE END OF THIS AGREEMENT.

1. License to Use. Sun Microsystems, Inc. ("Sun") grants you a non-exclusive and non-transferable license for the internal use only of the accompanying software and documentation and any error corrections provided by Sun (collectively "Software"), by the number of users and the class of computer hardware for which the corresponding fee has been paid.

2. Restrictions. Software is confidential and copyrighted. Title to Software and all associated intellectual property rights is retained by Sun and/or its licensors. Except as specifically authorized in any Supplemental License Terms, you may not make copies of Software, other than a single copy of Software for archival purposes. Unless enforcement is prohibited by applicable law, you may not modify, decompile, or reverse engineer Software. You acknowledge that Software is not designed or intended for use in the design, construction, operation or maintenance of any nuclear facility. Sun disclaims any express or implied warranty of fitness for such uses. No right, title or interest in or to any trademark, service mark, logo or trade name of Sun or its licensors is granted under this Agreement.

3. Limited Warranty. Sun warrants to you that for a period of ninety (90) days from the date of purchase, as evidenced by a copy of the receipt, the media on which Software is furnished (if any) will be free of defects in materials and workmanship under normal use. Except for the foregoing, Software is provided "AS IS". Your exclusive remedy and Sun's entire liability under this limited warranty will be at Sun's option to replace Software media or refund the fee paid for Software.

4. DISCLAIMER OF WARRANTY. UNLESS SPECIFIED IN THIS AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.

5. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. In no event will Sun's liability to you, whether in contract, tort (including negligence), or otherwise, exceed the amount paid by you for Software under this Agreement. The foregoing limitations will apply even if the above stated warranty fails of its essential purpose.

6. Termination. This Agreement is effective until terminated. You may terminate this Agreement at any time by destroying all copies of Software. This Agreement will terminate immediately without notice from Sun if you fail to comply with any provision of this Agreement. Upon Termination, you must destroy all copies of Software.

7. Export Regulations. All Software and technical data delivered under this Agreement are subject to US export control laws and may be subject to export or import regulations in other countries. You agree to comply strictly with all such laws and regulations and acknowledge that you have the responsibility to obtain such licenses to export, re-export, or import as may be required after delivery to you.

8. U.S. Government Restricted Rights. If Software is being acquired by or on behalf of the U.S. Government or by a U.S. Government prime contractor or subcontractor (at any tier), then the Government's rights in Software and accompanying documentation will be only as set forth in this Agreement; this is in accordance with 48 C.F.R. 227.7202-4 (for Department of Defense (DOD) acquisitions) and with 48 CFR 2.101 and 12.212 (for non-DOD acquisitions).

9. Governing Law. Any action related to this Agreement will be governed by California law and controlling U.S. federal law. No choice of law rules of any jurisdiction will apply.

10. Severability. If any provision of this Agreement is held to be unenforceable, this Agreement will remain in effect with the provision omitted, unless omission would frustrate the intent of the parties, in which case this Agreement will immediately terminate.

11. Integration. This Agreement is the entire agreement between you and Sun relating to its subject matter. It supersedes all prior or contemporaneous oral or written communications, proposals, representations and warranties and prevails over any conflicting or additional terms of any quote, order, acknowledgment, or other communication between the parties relating to its subject matter during the term of this Agreement. No modification of this Agreement will be binding, unless in writing and signed by an authorized representative of each party.

JavaTM Media Framework (JMF) 2.1.x
Supplemental License Terms

These supplemental license terms ("Supplemental Terms") add to or modify the terms of the Binary Code License Agreement (collectively, the "Agreement"). Capitalized terms not defined in these Supplemental Terms shall have the same meanings ascribed to them in the Agreement. These Supplemental Terms shall supersede any inconsistent or conflicting terms in the Agreement, or in any license contained within the Software.

1. Software Internal Use and Development License Grant. Subject to the terms and conditions of this Agreement, including, but not limited to Section 3 (Java Technology Restrictions) of these Supplemental Terms, Sun grants you a non-exclusive, non-transferable, limited license to reproduce internally and use internally the binary form of the Software, complete and unmodified, for the sole purpose of designing, developing and testing your Java applets and applications ("Programs").

2. License to Distribute Software. In addition to the license granted in Section 1 (Software Internal Use and Development License Grant) of these Supplemental Terms, subject to the terms and conditions of this Agreement, including but not limited to, Section 3 (Java Technology Restrictions) of these Supplemental Terms, Sun grants you a non-exclusive, non-transferable, limited license to reproduce and distribute the Software in binary code form only, provided that you: (i) distribute the Software complete and unmodified, except that you may omit those files specifically identified as"optional" in the Software "README" file, which include samples, documents, and bin files, or that are removable by using the Software customizer tool provided, only as part of and for the sole purpose of running your Program into which the Software is incorporated; (ii) do not distribute additional software intended to replace any components of the Software; (iii) do not remove or alter any proprietary legends or notices contained in the Software; (iv) only distribute the Software subject to a license agreement that protects Sun's interests consistent with the terms contained in this Agreement; and (v) agree to defend and indemnify Sun and its licensors from and against any damages, costs, liabilities, settlement amounts or expenses, including attorneys' fees, incurred in connection with any claim, lawsuit or action by any third party that arises or results from the use or distribution of any and all Programs or Software.

3. Java Technology Restrictions. You may not modify the Java Platform Interface ("JPI", identified as classes contained within the "java" package or any subpackages of the "java" package), by creating additional classes within the JPI or otherwise causing the addition to or modification of the classes in the JPI. In the event that you create an additional class and associated API's, which: (i) extends the functionality of the Java platform, and (ii) is exposed to third party software developers for the purpose of developing additional software which invokes such additional API, you must promptly publish broadly an accurate specification for such API for free use by all developers. You may not create, or authorize your licensees to create additional classes, interfaces, packages or subpackages that are in any way identified as "java", "javax", "sun" or similar convention as specified by Sun in any class file naming convention designation.

4. Java Runtime Availability. Refer to the appropriate version of the Java Runtime Environment binary code license (currently located at http://www.java.sun.com/jdk/index.html) for the availability of runtime code which may be distributed with Java applets and applications.

5. Trademarks and Logos. You acknowledge and agree as between you and Sun that Sun owns the SUN, SOLARIS, JAVA, JINI, FORTE, STAROFFICE, STARPORTAL and iPLANET trademarks and all SUN, SOLARIS, JAVA, JINI, FORTE, STAROFFICE, STARPORTAL and iPLANET-related trademarks, service marks, logos and other brand designations ("Sun Marks"), and you agree to comply with the Sun Trademark and Logo Usage Requirements currently located at http://www.sun.com/policies/trademarks. Any use you make of the Sun Marks inures to Sun's benefit.

6. Source Code. Software may contain source code that is provided solely for reference purposes pursuant to the terms of this Agreement. Source code may not be redistributed unless expressly provided for in this Agreement.

7. Termination for Infringement. Either party may terminate this Agreement immediately should any Software become, or in either party's opinion be likely to become, the subject of a claim of infringement of any intellectual property right.

For inquiries please contact: Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, California 95054.

LFI# 129621/Form ID#011801


This page was last modified on 1-May-2003
Copyright 1995-2003, Sun Microsystems, Inc.
All Rights Reserved
flexdock-1.2.4/lib/jmf/lib/0000755000175000017500000000000012177715062016277 5ustar sylvestresylvestreflexdock-1.2.4/lib/jmf/lib/jmf.properties0000644000175000017500000005431212177715062021176 0ustar sylvestresylvestrew:~0PIM.5_com.sun.media.multiplexer.audio.MPEGMux.inur[Ljavax.media.Format;Ĝ6Jxpw/-PIM.1_com.sun.media.parser.video.AviParser.inur)[Ljavax.media.protocol.ContentDescriptor;_H86xpsr&javax.media.protocol.ContentDescriptord;xrjavax.media.FormatMު]J encodingCodeLclztLjava/lang/Class;LdataTypeq~LencodingtLjava/lang/String;xpvq~vr[BTxptvideo.x_msvideow0.PIM.1_com.sun.media.parser.RawBufferParser.outq~w75PIM.2_com.sun.media.codec.audio.ulaw.DePacketizer.outuq~srjavax.media.format.AudioFormat8#Z0 IchannelsIendianD frameRateIframeSizeInBitsZinitImarginD multiplierD sampleRateIsampleSizeInBitsIsignedxq~vq~q~ tULAWw86PIM.2_com.ibm.media.codec.audio.ima4.JavaDecoder_ms.inur![Ljavax.media.format.AudioFormat;jV{xpsq~q~q~ tima4/msw1/PIM.5_com.sun.media.multiplexer.RawBufferMux.inq~w<:PIM.4_com.sun.media.renderer.video.LightWeightRenderer.outq~w0.PIM.1_com.sun.media.parser.audio.GsmParser.outq~w53PIM.2_com.sun.media.codec.audio.ulaw.Packetizer.outuq~sq~q~q~ tULAW/rtpw20PIM.5_com.sun.media.multiplexer.audio.AIFFMux.inq~w31PIM.2_com.sun.media.codec.audio.mpa.Packetizer.inuq~ sq~q~q~ t mpeglayer3@@sq~q~q~ q~@Ոsq~q~q~ q~@psq~q~q~ q~@@sq~q~q~ q~@刀sq~q~q~ q~@psq~q~q~ t mpegaudio@@sq~q~q~ q~"@Ոsq~q~q~ q~"@psq~q~q~ q~"@@sq~q~q~ q~"@刀sq~q~q~ q~"@pw97PIM.2_com.ibm.media.codec.audio.ima4.JavaDecoder_ms.outuq~sq~q~q~ tLINEARw42PIM.2_com.sun.media.codec.video.jpeg.Packetizer.inur![Ljavax.media.format.VideoFormat;!&Hxpsrjavax.media.format.VideoFormat1 n!F frameRateI maxDataLengthLsizetLjava/awt/Dimension;xq~vq~-q~ tjpegpw20PIM.5_com.sun.media.multiplexer.RawBufferMux.outuq~sq~q~ q~ traww0.PIM.1_com.sun.media.parser.video.AviParser.outq~w secure.allowCaptureFromAppletssrjava.lang.Boolean r՜Zvaluexpw42PIM.2_com.ibm.media.codec.audio.gsm.JavaDecoder.inuq~sq~q~q~ tgsmsq~q~q~ tgsm/rtpw/-PIM.1_com.sun.media.parser.RawStreamParser.inuq~sq~q~ q~ q~4w53PIM.2_com.ibm.media.codec.audio.ulaw.JavaDecoder.inuq~sq~q~q~ q~w0.PIM.1_com.sun.media.parser.RawStreamParser.outq~w!secure.allowSaveFileFromAppletssq~5w42PIM.4_com.sun.media.renderer.video.JPEGRenderer.inuq~+sq~-q~0q~ q~1pw1/PIM.5_com.sun.media.multiplexer.audio.AUMux.outuq~sr'javax.media.protocol.FileTypeDescriptorOfGxq~vq~Dq~ t audio.basicw31PIM.1_com.sun.media.parser.RawPullStreamParser.inuq~sq~q~ q~ q~4w53PIM.4_com.sun.media.renderer.video.JPEGRenderer.outq~wsecure.allowCachingsq~5w42PIM.2_com.sun.media.codec.audio.ulaw.Packetizer.inuq~sq~q~q~ q~w53PIM.2_com.ibm.media.codec.audio.ima4.JavaEncoder.inuq~sq~q~q~ q~*w0.PIM.2_com.sun.media.codec.audio.rc.RateCvrt.inuq~sq~q~q~ q~*w86PIM.2_com.sun.media.codec.audio.msadpcm.JavaDecoder.inuq~sq~q~q~ tmsadpcmw64PIM.2_com.sun.media.codec.audio.ulaw.DePacketizer.inuq~sq~q~q~ q~w.,PIM.1_com.sun.media.parser.audio.AuParser.inuq~sq~q~ q~ q~Gw53PIM.2_com.ibm.media.codec.audio.g723.JavaDecoder.inuq~sq~q~q~ tg723sq~q~q~ tg723/rtpw75PIM.2_com.ibm.media.codec.audio.gsm.JavaEncoder_ms.inuq~sq~q~q~ q~*w@>PIM.2_com.sun.media.codec.video.colorspace.JavaRGBConverter.inuq~srjavax.media.format.RGBFormatD|bUII bitsPerPixelIblueMaskIendianIflippedI greenMaskI lineStrideI pixelStrideIredMaskxq~-vq~`ptrgbpw53PIM.2_com.ibm.media.codec.audio.alaw.JavaDecoder.inuq~sq~q~q~ talaww;9PIM.4_com.sun.media.renderer.video.LightWeightRenderer.inuq~+sq~`q~bvr[IM`&v겥xpq~cp sq~`q~bq~jq~cp w53PIM.2_com.ibm.media.codec.audio.dvi.JavaDecoder.outuq~sq~q~q~ q~*w42PIM.2_com.sun.media.codec.audio.mpa.JavaDecoder.inuq~sq~q~q~ q~"@@sq~q~q~ q~"@Ոsq~q~q~ q~"@psq~q~q~ q~"@@sq~q~q~ q~"@刀sq~q~q~ q~"@pw0.PIM.5_com.sun.media.multiplexer.audio.AUMux.inq~w:8PIM.4_com.sun.media.renderer.audio.JavaSoundRenderer.outq~w1/PIM.5_com.sun.media.multiplexer.audio.GSMMux.inq~w<:PIM.2_com.sun.media.codec.video.colorspace.JavaRGBToYUV.inuq~sq~`q~bq~ q~cpsq~`q~bq~jq~cp sq~`q~bq~jq~cp wPM.protocolPrefixListsrjava.util.Vectorٗ}[;IcapacityIncrementI elementCount[ elementDatat[Ljava/lang/Object;xpur[Ljava.lang.Object;Xs)lxp tjavaxtcom.suntcom.ibmpppppppw53PIM.2_com.sun.media.codec.video.jpeg.Packetizer.outuq~+sq~-q~0q~ tjpeg/rtppw86PIM.2_com.ibm.media.codec.audio.gsm.JavaEncoder_ms.outuq~sr#com.sun.media.format.WavAudioFormatë]f܎IaverageBytesPerSecond[codecSpecificHeadert[Bxq~vq~q~ tgsm/mspw53PIM.2_com.ibm.media.codec.video.h263.JavaDecoder.inuq~+sq~-q~0q~ th263psq~-q~0q~ th263/rtppw PIM.listssrjava.util.Hashtable%!JF loadFactorI thresholdxp?@wsrjava.lang.Integer⠤8Ivaluexrjava.lang.Number xpsrjavax.media.pim.ListInfo3W^jItypeL classNamestLjava/util/Vector;xpsq~yuq~|srjavax.media.pim.ClassNameInfoi?J hashValueL classNameq~xpY t.com.sun.media.renderer.audio.JavaSoundRenderersq~DĴrmt-com.sun.media.renderer.audio.SunAudioRenderersq~t.Y7t(com.sun.media.renderer.video.AWTRenderersq~dJT^Jt0com.sun.media.renderer.video.LightWeightRenderersq~9>Lt)com.sun.media.renderer.video.JPEGRenderersq~sq~sq~y!uq~|(sq~wߤt)com.sun.media.codec.audio.mpa.JavaDecodersq~UwvUs_t-com.sun.media.codec.video.cinepak.JavaDecodersq~C><۞Ft*com.ibm.media.codec.video.h263.JavaDecodersq~@-XKt5com.sun.media.codec.video.colorspace.JavaRGBConvertersq~ ot1com.sun.media.codec.video.colorspace.JavaRGBToYUVsq~u Ft"com.ibm.media.codec.audio.PCMToPCMsq~v+)_t%com.ibm.media.codec.audio.rc.RCModulesq~v+&ѿt%com.sun.media.codec.audio.rc.RateCvrtsq~{b^qt-com.sun.media.codec.audio.msadpcm.JavaDecodersq~YX;t*com.ibm.media.codec.audio.ulaw.JavaDecodersq~ vwwt*com.ibm.media.codec.audio.alaw.JavaDecodersq~+Cp*st)com.ibm.media.codec.audio.dvi.JavaDecodersq~[t*com.ibm.media.codec.audio.g723.JavaDecodersq~<t)com.ibm.media.codec.audio.gsm.JavaDecodersq~g1wGujt,com.ibm.media.codec.audio.gsm.JavaDecoder_mssq~i3Wt*com.ibm.media.codec.audio.ima4.JavaDecodersq~uV)xt-com.ibm.media.codec.audio.ima4.JavaDecoder_mssq~yAt*com.ibm.media.codec.audio.ulaw.JavaEncodersq~+Cpӹt)com.ibm.media.codec.audio.dvi.JavaEncodersq~Yt)com.ibm.media.codec.audio.gsm.JavaEncodersq~g2 ;t,com.ibm.media.codec.audio.gsm.JavaEncoder_mssq~i4MxVt*com.ibm.media.codec.audio.ima4.JavaEncodersq~u>ITt-com.ibm.media.codec.audio.ima4.JavaEncoder_mssq~;̼%#t)com.sun.media.codec.audio.ulaw.Packetizersq~Al`t+com.sun.media.codec.audio.ulaw.DePacketizersq~ <#t(com.sun.media.codec.audio.mpa.Packetizersq~‚l=3(t*com.sun.media.codec.audio.mpa.DePacketizersq~Tk;4t(com.ibm.media.codec.audio.gsm.Packetizersq~^eS[Yt)com.ibm.media.codec.audio.g723.Packetizersq~xm@Ht)com.sun.media.codec.video.jpeg.Packetizersq~*Rjޚ-:t+com.sun.media.codec.video.jpeg.DePacketizersq~>``t)com.sun.media.codec.video.mpeg.Packetizersq~mj}t+com.sun.media.codec.video.mpeg.DePacketizerpppppppsq~sq~sq~y uq~|sq~f}p.-]~t%com.ibm.media.parser.video.MpegParsersq~^Z$*t$com.sun.media.parser.audio.WavParsersq~c$ :&$t#com.sun.media.parser.audio.AuParsersq~ ^FKt%com.sun.media.parser.audio.AiffParsersq~^(-;t$com.sun.media.parser.audio.GsmParsersq~t$com.sun.media.parser.RawStreamParsersq~Mȭt$com.sun.media.parser.RawBufferParsersq~*t(com.sun.media.parser.RawPullStreamParsersq~lNt(com.sun.media.parser.RawPullBufferParsersq~F-utt*com.sun.media.parser.video.QuicktimeParsersq~Ret$com.sun.media.parser.video.AviParserpppppppppsq~sq~sq~y uq~| sq~ݓNUt&com.sun.media.multiplexer.RawBufferMuxsq~-ut*com.sun.media.multiplexer.RawSyncBufferMuxsq~m+t*com.sun.media.multiplexer.RTPSyncBufferMuxsq~W-t&com.sun.media.multiplexer.audio.GSMMuxsq~"L{S&t'com.sun.media.multiplexer.audio.MPEGMuxsq~WS3t&com.sun.media.multiplexer.audio.WAVMuxsq~"L3t'com.sun.media.multiplexer.audio.AIFFMuxsq~<50:t%com.sun.media.multiplexer.audio.AUMuxsq~6/K =Bt&com.sun.media.multiplexer.video.AVIMuxsq~mQ|0(Tt,com.sun.media.multiplexer.video.QuicktimeMuxxw53PIM.1_com.sun.media.parser.video.QuicktimeParser.inuq~sq~q~ q~ tvideo.quicktimew64PIM.2_com.ibm.media.codec.audio.ulaw.JavaDecoder.outuq~sq~q~q~ q~*w75PIM.5_com.sun.media.multiplexer.video.QuicktimeMux.inq~w31PIM.5_com.sun.media.multiplexer.audio.MPEGMux.outuq~sq~Dq~Fq~ t audio.mpegw64PIM.5_com.sun.media.multiplexer.RTPSyncBufferMux.outuq~sq~q~ q~ traw.rtpw/-PIM.1_com.sun.media.parser.audio.GsmParser.inuq~sq~q~ q~ t audio.x_gsmw-+PIM.2_com.ibm.media.codec.audio.PCMToPCM.inuq~sq~q~q~ q~*sq~q~q~ q~*sq~q~q~ q~*sq~q~q~ q~*w1/PIM.1_com.sun.media.parser.audio.AiffParser.outq~w64PIM.2_com.sun.media.codec.audio.mpa.DePacketizer.outuq~sq~q~q~ q~"@刀sq~q~q~ q~"@psq~q~q~ q~"@@sq~q~q~ q~"@Ոsq~q~q~ q~"@psq~q~q~ q~"@@sq~q~q~ q~"@ňsq~q~q~ q~"@psq~q~q~ q~"@@sq~q~q~ q~@刀sq~q~q~ q~@psq~q~q~ q~@@sq~q~q~ q~@Ոsq~q~q~ q~@psq~q~q~ q~@@sq~q~q~ q~@ňsq~q~q~ q~@psq~q~q~ q~@@w53PIM.2_com.ibm.media.codec.audio.gsm.JavaDecoder.outuq~sq~q~q~ q~*w0.PIM.1_com.ibm.media.parser.video.MpegParser.inuq~sq~q~ q~ q~#sq~q~ q~ t video.mpegsq~q~ q~ q~#w42PIM.2_com.sun.media.codec.video.mpeg.Packetizer.inuq~sq~-q~0q~ tmpegpw1/PIM.1_com.ibm.media.parser.video.MpegParser.outq~w53PIM.2_com.ibm.media.codec.audio.dvi.JavaEncoder.outuq~sq~q~q~ tdvi/rtpw42PIM.2_com.ibm.media.codec.audio.dvi.JavaEncoder.inuq~sq~q~q~ q~*w53PIM.2_com.ibm.media.codec.audio.ima4.JavaDecoder.inuq~sq~q~q~ tima4w20PIM.5_com.sun.media.multiplexer.audio.GSMMux.outuq~sq~Dq~Fq~ q~)w53PIM.2_com.sun.media.codec.video.mpeg.Packetizer.outuq~sq~-q~0q~ tmpeg/rtppw64PIM.2_com.ibm.media.codec.audio.alaw.JavaDecoder.outuq~sq~q~q~ q~*w1/PIM.5_com.sun.media.multiplexer.video.AVIMux.inq~w42PIM.2_com.ibm.media.codec.audio.g723.Packetizer.inuq~sq~q~q~ q~Z@@w64PIM.2_com.ibm.media.codec.audio.ulaw.JavaEncoder.outuq~sq~q~q~ q~@@w42PIM.1_com.sun.media.parser.RawPullBufferParser.outq~w53PIM.2_com.sun.media.codec.audio.mpa.DePacketizer.inuq~sq~q~q~ t mpegaudio/rtpw64PIM.2_com.sun.media.codec.video.mpeg.DePacketizer.inuq~sq~-q~0q~ q~Xpw53PIM.2_com.ibm.media.codec.audio.gsm.JavaEncoder.outuq~sq~q~q~ q~9w/-PIM.1_com.sun.media.parser.audio.AuParser.outq~w75PIM.2_com.sun.media.codec.video.jpeg.DePacketizer.outuq~sq~-q~0q~ q~1pw97PIM.2_com.sun.media.codec.video.cinepak.JavaDecoder.outuq~+sq~`q~bq~jq~cp w1/PIM.2_com.sun.media.codec.audio.rc.RateCvrt.outuq~sq~q~q~ q~*w42PIM.2_com.ibm.media.codec.audio.gsm.Packetizer.outuq~sq~q~q~ q~;@@w42PIM.4_com.sun.media.renderer.video.AWTRenderer.outq~w86PIM.2_com.ibm.media.codec.audio.ima4.JavaEncoder_ms.inuq~sq~q~q~ q~*w97PIM.2_com.ibm.media.codec.audio.ima4.JavaEncoder_ms.outuq~sq~q~q~ q~pw64PIM.2_com.ibm.media.codec.audio.ima4.JavaDecoder.outuq~sq~q~q~ q~*w97PIM.2_com.sun.media.codec.audio.msadpcm.JavaDecoder.outuq~sq~q~q~ q~*w86PIM.4_com.sun.media.renderer.audio.SunAudioRenderer.inuq~sq~q~q~ q~@@w53PIM.5_com.sun.media.multiplexer.RawSyncBufferMux.inq~w64PIM.2_com.sun.media.codec.video.jpeg.DePacketizer.inuq~sq~-q~0q~ q~pw64PIM.2_com.ibm.media.codec.audio.g723.JavaDecoder.outuq~sq~q~q~ q~*w42PIM.1_com.sun.media.parser.RawPullStreamParser.outq~w/-PIM.1_com.sun.media.parser.RawBufferParser.inuq~sq~q~ q~ q~4w86PIM.5_com.sun.media.multiplexer.video.QuicktimeMux.outuq~sq~Dq~Fq~ q~w20PIM.5_com.sun.media.multiplexer.video.AVIMux.outuq~sq~Dq~Fq~ q~ w53PIM.2_com.sun.media.codec.audio.mpa.JavaDecoder.outuq~sq~q~q~ q~*w42PIM.2_com.ibm.media.codec.audio.dvi.JavaDecoder.inuq~sq~q~q~ q~Nw20PIM.5_com.sun.media.multiplexer.audio.WAVMux.outuq~sq~Dq~Fq~ t audio.x_wavw75PIM.2_com.ibm.media.codec.audio.gsm.JavaDecoder_ms.inuq~sq~q~q~ q~w42PIM.2_com.ibm.media.codec.audio.gsm.JavaEncoder.inuq~sq~q~q~ q~*wPM.contentPrefixListsq~yuq~| q~~q~q~pppppppw/-PIM.1_com.sun.media.parser.audio.WavParser.inuq~sq~q~ q~ q~w1/PIM.5_com.sun.media.multiplexer.audio.WAVMux.inq~w75PIM.2_com.sun.media.codec.video.mpeg.DePacketizer.outuq~sq~-q~0q~ q~Kpw31PIM.2_com.ibm.media.codec.audio.gsm.Packetizer.inuq~sq~q~q~ q~9@@w53PIM.2_com.ibm.media.codec.audio.ulaw.JavaEncoder.inuq~sq~q~q~ q~*sq~q~q~ q~*sq~q~q~ q~*sq~q~q~ q~*w31PIM.1_com.sun.media.parser.RawPullBufferParser.inuq~sq~q~ q~ q~4w53PIM.2_com.ibm.media.codec.audio.g723.Packetizer.outuq~sq~q~q~ q~\@@w64PIM.2_com.ibm.media.codec.video.h263.JavaDecoder.outuq~+sq~`q~bpq~cpw0.PIM.1_com.sun.media.parser.audio.AiffParser.inuq~sq~q~ q~ t audio.x_aiffw0.PIM.2_com.ibm.media.codec.audio.rc.RCModule.inuq~sq~q~q~ q~*sq~q~q~ q~*sq~q~q~ q~*sq~q~q~ q~*wA?PIM.2_com.sun.media.codec.video.colorspace.JavaRGBConverter.outuq~sq~`q~bpq~cpw86PIM.2_com.ibm.media.codec.audio.gsm.JavaDecoder_ms.outuq~sq~q~q~ q~*w53PIM.5_com.sun.media.multiplexer.RTPSyncBufferMux.inq~w64PIM.1_com.sun.media.parser.video.QuicktimeParser.outq~w64PIM.2_com.ibm.media.codec.audio.ima4.JavaEncoder.outuq~sq~q~q~ q~Sw42PIM.2_com.sun.media.codec.audio.mpa.Packetizer.outuq~sq~q~q~ q~aw allowLoggingsq~5wsecure.maxCacheSizeMBsq~w=;PIM.2_com.sun.media.codec.video.colorspace.JavaRGBToYUV.outuq~srjavax.media.format.YUVFormat/vSIoffsetUIoffsetVIoffsetYIstrideUVIstrideYIyuvTypexq~-vq~q~ tyuvpw31PIM.5_com.sun.media.multiplexer.audio.AIFFMux.outuq~sq~Dq~Fq~ q~w0.PIM.1_com.sun.media.parser.audio.WavParser.outq~w97PIM.4_com.sun.media.renderer.audio.SunAudioRenderer.outq~w1/PIM.2_com.ibm.media.codec.audio.rc.RCModule.outuq~sq~q~q~ q~*@@sq~q~q~ q~*@@w64PIM.5_com.sun.media.multiplexer.RawSyncBufferMux.outuq~sq~q~ q~ q~4w97PIM.4_com.sun.media.renderer.audio.JavaSoundRenderer.inuq~sq~q~q~ q~*sq~q~q~ q~w31PIM.4_com.sun.media.renderer.video.AWTRenderer.inuq~+sq~`q~bq~jq~cp sq~`q~bq~jq~cp w86PIM.2_com.sun.media.codec.video.cinepak.JavaDecoder.inuq~+sq~-q~0q~ tcvidpw.,PIM.2_com.ibm.media.codec.audio.PCMToPCM.outuq~sq~q~q~ q~*flexdock-1.2.4/release-notes.txt0000644000175000017500000002036212177715062017521 0ustar sylvestresylvestre== flexdock 1.2.4 RELEASE NOTES == Updates: * Remove deferred splitpane validation == flexdock 1.2.3 RELEASE NOTES == Updates: * Avoid useless updateUI at PlafManager initialization * Remove warning about the serial version uid missing == flexdock 1.2.2 RELEASE NOTES == Updates: * Avoid to setActive an unregistered dockable. * Remove targets build.default & build.with.native which are no longer relevant since we removed the native libraries. * Default ant target is now "jar" == flexdock 1.2.1 RELEASE NOTES == Updates: * Add method org.flexdock.docking.event.hierarchy.DockingPortTracker.remove() to remove objects. == flexdock 1.2.0 RELEASE NOTES == Updates: * Development moved to http://forge.scilab.org/index.php/p/flexdock/ * Add the possibility to move the focus with keyboard on the different docked elements. * Fix bug 125: http://java.net/jira/browse/FLEXDOCK-125 Application minimized to tray icon throws uncaught exception on restore of minimized window to its original size. * Fix bug 126: http://java.net/jira/browse/FLEXDOCK-126 Application consumes some CPU time even if doing nothing. * Fix but 792: Icons did not show with the look and feel 'Nimbus' * ant build shows the Java warnings == flexdock 1.1.1 RELEASE NOTES == This release has been managed by Scilab enterprises (http://www.scilab-enterprises.com/) in particular Calixte Denizet and Sylvestre Ledru. Updates: * Fix a latency when switching for a tab to an other * Fix a bug in the refresh of the title bar (two could be activated at the same time) == flexdock 1.1 RELEASE NOTES == CHANGES FROM 1.0: This release has been managed by Scilab enterprises (http://www.scilab-enterprises.com/) in particular Calixte Denizet and Sylvestre Ledru. Updates: * Get ride of the logging capabilities (not very useful for a GUI lib) Replace all of them by pritting the exception messages (and stack trace) on stderr * Remove the rubberband native capabilities (Fixes bug #123) == flexdock 1.0 RELEASE NOTES == CHANGES FROM 0.5.4: This release has been managed by Scilab enterprises (http://www.scilab-enterprises.com/) in particular Calixte Denizet and Sylvestre Ledru. This version is tagged 1.0 in order to show that it reached a stable status. It has been used by Scilab for years without any big issues. Updates: - Consitent indentation of the java source code. Done with astyle --style=java - Add a static method DefaultDockingStrategy.keepConstantPercentage(boolean) to force the restored splitpanes to have the saved proportions. == flexdock 0.5.4 RELEASE NOTES == CHANGES FROM 0.5.3: This release has been managed by the Scilab team (http://www.scilab.org/) Updates: - Force the repaint when setting the title of a dock - Force the target class to version 1.5 (or 5) == flexdock 0.5.3 RELEASE NOTES == CHANGES FROM 0.5.2: 2011-06-21 11:53:37 This release has been managed by the Scilab team (http://www.scilab.org/) Updates: - Improvement of the View resize management == flexdock 0.5.2 RELEASE NOTES == CHANGES FROM 0.5.1: Wed, 25 Aug 2010 11:35:11 +0200 This release has been managed by the Scilab team (http://www.scilab.org/) Updates: - Static member org.flexdock.util.Utilities.VERSION added. It contains the version of flexdock Security problem: - Replaces the pointless and insecure command "xhost +hostname" with "xhost". Thanks to Bob Vickers for pointing out this problem and providing a fix. Fixed: - Issue 78. Removed deprecated logging classes. - Issue 113. Changing focus between Views resulted in full repaint. - Issue 115. Memory leak removed (was caused by incorrect DockbarManager and RootWindow instances caching). - Issue 117. TextIcon.setRotation() did not recalculate on change. - Issue 118. Two threads were trying to control the focus causing some wierd behavior. Thanks to Calixte Denizet for the fix. CHANGES FROM 0.5: Updates: - The Skin Look and Feel migrated from 1.2.11 to 6.7. - The JGoodies Looks migrated from 1.3.1 to 2.1.1. Known Problems: - FlexDock has some difficulty in supporting third-party L&F implementations. A 0.5.0 change attempted to resolve this problem, but caused more trouble than it was worth. That change was reverted, see the Fixed section. - The PerspectivesDemo and XMLPerspectivesDemo do not work when launched from the demo application. These applications are working correctly when run directly. Deprecated: - org.flexdock.view.actions.ViewAction.EMPTY_ACTION field. It is unused and there are better ways to signify no-op actions. - org.flexdock.util.RootWindow methods getMaximizationLayer(), setMaximizationLayer(Integer), getMaximizedLayout(), setMaximizedLayout(LayoutManager). These methods are unused and are remnants of 0.2.0 code. Fixed: - Updated the build.xml file to produce 1.4 compatible code. The Javadoc, however, is written for 1.5 as it uses the code tag. - Fixed a problem with closing maximized dockables, where the window would not refresh correctly. - Issue 76. The Titlebar now correctly displays user-set fonts. - Issue 87. Maximization now workings with the DefaultDockingPort. This was accomplished by creating a createBorderManager method in DefaultDockingPort that is called during creation. This method is designed to be overriden by subclasses. The DefaultDockingPort creates an EmptyBorder with 0-sized insets. - Issue 88. There was a bug in DockingPortTracker.findByWindow(Component) that caused a symptom where maximized dockables would not appear in the correct port. - Issue 90. The UIManager check required to support third-party L&Fs was reverted. In 0.5.0 it gave the message "UIDefaults.getUI() failed:" with some stack trace is printed to System.err. This was not a bug. This trace is printed from the underlying Swing L&F management. The flexdock L&F exensions could possibly exist for some L&Fs, so it was considered preferrable to check with the UIManager before checking with the flexdock extension manager (PlafManager). Given the ugliness of the error messages, this code change was reverted. - Issue 92. Users can now use JComponent subclassed status bars with the DockBar. CHANGES FROM 0.4: New Features: - release notes. Hey, this is a new feature. - flexdock now uses Apache Commons Logging for all internal logging operations. ACL is included in the flexdock download. The old logging package exists, but is now deprecated. - added PerspectiveEvents. These events now fire during various actions with Perspectives. - the ability to resize components by double-clicking on the divider. - the ability to maximize a dockable. Deprecated: - the org.flexdock.logging package. Use the Apache Commons Logging instead. - org.flexdock.util.Utilities.sysTrue(String) method. Use Boolean.getBoolean(String) instead. - org.flexdock.docking.adapter.MappingReader class. This is an implementation detail and should be package-private. Fixed: - the dockbar layout when attached to the NORTH side of the frame. - null appearing in tab text. - a problem with the application shrinking when a L&F was changed. - a problem where flexdock would "freeze" when the last view was closed. - a problem where the docking ratios were not honored. - a possible memory leak when disposing of root windows. - a bug when a UI delegate was a member of the installed L&F and not registered as an add-on component. Partially fixed: - JApplet throwing a NullPointerException when floating a dockable. The NPE is no longer thrown and the dockables can now float; however, there is no way to place the dockable back into the JApplet. - Perspective drawing problem when switching between 0 and 1 view perspectives. Switching between single view perspectives now works and going from single view to no view also works. Changing from no view to single view perspectives does not correctly redraw the single view perspective. - began the long process to upgrade the JavaDoc on classes. As classes are touched, the documentation is being style modified and missing comments are added. Current comments are not yet being checked for validity, but some that were noticed to be out of date have been updated. flexdock-1.2.4/resources/0000755000175000017500000000000012177715062016221 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/0000755000175000017500000000000012177715062017151 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/0000755000175000017500000000000012177715062017740 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/0000755000175000017500000000000012177715062021537 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/docking/0000755000175000017500000000000012177715062023155 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/docking/defaults/0000755000175000017500000000000012177715062024764 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/docking/defaults/downArrow.gif0000644000175000017500000000153112177715062027435 0ustar sylvestresylvestreGIF89a!,6`<0B *PؠP ( P÷;flexdock-1.2.4/resources/core/org/flexdock/docking/defaults/rightArrow.gif0000644000175000017500000000153312177715062027605 0ustar sylvestresylvestreGIF89a!,8H@hPB>(qbbtp#GvH1cI|L2K;flexdock-1.2.4/resources/core/org/flexdock/docking/defaults/stacked.gif0000644000175000017500000000156512177715062027100 0ustar sylvestresylvestreGIF89a!,RHXp J4(ňFŠ# ;Txeˇ0Y|9aə4I9!NSrlH(;flexdock-1.2.4/resources/core/org/flexdock/docking/defaults/upArrow.gif0000644000175000017500000000152712177715062027117 0ustar sylvestresylvestreGIF89a!,4(DPCJ(bÊ#bĨqċ! (ȓ(S\2 ;flexdock-1.2.4/resources/core/org/flexdock/docking/drag/0000755000175000017500000000000012177715062024072 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/docking/drag/effects/0000755000175000017500000000000012177715062025511 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/docking/drag/effects/drag-effects.xml0000644000175000017500000000116512177715062030570 0ustar sylvestresylvestre flexdock-1.2.4/resources/core/org/flexdock/docking/drag/outline/0000755000175000017500000000000012177715062025551 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/docking/drag/outline/win32/0000755000175000017500000000000012177715062026513 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/docking/drag/outline/xlib/0000755000175000017500000000000012177715062026507 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/docking/flexdock-core.properties0000644000175000017500000000023112177715062030014 0ustar sylvestresylvestreminimize.manager=org.flexdock.dockbar.MinimizationAdapter layout.manager=org.flexdock.perspective.PerspectiveManager flexdock.allow.divider.resize=true flexdock-1.2.4/resources/core/org/flexdock/util/0000755000175000017500000000000012177715062022514 5ustar sylvestresylvestreflexdock-1.2.4/resources/core/org/flexdock/util/dev-props.properties0000644000175000017500000000002612177715062026547 0ustar sylvestresylvestrerubberband.debug=true flexdock-1.2.4/resources/core/org/flexdock/util/laf-defaults.xml0000644000175000017500000000105212177715062025603 0ustar sylvestresylvestre flexdock-1.2.4/resources/core/org/flexdock/util/os-info.xml0000644000175000017500000000212412177715062024607 0ustar sylvestresylvestre flexdock-1.2.4/resources/demo/0000755000175000017500000000000012177715062017145 5ustar sylvestresylvestreflexdock-1.2.4/resources/demo/aquathemepack.zip0000644000175000017500000026065612177715062022521 0ustar sylvestresylvestrePK `/icons/PK `/kde/PK `/gtk/PKqT-skinlf-themepack.xmlQj0 }^`9cB>@ID=.IK`! Bv-3rTn\,YhC?aF0~؃ԣPVcEh#@A\Ee)@!n="̻) [wvGTWjT$-Xydb>F7&g玴M?_ {rm_@#0Ⱥ^Wi:x>|D`ȣo\m jH7lb4PK 2PK̸"-icons/Harddisk16.gifst0O``ĒSs(eͪ5GIIJyIOWJHPȖm[\RSUӗ94xٴ&'+GFJ̩3S&MӉٳoϝ[wSUseͺ5GIIKyMO_ʞ]{|2g;?-ܹwaz 9d<6,8!,,&.-bK* :u e0>x&'0@3oDBl [460G*ظYÉGCӘ|y2;H0*9:(p$*faAb!:'~QWwO':00XPKzOPKL!-icons/Default.gifstLgg`hhhiitҵkݻرcΝ{ t8Y$< X9n+bDףef\lpcj4 H8"s QAH–OrhMt`1\Ppy/ESŎL > ırdPf6xz!0&M| t8 VcW+s L PK|ZPKϸ"-icons/FrameDefault.gifst0O``ĒsؑE[<{ۗ)ٵdҜMG޼{Wߟ)O=iYͫ7~I˩gי/0Q0NF s)LEKQ`Fƒ"* 7syID#@S+Bg0bJT6?%gg)Kr}^~eeH`쮭B8[JOmZ\ bPK?iPK "-icons/FolderUp18.gifst0Obb2I!'$?LR'f̓C!-E")A"_yrDe$)m1=I2gż9e˒6'?l|XlRRӓ%SS'fOON˛G5owdNI˗K1.z<_,ijygIΟg%oŸ09ֳg˔2*07lf\ʞy>)~@Cl|Xҙ+Od4<7B洙17$)E:=E*hTʖy>>f<=Y*=E&k&|yPHJΟw4ĸ|bIJϫ9=|rdLs>9u@{MF: 820rH]pٰ1;d^Q$e祋vH\48ĨE LbB*3X#l2ѩQ\< S;^O 5U ^!iPh/K ϚL;Y$$34$yw=c(tulN9SaЕIYgۆ^,|<&42(NTXO8ef&  k؅~*,~Bߞ kPKFoDIPKԸ"-icons/FolderNew18.gifKqoZC/w(EQًP8lHhsZbsbX23X18숐C\%ƴ!%WuTX^y=|S}=ۇ*J{*iMTf;/o7S͟9ا|u:3aGg*M퐷R\jηY /i?tM<=]UzGy͙wbCy2oM~U|ˌ5GEcxЪaDsةcQ]u^]M:ېz=O[A)&V.<\<-M-O=2eڔ-!Q>~Փ7gˮ+)I)"R6=\9wfͪ5%E%o޽sΑcG||J64)bΒe@/ٲ /߾ ɚSRuȩ?sFDL$$(̤o͙sgJrZٷNHP OK[˓gob ٲMJRΔi_֬[ݗ;0t@(/0p``Y۱AԁF íBu6"7yr*2u|Hr~|L3TbjIҌ>:Khh,8$ʜ5cg< }Gn&ymj>6ocqQ+&wgGa Q 2()JmܔΠb9$AS8?,a`dgZqաC<~LA[{$}ΏG嵶pfV )pV{3imgPK7ZpXPKܸ"-icons/FileViewList18.gifst0ObbIJf;/߾xDń$χ ^D٪i][]95&]Ysi.$zsJaMg ,tZ(;[7gor5_&/2iځkEz>{vZ^&` PK>{ۦPK"-icons/FileViewDetails18.gifst0ObbIJf;/߾xDń$χ ^ڪiK.9h4b ~pG&Yw“3fMtZ9MsϋMoO:` PK>GcPK"-icons/Error.gifՓO Bam:Q8z;O A2K)ΠvsA8@ueCs"hYt SSS69MF3;O/you%KHb mH@ռ HN@|>Q!&x4 Cq0 _kQF-h䩧 תVG C(Ģm%M(/Ĵ`fg`$H1 OPl>Q<{Q$j휉pVNHtj#'j09Om :uΉB(V%mGFxd$" ‹k`-z1sHZ3( aӁ^!AFb;FĂHI=KQ(Fz0$2FGP=H:81$"A9b(ċ7NWtAJy"yPNX^T򤕊!^%/yN6y0 Pd3]GDZuDz1Mx]4o"9.[J5Q! 2@, 3QdE3Ŕu`HrC0"-DRϒ4P\?,u{ +Il4>`^{ԯ:ce[KjeSoՖ+SAg\1-=>8j'5 2z%`::9g3>_Y|87B.ʩ] 8;9SwgL }|zf/uKq㈾EߓE 5+XH+ݴMjqt͍?*57(yf]u13@GS|zUXҏWamk u;"~A@Ku+GafAGgz?WLYrS563e9Üg+%ry:G^ybSa鿖 ;\||5bkmyn68sOoID w%] 5<86#!i[@{4f8:-6ˆNTq2C'K_}Yy)^R5JFFPʅ Pt@K~hO |T(]9hP[y8RqFn6Cr_^:1֑. O-+Te(}%3sޘ!ksMQpNů^>-m=[m y͙sW֬[gߙ?,j?vʵ+1Ԭ;՟-SSٓ%sԕ=ܹwg<3ZbR|Sr 9Giw%'dɲ-sbcR2kϖm{Bb֬۲՟+0t@(/0p\f`ذ'z{. 5PKPK"-icons/Warn.gifOZQsdSgʠ*g]稭vme3ԀJa]vLڸsdBcU:5̨qnnp99desBdg:G@G`m=ht܏XJ<&ۂ42Xޓi5cYE]Jv&5bӎρ2rYЪj",~ZM[v@&Lt((e?m l ?>*7{r;:uEkbQOb+OUV# q-l6nlhܷ69Ƒ/8 lvlt#y߻NKWK9 ^wb %$<)nGdDc',`XԩLLpt b8IqӜVpᷴ.J{<] UՔ(hBC{=Xg EMKG?|1VCqg+R &zO{y5[_?@ˊ53$@%}{EJ+W)9EiG "#bTOvY)>y<Χ24q{̣\S?R%f_7XⓅt7e]X;kV)FIS~C;e*ϧ7Dq;mޫ /2.@,E hИ LtF KJ].J'1~cÁQ3Wg~o9cHƲOwr*08h}!4ϯџ޴L'*TI 0uuQʯ%q,v*L!Rgi[V^5ybLCʼLPKWFPK"-icons/TreeClosed.gifM+aSJ#iBMiviň27C)vlM\栭h 9MAٹ 3WOL&" $T8J}P(EO"BsKH2@$f|q]='ߞ^^y߽'rcnc'L v6DcAd[~4/PK^0xPK"-icons/Question.gifOg+P(7LVdRuʩsp+NfxbA]|Np< A J3cX@#.6\[&n ؿw^?zD[;ǨF.ޗyP~GCOybjgWiISes-&ˆ΁x5+Fמn5>ej[m1bV9zѷ+橣aN$cZIBbGOo6Mess<^O~/uꍋlWhZ&~^NG¶/spzMᱱHcM MEcguZT*#ӚvƅE{ _U}V5uQ~LV_ 8|OSBއ/޹vLE%]-!>5RKhCvp1K w랡Mq.y{>kw ; Wbua;;N&ɲl7(Crx)rOdLyozWJSrp?65fFW-ݔ[i-"bqOw+ցaX/PK4 ȠPK"-icons/Page16.gifst0O``IJf՚7|˧/9rțwo: Kd? ~Ȳ&OU( NmGMr߄IZ$i 2_pMV7t_#5PKVPKø"-icons/Information.gifOw+%(oHE ':)ˉ :vSH5aGVu6d^R/).7QMҝ s L)~ɪ}o+OoϳQeA1P Bi cc'y=%qHrF78k&83 fhfe YHx- Yh@0dX)0Q Y8x00%4 s! (`FpA!f>FpEO;Vo]_u=ԑ58mΊE+íCT1cCm)'Nnw*6!+?\zlU\joh9혆u([pAm;|?+/8v?ײ7ٌTxλ=3o? +<k3 Su_5&tavxyt!* 3{~4NZng,I.sKчܬJϗz+cg7sHbzz?> OiWҶ4$Zj'{{Jn?9UqU*~I?tд>x60 uԗMxSJ\y_[nERs{FM(^JYp9cF`j۩99N\/ZUܽlʠ00 to]@{9ft .sf=}WʱOGu ndqռ?آMβ|1Hn mfخv?o3e&{7!6&Js\8ɚCwp,y#sR\$kZ@:*ңhh1]69y_l.ϫD2㣶_nj\̭0q6D@C.ȵl^M^7AA q`PKjZ;ʼn^!4s#\Pavb bW3{`Eg`ȍ H0;Q-@X=@v2*`AE^ ُ׹:nvA63BE;a|8M:Q څvm1Fs˫iTeo9٫t䲌X"VDawтz TiP:Q&/dAc,$.m>;!#T?SQC` %:Vrv_l:?UzhzbH'Иpa4mN a&_EF@vwtvq@^@IEq:4{‚ŴʁX΃=iT(a1t4Ƙ1-x@M~"k_@g^rq޸E, oz,ĩ_fOrjWv2uO^; U;w]uI:{\[9⟵gstN.w,vNQOI9?g-odgiV= RYG5'Dž柴G-7mW6?t4-KR G+WW!h .oo8InkW~Uo8ĤHaJtcqpWs{;.g9(W3'ݻZ?=Ԇ mV;p㍿PqVzo:y4GW3/oN{@4wS:_x^klpyqhiɛ{/-^EeGDᾒԭ-]>{X#xIpAsn`?([h:t\P*d#D7\t$S"<&XC5W|<ۛQR=n3.w]߮5m1`}@oٛο~F׍h^yXA8$ .yK[S;pIDAGd17?̓y絸xI.bֹ$/LA2"yMC#g# V:7 /Da/%A/PKrTP[PKɸ"-icons/Home18.gifKqoח5uu%_Vcĸ?b1d y,a\dRFX {jsC(bHFQyy}"@ [) `ލ7H óY)~.:k'ƥ^3pYr*rBxq=VKRgI8$}PPr)/X"ɘ0mg 7HP4oH0OeEJT U 3{ eWAQ.cۜ*+6_ k\6)ɻ2i$^FpZ ?Ƴn6:\ Xii"ј:[16@n5cKHE R(F!_ٕ)-Nʮ)̅IyL&v)xf Gl&[Z$+&YDi"y@^ +P=Iաo+OmsG0n䶯l.5O/N/L=B4n+_JNk>rGOG; SCw04$7_Yw\}@!F)Tkx\JsJm ~lm=6i{ҪtS1Fx{A_B́*PܹݐJbWzR?PK]WPKA~p,kde/kfmbackground.PNG sb``p n@$l K<}]/1 1n y8Ty{$!E olZӓåJҕ*sm)VܛlUIG-W9oꋏѻ U. 95*mf)D̸?j}A <]\9%4PKy]PKA~p,kde/maximize.PNG4PNG  IHDR/tIME2IDATxUKod؉SɥM@%$? 44- VDi3-0M2qR'.,:g9ґs!c:VoAa!Ľn'a1!Ri !1ETJ)+ "!4 z{ttj*ܜeYc)%zatݭLg˩)R* ?~Ɔ8o ol4S\Y~XZ`4<^k8>s:l&moohT.LMDywFQ,TYZ<=e0r0m1 ]9T^ctЏ|]9'T{D՜wR >&}Lzt!dӵx>!XDa٩c$ś @XD#e}0m2sLKTF}9&2M8/Nu'1 s.A#c͜6͓ݹUu]VrV"5N!g!tt./qksJ)PJJ\_w.ˋrk'.{U~0_4MÍF#cQy Q̠=tJ+ZV(,ðEQ~vA 0 MӴm;ϻ[.]5MR 777B,ˢڶEQAaYi38FQJ!I@)imۙL1vRJP1<Ȃ'<429B% $PNILBJI/ ـ pnIENDB`PK bPKA~p,kde/maximizedown.PNG'PNG  IHDR/tIME2IDATxUYOW{k+85JT!!|RS(ZZ 5PP ^{g}pS?t!$8{>cx_Ǹ$ 90cz@I$(8y^DŽuQ, +++˕J0 q$*nvwRraӵ|4 Gw7?v~F&wqˬ`iqivR:}6N7zϾbAY}.++ Qtv9qP dk«щ~ss:mU3귃'ɢ: tDuv_WWWZS UDEUCrGq CeҊN/go.NBP#*3%͹g-9z=TZ/X际~z2Ire2QxD qSID OמL腱X_|PdYc8әmƄ:"`EYCg@.M?2P w=o:RU2L*Gֹ+l>EqIMI˳nvӪi@)h4c*AnQ>[_dջZ4g[s+uǷG{Տf.zfekmƟ׷sG(DbOW>*V-˲&''5Mîv]lnZvq`ຮT*efT2MSUUB(aƘya:(aJD)}!D qι(1Y)MR:6GQ8h Ud] )P$`#yqI6o:4IENDB`PK9RPKA~p, kde/menu.PNGhPNG  IHDR/tIME2KIDATxUSMO\>= (hL1ąw?1PD+F"AHBiKi9w7}Vxf2 Ls_?B迌4o%}?"!DJ1(JBX9ODJI0c}iZNg0T՝u0 B84Mf0z^(fEGGGǖeeY5ͻF̲,۶[VI9??bU*UU X,RJι(R]__3NNN8ggg]4???i&H8өeY{{{Nh BHEZP((t]E\4BR)I d21Msii1eYRJ)B8υɄR*p]WJI1c4l6*!0(R Bl6 Cx<&sJ)!ia0\NDZa:$I>w]cSU0 q$I*d!1,2 q`9gA!nw4E۶ ƸT*u:v !e1@UUx<~zzzxxZJ)R|}}퍍rAڪjREnﻮATkkkzVl6 }Fa==ϛN7rmض^G)E2M3 8=KWd2DQbA :+O-9ړ?&MUmgm~`Ioˮ~VY^ڸ SwɖgyTqob[TRFAo{QۆQ/>-Ɵh|a_;tv3_utd}Osks>ם]4n7+.v?WezЭ 'v?зYd+텭2{/*m.ܝnג'oCтg7Cٿ8y@33"$㮙<&n0 c\g7 ɏ?uRO//_xy|Fnrihξ$Ek,:M|\_WB{\>>>Ug^fݩVUETMd^|j~/r}]D o_V3XZJYK) f@cT5&MI Ū Ƥ`TC $(m`B{k!CHL({+V&E)Ht7ABߑ%1k IENDB`PKPKF~p,kde/inactivetitle.PNG sb``p Ҭ@,$}{+%f~#B.!sB=dТӉ)ـgF䦸-b>YW-&ܼf7on;V[tV67܌zK:Gska'~ܓ]1'-.ftsYPK*cPKs,kde/iconify_down.PNGsPNG  IHDR/gAMA|Q cHRMz%u0`:oIDATxb 2󇁁U . 1D B X~| ? ??~@P E@|(?~|}mx?rskkkD*B-a4 ԼòRjp=9ּα=NE$@E 4𿣣̯,&FiE.2 ƙ+LZDXR4۶樐2:,( 4%۷  %NFϋnAMK^',ÿ^00sp)H<>/Vfw~W}/&6^ L_!AS n X|aafTcW~H-oV &6lRR?AP vvj~dyP;O/?533ŋ?^`0PLPLv 8 1|Y -+Ǘ/?9'mbL\O>30i30|!G Z ϗd98I@B  X<L \Vxޜv7MxbP`|uʥBxY[22яrNl04ieb  ʚ19Y" *ڽ'_~xū.?}~d/@BQFTLYJDB@E @i~|ÏO^{ძ _~($(''&* # @,?> 0xxGhf,pVbdɅ<@? YX~@2?04Hӟ  Y!ʽ@V@?`.@Ѳ40IENDB`PKhbxsPK:s,kde/close_disabled.PNGPNG  IHDR/gAMA|Q cHRMz%u0`:oIDATxbY. X}#U@÷oY ?v7ϙY_v/_hhhXXXERL X3=z+""Ǐ=x_ X8~ۏ'OZKG_AWqq^~Ξ= U`gg4++ P3<~> hkj222Oͭ d\v @谰;] T@,@P jPJBB@211`pLJ ʼmmmK N2<nj$ȁ6ϧOG__谯_{> Ab X /]III`􋊊0V($1@(4O'E/B-oJjnAm- D^V&F6Vyyϟ?߹sB >@4[SS? ;?#.)ܸs n`( ??@Aƿr"ߟTd$8}h<БWfYX?0:?Ң?}777; ?h@@,j?} (3;@?Œ@,L ?@"$,]]ߎIENDB`PK%SkPKs,kde/maximize_disabled.PNGPNG  IHDR/gAMA|Q cHRMz%u0`:oIDATxbmfmDvߞ&@Y 0"5İpŹ[.u l dw @ 2h޶s@ Ox$@ <\ڂ ml;brzs4,"m|rcs:f윿-x 4ަܡ׋asn֬䭿㢴i{^p£ٟՠa徻\}Y]Kw~so^$~e{\@4ؗgsĮݶᔭôݑnf4kf{ٱނh}~ݯ᤹֊dy\qa[- \whD% zvEۯ͚Hq҄I@.@)\1w-n9o7аV 2l윍glM  J %nj*M" #(g匵f+T@ 6_2sۄ&.;ggl:d`@u |Yϔuk^ ~8u`x@n6g]' @=UӁ.\8Z 0]T@ vޘrIճ2;+WO<}ɲu%1Sf 0] M_}e~XV{t}p]PCH[T)PuA}@5s6^ @1}m3K6]4MYk憾m {WS@,| o4gy Dם m" ap4s.!P\b "R@AL2HIENDB`PKmB"PKs,kde/iconify_disabled.PNGPNG  IHDR/gAMA|Q cHRMz%u0`:oIDATxb߿!l ߿@ X|a2c@f ߿&`@!J@. zؘӧׯ_ׯ_yxxuuuXYYAgb@1.|h й߿v T˷۷oߺuC^^7@4+++!  1$$$  o~}; $3_^ׯ_ ,^|fmѽBY޽zvQA/^\t X~0;;; ?@@ӫW b @Ȉ @HMtPDPj :~Щq߁7ϟ j?\\\@8XYIF #70 It0 2Vz.~]B\۶>)NVF2ALW2e tDcԔ7Mwqd%V; t06i"ش4nIXp_P? "`!rY 7%9z6 Ekafu5Ć hߵ[r /yqY:H-Ւµӈ)=-v6W\K: '#|yi5 9]x\*@?b=cV Pe O󃁁A"`5P@,@`@ߟ۶mݸq}mnndaa4jYV"$:0-^NV׿?`x}AA)ӿ}߿?~oo^_463@@@ }ڳq<v\q3ںo"Ⱥ`j>[PԀkۜy^4UX d',9ǗQ*"m4 =>' Ǘ?Tӛ.ei(}/3 #@4     &! #4   G3/|<.=!>.}N9ȷo?$3 *v&&OTRPa 2gMbdU1aÜl8趿_+hvq~12,?/s(Yм???" | h81Hpp&?ْ?pVJU̝IENDB`PK;IPK}p,gtk/arrow_down1.pngWPNG  IHDR 2ϽgAMA aIDATx=0D_;X1 r J44۬PRc0Q,ZڝvFoc R c 9TeDc!PU_&猠ArnZ#"Er8NiۖiFxL&Vϵk-͆#hxs8X,f33my>[UH)cd^㜣:!eY~c⽗}/Nǣt:IKx<,KRk-F jJ_vI*IENDB`PKEL\WPK}p,gtk/arrow_down2.pngUPNG  IHDR 2ϽgAMA a IDATx=0D_;X1 r J44۬PRc0Q,Zڝvh.Zk1\WnJ)18PaP Fc!PU_&猠ArnZ#"Er8NiۖiFxL&Vϴk-͆#hx9s, f|N۶e?:11F1ZHzMey~%I)%m[- sT׵X=9͆,in1C]nc\B`0P%ι_`61)p8Dш#^99)Ʉ~OQ\W,# nڶRUU:NZV1~*!ow/ڶUQ1F~ IENDB`PKMhZUPK}p,gtk/arrow_left2.pngUPNG  IHDR 2ϽgAMA a IDATx};0 -' 4\A3 p'$~[i^3|>e?:11F1ZHzMey~%I)%m[- sT׵X=9͆,in1C]nc\B`0P%ι_`61)p8Dш#^99)Ʉ~OQ\W,# nڶRUU:NZV1~*!ow/ڶUQ1F~ IENDB`PKMhZUPK}p,gtk/arrow_left3.pngUPNG  IHDR 2ϽgAMA a IDATx};0 -' 4\A3 p'$~[i^3|>e?:11F1ZHzMey~%I)%m[- sT׵X=9͆,in1C]nc\B`0P%ι_`61)p8Dш#^99)Ʉ~OQ\W,# nڶRUU:NZV1~*!ow/ڶUQ1F~ IENDB`PKMhZUPK}p,gtk/arrow_right1.png[PNG  IHDR 2ϽgAMA aIDATx}1*AgEbdh"x37$ LUT~?lɾCJI1IXR4z>*R4n0|vuTIENDB`PKz]z6`[PK}p,gtk/arrow_right2.png[PNG  IHDR 2ϽgAMA aIDATx}1*AgEbdh"x37$ LUT~?lɾCJI1IXR4z>*R4n0|vuTIENDB`PKz]z6`[PK}p,gtk/arrow_right3.png[PNG  IHDR 2ϽgAMA aIDATx}1*AgEbdh"x37$ LUT~?lɾCJI1IXR4z>*R4n0|vuTIENDB`PKz]z6`[PK}p,gtk/arrow_up1.pngUPNG  IHDR 2ϽgAMA a IDATxE!@Ef~? $CH!MK*O#}gc eY2 MӠ(_;8PURJ88b( r3#{TY.G='ƈbdۑs/3snf/N4Mj"1͆mr:n<^1Fc^j9c{ra>8(Waqa*iVTU8DD@LJd~_?T^qIENDB`PKZUPK}p,gtk/arrow_up2.pngUPNG  IHDR 2ϽgAMA a IDATxE!@Ef~? $CH!MK*O#}gc eY2 MӠ(_;8PURJ88b( r3#{TY.G='ƈbdۑs/3snf/N4Mj"1͆mr:n<^1Fc^j9c{ra>8(Waqa*iVTU8DD@LJd~_?T^qIENDB`PKZUPK}p,gtk/arrow_up3.pngUPNG  IHDR 2ϽgAMA a IDATxE!@Ef~? $CH!MK*O#}gc eY2 MӠ(_;8PURJ88b( r3#{TY.G='ƈbdۑs/3snf/N4Mj"1͆mr:n<^1Fc^j9c{ra>8(Waqa*iVTU8DD@LJd~_?T^qIENDB`PKZUPK}p,gtk/background.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/button0.pngTPNG  IHDR67GxgAMA abKGD pHYs ItIME .X (IDATxݚnF? Ĝi8jmʝ;uy@Rt]T)Vq`@\VjmxQ!+ A$PGܟˣxh>Gk 0͞,kn=7Ώ߿O...7Jo8s[; _kc׿繠z^~A_ѝQmĚNbzDu( tA豨|0."wt4]^\x mnsT&Oȋ; ҄]vU7MYRFTl1Sm 43a\dH N3= 7'a@vX-@ "ol# x*sl<"b 21PO|1H1Fw*7[\ "ms,3,B~Y"2qpa]B,$mgכ.NM 8~cXR>?ⴸ0ĄOxEr`X[Z"׵TA>z̓yIUT ,86OۺH%{2YK;[ή:[+b71y윳 kt١ɒ8QLW\"Shf4f6N)' f6"I5lƳ$B '͏9W$)Wag[8^pP)GQus{gaZ*8PLc;LhP rO:6hSbmĖ9-W,O$MۖUD Li: `$Ͳ@d3'+3B11mj"@c{l+j !}E!;,/e"3{U6~y]4p5eG82y_q|k@E`ιZ_B9==e^s\LKY״mblٰZ ϡ5Պf@X,>cH-b$s,KX,}>{-vluX 8p=T&IENDB`PKHPK}p,gtk/button1.png6PNG  IHDR99gAMA abKGD pHYs }vHtIME.HjIDATxZ;0}rd"3!W+̱ SBBȤfokg=UXB^ԢmkGsOf8޼[~u\A$\sh"mD10ǻ,KN'NZ,Ku{u"NJ)NNc t "ox&B>.g HbD ug"3c=""/G=O`6 {(}㉸P40 ՝4u#Mc @)\..@DQo2½ykzhiqm cyx8sGXtIrRv: QwOx SGQȟ*[b6's]9qv9buN{N='SG)Y"zh' L{ {NN悽N悽NHdNP^AkgCr^<Qt($_rRk]f~rkn*5+喓̌Lk9 |Cs.(2%=43ݕRR_}GclR**+nK\ ǖ>{Zkt]6"[KxK1.=A۶߲mۢi[#'\0 ^\.2\>Ϩ hܚ1>jMJ)TU;ҔZIENDB`PKY;6PK}p,gtk/button2.png[PWPDn*mE0 R5&JRD HTvXte@\RT XYPY 3uTYMWUZD񹯝K;y9/糔M>=!Q'*u`7Wͪ.޾jlj0y>s\-q' JIJUArG4@g+=լ9 ի.gK2 v t!>4\FRmI{RvTkSQaq1xQulج[#e4]YE_+L-omWN>nhBy\|VBXU=s=Yyqn}w5#P}xQ~o-߶S9Sϟ<`uZr`p\q.'er~V9EY_.Xјvۣ#2/^]]P\&h}/U'Uwh4g/(Yk:S[xW=MҺS #'"B_Βy9Z3s_?Y9 7FV~m5>ǥQ7f9b 5C;A'U .g-v(iIѕ>oO(].g HbD ug"3c=""/G=O`6 {(}㉸P40 ՝4u#Mc @)\..@DQo2½ykzhiqm cyx8sGXtIrRv: QwOx SGQȟ*[b6's]9qv9buN{N='SG)Y"zh' L{ {NN悽N悽NHdNP^AkgCr^<Qt($_rRk]f~rkn*5+喓̌Lk9 |Cs.(2%=43ݕRR_}GclR**+nK\ ǖ>{Zkt]6"[KxK1.=A۶߲mۢi[#'\0 ^\.2\>Ϩ hܚ1>jMJ)TU;ҔZIENDB`PKY;6PK}p,gtk/button5.pngPNG  IHDR67GxgAMA abKGD pHYs 1htIME7-2IDATxZ;0}ZcWc!3ʙ;Sgle0fv(#=ϔzsཛྷE{ֺ:bZk/lNӹim hI!"Zv;lEmZ,^]\u]m[czQDD4+/N|bA3CkGD0zqy@ !yƘ9 Cs0[,J^]oxt|9w5RŢb)={="n* ={tOD]V $Y[#"PpMTj5#S GEx.dUH ֆrwX9~f原c9CDrF =_πcY]r;r»w :#zakJ"D%lJ|'tBblm)=赹bcGiWJcc"cJyWcA׀66) ").FPqKhƘ>_l`3nԽ}0Gk-TYz)m\sz6̨뺫cp@UU_Z%UU`[x~r8(GǝιQsd.0Ơ( cP.6\-?IENDB`PKK PK}p,gtk/button6.png]PNG  IHDR/8gAMA aIDATxNAᷪOUu438`de@c./kpi^KuN. B &&D@vυ…&YW|ߩ*k[4O<ԽO{p5x+gAֿ|܍;\9d΍:؞C>ylN.r}HRL&ń"/& V$-m0R+3Hc"1;GO~ҘqzK`t[F:)қ$TPRӛ#RS^4ɉg4!ت`{C7MgQ^aUYG +n+,C'GsǠ*:qԏ\E58l2#q`AƘOLqV0T/*4ƀuPD逈QZ!ۋjDTHTUKADZ@V JVʷHBe\0z[żj.[?}5~O_<+WI鴀IENDB`PK$b]PK}p,gtk/button7.png6PNG  IHDR99gAMA abKGD pHYs }vHtIME.HjIDATxZ;0}rd"3!W+̱ SBBȤfokg=UXB^ԢmkGsOf8޼[~u\A$\sh"mD10ǻ,KN'NZ,Ku{u"NJ)NNc t "ox&B>.g HbD ug"3c=""/G=O`6 {(}㉸P40 ՝4u#Mc @)\..@DQo2½ykzhiqm cyx8sGXtIrRv: QwOx SGQȟ*[b6's]9qv9buN{N='SG)Y"zh' L{ {NN悽N悽NHdNP^AkgCr^<Qt($_rRk]f~rkn*5+喓̌Lk9 |Cs.(2%=43ݕRR_}GclR**+nK\ ǖ>{Zkt]6"[KxK1.=A۶߲mۢi[#'\0 ^\.2\>Ϩ hܚ1>jMJ)TU;ҔZIENDB`PKY;6PK}p,gtk/button8.png6PNG  IHDR99gAMA abKGD pHYs }vHtIME.HjIDATxZ;0}rd"3!W+̱ SBBȤfokg=UXB^ԢmkGsOf8޼[~u\A$\sh"mD10ǻ,KN'NZ,Ku{u"NJ)NNc t "ox&B>.g HbD ug"3c=""/G=O`6 {(}㉸P40 ՝4u#Mc @)\..@DQo2½ykzhiqm cyx8sGXtIrRv: QwOx SGQȟ*[b6's]9qv9buN{N='SG)Y"zh' L{ {NN悽N悽NHdNP^AkgCr^<Qt($_rRk]f~rkn*5+喓̌Lk9 |Cs.(2%=43ݕRR_}GclR**+nK\ ǖ>{Zkt]6"[KxK1.=A۶߲mۢi[#'\0 ^\.2\>Ϩ hܚ1>jMJ)TU;ҔZIENDB`PKY;6PK}p,gtk/button9.pngyPNG  IHDR67GxgAMA abKGD pHYs }vHtIME8%^IDATxݚvFY0v 6억0AZG0`@AIl`w%9Nmi#hWLf?xp_w<- = $,MʺWNb[o{s_?m6///ǻ=!_fϯh_~bsK_Ҁ! +f8n|ε(0 C:MGEZ &&]Džb삢EH"h0#H hcᥫw{LqW& "b ! a9 5ߴc6, A^1 '~|fhGB^&]Mȉv\1*sAXYo6#- 8)zNXԤ#&C\;c0# VNX-$(0$ʨmFA64DY  ,~:l%Yy,o|߄kosml +y,p1[uZ";3F` s.?ul3~EZ?t4űoGެY)oפZ)/?BccTuɺ.;>Cܿvߢ_ѝ/tNZ#PK{]{PK}p,gtk/check2.pngݔoDo  , 1(/MҠT \ PEt#٬#HUA)!rKVQF9Q~y'˯w<6MQDK}EfVE>QzGfw(\"}gf Z$H*PjP I$E4I%YERTITK0%͐4O2BYr,k˕""4V GU U3TU _`jVhZVZkBS5G5뺭n:v%1tqnc8AFeZŦL?1}l 3fZc#+V@ ܊Rۏ!̎c;έpq?t|ЉS'[k׉A 3.2q3 셱B/̽y AG |a8IIX0aÈQ"&4BE$4,<"4"<@ccF}B QQ QQ  B 0e00FB%1J9"J ee3[`dY$IΒ'q, S!ǔaʱsNpBJ e4%i,e4e,e<,<#$S34YFsN)g9e1ƹ =s5_?G+9O0@QGiNo{'\\oJ+ڛo4bKoy>sW[;uzֱ͛~]|v7n\{a]ϐ]7ųp|ن3cם_O7&46}=]-۞{/zksn۴Ę=;6+A Ń4]AC>?t1sG?l}(;?W=Z+Zx+>xdIv++Y]aC]cS?iyVmÇ/rt+dh\>77uᄚ ^9^ g?;{ܕk^Xc~wjiɾ!-]IR'OR'.J驁tާˎlڋ l`Cs=GkofƜPKTbPK(!- gtk/empty.png sb``p Ҍ $'Rz%%E%y ! )z ũ%z FF FFVV R:K<}]/q2(+6 8 <">0@AtG_GY|Oǐ[?g`a`/e PeSBPKf)0PK}p,gtk/entry1.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/entry2.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/extension_bottom1.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/extension_left1.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/extension_right1.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/extension_top1.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/frame_gap_top_end.png sb``p @$χG)tG_GY|bnf\(R1'9%!yLRn*};ك)?? gSlP :&PKN{PK}p,gtk/frame_gap_top_start.png sb``p @$χG)tG_GY|bnAfOtq  6 ޞ'QYEDP):&PK`s}PK}p,gtk/gap_bottom.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/gap_bottom_end.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/gap_bottom_start.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK}p,gtk/gap_left.pngPNG  IHDR8W)gAMA1_IDATxmQQ0&KL&v䥩"!% $ S 6dMQdXg cΔrpO =oj::kګvOre62pӂ觜 FC0LuVl\YƑ:[9ǝMIƆEt{؄셒d>x gAMA1_IDATxMA0 vVPv{ʑ$N= \XH8un*]Z 'ʏ7*5mz'0*C a+`n; .t_mSmp.~O?y#UShS2H Xb.1mt/m]{y VXocsOC8 e*M {}" S[syuMƟhl#E*-r65U>{rQ?$OsQoP]IENDB`PKXKSNPK}p,gtk/gap_left_start.pngFPNG  IHDR>gAMA1_IDATxMkr0e;3iT JӆP<ؒV&uemY֔~~eI '@Sec` T0Q0U#TA'Yp (Ilػ& qwF}8:ɕ乼8s8?䨦F4h$,i* γAXB=!< r-uv&l~~s3ʬDQ., ~Gqz]Mn;su͓Ktf(mh9QzWoa*IENDB`PKPb=KFPK}p,gtk/gap_right.pngBPNG  IHDR9 JgAMA1_IDATx]QAn0  P^=P4hH9HEQNl,aKx1$)Ls[Y%b]yi@pGr;xwNQן!׹\JO|ies8Z/~s.*(Lr'J4)+f1! s,"+iG iJ t6l$̳ zU |1 N}A"ʺ!Wv7N㍇K22jsIENDB`PKGBPK}p,gtk/gap_right_end.pngtPNG  IHDR>gAMA1_BIDATxMQJ0i?5 e˶MqNV=BȜzy~ʯoa`RbgkG?WW#9gl}q^ n 1)f +2,yAJ k|MPY!q+r0*XZd!c2>G'ꑎ:]s6_<}KU2L*`X稹Ns8XB83;k4 0HJt۸P6" <0븱bѤ?Z<{JLq NnQUҳcW=7l7`iC14egɓYE Z?$}E80׬AIENDB`PKiPK}p,gtk/gap_right_start.pngqPNG  IHDR>gAMA1_EIDATxMQ]K0=InC(O?OCeCPV$f:Bȹ&mn!/l!'v;Hw0Cjc%+ 葔yC 1.$4y2Y#vJץȔf4[)\$*g |"YRg5IP`b 4סGGfg-$)X_'FDkKn,5@o L JL&Nɑhg \1 Ь:DC0/}gAMA1_IDATx aHAPiڠ RF2 Vh˿A!RzJ\e%[ \wdbn!ftPו#a[B~.!s_{١>4u7 +&Mj_5a/=*3tgLU8soY*F¡^ǙwIH+o) PK ]PK}p,gtk/notebook1.png sb``p , $&sj8鎾 $ B xn {+FQv-SB.!so̳?~Vo:| sT/*etsYPKCD 0PK0/(gtk/notebook5.png?PNG  IHDRI}+gAMA1_wIDATxڭͯW̙&! !J@-RA P,i,ٱ@* 芨 mMӤ̜ϗ=&J3ϵ=3gԯorw\wv $giֱ|hOOZ3{og J3 2 Щ׹eУy\/( ah92* TbE"+K4$Ypm8gmb\Cj8y@qqt*#FT0suF)QY֢:\gL>sn[[SX4!#J%̬.`]q0 h4',kTk{Y9Gg3Nf"|'5SKmNy]F,R~VgҬc/<{ь&24aQZiȊLk ->(,k^s mȘg0xR10]NQPJa%MIY:ܲ_ =zh b a󂺙Qkl_Gө׹)# sWd#&GKg1Fltԕl,Jk,R h喵>,tf ݶ-ѹHx}v(L#0@ƈ"#õeFIm=[l#k=)J4fggc g#%@/h"Z,zEܲOi6ll!(BH8Hqf3BM$U yP&i!/)4Iskm=[94DJ`&!A Y2"Y\G43llM2֍bV9Ƴ 1 &/_& H!|vh heIpm,q-tf ݶ-:fuMUoT#xEfrH(dq(rV+rmag"g?-1<ϙz!洚q:2],Ay|@RSZ-Tk)mֳ̜V>222>EYM*v6PJ%Q]LR:Sõhĵ`Cgr}d!NN2s|t o6f9pyXl= Yuepj2d+Ʉ7Dpi>;wy݃_ :Y|&3GrWݻ\2ČFo D?oko!bcY^]3lUm}9G?}^@$4_x }OW) &N:TX(r˄;0LeB^ @7Ǻl0pr<a|)NA$۲]T_- f VW@7@x#E-([._SA{v1yBUwN.ۅj.{+Мd %];AF'V^ mk$CJ Ћ2t]),msQ@~^!0~m$'bN2@.&.MȠ=[`ASrlBrl=cc E e1pr,ca Xȱu,XX:6ظ}I*u'j5PC{c,Pb:zjYN2@NUNpڊ=M!qY V ꣛qR7w+%ݧ͠Duk`a9k|CgEtqFVVdD>L>ɣR7P4ІLaqf}-wJS, 2!g/7vԹ6\vx`2#Na { 0seʄPձu\ͱslV],i) v*tm^Bo0@4k|.Oxy۶>SoF03.4IENDB`PKyKPK(gtk/notebook7.png]PNG  IHDR/8gAMA aIDATxNAᷪOUu438`de@c./kpi^KuN. B &&D@vυ…&YW|ߩ*k[4O<ԽO{p5x+gAֿ|܍;\9d΍:؞C>ylN.r}HRL&ń"/& V$-m0R+3Hc"1;GO~ҘqzK`t[F:)қ$TPRӛ#RS^4ɉg4!ت`{C7MgQ^aUYG +n+,C'GsǠ*:qԏ\E58l2#q`AƘOLqV0T/*4ƀuPD逈QZ!ۋjDTHTUKADZ@V JVʷHBe\0z[żj.[?}5~O_<+WI鴀IENDB`PK$b]PK}p,gtk/option1.png=PNG  IHDR]gAMA abKGD pHYs }vHtIME~/V?IDATxr1?gVlŴPЁe5 La`hа0f1nq2)f4:i-1.zz] 8䤬+O]|Y+*>_NH+}As#swIr~PV^ jWYP*yݮRn&u'W*5K* YI*C^v.,MH(屎mq)HiBq9Tw$屏'EH2"NsTR:0:_%M,[!p,>+h1Le |Qc@N?eA * gPGd23*;™:h 05( z=)!;tJ"H4/ )C'qx;C-깢@LBm'g@™G,FܜR*efx?P_+r6E6[d6vsN Hq{6Fk<Ĩ 1FT}Fd!0ՙ 1tqv?r:{(oM^IENDB`PKWXPK}p,gtk/option2.png PNG  IHDR]gAMA abKGD pHYs }vHtIME,&cGsIDATxsc7?9b+k:`PXز%аe1|e&<_bLIwFjj?ϔ/< k'^nlQP>7,LqzukAsdgy`+Xfsc\eAqp(op8t+"mӽ.vRqVAPp /v @ynF)@iBq9R 1fJC؍Gc߀:SD0///O@Nr0XӉgm9#4D"L8ԼbSa? 'a1 Z;(7w'0xH" TI@wr!!*X5O4 Aaaكs"7Ԗr@L~>w!H4^B TNA iZtpgճ>@LB#u?2#"XK#:!(ňSJ #3vmx?RZ x#g#Z$:۬"ک=,XHsڜu%FEU1ϧX,:ѻ,]>$|.վkؾɿ/g IENDB`PK SPK}p,gtk/option_menu.png /PNG  IHDRgAMA a IDATx_&Y?̼~7_6ͦI6TcV,(bz#"`X(RPho*E"U+H!WBB*5HaEIllv}̼3Njλ/iMwfs9sGx#L&Rc!B@) "XPJ!{O&!@chbxZk@$@ZDT]1@$xi*kX`A1`T}B ՎU>Fk.MֈTޭbl= NYƢ1&@rjs.]?ӈH&P 2$0YT Qq]\{pu/9pt;_0OoFIvzRy-  ^~Gg8=K~-dz-ަ2'*\p+'8t:eggh_yUNS0b&ˆ #]CL:G)E>adYFcpug)޸Ai!YXZb(+IRJ87A;blm3gG[;UBʀ M-˒c7+*~_)U'3N֓ X+ c\i8r_]>!D3,a[f 4c<,g$EEnn0/+phb ID۩%pfkck0F6X Mrs*ذkXzY*"2;Dy3yNiֺR%(VcXpZq>&U=e/ qG?E~~vϐI:̀$)HzڶCh4Z sSyw F[4$)$V( u& ~~+0߿AI;yq'`^ ҄a`%#wSygHl卅$U$)8I5fMS>'_/|?̯Ӝ,&Ӓ4MHC^\As\}U#o5{fc{#)/_ҥK, eYvMmtٲ,&a U'[Jpu*,iiACUUcvAl\!T&z頻+R݇I[oLK JYa0+OD:ԛ9]}zX(MLmn X:jI)jӵ=gwgϞ}>ۣ,K$Y x9Bfq{qP bt3EfD,{L5IZжgټZlv@UU5u2uV.-˒<ρ#"ݦ4M%V|9!*(ԟVC$ 89^Ķk:a]OUXY9wJ4:u&|VhW٬ ѣ5CC.\|iŌ(,gY諔n6eIYdYTDkkxҾ z=,q ߍіNVg4o4*,˰RrP6@jim(|~[0eY)˲^ {aRf5 udIGnۨm&hmj!ێbPXoe(˂1I(@NT2!D b2@5PU#{B9nY0Oy^M\yr$ُ֜ Oh&^XjAKp"IzL0MDRP~_6\[URx@Bk &{PLPL13z$}<Ӣ=PZ75)&TU1zAHzO< QJ5PZdޝ6:u'(U;EGgܝö "u5g~Sa* $rC?ڦ _ mbV%n3k$r}x+,_:&tԢ3/7w^*B-B gMEP9ֆm@0|r2j!zAޅ̳uj)cQ=i}t1~C2LłZZ Ld6=ѓ8v3sYu jstte_*h>tt$O!ܨjɄ 2Iwa!jc L UHZ-wE{!`UN0 ޕ3]h}Bb#G1…-\.kԄ2a1w9kpʴ^HKVi,_Zc>^5peĠ¦ X˘P& Dʸz&D04 abA /ltTݓ-I2xeJccZBpId>,1 WiQ@g P!6pޡVsw t<Ї+OB)UP@u(́=HYZ xe6]5qXg369W+ܔoooӿOxl(2ܝP%sAlfn92Z`" :*9{)Jb 76%"Bu&ȹrϜFeg7̸8eL"B W1w8"pI:eQ|7\ndĺIENDB`PK}tS PK}p,gtk/scrollbar_horiz2.png HPNG  IHDR pgAMA abKGD pHYs  tIME ;:5O 4IDATx݊WZ3=?LƐd߀^zރW "L ^w z AAI${cikZH9<>!'97aywi4}dg.\ay.-8_p~9h4Ui ܡ;̳ KAVd & t9qK8ݕp9ɒ03<`/)myR `[2dlLNY^?1ZɼD`dXcc,N<ɨ{>0z9(Lc ݕ=]3Ye ̪E$,{x;3z|_vܼj@%sɉKBXZh2.Ȼ $FLLjU捳9QD /q4+bI{JPSQ !MS ޕ!MkIkBԪJ5*D^sT;N060VkQ(1No0B2d6j`2a, L1R |yLSFSpj+\yV&L-o\GB<yٓW윿ŋrI|wabCWjկ¤3<=9G0M:0`TF?'V}L>U"T M,gQ5q_"CEHAظݎ E:O0q {%Rj&] ( ӭ7m`\yaF<}=fUTߛ;쭄I[+>Gcp?3_\~GaY^-E6F;|E2NH=BB+7;c6 5iR4%>oQ%/1PjTz-mLH(W6yw;9& QYӜnR!|(<F/IJ zG`o܅c.,qjfJ&W}z+w?*'k ?Xz+y{W޾9r#zIL8y2s DGG7sR2iB"`;;TOkk8"׼wAn'3V:wMfj6̊Y}0n35"bTi&3)u==N)ɦ<7!W[7/} ӟ́1IENDB`PKp6f PK}p,gtk/scrollbar_vert1.pngPNG  IHDR /ȻgAMA aIDATxˎdGso՗n26HAH.9x d !A@` -"k"UuNf|7L!On4k/ɏZ~9z枯?'횏>x뫫7l- _svvF']o~e>#<30=qɊ&UNÙ种c:A13Lߖg{֫+lUv#̽׏8o_ze|^vm/vՒ-C3\…bsA3j66?sh.ZFԍyt+~n@B9ծPK)5%=PK}p,gtk/slider_hth1.png sb``p @$MܩR,鎾 $lI. Ap品" \A(^~O\X -(1b)|L'm]7Uf|y,|rp6ǒ5S}SMET{St>?+2_DqL Z2%Ha) ) "o{=*Y!l3K43ot^0ރT%=Eˍn#etsYPKҹ#'PK}p,gtk/slider_hth2.png sb``p B@$R,鎾 $lI. Ap品" \@qa {+F>qA]B=]C*欝d(l*k1yp9sI:ѧ,ylm`:S{M*V4D_0'0zT:e͵lK[+rO̯pw֚ͻ3}aJbd7DOW?uN MPK5PK}p,gtk/slider_vert1.png퓿kTA7x! (@4w; 9b+Br{YlgX\%b-)d9SkRCgs,a;0L3OKśiPo~"xx'e/g݄F`w7Z$M 6ce *MUlUbyꅖV}q1A HH xDZDDY! CɈF#ƀrB97) ((1b q8e1ɘL3p.`F\לkc'DBGBSlG*QMUtttuX{҇] XoKQ!a>Z]8qK9G?>ylś}槗_kƪ׊jtR=S;m3_p}uo[oSXeKG_|~-\3|w';اΜ,8l;P.[PK]'>?PK}p,gtk/slider_vth1.pngpPNG  IHDRWgAMA abKGD pHYs 1htIME NB IDATxŔ1r0Eʂ \-g5)SBt8X)4H3JߕZ["8eEQP?+ d 8eRm'6= {~?ϳ[Zf!a 0MRXE‘a 11&vw!vjr-H"xܟ*yHѕ}3å_`r;R Ƙm =n6MutDuJ)z[Cd<~N/GsZ%)IENDB`PK~PK}p,gtk/slider_vth2.png sb``p <@,$Wڃ8,鎾 $lI. Ap品" \A(^~O]bUgV}NPVd}O״Ks}^%.撢ӹiպ<\ n^ZCrV{>JY+횼l%g,~PI޴Y L~>Lt):&PK3T!PK}p, gtk/vline.pngcPNG  IHDRqpbgAMA1_SIDATxm[N@ ES' VX`q (&)L\ؾtpwm4|1ޱtwe:E4QiYbKu4 \k)Uea7!LH/gγ^#IENDB`PKSPKGs,gtk/htrough.pngMPNG  IHDR .MetIME Cq pHYs  ~gAMA aAIDATxMo@ǰ|"§D/"DCDBHon;bXvqi5z<[״Zp8R2 e_nYuݓsZ,qux<6)>/l6RvqwwGݎ6 =??: !(k76^>>RףRDVK #"G;qN6$MܗGWP߬k:'l t:$fc-"7dLi4G{R(pK`mXd2imT^]]͍0i_;U%9au7A; 2&97)u]hg@Qм~-/0V7wS?긂.~|ptȮXԌ0"<&2p&\Hs=u p*Ee^9rc3'nvL\>I[ s-pϹ+^D`Snp8!ak8u ~q@J4 k4: =6-W+j#+AJBE?=?kE A/~VW϶;kDu &9кIKQ7t2/gMRI,-S]|LVrF4\)꭪H؞A\[06Y-KId(IKQ5>vj[} R{5~xPvUdKxwɨiS3&職ỷEc)[@LǧIENDB`PKkgCPKqs,gtk/notebook2.pngkPNG  IHDRI|tIME+!s pHYs B4gAMA aIDATxWNA.D|s)|-,! c0L3E=FB*TWںNտ+<ϲՠ5i^oPil]RzSK( qlnll3a[^^5'Nk^Gś*D ulncߣ`eND0 UM@˳x}BvNwmr/.+++h4CG6#@B[ѨZҼѨo%( ^g$-UŊ$.SnM@EXb ===]__wVAMJDONk`Pl#TE75K$mAЗ]? b$LNTȸ$䧇x&[ Z,fSVx#v4@B{f,3IpD܊dnJ"O'$U±WhTiJ bxX#L!hbb ։)ksIZG,#cSD"T$hr4*!ק% ôJZ MtS0:ڦn^B`ظ (Id:f`$o*9j-DJ81yyl6Le ZVM&^ORY.N(0(pk`@/`[]]ngp80g9X, _w\(P ن_Luǝ,:q0ON \P0VUYĮ;zªis%l( I6mǼ=\z1ZƐu[P `l6!lybCZ`!(1,I0@ fDIZpZ|8pb1Hd]:T!dzCLERdžUI\h(ݡe!@A6  l4 >c& Lċb`lU&s9ۦ|a)ِN9ATb%'a$6[0 S0G'q7ӂq5Bq ! <"|lI$+6'Xb!!ċBo`̍ei_[O`D| |LT(hoi!hd8cBz5D'2yQn&Kk:p55,IUڍ.gˮqkY^^&5sˈD=Y5h:}r___l i۬Ncz/?}~Ͽ9^~ ^%\x$޻+y_O8Qt .Ph(eՒiFl󌎁})}/!͍͟s䳗N1~?㏿3#"dP k%cӴ5m:%1=}/-*\{׿\㹧^ۭ؟p5y&YI4U;aɴ.Im1=Yw!}% XsܙL09y;7e0` NW1nueOg({3ͻ ט[?oa|2EQ{)DTP4^CKdJ!vx0Rʋ"ā(TV3S\z;iӢ3: oH*+CiU-Oϱw6'uuo|PW@qf+h[=G'@- 7 PPy|EGqt$6ލLCwx'g!}ӌ4ˀ v1+|"})6)IENDB`PK)MHPKrs,gtk/vtrough.pngvPNG  IHDR iLtIME;"d0U pHYs B4gAMA aIDATxN@;vM9(BHHHU z Jh8'n,iJҰ+ ̷3][c2;==EFNrabJ^iW|d2zX,P(P*Ph4g4+-HD|ttNZEiב4sdYvCJXj7 (1&}6ݪ0NCX{(%eDmІŋ2~IK':_)&L ڐ4h; mfJknm.0\YH.awj 5ȭ{lRqy=-;Amo6砼uv dS+6^$̦q)?BE`=A^,L_ 93 R,.R.zz s_BlX7hdB6QsU Y+Z. $h9)Iמ#OW1<`fH'ND :HYh >0*S P/٤~0ʹ~F8i]rxx?J~W ujAD!S|PVQ. >X'1.N۞#p~~ 3f@J/|`SIENDB`PKg{vPK%- gtk/gtkrc]mo8I8w$nck.p0hȒ!Nr(녢$Jn19̐ΐiϬ&F^wj~ʙo,4YCl5zB#-6 y2"O&+|Zvhs ]Bfu"vzOwcͨ܌;*̂C¹p( y ƎOf=pn:SVK&Ŝ! .{M?xr=fpJ)X[M՛$7;Gnwpq~zE~.A.3#D+矾?'5}if!+vK Ϲ 5CcXZݾJ- ^$/c o}3l @QOQd^o(LnGZ%_]W?TyVjȞ*&%RbokWm(;uwZz]JGd -dj(bZgnj[jέ^B4*.+oCIt&yt@@s0j60苰H ٛByY lE*SNvoD[pȵs ) @&UcMT|g*LlD&FCJYhRёD/{DѥARL`H Z@YS< eC9v 4stY5hJ MZ }Vv\ReB@y,(Z97b7ʟ wpoyiv~U=v3 & jvKbh皩.]?GօFSwmzTʋLLU51 h-T7_$j[WpmG]yM3]4'M jf)Fo[?'Oqҗ mRvc=|xC.eQ{\rq`b`Cwp"#x\L,fd6C~}Ζ_+X|/IىU^[b#qZA+|`J 6Dc- /S~93E؜ՙ{f; Zgg<#ЋM74YlϢgHܝH͢SNB'b 1Ӹɻ)BgOgLgLG*mj6W ~zvxOZe}i/&t qU_;e2|k# PLtC47~fW9_"kW!uNҙ?rqcrݚ^(WP_zl(Y`CYU'OP Ho&mpv9:& 66i<(W}0dsy>-#,Kbs]XB"$$,Uʗ3xr+rG/#Hk]ewga.GsgKd#Z:FwیUi̱=:hRNgLV4-\BG)US TvB< `1Jn H\H+`HV~__:ՍLS#g㘌U\Љx[dhΟ!{TS4*{-AUN*UݪqVOCF/\^Xpj`wHPK@"|W jPK$-gtk/option_menu_disabled.png,PNG  IHDRTtIME  pHYs  ~gAMA aIDATxYKE_ޙ;LL'Qw.F.\ ΕKUBEԥ F3.EBd".L{vwS ,d;]]ϯsn~pHQrmĐJ:WZ1'q/}_Xa‚N`htҍu &:v0Չ3u 0mi7[)?Z -#t^gMzK!2-\e\x+< S+ΘmEVJfa/!it|v}Q&O~b 9egFNN`qB>Q[T8 ЏxV`#j M7ѿvb8aa+NlIu2&=so4ܥ3#Lb-f?u^r#< S6B0?2f 3p"3(,V;K4+Ժ3kWKniw;ׄ"W"/ ңĠ): KNֻ$JRl kop1w Z#|#nldV/߱ៗV'P/up]#` ys&XQ`p;bI~٦a PY"{|?  O%'&mVi2.L=`nMI?"CaABF+55pdy7o[䮵w%ksxKٳI0Z;,cPr^=g4Or\"5!{ӘoAwx" Jಒ<rSB8k|+<$8[&&Zo{OPO`ǽoɨ5bpW+@Fb ;^O` uB = ɤM/1CTtM&8*}N,A*ą<#UчruzvI^:F9ԑv+$!Myq=QjB\Pŧ-75p@kwܹ0j(8Y߻PR$}/Nu|S^HkJf0ﵒܵ*DmְQoGKot3:&PKe'PK!-gtk/splitpane_downarrow.png sb``p  6,4c"+q(q.JM,SMeHS0T(N-(S0200R022221W6040T=^~QDF<2gGd1В dP%בac?DV _1Vry'/,pS-oT$GrrF4^W Z<]\9%4PK^PK`!-gtk/splitpane_hhandle.png sb``p l@$gJ\#JRK2B2sSR2s S J  -L id/ue("d!(YYwH ;:20l [z8TJϖY+)J" x2I0@AtG_GY|kOǐ[5f`TS^^@{ O6 ڋ9U4᏷SX1 3- W4) PKPK `/Aicons/PK `/A$kde/PK `/AFgtk/PKqT- 2hskinlf-themepack.xmlPK̸"-zOicons/Harddisk16.gifPKL!-*<icons/Default.gifPK׸"-|Z0icons/Folder16.gifPKϸ"-?i icons/FrameDefault.gifPK "-FoDIJicons/FolderUp18.gifPKԸ"- icons/FolderNew18.gifPKڸ"-7ZpX icons/Floppy16.gifPKܸ"->{ۦWicons/FileViewList18.gifPK"->GcCicons/FileViewDetails18.gifPK"-"REicons/Error.gifPK"-icons/Computer16.gifPK"-WFicons/Warn.gifPK"-^0xticons/TreeClosed.gifPK"-4 Ƞ@icons/Question.gifPK"-VX$icons/Page16.gifPKø"-Lg "(%icons/Information.gifPKƸ"-rTP[u*icons/Inform.gifPKɸ"-]W0icons/Home18.gifPKA~p,y]r3kde/kfmbackground.PNGPKA~p, bj4kde/maximize.PNGPKA~p,9Rx8kde/maximizedown.PNGPKA~p,gtk/button4.pngPK}p,K gtk/button5.pngPK}p,$b]gtk/button6.pngPK}p,Y;6gtk/button7.pngPK}p,Y;6*gtk/button8.pngPK}p,HMgtk/button9.pngPK}p,{]{jgtk/check1.pngPK}p,TbMgtk/check2.pngPK(!-f)0 gtk/empty.pngPK}p,CD 0Ҫgtk/entry1.pngPK}p,CD 0gtk/entry2.pngPK}p,CD 0Xgtk/extension_bottom1.pngPK}p,CD 0&gtk/extension_left1.pngPK}p,CD 0gtk/extension_right1.pngPK}p,CD 0gtk/extension_top1.pngPK}p,N{gtk/frame_gap_top_end.pngPK}p,`s}Lgtk/frame_gap_top_start.pngPK}p,CD 0gtk/gap_bottom.pngPK}p,CD 0ϱgtk/gap_bottom_end.pngPK}p,CD 0gtk/gap_bottom_start.pngPK}p, ggtk/gap_left.pngPK}p,XKSN´gtk/gap_left_end.pngPK}p,Pb=KFWgtk/gap_left_start.pngPK}p,GBgtk/gap_right.pngPK}p,ilgtk/gap_right_end.pngPK}p,z?gtk/gap_right_start.pngPK}p,CD 0gtk/gap_top.pngPK}p,CD 0۽gtk/gap_top_end.pngPK}p,CD 0gtk/gap_top_start.pngPK}p,lmgtk/handle_vert_thumb.pngPK}p,m\mu gtk/hline.pngPK}p,CD 0_gtk/menubar.pngPK}p, #gtk/menu_selected.pngPK}p, ].gtk/menu_shadow.pngPK}p,CD 07gtk/notebook1.pngPK0/(8Rgtk/notebook5.pngPKz/(yKgtk/notebook6.pngPK($b]gtk/notebook7.pngPK}p,WXgtk/option1.pngPK}p, Sgtk/option2.pngPK}p,@ gtk/option_menu.pngPK}p,}tS gtk/scrollbar_horiz1.pngPK}p,p6f =gtk/scrollbar_horiz2.pngPK}p,|l ?gtk/scrollbar_vert1.pngPK}p,İ gtk/shadow1.pngPK}p, & zgtk/shadow2.pngPK}p,)5%=gtk/slider_horiz1.pngPK}p,ҹ#'gtk/slider_hth1.pngPK}p,5gtk/slider_hth2.pngPK}p,]'>?Qgtk/slider_vert1.pngPK}p,~hgtk/slider_vth1.pngPK}p,3T!= gtk/slider_vth2.pngPK}p,S gtk/vline.pngPKGs,kgCu gtk/htrough.pngPKqs,yYWpkigtk/notebook2.pngPKs, sB=gtk/notebook4.pngPKs,)MHgtk/notebook3.pngPKrs,g{v%"gtk/vtrough.pngPK%-@"|W j %gtk/gtkrcPK$-Hoe1,0gtk/option_menu_disabled.pngPKĵ$-+Z8gtk/textborder.pngPKʤ%-e'B:gtk/handle_horiz_thumb.pngPK!-^;gtk/splitpane_downarrow.pngPK`!-4<gtk/splitpane_hhandle.pngPKh!-=o=gtk/splitpane_leftarrow.pngPKp!-UX;>gtk/splitpane_rightarrow.pngPK!-@gtk/splitpane_uparrow.pngPKӲ!-2Agtk/splitpane_vhandle.pngPK||AWBflexdock-1.2.4/resources/demo/fish.mov0000644000175000017500000443205712177715062020640 0ustar sylvestresylvestre ftypqt qt wide+Vmdat 3S`Aŕ /@@?4 ?Ԡ / T 0`ch@| C*-w8>7 O0 I$ +l+/KA&S%R p P0VUOߔY4r| P0 0*X!  ‚i``9P /< PP?|}K/yZT Ճ \3pO9_@ @`;O3T?.+L<0re@`ydNK4 |A(0GBP'ɜsc=Ip3ؠ(G@g<9? \!x ?jƽm+ \< ?H0`h0BB@.T`'e0`94 P!m2oT$@ /4 P`q?|h~Yd><AȈK4 EpH 0@r9U@ /@ş a}B9UTAzc0`yPa=9UT`<0x?@0~hX0'y  KD@,eh Nİ e{P\tH.$^f`(~^d!Bz2`B0>ΈqxJKW $ e!AqxB uފ0a2`߃?#W #cꪫRژAA$||tJ0&`9)g4w*j 0 6z-SHyq,`UtyզW0 t 08 B'0@wJK/W>taPh0U`P`}G߸;&瀌 D ̹Vġ0W_,0|?` Qs/@~RB0`D #%+k_ov  ` 8$H}S/DTvO*~$!J%\Rqx$+@VJTЃ$1$ 8< 0 AP =< @01uq_XU(/#!hǶ;T BP0R*!yZ^%R`{A#6 0 <`8UR C}(ITkMك |ٚ{WJx ~+WxC^ `y~`h % 0  t `u/T~m(|FsV@k` LA !/xJEx@j\?ƕ4PBBS/epuח.T_а8C0`<BKSQr^M0\ˁ/Bd ``B?)0IjϜ0D/)Pl$x0 N >\ɨ0 *kwI_=\~B  x0~Hai0`<$!QG+`~<Q3~Cdo=`8`G~_" 7ˋK7ޮ`86K=5 L>-X0%{Q?%0@w J!(`V}MI%( w[>覈:R `?`| K#`BA |$xEr( pHPC J..wʢn/Տ /0_Riqt ;l :ix0_8$_ ؅/q|1@4q2`8 `;jt`8ϛI:/`~0yH߁(~SBU !E߅=Ժ ar%ՉwZ:]_eX+xFAA'xx`<yE-Go,`:H0yPa=Irzf %*.H!H:T|t"!?`Tx`r`9Ⰴ% !v Bz!BV%yl^ x]A/R>.YEa!ATlXV9U An >:h|}{#%N Vo@%JlƻdA8%]P{P6_<<`8%~\h CWm0h|#'l{0Vٖp`?ګ\{GD`;@G.y@C..=b 큀/8K;: J;d>@V @ \T>D=& @X1#eC+7ʥO $T"$ O׼`01`~мx#l4N!"JUʫ;@PkZqSg^1pB^̄| iJp~'߁)X0bXA1ߕyT!t0>RPl `:0`C>UGu u!D)(e%`f߼2\0|J;@ p0 > po+-,J @z_`  ?"M#W7uϭV C Ġ-wT@  H_(? Eb@S}qU)VSARBBPdI.T h#چQ A.Hmڡ >΃?//XPؠ DǪ~p -0`U0HO`_FͰ0`o ?*ލMTa1$z[JO%c./Wx`9CVZp< @@$@=>.1YFO`C %`Z֨?$C|` @1XP FU x^=/Ftdb@%߫X`N_/wԵ^p`~?.˹jj  ߃%\5(YpMc`|6 .$ pZ&+V+N :/A|.A} R`D Tpt|EX#C-p|_.{ D| X0Iuh @wJ._z#&T+!|0<%A@8I/Q*Xy/@V pX(r??!| 0@:+6hJ:"K4#?z`J2 0#/a JAV_D?9)`@6N->X! n{{.W`iЅR\OkDRNc΂߫@ϽnW1$I<ǣb7 `9 4~m)#`<~?/FU9h`ӯ.ousH `9?`=Uaxr<(}$ I`5 AB 5m P| e5_` ʠ`:0|]]`4AB41 P_/rf J|UVS}S׫JʱH) -83Z)˰H0v,_Up~>R&QAV`/O!ב 2~>C+`;`:`^m=x x0'i- N T\4 `>+'h=Ut8QxA0ff%J 80(sZ@T _ 痬pIeOꠅ@ P'=6 I/̿ս\ B`.. 0 p>W`8_w| _Da y 0 X1&QC`w3'C+W`ifyp0V?"`<$0KHJb0C<%ȯZX  P ]bAzsm+ف|dAAT`U "P`%EZ`_Z @@|$@"^A0` Ճ 'q9aX!ZSHPXI+xób`4!+WWxR`~wO @0>Eg 8 t%/@UU wkI%@0}Ir4oJ*z4B9``dT 0?#h9 `0BHz%epa^\ DgρCzA!ECN@$ .|K{F x?!x}ϙ.XP .:ӮQp0 Z^)03' z0 jM0p @ ap~UlN{   Ly0`X0?r*.QO00`D$ `< K0?C0{h2mTa*՗˽*Nt?`:iz`>BAB^toYV6( mS = SM@ HB>~L` w!]>"ATI_!Kh=`Մ"*ߠh\$cU&! |R*f nV%%X븅"PA8}Z]>=/ 02^%}RvTWګ$Wl)PFpgP+.i"hC.'+'aP0a \JS0g  jXĮ0V>E `%g ˧V%B+WznDB<Iu hKEvp^ xC N|H0@~ҡҟ6/`n/x0 H<$x}?#@8<OGwz0J-Z "AP<\J.geZ> C/2B 0J}Sjbe %?} c; 04 `B<WW{ߛ3c= %*/QĨe4 Tեz80"H0ҁ`xHA }4 (b` ՃT%h/O ، 8WP죥^$g A//ZEʩxt#$W_ĵ@b:ͽ UyЇˋVP#Q{惘vLS}0`|5`=T>!JK碪;`}'l>8(Kr0:0``~| 8'@/Z^@uyytRvz>pԁH !6 JV:`<]t3L1qT?^"\>4*4! F# `80H.+ʊP `5گdp| P՗ pxĕyA | AT" h~% <sZ1 D W,HWDe ^T^0<\CG}Px 0BWQ%/RRcB@CJ`exCBx.J Z>t/ įqE0f 8@WBˀRt~q41x!z`B(px eUa$G@x*(:~ P0A b)_4v8| 0(Z ށx~  QT+X0@A z"`\Ԁĸ8Έ5(ݧn }(h j!WJx9h9$OI_б0LaL OG@"H(Ոʼ|;DeO@< xF³Rs`9A /|?. |$ %$!HNJ?*TF˔{0 T| mW<<`/, L@ x0>"`; @plH.9t :u~?ST ܪ@( j_"C@w%6caK : pCj@ɂ_@<|+8ǠxOfy80aQ*.$JRؓO|!.O+]nE7#껟D,;@T% 4yd"u"@ wH~*.Prܮ @5B" JT]#A$! H/ $v@ (V_@|{`?>lR?$S?Ax`;i!):wAt`@9<V|!x\ެ!*3/ $ ED%e$@^ <$Mg(e$ 0w$?=*.u=!H0T< pB*p`.e@`</8Phr *ۇ0>`V8>>}Y>4AHRhRU.?z0/`_v5=bΪ&0{2 4  *V ~:%u*wM0y@JW΃>&ʜ $(!` BxxGT APz*@t PI@f `kF>R=x"UK/Cx0`҆a &` V x$w!顥 ??c;R 0** ` T:`xIs8?T%hb``/߀op%O*q8aqwd  0BP0ǥâۜ.P?%i`2AP`0? t $oǞx [ H` AW¿H`=z~ z<>\%\u(0A@^ U X0 ?%p PRYĐ` X8^]/O@o&%X0w|Z h0"=aϗ {K}(zKT%2'->Qs?TJ( W@|IV (0ʪUt _><M}`*R ʥ@UX.۰:>@H :Rs$`8tIЄ4`{.ˁB\~]a|/`+PS4q\M>`;|o0AF?T"# QT Yx0FcK 0eWGWp* 0_Q/VQ@c0_aDf_`}KcP8$+T}1#i:ց.E`aP +ZAC 0CEBQ%*#<`3V-.qB -w6|ʄo@m.N4>ղ (H$sǕ hWeP {y!"% C(>X~3JC7 %AFEeÀ P>P=^$$Ã+T}q) @R0. 0@ 0 _-Uȿ\0 L$Ah3ρ?|JW A [b=&\ P0?;V<ͽ$P4 80vERp| "9` =OsB ht ( j iAxJ'±'yRzLU()*M)00! p0J{D8OOBBג ?sʽ p 4J9R]WgU?_,@` MtX0W6 / xd%7ЌL`4!)OT)(||>/7!@AЂ0@ +"G  S\k І CUЄ?'R`A]WBP'π>@>Ho @(wʀ2R2@ALv¸#,!JGt07 sMBU@9Xd  ``*}$لV x0@T ) 0`  VA0/QTe ʵT@x(&@#ǁ4 ^_[G "R].V\,|6#hz~PoLp:zcBAV>Xw(6 =  u jF%z[x8x_ g"^VŸ h%\ L‰$`}`Avq+V#eez@*$Khx7hE+ bXP]';H~? JQM$a0 z(R^^ 8$M*.Qa(ϭ8`PhʪxIrˁngⶏDu߆cAVQШwhpDiBCp~D6?ϗ&ၡ K%R.AX OB3D`:R%X`Mv0@\]U*K]eo)`;> #qZ]\`. <` $*0!pSxDh`jw4\ [0T SE00UcgPcBL0 R 0!U*~FvTT%$0_> V+L8 pK/T$*Ko@|DJt_(J eQ\Jŝ#tjldF\jr<=`yMӏx:4* `PJC(P& `,`x_ejXL ! Υ`s"t4 HѨ' Q N 'x`  @P#(\ j8]G~mn0`z=v2#YF+@@RHWJN Wf@ _@`M*qyp-r#:l P0~ 5qWDu[@ >#s`@V8ΠAP0#/~~<$ y?Bh   0C &b`; } q!XjA@J`B <=.iU 8B \fR@`V}@8~XuOx 9O`y%ꄂbH< d Rr8p~\ xc^`7Yt(3 )P`5P   C/./U4F@`B. !x^^$+! (?^@.~V>U`QƌZ  lTKS8 a\!SC'`8KC~^F BF{w%y*+ H!" @0@%2(+b׎W$b 0uCܟ~Ȁw@%K..`?SfaTK.>ҧzx0J`%~x@(!$TUJܠ@$ A2 wՉ`04IUDP]] YbG*ܼ `9 }#ġ0_B8Gu9`Ex֭"x`;AB^ AI `3.> OH 2|K򟶌pA@*1 4!  0 w5?K0oA. s 0*\RVQ0 "t!,KܸMG+C8 PIy%{DrB^^.Gǂ CI\*; 0K0H(ĘZ,E0 !`~A%(** `<($֧˪DcKup*ia `7Ġ`<$ z~~ g $>&`(DUH.t(U@ x0b@B,DjKr&/DopAת"1A I.T?hB'ďx:%u!80T`+4E#fxA 0u`/w%C`AaAߛh`<`t!{`x}8=w@? Ġ<_*&0`<%@ j׋ 0 u2`UB9yԉC`|@v `y ^A VDD1\RG @ c`W8%`0  P>/4AQx(B# 0`8z% `<˄@`đGW̊ J{/Borp`8( x=@н`R  a!(/{ D)R,b9uU4\TK@Oʡ+AA ?,}G`h !Q~ GGT]-B0  tV@,h0(2sīy3 j1l*e  X0H0j{h!`D`8(;X`@h>Bp!#BOH`PJ1V?Wu@Ā /T _\@La$``}XIS%>Π 0x !% Kr/h  X^> A]ﰿ1SM !AUBP⤃`P_.W;8j2%%X`O ((vT `xb%r0>`DDAhe0`CHx pU_#`<ժr9 `@`KĿ[u/}̜]OSH /0 t?[~Z >HXBAyp%tIC;y J,!!0{,#_U[JY7``GH."R+$N`r %W` L`n.  C< `<Đ wrRZazQ\%xX|@9 Q CVH0 R 0 `0@y~O70@uZQ:@Łҧ0OEm⩭ | Ġ @;//T%X"_`8@q`"P0"2ۀ~th 0 0 /. sa BY `<0\>^ B_ 8*6d%ߏ"å83@`p FE8"t\ @0A?h`!p=S%x|\ `0?}~`~j4m6la)y X`ľUO{y *] IÂ=~  x0 0xy?W$cCA?oKĸ_`!wn0a ǣ?%ҁUP04x$*(7 h0>gׁ SʫP'A@%PJXAI../8!h0#/D!P bX(0WEC>  hip0:/~0}>0hd (JVUT?.  ӫVu@`:`y?t:yV pAK IxAWPaiC$ t 5QkK h?UQ&Q~ 8x>.+C`=#x 80GR-8_ޞ|``< 0 $PBWCIxBx0r-V`8~7| e+e4O{,2bZ~Q|h>4Hot BIt!x \DK`~%in0_u3!X0=yF]/T CXf1#iP0xj(`JĉU?Z}UUD9fF/"TN0`:@A*U 9fA4$~ @s8H/.V As R0?0\jtQXm$!Tl6&{P0!GJĿꄵ`~ `B}4``emz e:/x0`:CV tT>BO!},@`<^  0@Dž?4$`t\C? $P`|wV nqw}AA]UԁBt qxA@ d`POI(PAX0! Z0*W릁\`7uQe0^A8 <@4wAC`ힼ%?A /.&E~\ǪRO6|rx/p0 rJ?Z@1r|P_ı_u.={pd @t`}8~$y`1y @0BO~Ls<\m0`;  x $z(+'`<p`P0?)5x!Fn#ACh1$I ``j<GUHJ:iP`| ^{X: j+@Cm`pl5@(\b?m:D9@?X< o @`A% (V` pPLuJLq, 9Z\ 0?y:U //z*3X0! Pvb+`y<`BcOA }pxp&``w^uZ!H 'M0=} K/ Ġ:=.<ĨHt xJDC"X0R `0 %=U%H?`:< 0@ I΃hdt4| 0v t/ xxFq^ yr`?w? 0_>pF@0 _+Kж*ϓ>@`Ā8/xK/R{ p0!KJT?P j\e `$ @8 j  %1q 0?D$BD@~IT=SJ ㄐ`;T  I/.WP1*@RBH?\WJ\  P|\4cxp e`{>"H<<Ѷa+.,|@`;"$+UF'=A!x@RTê}H/A/T\0@"R)T``8AT  m̬ ?~ h 1@+azl(B6LJh0`,$`0?bv!p?(r >0?2eUT㚁T!\{TDj6/0@v@?@[WM1]k@ r$~xDZ0߾3R ]>`Bh0**0"(OQ(!{I8 jU(Zv !Apax@TH(~r 0` UmA%0J)BV3S30@ ep*R_ >0Yz,]@@wp0ʇ4!+X0 @>U^JmFBL@ 0 tJV ;WA.@0V@:^]R^ KVOu0`<ĢwXf?oԁJ j} lwiP0p@/`TX0 ~Ģ|>@`P\%`/]px$@+*{qeK(z$G>N% %j h0 xt*G.H /d `<c :?/Pzi$JA*ĿZyPHP!|z_mSd h0 =?ϗ+ 4@)P`րhH*PKU5SU!`=` x@ڭP0?>D@0?`~UBKt[A!0 ^UV^_2H` DVꁁh>bM~0tC Hm%A#ի݀RJ_ E!<$4|6BĀ`?x /Lb4_^D8p`A#1_x!{ B0A LzTo7| ^S9H x vJ?Q{ н/),(%@+`|֠zO $  %2|D`<@7QFq/HJ_[&d% 0?n*4`"y"\^ {221 `U5^=iF&3 _ ?V p0=C 0bH00 I+@4pl^/=˯$W-R'`:z T6 00I  '0>rz^XWYHQ  0`w$ h0!WAGe`HpNQ'0> .-Ń0!h0 xnRBy)!0 "a0` J/ qi "Q@w0&`0K`x!(*x0@}Pty.uT ypEد\f.fIyD4Qp%($^X`;.P {v>% VŃ3h,֠L`@ǂ_C?@`| p(YC0]`~% n,`@؏ @Z @m#hr p *AG*` U|~ x0A`'ĭİ``D@4|Q}R)@0a0K`8K!Ta e W $ ` 0HK0Ac /@͌p` <D`}@hyTekBlP0!>_h 0@t@\DC/X h@0`O0>Z A  %2% z?dI[R?bv>0t| 0XW8`BD" \  @$ #(PE\J bH0"HB |!`0`Um-4 h0f `xĐ /mW̾J-1Tja UX !V~ <3E %t`B" `5K"  ] A]A燸S"A ` ?@@@0` ?@@@0` ?@@@V,W:CaՏ<~?us[um/լ2O ULV׾k?ɸ8 ~i<ZjJ[s3S{nz{JZ='C==O!~?OU74𧩅0pe'T>@O0hp4-@%xdR{o;ax4-gžL{W"LUCeC`7L2# *.V /@DS 5p~Yw``:ı{CJ/yu H񏃀 PKy\%Pp %+Ǻ|_Ɖ8Kᓪeku3kV5x o. <, NABӷ{Gc6w[W ),`iscӍqd!P0@F #A.x%Gl:!gvٮNs) pDQ`AUhGxgzD~x`L3f"n$M!}׃ *M{{f(pbW8_8`^֑ PJuJ]U` |<>B!9oH,? "ږi ~ET|P< p|y7p=-dQ~P~%(]b @4K\=`_כdBHDh]KHa@B;ydž`,Θ~_rB'vp88K񐄬 HS~%N-onX܀j(fa^cl)"WxfjpM o nc2oogeCݭ=_{@/\{mt[afxg4bt2[-oÿo=o .*êg 10ynPJ1\3s]v{xf!aCFj^}:B={5oY\sܱ \OHN(whgxgWTg:%t2w.4 -|2rz.a\] }]8B<2Tz`0cP`~?~$!{ ):3aSC ˋ՗.JW`1}Gw]RB-;T땀BJz{uAYI3V(swU#籺24>$"x :\j;&Bwׄ9!rqAJsxgS.ǥWA?f(hωsfaԎ yʯ f1-@8@N۩sAxhAPSi;$Ցb lo˔v.?~P ں{&|]hVRp4W鞧 _vHFbEW%Z }WHhw Hz#rP,g5w(SfUC%׉<쒸ONhL}4;CUGGz8pTط u}sq{9 .rip_U$}I㎟Q7PM`(nS6:#M8{MhJDŽ4?~(5CߌʵMozNHQ4=w9SpB 0͝7 3^xp?=<AD%^oLĽ! 5s1>$~::oG`'Wap >fp_w-|eo{;6xx|j/k=u+u<2  ܷp{n,_ _xgJrg. 7{o57Wg.w;?Q_-<=@&4Jܻ2czǤ|3c{ze wc.LPp('Uxy# 8}8fh䛃 7 f{zit$p mᓕ [% y&p?}8pTFCOp*xfd#^ql2I57C@~Jp&*tBTVp) <|fC@$*Ol{3ExbxQ` ]V*>aāLaˠ~ WFC\ 1C-># {_JwFBg7G}Vᇏ?O0xh0>MZ E3Gڰ V~@$Gm'<=@q`)=enJꔵvᕝ8aanWa:#ѧ .l|\*hi"ǝGDKޅo bX7G>ŏ*j 8[v6^PP=oi``ީB!WtK.PW n)r g˞_lpGx^zyi Oovs0(a?r9vLOݦBD~Nj pPFk8>:.(Llpd@%^O@*;$F/`p?./Fϋ/xo7MЎȠps28___Vȷ%una*\Ϗg]9=އKܯVޞ:3uxx}^`'Af}u}TOL2s os?I3 Q);|Qunk{[ Ekw.ΧC3й]Q=[{S8E .u)=%ͮ92>Fj6`Bh8˿V$ `+]"@%q]^\z3 *']V7[ Q DrPL~_U? |(Դ@c0n+ڹp0uz<+<`}+)M~B"gڒ%fF"ۥl5pHf-Wθ)P6; 2ÊaDh3bӿ:Gd> ā U}HD6saurLI38*-T Vd T1Po7. ۯբ;`]Y7ψy1d"4ZCVM>Pb(Sc8~ Dcc2 GTT G|D $lXkm6w(ax0&¸{n 7ݫ)`%TЏ@ I}'ڊǠV@```PP+a;t߈ 2ǡ3G?+sE lga= c#džퟧώԝsYh՟'z10ZN=nEz&SCv3O>/~wBJx2X|3bLPY9Ĵ[)=2[S {-z/<t="z{ # T5xusFXf5I[s*x883g9# S{-sܮ{y/4ge P<;x `F% ot`Pľu5P(/ xE-4BB.tSɸ0=U eTjn8 >~PKg]  8fa9/\ =¡F|\%2CǞ(ZqTo?*>`FiOǴGwH4t,2?AddxYY8a%8)pgrhd<#wm 0\\0xbީ^8``\vT(#;vVppBNepiT|AoS ev~|A/Fa~D:G*$\^#gA6##Ɇ AT?] $ Ą4/ gr`\uUp:)uļLyL3>8TqG@+;MT8^|Tq+' .`::Kua(%*ky!uA ;sIr.n6tR5p2%[4@# x{P0WEjc0[&WyFMAp*'@|x8 c7\ʔdjqOë)B!.i7; L\t?,s ÈDDᐮ7ooTlo뿌 C;;N^N š8[:~H.o-Kio=Tüli ™%yT:w3SS3!dj᜕ G^NS0f(O(Sc.V$ RxI|Klx]m%XIZzym aG*aAq7Mtvݸ|-}B"lGcQp3ʋo78f  Cwhzjn 2_tY[2v&xHPɩ22J{dJ?(Q`-6tYψz(%= ޅx 'g4ͯ$_"F5I363/;TIޞ$V٫@,G gTy^ Q;avp PF$'hU蔃 .dX5k>OI8uGC ɿгGr^t^OG}>rpO4~Z8HaQᯛScfÿiM9GHRQfɷ'gF>C[:Ͻ-]|3GXugNO=.G]fl/j/O:Ll]hޞ/={ԂnNٺh3~F_l5(kjQ9`u 4>R!f[M73})z:OТ:1C=6&g٬𕝽ݮۗ?g;+qIVێیؐ]27NEuP=l)8_cU}-Y$612&/ݑOhɸuS/rkpLp>KϦ{Xp>S*ʇ{-_ o60 x%oz{罿wNo ?"XB$F`yL(?oA }>^RB?Jr篾*'3{@*=o:iG+p8J޾9Lo<C'+z5u-KjE: (wmX8Mx ^#*.%ȉWVDD/~Oj~# 7)EAL F芯J2e}R!{UEP!IVU*T:g˜(4!(}Sh"+:%(dЊcD畁b{8dL!zf{|yXdt=Rpp..)lG6~`_͝Sec3kcSbgp2S 5B}pn !3D!ј W% aWK^Apj W9, w[0 ILÖ08"a1N#<_qZ*G y9\]ꬥg^:~|  `02#zݍ1p uDŽiL?Ì3pxk 5[@e>wu~.ޞ=[}< />@*FJ[dտ~0oӇōN&|S:*ߕ*ԇ}XYgB(;ƯΜ4NԤ&eD C(| qOUMj1 ò18?AHǧH<> G`zO:iWSç#*v|G>#h3OyJ>O}6D# a\* t8#Q~8_ֹcrL3\=S[`<˫O)pjû1$~::swmRzR9E,4* fs;=Sy&e8`((5WU4>Q U6_L#bs?2+u}{VNu6d|Ns{tw0d% Lp 8x)OAI> ||9DB;o2$tw[Kz#~kcoG9蜊2o2Xf5xd8Xd2!zV0&1W{qI O#_h7ou]]Ǝ37,'fDJp]b<\=1?808Jx4[73os0OmU>jۛ޷O-mȰ2T&4u|ܶ)S0ᘏ5N+iFp@ >! &ꁊۂ-X0EÁy|< 0>_ZE$<9r߫np*M{9W yXdq=o{4m7 ;ʧrGR;)yu$W@˕*Y yWo"!_Ce4 RwbjlFLXVl~>FNs}qW^x+SϷ3@ eWqMH v?V|h@}-k9?ʕAE;Jl):"$da~JuHD i?՘h" "8(§8mّ.'5;0x`(*W;^^6#{pк_Yͭ[V5ݧ鰴(sǀZ^ (+\t t)^ osyE4<TbpFyva#l%K0u~T:M/FT]r̼c *L%Uax^ #>yyf2:$Ia]Ij6; ~A[âcG+"Rr@k/+ff' rcgz0νH{`AjHh1ĿuՁӓW8?J^>>!X2TF化}%%K*:8Ҥ< ājp?h R3DIu Ո̝$qK . MVGHGDw?]oD(U_c/MðyW.bL p]o/ zz8#b}  ^%1/{`ߺWi)֟Zjɼ_ #4\:ץp=(8@FzwutЂwtyC3jZmԷ0CCkgī#O> "ǎ3c13(S̖v^" ΈQƩ_!WK8 1 ȸ3:X'pCˇU͛KӡO%3IK=Y3q̝*pڰ܋5gT,g nЄᯎ9`>HF03 yzwi:/A7|{7Fi;Yԝ><89y= ?NoGϯox1g>yޮyfSHT*#ryܡF4 Ͽܨ:6,fzޮOt,Ig GdE6$8>T7)#1F㈳%oEr(abDSsrL/`1i ;w6a.gB%?ރ.5g~%;":=L)R7)VJ%S}:y/2I=f/!_{wowtK+Ni["#x5`xHRy<{xX8`}*Q禠SP 4Ҿ-\ѕ`D)[Sxf{Ʃ3x&_sͽod6E)3zO;OPd{AU7 =;S$_jq8).9qzc"X "(thSH Ħ/r| NG ^amb<JB[%)V  0,/!:"hi!Jۏy *25ss5`r0i:S o|  1}Jo7d $|"Q{nG$'{YƝ+=2_w~ 2YƙHlFkA @[VX,fjpa>*,UZxX_dl ~ѬW^,ħDa%2~X@ͣp!|}?2,/J%De Q*Gc _" )Q^:/ cTBpx2\ W U1%᧛ Ri9^Ŀ&p9zE?ݬXӺL&PȄ'CzM b0a!?o ոI=',68?\x8?M6lecB| }:1p擅1!JӃ {fpڱ9ZϬhW1Ӳwlpx0H~\|O)B@R>'H1RHG<c8ҪH%x= .=_tf+7A FSJ FpvqMPf' y)+aMNO(ScU( ::p 'kPp4|MU{pȏV"+x_Mਅ=›;nۆB4SS !hd\'N1XM`@inƩH|3y>Oi 8@Jp?c8{}^" YꙐ͎9O5Pvk|5Z%h3^8oIX#iPo4=9?š.j",vz/xJt_I̼cϟ{oc}l휃8ˆooOn!<yyӂ=fcSjW')q2]\4gtrWIr?F!{Σ|wozOElf,^i&2s%1<`δLd8dMd fжx-W4">0^#6xv'I _2Gr9Yh/z$ D{?M7o3-x=1S&?ZF;ԃQ{ޏy7}CZˏ˃'"NUɻ'(p 'nhp,W Χ-p3:q㎌OFV’'3ho [Fd.Sxf%A+SqP}PPg?bρAEгꠂ pCP ;P r0 `;D AP(P|^.azW q*Kb+HİBT !o  &hDw3*f4'`u<x=>"/ܶ ~@q@r2,pG}@0E0f;ǃ'Z{MOL2 N|)y˕0;84zWK\?=ڊE`9V$DJS /ǽhAcKqֈ3*B p|dJ|IXFaj6 /\ Ot>]xN>Rr8h(St@2#Xpn>g+QRӘ)Etz 2,rf&0RLuwk*&@O!/CǐB}BRlj7Dn#wv|y&;SrlD-SR% )Pڛ KNN'&_5!kmGxe aök)>lo_xfyrgL_?/V#|$O ϱp(.͛}QkN?O'^W#Jf7,z,h N2y |yĻ̟E&_,{a-M)VZUM^3vN4{.paH]!" tI)cQ =\4.xe'ٵbˇ@7ف~L>xph Ilo'S W%zA^H')swa?x/[̷L'N\& 3Dl'+}iy"Sd0:/G[#*:?;)yAUTg6AOA`@2Q(IPKjQì#`|]' BCb^ -Z`tHX ܦhP ~HL;ʤjM[yD9/BDOQ+{=xg8@s=8eM5y;ޚE@ B;2D~t=uꇪarpw5OiԋE ȺuFFHzWjRDž-Q3O$y/oI:sD _Ot Uze$`"MO ި;67l3xfx8_;w!P^^a0 rhx& @\~sҎz4Af/ @? ?&H/8lӅJ. #m]81p`}e(}JEa.pBwMqx,+bZ!p,0BQc(:+.U*U?G"  <$Ž=xsj2P`M; R *uVI:H"*8 @L)LFpe<p*EL6}BN@pߠuT Q @lH QOs3~Dz[/7}Fx!5 4\)'F3x@%wq ?8ܚ)iW/ZH8 xr`Y7 &QLjoT+)z!:ku.4|O{O7R' iZ4_c'Ӈ2s\(&[M6z_Kpb:TNϸ),3TxGbwA^p)\hG[hH_5fψga?nEMS<* 灰q  䁬\6f)*v\ ,1B(* |04ltnw([ =]'9N>\Ҿڴ*;p)t*FR[ ؟VH\v@```07I5Gu0f%GL{BA|R%ua!R8[axbcz]^qae<9<|^;I)_ *[r<3Wڤ򸬕DE5j`d<chI,<{U80J{KfcQ<^sd~Yg':!o'_ӎc{8g7)ʀ8%p?7!N >yYp g^ Jh)*7|cA,uﵝE)47Lh[ڈi0^>בh1OS{4J@'Bm|<յ1񡇘Gx}qr`*:6h|+R? S\3 'uRȜ%O h,ǩQ6sIMMl ^Xύ\dOAO0m 0X'2( 5grA9 uC&Q&g)d;|%s?x{>Qc9o=42qMmN r6맶nݯ.:Op=Sg)MpoO{1+wFOS3 KsS ̼LoG2rxf{#D_`[o 43xp> n{^3{,gEOgk{{`1 <>|_COd#Hy|:0`CAE./_\%z+3-`;ÁyU$FC#àq?%ҧ}k~ }UE 5c &!'׊>MN_i2(y!ᛒYΟW Fy[=[?g)?"=&_V:-d>#8ouÊՏT(b1\( abhyӳ5 ,/Jo |ͫP+ ٔ)}~$H8p@ {=X8 hgk%4JW2}x0 >wo# fHj{ U++]8Yp?6k>n;穆ocr R}/b*UqP/t=}G_ IĤ}F.U/ M°(a5# ,Ԥї|^=A/X`~T)dv d.8P:\qY;bg9f#YG8 K4Ge^`>/>^x*φaf{|)QWF㢰:@~Bu[*D^ow(۞'6#?~3}z/  9<1y&bf#qq}=.op* p>x8a8_׈A>UR/2*|[CUZ'> _S8">Q;4/RT ^"_0ނb{a h(zqFڙN7ve 4$xqx(LGI&|D.Ƚ};[Fkm'oâwj1UcԘrNuudŻ 93xitE8*v!+t{J#f GDp \ E:qoE7w4gy ONf4_TCn2vMxKB\ZU~X8Os>_auw3ͼ7M3sngOT\z:H/L9+ P-v3hݡ:\2$j@*$_. y4B--$@?lU*'9(=0 r@) `DјG/#xh3/8_P3OT}g=jam<=gaekaÃ7:N#,.8t);7qj1X~" z@{5;q*U=.ȱ'FI9C0 g<22)&KΛwd*V_kc>$,l۱ AgcڀǘuNzIym'O Eo{|<Ǥc?݄T*6 X *ٶ0r?~$.IGoS ʝC+YJyzїoO)jg]ixeHj^ D=Mt&o+6;1Lt j_u8#Y}9P<%o{=u^}Qpγܒc)6~|YC6-og[DLήc/|2? g=^˼^NTuQzQ~060ΫL8`^y5 fB8ʜ:2mK2fc{JPp>0p?oans ʾUORo ޞo%7M#0>`BUT%{ObC@l)p{a @=+_~?=PxK䊕|2QT_M!`C ^ !jo^0 cF{i^.LË? a"B>_x"˜AyD"W4 PP 0?4>BGE2Uo hvSX$+ggtFO  k8ă7xCT@SVJ ꏡozћ}8m 0x\ x#pB0 ~)|N/f} HT%@<>:̰ ӊK@d" c+냦(0~QG15cwx>kޠdS@C>x‹NǢ:^d|p)?T'xIE 7%r<+žC >KeD=Szj\Jpp*X#~uNkoGܬph˜RħUN8jMWw jz~|XPA򟈞B~zyW~u_b 52+G6}´tI-db *U܊;_]$AjtID+<#0p>1;Py]*fdhȗ}c]hJ\#P&8KHʲAxX )vzt  R%.PA_edx(==m0-\ V ?ˢ?nfؘD #8HQXU4SOPeT\盞$8GE(`t{.=wL)Y3}Q36&@:ƶw8(B[9(fL#`W~2J6]㿲l2>9usm0 3i7spG[rjk:C3jkpGE||KOhc UG}[ ]';﻽7ӟISRuOWxSہyoc; 5'$~$vs!5 ߂ . k${J(;v#?aKށSar% g%W0EIQp8e! ½Eǃ T_d)>џ𧫡zy^a'йTSD#{g;)P#/$q(SO?ON!OG΅͢cB [ͽaxfg YS`G#\YӤ[ 383ğsM4D9Ij9ubz@1o(L/22!^8L$_ {80mqʊ&Gtyƿb<2wI%djOPR#Oq9+Y~MϦ/_><.XSIϋ!- ޓƧEGXJ0'lR(Ge49 윌V{/ST oz~lr3`" /P ت(zE<9Bv#Ǜ˛Ok\+Jpw'vE,@07R$6t2S! M7OpTKz#tXs!XKem-#>u1 GifINg8>m-kUÌ'о3gv-l湉ԧ56.<>@#X-{>cXe9m)<}kzf# {1ܼ<Uk"kt26p XuѶbދxfi8,v8-k<0Οw>VHvZ3os5Do=B\WJ=@žH+p(}BWAE zKs Á!P} K>p`2' h0$ JT\uM4$Q+p/q%^ OޙImT$˒Ps?M1A冀"{[\+=zxxf'Pz/Noj瞮Zy gzbח)䃮Oꄪ`tD_ ֜ݣ^0D#'5Q p!A,JEVx(KHk@pQ׿A(gcTA^e)bV XFCqy[G/2!sy80`%`%φvL%% ^:WPBZ 0R߂8 9+{h߅炚=OL_z`F auzw)xğ'RpAy'=Q4秄3}Xf =O7\^q]kz<3 0 @/&'!3Uz.!xFe7_J az3? p@()`EA>+%F'6iHs gCf"y&8F O(8yZ^"CGPB338ݣ!Y ò!-b>& |^S2| /)F^_ % 1,dc;!讦# `>(]0<3 m\O<ٍT|Yɮ-"l0Xd1){y^{}'Bb&L0K_{4xg峌V}FX#g\(b09  P0O5 DxOO^G쐃#h0r+V9`ϦЕn_6FEf {[loc'B`(#C͖#|o23FH  Wu{X!8`%_ \dU>+لB98Zzyq J0UF 9K 1CI+8fr,㎯Q#<OiG7m> xJt_a:Do ыj#^HND3G]xA$'֍҂ZO *֞W$Du=<iq?wBrF1EδO.у)AxG'6rs+CLn +!@Շ hL(P3:4iT"Omb+K <8 S%^SO!R2΋ #¸Oسt`, EIR4}թLԠlfje?;=H1gHr/Юk=F$g܂3DUjgxf-vшBz:)Ң4%R5gllLjNmy%RUyA|6q5:.ﱜëD֤4`~tiP .߱U8K@x bP(ǥFu !ާ8FΒX4Xf=S(2zۄs21`KJ%â1_oE{'zzey n(8SfNPp.)NF8@}<%@S. `QQp4Bfu5I8ôfD30  `3F~8ʻTFž>@ 0K2#pȄ˻Xͼ[|'MD{A؍C:A?uU bʽ-d"T7!L8RGx0`(%j>PET .Q} 9`N19Od"#poaB4TtFy.S$Ē>x0_jA<36"xo4ow`j%!084D@ *G=|`8B<ԑqg~=@*L8e(j (2.˪`p>jذxjxB`x _b~*(E 9V\^:mvޒ"OL 8}G+mHP!q|)G]x`%X` @0`|+%YȐTR_2QdGn^R=U蛺!Zh0-߽ooo x΍`x*w‚8Jz5TpO= d޻>FO{} vݧݷޝ J/XV &f@BL /J3x(D>wun'WF7I+ujzqD+Pʶan£PΨ2*"T}D咄"򗨤\(4O,|y׫ Ff4tY$\pd36ۗ,Gjw$°Iвt3>(d>q e' uL?>7N p|KxGoQ$W_GG@}-|;g%<ͼdˠԠ"rLF1V&\6^M&_;IgW3Jiٺlw>7WC r'|;U$ksXG{d <,,bdSѨɼ3eD lʨLqU$2sgW`'<3rOǁbB.oY8\N6;"*N9)8Dp~(!pdY R8j3ˈ]8Z!n:2wppN}"W (),t*Tz:v40)qxI$J%qTz*Fdgm;*S !ʾ *?U! ~T|ux H1`_ Ƚ]?Ϛ ib`Vς,JK *L2 !;F=$t>ӯO9=#Bp`.^6B4o'k'M" .t/z$}! =M =B& !x|]B' `#j*}bW}FbVJ*pA ĿNX1V|!Ayr17 2x?iC 5A:?{淭` t"xdL%vh)F>kr+` 3n9L$28?s0@ 0!`x+*EErJV. ?1pfR(h1b 7 '>v*-6#Q3~3Sœ įߘPJ<\23l8@LxNT>f>_x: 9xB4O<<%56+Xf hD3[i R{œGp0>ʇZ(UFf @%-ᢱ"Bzeh`&kB3\'AJ.18g|3τtv}'\q 8"Q& @*Qwޱnt` >uah#\WTF2c:vo4>dU88^&@I7 X-K j[lF(tE2'B'8{}  Һn۴+{K,ky.#JMp Rs /׈U+8KtO00008&>uo{{tNHe_/֞/?Cg\OtBu?P h8qyxSJ;;p`cIj}*ri#qVMbPK}}L SDWaЇ(E`:_ -^j$Ph)`QBa@_D`+pZ.zw%xlLrEĂEh%) 3&Xi:XL/W* Ve8ըiG&4"$d.O!E ##bNTi=$#>sx{Bxɫ }VxR2%mN8_KL+|ep\O4WڞњC*xL6I2.OqE$EMot{ *S?ZJ'!g I: gʽ.E6*qm&K4aO!kAfNygvT%"SJW/5d!k4E/>ik>V>B 1bZil2|d&Rs^jxɷEI;0Ls2Wh;=6jaƒ{iA5:{X"#s-| ec^3/N!g'BvcZBϱgm ;n mgzB}۳7L]d2V~ř o5 gd$ aB6:zxu@[i~T@WO>}ST}?Gxe c;v$烁t^@,R7иJeCF.}z 3ȼhulpvp_>Nvts:?ШΞ@'ω{gǠx &&'~pr wtGF4.t᳢;BdG_0@]~@Smk#SH8|D 8T3O^yn*$4'`lHAx(S(i Hpz"5n2A:"x3zT̓;Otݰ ';#.\7v.t>LÆn8l3ݷI}000 (HGG _vuq‡skumL@NO C2NBHdh(:|uQ\S(08-!1(._`'[;ϭש^C TU-hi:9=eW=Pi^8ԸCmyG|Twpj?sB[@)\ %7^Lp p(YymfRc_ Յ0?Gqy^afn9ODS/{r>N[>d!ƈr.ms7}7{ՀF</x"$u!f) =?u sM 08RnF.຋ /H k2򬱕g"r"X/Oǡ 1@El'# pfw Q1i"5y(놀$d1qI96XOjpC0_CWď!^!04 ޚf ۋ2:բH;LHf.[5g:=3g&b 3mF=gv8|yM=Gx2_:MWInB)zUs'@ v$5Vy0EDJ4/!G3 #μ[<3UcsX&fhf`c] M8Fn 537: n: G 0A~/T^` _9( 8# !0!^%A倦/+ڠ@Z>WG_E6ey1S-,PG"fGd@##fը0B$*C.\}_bJ1 Qa#oAϝd zx87MnBەNk?#kLhFj:.@X0Jį4|&%`  <PE K@nULb0]V^ײP#FKQɪ20 6lFC"C5Ѡ:~4225#wu;|" orm!jvL Y#M]WGl,0uGG=ӊ6"hHGX ndb 7[vnf:{0G_(S>Ap#/BXk 03 wtn۴} ]_FE\sKg~;ng;ݧHGG>״w,sX*gZ$CQ/GNaU*Ϧ!aD4!PɌtJL*xf#yzls< %r"P0߇TJ9lbIR|yXd9dD#>H2;ÅxO90y7`{tց5R}`f~j{9h DM зo:!JBOO<3Oa׫N7 zK{7O&_xPHNAJ i03xɿpcJ|h^ {}~áy} UJ. E]ʈ]J X^ $b1Ԍ8RR16q>hTh dЎF}8GGX- @qDm<¿qpf GAhnoTuÜ_ k ugu92;jJ63w~vճ.`n}y$9<`~=LyʽكNJS@L+Y @꫓Nz{due#I%sJeQq<2> u\ z,3t>z8oH[bWYg<aP0!4KoE{›˔FPf_({ sb3 |b)a>AbPJT `bb< lw|OadR}~L-ɤ &#㴳U*{~9.tΫ2I 8uڳ~Lj\;̌PS+<3Ω֧I ò*JGr6 jǞT^<.g258)LZHqa4y\`jgzeP8 XW4Qg5 IL388-m|2u_߀=}VB4@=P0bXb OxF~{(% 9Tˬ < Ry^ t0pS h0!@PA/sP~ b` x!%OL`H=E_:1Q|Bj?@ 0` P`~||؉?ZEh=ёIp64Dlῷn4碸=b-xŒ2xxG3K[! !ua)yr^aˁ.%R 4[rMʍImSov@jw@`wG^\( 3R=ly9|[T4 ~[G^ P/0Kh.6!)C:cVu`\4 fZ;@O@ar @"y_}OJ)>6q*{9!䛎 t+b:}<@oַ%2r_'RwBU ރ DdDWuv.xE@Ä IfF5([nw)3m;G<*LxET؎ 4vT#7/~Xc[woueLzkjpF `~A > )$+^%  BGuuu @V B=8!V]GT, aa@ SP`H D\^N$EbTBI/_UZU(~^ğ|H./^πb迄a@~Z]ApBPmtlhijFU)kd^} qm"L wo+j91˰ǃ2[< p{U[-w/}mUM<4Jӧ?kf Z@)`:XX~.q Qp,3{ښ tJq# |BR  \X, `@#} n~^^A bRC]\~ x0ODՕ _/2󿴜+xf0 osJa* R0<2TeR~#'/0[vo 2Ï  $O dv ?M5N+U< @lRzGov TXey ;}}>+ kq=7yzC}mXBܗ6y;*lE@p@xFC= 5Տw"ᘍsӧDh?UXNA:_4ĿMj $%tnm;nhTnz`XS(Okp(;'Td= N?8`D)snۤts!]bj`ΦksOGzۮyn1,>8Mӫ2C-7p!:543 ؝AOM{МfC{"`pB[;ߢSB}ʸxܲ ?(Ɇp2Ɏ:%niuMp#x:uMHxy ϏBno {63lno8l2GNr8 ma Gz&M&s.OW7OD"E%2,'%~ƫ:':,O x҂Aԝ!rzi:@͋RoO p@,kJ0R3s~3rl4B֌d˵1ȡuL\ηưÌI:FtNؚ8ŭͳԄzF `Xhv\tμ"R;?[wu`%gdgewu}lAsSso:y3cy}LjC i~ *qy_r[ܮD}>=5,5 m@hxpC1JROnq3OQpd-axfxu05mRp0ʼCc xd2"_p7wAV#ԄK?G\O;6ZXm&{QE ca+ʕDVT=Ga M[4'pXł4ac*s W<%ɗ"WE(a&p?5{n4I!9 VpZ\H>mL 0,!K?@ )@pDKL.%$σ^< 3k/Sv<T<{@K<# @> Y|ā)ZP,]6@`Ύˇ/jasM4?ldA| V$.0b55b*s+]cb4<վiyС񐊯Rt)O j{4Z\%|u9w h+g]|*f=ua 2.p`! y^z[^Bv_쓰NW3 &n> qYf#h3DO4/T>ygCS?P=0ЂlG><28^(w~!ZD!Hv;5: `cDr/x`-m5dbސQjlzy ^9e,B>vZD#P x.Cy}u4; |l`w?1'NI+Oxf$ʷ\qai1yЩ&gpGSjrLyΐ2y5PuqRX/ki@կa5t H'g>p=X=,ʳBz eߨVr|@yv!gV7u3Vud>%s÷m[U΢+'S(|} 8B-4N#,xpc~fCL8 PQXfp>p?Q%C4qL!;=ʽU_4| a)μ,@ ܺe]<2YBho#o/}L; \+飩pO`yxl0 ^`?Q0u@3ǰDGǴDׅ0!  "jijcsl/jb*pFki}?k< T Ra;M0 i8ZK٤#n-3g 6^qӇnx >5_yO:/ ͗{KLQ+D03Cx0 NlF5Psb.1ލ!ˆe:)p'n e1+H,2x@Mx-<򶕣!$:݇ ʹK# ;3Tt;!,o>7<3 ϧN% -P54#B!VG%B*-x!f_OUF8#*Ā PiQ K`i@̴l`@s@BgTIE7@0 6B7 !{i)V%DJ aH g 7V AHB1 i"Ez 艼ӓ ok<3xz6h #x:T Dq@ޣ܀cu^<ےgiAs pmP1Ab@ ' F.<#o|]eXii)}Bΐ TF0>J8DxMB^xIB#>$ *`: ay}UG'*ۗvݷQtCw}dJ!@a>(!|]KArN|5AyX]A)ӎ|N+ ixQ1XϤ5VoǑ e$*Sw ݷ41aCea0Vǽ"HyA/~ M'~b#M._;7QfQ汗LaF'~8È)Fp3vu 0 (6␇N6+dk>Q (Sp|]my>m7'#)N8RÍߺ';}s=Sma FC_ei㏈VqLݧtpw tVr2uY[۶{}o7H)̞dxf,ƌOMQ1aC+{n23=iMFF(+-8_ʎҞ&=A4gU_|h!v= M<8B] S>><#?z 3¿U*ejЄ(UJLm1 )PC"q.IO/ϓJ/t< eʵE33 ?_0xo_wH D>fcyO+<|HcEnO),T4m\R-KO#UdSXh?V#@-\cD}hx}9;S52˜{8c{'SGMIq/KI?N?)`tBJ'IPb9Z5lLᛄ?+Ad~_xT8M7մ:L2YNCk}CD'ZXUgDHJu&sdek :'vqH4NYZ; E9 c(S>S' w+޲õǟSwӋa:xg3xdvCB#h![4N?||2Tx2[ -̸e/J# Nx;˔OUJ1n/[o oێ5& Eᝧ:w8|)2-22ߪڧJ\\@1o1.T ǹ^#7F*¨>KWA\%|RQxiQp@uj`d|wFT?BJs3D N U+o*<"Epd*&iaGi5OqjI"! A Z^`GoՉC+.W13&0Sӄ`<=<?'1ʋsYdȧg0dP'aT]h1`۠_ =cfH8B;O)9iEIrW%7=MmoOyy7IyOrAL2 `x%*.j`s?!itJ`;KJ}I EhT%HDCVٯ*~5Rf_`FWv0' _>Q'˳ QVþ*X;zK}9+R3N]J<] gPos;1O x2 djXF}Q?K.cmnod w (V4">Lk.219mW7v#޶n3iɦ7ev6ix W.:Lpxy5SܦgPt<\zyKR98rxai .:H'QzNV 9 PAbOؘ>1d&GJgޮh^#է̾xVO G./ƒ<ʸD%O((;6ȱ.A &q>;24a=PtD-?DaR%]'[mA*Ov5:#jx2H5`BM ]zL2 A)4o$^0-K2ZFSgepΉGR_AMB_2Z_IC'?g^oVq=7g`mqyq͕6x>q.g 7̓:Ma;ސ4[gMi;=?t^g{ XꪴS*l=O(zY^ދ |/8l` hI !+E:Jff_>N<U0p?3"΀P'{P8_;ψY 0O b@;݀b1"5L@*[;ޞ~i 7yǫ>tG83$Gpf3N}r#|$ +hdF ^ Bx ?."|E$}'*/|ȺՆ0r}N_V&w@,`jJ~_* @ mrgBr\Q Kj"b 8%4a ˜@yS`8B 0/~v~Q_G5$8'bW j󞇭i)i\4Pف G WA 2iaL-"?(|=V%@ h ʕ@;wPM R`KB0{(SbL v ' d9oǹ<uBeeġ(Ёr!KB ˺jˀYC?| ?::@}F3AVR7pz8,ZxFEwDr 1Nι7_^ e !gӄZP`Ǫ#+S2˝9$F*ory)3 H $0oWpdNFwK2¹:suD<%Jޒu[:xO[C] #Β5趩sXd8tۏ s(y&(>#\X ># W4&7-gJYP 0@csJ 0@r9UT`<0XA)Ѐ?#1Kd Wt9?0%Oǟ"PD+l` `}??o$^]0`<.(V8/>oφ}Z 0yx@V]Dq-\VET Q;0!49`<P < PPWұ">R|,,~. % J1{T 0eKp`Fİa~  \W0>@)/@ (b%S{4 0 sxz> c((ב`|WZO0 'Y` 0 'C)?GAU, t Vŏ/ Gɀ| AyH`9ϠP'<'@0JV%h@UFAԇ>< Ոߌas/$` @4a#P >Tȓ;40` d00s@pN%Ѕa NkP` hC?sފ]@NjŜ`_K?l8$`  0?"Tԋ+ za=B9_ǂMF 0 r9U /@@^,A<_P~hE0a}9YR`zr9U4`<0'A: 'B@?zZ%:gJ|Lr ,׭,K !O|3x0*A!P X@145jaEdjI BWm ([2nf^`+xH0ib`8A )+X3=`W0  @;ġ,~$6yr 6< yx0K&`0P$UER."@İ UI`Ծ`;Ě G@DYn h0W |h)}(\`  A+(0!"?@!h08IFg< 1A0$A.ePBvqw<@0Q\$_/ݔH0` .RT-PycU|x0J9U2'gogLx/偀%%TKj,wr. lu@+ @A= Aug0 (0cv/4;ɿX(:y<&Ճ}W)Տ`~JF%{6p]`9)Ή@!gШ3I!`A*>8󜁀l!> P0 [>> 8?hGPl3 EJN3 ð1,p?#X`0 İ`*c:s"H0` @ 0A`B(}3T`8 A-\ހxBI>u[erHRO@h`',c`B%+0мvF# Al^_>t%94!I. @@`<:t4}t0p-R=6|0`<|  Cm|@+A0  h DԅpT__Ko3't` #SA=, 0"@@JT+w%*!aO ^JKT]j<8R\Wh0H.: BuBWQ{`yAPX XMXF"-!`䁔0*>WP `0|?l{`3pD|R`:UK#7";F$|~t]A ]80_~7*cj <-%`鄠`!*x!G?n qC)\ %ث*u00$jx0?#(ϻX/@<@"ZK8\TIT?^}X`0@vUBYtf %*0D6N p0t}A P ?ؕGJ}P.g0`@v? fWu_ `0ARd? @x0x!uå8`9 `A]!+P=Gv,!#ʀ0!v:/P@=0c@7 x0 xtEa~AT 0!XB/yl!$$ǥʚx}P0T Ҫnh1@oyPds9ۼ`~GVk}O3!@wGm0XX(<2 )U T9WX$*K|^JJ U) 6xw^~\^ F*e{./`x\Qt%Ԁp0|`:A8 Oqv6ԔtI/6xJk*q(H|\B]\ X0?Dh:Bc)1:$Svf-(=WUTwܘǜ?P6򠄬})HTVl`;Dp0>ߩLc@>UQ!򪗊`u{y!$x{~>@`<8$h(&2x jC_@q/8IVK^>C a|?T_ @<QCW3T c-P = ?9`|;σ0 A`<%EcK`UUw`8_`x.4@ oyJa~-9B?A`C`! Qcm{qLxA 2t@bAc #I/[@A~$#p` P \6NUQ x >%CW"!(*5T  C t0 %xU  Ђ %*SDS"Qp0`ĤH~Q>d%W% N*`;A| 08(HDsAN~D,D?0J;{U`7D`<`0_a Yp  0_% Hɺ@240ފ1Z !$`9K Sta頂 0@\(WTs x;t>( ~O|T>@yP`<:t;,`;8~0簀 `X:0`(]so yAʃ>*$˰3Ӏ >H 80> Mhp@IHKTojup@,`<`C,=q ,0߀ x=~z\! {0xH5 յ~` %ffa'i= 0=@]HPUX5) +@t j_^rHJt0x4GO<ػ\@ "TLpi￘d`: :| `n`C :|;0K0 n.>ԽR<:`}|W{|T7ۊ|iʀ@(~ |"p@ `>Xj p0XEX@*nA..Eq޾x\|W;|J 0A@.__ P_;39#AP0#<%F;cEʨGD!D ip0$*B l]?(0jA<FH@Jb]0@^ %_/+I|!00  ЋjǞ 0@5` GTUتK wsꄩdp`<$ ǕA%xA%TyTszyĹS!@ l)UMh8ʀh D>_@恀= Neqv.6hTx #)1| 1spA,A& `D?: D@ ,DUV@ O$[-3`< C@NUHL%ò5 0'Q%[Uu @#`BuI`,(`< @/E͟ `B%*S"p0  ,y/Q8& *`~R<(&`< R^$+./P%H\zJ.`yH/| p@ߤt ~0@a!0}T]W1B01P0V?Uc p0ʕ| J 8&E~,A*}>?U'ӏtϣ[= w`f>yX \#F{X AJJʲ:T0<QC̑O(<&U**@ pySOBT @@| 0BV5p1  H0! $-TtX\0! ܣ' P_@%?A @Ra 0${X/R'0`~@s$~R[kႀvz s/ h X0 ~|}Q>:a%U`lyd` }SuW cJ4oTǕK`+O?x@:$8%"%+(y0PB??2,:7 x0y JپWӇ |y.^hzv|~ 8aс̦b/hpV,!Q"T OAA4oЃ"ʢBj@ %R?׹,;$1'Vx*Sc%|*A!Hph`!+RAɂuc>=x} $kI/AJ%,l0`{ QpU{^|R@y 7GX"J7qN0_đ(Ϊt~@> h@IbF* t$#f$A  &K ^(SSS+; #=UORlrD[(`ǰ`8A `<đ,! ! Wğih2pPqIKE^Cw !1(/`ܧġ'($X0At=,c4}0]L `0y|P3j@ y7HA:X0 > (W?*Rѧed$ Uԃ z yT$( ( _ A| HK؆ʂ@_*UrhJ<;Ԣ=ġ򈪜7 ń *0ND*ya48?@y _~>?.nAq0`>T|3/8R%}P9`C~/U|M¼?W C5g\lIS ߊ `$6dR>\?ݟp3/J˾%@U210@p4ZY@˂0?+$~,D$JxB $O8 y΁B9+:` TPj[]:  0a~ ~\g 0 . ZJϗXnX)yPLw`B-E?QwXK.W@W`A0_ˋCWz3ox`A! Ƞ2z+fJygp`#p8TA|@āy ` ~J4_7^^>ϙ8_A!U]p$:00^ɸa~yP9`z+.*a>Q`C+Ty(JeZN``DZgH#{xgZ0`AAFJ'mH  03kABe<]M|@71x N%H9y^h0v qX0H::ziQGdeT/u`0 v0* !Pa Bc ARń` w1qWW`E/TY Q`0Zzd`W#` :Ag ^:xvBK@`&IfO=h!A0^CO@ H0@x| +/]wh.. KxY}   P0!AP_ |H=e͒$ K3X0@}0`Bq.~Q ߄sP`;TG33*S @^  4y=5JuV `2cD` Ksx=dݧl0@h0_CƏ `K^.yGӁAH@a(Jp)?/l x*/U< \\ 0pA^ `E?'~@4,F<  ^*J ChwrTW  ޞ0X{w<P` + ~%q,$A{`AJ0(*ąq;`}7+f^/.P^\8巏*$ 5_e@N% =u0ʁ/@@x|?qWU .x fpJđg؈~ [}OR<%oQr'K|%}_,` w~3VA+ 9+pAa<1!!da?7< *eB2pkKzGF I0>= 0 pĀ@|?|&9;{@x?ƚ$yAWXWE   H*X{eocBP2}y_ ʘWO ܨ )O_9 I xD`:<Jj|"*C<*z0"_+U>+<`>[ D :"B e:`m1 +f%0RL1T`<}PA@TS+X9<[ '>`8%{|h +N$@oO?^eRp0`p0XT=N<8%eX,+/ ax!^>xIAy0@)B0 T>W`?p1 K v%TY$\0`<-CD@*" Grj0k +<%.i+  t*ʾ 8@U`x O%AU ?@0TO!%\:y^>@Ej? 7O, }T?jzVuI` H A/4!dH)Kx(цO~u86( ~}H8_@0?Hĕ[:bZ}~~ [@<a|'~7 z#8Gx0$$|!D]R#E1ot `U!.K@3 DW-$#Pt$pdA|` +J~#%N#@$8JaT9_b BGJ<T 0"*:4\!C  %P8f.]u{2`;b00JU=})Q$0AJf<`xf``P`:D  TV%tGh ' | gP( ``gP0 1 (@```@p0 I8.ygj%6  D-x( @,~N#*?UDxEbQqy| Y=/$`G ڲ G(G$~OU[WWM`!.ѣ`;+X)pG{!# X _M@yX4~%PKRP傒pAP}*pGrhC x x#WpUX(T( . aDh1dA3U?!n0< =5%+;F徢5  0UP0%T~J 80  F ؐqS`C`ZUH~ 0r) ^~ 0ʇ`Vڇ8]}`_vHJ>?mę}`xK|=`B0""Sz63=0L\ h"&J ]b:U(q5*?J3$Tpyx0B^0>D_t[Uc0@p. P3! G|X0# eϠ@qz(Ґ`<~<! PQL3D>.8H=?_tP/H#+ > YK1 `@Ӏ``g `O ? $3 `@O 073 -P9 ap(r`+EGA'IAHL D``@EaJV 1x0Q+H_ p`B`S( 2`8I(*Z߁Bj\_z+/j"Qq@zNy0m.^#2T=zU|!p0^j˄.+ht Ch2 >LB8^ `0*| qx!Y2oC`}$|WM/q%_0f0pV `1`N 0A n̦p< 0~p #ΎxK9 Ij@> 0c:&;xCJ<TJ 0 (8d @ B?p>$ >lsˑvdA` 4l$ z5`6A@!Є 0 CT]K*W@` A(V$ < .`<| 0Z>>a Zj".U#߲g8L .Q3\D^$`c+>I0,A?(8_$ @)O^S?C(/,d8#0t8x@`^8 ZI{X0lAaJ0l}%W-ՏK~0$hE\]ނBzUx@ :qsJ*MV$#mrB\!P _ ߄0sunPwԙ:aC,PQ(ﰔ/ v|Is`<(A/ yĂ <_t*lv;| !PyS^y$ȉ`|6@ ``/n  }1 頂A nz}Ϙm`<1X^ T' ejdC1򶕆K>`0r*~d8@| J?QpCڇ $j X0@%prCT_(Chog ,0`8`:;0!X>*zR EoA!`;/0w 0p4 )Fσ%)T qp@.~|^/P0=w> =pIfė.PJP΃x~6)0oLDxK?joCD Ը2E@& PMxA/Ϩj `QS !քk  @ÃpCz}\I8 pCWK8arڐMUSTHyHfTQ|Ɇ, |I/0?PjR@ | 4J %<*``./(q 4QzIP+QΜQ UAM|@(,h3~]5ExbhA+ H0@T|`%3B1` pb@+@ p` * C+O 80Pgyj~3JST*tC0 @*%{"`8@ CT` E@}Q2 B3d_ŀ= 8>U-U2U/6$6,%x0>@g z$HV&\Ѐ=/P~ '/At` bXJ:A0`8A `<8J Ġ)Ze~ 0JkGT _zԞZ< PIZUGP`nؠ `70?"\=lL* 8B.Ax`}*UQ*2KӀ tx$" 4` VIx0! >tP0B 0JA)`z[pƏ} .)LS2`` /UDp`~``@00AY}x0 íĠAV(pv, hAT%Gʰ{wL*Ǡf7Ġ`z D8`͡P0| CfD΅/TGܘ$; 0W@Z0~a|p h0_@P3B``<< X AX{X(1 BEPՎG65J x@* @ۣj#<@j\F\`|!jBT\%__䎃$zJN=V~Wc4j@xP{G~vq#Wz`a`}b@]fr x |ubOĘț, HA/"T +`9A~?V A_P !x ++ *PѪF ` on{ A-R!{V=kj%tuR@ A 1}|H%K˿>_zP U|>JJ%\= 9 cJ6b =<0Q}x%:RD~_cjC(0 0@?_ X@TT^!U 0" !^P`D1ô_xoyĐA_0@y ص 1$KA ؾL`XSs&ڼ ⁀,T#Uc"ڤh$ +.jM^W`AW}쟺*?z7—x7 D je@)` 9XIRzP`9K Vv=d!0!#`=9IF@ ?GU94ep ^)<ĭ \D)L~5 ZB=KR GbBHk 0 `<"}#x0wD\>$FR;!"Aip ϣ._xt* 1X0 >(T0@Gi. `B0>y.$*]s0w樼KJĂ!'50t-X \ Y uuW\ pC7SU@}Xb+ 0| 0J G=. 0I/ U</bQUF30 5 ˨  y8 TթH!@#+..;%`;0J0^ j@J@@:`F}@ /Ж?Ag eX$+A p`Z r*0`WZ T~Iެ~ ?T% *?<> _mLHC`G C>R QB~.` `1_P8APJ`CP 8(xT(0KXA4)> !.x}T 03R](1_( ]8oH(U~e4?,|>9C(0` 6GA9| _0 `0`w Au^\F0@ F `|}J+Q|U*`8ވ8N[þ A 0`<+H Z Al Ġ`,NIA# 6 ` *I+*1J7Q$KGVq_Zx <| J&:L(/h$+T rUp`6Rp_&/xA,P `^Տrp0`h +Ͷ*VnmQ5x?71z5<0 ǞTs.f羪}ug!dBX0X uiPAA(|W`;AV|Fhѵ_JnTuRX$0RbX0;`G̲FAGǨ P{`9.?>E%#WEt y  ~ 8ڨz=/@S!;<0@0@PЅӂzBr op_<0qp@.eCBQzqxڊ=o-`B@0@V_ z>xt.Z=룔pw\?ˁ.Q{>4 h$( EJOPPV ,jZ4<T`U0?y ˇ?yflP#` 8J" U?Popv=kM7Dρ{ޞ>/|KT pK}`Yy0uЂ_+8 U%`0Aʀ0 0U+ 0u(C {KQKivD<  x ;l0 ]!_F/%/DV>|#x4ɵ`8~neQWJ{/3`>/.UrRh`:GyP@3 1h y ̾^TyFC;$bT0_;P%e0*A00O5OP`UH8#46nm.ˇ `:;~N͗A<`U.q, X Iw<Āx0 " n 9@KXɹ%\VT)HP G_ J` {@4H=L`'L#]N7x"P0 [7}d 0 ĺx 'tO\?a`9IEꋀ8=EM  a 0 {R*6C.od0?Qz<n^7Ot!*Ltt汼xA:曆A gP+0h0  P 8G]AeR2)Ą8>0]` ##hhgu x(ʵP>?`Á%$^\U+yD 4,`} ?@ĩJX<&`:ApJV h!}W$+Hw%p0gx0\>`}}UH4nњ0@v wJD]Oi5,*G|> 80e 0!zI.Q 1e X0@  l_ǝslx`9A@ @> Ix0" +qUY?Īv/St+H!`< ށcv|h0` ` BXXJa 10obILq(:^?T>K݂`BӧABWx, `Ax$xz${+`0;u"`U+*t<* z =a>D/#t`x !,@(0#v+@o@iT$ Z%Df<=0J*@-#`0w"/il@ `0 *Ճ 1 0|$ʼ]5౥;'5pcl`;4~\G+^~>V Ax:2SaHljU)K.rX @*Տ ,Տ-It"Qx0?% A5O"G:h qcPO   %+ɲ%`gG6EU^ 45eTl0x\>˶P`9.}U`j 1x=x0~gU  (@蓥Z8@MHrI.8A`<`Ġ`1]V=cXOAVI;֎\ p< !B0@ 4?0K8>G(00H6d}\Be@̸z%| 'a2D×LĀ*?%O*p_( o?𗊢0 p0v e \ 灃+ Vbph*Y!PIHIV%b@B4EP`T? $g0~! 9t*'` bTc~c\Q6!ҲIp<@`BGJƼi8~ p0=a>8 00PQ H2UF @A/۾aCG;, ,vtJ(@BpK^#.~$00P0>x "_!Spf (,56h0# `˼\T ~^& cJ d@y0@A@xO%u@`/W}@@ 0` ~_B>].`C6QZ, .o`@y> (%P+T`fA`%.<' jKU4 *%/yD>Яjx:A, ˺ _@/W^Ox,NbCpDN`yh0 aoxbԸ0bȕh~ r\A` x`8Gp`^\.Bp@`0z h$KdAؑ0`D`<]z?xO*ḒWOs#0`+U``KAE\ 0 ,T!T `p0>دEZ~ xM0!F<<9 ` 0CQ%P("/!d@{0 8jĢ 0"=tP0` =4T^%Q U[F ⿪(.Qe⍄ et$ 0]5v<[zhWd0* 0 xqwCVt0 w h0?!'PL`>= `9(< 0x> 1W؄: e[dQ4#txYyp0jaCv_%RP  _tՉjꨏ @ Yp bX0txLv~K۫,ݜD0l/*1:J1{`xP X5 KXT%-@Ѭ-D `ĻKD/2Ox[) U}'$pBa+#G@`A +PC4M٫ 0PEclhάO@C @|r'bP0Iw0>Ġ@ ^;6x`~ 0a!,D^ʲl$6h$<`:Uas~^0` BC~%薫~ XC O\."*0|P~B}K m ۲'qpA0`A/ 0 P]5 h\` Us(uat ˁ$@!x0BH!ޫā`A ($ @  ra? @R]?W[TE0`0|$ Aށ_U@ \%)A'Wſ+Qh(Vd$`7~ | ⳇw+|! x!j~λڄD@(. `A04$ x0v%@bPyAh A`BpK!)+/T#yT`˨`I`wD$$A**Kr| `=`HGbXUkAX0!^\3e`2#,`BPUU_``:`| h0j=R#ӿ(`CUIT!d >$Q> Qup= ?A/$-Q(0!p  4p`8*@*+}=?`+2lX0!fA `2AB\IKN%W_`8~\\-PB @`| U7E $l  } Pp\| x0`^]h0U)P`}2*Ah`' pC'9L0`\%x+n 8`gAT44 $0 h P EVԀ)V$yPPAy.ve1Tehl p* iPh/5Z wo $ JЀ `0Iqt`Axx$|^X0@y`!`ˋ"!%c vh(I$*BZ=U$#V ,!l`{ `ǣy1]C8/AT).L<|Ff>x*aor?HH.P:N.x!(/E@ 2Xx2Ot>1Kn[ }oOG C㱮\tq+rH~G2 !r<2 !Q 1ߨ) ::>Y}߃UE@t);j`)}ZՁ")$Z3ee9Z8wg PPN 0!"P)%pRÅ%ex >z2*N $X82S [Άfޮk#޶tM']8ot 07 WUbEh>ͤ_@9\@" `Ar`;@;H/~\ ~뇊HQxBG8)V*XG KH(`zۣ蠸Ѧ0' JX0_c2pbI شFzʖe!y@tEih8 yaJ? ˕e࠿ӊUQ=6n> ep>}IsXf|{uO龅.IBS=GҾj05LE&fU 0/P ǓgN==>'dd'O/Q#"#Wh]Wu=E ̫:XEy?G@ :|vG7/꼮P`&R!ei12l U)=$3No3 2ei70P h(Jf^$>0}jKp d2?PP~P1^,[@d`>ZP+&Vr W^8舑|ېd+IIo0!ͷ;pIS@T.T'ǵ`B}q~%y@a`@a@PԺ1TKV_*6 _>#D|2Nt6O ֔fDG\.e }ۻ{{h*L%Nʁ ?Li_a5xʥ{pHY0"<}~'uj?uVcˇxOgJifv:7RϏ/(Saa O>A}IuU)W`PвG;793{}wyG![()8{Ӹ~K )<^*>pϽJ un&& 0l%`GD%ʤhƐ^p 8s ?(3{B4cT4xn%[*aEɐW>ox{ηi3r(2pdx{G<;VO|4:kizo.{0{"FCw>}]Ywᓗry KV8{Ssȅ==:eO0l=Άa5'Oa羦4{D^OѼzp@w'*ܾ9<'Ld-[?w:4$OqJ\z9?{3o?S ս3}[3o61k{_~p & oj\s2!ÍT!0da<\\%Rso"'©'=G뉑@wӍv=|5GlR][,;LU<N@>nN.(pIV0>P(īxB/ pG7ap$+/(}tD WIC"Oʎi81bxx@_}RQqGʕ ^X:xxs*'Rhy %TG𼼸H%r醛 =s9pYˏKgV=o[sdp$:`@x18  AC\H@y Wa !Fp>$ KHc PR! Juѩ0VV:NptG^/T_2+\tED{Ξ ʡ8^j2xfH(?dtKcb:M;=3L[š^ B.ZRT|l: 0x,G5| %FB 0@a 3Qu ~Wh~ EB{aaIb? b!XI,`7a37G$;A8 I=:d)1 wW" !!_6+{Xfwzd9~`@ ^JAnka cMEJ#w=: $`<–__ zȐL{ͩT_@rݷmz}鉹 erޮ(S* GPGd/e 4\]RyH%2_/3:^tNy@C`xlԃ"q}Ud29w./;7ᄚa>iKŎULEi393)B^!>#/SMyKũȡ~^&wa-(IO ^@w\?;\V'3:-Tpf`d/N]9 CӪ>u.-3,?NjGɭ` VޏT<7mnS%:آ{H <wFa&9fƞp[2"W:qn.rSw4XwsUctOw]4,gϣZxb:H-Vv/Ju`w;#[73$ ɍڭЌ- C4z3>D2Chf>.'p<޶}&2Ws<}t[ȟ O8_5aC&糗N.X2Ggfx" T"Y{ hKH.̠m^ʡ s˨0? D,V / @񭠧}@ STQb6d]X Yu"1F%u|U{腟eL,1{oOt<zx8pH$i%Վx.R0*{+Sd4|5S܏Q?p o=;|KyWoBN?5n z{uR [=[S*O &pQP @,RV-k ~:LHW Eg^6aLUB@ X_p A0 *FAO x~ 8scC;2 iժ."( ]B *2XQz,w/>2NxD5]  qQ 1Q;O*MХTCׇK(/@ ePSfg⹪`}Tzk8"8sx^4+SE88U>$j#lJ_۫:,aaz0@}/=j(*Y8 CCDjGArDq IpK킊?F}gbNsUxjTÊz8_ۦU?x?T}P1aou>d*`2 Ʒ(S* (| 8@'R6F?J޴|]TML0 F|(Q5EcoG[6A}N}W3}su@590sNc$~PR?R#2wư? u }xv@  #~wњ7ƦcwSMHyҢJB 0q2M5=X9 O9z0Oi8=0_ ' x(NxyC]3pk,moo2]7g"k ꗆve/&r.;w[̱ cϵQ^Or/,cU(5p83fEN& =M) pdd40!xyonUOH_Z2#NADk`g +[ dI!HxH$ƩDŽ8R_같|2 ) xxʁk( .l\ ݏx֗)r%8$Z%H^$مʓDf1$!+ ,!58HBpz?L_im_Ifmnc}[{ t<\0$,=p. Gޕ@ p_dO xW`<\}|%C8# S> /x*RwAW%, 0>0cr|>\ēWk\|i$WsNhE #l*9cFj-}Wjҹ7 BHV>tu~,- a! B_د]&BYp.Vw}!+3?@X0\8V g$}GyrI_{{:QA | KR}t1C}9H|7A#}43l~q.hˇ35tYySb81)9v4hhf-ktX_ `4fͽ|&A[2 $/Alydz,y<3&%Uw 8'=83Ӡ*1ӉVEAG{|3kd`)>bI_Z붟Bzx,$$1 NRM/e<@_8:aiٟbH=.+Y`8OFFh\' _Rt" "8)*\ Nh;ޮ7vsmgJF5)Z&z{*:"z1[;z3΁NiwHhzJ}3kIv?a[0b<[䘴$G4hВ|I2$B.:x pJ{ޞӱ_>`.R4/aA) x0`B#+^vQ 6;hգ^@|l/|J3C8jpyJ{|t0ƕ2!`z^:uhikf#u*RN0\ H"b<Ѷ;u!820q8خ+P)e2;-.v$ 9<UAS jxollʠ fmB7 O6wThFпEfX5j T"(m@=Kf?PAsw5$e' c /p2?=]mᗵu0 s|3PC_A|V>#]ezsUJĢ u|a@Pʩ )'*T C/"%+o/GȯRYp@WUvL2b0Oqt2&Q80+;nwtlwI$^FAId$L`B<>|=}{Bkj"  'Hwm>#A Y1f"R$ln}~TxZiXSac`~ח^2򌪳!xL/EjBZcAa`^>XFE J6>4 fz|^pG2\Д]G@ ǪH"e]LKgT{ &ӎNf:Wm2W%3(S_Ǡ26kʋEC&/ pcav^e)6:+oǾG=>PPSl<:%Q L*͟BDfU%)/B?{WS]vnwB};״xb?XU9B3[=FNyHB*(x*/ VHZ 5SB7F^I8ɈCti@/ځH)]s$ Rۤ?$L+3qXKc+]ogs*OaW6B=Us{S;UԄ[hG2>; 3*t)wԖ (& *-9Zb ʟ:'xd =z*BaQ$<ɬнno">Dń߷ꈜ #籼dӓ },$gZ #w #$x|y t8@JpjKfyȷBIIz5s y zr#) |eVhzy@3do#μ>%* T4Cvx <13[%{pXmh{j@&xNAQj(sCqI[5dgAg 4k{{6[ݽ﷐5<;5oPq3}AzzշηS>ƨVU.y1|49X^p> x8`02N lKp) >Q=Aj`逧X883zN i4dd}&pS #iNzӨ!L9~ `^,bG8焫 w{MiUaHRb= %E'peei@Q M~ ~GXZqW(ƂX;9c\J':VN$ȂBX8(: ܽ8~#`9< p| Pu&G˓QF!m!  4ywC(A| $~=.nlİ`~ p `<@.Wg 侣<@z`AJ/ ?1:pȌ s O|izr8I櫗bX;Ŀ@plCo#xH;Ƃ3Q0W˂HNZ `! h^$.&O'OxP0O H,_xfqL"t,8;F%973]ME2D~eo{ެmvH$0"gDG@'θQYϸBAbg .\;4@,!eR+~p?yAF\@ Q-J.W P0+A>U&.2?􃱐-DoEߠt>G".TĀ 0~|Z5@u; p^0q V:03H#k}?6*L2pdwH^> .ӫX?HBp BC(!Z ~#(VW 9P(P%TP0.0?,Uů ŒϪA畫VЇB|&`A+gOHfalV $^fЏM_&]w߷ۥH F)6%$ 8bkф!# a=*R< x(! /^@B b`}pJd$xK\c0`yT /tB0>|tJt, `yoz~sNͶO=#/ D bE:=Ԝ3PKػ0 "3ߜT_&NM_nn޴5R*dR2F4e/,F1m.gBei0e"@ |"΀Jtj#r;y3^(|Hl@qOǐຌ6oThGXa >{eZTj1 L1 ^ۊ% 6#7Sj=.8m7v1GTҚGƤLx4~ Ƅx+`Z`8,.`(*r]FZB0x1 P-pdN5s\Gwǂ ruDK;*Wcˣďa/g+U;o,x'AC&sJsl@pưo1/C:}&bBGBg[1@4^-ы= 4-7?eC D\;P' |&B/aE͜,!'g.ϐG3Ta񞕨1}fʎ2;G+gal0d g-Mi*F 'xwBk,~d0c",?Fψƀgje~ԉVҨ2iSaȞ yf>%)VУ/E<~"N|()|X?X'}Sma=03˩a3/);siS|a2, -Dqu5<Õ2'L~&ʗb豟: yoIx t Z\9ng(jQ۵M v9m36 㛭sԜ ^_~;5g-<,cZuΦujTu yl*S0

*OqX(i@AZr 1~$~UT ex\8̒p ˁ`j)>LLd0 5͑#djxV h# "~֒[2Ƹ* q*x8~<~}j$<-W 2OU)p(Ec ++!Oͽ'FxS| _ V.@ۨ0`rJiEܔ*Gg\"ttZ-.s%vSz]A˄UM T(*)LO=T ~ZP`H/Jթ.ՉGF3tm2w|٭'#_E"<ꜽ › 8 a.`x ^{׈vhX8WiB|2 zafhxf?8й {a/:LxSyZ 80J#! {QIKLL"6:FkGV?5H3! h|O2( 1[#S#fL4GmpKp'3V#Ѣ4\ #cu3KPdm27D#S "ϦmX Qm ,VR4 hA:Q A}ⳉ4N@2|s9ޏ0c td31ր[v8G_pʔ\IQဟG2kG=(J4HiP8?y:W{ƍd<{<" 0\<ۺx2xN\<%g i 2 M-czL ܠ4Cvo8y:hb-]x騔T'/>lLD5{2J? n˜ue./WGY9єAS","/2i1p\#{i8X-'}" uHy<d銘m<30U> 4@Fip4P Aq0( 0 /թʍ3xT1$ !%~"GsF\3 )ϫRU%}3òx2S28xGJǪ9 21DM?8bJ^$E~x+8d1Mnk6'wSQ`qXdtϒą^|whEP04  E6};:o'Faz|[\< `; _0C/ R1,uWSVDDA$.TEB4/(o_ QS/Y8a@+ҷ*W0`(HO~d6g pOڪ[}2[{{ŦžG@A~x!ا /<_(VBB1PR8?@)H0sQB0IK  KJ401~7n(pQ@`aqx|8N21C`ϽXE"V=N8Lkn`*f]_|f\ 8@/T]t%@n4%B.2(p8&S1U˩y,pQOzAew]ti'O g (eRbWPo&>3(Ex~FΧ0lr?BSM'? ~>#x( &/=vQ|* 5;M&اr mλ:i <~R=F}H:=c V xL9?Βr?\ugmudFQǤABכa ŜY*[D ^T^KN!5O /0w0;Z،}lfmf7g\PAMWTx2OUxxj05pc!|좄.(ԩG)m'!#~Cb({i",2t!cs;_6*pbXdhgs2p'2T'!<\S|:'}A`߇i![)'s!vh O!2I?O}3{[@x%vKu>[ pp/,qGfw8+zE3APXnOIXռ\5pct}8>w};jbt˟o{9< ݝo@KO3՗|0/.xtu)3j現*ucs}=g0SZH$,,:^ҍ/P8S/S {{b 0HO|U>4C AWH9p$~K (B'9 Nrirq2~6(8`O &*|2Xb`H=S08>2FaP}4o T1 KR#L@3?dTa/Hv`UhO :5|3Ӈ8(8DiBRa(dPdɜ3<3Ow!}^>)0 >=.O (T${Y]TI7Dp'g 9(`]3ٺp)0X>\Q jw0P KzՕu%tM]~]q cWRB ϩ| Ppj\!=ͽ_\QMG`1O8L$9l7#xDŽ{3zmm\LɗOwAIWdKD`=,p0p[< 8Uyٞ6@KSQ3DjX3r2q;< & s:xA`Ʈi]4lBBP O5\3zoܮ­6à`< _PF BS`|! ~W 8} zi+pA@{V,<#yt*`<sUjJ|7ljU) þR0 p$˸E fA(tD7o;*ދ{ݿ/Lh|W]`.F!U?>J^66;+ 8`NT (jxlj@ `Glebn#xӶ.E[z-[ c ń 0!)i(i@U{ǀ} z 0-t`A<|ؐ^0e@TʔOA'V^.T;ؙhp!0E3j8Hhj%s;7p n[(~a)pPth#9]sEO4z{q'}WؙכSsfmI ;G} t~ pP8iN:7zF緧@ӝ{b΅=C)[n}(%Fv [A'P0H2.Q >|E<u4Cnv"owϪ6ô{(Rx:_Mꐜ>_ag }!/IXd;@uQ4o׫S/UOx{(TrGם{xGiztg;Jt)}ReU~k&ň}Vltrp>\?0or|> '5IF\K ʫp.ȳ5s^QM[ShKB,܋G 's aywCg{fhOO:EI|7k}ȸ *& S]4: NZ8]*gOKt3"*{Lͭ)\9)S[ƕPge1i#DkFu=ᝃ|="{b'B>DpA'_FJm>,uDY,OZ:_hb^a>&d% /C=3OA}{:S[:PŬ:* 3Y {l!(xp-o{?f[u>֯q;/gL!{ذ; q>Ì_wYU/zŊNOQ^NY;ͯW 8db_& 6FSLPJB7g7x GpS(2<PeFbQ_kfJVceGx3Uy0`L/ΓxZ{,-=a.p-#:P!R JWV;W@8!Qp$s JUWcϗV% !HS4࢛0O@s?XYX^pFmDsN Dh*x88-H}>$8p=>@>&jHΉ&pS` K*P՚=ωI#TE_bAp0??/ߋ4*Pv;#%E*ԏ[l)C{tvS4c\jSlw1UUEU~DPCV?IGSaBV3[E YÁ՟f>csEpp<9/W[8 7 O'wLߠ%d r+*j AGSүudesXCU[/5/ȕ&#!PBr@/Gj'gϙ/S"G;|ɑ0b^ ! ڲS?<$q5m{ܞg0dNR` `::0 /~0^CX(`/1`Q$!p(<pA'Ѐ ]. 0"\ `wR(. X(.4B 0eEg:oPOX54d*:pȍ%yg5N-.z{'*$p|%A, "0F `K.=ys8@0z`X0 xBU`~4;ҳ7S@JOجxAh EL.lxjzC`M>Vtj}ͫ[6];n4'Laz(@p0R`>P>֥S7^ h `;x .iG_>j}h'~: /(.T#yAr0H!P*bAbKam8L_v'Y7(aeàpK/ S>f"2$/?;FKcu}wW43y=>ªɇ])sm *∡%<_>=jO4+303[uu}}n L/$#F@ sae8Kƕ?U,룩] ^aA]pC"PT)W= xUC$vp(.Dq*Rk ìz:WMR-s{b:+Ԙdy# 25M\3mǐXSmg@d{EnqF6u80{{uD?k@rLB@$͢`*٤}=QL#gC0 I0ޓl6.I䔔w&̐"I ,&}<ȥI8ѥ#'_yMD1l#$ vs}L~@0czJwu'C'!:abx3U0p} YXў1o o>K{g[8mu3Xj;{X,Q956O,}ηY|.8Ctbu_S}OgS $E`NgˏO=] 0 C~L:\O #9ᓜ'R KXg *IGԀ!r]LS4C\,zK$-ᚸd79=ӂ'OT 4-^5[ xdC*z4NPPddF_hF5P0@XW4!0> "ߎ P|>X< }@%|7Ժz_2 .b xd@>]x )yljLxhNϒ %xP/"LJwp @:*d+3c{93'CMě"r*5 P.p`ᐔ@ pbN?`yx}{`)`_G).Gb-<8AB^)vTZ `<-H.}N j@ce@zjJ A Q0L5ख़2`x  g^! Kꏹo|uHV> p!mplcKRTb_M6&~d@}RPjqtP rsaxG/%8Pq/ӣW[UUM}PA0lV I.>?/@m7wad gL 7R`MӠ*ے9羆=nH0PAحa0uP>% ~%!r-G{puO*esu\ r!+"t 7 Nԇ\ gNK|4LÆLnwݯ6ш0 @XB[(` *bP0 ]95@UZ``$ x|?FDB(S+Tr~< *~X EmzsbP%\=fAnBP Em(w}0m(SYvOqPVS'fg/TH_DmO`ӮKW {}vmd⋑C?U{f輿8AB?d<#W~ӚZW``@`p0.f# }ϫ j ? S`~hƪ* 0"QHᮀINSsaͪѥM k pR?m9(m_wB-?Nxm4Mno93r-:}m^:HOv#9Ir=EO3V}E'#xcuiI S>b1s<1O{'Fsy51'P Z2_sÅ|,0Y>=?3#TFHyȵGw8yO7Gͧ<+ǁx/.09>8X1/WsOՌ1p/gM3njN7Z%i0g3pG2xr$g3M'8=l8F4<f!oo;;] Ƹ{gZ },#ga[\<3ó5?gu}7G3<;OVܶN)8fg&!nr<DZBxd$< Ti9n{Y*=`\?T:Moെc#Pp:B6TSԈ輘e`ښ!8#Z9o稏q[a8u>lnL(2 )\&aι=x'TpR()a{cޢJU %hj @~ `90Q@&ˢe̗jC/.bXz"Z;TX'FâS2uR:dBkJ5Wh0`peuSϑpyuq+S~3 dp@x-ޓ G@A\@AL~ qH,K8!)@x(}ġoWC <\5ogqqpC#SP @ h =]R^jV>a@4M"9T^|P.TN?~ /(G߾Ofb@?eDuK(Z7M_`DfGp῎qgh6µ3Br3n},%{k8+b?WU1 0t,ЅGF/m}- `X5jҫUd{:3?\QP,6X*gJtKQK7B:cjH V=ݠ*dRrS KC7Dn\wZQZ0 0R}n0:˂^]A +7  or`BDbp(H@2ǡЦ j~W4okA$ចh @) t N8) p]x%]ר~F]5fحYz`Hv5?0`Ul02hʯX^$ dUW:и#AMǟStT;VL_qg?S_19z7Mwutyn(S0 GvJM`>~#8@D#^[>cSCJ(I9k4·Ahƚ+{;8}/^O͌^? [)FRtG/}Wu6yKX#9;~χ PyI lI9gn:Wa͟a {l` J>3[ƶ?aN;oJg(,xr>))^-篆J2Ppg%jZq=\g2/og `@3>Y;7{oL'7зR'28#uB z~R#Xz tANOvs@pՍN}O8d1 !)@ x0?**g2JUOX  D'pU}':F_ghhN:$!LҠ6o436~S1Bqcr/Y? eg*f⻜pInj2s;( 3h8jbsa) |>> S9|)V恀<<*"ev^$Aw*9E`K꼵]9@ Y" z7@ZTޒݩ)Vvx_pA8^~}VрdVu`s)trL3/8xf,3k]3:0TNV%(P.#&#"> @4P!p.j#+V7D6M#7%W@@qE$JBJZ  ~P1O~ -O `0#oMF!M 3 9=b #3`5;c%uN r/#߉ g,f1\W@L`iqyx0 5V":i>DG*lz +x`}B@ E,i8_8Ap~XG3X*8ywLߧ]nkpt8q>L9߀:  }h!y_O*Fj>T!o<ϝ` 7-\2p\inpdpa2gL P0"M 5pAT@9GV',ME\zٱ~3J"(3xQ.\X56wM]]u$SŎ%SG1(n !o)y&*mf _0r$2pi(=WnCf'BI7S}lHuN=_i^ Qpe )9J)$9̣uTDO>.SsoC'ELr==XG \00O I>@χ epyVr=W\?iŃ7*4!<1BFx-pT;p'g"wOj\c<83~I' Xu+lyvQ/ϜO>EmoU}1=fR U1z7tǿ~:L1O9|G3Rs:h n+  ದO\O7Ƴbƿ%;gg@pZ}Y Ydb9ˆc!\쭒MlglI#/Q;o/'IεN ?Mbgx~{-T8%"@ng>!B R|AF26}rxoU N"/]0w!'N杧M߫8 (S3p<HD8ڜQL!G=tUdwX0`xF?!u@atا(|۶8*t>P 8 wgSzɳI4321BιW"okr\/ 1_!Z;A|">ufGULV:a$=8Q8tRڜ?|Grbscpe#9kr/71,[pSZx?4W`tka IM8HåǡԹǓB$ =HDs!`Hi}ANlM^lҮQ >9}!7Nr I<S-aitۙYjM8Jɔ//Z}%lOd[;xfF)9VZ@+O#MG=/N|_{Zƈ<}/V=h>pbݣ3'~gtѦwV,ptvxos{g6T @ָ:ڠpV&5^(w\{YN7oǶ,n .R,e\1>T|ISy;. H;l2@(+hyǤP)5q  jNtB1AG*Z*y0 BpEK,dmocz"Pd#h CWl+Ҷpʚ3i"2> 7+ʰ O xGh\hP`;gĂ80%?E p~ (&ެxLl)O**qg/=&#pWEECե)l!@+[гq=up ) {̹.EeThJ 2P} /x 7 g `bJ\ <gJ|9pBAJU Ǘ:VˁC(J.@`<@=P|?uW1 GO V O8pF 8# A$}Ywv]0 p &ǖwL`'hE,>3S ޮ9;p̲pd/} s$fJ4Pg+o{8f. I[`XH `<įtmcuO"R\頀$S0MbxA/T\ ?qqZlߌx}I/@qKmN>ecAn' tG=z<Xo\ŨG=s-g,<+aq;s%0 ]IdqS :S$H `w%1i!ϋ("qL}OX9X)w֧pdcsx-^ ;{uv9un ՆXxxpC<%͟^2GUQw\%  # yTh#ϛ}RU?4y2kz-S=[7rܤgK?0@ ! Sa9 Iх8?sɑ$҈cFȪΙ՝Q(#ֈ eSiBg4(hmN'P"~ iJm^'' )+[ 5r,LoSsܷp/r\ɭ[4dhZ#rMQx|Rwͦ$Tf`<(2Oq~5O*# \۫f>Hz]bk=#9Hu`$Eph!nr.tνtלT.F>^?r/(n%Mx௵CJ@qZ}nCО{{c!ga$ O_4[BBS,?Zy4ȟxj"~ <Ї"o VQ(`aJBW} aq ,cɩ.y}CVb^|&'Y%{їBzz/tr/ ʓ Qw aMx\l)OL-dN{\' Mwˁ*zX'؈7  /܏W+.]S ->3w%rxc.) ߗYNY&?ok4X3'ke39 GCpkk{yf5Y 9D013VZyܨz!2xIS֎<&[s_'P82_dyl%h@Ux8/N `D/ܟHhfV9 x0 h g+n`cf}ψ$/մ8"QX7ddBW9ᓕ<5kMopWɴ{ aHL˂x(F+E4ǀ}TR\  <Ux0a 0B0$J?3~[\ZUÂQ, 25™BG!YF'.UoO$J!p[9Zݡouw9fK o>h\8 x"+??jpa1`2ҥgiPfvQ!3JgbQq_),9p*v#r %t}[-̤+LBb7T@0JJ@H`\ }Hd?FOQ Jhcf[C-nE7q)ᨏp9C(Srz|">Ï`Ȓ$/ wt3h z`<U8| 憐 WuB\;ӳvl\MD,BV|f3>#tB>Ty~O Xc`hi7m;E 1fay:eJ*^4W1[p 8V- +vB|/bNN0B& L4i#.&ע2#T&u8*m(g6EQ y+fU/ #ND 2g͜3vn%r=Qnpdjx0$ODt2'?<3g~*>\D௚#GXt6ד 3MC[`:8; f6x9ߵɆMњ0=B ɽpFe:XFs.BE0SƑ6 !zx8҆*[u0}qYW8%}:* x %Cà>rR9*~;z}s?X9.L3OdSO S_!zqY۰8tGdj%}qu.#OrUp2x2IȤOlPhO_ܟ H:}|>p8)Pd|<.b*ty]4p;SF`8C :E1,ޓ3WǓ>a2%Y4u 1g_m&YZl2Ȑ/νʼnEB`=]k E*n@XgTk(r,D,a{0qcFsׄV~>qaS/04.`0ƔYx3o kʻ!l͟ȆG;:m: HQﻏu@UìzrN#S\2ryxf|yN<2M^u'{i<*dK씓C4gս5VFgOX!Ű G8 bh™|u @}RWUP]/5o *g(|}wa¼3"?5HKHE;G/zV<.IT,MLhQ 00GXS@7:|!9?.7!`Ci0 ι {ޅW{ĘYx{ YO:^];0_0 .B@`;? @ξxsc?v'0_BQƉ%G 3Ob?E ?i00 zʨGi)\XX+ nmjϫ3OrikuhR$'B'M5 '}lW2XaEH9'4JaAL@R(/@v> *T<鋅` @yCQO߯+$J/R\ e'K+3ˋb_P oL,z` p!Y8 pDypqidr M+YᓕsߵD^[Gxk c2bQPUFĐ`<t`<`HPF0FM~qP}pi)8=?*ޕ%FUm\va-7}lսR`JP"0 Sm0E3{3X1pXyHڬFI 6׼3 :׷mԍ.ƆPI>WrGr!iz;۫(SfE# L ɂt:ڊ %V3 ~/*bH+2)j,B@(/j[}vw8@S;; g ţ"1ceK*#IpRG}a!sѾs(;nDxSANcm{E.S's@,Q^զ6Hzljh ioB0`\uD+E _\N XB*Ld@}jw&35E=6wH/ܔlf*G,Tx|M$J'yzŽYW׭s8h7$B[c79'j@` N>(Ig@"x!,N62gB| W"s=>uV(/t-m ?ǧQ4:lbNy8f肔ӢHO@x nO3 M.>:'y L"Mj*=qL9FI:03k4~y~sLO/Kmᘉ= =XDj&Ȝk>ssgx8Hӊk_MI`Peªd F!o&FLZs#zXMKK Ь)~p/l ?tz~:L[{ xKYRу dG"0(Jl=R=;c:4BAЦvt~  HAT,DP8FN=/:% 1H,?c08+tge(Tx(q5 8_ml+ڕw3G)ǃ'IRO /\nJ1nx9sLGVx=Ub߯W T*\}apUsUΈЬvn/) PW%PQ WxeUK A@6߃Is)y W'gA'NC ZҶSxD%G< A4:*āߘz :B!w,E;y~/6(_?D`BfՉ}-PX1`p 3*Wd2BJJFp(r,xeS!T#)\29&ox `ȞF A8aX!h r<%yX8\FaL- J((&JɄC.T} 8AT >NO~_˫Up*ut8s܍)>]';M- yG$Zpf$`8a C/O / ~X8]'9B<! 8>T< uh,3޺;{sNc*(H3 7pW1ǔN;n=]*WI(S2QPqCB*3:=Sjbvu}ٺ7awm398!p@I0Ǫ<_HA~^M?Gu @\P]Q% ;nӻf ѦqۤlwuD<|2Q_lDžEv^#65$PgN 7 Ev)dExw84 qmHl@8qu(}dU$m9 X6}FWU@^7 <2R\\Ks@PqȘm} TF嵄{$Q1W2|RLjU+RvCoU'ԉ7`RaI>/<2W*o1cIᓜq?Pvd X'C2^L&7Rr4V~u. +x|f D|$!,qaV&:#3JfaF%'SxuV*Ga_WQ*VV3ryy>G"$ŸpZa D4NAg!>P/oyhXMxޒ(96|f#ʜl1jt? Zbe)" &U>]b6ܦ`Iߞ*3t>ʅX|Q|&hLHdMӰ-EeUA"{m9z-k 4C}'`]NԺN_j.f^B5u3kuNC|&hF΅U6/W=z2 U={;5Crڈ2sKsV4NJO)%8,νMOu S- /m>^rxfHn֠ʗ;^/O.;OP#δ넢?hPЉ8yp S|r:⊢ rmoD Q%+RG0uwM JcE˓+V  xF$*p|]{93`<Rb:D\Vw4ʉ*! j@: 1(ZKO={/)2sZ=!FwBfi+<a/b*]L۫0WkܮUc(`T^= GNЃ?[}-f*7N`5CTˡjjT}72+B{1]v7 W:r'1Q s8Jߠ!Hm}=:O[(o:y|x"a$GPEqU mۻ1Nf A``]7=x0` <4{)2E p㣨 78gCp JBPfmS&IZ fzzDSD *c*jxfHV&%LY"ϒ5\3QZcJFf񚚴ggay-JB#R,~R|#<>z2P )'Ypq0S /ß"هI4!@ J*n(  &c"0fPɏ@F1#z_C1[_Ѡ!XP ,&[UDxe T' 0PZ>Տ y)!{2N Z>=]SJ''GҒV)$ D'DΌá=9*0"C U"z}@DF|$Oy4Jq" wGzhgӵT{``chg$<%sIF(q<`/Oְ6wyP!b7>9Ԥj=a0*ۓaǷiG擅6QVYY&|UG,<*N)c&DZDBȘܞ;oD&"c)?Ģĝp<-*OwlNkbhSnL)4 |P|E ˷4##V<hg/v$ I PcF7!>3EatHB .Q^#Ďx/#8@|,Hya[3Fz:qF APZh^RecApɜ>$ t1:"qO~Hgq)s(62/MR 3յ,/:ۻ=aFZ.1cqb3Q-0<#{x3>!q|qsK>ݹ='Ju<qD#F]p9> ᧡o4/{wI4F&==8Fߕ[۞ E`n+p 'X8o?di.pyʏKNs'O`0%X->H[N }<ǃix]kxhN;"0L02y*3="xSa s^>ω`xx+6|jGeU!Ut*>}9&?>?>#߇4Xd|8d1bl3CpI8)~> >':@񗮧 ?ȃ5w/xx 0%d|KI ~1-=1/BB`,)0!v5)t/JLPWǫ(FAz43 !?nq2s$ۭ O&uIp y? ߰h7*'(&HRn]IJIᓝY KE"lh'xُ"Z{IЦG_Pb>ĠsATa rp{SP0AP GaK B݇UnEezJynEǍt44UzJ5Wϧ<-=3xˌ[@3 B$W`} q `Z_߮`#R!+X3͢ 7Ϝ؇4ßt?NNۊ(<7*aM2%a ˪" ČU_,y S6{oۢtxp{}vr<P"ipMgOw["e zHqo$D@r@UOyR4pDcWeB#8[;ޜB6<38o73t>7[鐆>&VԌ?$OpSbK3 EQrp&i~S]''zZe~o@搙 `~@W H0p  $ t̎@R@%zD&(-`;2x tx3B'1R7q'U\q@W0-NuR㎶,1àk\k?BƍuU0#$hFdFQB?O713tS *v#ϏƅEq7ݷx'g H~3b:`"ˆ}<`~d i0!>j͌6tPdK 9wwIx^z=x`"td^=xt.KL}4 2iɝ2Uhtoonity cSFsF@+81 j>G }nPadO|28#7}Gh{ ~UGf[}}w;n5xzl' 4##O!N2=q@đ,x"nxjprFy$jsN7;t>N/VU0Sr* ÃH$3kĕqAM Rvw9ɆV9a:PPP]EL #<$+   yL&١th3>e A5JSp$PJ v(elA5'BXV~k"CRv n,/![: ja8Xχ9y@Ot+XZuwe x5!u Qp\ D#'8,L= `˜T#v)N2*x2ʆD.gͥaGpbĪPHY <8H0:rT_a;h8 Rwl`#6 I2FD:pdA=إHP8"f4n!`SBI*vSj2vZ=oBKԜ1q1 ^3yFh+2"&+)N^}.Dzºlw F~2tC2Oe[WK <$K -2rk{Rb>!e>b14_Y`"O;OzLqϋJi?avB XX|HQ.U2Y }0l) Fh#=Wd">EG8*)$ixyA$ՖdžI#1C=jn;ܟ z3DD<.S,ۅaOFX'љͤG$lP)S t$?p84p@ %'PTP]YĤu*߈B^:m9 <:{Sь-BpD+g'4'}~'l#0G4MʕƝD'1*)[d#T`Wf3e{ hbJc6{d@!S82&9aC:DL֊کIYv~<\9u;qE4^ : t Y~pc?˯kZG`d4Ł8ߵ #ZW 껤v(8|68}e~GUG}9䞷4UsvONGPd@G 6@j|3gUi'pp>QU82o:y&SC(8_$ =Vy8&%P+w)55M0Tu͎%{PIw|à(.P0V>yxwz Xx+n8!<>R^J"0'\${^}N{}S>*OVe `8 oIAv=0 <@Ǖ~=W7Ƿ_]&p3 \J\x餮}SL~0) X`0P0?Gx'  %vp@Iʨ0`=PB.`0`6#`w7-rwCax*J!nj>\R(p:뱚q!q_t >P&O.^8j#+=@ ,0 oytޅqܧh+ Qӎ(=mH}XYͅNI9v7jZ@*&i(K|oCYv0E8T z~S᛫>i\@Nn#ak=|n>#{ȕU| ,%`pʫ3!.i884}w;sOJO0'o:!W4N_uMa&ջzuFdcy'}D4Ôΐ+sB>1n*3 9;$FIw\ep,/ǝ qěA{V"`0g;uʡ Ś篙rdl2q*j ?qF&rj8n< <,p z(8Pezc)PQ dB#|?x&)lѱGˠ0_|7rHLm rhĪhXFa$㤩0}J8XXJ#}$"o3 <\ȷbLy\\]K- ӳţ%XN+m#O0G-w\ '\ "cJz)T?Ǡ^+O0KE! {_}"(vS IT[]@+F]03 RZTt+,^hG:Hc}[7с/a)".c6yrWApȄx\BW]';s\PBy9wNa}MME<OK$8X3rbYϏ&V IPFMpOx8?C1K9o]^4&AdNgpXp>8x/9< ux8UUUb 0"i*?O*=Ǟkν  p-ioex # >pf`2"=5@>Pd@ F1+:9GoonwI;u_ `P43 =nO R7~{}{wtC(|ql# z#U{ȫ ڲ!EU%T}'4>`9d63{NoWm7sՎ|FqXV ? ""`*=M<~g/ԈjXu޻u[sk{ÄP0`Jh Q,T0W\gMGeXS(d\x*<^bß p(TrT z,45W ƨZlqxf7 u{@D9>Îs:XN_̬TVxj !I<^#Ǐ`, `<W jBz'{0 ` w ?)=(J嘆S\<0'p0 ˆp .>*H"P9s x0jd~ /p(`FA-Z@S| ` Z>%`0|/>է[*X-T X ȕX p` {}Zʪ:6AyX $|HJ4o)X0cVX0P%, Os~+ۺ8On,_`;`}<` uN+!4~ ?J ' CV/ "vw ^% @}\% I Ԍ_U] Fx -,TH y0t$ RNhׂ1g x& pġ,}lJwX0 !Z j֞ک].W/|A.ˣs75K?sяp( zNJTJ另TzU3IajV x h`50hP`<(%DTHCX0B4%`sy+Zu8˗4} %RO/y  8nyp4$ EPD*{= :0`:İ|$A+ɷK 0AB<vЄ @ [ t׻pSBow qF(Nw0 Ağ; 0C/Uzy787PH 8A!$> _P@<ʖ박!*=U.8exC(KV 'TTP9  A^^=J~TNxJ>%w h>$*?T\"0cj]  \% JXq^y@җ`Aը t %@/>R_D 0 MjVxg?8A5rtQL< ApBR4> rV w?zК[S&* (Ӆ=?aB@pL TrHAu$DI`}ě|\ AWyLH@j `w 2-Px|x=b3`: h0 `Au4ITB xJV^C@hds0?V?+Θ4`:8I|@oQu|HUJ`Gvg]WS$ ߃ <#m@0] I@jx C.Ksq `0߄8AR},z0 00~d0c.+~>+7#~R\OZ`8@CZT'`98!KǪ h;0 |t^`<%! >VTc`C$3w/yJ.R(`% y  eЂ_/(%p0@|\`Μ| ?.`jBJ `I1Z:V}p  y?P P ID,Q-DGhD{P~ `T `<` 0 $P(8&X };|%" _ [tP% Qp J~yOEryX<{%+>C`X  Z]Hp!_PhE ;O.7K~_ ,.LxWph0#@RB1Ģ)hLOՃB^?Wr]Ҁ^!?+⧀X<j2a@%JBXC3`U(|U[Iߔz|0ي2 U^TBs؇~їx| "{_` 80Yz@Cd-t xyXj `5&-9X\ xރڃV `*}mN$(AC_ S^ B9~?`< >_ *V` p0`G@=j|_S>C@^ 0>})W$r_A|> OˋĸAT%8|L_@ H!RҀq@6 K xrו8V0 |~\%S;4¸0?PpBV DR`=o@%@[h>:\Ya J_CELxUx''˂PbҘ(״ `80y\0Z AWw@`>a Rc`/T . GILώM (<=0Q}   4!0P+ht]( ?WUCPm `:< A\ML> sa |Q4Piz~/ǿPC% E`)tU  ʿ 8,EP$)փ$rBU^ {_P`7D`< 0^>KW `_ `B_XMDJ.T /* #@}Cp`0`}= (B0x r`CDCoFr AHV  \'~U>Dxx`<>. vx `wayu R@?p q_pq?]0vI{3xP@}  :lG]O-G 'ߺ2`; T)SyZ@ x U_^6YzQ 8``q 4"0zA3 w00@v% pz>k/ף<Ġ_/KT|Kl%-}c~^@xJ/ 806I9F޿h1D~BaINMv xAu.|F/..u>/ÿW.`@wm 0H <>sT@| y DNh/j@L/rp0! HtM"~K41X C0#>_*1큀xI,t\^^ҳ"WՃG}[WI TWytõRƈ @!Jy۞#xhP`{>\ 0D GpDo`;ժ t{&1]x0Qy}u 1%_`Bj`=Ej%+>du" P^ ȑ(E@8?fF}@0w$Gꄯ+}T`AՖT} y\{t\P>2 `:|VlV P`@3%( p`Qg 0yx"@C.\S=~@`*p(K?RD4=`^ p m {@UC%0`}_ةE*`s b`;bB(@0H|<лU+ndv +y_*7̓* p! H *[.sT^8|u1_:=6a ǁi*/ꄰ`~AP|`D r'6 uGΝTL_,/0DpCSAK|:dG }.# L@\V7B BA$0?/>/ǚ>'62Cߌb1``1:Kͳ߁/  hCӅ@ 0`BPÈ@L`BİCUU]+ZP  G(&`<~%+T^ ®) !}R"$@`AZ?y^@ +`;D`R!WK%D   H0T_ ^$°Ga~>(yBAT@@%$wf<=.R^‚@>1P0 $R.-  !A!PTa! `|BX}Da } _Ax0x~0u? z*`@ W~ZXB C]U4,K6 {<@ex!}A#fU+ $ ï?}9p/H~N|u`oΞ` = nR#A2tH/ eR}=w>h?Aˢ D P0IJZp0*08@UPASnhGCGc}LT,|GMPA zTd@ @/G0`|/)2_xtٷb>@.%px(!ڞ۸: 0a~A3+^b, #`@. $J C-K3.?+!!0`<ըɍ N(`:@4?xD.<fNM`0@y[?<s@ @J**wFW⇽؀8`@PH>2Or x ?AI$)ߛ|렡ǵG@-V''ĢH:YEB`Yt|P0pxˋ#yAZ~³ϑeKTgцS@  ?eX!+UUd#0 4ʯ頂%xK% ~C`$HҠ0`wW4vˠU+Qpa/Z`~@Y" 0 }x2J 5`( ?yYaAHxM>X }@DTax*?)PpA@`F~$@`aA|``:c> կ>]SC`CA@ S~%7P%~%`;ıS@?Vu9NPMJ`0 Q}똁lP}  PPN`: ā0^iXBɀ,j0!nA"'[x@;ߢ@*xD p@ہ `hR(T>Hp( %CO/H@A CP?>ϴh.(A!&\ 7WY>.c0 mX!@-W 8Z<QUv@?UzߋE@|`: [0c`~@9Px{0>a>N 0 ʼ_smD0Kxh,\RՃQ/4HE ~~q8>ԟ 0`}_5,I4x->L |IeA !*0lzWdj p0"80.VԴD ңp Cĥ_A~?/@C}1`A00 (`ASz`/ďP=y KA,H `A t|~`#=+QQC <1)W8pB<<^ @T"(!\?t:Ǫw'Xepp}=~\VS&swV^>z;Y;!1,Wz~ x"@l8La>]jFҁwK_(`60!Su=+esi< T`<{GR;H4 moHA1.+Q`O@ _|(%gʢ(dx I x1X8(x([au?0o2S8S@ .UHOl'ƀ #CUKV /h0rL#9 ΁#2:ĉf x,]b^A3ڢd@0!aC~V /ڢX `0V%@`<A,\ع~RQN$|Y6!>J/@8KPA.M.XU$?%2x0}A]e0@v[`;^Tp\0ܠ@./>>\oEM `yOB%gF  Հx0^Sh4J(|? `qW >4 .4JC?2h` U|!VvSu6 x0C+X28+4>W/: 0J%p0JRH0<}*Ptµ%Cڰ JD`A ?Ő퐐 *}}貣GD-p74uF -~QI>68~ ,.:D~x0?4 ~``AT:S(J_M4/`_@ R.)h0^^*RN at`i  @2Tg~`0`$ h_*MO`!"䰹@)a 04~=TÁ/(:| @x0jU^0~_SW2, P? 8?ޓ=`xڰ@~]|8@ל $(;AH p0Ap*U` 3ZG?LWp |   ? ^O ``wI_ /0jA&0#d <| q.` R?'*\ H?^_`<V=F<^%h@VȓQA@|2(V ^w< 0@G>>U<8 JA Uax`;-`yxu ,`;;K(Zy[oԂ0 0/`BUD?& Y8G|P0`%`*1J}@I.d@ G = Y8 (pJt '%*V`ARKzC(\ h0>]_oAU.ς 10f3`fu0 ?W`| q `9uR'1 `:=P\ ]3)@`3@V>% ]R(Jի  JyIP|kP~M JW4 )D@o8@@||  `g@ DgN@7@(0 x\3fA8Gʘzہ*AvJNp!xc?<`r,U(9ax@F:. }*+ &4 0` ?#~ 8Q q !DC Ă 0r X>,w.Ŀ$X|UBAH0` `0@R tA o ~2c@yMQDx:X0y&]h!~ ,'gQq:L/`t V t( @`<<` ~p0t@R=%gq 0>h'*DTWttp0<0 wH}_` EZyATJr `<Ǡ< 0`#`GABĢ  `p }@z8@/Jzg2 0!}R>ĀZDJ#C~=WCY0dCPq?boeAPĘ< @  `)8 8`@ < #p%x (0 hB  p0P c0_jA../WT*UMpp, Dž( X0`q` `4! P JԪV'8U_z= j<:V_ ~ (;8p`@p?'`'AAʁ1ATcjbP @^ 0/~bf^ fr,@CT/A tڨ34 -<cw/ K`>P#f x0`{|K^%`:ӑ-\֣Vx` ĝe[~ r`AwGGBo~ kΈx:R% lPA,e@0?x ӏC0jx ~!`C@E `6D`} r)x0""d>0*bC,p ^ 0B0>3S`5K z  ٓR °x?U}Z͓j /? U&`{yNW>`<ȸ!j՗|@0!x .#DƁ!@3 (0?T h<jCÁllE='9?(xFx X0 XxtDRt"+Tпu{v1v~? 0ʀ0 C"=QzJq? wehbx:x3] AjIw~`9AbGiXñ`@*`7Gr D0!jDr  )Zr@U׶`3B Rތ   B>j| (0 [(0 D`omA `;M5*جw84HLJn0O``<Rg銂0_UGTF.^ W' `x`yy0Ē>L`A/F?BV=̃ Y,h8? yP H%9;^~kdL}r^}ͫ@p0bX!A^r=GxmGѲCP$C }V^a?:X07 Ǡ?`B7hp~@, ypi;Á,R~ `0A)D"x ]@`54I L06 (0قHBđW>\\^|^D ꁀIA:$to2 c`;pu.PX {@0r\1Z\A KA1ra/+d@K0y0T[PKTp0~ԗ(@@QJ4IK%P[DC #2h  z/KT2{..nA\ ! US?% E.^ @ޙ;V3 !R)X8 v`%!w^,Fb>`GʍI. NzZX (>./R_ 6 X@YpCG`AѝHC %:x + ya~$h3~MeAx  @P`c '!ؘ\7@ ` A*@ Pa@{d2 `0p`;HT#|%UuAs~ 0߉"R+O\%z%*{ɀh`wz.' `C?>>/]V03 ! X0_`}i~ P>MLED-P +` B\]_A3Ĉ ZM`6`y `<p0%+b 0x>o˃ \ۗ@"w>\`<*%4=MZ9,`#懧# `7@61$|K {`~OH0"/ xXBP0 N"@"£}%@|v<xC >%?0 KWV}HUX0"!BH0 ?}MPyq(0"@vR h0 搤6ǂ0`oyxJB^ e0  x ^^萨m8$`B ⫊k@.P`;;#z>=XVǩdE)tѐ> P`:=U/A Aut|?u0.42Ḱ,˄\? '֙F EQ}ͣ6`8#.}^ɝbd `0`'<% I6ET5?x2Z ρC`/P0Hy~J=2 0G`Av{K0@>V\$UA6!VAH?؜`t ~'<0`t@ $ T?/yPh4 $t]V:UFR@  b.IP0ꦏ%d P | ˴qn2y>×L(aLDt.< hC`%06Pb?A0 *-j B]:8 aXA(Gʕ\?~  0uQ0pH#CϕZwQ1`{K^؎R\B%AK40y x 4p%Ue  }${U>7*H 0C$nQ "`~KuTSg77P`H~!ؖ 0`;@4 (J '!i @Pg.6jpCY \~]J☠ oį+JH0X$_ʪB'!,|Fqj|0@j2eThT *ʨra0@`}m C:aa VU J(K$$ yA6Tdh.X+G4K+yXj@ X `+~ ߫j.DZzе%F-sX;*J& |`8CV]}e0ĸ$>*R\=j `KT UxN'.3]tWĀ5 -SG`:@"?/7q | 80/|%h0_?JAL@<̻)`0_V5:*ɱ h ;..VUF˕Ib9BU0ElH*TK伸 `O 1*>, 0I/PB`G@fv҃daA=+,;VsNʕo0"cP5|%e   T h(juF< y@Pa>Dvrv:KΣ8cؔ^ K0Qqyx A*L!$t4J./yx0 İ`<0EH0`1s^X@@( qr`h,ހV+;Uфҍl j!(KGg&@p/0@ ɡ `.bJ,DT<@_UH!x%T4`* ?ljM35dp`; CBĖE(b|h0!` *0~eCx"V yw)Ya@`:WP X}*r⩥).M\KĀ PpJR0 (IV_>/QM8 X0w @Ap0!b_o`A`$ !wĢ)^ |?p4ވeoĦ[{6`;AV>.@M. \`~ 0!8.ڮ4 @`%*(1^ AD@V$1 KV\^$h(DC 6}©?3` [GѨr 0"@@/< 0^J\tS~owc6D䒴jLjEJOd6Ԩ| 8+s.PT@0 xX  R3z JR#ߩ`Fḑ0d4< $\^$$%CQw3>!r`|_Q'&d p 0xV,Y]f( !E` Kʔ+]Չ+S ľ@ST8X AxU`DJr-C`G>P0BP4N ^$!";K#AP}I֘y3Bx+o|!!4UOJ}!eЂ p0"XJDK`Չ+`V2t`  j~5 ?%ћ0 !B`<|;??Ϗ'`<TT 2b$Je"8)#90 `</vpv``<0%_~Ӭިd 0S *B/ hKpryjsj  UUeP gbU#i+i|QMT?dT`B2(`^=|K|FVJ'y2&XA8IV\ OK蕾Z2 JK0@Xg,> x GlGtCP@`KV֩d'p  %}; `5jH $\ r00J}`FaVGB%`T% x@/&x,%P` `;D]H``%ʭU$N]abUNsʡvTx0p `<" p;$jh_.p"H0x(zhzET^ (z0>@| 0 Jir"F@ytJ//GI3$ 0ww~y^PZBE*U*th0 G4K f0C謻 l:CG?`G..^P#z\ tςo.^;T?::~o(x$h0(ǴoE_x0r֢NiU* 1 ! R# +ʁ[6d&%:d%2?t`0A'CƣAK@Bpp0B@@PA/Wل/woEJ/!Wa `A  8_vZ?WF0Ђ% jC( a҅t @ O3nRx`~B }! ġ#.X`w0=!* m\z h0 ^ @BGp/wUDmW= [Ӡ|H0 \ A4!KbHFQ`u& 0 `n|\`BU$!,HT?xZD̬J4G/séz p0 `JUXC.0@  0`^BYrub` H| pA8? 0%KTG<$ Sچ=| ` ``Չ@(2_|Rw/ 0p(o8`<$?I.`?'K`9C]HVh s9Vh${o|=| x0 X!ܜ B `b@0>*ؿ5 k0 A  WnȹP~ ?Q#{4xԨ`x@(vJc`;U@`Aą`D; 0i5>R IK*? C@wx mF~̈́xDt C%ݠ!x b@ST0rA)UWA$x=+._P ^A4A$KV /Ҹ=$ 0` lA.T]̻:_A`FipP)@ A4h%A/.rJP1DLX0?*(P G` `8 xCM# ZX x$@%[  tAJ$rp`{{O +}Q@v =ڔpAI$jKǟ^3{ #իUp/'/! C#`nA.7Dz$> 埈<( {| V_g U V% %T p05H`}rddXBV `@ ĥ20vxBXYSN m @|<4`|Ab\ѷ@fe~L`?`;!,K?r`2^ x>@/T%N<'R) 1 b]C]AU\ A}Q?U~Lz぀!%đ R蓂ZujV};iX0t|Jzeq@UFNLD0%`: 8%"Q #`xJy@`FuA?`H9P=DJ oe`$@4i} (X!8@<>}=`;$I?z^\% L"hJV ~%J6^P8:@ }VhHZ% ˀ80` @< +K5J^ H0BXyܬ f_jcs reA T֗J0`<: @49z2`\ YoH.8!$!Z\ q$ (`K '̿S@`;D` HG*, D!xB(fρ}\3Hh 0 d$r?0 `<Ճ s~Z0|x āro,sE.=@V~ ~)sJ 40(0 Aگ 8>yR'jJ?,@`?+/`" 8{:J^K3Q()>ХYIX%ب `V˃ %ؐ_栂 H@4`BYI.W |=`A bI{@||@Q`މO $^v+BX0yP@!?UxAF ! H-` \IuX|>e`*@ PBQ}F@`| Lg oO7  ]恂[C`T y*x *I?V ("X0!8f$H0#A`<˕oKB`;y|!0$!ʭ0E 0 " | 0@u X0BX$@Ҳ/n 0?2 JR^~I xTgA.j$ h0 \%xѢ0  tĿ9+Z ⁁  $`9A9Z8 ؅bV`Z 07o~ 0DTZ-9P $UCCVa ? `A$X0!j@$ KȬ`8HyP0bZPO!JAW>=*bذ`C| p E0"R%( x0!(`GQ)AR`ثB ϗ)(0" ". $Ae!  xh Q>|%2|z ( T0B`% C C.0!?Շ쬒( O`v`K/./G0`AV]A,x?$ă`<x`: 5@ D{bA ``` ď0E$ 0 z@=@@D`;Aˁ|b_?w0>(.4D%^0?./e]X37V g쬒$ D 0?Ѐ? 8tX0 6 #.|j"A `LUm $ù^  1`Eg0KT>V2($ H0 y<%%C % `} CU`FDx0@y*@xKV?^ h0@B^Pd 5yLՖCUJraaw;<$(RNw38/"W *`>ئFrp zenuVq9~xwgYcw: 7j~ܚH%*>/)a#$*RfƴnO =x8GX8_܇ͮ}@gf 6֑ky2G[]oU<;OS{aQ00A*xd d"yΫ #x$xft&'IΥΆn+ zQp˕yr ܩqo H#.LNN$9շ)Gpαm@*.I=H8 %)7;k_p8@C1tn[sSy5X6_=MUg+|3m~p;3IR||;M<@p^Tg?||hw">wwpG T?Aۖ-vm(>|a羧{6|!jPr@}@ZawWww}W<5s)fDJ"y }~+ }SVj&ġ,IPRI DE;^PO! j2 ĥKv)tN l*H]JE>L7^#hWgxf"tTa(R ZBI {[a7o0y8_ٔO/m}Ԝ<~@$Nշ5k} s-W3Z/Am!Œ3fExφoI˕?pp?0r5[ N49BN1w:r6'NOH*`Dk#Հ@(yix#8J?{o9E@AEh^m]{R'? NkB8@FM9j#%YSdg3퇙7?kwS"&C<'h#'\y [5?.xvc__Qˢ03ܷB|C_Y涕gtzgUC7{O<."Ai^~sޮhy紾 Q)PŠ8LN ?iIUoNhTn[ 0 :qp?m&{1az<3{L$6yv?-[{3 3םP ĥx0`?KJ|?P*xSNP8 |vI棂9#ƻ-{އ E0o2px}jDuUo!/|v'dRa8aoɎ+ryYŷ'W"Nkɜ2=k_{^#DbJA7pfLt^8UNo 5q\Ωd1wn[%u ErwEeuK#'ӃYoIc0賮ӌ`t`$5\-$4I'0ɼ:kxK^1ꏺH?*ٔYӎOWihgH<xg^N?jC5y8ņc S,3V1"E GU DWX-C43{2brk,x06:,N8U'"-X`ףƟ8i F:;qD Vj֤ԸP@/$x ,Aͺ\]jA9wG6#ad>:=4vy^N`|$)x`-Q9@Oߨێ[{x n sO4CXx3sXd Mdބdc8U^Z 8)f=q2,0zl y8*OEÁ[OT )^{޶h{$!zExDRuDC+S )ø=ʡ}իlgjwǃ͢ ~p?u!}g<&|2{9>]1Id{|j.O :}x]$CƧ^䚥 X*܆s I[0'\hqkynj9Iܞ*/`dg،a_s-L 0 :oZN ɻLNBXeP~;9Z˒ <H:{λό(T\~RBju/8˿o3ks>3^g@}ؙS[jxGiO3VB"&}Xa.W:ޜ[ܯ-<̩#jnāx|Z8z; ]Y2rj[4Ia. .浇S]$/qg)ᓀ)Q7LugHz &)wTkǒPpC9yDž1!jrbOĴ? 0\3z1O9@c=$lՌ)8p@5 .+s{Q`1A$ %upFԢ D8*<-YXf si ?MOW)! L@$3 xuؽw}Oz9ʻwwӻ:oN_*WLU_IWbX ds| +B? f?S-usoO7;7}}-,bߗ0|zk*| bF#`;^.PC8CB$D f\Th!<yVQ=GCzgsoOPoN۶yw "J:_¥J",722/.rƕoI8*]d;s9{$b(JRaZ<$sP;S(Xkb*}E+?J,2/$X1mǭg^lʸZۘܞ _ -KoEO mg'l5cTb#%L<2 %'@*>l9|r]Wbr$qğ{CϤïI2"o1s}SLdr4ێPL%pg“8|iRH3p ?R9'Dc0R3 5g d1xJ:]\dx2gֺ~y@L2sp-2gqlwN"Z|oCud#7SJd9,IŸjSY׷W67]}g:zS}Ā6.B){T *͊G1pOI^-;kՉ>33 FOh,F_~ sAp@սoIOV3W7+?@ Hr" i G ?bGF,<'#(@ɽnW}:pۚa9rЭk? 57Md^B DBwF.`|-g|D*p?nov(#v͜Bj]X e2w7{;[ܵu[*W8:\:?ǀxrf3sHoZxy\ޝ^ݷWm}ww2tANcۆPa X!+>qCۚzU%Df`r `(T!FaT. =oT.!@<(>oޝ}mn0}` (@ !#ppf(+eg08i;%ľ ~` FKc*FO N`#'ݰ(FOH6֏RqIb;&Xҽ3ksxeC[Gq13ܗιs˾ДIobt$hG@'L:\>,ep G&9OG+tL8ƣD{)|{hRT4<;Hh2ku=i)?_tc1DS$}r\2<06Zuf/ WꖸN6t\?:H\@*bs/K7$NbyXYq[ xMV P'&p*r?x~AO}0F͖)"csmF3/B4Gl0^U鉔ɛ\dzfou]>72 6#<=^7g{¶;s9?ﭨ:QL~xXzzNamnβyji4TfZOWpd |}]-RcW8pjD(wMeنď|s~|~}遼0 MA=@Ӑ ϯ§Oi)?/X>!-X*f0[x3KSRg8='Μ4gW'[ 6}<3Vy]4pXEWxfwM:k EevA`AFrnpdxj۽&gOIsҹ:ϫa/3Ayp3+.ԫVx *NAJ{~hٖy5,kᓄx&U)*0 PVu3TiÏSwpe]^7>Qo U%VXpS/Gl˩ Ḧi@7]!dT |iVژ~ /ؖP0'F'Eʍ*94aLe wUJ~pwN(,>a**e"Lt|tx}`gq7P`Dl [Fb/$d͝&cnp=.ozx9c&_<'b) T!_O[0úk{9_OOxH58SFZerb5Sso0e$Pze\G7ϬiJ\qHi7H|SM^oB<W*ܚ*Er0;k66$N9=S`P#OyEuNa'N52($'r9LJ}@iOy R"W$\{}l?H1b*3k],s(QOOp`.wb/ "h?wT\ v{{ϔ,p<#s;duA9񾓷ه}T;r)GYQ-ՎLI}B.ogFG% sG`O85~5:z(6S_/nBddno: ;j*Vn\?ܨ@8jJq玽oH@,xgoBa*pS |UcqOl#zdU\*O |2pgNGs%t+/Y1ns]I=j PGxyƬ#zt5esέjp =Kӏp> +YWTt %xM(8B|z:vCnj )B[0-={< cm.z´!XI|3+{һM>tōַ |QҺ:#PY S0ںSS#!|ittџl8u\%7>I;N9?2dE ߡqҺݷnw*_q PP?;ӚUHd?ӻ+Wns`Yt7g~2ME^? @AwpP8`gi~cx8*c$sww'!tG+T/q(QaQ88xD=0#@{HL=G/8)|dm.`2{y7OS{y7VFTg+xSc˜lXVL3OXOMv C'JG*-Ɯ &7<&G_M5W!oqw9C\/)'y>Ѫ3Ѫ.p6%xgII[tk0r@+ *M>4qOR;I` Dz u=C] p !F~x>q})M9'\DG།~J2}#ߘg+~v37'r|ܠJ#+ TDÂFItd"d ˬjYu-VqXM㶰ɬ1gmy2M cg_tgΎ~ti1y8R*CE,gkd?Bwξk >eso ϊw8]K2>G{},ʹxd0"WWp4:|a4>xE& 8ϐZ4o0E +'& a0F2qR$`) 12s@ FS2-6pRo:Y?S:ޏ{) VEkX=d)MLcTp"p^&83\)xSWӰ;R*x Cɬ12(N Nt@A>#CmKoFSe02s{')K&!F_=x|G&[wiU +/ЖX0*MzjOxdSݧڷ6ul:̹i"PCjdGPvuJ?RxQ?|yn8ʫ6ǖ߽oN7jF1Kl zW{ܮ9t߻[`('Js'n ̋;O7wisn&`RO/ب  `~Tz:a07T4ey8ɑ;4yξbLI`Źbos76ƞ`X@H*M8_Deꁂi; (t&U Z|FeV$7&gONl t+8ՏgXHWKe(:-!LOB4lia䛏k89sp =ܾ,M c! MNЭ¯N TQ񊛼~==f/1cߔ}qYDG%.SIJPU}/d\HW8u{?ޏ};;-2O_Xdm )E9_4( ,bO5k>#oMCKwpk=M4ilpD/zvt+w9.4ko|x`V+Q]!O&i.ѭ@ ~_1$ ^^77΂92¶`kƬ+kkb8V~%j%e ;SnsX&N\<Ϋ!../~:s =ì D,3s½kjc#qunH#UǪ.4^}&}%7==PIpdah++/QEzH|Q /_Z&vsՏ,m*zX/ ~~_Q6moou7{{,ƞ$<W\2rxPd"<'-P 0XQl{Rs!4g2 ^8ꋵz;`(GDuDw,i}U8X~y3fhwVAfoEo87J~S,6י:pvPso8NϧCf +_)T{f~ίBǙk_{Ba7N/~|3Hu@G:/<2k87Qp\ӤKoo[ cVޏVGBp՚na@ P |%Z.mVrT%x,B7;mfa\$yr\5s|F|y=/ƀ~<(ʋ` `+&E@pTT^ km.9p_\0 BW_W׭rY } ~0 Kz1DqCa#Ӷvnp+C_O7wwm}:{3A/}?:fB/SX _*/m08Eo)9]҆XDVJ3B5^Q@kp mO`vծIƢ;?,h'OG0|G*goBZSEzg+8筆{ހ(R*zWeH4PB:)lneW7\J.y ;JL4rۄM0 S >$7 9w's0*3`n'SC=e^9h8_£R?FB:ep/x'wSncrɖ8@K9ov2A36:=Z4#I@֌ݞ$maVts 4p?)%<2ZL3xfxa,7 IW0@<τ`{ޑA{cO֟wI`*c'f|+W 4@c.{9F$G^em&!8q&XдD\Gœf]J^T`3 }u٣M9<*ޘ0 [l¸c%BNK=#“>N'[h$Qe,u>=ï8(# ϵT%+:*goPi')' !B=uang\Ya:>0fBm S:4gԱ:XEj"1Hcqx}q?u~bsSS>N-:hH$#(JenC9L37x8gHΚs8_Yp:2]8ퟪbqF,d $pdw{wO1^?Gb0,N9e6] ?Ϯq(OX 65ڳ' ,=龍=!㈰Wyճ)0ԁ8OUJ3:7! ̌j6^py03M {B+=i)ۃ'L2g _ ޾ Urja٩hHzmS?ce#wk 1\3G[.Y^ eQbItxQ!GjxiJ𪚟9f"e*[{ޞޘM+mƑsJP`8~] T\Ҭ< 6Dg`?.T:T)P,f !'^[ǶcrzsB䙧9u s@{l `  =OL?QF v,`@9@0`0jU+3p3Ov6ۛ}tJ5e\)h + 0 oOotwbϽ`0.Ӷ$y t|FGjgH2BC'.j䂁N}a_{ﻬэ+}B5T ,0pD8¥HИ)j*΃ x c)Y=ȰG\$DC{Cj F1! N !&1 FH8@A#0'G(% W ,$E*Hc摈Ϛ4xS8@Wf^5npH~]24\X/kr#V7+ 6sޞhPG 6T?ʄr hSu~%AѪp0*A2t)*0xH.W`(Dp9}/,hem>%GQ=sPDZ(8N D>@<qah^iwjy.gORJx5^^;c34#fR$ zx0t׵\FDgpPqk c[pOC]$4OMd1SOoN^DI)1PS2tE*"2| OFZ4]Ćk+J(?yk 8:,ž =db#omj10鯌l^v|XȽfBfVq4gd^{ؽS/d Vpg.+uf kgeLJP 6lf;*A?S 9gddwz.;g*NaiTO>&#%y~yB~ɴpV@ *pfĊhjJ<|C*.G=_ RUMT@~ _^"edB}2O r x{[KtRxF!Lr/ b#jc!V#W~?-P0;G $=\  >eGaę37'NYy xmqp!gdR s|!60AL-'t˼ <<."$<*x8/={gZAy\Q|2{}Vʟ +Sdžjp@0w)Sj@#x['B{獫S2s{iTǦ 2pg܇No?ڛMeZ`'B"Jw`F4f>#9@#p/E)ꙵGQ i "a ɀ/c 0*|N6 8șRqx pDc 8TJ[u'3/Wb*3 cɒ"9˿s#jǕW8d7G?ksY3q,g6%(֮ s7 ^:CqSH U18ˋ'%98t[-,iتwM!aN@',=4"}PλxDL>R4H"- CID0DB Ɍ,0 65E*ץoY>;0XxׇJs{uZxҐI쭄VB5B4A7'VF-?hp4IM!_6܍=F-ܦUhdfso[{00p?!ox5 ЊmaeZ#8;F2/BtXe,g,(GVwWqGg|U`f{ @ n>mgOvB8νzwAWϣWG8G8F9Og2>3i>RџZZ͘pZȞV+Hk@?IUdSQnH&E ,HĻِM9O 'r=Om\u8nM=% U'`u?W t0pM\b@C OXl*)6 C,3CBpAJ+#>Ӑdu G)rDKe^Yã2*qdq2x\Չx8@Dr2!qÍ@)gdIntJ>.k&I 3<2 `V_&_:< zS+kMRRZܹ. 0BEU#__6_3=P0"U%+*|}/˖PjQpOvTE;ۚG; jA|g4F"C)(cJAG{<<&E̓ۤ]nۤ`f`|9 2@v>xSy]2ߤE4 98SNHsQ CmUx'a 3H8O Wd.8 H0 !c&Fk)Sg|]8yCO.F ~o.rA/ jht+03 -:p+K˓km4).4LW9?H Fa <2e$ҶDl*CҶEmd RѢΓ޲3Tdgȃh0 Ddyaibz!ùϙDADQ~ce,:bF>ð4DNǧģ{)0?RDtU/ZLЍRE,i!HC){؅VVĺh#4rT/+Zg3n#9R>MFFx"~zkX -mA'!(-ߌ#XL#pUbh<;< o>ĩL3U]/ad[ FC@(g FXquF|d *a3yn£$=j 58~wrCP03b}z`)[3?!@8? [r.랾93'S pŪ:p;_.@'p8afy{Zh?~p_#*oXd#;L4(8`$*"۷`*M 8dHMZܶ/_pd++{mP^)|q%꺧Dž:<`Ukā'2h('^ IB-\x)E  %hp!$!%pI.M& J70ȅB:X氝x]Ꟃ%$|ʭHYu0 yup2'2:e a @0da!|v0L[z[' Vۓ-*NLެmB@p$!Lc8>_l!z CO8tGۧ-*J f?8j8)sJo ȮKcryK˕x0JU+pğrƿN# BX !!+Ir gJ2"n|2x Ntzy6 H0r UZxSQ \tHAU0> 0yX{ >| 7x0BJJbHUbJ S#)pZ=.1;`ۛw~@,Fqd?YOvnӶqf AA``n:dwSDgG_Ad%Ia:o7)7㻻tu0{K Z01hX@9 GSe|$(duZ8z>H# 6y|'͏5E8?Wl;DM0X tf;CWڽRL(S[? BfdGTGdI<_3åz @rN!W{V07kt{)7Tި02lFl /] y*(x+ 7/gD-荩1O \ycVqG%!7%V%r{ߌS<:đ&vP]`2xhUZX0 ;Yu_A!i"'@q# Bt!wSNo ^Mlja+zC٢>g*.>)RռfˮriQ#:B-ŝc"O:"mnTS )}T|_Ugsk Rʏ Cxds ӕb  7=M<_$3cF̆nKi}5? RS*2lDLrD'?o&h"P8ު\/ŎU/Nz[Rf{STyȳ Ad/z?x sǸP xy6hz'/o)/:jC 7;`Oa~^>ETLx0r+}R05*_?tg9~<2kum|2s{'9OEyE|?0.@e%x˦/DDD\ B9 +qXR>BŰ GbΟq75T8 rMĠ{BV3S9l { 6$3D7}zt啒H&^WFWZ{7+ލ}Zype P,K?C>P0P^8p .YԴ-)G8?h zBΝk7z߈D`<?@z A( \~>}oLSaDۍveFO0.:nwE4H9`)T s7)?ZU+!v1/KezQâ|`8.pd|@`\O<=?/@B57q FOHgs =hBI"N<,ιagc ~7 vqy \53]nnw `21b?Y*irǨQAz}c<* P8?η?IG-8p>|)9y bgMKx8xAyjxf>Q_*L%5p ydꕗ` az%o$}3 )YDž3SV*:RP| (,;V479<2 B<2UTs|d>"Oޒ D#UZF||?yё\d\xdyo=k7=yק^\xf kOE>zxٽiI!RI`80߁1A:"9gWaCpI'hV%*sRzd*: i SOUA_:H~7ȶ0 0 ӀPwֵd ‚N^ 8)JI* mq|U|f$A!q.C% p ޿FC̾{5ȬnGL>!Vhy8t3̅b ozμI3` !~A, U. m{9M腼h%^2NH!&}]m){f,μFCyqxg +sF~=swo8szA WaT{0*Q =AIV%+wǪڕL\l,>|r8iC?p뺺NӾ& K.G]$:]bQw˄x_&ˆ Aa"C'@?GM.Omm!lӸ27w}Λwk @+tُ<=J\\>UPvm\RΚp{k{zta@Nؽ6#-#^B罳46Lu=<ޝMaсO<ۧ߅>WP .H Xa=$H-4 #̀Lp;A8AV! v\z 8)1CaR{~Eʤl+>O{nsVLkQHfbpTH 7P(C:8#?i9xJ#*x.* )ɧ* VHu7 sD?f=<2 f2XIÉuGajҁt|`#҈GW#YIG|d+p)T5\Ulܞ 7ypAk`[{{X]h`*ϝ eB^g:3Qm;o$7cyᘢ{Giq:q|,R:r> c熋KK#S4X,0&lsH#p.0@Xާ>z农wd#O$?t'O  P +-/85!GLEi>=O73/;L\`!o8X'8_ԧS7OzA<'sQQ!i[ ɽ\ zĀ-'G@xJy}gXv9|d^qʤ?XծgCr9, HMCFJ7l<*e:!7!:u#E{9sUUȭAi#/x{Ӌ/%A> onSkJb۴d3c 0[G38{>ψKpJ.PKXy'nn. 7<;qAi\ѠpIs>|B31|_#PJdG:~E7{nlvxFgxn$D;-S]ރ|3zM%865 8]I:@ pXX8iyp?M/f~/O(#.<(p?W0@S 6MA/"o3m-i`F }0_ڰr*{Zqx!)Ipш+xf/?Bn50%`ftoȕ񆡙7Xf+;ᚳφkoy&BJN?4Ϧ3T7O{B38@A) ExuZR(lP:PR`5n~?# ޯO 20u_{{ =Jaa(0fj*g_Fg= @AR!}W9R )"Ϲg{oYɭmTB<L @6$m v* n̔d#%?f*GP֏2d=.BSi(j=ʚo,%īAV$ tJ/S9,-af$:6A">`'ϝ0*QbHعSSNN#8SO#jbmw@yӄg՘b>{)ia ؄j@$x4!'2P"` C%pGJ@D(rd|!iw >ha(P2> "MgMZF铽<)a4*ȝLgܬWڄ2k?#9(dh;◣JqO\^3BƉ30>u9ht\IZ7t'F)ESCp?=X,w;h/q}LiLq_ & xfoE7ҴCg\bR3:`"n[@΅gXt=VBmuE&L3)ŝe 9})մM<5r8&ZyCENJ}\UtlF ?Ѡ==q @*LrMF¤2o{>wpSEHf}ȋ'x2p3yqp38'FW l r¸q#bA1-TU@|}U.\-c{4ֲDOdӯolr%,3:NxI8O<3<`~?^ ueEB&h+M#o+f$<{ I^l=<#6<:{&b 8-: x)d_ AdC@M L+GpR$/@#;"*a^6c{{ݭL jT xCHiڪ.// A}~Kc;8: aQK!pe]s83M~pnaB7KiMb0$p0K>SU 7c06OH3>?ݷmѹ黺VCjy@`<7?b`;j3d ȿE1 jC/e+T nD KR_E?Tz/Btιwiss;xڦV,=Sa~ˁpD>֑yeIJR{2oӦ O A_w{v5ORX .`a 1KU0Hw^rU3CCߪN F!}Lq^o_BaN¸Y쀕wln*yXUI8&GԚ2#j%j}*^7[rS5 ܾ9L2;k?ohg}_:d:zUXɂSxNSIنG*QzN1aIx]\ o '=O7[%f]=]àl+GL|p  OB|3 iN&W6F7gRg@,.|:50&O{7 p W { z=|N(3z{՟ Og3z|g?p=z#@7L1u]Tl7bX,Z.)[iH8`J%(eT!]̓28ȓ io~37xf>\sz<2Op8ؑN3UN{𕇡8@|\K^^Џ^Ki''Y D$z{2FLhh$*/B+Do| b C *d 0ȅuKQ{f{N3^UǜGyޝ/IG ޟ[TK@:š7uv83H56a`S">*1t`*`G|ڳp@Ir+|R!$  4zG_XUJ bA/EQ#*\ͬt-΀` P.⟈Ǖx]oM=f[;6zy Wv}h5E //1(/I5j' 3uʤGp2[ënONI!"ptG3Pۆ#phCwB4xd@qxj “d=?b>𦑘tpsUMgxfOw"pL G*z<}rW3npѬxn0%'+S0:b0QKd<;v 9~Ԃ+nuJ4g*$,/jcܰ=mIö5J+d 'Yol#c_?έ@^Á$E稧 (vS;շVKnB ;o {{{bUx.MNOe&MDσ5J _Z{->ij`|qnp=7f%o 78):iO\> ajӢ V= ѫ yA/` QŋAS!z,μE8 ܞmr,2s p' DNVEGCM="::z@8?NA~|p> G|#-:jKh,ͤ"dC>ya^WF5eor&}V'*f'afxIg/0 GRxB8CDi </V.!%Rh8`CWN šϗOhyP8 iWωK # E3>5 gbJ`^U_pwuQUJ!iَm (" Fj#bPÅ|WGI2qɹ ,2{|~ax8 h@mJxjF.B}j3}rVx&hQq>jL<+Xd%%Gw!7{[,2v[Bbqp:x2-/i#ğO:8G(8_ߺnӴ"/./UJLʨB ._ :39_|h X*HVNQ/70`'>a wĀ`H$eaAs!.}S;dP< "\UosLT o{+Ќnv e굗"چ o}۽]^iy``0#_T~9VǾuT0\i2C,|C7$\\"ѤӪ4Ņ: y.=G`:*DZ#5q{@hL31Z{yx\{+^5_Ѩ  f! "Bđ)sg5pG!h 05iWZlDO[:b\)<1`9p;i>!oz=<2OWW- 8L(ӹ[& Cޝ Pכ.h18tg??t@_ m8lD݆>^'j9Da9ɇi3 = ̉2gUcT1HQ"DAE0^rtSO( \Z@3^B3Ȟ٧^_'mur1X͕5k>ρ)f!+?S,3YX,q1[7D}c$=?nxip93×U`jO_}y0mKT)NcCs!Z3&DFH)d>xGEG>秹 ̃?&J#FKR&@8BSG C w9&NKPd1Adxj@W/imS4Ldy<3i~':5W3}B%:D?z}}8O ̠za rvq+f|(NP!GcDpYUK{ن%3c3a*gOG 'Q)q"sq?yq{NSX}%On xÃA)t@e(mX8`v8,&3({gz=|XT"-Pv#_a\#M)13EN 5[_3<ᓆ 4){\<||xRQ30Az˜ hA`~DȤhʄ҃*HN"j *J#m `x3+e.NNq;݈pRx'Q0 0ChO 5^W^鵼I3(pQ<5"p.7,20Q qJ^(_oh0!B j 0eD;ѐ(vqRdO~7c*:} s:M4R &]}HVb/߄`0JjL[]ARq#f/raw %h+EAL,Kڨ?@T*$_$k: ˩ x!`)hdPDO"\..eIzF.Λ,)ME.1d3W&̵ćImvl+  `vpIPix0 ׀aR m.߁q;5N01 .İ FT{ AAA`v+V:w`Ⱥg^P10@= WȚ&Kpȏ Q<&0.t.k G Lᘂ' ; WzǦaX; /6˄!"|Fp57k 7~,~"%o]8,kaz_NѶ~"sR7V8}iΰCî}A&PS>PI#%m٤{n9_ǃ% s' sF𫫑SMը2TyYyIд/V|G(wHApeR΄%+%.I Jr΀q"9u 6?}'WVV= ™z@w1 p{b4R\pwg-+tsWav\3=|GW9[xξxu~爓p=K΅.:/$u@=*#BGxS8 #OMyt%?cEALU|ND \#j +TP*Vh*mn' D{~zf{ODŽ0 ;A`8@|<_ ?Ժxj_@%"2 FAEU珪Դx, :xx 0e`# ,IWθv.W\%EE $-_=!0EDnOcDnIƀj/wa9< E>!sx8`} x8]'5܇`CˇAWTlx 8D x3M`SRh+Uw b`&f@|u}Q-m`g}2棡Y S,yrx^w\^`I//P=ypdP\$X {B %tBqp-_VϋI[f 灁TUlmǾ*UʅSnYRG !azS7{7-Vt4df 80wCꡁ𖛨peXTale|%@~[rI!;|nw(Sy3sdO0uߺOo'Wk P)m# Q"{9灀xLĂcrw[}1Rj|~:c`tX+{G' D"v<'|8`GE {zvv6J3TYœD%EU 7}_>?v<)2d\X+8`JOR#8;κzt;>3nov7xށ'1!/ Z!2]^pP":Nqxh:rKna\eumX _ u'1(Wx78z &+Yij/UO6 p)nk 5Ɍ3[ 繿ε=9|2~=jSO yG^RU*g Eʬ!(}S׿9/6/dp=qA`83# p'/c kf<}&z:b3 WDe[ x0?.Uhͫ|e|:k{m'W3-?N^AN;p ޗTB :xZƯmk!9P34ǣm!@;ŝ`b³p>f*n\%yÉKwN>m^ %p ->u6Ѣ5yo;9|4OUTAxek8HF'в~VebԛI~v5Zg4gN~ db2cuzzЕbMphtǡR3~a}$goMG* qA;8'ev*Tj˙FP1ռi}Lu.gTs!P:zwdmf,h{=B5D#-;?<ۖ*3?Lv}Mn_ $?(=־ .V}2{>sa?ѿ j2\%N4 .>%<:ϥ<G3rne)@fVg $988gYmQ\\權P ^ Ohr2r] y3_}4}ǭOt= " FN@p@ :%% vSkg'={vH"˜gpo3L*|o_0߁b@ ?J/Vz+xfOB9[xPf򫩜$q?pIO eD{ G ] _6#HJUtyh>.K@_oa%V+/SQ CO 75)ڲ+X8s7# j:=YJ‚f7oozkz,ǽ &`RUw~ ƖH x?./RV!~ҧ+Uֳ@(o.0 \>jߑڬH„;F*<"$wDD|p20z~U~T۟A&7E[5P%d#.U\:SAx| U #Ι"acVHfqv6^sg!9.^;#Cfe4QRhNweT&:I ԈD"o׿wū{wwF`, D @)G5q`8[M`2|s&Tӝusl9]\i}<,lvBqa @=Q5^ME6ⶴd+‚ QǩΑM??} n'<ޮ}vlqm4u#6Q3S ccgu\5xF8BH Xd|::_yCC>,ۓ xzm ):rT!i{ ̃2*<$>'='JFŃ4I) -Sϴa*xXK ʮˣTSOCA|hl+Թ $[ SeQ 2 .921Ku9PxNvEj cnJEqos< !ilf2 [;h4lgY 텖c%6 =c{ q;nʤҝ=-<Χ'ϜwuSy3ָm}Sy:o =x>Jh ՛a^M|GnЗh*{KcᘍAp?/m}eDMM8hأta/GҰ^;"pj>Lۇu82[ޞ ozxu<3]'2O F$#!Ё;OpT>IE]xp%p?.Ywc+W f{1q( 0S@#{HȎ/$/]_,5 a%R`zQ9t+iT\p*L)Q,Ñw3{;oc{xg|OR^+˨8Vzx"Aǂk&.âT.V%~.TNm0 C J=*ܞ?`A3/G  GцH=y?TFZDxGt Ԕ)8xKÊh*Ѥ20S[{YW=O/`+9K2~O\^}_70ʇ|Ђ%zP:Y'}>=^phMy\NxdWGN8Si;o>OoLovݧ$&P9ߢ!vٰiadë3#8æy꽙 !%eGh=HEj{ww}MuF9@~2WJ1 ?$4T%6 !֏aa7[$y7a'"s(b$ab9{Sg|yp {[?ǀXf;XdVξp"2+ 7ġ  Ce*Ƚg1d _D3 0 O:t2s–P9s:"&'/NWs b9]'14\-J@vBt<]:fmpeܨ8q`cz)8;w\gEG9:l-yd2 ':c/0Z ,EboǗL|ɧ'Bz8jxD_dҷ K±/)2Ǥ8bzφap`A1 A,ˋȒ?@ : hA+|-O0" W`;Aꩠ9@%yY0'p0/h~g x0e8 `~G`SR\o|2?P9_  q0#`v M rSg 0x# Kw@e h@0?"Rb̸  a=s@Rgɀ)?AC{ * 80XB/DfE/ y` OЀ  x 9uUBnP`:\ay8>$ BW L%qw4 ތ7}x8@` ft" pG v0` p`=0$Ϳ$L$H+Y` U6"Rg<0`yE/U}YP^,>Dc ?I1$*,D``<h򇄟`<s@A:_PYTt 0*`M_PYU@`Azs@ 0~ /~  As@@=2>_t!0UTAZ\PA` !`~D|d(z y`:ˀ?D5`;0 ~9?I\!K!@=&^)AlHUQ8%$~`}&l>A|\Qx@P:6 0)`9K  pC+  8hXh,! 0 O A @AUk_uuyoH ` G  a?)M=xH{4zQ (H0 ??hyf hw 0BU @}9?ESx >ˠxxthLZ5}Iv#f<,lB(T)Prp@ 0(?p,@gPP`9A ?|xꔉ$`|KP!C%2ΗJ`ىAuH.AP@V/&2f(uR0P$ E@H@6O"`qPKJp0 AA2 h0 pqW4f0ꁁT%b}Zp bTPcz`ݸ8_݀v 0a!Y~zM` "_ P(dV߂cS'tޓ]B @$$ (@IP0@XAjAx7{m(+`R+4DħdAG3{ ,%RGA"@@J;z0vį{r?x@4z?p/Px`9T$ ` p "P0p>qr/X%OK?\q}pGt >OUc@YШ|~t]aA%f!/tKA.RZRI`Q!@)DD{ Yj! 5z=/V C;k@0*U ] `:G%x Jw7`~~_ P;M;xy懷/.z~ Acﺨ?NP`{^ >VR? `h?$)`0_3 y2 x QӏCPv@^ ĭ/|Upp?1;E|)0  H6gu&`<(CFU@)丿eE>8`@~1x0!?DGֹr%*8 8@H`Cf`P3݀Kx`n}踯d%<0` X^)|5H!X%CQr!@)8΀{`Ft = `hA;^P>_Y@'A$ğSBn ` Ճ]ST)p8#*x xP:  78Ϫ( gzNR>O\%,%(9@y# #g6+Sx%?B}^{t9b @0ԀpB E[AT *%Ձ׽z6oipG/8ؤ2CA#.nyI0E҂ͺh(%&견<0uFv(0@W>% Yp H//#`KG!.0`Sp]wls&`<  ~>ua7A X^~NO> pU&/ / @0Cj|"㪅= ?T%S}0 ǣ QJ7k*J "*/xp`<˄.x0! !+zDyH h@@iRת x }DX:[!+0@xYd`<ڲ)/F6UW ӏ.UmVB!]!=@ pC*,`G f:h`8 U 0e TO@_L@;> iP0[|ץ } p C  ߸<!u0`%x^0 p ^ʔG?b>9%c42eJ`:"@]Z/8x.Q0 B4v$)90 B:RW`7D`<(˒2@ 0_"Q}D`BBW(?a7儁0ʡp0?JV+@>K`rbX0>{0gH$  %li6 p2~XR ɜ=HgHWUAH0!~  |Qk ыCt߇~_ǡ@`:A/y{DI@]~ =R)@h]"y `;AQ>WӱV(D+!@ 0 ˕+IbUqt!$~  `U+W1J xc466  `Bv>>欼?fE(>a @8`:x0?U 0?7Ǽ0AJJ*}JVZr=X0ʺ?Q{2y  ^(6 @0I %kݦ/" .N]ʘ>D*eگ0@ h0 0$ :V`*g(x"PCTF$|I~Vu +.縉˃ߋ*PH4 `7@<1& R$P`~A {Ӎrn΁@`;t:`7T$% m.T{{+l...l{٘B|0u$UKaT V%|JjT`4@ p0 }VPp`D# a j <}0A?Ёo>|H0^իMJȼGG Hؙ8h@ h% g A(|VjrM 0R>$+/.А\L@`82`<P~R`s(5@?T V/0:fĂ V(U*uP  ļx]Ht{<>M_ h0  P_Zz`GNLˀ`0@ylA^4 `G^tiC72ׄ`A ļ  0>$*$L$)Όq)p!#OE@-B]u*/.`KѾ48<.J1?K4 x? ~eG,UG&LӀ  ςA/R4ZT0a\= ]|h 0tK/..hbq|X[ !``g 9v)T_*@@>(P}h0;͇@y@(p/b$ bP0 x0 80yYxU6qAX0x\_`AĨ)Rp`Z~f0dAP Bצ"% cGyx| ` D`@Ix]\&AACT>!`:S,K.`9~ CZ 6@y0bUW 0 !І>j@R CU wx5!(\|+A5aI(W\D% BIt{F u5|_@4 zNs ? 0`t 0~|~puX(\4b$U?%p0H*bBPt2{ > ...sd0 x!$KBHC 3 ;( Б,"HEP*p`<+GP0_jF<:#}X ȔB%lAuJWpq.zc ac@4vq G`;x#UP8kxW4y8 AwT0aA|41VeP0^MH3{!Rl`Aā!DUNu>]O\\ң!!^P?T&'MJxuH%yT``<ď wġ`C/HebQ`̍"`AB!>?E}\``y$Xh\:fB-wh` 4_!}C, PA \H<$A (z EGp9` @es0 aZ p0?%+ Kп8$:PJLC Ŀ@K-q(Ї|0ZG( z q(z 8FzJL~ }@ Qu0 ch9  `;@3yW /Ҫ]~lABA 8?^LH0vL<~%_,^Uh \ 8 *W~ 1 s,z B Hrcd @-Cd10$S \PWcUIJ,!+ի+m#pyW 8T?cR!5[:|I~ p!)U({Ā1$Y~h~PX*?/L?ox08!*įd-p|.,oï|"e nWh0JK@" Lv@KTlȽR'qhC7|LSII.D>%Yv5r <_;.xO jqqY tHx}GCRE2S  0X0CP`DQ~NjAޥ Շ⃟%">.|ON* đTL`8@8H.V%Wy0u_A V]bEO=ǪA~ǁ 0A򿗗K~m=#qV, x^ 0`f E@#n~+=h!/KOE\H0c\^%U^'3\A4|BZFzV;)J] A  JC@ $(Z=PBT>d toCx5p9|V{ 3#4* )Pj+*b JV O*%)%.ؿèxx0CF?/h`İP x%~5`s)xvlP0V`CA0@_T˯l2jw;Qo !p.0`l{ }[Ѐ> FvJG1"$>t]*qo1#*`xyG?_8`PYzw9bP!xI|QKւvګ^aC@^pP(vDfU80`0~G^_Ppi:q0T h0A| *ⷤ\ @P!c Tw{(Ip_ *W@hE1@=`/Pҩ9C` x JH0!(H-[WQ `<6sT0`;Չ`>UoL05@*T8_rgPgbG:O\?U -⸝ڮ`G# z)<:%m!T H^A`G%#<@`g|= LA|?c>. ip@ DT ]G*Vf$05ʼ#*G`~)8 y0`*@T w.ը#j‚B. = fִp PS`iptx. y uyQx!3?LxUcG@_GGB0PCcp+d!h0` j߰Ei$ p [<#(qi  N>^BڃA |F@^2g0G *`<0>K*rW`0Ǹ l|~27舜?@`;1K=/d T @q %m8 jrB,30G`A1B Q"03o5Hx48sOm0BLBc|p0*U J'qBt\\f%t`0XHmK .+ppd |)<0N  \K D=zeHX(?8`ˠ!yAGeA(HM<>100񷗀x`İ=iWR~JⳐa PNB@PSh  dC u`r0c&jX1xF4`B@ S#ˆ% J)f^pފ<[lyP0 <H! Ǿʘϯv]>LAJ~S?5+̢ ``Bӓ8$}R6 +``(p6O)_ `8(U~TĢ?O_w߿ a_VO<*~ /4 UR]`:A +6OKF_`: lЍĂBwNR?V! T`p!yjC@Qft 0 x(W AT_I ;,% $00= `IJ`B@)@ a;Rཀ0`:Đ@W!&/堆 Єr"Hh#O%hЄ X@. _"t0C(KRCq Ճ$^>KVEu) {V#h1T|>ώ /*zg |llI?#~9dq c(`;$6v*JйPqP ]Q)ݠ0 x$&4Tx?J?o8 'x 8S@x0!iEC'Ui0/_'N0P L 1900O_"V@p8H *ˋ 7< ǂ@cp/ @@`C@Dx@)(D 0##`qp'@>@RԸ@ @nCF 𗬏,((8P=^@/Uu yp `KSbYyrT U@0urի'7& %'}4&@.+V]4 (@`}?Yxr3?({U?!+S\A݄BK.H_E!//z?W^l` w ^K\pz%M 5X0 BP"ަ A &  ǀ⁏K2\. B0j˰ {8_j$|%H~ h<UȤk@V 0?J0$A8?>;@8t2 C`F[^@ p , `@pAd0 b`HA <`B0!`#E#`K:Op *@)< pAP@~A@Pa"A> \ AO @`#/ާM/QeSR.O) \|p0@`R 0@R ip08A+ pX9@`3Ă V^>wXS%$!p %@lVSV_D9 >~G 6`(d!((3Lf @*.+ @ 008ǁ@\~ `@0/4@R@ԯJ`Zb 1`4H./ .-@`}@$,B.|HUTVm *%x3 CCM>. /-s0䄍@ 0a,00=x@b@ŀ }-  1  h0!l4"Uy?X rjc`6l  ] ڙx3=bXwʠy!a~ %~QSp? bxH0yEJ0JP~;J}& VU(3UL| /0?*Adh U gJEQ 9~_z'Ę$NCL >G3x~5@ K/OxxpB_M#(/< OPO;(  oŐ0!?1n^0_*ڰA{xC< ^ChS' `C<,"T/T5+! AWqh0aK0_F 0#0lyf4, 6 r荠v  h0H0!/tʥ $@5@:`G_ԧB0@m? "BU?*%+AcTj='h%E @|^ u$*cdIBP01]Bc` I0I A0 `0?^@"Rd`;<t xGG(H y?XUϏ*sX |\LIIc'EB M\ $ 4VGXA]Ga?7j$ PC'e P0= z1XB(D*:0 Ģh*iS~ }UK}CpY2K<$0C. %+ "ք w$P`;`y$%]A`8%T` Uz=.8  (VEJDkծa6J%\`;'o{DARωC0 TN)* FJ6N J+AC;-;2:   J80"@CT @JǵGZ T`$|$%?KNJ[n 0A`  y@:  0@ `<Ka%`}ǢPĥUH0@"H0x=T$ ?]! ~\nc/WȬymc{@y@Ԫb8eh  |#&"p ՃK/0A x0%b?@ƛedψ 0.C+[V]E1)UQ갿@@ 0Tp0A C }TH0`}:r@Z!%B6q0:P B˘\}ġ,!*+T)v]^>U 2`x<pDC34j==`m_ nᘰC*/? `1AR$ASPxֽȯ xP~31 0>uTu ة Ձ6` It `<?(9f 0B\Չ]$UX0 xV=F| Ayp>/Gx6,` s+ 0 P`}ji)PЊ:aA"\a Q(0% !P /* 0y/zU[<jT |Dİ`tV$8V>"YNA4J0? ;%HJWjx1,m= [ @p~-z/H?`uD1X2T0y\OGʇc?ʧ>Xa* 0>* zUu ĂhdTH1ׁe "P@VKMwSC4<0HUJ} @tHBP0_V %lhwx?U%S<@_84߁``~Dv1[RP/;QWA 8K`C{*dpA#9XB@<\:RI BIplKT$!@aU4$ p% ıYTHlej#S8&. $8B<4 eK@ª^_& u&$ tHV$0<@~ Ԃ @` #btڌ2dP0!:~$5 ‚J/آ`6`<+4 `D  T`: EKPz#><o<$|$ ?PBL~ 6"PC/!Lװ`4   U+R ?("rb4`ȩXP q/r-2w7eݻb`p.t`˕0@ x`}r80H#p>o *`t {tPG.Ā@/B!H}`0aiop@:b(0so B@ U 7T@1" TX0>+\t!B`FK~=wx~'s_E/)?rix0@ URmP x|yGWr P`\ ʵj_`UO+.@0pG* Y,bV><%N`BU)ժC`80  8K% TN`/ !P=.%!ՑЖ%17AX?>XD`B |;[皕* c|J0~ pX0@R GL_5 ¨!f=A#`! pImj.zAUA@`G}_dKge4Binq@š$0?>z;g(8`I   `히^Չ@0uP0ߞHe oˇ> PͨY_44@`?xB0gyH`0 1R @$J+ 0 0#$<wW-2 `{h0 xIz8!)tbY<3,o D!_V_K%@m~, ~%PQs8\X%z@p0@]ɵ CV /RK/ν8@ NSrM`a ` `9 Q HAw _7<Ax@0A//AR 0P/?G_-IO㄀`94 x0>T$*${rF$ AI<| x  0xp`[)5RI`B 0xh{Gjop~GKt>̗P`P: WAx=0`,]gUG *p 0>|bꣅʼ]L`800"@$R#O}arqV ﱮb`7URAAbH%x!*V% AHRv  V˷ }uXy0>XEߢA}/.0 5& 0yr! @󀆯"Ж$!WQNJI \+B.9SGxB Ax0 \}ϼ `;A`DmW _>VHg/hERu !$σ\鹬o)>@! / BW K"xnH8 3DQ߂]TIx0 8$>A! T VzPQUeObS6c P`Jğ APFx0 " p@I!pk Չ!  ~V|^%< @< ެxy W d%e{CIcD`~\R<*6\ %  h @WTթS w j<$$ <g`S `yH h /| j`1x0`" `< `ArE:!lX0w `BKP <bP$` `U B_yU$f/>^;V  LxS@ @`D `;B(Mw|?`xU.' 0!E%BL`44 PwT4 KY >`6 .T^HI`!%/c\ 00J P^JHA >KxH# ?J  8{GY<>.H~D@A(`;@<>Y= Q{p0wp0#*( `;p_t(՗$W(ͣWA:sA `<ĉ`B UT_V"`;pA=jLJE!~X 0B$@B+J!xF"Stx0!H0aA awĠq>~=0@` yIP`<`Z0˽|X0@q ^$$= ~U34g r`<`?`0` ȼ{T<y/\@`KĬh>0 =0`*xt?b5ġP`|yOpT`ĐPxuGX$#5AB0?p٠8 ǀ=Yr  fRڦ؇ Ho `vU$Kp(IB\O{KEc6 `6Ā`B.z bpjt 0P0X'8 @B֥Z0_g`A>Y&nT/;#,~@`< x!`z= 4}yGl?T$|P0_bZbJr`0JՃʲSOA@$ a}p|ꖘ< 0` oĠo02 3.\!q l..fe~_Kp=O=(\xHfKژ'33 g . ~Q|(0@p00BH$a1W9XUb`D0E$U1EX%\\||% ʠy `jޒ%"b܁ЂP.{B > ӁGx~` 0 AHr@%=(yQ"ACD&vz6, xQx0? C0`p !_/Gv=( v\4h 8 O⿄/wmCj ` AKJP`|0 eФrp`x Ah0wՏ@)'A I݊)zy\? !_+s2u~u@( 0 *} UQbEϣ`0n@2?`p0?9ƒ\ rB͞bzcGXEP0`A<򤞀|cwX, |oU)w 0(A  jĶ^| 80.@0\,E6O2w@|TA /Cu`mYx/ϭqw l :%TQY/@0`fp00v ʁ ~2aG7to @P Q63_0@8F5 ,``{U t#I"x0 x0@) ⲾcU>&~l``;A"Th  %lJT$z*fP+"| C+ ?^jй<   D"SJG^@`8 8ix*u{ @1,kZ?0`Pj|vE[a @@L%@0>~0P4>T A@ #R>UJik mkH@@Q`A[Jy_(}0| P [ /`Io1a 0`</'d 5B' Oa׺1e0>T! 0W `{@$Ly`G+F˿_ 0\ P<=ba&`0=$`t~KZ`@8  {BI8D`+x hM^PS `9 *k5̿r\` !σ=8z `%wO $ ?ԇ0tz4_ `9ĠAAD aIV`;A*xU@@`4ߪ4q _ox PꕏV<AB> y(-RWǀH1IX0@u ` /`}XH#I @>V ``|02{T`h|]U%0` ` 4*X^_T"؀`B`   PVQq]Դ 0Ee%P?$*V (!p*ű`z % `o! A 81;h 2+e n H@P`:PT1%g-!p 0>A< H^ ?U^EŢؿ]ZSh h0w p _|g 0 tLXz RE{^[ rS,0@ x\$h!+]V`K`<9P$oTZ-=P $*ʄbYpт8 2X0eS*2uY$h0!Ġ `6Ad oň` 0RS*-@40 i `t_  `V%> h0n&gz$0`{t b Kw"F,`A  ]PeJU`}激FK5\, h |   4`}D(I `< x8Q@*\3z`%/9V ~+Y P#$0p!0|c a@չ#+<X8J 7ƄQq}.Q@"_įAV{- 5z'G㨤GD{ҵF@Ψ8_^ +XfO{7 NMti'~>H\%HGC&xF%@|_7d1XE[o,G2Z1p}&>' h5u]ؼ{˽GD)(0<=xnY3g!NdZ y7VޓsA=zޭ!jx ! ?$4X<}b T7Vi"8@g]@0` 0>Ǒ=R..`!E>tC'_JVsJ$={{3Tm/oa{YyA$/>"/_sx>GD=8fsaqz0<*{-;7/ Fa3{zZ:0R"F~mL*2YI`fyaACSa 7Ӹkz'M=xp4w+, גu}{}n}XhPU> DÂ,:N)_xg‰#Q͔ [h#)1X`/ L HƋ䡚0EbVWC`hB  +r 1/ y sOc=61Wg'0 G`3NTf^Zi$mv3#u梖饜W'"RLG{V.EINcFM7nr'γo! ινBB}4 8|n )YS6Aǽ:Ly|O Z܋##>X%#лK Mу[S:F2iPN\8QiKdhbUֵ|g|5EK\N-->;|+#Stp3x 0'ъzl<]QM:I?'GNOLb?o΋."#4ba!_Z#/ᗂHrLBDi׎Iu"qpog'}s:cu)Z@#e&f DQ–sc6羔YՎR/*.-=uPD;r绬\:OScWvzN88MHntĪx3>WOPǕxwGO׹ |8:Ápp?L sv(qW4U0FFт",e?JJ{50ΞEXfi~<:=qᝇƫ6i>O8"~ [":?p8oO|Mlb0/zxdz h^W*Pt2#V%hvSzvif8Uw 4\"Qד8F^?iF}(\ E *MxX&kgqԝ?OZO}RGMV#||<Aq|x>PH_U"9r<2pds&vw.2EM˔uOBf:"z`$AYӓYpBxp8 aMd%88: x / OHW*0"x[.j < rt_9=6 O n<*= I|AN IcP:ZH,0u9k}2c 0@ 67~t֪7= tj<[* Zo'g<'_X~*G'o \ `,!+P?&.y@ Nw=ٖ ^ i .ӣ%p/ ބ'}i𶋄JC0w J85zs7uӈvrİh# OH8Gm^U!sRG@,L ?ӥ>'6:=Ly“v&8 `]'U@ZfSJ[(8$ ~0Q&<>!)d2mV%^NHtIf?du{{}sO7T=*b~T|F"l %c1F XETR_t缨5VHbe Or,+p z 8@J7 (:o{[ν] gS7?xf^f[͍wzv VLjMN&6 ~$\-fk̫( :v5GF-#g{OpdNS {駷TF4jN9.}quG!9_ mx4Isn % rOu0q}$-=3n7>3n}LY]rx8h|D8u$jUgBh-I@`  Ys;eRa-XZm~: Z՝j{..nC*i忀CC9_P~}}LS{t-}>|=P_E|WLH{|m<6=p2zGI$R/ .XLg 3ppO1UgJw+fQG ޼ecwV|Df/ 9B8_}Xjx(z}@^J%nݤ|~:G]a b'R?^){.WK! C?(cMZ! z~&gͧXgYy9rzѐa:=8G5:3ϗH8 ē*ѐ0x!K`!*MF/.Єr3 nV DC9 ]q4R ґyIN B %x+[25pSVߎs9*t\|@Ii*S<Hld 0bQw AK} ەXqHi)\!8fϠbV6E#UUfS!J6O u(Pj'G;]tШ 0ni{tL 8sN&7 ʆrIF.mٽVµX O<.|]3gnu|3hnKƆd͒@Tw~Mņ>]Xk!`d,J 8(>oi_vڧ h{G{ )Gs"e8_`sY'2 NV\ۄc!͂MPrĖcw9oOnioolNmQc3_.eI_ TGb.55jPI~{2Fjnz8r:oyQL J 8Mn}p(eIM >B1yN!f")|C7hH!8^3F!sl*F%wdTb8~P68 CAʻYO? ¸o A{ă<2yqp-&5L@@ &\Op' >f ~Ͱdc{KC<&$NoH d3ǥ 0L`4FB3듴xh3{6K Г5£if`2?&BF62N2L;l" љO0xۄNQ=~OmQ/N7{(/Oz]d)՗ $(݄g)7! ib-/Y=lX'-Emȶ6Fm=Crhҭ*\#";+elxENTQyM d@pdy : XIHH;,' 0f؀,gچ< L-Lh:&/7K2#B8@ɱ?ޢ-x^9{-?#3h5k(L4(g ͸4gf=M"}Qg=ϲkތ?21~]OMX8 kcVO>zzzO:Vu _.>!pWP˜% ;{{"īӓݍUʋǼzj??~mUHy.ohX\(W~~yYt*ȦNpBLꚪ|/pK_ yU)$:mU5jr~Vxۜ.aׯ @d LG qh! {`%3EV^>K dJ{.wġ+[`#RuJV""0ޜ_Nd>#rAU*.7ox}{_\kzᠣqwlnL`:BP゘5 N|'γ%<.[8 #{\'s;yOO6F8L*/a0 {40IUU\owÜvkF0į摟 b-9OI΁ ψ2o:VXmoo{[5 qpءp8#7j /{z%LmRX#|j|æynݷI齽^}8ǿNX"T?Ro`8LJ5U̶ű$x p<|L£+26p_+T2#4~YiN$wm m|f4qVEǐhX9}xՍӏt|h)E1:7#NHIΞ'KGcϢ=p@n2c򓯴LЖɂ#Dq?B txRr٤zJ1W{zEWź`(`ru>8_F GĂ|%h0!p0>Sb@z(˳yYaYR/Y4;G0fy#;P o`2O018*)pDk<82gpd?pd!'XXq p8@B1 AtJ X:02 *kWtRO\\taFwI#}y%|N> +[ak Ox /DJhtt?PCҥ.ڣYHN*MrAx$~<~sim&Oojl_fg\9oONi},nD4Tz^4T~1C F#lf4jWxd,CsFŒxճ:>tn۴p !Iq@pa"6^pD>å)RVimWm9J7>&5[xBs  {e+ aN@O/EB&H7 2sukoO HWrۭ[s;0nnv$n7-јZH/Ҝ)UvO 12:;}.3Ւ}!fcT0 ľǍTbN/ᛙee=s=&{{&eXi0gz/;;ckp  zOYc :*t:\:~<>4+ ecoS885xԉ'\,2? }Z a՞{ʸun^ ^D?}~CJ@ #r˽| 8*~ia[ g03MAXf#ݮ8CD,2/!h?' +[«PM\rƩJ_000081}vўp&Gx [ߦ yP+:#b.mhU̒Yx n_u:|xMz)TNePpF]to=<ޜo?4jxG_ )yUsA?=Z@Pu\ގt5[7Yj1}޶qA7+[ں0qw4ʍ4u!â@(ٷI:Il!܋OyV!_Ͻj㵀:!?dmnsd`vu]ўМ3`مs|EƄvu3󂷀*ߴ[Q  ux)qgdMN' s"Ozѿ%SA4aP=ǟz=Ya=06i}{9cxSk{=qa2FXFqSa#5w T?<}ϻGzyo;leYάS,f3n=F=% m}0\^{);PɱN&+diEs$-_Z|3 ģAn@ 8<"'X}Ba4δd]OeB V:q.?RHypiy&?I)2aۜorh Qoz'a87olD>r_* J. _3wTgN cUF%Pg&\!P߀KƣFC!q}+Y3AKrUAI*$*-) M˰ϰʨtwRjπXӉII=g'4э P3 aeo;ZF*Vh1(!sfELcZ@#'# D]vU̹<33 No:cs;Ϥzp@g\[xe*MiM<<*\?`Ģ=90 %2na<7Rg/.X ;DLZQ%OӥCŒ !O/(Jxq (0yQdZ|We8VS0U/F'J)A[#j%`}Xa0+ЩY;¹ B 5 ?u+Fp3vѡNk{ߡo1yi:yX,6x&sߋSռ33rfpM_Z !prB*<=G ]'ÐL1":u=DpK3$Oy9O=WUq;e3 BM IzǢa0>4WF2pvKG' 'B$ޘ`2&i_7-4lD"HXLBn3U'uh]'30$ul$lJ氕vfglB8u`]ĐbEHfu]Ey ۉkA\詝|B;nc }X8 l?"9<;O>ﱹ|Ѧ黜Hy:y<2z.H24zj{U3)41NOO߸}fˇr?t"/N^} 0 `  OD/W.1t]UYJ% y nئE/Q[9*>D mï6{ʽ$`j?~ ’W࣫| ,P/횼F'Kj`@eNƇ"*ۚ*Ιo{sM!!iH OEQ pՍg^!*i]!, fBaO)u@s>$4'c> V"XGt (8b*nƜ|HF>(kH̡FyrQzC4ےoq;'׆X5kzx%4o3lrO=dҜF'j\2 |>G{*BN !1+'zlr#r b0ȳC[z<3NL mcpp 7_Ep1&.@[rxp,`Ӣ1Uneن>Whxޅn0 !}_\c3'˾>_JZDڀ M0͈KDXl퇦ڻnoM8_IDŽ0OI dgO Jq p`ĕ_\KS m.m-p )K `:B0t/- /͠8)%~ZD=@kshO&ˀ_cAL) BH+V]]BRGb3J iHV] #QH2'ULPi(rЖ?q3e*xd9& Pp>V|O#p5GޟJU_1,zI,2z )1(u @UF98t &' B@t~1’꼤xOcAsUJs 0hu6t~>T=L~[|xd x)wа3g -p{ķ_Ϸ)b0a.P2 K!<}CsۄM}A2RAr>;0".~:2RC_Д%+Qj3}PfwD_~2(Ar.gx:CS /><:ˋ{j i02c;of"5 2UtOe=WTyd@ |~'@BxVS^E}WvJF e>xCTPl@} ~ :P hf# bP0>֞ ` 0 `p"8ar 9( 8\kuHC60s a*<30hXd~ Ov/ ]U=pJO<" dB}B&`0`xZЄ;H(!`LlA6&B8112q3B+r[{GCznwq*'UA跄TJk$j<|G?o⟒pS4>Q4YZgߓy8mnPIJMBNv+й̫ڹp2}G}gQum`X:4or1<;sm\,cFD`FE=U7+ FCiLeӫ~-d%p^_&[xR(1<cO1nBZ/0h Bq'П$_-$jL.G߆Q.kjM{D (Z!3;*=EzIOi*b<Ƚ>>OT5,:A~:zdِ8Dn]qh2[YǀZߺL}>(b0 2yӋ ނZ3G)ȷA<>pdsqVkF5o6qcqw6ukr#I)Y::UOYO9MKYzvgs@5w yJ6uc8= P8?xt[>ڊqX(W-yX/MwSΆ}}}qlBW*p? gNOǏ*F?>tNorL곁x8`}Xp?-p8BO*n0e Deꪪ["T%btQx|w{a-> 4>RG%'R-Q9=rĤ?tP U-'Qa@ P*?o~=z^%W!q1]}WST Ũ8mL)w{_1?h׎q]`z2>#V|\ʉ;?ׁ=+2 C.CAHU!␍j#46A}*UDu^_Gh*xY}=uR{Tx2TuMB!~j])r-=l$/m$h* `<\%@][>;.tdjivK~p^Jj<t/n8#,L!&X&9 B8pۄq@|?9.9d|P Wd%(6N#W\P]Jzv@C(FH&oLLNtFFDJ:0^K / Y*HÀ$FӉc&–aA/ZH/0"^Wè]UZ<ҹn=ǜ&#z%(l]T'qkV-'/"e<%O`Dy{q@ԫ !p] a `B0>HB,JT>4pJVV\!Y:sp8ݯΦ9g¦Hm9oYq} x F@t7 A_8.8 p8@@2(}!W-cنnoM  N* %g͈`~jP n?FW44#IbWY_a(Sl|~^#?AWiRZá-hfW2JXAQ&w_v 80(4 vݸњ kӂ b1Ocax pM@ @Fp O;v|U|; uZT'33$K?pRÐ3 F0SHr3nyLi>#&. 2~Dxf C(y>d24Ogk86şyסB x!a>d\G/a䂧50- =1ͪ<?s l㨾O?pa>󄰂)D"ƪ:;bpPK*na6 %:f3C/]'[P=O'P:<2 " 'SSq\`涴QeޓSOJx2՝U;<Ts;D0Eyi5$bb NhEUȧcˏ'eFj;i&idSy9 M3C ׳mX0cg0{{2!{NV]K=.BwoQu cqORΫ; -wC N?#8jp}u ߨ NTU  j9ǰ7PJqZ;!ʟd-93N3,R`w$lj^K Qy}`@P#lv'ik{wJK^ x)|QOkOƇX;l(PξKj\RXYO#H5}Ճ GwH- w;[+qh8@M})@V淵CI|2A^ZtfmorÈN#ta:b]zIkA<۩hdqSwB|JS?ΚzOO*a@<+t gpd7F-q- +E ,b #O=13LXJ/OURu7N3ђxdb9ᒁr|>^LXF # )%-AT^H^n6 H"1"+'M<کy|?gĿ83O|QɎ|.VGԻ5*N-WIsr~'f@)O8 S Ux0E ފ5./>ϥ hF~b4`yES%#U=RD:-4 *HtR,Jx+)q_R _ (,Qjf Oӂ_Ke Z"sT'T꺯(9@U<*MMU\lL\wǕBQ@ozۓt~@&peS2apG_5}֦HC")Wu{0$AV0exHDE+&xIN= H§aJX-BXED߳0S{ܦwks{w2u2k xdjv9?l$  `}>>]ψ@m@+|C a(! &J8BDGORa? D[I[%,:9RX,G)Nn{)Q C67 W6l)2j!O i}rfCJ DDe,(j>|K΃&_?QqFV@@L2* ,wox(|G5޺p2us; CA 8pu @r|wQj<ӎCƎRM^ K`|)h`xh^"4H (0=?0A D6d`?G/lbxC J}z_~:9y ӷZ&k:*@8!93yx[zHl/v00008ITsŀ8#H `<.ESA$`h   BP?!E殫l+<)JqmxH& p)II^GTX8PL#Fi$U2@y`BYzun Jʒ6!jW@0IC"Db7#QRQXmUkW\X^YxBԪ~F(>ۭӬՁ^nWI5_JX1gkޓz5H,Y0[Q.Gg[x"<~穝r>)N7,BrgixpҞ9ӢԸ'SUӃLlc.&# Wv<`[#O <q6NHL@32t%5a,@ᠧºs;^hGI 0u=#.ba~52('qʑϼHfg$i0N~cO0R R( U4g ^F^jaA+=% L39Z_Zt/Β6GeF &CpZ)pG$UweaOɌI(>:~igz&V:uw[3ci@d}RǨ$}=`S}o0{ޫ[z{Z713cEבiBK"WM+&U a:I 8\x)%(dd|Ā`BG`B'h :|_ǝC\ff-oVQӈL+3`;Dm8g/t0Tp5K/7`RE*QpO N34t8±*৹Q.QU{X)X,:CMά0N FmR>*lS ޶7B/r-W{&.? [M7)1C" 8˰5̇褉sN4#$x?qxSU{A'@X-Ѝ@(Si\릩uxS2$Czm{}[ PgQWX8t- 7FIL?$@a8G@.d&m8Z K02q1n),( "St͝5 `t5 DD4sov:W @$H~h`;AɄ`h~;;G|:]׈‚KUqL@@0ٕtGZ@j -d>=Aq6`\VxSe ͬHx/cDJ;Džz}ݧ;ZqDB@ PxhP`͐ !K0pD _ (ɱ0T)L|`yt俞9v q_]U}5.E\aE_Տ?E-wyW} ޘΔ|-gv73y0Sswܐht-&’K!KòM}>lfdba(I˰ Qr{xeӫO7;DRa`wzW~Fj*feg?ϊ$w_طnz|+س'DA@R v(..ިX2A/ބ77<E2 ޏꈜo.6!K1OﰜOE#֍v$>``}}z<2 xxױ(%[rcy^D$Hc9yVpžku<%~ );G)5!| w)yI![ܞg$"r"syl< *['';Of4zz<('P3Ψ4)ugzBH]T=,jdxkOseS:Kt5xgB]ή}X^t/ ɆAdৃ$7' BA )G8"2C/./+GJV/W8~ y'=k/8/̓ 72ӣ0d%Oժ^t=]F5g(2k$:;ˠdC7ɼ>4¹NOVO83>H\~4T_4y#D.ƠRE5/8)U.$UB1V=CtNpF͊R]LVu/`V)21E2-3>#f;5C58,>=IZ -K>Zp-}\3xa6)oo&7'cr|翂)}P! ߟ/V"}5I.G/iU9jSE:ʩN L DvG\EHݠv53'#x2%pwg%79_?[6H?`9 pVwDhc?*< Ch&P:*tIE c20Ӑ؄0L`C9x j'0րCNe8:.*ƃ&7-.N8~9}B`'g O{B ~Q΢= ;z]P-> @WO{iP" 4>@>3U4I Gn2 dXep@‚@(ܓ &wWnB7 dP1R p*68(*Ȁ0_KW`<8x<PIf# m^~'%K3ȹQ\!@,CbX'A8&AI}~!0hotxi\3i8$%$l)@ =%W*8p|$2 V   ĸ] )p0@ xW`7Lt BPO%P?:P&߼*838E5ո0 kzhg@xb@* {*.iB?msbLjAر`gLY8HOPC 92o8?R|W!7( 9сЦP`>ZO@=-%P3@sFJ_;L nj-f4-lYnۤ8vFpgx5 ѺU`9D'}j p.R᠏VIt2U?B6{y9WWf@I`6 9NrIScRijoxʿ:zajۖ4HGJ!Na ;+)d{kDwN>~cg(Kcr>қܦ7w9=pd{~9no6x8@K<꒞u%)T n!ÁSpN; 8ZrS oB׹4>xffOO8۔3`Ⱥz=<_hSF? ½^uwO!%yY9ԛ9O%A8Mg |Tqwl5MS~=}S"0S* \ ~`~<=C ,'2/?E3O K& 6zFF ,UΜG<$C(/K~ aSr}ʄ/ko{;; 4g3w o}̚&@ބ\0o:ν^i9ğίOA(~$x{` Q1頇KFz+T `7R>V?`u1a'T?j+z@=nP?)ci`~|8xgQ.uIB77󁘖<Ӥaxd=Ys-exG@-.o,H~P$%zoj:nARV]PrN3D9i% a(AɥY` @bё7z"*q65bzlX+s!2 ΰCN8PbjV)E*fu7|8i1,3V\< oz<H<["̈@8@CJ^*i˰Hcj=-W/SP{S;C;`)+C,"p` ЮH ' v ,zM4w{:6%ÏxPM6hX  r[,h(UW>0^`Fs\m+a(@ ~xQ,LY֎hDh"#Gѥ4Xdrx8p* մ.>#  R Ax0 ہ4C_=xeL&8 0wE x~3 e`3bRN5 A;΀J}>"02:'>ha(h2;Ynt;6a(3 6D@%_.RpO'ث(UD'>`0`|Ay\?` C#&0_Jjp>ڸ@ qQ, ݠ0` %`t@pu?/Os $2=BSNspʞ K1 0atϲHZWOoMّ1c Cp HU<<b,}Hj9@R*95&rO0)AOkCa?V8^.[z=^ ~@-*ps“.CA:F\w9\LΐQࢽhttBa"YwbB<؉zh" !( #6Y45 ШoCb_pxGiN_YgIZ7o%g jSyՐmEK?g!xծ0휓\b>q{ܱxKq-?Q>/秗`}SSH0b:;8@b_nb7/=`eCYDCOJ)P{DH@mKHϨ 1PGxO`}5@(ש~s{з^F0d˂<, {ߚx>!g/0<< PC0 //_e1,vq-G@+M^ S8SiJp E`sk%} [ΫoCw=mokRz Kn:fI8taxpS b@Gcʰ!1'~I >s$3bN>2 A< bA~zb1n`xo3//Lq?˸rcg[x+4Nl1/4s[!Sr{۟M3sǼh{:ﴘ& Յ3 J1?-輹9@Wd%ǛN!;Mw  `^B+9Q d!P)#/F6 AKuf_[a;а3O 53C͹ 0͆oW ޓ \k-W:rzQI\/ug=wOॡ9`D_ra {\ѕ%8@dU408#!b2o:7p[k!'\>H8}!xf2's ^ HL%2;0,S&a$%/3zj@)REAө'z#d(Ɖŏ'0<׺LU$O]nˋV2ai 7i!:^#Z@>#"OZ2Z.I`$i>2FV}Pg^W#~J*pDopͽ?ʐiiVGHޟ?<0 (P55+LOc]mq;aoɄ]t1B6g`l," 4(שVR"(4><3Eyhrc,ΌgS!Rk7]Bn Zvr{Š k,cP['8z@! t\N3 jlj˿e @!הddj!8*/PQV!J#tqIvqm5y5C4Dgxf ozt<'8cBsXf UTbwqbȘ2Kι_usݴG0Tk(# Da*>SG:pv>qtȱm09U hEU*zÞ^9)M}`f@Az\h>ȼ舌t@/o[: O9@AJ1X(Q=ydpj3 htf\? || >EqH`iqh*08fB{ޓ ,3C=>x8laS9#N?#K*G..D[!p H{"^!#2$"$U<8h&.H)W} @kt7  Y o}.mk8{ޗρ׊x LDaL OEE^Q-|;ۺIU)xEZJ>A`<®:l{!*4/Dc@8<;nz`B%~t)0SNpuH'~whWz~ Ã_ޮ)vp pkDbR }q$Fµ?U%EtL/I鐆+.6#Ap! ߼IED@)u ИN7Cw~Lׁ @*KApdOGxF&Nʼo DˍRBV^LVR8)@1R?+:OM'P_./F85)@aPùHg_ 'm^ذ3 @ pO9BC<<}C,  >>z ,' θI:+ uˀ22N|B^Ds!u&$ pL$uq0$K#Fښ5Py$))_xK/. `>)L23 dW ?V1P/L-l5}\c#{=tn۞齵Os7v/0(p"+n5.rg_/. x0-$*P9 2PKr@۶:NݷQypbǠW0`@W, q"h'I ^ 0lCR 3fRF?w={ #DN3+I28tGa=\"z_sIWf"?t{fmf65cpx/n!݆BB9xtm﷐~dD:Py`I]od nWs*$-lo?or9n9Q?ug 5A5?úbE|ktZE#S1N 94a d  zOC(w¤Xfx3Glh0Ois0o̷cdK!fZəI3b-k}+g9Űh5Ԉokj,cU3+ޣX{;։&m`wXŞi?MՀC5#d?n_{9DF5Op?>!f'tp\HS*(ȽPd#+8̅]<x'a<:* }"5."p04H.p>xI+B/{2eP0_#<w l\#tv,}:##Ƕd0fЕ0'՜Vy.lf+}~s uO}3g2Z^hS,! yXzBw1B=X U6O_Q-&D`#;T6ĪgeeG[38PS-aJ =T:TA< *>xY`_d^pq.MΡoO p_0)}iF˜Q"C)9x#Bߗ\F( &+T=TE|"V$ʨv>`;G2*Td(xL_AMXabo`RGoQg\dmGp5Nmc3 y?o} SpRРeY0s`C;A!):4@!Sz~638AV C!, ˕.j }n ÇBN)t#jq+ 9 BW 8S@ׅ;qօBѨtP @o'**-(ѿ><޾2Ygs6NX:O 2f[ABة !8 xdMk2d)>h8 wC @˜%Q@#UH4 4x-#u<6p!90CNu%%?} cI氄hEp0a|(2:?ˠdym, ` >:f@5|IxVWc>zo{+6d(r.2z &BT- ѠE 6wNF0D`8@}Or@aLv +^p0LQ<!8=xBϵ0 ~)/: Qu@%UC_i>Ө;)o('x!J!V \_0FLv7 N}}s;sϴ6GSޒs>ijQEH0j1i@@4@) 8_=%l"+gH, 2QmdxwF@*IgpTK)ln;Hm}KPx oai")E@`9`UHԢbA?x 60‘&S頧煓L|E 6x2.4@("ݠ9]\L,`. QBQϩ>MM#Ʉ%脆W AIЕQ*X[Чd6øw9jGv$aTI>8񪞷D탆RHdirdh]b[5{=3d^B{"51tD3޷CKoox]051L hwDg.Mn;qɩQ@]0*IΧllXa. Ҧoy0I`x+4\l0L)o}ͤhX4O(3k4g8pب- MJƁq0е' QRr?ks-G AfৌzٰED,Ehan)#Q &F\f#V5IŠ Cnhe|_|76/<uXZzz0XBi8B?OFDQ uOj%r"a#MYH"OG6,J/yН<Nq<3oJ1ӕ 0 @xmDyb免v}N TcTjB~l3¡_N7ျ'qxeJX ?`Z3ma\OäC\T# !\39>!^f(cph2  o^-v#ؘVL[M.RgF58Z19(3`#/dJy_ư"`#HPc$GX jD3{<6g4)~0/>;}>,g̮a'8Υ{830Ds:adPsA_(VP4gLS-|NR9H8LNcT`, LYbn; D{u}ШE0){* 3'pGa Z$h2q{(2'NjLv($jf*yNqsOpP 0`u!(0?| 0p'8G+ |??+PӦW*y}zE{ަunIPJ~ TW:7F=林fp~V)H299.0>: oս>"pk'L' ?1;.SVϹXgUR  ># =82"XgiBcYb`/ C/xt4 V+t#]x6E[0_Ϧ|2k}۫۝}c{y;{ߦ=~#KQWA _7F=޴ W0bfˋZ)gD]RC^(x'﹧~3d}1@Rw\+z.x0^tFLFtH'PzxU5w}Q".2C*N1Ɍ0_{ L N OcT2(x 01^1.r{Ru&\vGnɤ-Ug0#L/sxf {OL鞶Ot& xLdʹ>7[rf pڼ <# &1X]Ɍpz1|Xdrݎ{M`nή'݂fiu_hɄ[*]:ːE qtHd_y;ѩ3Ƃ.pz :}2Q1m㡧$Ȱj|DxФGћ& FNO1Aճ7SL~!8::$V9@˞"s8di'os;z18ρP0F,k eN}o#k0B'0RJt|(k ѐP8N@#` ) 1d[<# Ub' RAA_, !p)ՠA8*PGCjpP,KCA@^, pk8˃ p"fAa\)EJj&-^Є3 @6@m}o>uju3$_GxS"U~y QRS>P#:5gՏ{`p=W$t>8ADot=6=Bcqr>C}'}GRBc%{|+JĒ6t؊8JisXe&C-)2U H zs皔S `}K4 8jT=}9< A PuįEAd$Ƨ@-EGSO GD6(Q/|+}ܝQc} #6-;じC Z@^UʐQD!G O C/s I5BxdᢥN_WǴf}xfpЖ}o;:˟8E} 9`Pʈ2 bjV>/]U ;^s8(̀*eAYP1NQ3з) 8@@p(*|$ 0B"R*ꕿGJ_|mocz}=K]8"-N7If]B領mHpG"TPF&yb&& O q(#x> ^ ._)ui"LdL>{60R.2_F3}8*>`+"_ Xpr|2Oia81ΈG4S:УՂx<:i.$-XxG#&L*V2W,6B3j $*$AL:/l&j#2qg+| L>NOV0b @/NXfܨv5}O:g4WLXT-Քn[H}r,GIW/x8nBSp}5qW;4<_ְ-=tOCuD#hIaKJ Yqp|ӓ:\tys\\~q :Sxヽ$D`H0t)|l/<=+;97UN<=T@Dd$Ά}#EvL%]Kt>l~}?Biz7X`ߐdH_Z=xB|\fA {ӳmZ `<(0 ⏯瓙 &|+ ^"0 W&ӂ$!H4 !  >?UJ4 SM܅OOs;O (S=Z"p|MQGd3Dl±y{ %P9ל ` 86vhg @ %}SnX`0D<K{?5mC4纶Yqy?ǧp"<•w斚mxSL p`;Q8_ xHUٙ^PViX#t=#C_*=@5Hjbsipdž"f# Cǧm38 2Ŀmvt~ Rp ^8lPwbnX&1P$yx3 fۆIЂ)HϫO0;y߰tVDDžǝ3<;=< dIO,Mz}ooQ5Y-@4 \U}E5k@aA #E[RmxKjrG05[J5h|=Lpf8m+;qT{[.+؂QHs{k%H2]pP߃Fr [5G8Q/ $/eo:jc/ 9'i~L' mnkpN ɭn28at*sIΜ: )=H&f)>p\qN49A  Cc+{aQ l=Gk#=O #" ˇs付%70,nN:x>h<"]Ԙgx2`*ns]&>G7з9-QC;GS2_=ƛ!#g}$޶'ɧo4pT;:%ቦ0&Im RGMhS2;3γXg/  8ga+; Q]dha=)9[z|3g39z5pX\o`ᥗK(x[8q~>%=s ~krdxd:uŰ^ .h# aKWLg^%*3=1,K41'>?a,^\u0 V72|J T)2>p@er f`T*Y9M>WBn ))H@ t=%?z,4WxgQ/{[߷ad!lsǀ<Eʔ_0  P0j`=zhGq+ j `ˇ|;/S/իRt|_^ *F.pt@"b lUW;2Cʽ#q'{ vknH[}-4rqSs&e< c-S0ձ\T$&@0x@ =WߎLVKZXuW @aA/^8}KGG`0J.0^Z % !*+`0åHt*;ނ`v\-Z{WfbF mvyfusnvxeC>ΨVyFUe gU* N!?TaZ{G$b JGB$CN﹛2B0^K59(F1U@$O M!8"Dx:}96vkee4z9Ըo[ N '`*j]]e98Dϐ zg ܧ G-R|! GPa[dul\q顏o =g5 gd iI08Fe.R0Gǜns:,m`L< Gy:ٖ᳡NScRX, d!t} T{A{>6@#Tsgf ;Wp$6/*5>t AiN3 yEi=5j:n:9XXY-4Ĕ`I,bj; 1V>)pF xp{= 2EO 2)s B 6`KюEmM uR. 0Eԃ0:Z]QQE٢08_ˇIw$'\#>Fe.Zxz^9OAdq<2" _ǢbLֶ a.5%8T #|C%Z>p2"0B!T ͹Q\g3IDb:珫Z4C\$ !s\Z ZLA,!*G>K{pEp0rV?9@/BX0y[FEHg0S6Tlt< %=dM5KGlpަ@駄bni`XWL(A-۝0iЄ^%)$ 8 z>B$o Xdd03O /6!@A(VH06^fE ˜`; @Y{'A.~;VA%Wڮ BLQ+SKXJBB*T*P`N(X.i2.T^C]#P@+4šشC —0N f@%G'J4^B:h c$Qx^9CH *k? D;U o > `8 v8@4{)p0` P9A 0@p@@$bLv Au\N^`B/ $ BWB%c**) HTP 0P*΀i@ςUUp9( xYf\xf:n:*!o`h)p1yuyi18o]#ݧ"@G[O0<\.ꜬGB# pf0`B|E^TuHgTl- O<xb6T0?0v:/:/u  n0%UR(@+<+6|IFS]J*z].yhp`MvorR{uG۔R:x`n+p\o}a$|yr6vI 3Đ8VM(,]{ma So6H;؃J2 T͉K8Ǜ/?/4` `ZHB]y`ʟ̼2{pe2 >_ %T(Ns8*F2(D^3S!k އ]LB@0%KOdy3b`'aq?Ȃ8L['FY ~ٖpv!wvyX~:ns8g,+#`:C X$KˀK)WՃT~%`@@hr@wz 80A yz*Wĺ+U?xV  `76/AI`\ ?:q/I0`< `v %@ƒԀw˛u'SR4? `~S^0w~o;Rs@._j ,_9_@x`:#ˁ;πp`W@e{|l}AT-0 H ř``< /4 E&}PRf p/Pe@ a]UB̊ŏP'<D` .{*2RD#XE?>LI `aF^+ G8 (` 4 >. v Ox @0 J@+ 'p0bX"WS)͊ 0^l! ş$o`  z~X05XP%h9o/VjP ^(`;`P cOJ 0@r9U  /@@?4 9 a}9*`N0`yPa=9*p W 0@K4 `<s@-2ۅ'B-VA. T)@#%#6NBp>"@{X0= H[p0HBV0=!D$\#"[M`:]Z$x $ "|x+| ĥQFV x (|Aү ](!O>{Dr8| I֗`W/O|߸JG`,@ׯJWˇջ:@a @% 8x?WTO{NY %0 /JLPˁVV> 8 $ɥv$o`:x t!x(S)7̶ `B^H{H2J^9۟> UA;x0e'B4d @+(/uփ4@'&\Vu0 bب {O| `:nAwp8P`\$~"PhT )ꋰ -8]-N u w$}!Q$\eW ܄ Y4yűU'@ U/@8HΈOK焨\o=`Ġ }(aװ`;@ h\RxT%sL `IfAH`2_-ә 2?J:|8?V [P>q`8Bĵ3=˄xK~`}XDaxCn>R߂@p|`*9 D }Վx}a~!, H0 `0V  ߅VB@0BXI| wr91 $ Yp0/Rˇ?{`G܏G P0@"ˇB 0PJ/Ā`<$̀]$ p@c6f: T`<Đ`!+}T{:iyrNvq?xR*q}Z OdlXBU$D?]OZ?  tUDorC x`*%.%`D(t %t`:bU *`}!sʴGE|`0v ^6z ,>?..9< :hK5POcdC/-`9>>8KcDEX qw@P`4AbMoՏ|.$OKՎaו:0P,ǠDb>O\f$!\ cÁX0bX0 Q|Yܥ@  0H*Gtgx 5PUh(S{ڠE.;>|@0x+.~ Kڿ0 {(@/H= 0 _T$+dGSWOsxQ&kv{_T͟f+.?\ĢhJ[QpxBob1(AX0!y~gx_b@ :^ @ANO*;wr^Y .T x0x@U\P`8Ġ`@ x *YAC)hS1Mtp5z2gwǷ4Q(|%;yY=; DK` o˼F50_%2T8c .^?~?dp Wd@YeV@wIm{`8u/^.T>-LQ"=W^ߧ^(<"kA~H `W3mr bUm96?ᗣ& Hh@![Ruh0 "HT+&0A|Ц@Ijx$Ҩ8 0 o*D֟LT w,H?RtDj% qp4b^U ʢbP*1 >> s7i0`<%հ`A gvyH0 t`yPSkO' `Ap? 0{  @Pf 0*< dcSjE2@`H``;by 0d$X 0ֵXB : 8ZBaQR#J*0 pP bP1`2<Q0`v}J%KUX8H>? $Iҫ:K>_'< P0`x+3C 0abJ`~E?R~)\ TU=(8 `x @0Pz?W_P P @||2($F>V   ]h@!ωedi(% `z P>K` wX0?%͂Q0`7]|  h, E}_(PDxdA萮C,ЀCQ$!F?-|(`}_E!| 8tN=VHUPx pB0!4!y|Dǁ/D. *`:KD*mQY hCT./d=Sޔ 4A 00?U?4p`B;>/RN0wxpAAU$+WďT=.U|@%0`AG<(8_@%QƓ0>%qr].B\0| @R!ݑ4%4`8-J uĻ_c ^~\~ `9<@W@m\$``< KtD?}0l x|d7~`A=.``` @ BTygLL %Rv W& *.RF=P8' x a`,^09gV1l 0`h`8 yR$n+T @'^a`<0$I.VR< @\0p`7 @ + bQ~UTxBV%1&.PAuo_WGt p`X^>WBG /]h0BG?/V+{0p v `<`0>dYxꃖN  KQRA/"?|ax\}H8-? Oc8pPU*=|` j,wu@YM߂00 GyIzx$ǡ PaV _  0@( Uu %.;<C]Z# xI rrL`A˧˙vע N 珼b00 #0 拦Q)P* ʽ#"|ryX_@.=tL= 0`0ի}DrHqĥbSf "Qz2(|'eS+"`Ģ(_2<~ %TzHR`:jP8%).TP/W)X0_*TV<<`đ(I=T˅vJ0v% 0 ꄰ)bT@` >6o`x~><Ӈ@vK!>A, h1?>蕸*L>y}'By *₊C:ꁀ>xmgP`7(~U/)N`0x~6+H VH&Ġ`0ıg!z>==D@5Z^nހC xvQl`${) g &((yC>` z@H!*Q"q!`:p] 8 0wL&o.:%7~\JG}@$|T`` A@`K/Rn A 0vn*jH$ 0`>QNn_> #apP*7BH0X0?"Qx+bxo M@‚0 ABHc!~`(  <8MA5` @<ǰ *j!Z($ySp+@vMH< qwQp>Ł9ߡp xF0r4Fkx0 PlBDVp_?W aXAGT%-AtHCK]s^H%Jx~#Q&Q`6`QWs0@cFP\^=WW ],}Ka ׽0  h0xfN2a``%x>bWZfr0 I`BK~d>m<`ETd76bh0 H]h3˂Ձ% } 1 *zPaꪾ$,@T^ !/X A!*EjPḱ(! zՖ @qAߴ_Sd­dP0Cjip 5_P`'Dp|?,;/^U^x`$@AU(~\`iX0X %T ,5 ց?~㺾fTC,o2L$J0BWT?24Մ~*Fx!~Xq;r`ϫaBWGq* @GQK8 ~^x\ v` C((#|4 8__Pb h0@T R2e-$/P%搼(@`8B˛ZH0JQBKKğh$X oձ:+!щ U}G]jOC7`B8 hj'@` <,BaUe_B(0J/< g0 _zj R*@/r/Ps?  <GKVW Lǁ]X0y KІ x!3dA\. 80!|0BUK7V > 0`k`A jbT gUF($z֏.S M2pBJ4A0?<c`;C`B꿁>`/>[{p4  V< -8F>W@#Ua ~@T[@b`x qz h!@`'byR%azʯ<^x\$] ^pK` d#d_p=p@R`A8`Jf > A ,58J/4R  >.cV:?4`8Ϡ :o΁HV}F]4!< U.p@z0 _f B Q+4|ܦxz.P#`:H0!^/e:0~+dϠw\+./i >0`<ǖ^݌ѣ`:Ā ^ P0J$lJt`A%{UR+]꼑T?F  xb}dž0` ?|Jq@DAz8CT}#+q^İ\% @@ 0QUW*aU| 1+V% .E@ISZK+5QeπHW<ZR?կ\??1bDAx'q*(Z0JK/RP8yǺ x0O /slt)W|1(K.PTv;~ah/i aA/8DC`9ďh(  !ϴ⏻XL4|apJ?)@@C4@xQ%*~@0!q@$xFU  !An 0 x r𖩬RUBT$xx>U X/B/HJrD`:NNJ%2% # $(*hU%\UJOZ X0  |\%~d <<xd `[0 P0c`S4L}@P&?tu՚,9R`0/ͣqx{pL +Uv?{rz `; V%qI# H.SBHuvDĪZRrd1$H` H0_@epA@y}KRd ${jw "GLC =6I@ҹP@`X0@_0i{dDPUHD@eh!;aA-o>P@4K.61 X0^>%MWTyB@\ 1$. QXC)D5R/t ttG K@_Agpj _/`c1 `GNKA~$ e >p₷cP .<{M"~Z%0_m(İ e5/`įjġaAFK Z@ RA!"W~5Z.e aC"U{%a ~K| Qxo>;BT.9 0 ?dȼJq@B<@ RF@xIT`B< RD!^Ƥc>+#y(0  /b `=>/~l`}@Py e@.KA T\ t.WT}_p| ^ !8/p0M``d0?gLOQ0 *vlrX@VK0CPx%+ Kį+{Wa([3/G,X~  h0@J-KP|?bİ`g^`A*} |9C@ l]P0Z Ap0"BX? Axz.|O0!Fb "/i`EjG񤐖 "}|>qV/V~ M h`GyP0>>,`h~$*~$@ˁdw+/>谏#C!(p,֗8 _ըV%SB#Cz00}U TIUGd`0!`jaN ipz?V jt\^ՙ`0A PV`7  9@Bva$0 xBU'@Oeqw\*IRN /`@8(VC%$ wLow0sA/ \~80BMhKo?{x!$!` 0ueпӊGN*c.X YXO8_@~ ?˔4WZ|^"_RB̸ l5C_{%P0y   p P|=t`<2ͪX@ʬ0!\#_#0-$J>3 p8_>a =`}^@>TLS'!p. PfǠ{̔ _Ò^;`N?(`;D$A@иC5_a{C*  P&`K@C(`~0 4d `@((p8>x z5.8@@cf`@LH%x 8?0:Fà@x  Ǘ8 JN<6#w<4x$ x 艮`@Ua! lb'( (#Fx$VO8' WS$D0`-||!|yTx``s/'DQ' բ5xP/A_TLnz2Fn X0 H]h rД\<ʵʼ3R`3R X0b?,$x5v!|$~zlHšO < 00h $)+ʰ ax0t)AR0`Du~? $hADpSk/| `/p0`B9PBH  X0CjIalr0"EL : @0`?A~?~vFv. AT3 )H?/wq0Ix @xIdmX }!ȨK+{ q)O9hKK/B߁0v+%I0o-@J P @ P*A$sx0! l|u0!0)P j(80  p` D(,PL/{ޗ{QCT\Fǀđ(~$+HBX)Kt c`UF`L$!P=>MVi}5Yp(8 AВq\+' PP ʁ @(Y ,p$ T1 -S%x 8  )6 328 `AP|KĨ*%bU+T``E. jA-fl >OUJh0"V%QR=W =AA !.P f i1`z(0! ʇ}~%+rP+AW( _Uja~ĀA*Gz 1ʄ:?eA\ܬI:0 `|e 00J;'}Xm`$/ D!`}= 5jpy~xWEha `}Udr0ʯB J3 ( CT>K7 Ec`:wU$._G`}_( W  >ïZ(E%*(  a !A.7ê  ˼El֨R`+%K~T >`v6# H`(30@pR0vҨ/t.x%*Qi07R @iP0_J9`44 ZڔgA D24i0JO2O,KF? 0C08_`AmX<a0bH0 /SRE x0H0!0zAq~Ulbx%! Zl yZRO%,yhៃV!y0C$P}3 (UGu_ھ4>~ @dx/l.ƃuN(C?!dH h_`KF?T '@K5jUW$l0r4p<4#a CAQ ˭YI| x+//D0L`0B\+^ Q,h8? Qt~.@Q"T^ P00Gf}l {-.u1K,8J/ h0`0cLbL CЅ x0c@=%:U )|A0>`( %)7q'?$t Iv_jUJ*%!yP!/x9Pp3p ka8&7ۀ5GX0>BXi^ի][տCB+XDxB.`2yu @.,`8(8><< S$T_P_xkā*ʀ CU促AA *]dQ }PcB X?(%`*/x˕P G(As:7 9%@HUDP`5#թnt`<\_`  $ ` X0A"BP %@0!(H10I B0 `K! ABU<@J".Uw?O#\/wWK\V_IiP  ADDT5g4 0`;ıv} "TK` " ,}JB`< 0>P(GZ0/(d4HW8ؕ EW<p?,V 0H/ZP_? CJ~ 'ҽG]]\`⡿Dw)|XBBX,<6t |ep 5`|fyp0E!%=@r|߃/ A $t}TlPoG*g~RcN`2> 000&%`PxAKSފ@!p`DGr(%^ x@ĉ_jS`N"pJBI`B % !$+zcꁀ~8~ |J piGpuXCQU+QȠjSJ,*xZx0q `<<$\Wjĕ`#Pp?/# `AW1].8`.@"YzP=&^[R@9sM5K0h_j(K *@0<^ îզKh0|5?#bg \%\+  p0`{,`D9pG`ˁ ި0`@ 0@hKb/ا^*9~F Z`}JUT*q(g \>/ E~P 0;t/$v`!()@pAJ$Hr}6:$ ?HYNl78 qx@Ǣ\4 0BP0c | XCJ>ȢV1'[0x>L p0EDC*!Q$`7$ BJBX8| /!D2 `: < 'zUewPY1H%R`}uƫA <K˸#@ TJ/0na` KB0WATy@lZ03E `0 w ` m_w_/[>;ƙ &D_P`<px$AP0?ZR^v D/BˇTW|l{0!x+}/EEb@ 9|Qfq/E'o⇂â5ϰ jP _:^Ļ 8K(xwi!O,$i w_nj+"re#wc~0_BCT_tx!0JA*jr}11 Ap",KV+ @(@`B 'ީ pp`y.j^j TP?"̼ x$nq0 `h8@n R>Rt%BXDBP H0+]K4`] W(8`X zm-zz< ^İ`6zTehQq8`:=X\$ >?|@`TtʷR HuB{G3`@H/`_yJCżft`$` L;_. T 0w@0I*%_S֢s >(lrE :ʹ.|AueoQt/bXɅ /ؘEP0" x}~EXV ?F[?<`/K  H0*j0yغ }T.. `0p <0 J H!}..wTy8 :GڵrbgfoK`<,P  OB   0(B@T c`;8>e#@r$pB.Q.x`";UJ7A ` ~Z><8 I.`<4~<zy x_J3:A$K`CG_ &2)p@u  S|J//TPp| p0 xB@EGWczh9 P`x a O+lV7c|D|$ġ'H0!h+V\(HzDv+`8_`  h0   b T( >#>R(zj"~s(XKj`r.w`UP.W|%h%: Ā``s}ƾ0 4 heqxR,0 $ *%1ڵj,G@,F`0 * X >@0_#_l 1x0?~W 0Pt!xj%xHTWEH0~<>oʲ @:H pY~^<}DD#@a LEb a(V%*pIHR :4krb*,U/`9EKǀz4jD"`SXӘC *`I߃Oꃲ`t `;T].իQ|wm Ģ@0,t@"t]0X0H@`@1o``0yJ/+6Ѭh@Dut!U @}ЇW.# _A"020< B4*Z0TƁu|hA yHG _ذ5)p`TX v8`.K0`~tz 7B H5NjA~E@M4*Q%A4yU<^`8K]? ߃o`B(H6?% @ (SiTQ x*KUA`x!b cf3AA (Y ˁ' &QЭ`<3^ 0!!)r?//{bbO2 {J,(X_/D0T˲o>@WґAB4@t0~ p Bq/,?#ަҠ`;.ĚZ s̀  R\ށA C(XҰ0= zq0;*H:aI>yArcUxXC)T_S`+(HX !X0@<=!A  `}J%QT{J\R4xb:80@0v7Uy'A(0!*n~w@ J T(BX0"]hwq3c 0`y%P0`A˥CK* CHA%<}\Z),U] ]'K8G2{u)KV*\M%=D``<]ŏx?|`=3x0`:\=!wBH`<0!|{g `l5e0~la:]T!Ǣ*TڠP*ā ~ |X}T`~>+).IR N?9Kx@W@`\_|՗6 @5P0_ `y40`=G}9[~A=t/= 8F#`<cPU`s0 0 xĕ?aA6 0>PAYwl a `<`fb2C`:/)<#x0`KˁPz@x4 Qr/oH P0_ !W(nbRlwNY@ x=R.X91, yp|Ph| |K./J! T 8 B̻,N4kK{@  ?(~ h(Oǣ'(4AGA@>*7pBX; qT.1?}x`$ e#CB!dṔwN A$(+ΐ`A8p`x@H*j0}H%{;,`Ba~+C0 yqq{T%{Zm̺e18. 0@xJ %x> etK& ꯗ 2\1=:ɀx0A~@ĵ~bZyAM1H $x!*o  O62*DE P # *rv0)~ $a *"`;8 *K_``ܬx6G_q׃7Bh5V?.Tǃ`5` @`z@0s.Ϡtzh^Tix=mvP*.U9Pߴhb` 3j%rc!+T%TL1$xp%Z`9IU@3KJ`D8~?ee.E]}XH`A/MU6CEE T%掼0g ` eXЍzX!=@K4@/JګQHp1CxP`9Տ  0Z>VĠ`5  `80 ¢SE0_ 0`:ǡI@TWᥐADu|$ j ~ %젢B W8 49?0 m @xJBB#r Ŀ GHT 8`OwD`A{1 -`:P|.eUa5A4AJp0>*}q@ 0` J5O3xB!7p`:\A@D-H*ɘ( |Q($#Z A`;{A/tUT6=Ĵ3^`10!A0xW;pny!u( 8 Dg**C^pU@z`:j#A.of `0"0/W !?P} 2]-P05r+)#T K WAD), ٕ"7iS|J 0` 0,w2`z*z_$\ʧĚ$0?^%y/ު7{5S LŀxVTC^ȅ~x@u wC.dV/hd~ e\T 0@vuPqj ?^/P|?>@ h @0A<^ X 7$hM@ h0D\}GsC(u|!0* Ht_4Yx0+ 00AH 0`@8`~5@ ~Q,G7=  $ުPQH0`d Z 0`X@ˁ@_oa V$& &`x]8BH01Pgiu1p0!KF0!/P70}A /BWd<_*Q]7P>`#{0A|`9'TvPBW.>~*HЄ⯪++{ Q/޶X '8 `9@9UD/x JTM"\uHDETw`L0!BPA`~Gҿ=  z?a>og=7J,` A^+~Aiŀ >{DiBɍK`W9Ui` 0.V_y|V2bQ8 `CI3lߕ- P`  AT xDB|EԘV/U/ "5 '"~ wi4TT``:0!`A?DD` JP 2 R`^<30 0\P>T rKj 08?4|]0> .-P`g/V2Wx0&H٣\P53`( /aypA@/ C0`~8A5mT=w`UM)``A,Op0@KהH0>(`Cє `u` B)`wa`4`{ ?⒰ sK @ `G` |>> $Z 8H.0 q)w̸ )ը` A0" y3p !qh,X !H@`| $Sh0_@4  x0 `G(Jx5tT*R`C`0@H w..Q Kr yx^7U}OH%0Q3D@$x`; px9Yza`<&yB|| evDЀHA0@j%> 0^\zP0`D@u:U MswߕQX0!ˆ`HH0.A_Bzx$* 0`|IC% ݨFL!'ѐx ` ap1_V 0p `(E./"( j"djH`|y>(L? u`}@<`< cV (!rNbT@,I @`4|OdT?R0dH`G+G3vZH0!]h* %ILIUQu e Z-(JD) 9k G/B  1ЃM@$`Aqx!@~ߤ^`A+$J^ yx0VQza) ?ݨ0CM blT P0# `@0I.d^]A@ٗ@`2LP>_vy $d`A:IqD R$g5:GF ʏ?>u<3}>la]x_OI:"qFkDlE_flDé;Pt "!K>߼ٕ9'9gF~ B@lObACWE9 iu߃ (UsqaO14x_ EDwTipD.4mӀ-& /5zoO 02 y$4nڲed#{˰~6;;FT<8>`(Jfd5vc\`F Ȕ!X??zC/T[.W(\<}I\zY7𦶫%z$i\D#{aCJxDS8#MK\o8` (tVQcBCTO_YLg}V Yo7>UCb!W{+C3ݭ9'y ~xS ׄ.8Dw(Dӄ+PeA0bˀ^'Tb/amꆖqop x<Z4=-#pf  X}3ˆtARa'ʁ:UT扄4 `! LW.|)yP>Pr{T[:_àP_cՃ@|Xw䮧M'n{7sޏ 9ɡp%pBpii1q>#hI CQb2__ &0`ˁoCք~#.*,krkuy;߉>C Q@լRZ8pH:6أ:-4}lF+PxY_퀨>:T(2TwK=NQkaq CUҦ|%<< ",\ɕɌ|+ɦ0 `={0/^o;[~383]oc&bj)Ui76Q3ŀ[,I]E3{ĉcs?=6u=N\8E&x3{_7F\42Xη*ܧBιwiᗌo /Wk't޶Y~c[:bxd<`xA M|mYr׼h{a0}6It; qgp=[r~p0|u[r=mr< ]PW{Lp_d鰄lFRuIԊ|#:WҠ0*HGꠒ^98KS;!+ Dgkf` vؓTA\Q0ڥje՗r(/v( D^^) )Mts?"c(ԻP8<2|׸Pp`~c4y8< >8j {lWk>!yJ8 P?FюYx@w/-B3 /~3ƺghl |TT3|Zq<#U|l|}CJ0Ar#'SڢᐊtЂ;H-|3 =Nj!ǒp-YpAO :} 4{303z,ߪMҐKK$|~RXD%z.kVfB!| `JA?LW9-sš+ 0<a@(!E^FH'N  GÿS\9D */t}ZJ˾~+ Q䷔d>HY[ME'%:Ey0eMUkƪ Ti3Wpl$^с ŁLt7`:#$P8` ȃ1!!7e.P! 0ct%_:uBYx0_-0T ׋Ɗ**# ~*>󘤹irfnHyK]'y$oB3L`/k8lFe.A3x UB, EN _ H` "o4#&RU{_jjy`d$ ` % 8 dt`!+|lY巰=`& 0,mֲJX0! `D  8XlF2~?xQv o@`A˨$6X0UZ< ʬy'\(2E O}Zx  i=&08@MN8C6/4q.p̴ ] tH$Ǎ'*oWpeW4 u?2};4 φg=Y͞0;{MxgDCfǔA6e< %xf!oXfY [Kt[糆AY~/NIVa{k~5yN<}cgTUPp?88G{|<>#/h $*zUX#b?=N:u} yuD`bEIEΘT 4W`A#/#e~0/,ZueʇG bB3v(8ѡFo ` }A#80~CЂ Ј٧9*xf3krx8$y sX}~:dPHx]t Kq uGD\ VBB"@$>+U6"4G$~רp.1wc) ACCA h<|(GGøȮrbCXp`AB#C ڜ R63w p`tB @,HW^ ` c$aC(r CpX@64zب぀). <>$~ &0A0`:H/HX/`<`B?" )`k4A,@q@.pzl~ҷD^hRD W8hBv$|,Âp~M ę` * ^:b0(Nt,HtJqP/ k T!hBxj\\ tV$pX0,0᠔?xϱj< [l~Wx҃j>U`7ׅ0^%`* pwv^J## `C000@84=xJr IP-3} ZT˙n=qAdv< Hˠo`u:^ Qt |xJT_Uh P/^6Lju](O=C餵_'z}eusoLn{{s7 p`v4#{zYgSM]Q/6us|ӵp ņ5w:,[%bسnwM*AWQsyY/(8:uP `X~CR UK)[ח~* r+P7z1rU)Gh\%(uթC0>AO#멞^/VeI|Ei@D!@0? }eW><9G?O* ѯW s[<p>-\28Tt$qu_\?>8)7:2A^Lg#o{{0y)vil +*P&q6Ba4œPtƁ@>BRBU4I ZZ@bA=:1G*ah;CUV;ypMΊƑ9+\D @p 3鿼%wmR1 % ™E>U0;T<5|1pV푁UNi ; .F`%jB(JIBځU8o0 Dž5 z?m`AT hAԀQЄ*f`pc^-+ dL̄3?uy\Y΄*xJ>:lHW$p 5Q:S@&0jP)Nhᗈb,5 B(jITyZ_@^$ t0(~m8dڽ\ ᒂP0,`HT%G TLh0Yp%//O% EvG.W#/0c sł@`L,stңi8_Jn>' xUQO49XBUWap Cn !CJxSᒒ$! _M!Gh\DJA ڍ "Rq/.' /M:df4!Ip!KOAm0 /} Dž30!H0?*ՏyYP`<1Xoh+"=heC#x>:†~sa 8I ׊PvW:Gv~'gHÚ :gY̚.Wć$ UhEÐB<C'[@+4#M簇f+ /1: /b|bwlHBpraUޝ]^vFZQU-btg?@ H5C5!L%,(A}NO_4PƦNfH-r7ቩ4 !N4W3/ᓝ:, -ηM .D!g6g$p hL1ALzV1ETc\ٜLTH)PXP$htT 65|nĘ"sC ./`| +cp. # 3?>Fە٪6‡ݶI@*A8B}Z}璸f;c "e7ā'( r~QI ӲS*;4^\<:8S.1,fOF"^9GA0B軩UJ(.6*]<QP{]wNe,3D޻):T ~JMo:᝝/ެoH, 1 D!aW)GnLd0 p 0(7F+@uZT[Ŀo 3DO`8$\z#+V]SM: O;|ONpc{:PJ(UJ* ʕMn`e Rp28L! U^] `H `//HSvwk ʸe><3 -UtH GHK0?JǪ&cp0  Ȓ;$f%pGp@.*PV5L`^>G\g|24Jgou[cx3ѓ@WP)!]BA X@/T;o%* B3pY'Oh,tu@+AfAJN5Pp9QU |,'jjd JP\j^]q*_}kzxdqh(#A zkO/n)Gp~/W`!EDŽ>pA`Fs @p@&mRM=^W$gw:>{brDŽ/ܢٵtV~sFCb0yV$ X(wЉJg]ߪW4=m]~Aw#Ͽx󢐖|4$!XRxpeLi#|Pil/"P\j=ρDae P AVՂðTTL<$*XRl`P`@!pը깣Ѯ[)|GP/$ldm9vAn(<}pӲH# $9-QKVUj{c1*Ks#a}\G :|U.jXq> I%#D\d|!,3^pj_!;y ks8gN04gq9 5489};7xޠ&k4O6go*^o .f[fXqzr]>ÏsNNffQ+?g<~Dq6,3 WOM(|R " (/ &؟>BB{4`}t>T_1h#NZT1@zo]Ģ`BS'92jgDd2zOFfOW 4xfo@y>xd/ o{šw՗@Ryۣ_(fhjUڿJ ŀsPQJqɋ I6;:]U{ 9a_< NB\ Q\2 8جJW#ʟs0 t$xf+:*,3 ͮI@&3/Hqp~] ^˨maL``AVBZh SK28_!(TVyWf*1OPCU%xzƋG*R:0"U* 2].G;{t$GT  7:ظDl&fgDC"pwǫ TepXcgI^#WѨftd9}ozo.yAM`9> PV!wѠ0;AQ*Xy` pS 3I ^q0,3%DDFhBŪ*a$UDcdL9}UhA\"*G ixGpJ_HtyC D$޶A3`oGyD:rc6F0?w+ l2)(@ͫ#*Ƣ5/8:`b )S?>xP!Qh`a^*uԆ92#.\X)+agC`E2S#T|ǒU>~BwC1{ƁS)EWB=B:,,3Sx*V1Yq_pZi3k/3=k{[h#x,t.sO O w˺ SBrji@-er%y硯^IAM~h$4NU] jkGDi <_ C|J@ߟ\w35*TUE~.z ¤oxGAaqA` B{0 #ҥ|8B:"nOPdƨ=8d*W Ox|48#pe~`<2 S ʈ$BUV?A iNrzʷ̧#fPa"*HRV_ ~_JQ˴ aiX9O `P܀DڲS"! =P "-K08ĵbEW%b@+'fJ@~Azܧ`SD@(3BHhm*xf%Y-l\Ҡ:\yΒ/4{5th8Oq8Oꔁ<:?= `` bH(`fT** ߏVK\/ |߀eqp`:..TW#~/4K.!).T$yႈ~( a(IMQux4$J<;#L*BNӾjF% F @~׀K! :J%(LOpF9\d%*0꿂wNd5jS=KA0~_liCNt@C ժtıр !**U..ùTLA P&̛(?8]cl 3G_t)OpP!~UƄy>Jg ^^:dTlLwBB;wpL׀Pd4x*oܿXd*D[;5ទeLB4P |J^Pp2O0TG!*2CA~QJ@]<>Z{ ?bg0 V2?`yp80 Xj p$w_X^TTR>/HRT/BOs{ھY,03Trj鼄b8ѢFDo":Õoe5D,V Z:00#/`<ՏZ:.| @I(KST8xK b LG=pb! N SQ=[e8n8ޜ͗dLŠ :Jp\SP!H#;* >ӆFu*:#bvx~()`xH=ew֛s߈l1-ĪX}9oWX , d 0^.UG|⯥RJ!>%W)nf=#&^v "Xb-.-dKd2?{bd ] s}LD3SR~N5EJGS*w/(`*=`TDfy%$z)1w*'gfi/3tq(W5:ѐt,5F *~$\6M j%=r<(y<| lN6>EOU>$G9=+ƌoKXQ3=vJD[M|-41Ѐ(2MLBcH ȘSu/O\ 5XZSvԑ?g8υ\8Ёjyra{+9x)o^ެio058&4%g #yї7W['ӣ֞se?P~O:O(pmȝ^]qywO /E)^C1 @(?B$.ן iL.Gn }Fʒ$Zw>lj˵] ʐpRY]=Aҫ>P ʁ𦪥hcPRpqK>N(/_R:{OpUZ5Ta1?*`3rǖ܇`J:t+߃OǜQ"`:B>Jp  y/4Y6X(20J11|gb~ oN8S Ize lI~9< /$,+xFK/?|>}Zn@čR?AU$9 S6_bW>CJQ.*z*gNzmQ p*^ !osx8@K85z5`$ ǜÆ8 $>s$ #767ꋿ*RpS$C+/T x0#ߍA @!O\`~hhUPv_K1tE`K׵0?Χ2\'gD~wpRA(GpXd `(;`8e`q5MV9&Ӎ@O羮⩤C0L@b*6tC-y8Mz d1fH{$s$jCDm Au-H?_#=#u*zšɆϫAlܰ,4Q;BSH Aqp0_{"=O?AK 1~4 ,e D`_}EXO _yb@h qŚ_ ζNv%2QK0U #_5Ћz<`}[ۺdp@(]U!ÊE ^f~Q J ?T_'kZ\"kXga 7N%\`) =M1 ?:*hn^«!n fx)Qxʥ9@ C@F:t>p>*pfox4/e߃MsI vbH WRax0T^ {kwJ~*F'zAU;T#Z:r0?R+ı.QE _AmTǕFX0Ap0?tJ'zE`DDGM(p .05W !~R0`70`@5P0>ʸ#Qz/rX;J){}h P8S`0!+O9h xSK$2\ +;S3*›C|Ī%6ڵ:M–u}Ѿy`07XQ":F 3O'j@p 1 >%jPqp b3   Nu3T'3ž^%| p-S^Pfs?p><0tJuhL>~vs}= $e[<տ"Dd3 :1z-:Az-C&xǣ7wk z/%k -e*͟[~|YiL#r=N$2f1ofYǩXBzdNΦ:$ ơ|3F_?>9͜!ϸsL'{}F1sϭ[i#1ϱ["Ct0r~Ϟ2>;>A8UTx,3% {+R<%#_*hWDZ#[JB5%)ʸ_?TB_x oB(LAGT_U^m!nO *9<΀XX8~P?+ȷAČiW w92GN({DL#8э<<qOuqNB/FA(14ʪ.G *żJ5 ps# *~b1egbb)zp_1Jĕ\򯂜tp!We{"#U;h%8<9z`B29 !wD@p_x3Qbpp? S33W{μ\/  @`U2a`Aبu&+],#{zQY .1NoxS̾?E4) -IDm"d)ߖX;UK%<F&OV,8#bm U40 q@Xj(OmxldDˁ X_tU1X|GI*{; =qO @`s >E3D 5BGSȼu(ʹSR&y:DWloi'J]'NgʁD{U>" aW@ |-S @%$jILyXB#EMl>˧^hP3'Dv"䪔3:^+<\ɗ's0@@@8:fv __T%[i?Ɗ, x#|DŁ >h gSc@y!) D1+uGԗhz=4$C=q`t~HdD%:i`U* B# LDB74e*ǦPFNCi` wk{J=8Kvޛ x,FH# ũ9x_~^%;`*w%-|1'>^r'- RNhOqyMXH6 8`F2 E8g7 dFv&}pCc'An3kdbc`j}*G Bs{͌"Oqkff!dáI9ԿA(MV0uri8DѕۉÁ:;h6š8ס:AOb#m ]IdhH*Z5 "kz;8I羘^cMϦq)𦬭]z[) 64oxrшt1*H#}uLd/$ L-0(P`"z/٭5wXjQd$dWC Se󰘼}ᚿM&Hӓ4jf ɖ(V%L4)X!yH԰@fe?%`L@c+@Xn25/u93[uH|r6Xñe"3@2^ogN-?ϫ5m,&g&m"g\3.Aѓ8Ωc팹ݭ٘yR&pgErL)ϳ["Z Vyҳ'3/:>u}ηO>0 }qx/}ɝC GNrFD)O2 6aJtK$]6#NUnd%KEq*:Ah?610> *ϻ?L~á(S%E ~=% yH%.29!\5Ӫf]>{x,ʣ?\FpSڶm\y^a5.\#C!0/,<p $1 V`}`JyThG"z #IB|F | Er b O~x W ._JX( @ C4 *x(Su*'7tuWB'  P$EZ'(p68RB8FC`S!9@X{$)$jHCKs,(0X0rAӜ`B xs0d>خ"ej<{ K `j `rA)Eg^Pp`x0C+O ܩwL/RྨW8^A/3K_4^# ˼v)Tym|J$\ T%p2mÇII o 2‚67)kk9O_QyΏTyT+ H .$EQX]~{hQt,9X#IzD F@w`;BbX(KFV%w0Op`KpP -` `BU댻A݇#cS7^d!wf-'4x(= ]JFt?FN4F/`*W..!v>r[r*~ k҇=8Bm7m}7f  i9us+:#MUuPG ˧+y:yx~ W&یろ)PҦ7m<(,qnmX(G.HFK#xP{C1FjsDG=sȮ@q:/Wp, bw갔 2)~'pma(lH*?M1K\`)jvSER ɼZK2:dž|йX.) :dAxdG B+| ưfȍe%aH'Qe}bdy)2ngZ;,f ( ~AJL}a2<8@PLQl*!OU W0-C5= B,N81<Q >xG|x*r{pn4Hޑ0X}OU]JYױs>x +d/0AS?0 J3njHm=ssitzFM&,a-mC&ty3]=:6=cwuvC‘1u> NM0Sc{_NдbWy W`Tēbr J7>xƞ*DUS@)r2 r'T>DK '\xxSm ^|^1`N*KCAVod ^tC*)Case K0fQzoc ̀Fx 8PUZ<! KeE_+ηdE1p()`U](-T/.i ֩43\zOT+d 7W3ܓ ɽ{4$]sï1HDo85 nxF 2{:0`~aJ3J;Gzx$%H#(Sdo Ӗ3d]2k㸈ޢ\IRD&W\F&e0$2a()=oE $8 L>TGz0` tI9 _<|%^@8JZR p5P!bAxͩ`҈# `Pp3RqjXUF 1Tba/I%+PH#E𽀲R=# f,~ v;׎ߗGO`KFJSќdpS,z\9O'vHxf+0 ]7P4L1wkHĽ'E} ґFȞ#ʎ*qUH*>c$,DDG@G|Pf0a }D%@0`,UKĩ?nU!Qυa P^Q.Eǎm_ A%xQ N5h;Ƃ(KR{vIXi(Yp*"})BWcZn>;9mw0 SQ0>aLKTnT_r}8@_y H@4| Er+/WKnŭ5};!:y!-£ ԳakN1,%ZH 0$ ]ja h9o'Qf..U\(rTh!ڒ0_"KvĉU8}ȷCqAߖ:N>F/}(-@4k4 8FD5#—Q^;- \|}3}PSbsʓ3GֈC Ȁ>QD+z{,<<#h#4ӋfGW1 eAq0*PuE !A0Gz_|jO'G%JrUGQaO8{yӦɓ%]s2Exx:O-5O59ޥ5o_t#_:hSq|=OO4ɀS)ȷpogpxRwo΅rqxY/l&1V&y7w6uc{mZS}WCv3uToz"ϯ-Jl:N zPAjfZv"8":i`GlB7yg03߂u{#5b!*B/>6W{4Xd}Ad&saݽhl6%8v!gm9(6XY 1@\ Җ|Qv쑅_'ߐbU`1_ 'ap*WG;A@-iaT\6~ՙK UuB%j6.(xSP`<(0p0@s,T_h*:wSZ2=`0 @=`|% }F?VGw>t(&'*~gs}RnssG"?&8\/ pv Dԏ4u㿫k"'D` &R`: á q!uae @R*]¨f5D@%= Z FJ0pomBD ҫ)PhG` Gx0b@0EPKi  |&<7laۭa\82V& jF*"=&rTԁP8!mO j;#j=t9G EI &[{|(8 w+.T5aDaO}>,!/APx_ЂX}n]IH8_p*nӷOL+Ăqigz^Cz phpȜ,l fD5t.{b]:dB;?Xic<_>%T Y%`0S=jhG|a OV^5:-X,@y2_PJ 4`A HXd pAq<Q.*DV0d" \w:b0%JSU q?ɻ$BୗTHJ{ ^  lJw"2:iwOK9wvo7qZlִ)|p;PF*v 53E`(߼0Rlp'm9]8|OKDC0N@~givݦi@Ẇܰ}l~:,+YǶLB,@X{Sb? B>Tp2w'68<^T+%k`T͓ Q #_ WqA8!!K Rua8ɡs06H}9Y\ 5٧/d.|to^bC}7/$5#ДDž 99J5 EɆwZO0 A/{F!vP DtR'XeQi?׽:[ެN#U,(\Cpz d#e:Gf i[hh%YCˠW@KU`~Q)QR 4#_h= GR~/qL`C ̺[}Gb1aV\;U/T#0`IJ^ Rؕu+B/z$ eUlvu>\e {m*\3 4=xCC $<ϴDrFX1*`\E@UG\_Qه".>N!*0+2[3 UuKӉAޏm)K9EH󡑁.{( ( ]:7T;VeRDe* 'I~`qfX+4`Uk+EU@ FWcs@ ;N5Vb.7)x0&#1'0$hQX|bQwĠ`:Ժ@qW jaWq?$N8@Zl)mW"0RRjx($*մ]! de.U@G^|}8_\\] 00/ {ݧ;[o 'v93hH 9 *ǹN@q^>/MXLñ%4\;P0m/꿓  Լ0B`<~Yz U&onۙ AkwIѾsB6Wx -vT<| S~El+Ua=, \df6 !⺾<0{hWtT*~`[N x^NY(a\2(%b7:ٿQۏA:;'SI҃dWש'HۄyÊZ`+-8afoAd? Xj}:I9Ɍi A.jD3S [%{PĤ/ :)){njH dO;pY%F#mlr9'> N3gX>W*+<:OS)mϩyĘfa3O8wOOG/O,!v)|DE <K= 8x-JCDdw8e^x5@y+GI'`<՗$b 莬t1 R2p#:kw#B7H 0ǝY;.et2RpS6_!-t^Wx_{h "Z NǍp/йMFMW +T>5s_x_P\ (Snz& >/ !]h̶﷾d3 &m= @#a,/I84)ҶǑO^38|1OQx494#yQxPJGO,!y_)/!epi*V>.P@4HbY|r0X^g8@A  E!x n8$X%+Z>/6ziz0D= ~'t,FzFt0 +?u+i+uY^JhVg0"@hO$r4 Θ) !6qiַI="{cO7VLxu Ss8M=ov*[8ٮj"2<}\U k` \Pp@YxX2{Oޜ~9'9H*,'<lGP a,HDW0 jF{ѐ"J`AYz+ CAp0 x izW`BH4Cxe k&Vs}{(MA?Th<>tFBaă f4^<&8 ?mVZ(:tEROp3p`:"ES:9A)!tfù2T-;*iZYo\NxST]h I$T32pfu/{{ՆUG׫rikp>yYq!c=4ҙa*O^꣫Q wZr i,/W[F/ cD;B3fdk*!gTeTlјɸ28pBDn N_rǧXXO*pq5ao-|`eN DN<`){׫y-4|gۖGL}?czc8FԾgD}@qiЧj KLtKQ dŸ挕\m>COж\TOp|(28'2q O: c ƀ-z|/ }7khd=ÈRo^dH@ZpEf=y j&,\m/OT 79Q߁%I^vgSL,e!ɭkxj3Ϝ 8g{:Fwoow#g :/zxf`7ꏀT<2g)^M+y 2AS'<p9-E *jng}'i]EzFL}n:O xf1 ,ƏαNW;#cMQ8;@|H27~J `#>PUCd^K$%|řvaBJoMX [Tw&} |X}1 C:ثaCR 0 x`Nb%\S<`퀆<+ 0Mx!>|Ux;c` pB/4 z+T QtϢ=PHVFT'6vt%Z>J+C2 L<PG# {)D۪z}${n﻾tF.$TdF]F()7j0pDdZYp9?YwQ!Qzp  Dh0G/A-}`*>)/}|USf(/W `}PBB=_(0(, onۻ:} @b@+UQP8 q0/)U(PB GG~`~T(Y_\ ˔spOerWԎp}v??セWH9@#LĽ 7*|oՈtmh-GђtJ`G@(%ҍZDJH$` V) 4t7)y&zs(_n[%O'Pd )>{ދDܸblCq2-<^i=B=N>PxK0W]u )1w |^ djPXpdH{Dxp⼫<Hp TiᔇAv,2g|?(  {g ^^y_HcD piڡ: (,b$ -\ a>& ->~gr| mI`;*W~m"=V6zMN KySջ !ZY8a =\fDzzZH kHg/!*݄"'nf6e@/x> >\|wi-S^}=ZoROjP6/Olcˤzc ~xLʻa?W-% 6&`U 1lBT5x3AOPJχgOƦ{]s8f\\mПo N}-q{xR0sHF[W6۫u:zcRƽܕesn_SpdoOSiHw .:GJ3Pƕ [#U_p@ C6*RFx.þ afi ϣ-ݴJ'0pdK}qB} }C(S##6Q"9)TU|  J%d=OxU, ł1o67ՉjB'0!nDAX I.Ӱ5ss*{)A'*O_:okrٶ -W"O+ -ڵJP$F컅#N A?ۑqQ۷=. _Tdh)8{FB, cKbEE-_!m>*.qxFF7@0`ĒCfq4# AM$׿B{wpCQ'2crǤしKϵmv épw=yʧ1&DEiDd#R8GQrTj0xF$O?VʼEGG+oE2&GAi+Us4{Pt`}}`VyuLP zr$T}!᛭3_ Yȇ`O B{#C1 ۔t]/QWS dǾV_}7E]M)Y .d8x2):~_) 2/.pYюE_*l5MQ*wX *'r@վUkƎ: Qy?bxqѨ5"êZ0~BǿӐ_jB@C@P*D3>{cet?!(z\^~\0yUߏS 8^XZ ˜s$^^^WVA@ (I sbĽ@ƨ%sX x0>_Q1  MM pd Iʎ @(2 n+8#| o}%^S?;ύ|ETzT@2hLB'2{y;X:Ml$ UaȚܮq4=v6%}Yf{OâV=PF-o9n;`X7*Y+ ŴxDfp .exKGf ޟ&y]ݷޟsط17sUܞEh:`C6N^ܘNeZEK71J@5Ċ^>߬p \hĂҽ#5W'P` Z)P OoONfX+H.$}vݤrcO</V &^FeGS.\YRiiMJP:J˪*B${™ePGpѕG'\.>)ъNV+ 6k`P3((2ӯ:K pQC!p؊_Q~4sc fB}<38?SWմJs{u[>#zyo{R3I\@HhJUM84Wp%AZi ׍9."!b}6y 8uᓃ L`za_=]'O9}sVDtS}d!:oFIO9L-)hXdg PYTMq#$)1U 90 (|23է?'aO'7^vgޟp?.:ϤF| En ?@m*H.Өjτ0Dܗ<{T!ִb]ol])ਉ)p' d#</xf}8ɕT9珩4H!iU(s--ﳹo<{}~ ΅Wsᗹ#'8`NM(D3R$];E#5?t3J8R#yH.Տ hT 4IC%P-B;^%eDM>(eTZ%\e7WdpUAH>}@(O :8'cN+y7#g{`nJ#!DL x_0\%hLJW:~=6eJ=^ (tt!, X >Cf=Pp{h]dЌ_ۊ&:BO+5@zSQš"`~?jUhVo'Ǐx *@ ACg>p<2hѻ`8/A GWl:N)ü G&(%nd`0b@瞠 dZ܏sU/}ϯ2A皞0 h0b]`Qv8 ^!p`{n "}GgB0e㷄\`Rv~L#Ľzw->CJd䛝Ɍ2g *2зv-*U@*X.Ġx3 1 7s@$JEʥ;t*- )O;W=j^S̏w~u6F.ζp)2w-?ZtJ\s)APiv) W!@8GJni>cɸqP(Gj=Kh${aPߤ73Ĭc"fV#*(QJ&}%)U| @a<4#z_[.T%nNu0 ~ `eT<B !z)᥿R,^. 4R>.#@Uw|?A317><280 T`q\-pHZ؈/+$ 0!aD> 0 *^t!ytTݽdB. {ןL>1_8ɔxOz!B`\|<5`ʆbs/ ZRFEhQ ^2 NxfީW]FPpJ_ U/A_NX$q'PʽLwo>CΌ@(?H$c˧#и J[Ll!NFlv}s0gj;n X *AXYTTWIit#`Ttp0>] 4#xGg.!Q^ E'f6}P:;ϺN7w!J[m uFh*ϞawWE7 y Zj_J>Y\t:Uf4@&6z<ATh? Ip?>hȍ6z2a .,hxncua'l(S넛i})y87CaeT)Q`#7 Fjx8`Mnczfu=xf wh=^^ O_8m^Hdtxw}i#RUEZ~3gz+'iVfO 3:yKi|zXg(2) }YȸC%PZsN򺑖6$#gwY;FWٌ2y&. !y賯rq'88@P}:5:"_LW& zc sxdcFwWr45zxf^l3G9g DZ]p@x8E*ƾr}<8ʵȱеMl&J!u]Od77Cn "'g8lc0]p`3?ُ>#Op=>M>VFh I Dyԁ85B0 :3G3P"rs>xўe; G;wS=X8V77Cl¶pxxfuRy* Kg+=7<XV >0G;a^d'2pd0g#N9 xf?>%_G eu+6C!*p()K(Ej]V'_Or-S{\rk$.Ka>eugoxf{޶&xd82!+oEACdrπipLJX}}O<莨Kdh># 4 _.^, =`1ƹQľR @  i)"|S_tTbcqf\:Y03 ں*y'xg+Y%iM[R QJ!|KDˇp2 x `0>R3z;7BXD`Bĵ TP燐pѩuJ*zBǣ޽tJg~7-\)Sܶpoz^ `.@`;D%Z~?yyr !bc .. !`|t!9@GMđ'Xlc `A MzZ4$$A$`80eފK-$T#ލ8 */xF0} %P=9?0 F&y(,"(/ R+QCM£B].gDAV%?`Ǧ9a!ԣtSB0=`8_@0X0A AIJp<~?p;,yC(<0L˵UU+Sx=Ry@π!Rw 8?+V7|4L2U; Xh QaaL1b()ӁH`9σ0?)P`@WR@>`~OJtF<2f3  cWFx*sNPY1I] 4ϾGp)%xWM =ݷwW3m'7qg} #3DcVuo h?cGSJ>ļ3 m!W@X#!00..Q[QtӾ<IlFĠ4#T泡* 4:}{s[em0#C 1g `3ʁ>@]% C ~5 d8=;6w+EP]G(rs^!p+e`㈨FtJb pBo*=œD0clگƹӋԎB7fyTO8N"-o]DǞ xx|sC}_ <ěx*ꔰ{Œ?QL VHL&zL3 I(͉03 -XН^ yKlCnK?60N:q 2f+IguUjkRBuFqz IOT }GjL3{< 0y=w Ǩ$ Sug4󁓜p*,BŲqUN%8y?ba{%O'skT0:9*"Q y7ͤ-lM :l>A :<@'/< jd~Eb[xfcՑ/,kgJly#D2v)Ԯ'u`V|Ì8q`3gg м3gjh,h/xў!Vgqf:K:y\$WW )OYdS+%8CG^o{;MIs\GQg{`8 %+qpdή0|2zd1p Gİ x"x0t"RތKU^:]:"5DhF"'A0NZ  DEh(̾£+#]/jYxZO&d0oDŽCT`Q@лPI_TA\Ix#:Lp? &燎,xaXXv mZaw1N00`DC; C@13jJp/L$#@4|̓h(;ǂB AD~~% d`}%җCPe^q,ghFdv2"8̝./!\sz'#߸-[f+P  C; `~ w;whJ> G3|w=_d։Eߤ:?GcHd  +4$N +=o< L/p{x3ͩFB* ۳e¹ {ӶZk9(1t3b' ϴ˯ppT~4=pݧݷMw3xyJ WŇ?jAXz'W؎`FaGUJV /'T'E6%*`{*'5cSzsX_;oynA GQ (&!JpbPM!Ds@3BIH?/,?v}Aid${76IoBκ>(DNh&iL|z攋wG/P]{dp,՛_8Gpf #ѻu0RpfrZfxSu ^걤`H:isJ~>7'.C$󡒢7+z{].B8Lfο5ه|#a{'qB[r0L̗J9?a8Շ'a$<3 %,|膉n3R`KRIyyC;y;? XY 22A|mn!i̲eͳ>wShY7x8@P9+ryngd>_5MwujӚ(N>X*_KC~v p}\3%2p8!<6}N)pf ˞3 icUIiu2x~gH F|I`i\5ǽ|2TE2 а*dEt> 60&@\^&k.GC;\nE^2튇j5s蚆bP!IL+kpcC5 wM1\ Ϻ/ᗏ/ 4pS}>C!BXpon% xd5!OcՏ;z)();8}Bn 58#_f,:zy T{ ڊ{9.oZro DyhJ34" @ xBHI[J6Xy;~1V0 N-_ĥ_Ez]xSR]ֈ~NvL qp)PA{CU8t(Ф 0"? #HbK*FƐzf)g}\U(2$xD*|_#zm5t5 WgP*z\5P15ZIXW(~@1`JX1`H4j?P=2#yJ :c@J>!B5)evÁ?!F@0 xı,x _ENةQDp7!1 dt=os=>m <% `ʕIAPx~*pNj{[|4Q`wU1`/US_0 p/OSL*o`:S0`5s䬼K/WІ% REcϣmTe[JROqyƎAUk͇+W"%yQbYx!G0GR<=7CxZ|h#;6pINw^AʁW/ˋzf X>;՝1ryǼ~m?xՀHK\*x1m{m9.}[!H 7O`8@ALǁElDyv>#AaMJ3pSl!ZtK RֈL-83Ǝ& no 8ULJʁV`ye%oԱ%L瑁`q?": 2~?k@# %sX{n.p  qi_:ayx׷Վ 2kg7io@}yA,c<=D*|@`U:PfzMQѠS%~:/ l"B-KT?A$xS%eߜP=Fc}J|J߆u#l!jg>3b%^Nf:ni7q* :]<"=YNVAVբZC c %ςV4bXgp+8_Eк*4o Ȟ[I x"C9F0p>Y'2(=28"&^2aord=Hm<'Ⱦss<(糆aM8⟏&s8@H@g_a#-;4d)j{ot=.cаyI4$p. ^xe,C.8??Dzk Y _ M@NB1΍hr'\]=X]B2͐؎3N:GO-)X_G)Ϟۆ|y2>~|ǚqSm`rAIr\\B3Or`7 xx !p>#8qӡ*>Dlgxdq+;EDZx֒ D~`W7|J6+]{+SD%*bBiH]keI8֫Dg_sI;\ܾV^_]&A=εM UOcاf-yʵ㡓{pޓq'dy8I8Utb0"4# y p%pp?>F]I&L2# _bQ9촄< A>Gp!|~jV^>ұpa[PD*Q}yr2'duK=*S@$/FT _J$A_XȧIb#.%AW<&$ $}Yw,ttr36-4UFyУ ?^vHS!<_sO-M_[rU:jx3 ᛟw|)J˕`-'vݧq+a(R] K$|K!g{߶Z`Gr"<T4dA?& w{zXs7M>i'K"l(?S?@c`GDaxfc̝Dqk򨮶 QpXSS]N~ľV.!=b`#6a>3:)*1?U)&}aEכݷH)Nʋ6=Xxrԣc\!32L;#` ,^)T$t/>8Fw5{+m n{> SbxyIPd:*NLⳙΐ8(H:o.ukJ2ILJ:pG La;F;>t:, .ďϮӎ ߪ:j\Ga|J\ruoS5I{#I/o:qe@@pK]\WSWS x'S'WI]orK0筤y:%}IOSxb w_ <QO|tؘKŎ˻i=a.^Mjn CoE7"`csHVvx$+ʹxٓ?!;B`0Ҽz:3S5` 2Ə0O8i w>r{R}=pOnZ>=ƒae O0:^" 0 kh垺eTrrC﵆M/^N4a)|[)~h8-)Dbw3 Zݳ|(3'63teΉs U~y@.x(m`PG zHL;e&p?h[?<~a>8,ET (8Curj%5q(5|Zm3CxdbW[?o: ^x3V(~琱 a5`έx{;ޞ `#z^_c˂4]T#θ~*MO VX}mOg{+{sIɭ< yFz{.lF<KѶL# eU 8fpTȌL%|t_ӁM)&p=wFm )B>? ŇRZ ~w0!t/ϋΰH$x*r A ?GhZcEiirXLXxeTS |DȼԹsNb?܇Bi~~'2jpp']̰}Z6xh!_AxuW=KHB /a-Wb PrOdE\Lpe#@T# ٭#^VQ%!=p(˔>?ڥYnx;hʀ%uo܅N `X:% `$Qc// QB){AkBj#+$fyJci`"B bXC/)\/JT x0>L!D@tB$=/ɼe~U[2[jw?S. Z*Pߞ.yH>MhNB .Q2:|~>tg#P,2 T3O x(lib# [#/x! A/\ p $Bj@kѪCN ? PDp!0[T=h0>'Q"Qr ̄B>d_9[FpJ}LA@a^*A ! He`xDm ]>p)~X({E|F@Twd #;pBC!L!4U@|z1M")T$@! xﯷiPu/ pN8Fᓀ+L6Ea8 qϞuu[yiJ*< {8lLxEC///- GО$ gCڛ0wlj0='{nNxP„=_9ۚuwP,(Qh8 *1@d: ?~"b@%KXBvKZ&!)+N87pphsg'խ BTk_l/{OmGxI1,_v<,0`aAoǿ|*ǴPPr@) {>%{:Ͻ>}k !}#M]ޓ 6@8_@2Ǒɗ+ 1*^?0~lb$o"*&WU+ B0b]B?2}-}TUa~=$D I*5zgp@0p?1q0tXzNW(~N<K8EONW7zBfʦ刖m<l3y(61^{>e7S,K?g78/G6O/)=pK&8+z(F1j`zy񱩂u2 5 1Iꐋ<,s" ?.l\e=' y| B88!x( 8&+Rp*qţ_ hOLj}>" Y>E.O AVJa0>c!z/a*p,g ƍN32 kpq5cW^=ͻ9ʪ)>O)z*pTsPVՀE݇{8_$sYnB#!r zBX,Pj^pQ"H_9L/6#L||JJP"4xd\p@`uY^{D8If8CG9q0uT~'&eu<3{4}Wh#ujxH{'^!qvf"PRUQC(/3:#PJP@u>2~gvNL.q:)ދypf;ƐDo|G3#xqPF'eL!0˃7 ɷM}O4w$ވ]ӊ4*<>|]jd#ʠ  l]Y'Zo 4=Wu0</ĘCx8^5$$:#?jm@q,Aʡ2!.5[@'C'~?}€/+F!*(8@n+/"8Jx|UN<*=PF!'wQh  o W@~^|[@EfqJ` w¥J*xc{ ġmzކפE,{;>P! `AWUDc2@R al~ׄ5c>0%cUG[C/?T<#MVaBNϞW Hemnѭ/ώy/JJsD\p(ʢ5fIp(Dym0`w1*0lκ/3xCJ |nF^6*-903Ia-]Ci5000 80Ȩ (>p0H0` @x] 3[D P*\ \ 0BP0`g J 0 p)A @ @%^q |8 \ (0 UPP U_ը{.D, ȰH*% `AIJTJ﫣>N>h+f:X&}pͅ|J/|TQ8@wB>( ROt?w؀hH/-eThIV$і C|"1R-ae ~ c@ˢD(H8wǿdx612ɺ oޞ h\y.>0 'CX0 V!2 B^sJ~5R_4CRKᰦ Ip` P) B$/L.Z%=$*yCE|OXBVyb 8<\yͤvR:AI +&ӰvWFOX|T_QP [hj XfO|K5O |<;s[ݱ,B#VUo0=h&czۑC[r{((wcJ@i KՆ6+N Be(Κ:?x|?O 1Is} ~{Ϋ r>[Wɺ{o3aM`* ѫ>%TS3XLj\#yrb8y0(œOXJ8HKm8GaY%O/ˎVhSΑR0Ϯz$xSqy &zNx|':ᙑٖB=!EbqI<`3*FMŌ IGcg!Ixc'Bg"?ͅ4wBpSĊ~gG%ArXswϝcIYEWW-\&zL|W݂g7S?g ) kɞ(Ns|:yZ ? @Jac]Iσn P~, a}BcsN 0`r9U`Azm` < >2 u+TIT${'0 K(CWe` @7P\?@0@x;o2`:P >>{Kӏ! z&??|l x0 pEEGX!*΂221z<qH(./'t``T% | (8!( X0/S_DA'/VВ>@D$ >+YB/x`:K@MKP`HGH Ş @~ @A"P">7 >0`6X?+{ M~p)x,@`<H ŏ>L4/`0!Ă1*2+>q@&a($Bj{.̻%XGV(0'` ($zH ? h~f_T#Ϡ/$p` @< >T#& `<'J< D<$W$܊!GSe` AbHXo`%Y@g 8T%@?<M']@"}=yX" U@3?ю 0 vx9@ D4!Ȫ"P 0`<@@9`0k@VB *X0ϒ<.RG!KQT~`0 `B{뺯> UCp0@ՠSN)C.Ϣ?1f%{^)Q s]Z 0>!a K4l0 n"_[T1`wP!e 0 DCʎIq, @P/NǪ_Kt5pIh@} Q,x P@ A=p>LGvJ`G6 v|@4@X]`:]UA `@V:P=-q@;QW[I@4!A'5֡2@ ./ a`0<矎N5ʂ} @PrA#'ȭ_CPR>  R 4Jn% y"*GEՆe7cv t`t`0Q(HL8|0`<'y Y<D` *J(q<1*z) 恀xA{z(ABMda𒦪/hz&TyL{1~ zGWMQ~ +h8ԁy1P|h0v H0C@<x !䎠X^`0܃`` ⾜0`~UR`jX0=p|Ku\l$]ax0c`ĿA@G)B ą&|]JnA " h0A%`<(("Ixt3|>>ҁ0 $]..#A0` 8uP+wj0?PJKV=mPD`|JnR`AP`9%=l?ƸC h( WǪGW4GR%K~Fp Mjپ }? P+}E@x4 0{!Yp[n},Vk2J<@=d  =Q}H R*_ˇ@D!`ı*h@`fCJ$z   jޏr(/ʯ|O+=IV @.x(< t@p>aE6 xA<S< )q?[qHz̪I,=#0e 1 |H̚:O KTOz qʃd}}U\(X İQ~z0>ty3˯+\Wz B}AjuJPPgJ8 `~>O}I ܠ@)f``8  )j``9JXAQɰdKV >z:ـ w P_/}z!ExUI`?G <>`z&A]V 3o4P >z @.q\'``:a \솄$A!w|\/` AІ\$yZB<,@xNE~JNֲx`; ʥ`[|Y⡢ 00` ET=,x(? t[j K@0_EC%}j 0`xt$U0z#!Ӏz`9|$ gG.5 ]v] ~${'6K 1(Jo۱(|>ñ¦@`UPTJ>M<H0//Xhm~@@TK0? uŅʋק?A+R]N<|y㐥y0@ S-@`B *4%m1 jWy!J_0dr]JU|d /G@r*_@_ >Q{:ni x|BA51+ 0~, ( 0QWā)V6fw 'ДA%畧ߡ>%+|]G0@  &G@ 7h8`p  E?p ad% C.`B! *p0>(:IxFpp$ `0 ]U*GqhU@.O \^T̃a?ڡP ~chq!K! .s`DKL`yB~n@x  qg R8 /;0 x0`uK(QהL  lWǣe*Tt 0wnTGvCJTU tިAVǀo/1 ˀ8&{ `|.rp?t!_K./*f tKĉ')Rn>H $B^ @`;].T 8]:0uO]Q7Jy hJT 0` 2@ ANJuC%۠lp\I4VwMP A;R;)pkA #񊔟fUׇ@)\AR$G߁N>+A`CA_#߁(0w @ @%֐O`9A%P*^bC[G xA^PH,K E_h `z@0Awx XD`:` @x\^ ՁUVl>Qwop0rOm`xz ?]^ V 0>Ftf\>:P "}գz`v P0\Mixl*b~=uX?v Œ% nCU>8z0P0!XG$Y\5Z%Q|E`O< uCP}U w6ʴXC D/  JC(Yt ("αNH8"P0x %ˁ`<`0~Qxg:-0^:Mn@`p( ˂A\` +o^Vd@ 0A1'?|J`~6t}DsA  rQ00BU=Q|w> ~4?A. xH0T., ` |$x\ 6߂ʛOENJyv3V_}Έ >HbHDU*Dp%,J) A K `|V >BH0w = g޾>jja;.PC0`-X}_WpC:$++Z|#Qp0a ! `ߘ@a_SQlOy<[$%!*//?S`>%R=*> %=PxK =f)6)NÂ5B`KI G?`p +Yi AHtFBWb1/B0/ׇC-h8s`HzK t7`AV%0`k0%BAAb~><0 rB8(!ꐄ a< 3˕@kޘ` > G.`4<T>Č}:xGI.WҿSo/&j T\Q0UK.9Ҁr`Kc+U$3\% z7(,"5 z0% `|Uwց/p$0! ad}>_*O^;k,0X Jp0_ 0? ! ~U]Cנwr} _uJ83}R"7ڄf\B?>(ϪEMGx @8iU|`Bğt)E\ ?`~ P}~K]G ; A&4@8̿ʕv=1r3Nh0yA/u0 ĺl0@y?AA+O4!,JrTj} X$. 0!Y|nՃ W^z% 0>7U{0 @D.{ Z3!!PAx*<j\\Ek T u3wp8ʀoyQ400 u, 0}y v  LAX 0 񤊁`D`<XJVs*y/W`>x8_ ~%SEa )!!byl0A@ RPA`?F/BJc/p`ͧz0%l00 tDn_4`@8`}OjE p0/p3w`s p @Q*J\>a<i  E#!$ ^@阑0@tK$@5|.`^G꟩Z0r=`f_=* YzVч0``;畃YXɅ@`wNJP2TM81{ G.W`UDZ>$`0`db$*P(/`:AJn0 `Pz*H <*wq|= HH WĠ  џlV_0o_+_!}N"@y(WPtj|>ǰJW/֓z*8}?T$Vq yUl0`<Jġ>2%_|:kiʱZYU<epX0 u "P!# %@`di x0DbH0`h? Z zyλܤ@|( 0w|?^P8^Z %*?v#vXA sOU|;דax_>$~`Bđ&@BBD=*_2 0`+GX0=<A0Zh`A! Wx`A*?#`>w>~z@qǖF-CVbiF h0`yxK @1@g  d ef|`$x0BQpp ?[8y0|<V_M* ~ 0QK1Rw1( A(yX ݠ aq<ʣĠ`~URs N|FWB~ 0 XJOsi "]"DAđ,I}X1`d~pC(A. Q0y JDAҘ77O[ _=2S>: I\_)d " 0J Jĵ!U =ωSq\8Wbڣ]l  KMd @?DLִ!!Ѐ x0 V 0u%" z$`0n=T#^\rx0 x@}YsH0@  T{? h0B!~cKdU %X`xxOpC/!,<.9_ qz.>W"2u v5K[eIeD ?& hC .pFz| x0bG!@`K0EV6 p΁+NIv ը*/ W[+-c@~D-\`: H0a @ %a(A>%6O<!.^ `e.#ӎTK}]$ ՃcpQ0 qh0~߾w |! %\'8U(`CDB> (0x+K^K_o8 @bx (Gܗ$|`<4c{ɇ~G}k<h `K=U_09DKs^ zcB=ǎ/\j<%5,`]<V<%T FUB" `A@"`<xe#K6` hC"8pH3A *s>v 0Ѕsj Pt0%hd%+|1|ˤ xB E$I V8Pr~D`:A)U3*AX!`}A xՒ3O,D`%5p> ~ ##T`|K|0=!y4'6 R"T 0 Gw:-[OH`0@yL%Co|h p@KM?=x03ұ}>D, w@?>C/Ƈsh0!p?!U?%0! l~3]Gv``&$>EvZWHWjT]a $>0!-R* `Dbr3H 0x/ryhj`:'hJGԴ WET_rĠ 5UY@$~$FB C.j'xi@I `D<%J˱r* (ױ-XCWZj_dSW{ϕ8a  D_w?S*`KGJ}W rG0t6oxVWwkۀ,V B@e0?H O*3 o< _H@xӡ PRq}0!`\$y>!p>߉bIx)u?/ˋ>֋ˁHR 0+ ݶxH:J!Cv@ ?.c]aF/lDAR`=Uܣ>~=J5XTmIh!~lc}f% >/t  (KѓZ# HT (C.uW:Wc /QAʏډE@\ŕ D%+eUU ~.V8j~H:/wMT, F@ڠ`0PK+0X jJZ @0BǜKؖ%Gr  GrļK@ o eK) s!h?/WItGBBt8_%@A/Dy` n IGu>Ti)A0 E4OZ% @KC.o GvN`< !HϮ"]iy 0v@`~A X_x/`Xh>9@^~ 0=4NTyrCԉnP`GxBL9 Do$KW'Ǚ:vA A E$qIt)`pC?R;q~T~>Wǟ<| x0.oz1Tuà C׍LwA|V=ր*Ɂ>_^_=,%@`UE@//O(K`߸tH1[hd<| w?[ p͂>3`JC E*@8 $ q @@Vx L1| 6 0?!I_BIw˕ǁ@1` `  JS@0 ǢZA UIhDsxr nH/Q58@` qp!E m6 5>d2  CL }&" 0<|x/h /'.Vh8Ày*R]p?ʕޑA- ̥=! kf(JS'!Rj6J `@_^>?s@ŀ ]Bq! P`GduP HB-+& `A0;%X0AP;j,S;*}[ 0_jd=/D xX/"` `DuR+v@`D}Tw@ @`0e!+Ȭ oB$A GWorWAD@ 9pL/UyEjՃ <0p/2/Đ`:A0xJ.J[,Ǖ١(0H((H`U| /_m ]F@ >R>W#{/Jk$K`|!:JA0B *3 IAwG$R @  #8@CA`<` Hc-_)` hCPsp!>@0H8?H=lNƜqǢ@`f^ g,q2: >Tŀ_ -5dPQ$p`@0IL _ 09`2V#< "L@j<(r<x|& 6̂GP X8@@`p?8`@L>c@0>a(;Jh?Z!"PLhdla|S(w@}0M ``@r`1a1#K@~Hg,O4b:> d:s"< B hV>y,Z\p0?#_߁*"\ <.Az0 p0`x vd@ cHsb:1@T?*3~..R~A p>qw /4!Չ!P0Yp1τ`4"#`:%/1 eڬd@c 0jd s)8CYW@b`dA7yRzH%QyduFo`? p @`;2!PQ|~xt gHTyr4}0qsE@y^Et IG> $0J p>QHdHqK㚩Gtt}\V;d%C逄^"P0_q)?R:! `8A@+,Ĭ/@f'C 5w(0\P0`Rd8/ z `W~Z< +U)q0P= \|_@4(8??}6oOp0 Ox0%@ 80%c$v ?)D}RjEޥA}b`(c`ʼ$ 4`(`  hA |Jį͊~/ 0?1W"w h/`ctxFU`Ãx1J(P E \r*fq0M{00`B!Aip yRpe P 4f>jİ]%V#WXܨ\ |VN wī߮0` ]wR$K `t@Ml`9`A v?j_v!LKJ~t)Qzj/g`S  0@0*? Pv}ި:5]tH0? wk'*+U)>$<`_A`(uЀ @0!|\=*⚔0!$p030q+Ccٿ p㿾QJnS@ @`U  `]4̾}1ms0!<,˚ꆩ@q$% #_ L`vf?G@w%lc ӆK^$@LCV#LE `ATߠ<_xIC~ #BQ|T g#Mɂ8UEVK @0yؤA _,BqwQ/Zj @Ab$ ! J ꏉEꄁcU80`<4K.T/ @0juXCO@ w8  8\>T @xO$HPo0 ΥEt~dheXz yr":X;|Q&^T>`?s`v\ (wa 8?p?B 0a~%ĠQ:A VQ|Q~+a;G%3|%Q,H*` P}rGFB‘`<(9( !! `^@`8D`~Pǡ``<ՂHV̰/xߧ.ЇDφt T,[ATCЀ_(U(OtڜT@@&>G Z5gE3Ġ`@U=%A ru}p ja)ZCpPcO~`y`}Xi&>h0 `&$IzHP 80@0DQP`tZђ0  %j("W=ޑ>tXxx om\0 _h@UTAĐ`P!W*Qum PB]7BP1\IY ETڹqf@,AKJU (P* p}8 `E`~  ـ A%.2E~(7H>NP(WApr` ΗQ8 0XA*JVck@ #O.D@c:،_ :|dexA=aHl~ A4v='Gp0o ˇxHAHHx yCR)r߿lo,NH!I[W\`xtFR@% `yǴ@!:%`A j?C'8OD fzG@pA(/ TSdz>qH0"eK PS$>+İ` x0*Dz%*PmLEL`$~ UCs8t/J! VH9H`Azy~?E[tJ \C_{09R@x%P``0x^^A p!vG!; O4~\$*.|{zy孫XF·L8`y\ H: ]A@Q `y(KDbDy5@h ˀh0 u0`:(0!:^< khi(bD9@ }A FN>jZKz  0`%ިJ%_|G4 0~A[ `l/TPZRy\ جA ~}r@0!mHV^`:,.!QOD K\pKr2J^{$1("X<>/T%zw. Tƻ`jZ ߕP0 s}3]'q43Îa 00?1@;9pK.N!b.P?3ñ=ο[  <$6Z#ǭ W5 >oWh " & `@0~$~Hђ0*^?/ i)0PD\J")8ƾ5GKjS$A<ڲ'" x0  Q As/2<7Ԅ8|)/0I! |J> (`:AHT?G 0V?| iX0`u xĬP8%`:U#Ox~I xV0bX0 g}$\*W4`K "@0@ A`<"Z~\>[͘h 0` Ju h@` \`x~}0"CV.0`D<H%i80@\ΔH@ BxB΄1,KZ-$ +K0W,~ >4@Tv ϗ#]P`P!=@.,ELKr=_쀆 yUP0A zUCE@ x0>ڨ͢&੾m0FՉwT˅#!$TD,S|JϢ x0Q%0`A $I^<"][<o8[@NKڱ> X0|D}`BuHBWBV/'GG*G sa  (%| `#euJ.(tDo4|z4C  y}F(%(4 `U `lT&ʁVH`pJU `@/ 5@%a I//a~xWG~P9#^r@,C_d /*M/ g0? ?XLAUG T$2k .Hrh 0`xZyJr0ɀ>AV  a> uW;p0Yj$~ U욕|I, 8 $@`CՎįͿP 9@L`0  {` :A | BHjp0ew!< .Cm%|ΐJ| gĠ<% `[,!(qC٪ՎNĀ`0`r>H(J/l^ G`U+`U?ωp!A+gZK,_$7*^#@|X 0H Oď 7״AeP *0_tICWjo(!$@R>0`< `0 !=Z D%$~[U7 uzX8`I`}\;0#`8JH`CʄWg%{ eCEz0A0 * `u]<*T eRxA@/h|  VU^W6 >UW 3?V"5bP/P@Q}jTMhTȱ!H0^ IX@` Jį "Gp?/ ڿ!ܨ CHh]?L0`  6ucn]7P):Ƀ X0u#R , $Afּ]4 I JzJ:%UP >.($pڞuM Or@..UPT]eptXnt ^'܌`0X^\FBzD4!Bw.]( @$ `$xˇ#  |p0 [uQwb> 0 #`D򿽃ESp %eW>S`Gq@N@ @5WՉ?T\?بI/ I4c(&4HcˇB`ouP/)XC8]`=IT *u-/5<  d$xH(  AYz2Z4\A0<\\]U+緔%BpUTH0@0y!T?wAzP0 u@tG? bARI|tP0^~M J7#<lW 8@Wh!~j$<|`}g^J'M/}It+}ک^8%`B ˔71Z^;]-=sE&`$ J怀dJ4} od X0#B\F` w Vj6X{]w=#(`<Ђ pQq}/LJ?0 h`IEz*mD1-NbAu`jvlR B7Tc,_QXB|@G!`C`= `0 z1UR\$+4| !rԀS5xJPCB$daBV$p^~*0/L!^ 0BX|:ϩ#@/ψ!x` pJP@Q5#A $J0%v!JP p? 5x:c!,U`|1  `DD`< V WހO4 0b@0bI cRۗEĀ`8J%.1` s@`Ճ0 80L')4[7ҁOM.ap}; d 0 `|T\=TGfV7.\xAK}ƹjA* }T  /V `@QkPR``2l|V_`|K~8~]6$j_> EWx 0>Lw]pD`x ߌ2 %7D xP`<|@yTLE" L %uJ. ;&*0\VX -bq` %O^`yx KV<F$0=w0#H-1L$`B>p!`<.!`<Q\ /ȘdA %H0?%"5TKޮcݍ%:rPp!_?>:(ux>}UD}ɢH0! @V#$l. s0?!X0E% zPy자V y0\ ip^%%>R ?+יQ '`A=_@Wɺ# D X ,pGB[[J}yWdwpA@_ EWi]0$!!,UQwRVKU`@ĭuBIC( įsPwF |`BRA Ob7ʗ6 @ J P >/`{"H_ N>`(}U_?b_6eHW 0aI.UJFEQ&CDUBVU`Bġ$/U${0 jĠ`!( PCBT!2-`%! 0Dq\SA( $` X0! .( `; R`<D^ѧsh0#`/$!8 XAH=WDQT*@` 0 .`<iz`Y0>#2VF x0$^ O@`IA/,> Uex_AswDZ'\ 0иwtt;V=Q +ࠁ0>OЁ( $ `>* #y(  ixHW' P0!>]@ ߁| 0r~+^\\$U*`<6KT\^8I%U@yeA.*4O 0!*G-80 C! /$Ї}@b T /x*F`8A`( 0"ZC80  ^ dF$*^_)  @We y$`0!Ġ E|Vr`<5H0w*Q#d."rPA*ű?@h 0rBMU@AO, 0$ UR@`| $P! _xE@ Ip> .; 85)S6 A<\ 0P%kT A H>!0!8 `o!CѡP@,^\Pje ǀО TQEC AU~Az"tĒ{`@xꕃ |1 !(jF   ``~`V>}P^?| A*B0m$  @3՗I" (W`4Xv@ v: .4Q;v A}P?3;g.0>[8`Bx8_PQ[ p̼j-N+%<|9РA7Xf[< (+{އO gU?pGp ~z\%)ӎGj謻u1C4ESP84dFy;]<,p?;Xf+[ό#dƽ=㱡za]ar J/<n%_@0RӠwl"ZQKc0p||ǢLߞ/[OKC|1NoP`AAE`U 0bX00Ga<Je`z x0?6 d@1 &* BSS`< p0?*d{}_/ߌnBu]4;NL Oܤq1:K~bpX] Ļi#xyoO )<2}<+{Ɵo:1˪eP"8 ]WQdH:LdfbRBĢ (!RDXI!H̐)"f o{MFȜuA,36(lKcDѠ( ehNJb`9dh=`#T#hH/@tAf~N??ͭs_FbR[#B3јls7/6?#BP萉)0!=mo+!1 x^}ᝬurΫ[SyOʦpd E{ܓ t0o{ۻln܍†3I6z)Hs636ɇ1%F:{[c x0VCs/}:{/S3?fnI:i9uAiɩtU +?!n վSS/:tp]ꩤ4~6d{<;ޞOAp?":}^<<3p?3@$71Vtd`~ppȒt= *Augo >3xfxf'oy}&8s()2J ep.„Ͻ/FzkI;xfXYB5gÛdyyp {oo_SS- n}_Y뺋~ pp>? `<([ *.g$Cհpp =bo'n!\l}JLɝ+DӢ4QVYV9v iNb&n󃧫4?'Oxf͍i)fsL㞏 @(|@:\IJA,2Q~_)Hz^;<-/~R*āo`<~\\%DɃ1USOx%z'& D$'8Q$m+lyF{Oz`G.}TSIL +d)03rM{<|J\P_EZKAQV3BXIHB.,!#L (f\Eq1#A Jq0`U?#/_aK/E'kŽ~* !$ @9,pFIXTV=x}wtv[?&G+p)$Juϩl .oXcQ :Gx;J/t Xpdpȸ+xf Ca YJDoY 2kFxNՂ0Hq^};a=>ӟoa\frQψȢ,*x *Ept U)#NV\V^2Gg7~vv]H=e\10Q ^~0 =orA 6eƲxՁ5J<`A>ÒBVeY^tC_IG^&os;Q &ؑ)biѭL3zxfH~),R͉l3*N}gv, TAa a]=[4>G%IW=::^@?a'.xdxUsfHBxeA8C3φbMާ!>EǞ"鳏G 3`t҂XFBCPMT&d~PL3 3_ϸOAZ ˬkFz>* Jap:vٖ Jg/y<9&?idOlds=#SpdhjWGt_2|2p+z{C^7Z4i77[;5R{|dȏCɂX8\<]<43 x Ș|?>qs 7c.0h0yqaڼ3_M^}K=8$|z5*:{I^< MģnAupSā ;F"ʊBk˼3muEO OG(T4){[}"Wnq@6Џqyw5tVA~=ϼ1,Om /% JBe<"L^Qg >;P& ?>=Jx(Aq8ǀ)}{ݏ!k:gFLθS C4>V%{4Km6 2`Lp%`QyL,8 0M+cn ՗(8n2ڏ,/1OȣKop4ˁ ^B\;~ 2 VxT{0#?%6hGGOӖU!LyǂH*H%RF~K 9ފT1DdS E߿!*e̥>MI_QQm' P_~9$GJyX!Ѷ 7= 7`y x8~Zi8{kzh[!w-6^.U>?[<_)š$%Vڢqx0^ʨ0! Wq\^R_>aI8)PBG_+" x0B_0 T+!l(aMxDӟlQOUWr;ĕT ] c]@→NdJE'W飌<-Y-Y*vh2a>3ԄYhFC ]T.ԃe͟R#]ISKeJ!> Cm#@}Sv"?=.t?)Kp+߫nAH^F`XYWYԿ_ :3k ss ݴ1m?(mZa^ؖ ?fIOiry\0]/^E7vLk_ocDbooo~T>VNӢj3ػ&2[{u3CL AH/Q/4X~CPpf%rm`gw@%\RG~v}k2Cpp~"5bOsT>0 /=Sx ~3>>ġ`}44x"fqE+ /fw^#h|^;U܆C/x/ؔΓZ )н OFZS$IyA/+l*GL'CSH lm!Uia+ԧby'*SՎ6x3[Hq 9ѡ.qqGΝ )Ot(:K>MY">`FA"y($\i{d%ш!EdCo {՜'g+j€MO= O x.T *@&zɹfa"E:?!0cËItkג {s~:[).9. pRo3oƻ[7 ެyzinrqN-s;ε 9)g>3DA#|P.E:3 53󯻭 3,>yH8@W[dt23/^k?aGG7_LU~6^$tD8`L:; q_T{[*-&3zMty.wy3I΢KAWԤJM)/#0>0 +xs o"Ҵ|v_DWypR`,IP `C2$ڨ˕w0h-GG ð9``>4J=$xCP$ ܓ}a8:sg/x&o2)>m`0a ԹP9zK~KpS@y0`;0$!+)pʘ1X0v="!0`y$ @|M+4# < o?P  u*o*xDdk^м92B08d|-*ؽP0aRڼyJ%a'F ;3ÿEJ7T/_Dw)QS 8"Qyyp@/qZ*hhRuB;Ny] oWxf 0&}MDl6t!0|*2h گħ80 A hGUgx0x ! b+:T?WT1G?'MZ} 𠚰"  MᘌEz1ĪT‘Y|| %yD~R\$3af 3*y8ȥխ¬aNI. ]X "߾\4UyH;<)A-Ixkh{d֒ /z=7^-[ ΀RR,84Wpe툱Ub89 T3.R%h018j!9w9]oκ6]vH=;"l[(C"JVeDO#|I_IDbq5w晧_i9sw"c,7ĹkS% p>D &}SSkUi:t^qN ˏ>\x92i {ߟhi-qs*x|8_j"19M&opSj1_ph2כWg)4-O 204z_Ej cC!+* $@8{a82.' {8DoIL*z^j|y.u(xT>OA\gt +7]:Ag"z& :d2z>lg8 6t@d\yDv $t<@mF>@5o&oL@=f  г=&-?+9Ѷipgpd!28xͬ[?S{t %?Ipʇ9OwUO|8laRC[ F/Si~p?>K,FaG_I\,_2nU2df<e.[{{Xd65rͧ'[Γ8@A_+ +yQ~|.a Jں *}M#%)2foA7+O!\3[s*Mp)ι.>foz!rZLpA.C#Yİ`< 6E2U@O)?+x{Dy6t `Yy`H)?.1MoyGN*xJ HߑOSbrf8Yx|`0 ]P*EdzFg.x%>s~a GSM!'3a+[gi~C_϶RN-`P#S. ',J#q8,/H-rJ*U!n7SS+8fNosc4͞(9`@w `<긤@7z6FaAVrS%3ZV<[jXWaB,2ߊr[ytn:x),b`BBV \Y*nu]C;iԕ :$>nJKT;Ou>#~ %jy Q(AxoC֝_ zO 2FQzY5 xy(͸Nx_( էL脮_O@d)Af: }++~i Hdtv[W o$Dd7L({˜,%`oVU߃~@>Zl)p0ԗ.V|tp`ۧBR()ˇIxUhu8_retOb@.疴 '9֤7d>B)t} ՟ !#`W#Pen[}md l ')n Pev+#:sЂG^xBgyNd<={%Si֠W[4H}xd xf4%_p?=<3x8`} w+%cz=~4mD,Qdx)E>.[X3rU^R?,բ[i5.ϩo\ pGwIOyWF?Ea2㧛hqyܩ8JBB>9T.~ħC ,<Կ !z{#O $=~>p2OH`S*d4+q'<75doo8sEژ*|0*, D=٦q'[Z[α&qyй.8Y?3/;{.W0X> ˀ9⭾ ]c5}b[vO}En}A;#i9P[}a}>™k{#9#g]s& 6J(Z2#3+w:lp>S/ 8B^ zxuIuWT枘kOp>{_ $aϵ*;8u+mpxޞمf#+#P@s2rԶ)/G#ā*ɂĥCmDd7\%p#4O\xo/6*d@$KG/Tx #Jns;pd>uĭqzC ,x>./}`_ x`;/+;odȺ4F@x%A_Vb b@irxIF@%UfApV@) X} ߺYP!X_>Ryu_*~9Jp- G#pp?>|=0eq V5u}SP|.G 'x-F껐 q0 xBDy0_D_4[rp`7<0 /ߏ];c* "`iPQbH5wvz(f bVt r_ 0(!T2,V'E*Xh)*墁(IS?(gP?E`8٩SOJ<O*?h1`B+כ0N8HQ@̓ NlnunM|}Uxd%jxS `!:x| !M|3 so}k8"#x<8Y3`s? z A\)IVRKWё0~2/DׁE b6T#?0+HܮxuQmSOq+#Rv\2 *<b9NghOnwFy4Kmә/Sp@$HS@9XhzsB/P`'jR8~U4Fp zAxRƦ mP-kU+H3X;&߆s8$t`Q3Et2Qu+43{DBSg| R Pv^'xSB=Pb$'<*Q‹& 5 B$ YgY0$,]u<\Af/zxPd GO hwr2 9O|Q<1W|icUͯ\5Wq  . dC/*N zI R< B/0ʟΙ xAh~mIbIp?g.跆Go8_ ,sJ=USܠ>i F^\TVY\|lәcaM5qCO$ MMS @l\< 42qt|o{LsQ4pp$Y(aT#u`=)\tiSa~ (TW\fS# 'AӤaO;ֈ_pd"zUOyXƒHi6J/7.P٧D?Ezy˽Ol$rRI;IˏlyB 2:<%ѿDgluQ}#b.g9N7L菬i'os.xݗ6 ϓʋdmugbFcWK~ @%na-հ b˺,p*K>ȶ+ -E;N^9\>%:O 'AO}q}=rd"{(MˤJ<]Gt(P`|G?̈xfg; Vh) 4D𺍆w P@R 'T;VhL# JOS=O0}K|GҎ$ ? qp@*^)T]!Âu'0h/5pp!-K"Ϟ݆a5 ?Y~wcOs#ۣO@3>z;-uIa&j}|%{S齾Vuɚ4T{9-(SoH*Hfm82#"/s"WJuOU8HnISI±۝SG \%rL5/ap0A @}بWs׈n`[GK.T^;Ψwv;u}}[kS1 ;|j-V.GQ up+oblHQ:ƌk//pڈk5wSxǞtr{:LB׉p<ƍ8OOT|p|y };H-ͶqRz,,~'2X)UQp#L>UY_>yON|A CShZ$GHq>`2 8`E aOឭ<^i>8$A$E3[՟S?Ռ߼>҄B@0?1Jo0 DE~QBw*reyD`zFQ)5wGsP(\@ȯ(wMEax: 1O0V dvϟUavq8'iMX[H2Te. Ow@Ў+ϧ /<ͺό fGRK}$8&mYw#2$ku2h6%[7di-ljgV<%uQO%ao8?Zp@qi@1Zs]Azkx2s[ z:cFT=;7A^p8$2_7N ,&g4ܻqY5Tg(J!({Jj(fh[@Tp!p)> ι&q3p^T z5ON[Fjآ2f%\ϞV#vV~fQ td45cx*=ypp)u=pd`/#F}MBlq/͛_sC>~ nv^FJjotA`)6Ǔ2H.oHD_ώr!':l9+/ C@("?@, ׈͉m!̿ԝɫ p>܅[y 0 {>9;*r:y5.>ߏ D?<{OJD&7G!KQgDmA`%置_.Sl e tT~WL;Vs{=َ^wJ],F HTy8J? t^;!ؒ#WһN83:{/pSUxfq{YWdUCbPqΞV}<#Ǟ{9WTMm)Z82! S÷ 0ʨB>1ь DVh}c!MAIXV3i"@J0=0AxW5S퇭6#k>X7nϞT<?R< H(Yp (B^%P@:NN.Vrӂ;GTKATUbWjfԆrX;>\vp/gЕa\VҿZ-v9(\xrcUmv ! 2&GD7RJVrF]QĥVOOSǦ5/`jYp? !3>%G)JZpޘFW dk\=h^^?U\2}BV_!O+ThOjRL"OuzSf <*+}\xf>C-cj>Oת!LL<FOf!7*>Gc?4:D`cH@8.C!!XkZl{\9ǝYw(s@RGKUNu#D'w7@|~]u1}i]ӹ D!ZFp$GLꌹ;`b>2{ظ}cd 5sPK: V2姡('a5,՞VG|- Vy.:6 IÆzB`i+FU0` gܓglywG^/}Z)hV26pGJ`AiHE*O C#j `fޓş`^m3K25O 3JLB֢xRx3o ok~:/mh4uVq;8N^qOR}@?p{71iϏ\2댤C X)x8.6#ˎqפ ǧp?AO S2*!GԦĥiT#< fϬWd$ooss}\. ~\;bp`'*-暈[sXf/7kzf]ܦFgYT-c;0d%y\%VZ۪ }ѓ.?s B AѰ4!` `A^ yz.J:p.Onzlnk0ʀ%<3|/fzpR8'@$뻿NӜDa83:N-${3pܝs7Vg{s^x(ͯ"s2v_/~xtwitvvy0PPPh\e^$ Q@Qzсpffn*'c! %8!1/U֝a-yk_X.ӱ޶ڛ}{IHx)BBA|l@sA@CC!Gxz (Y(@ Tvʒ³Qti9]UDe֎wQ `< `i#M FT@%}S'q% C?d7o]㞬{~m |2 xdCɘB^X4|D'_p%&u@SOH=X8GxpkC6_hs^ !xx\5g%s9zcمG=ܙ̌^WhĴjtsӆaNx^tsKqIg},ft/  #u3:ۇT=noʞFpFPq@+9:pB4ָ Y^\q<|e2HSP9;&N. FxJơ%U>BG=+ 1%),0p?7X Ƙ[wsP.& v]@F;U&Q"ġ 4/rJv(  >9G|I3!OxouE<):? (4^?N$ “/ J|Aw75 mKLC?D@=OxFt]L\_7HF.CG^^% bB+1 uD˭Ǟ2zq_}R30$IW<EUN*ɵGN H_W$ kzxfp3zj x />qv8ĭ NwC ) -9({=X5u=:/Gyfs{s1%0Mk:%m(gTg'>'fCH_ݧmyl3wv@pzJ?TF#"WHQ!wTog膦UTx: ?P#;<뻻۽Z=:7;3a lS!T+SY`+mjTiKRN=-"*['![ 8 n@wV3&8_&MPecFɑ"OD S<^(ۉmXk!Ln+R>9|Mt@b>'B!o1GL+1xi]S͝TG ,FL?ol"iV(sӲ usdZ.*LDN%tIUB#=R6*}zr8@I8/q<~ p?E>?}xD>^ '%q{3ĵI\?/tžCx8_{*汪,ۜ}3[41š=)ʞp/nK+WUd + fӎ | `X*LU{/-2$ x8i0  O 9>h&2'&PNlD0  QfZ377Gtf<8K<2WFPy׸h*,ѯ ,K!BѭG6Q[Ŧ`jxeMBdGURr gu0yѫ!~3O`D[5P2D5~u`F:-aPg p ]p+k&3h  7k"gUg 5Ӗx׍5v 9rur5SRDa< &ड़^9#͵o:uՃ%G; Qz;4 ﭝ}mzےxt!I8bXdBx3xa-X}pgɁOFL|S i 'M ދTx8rn_[L9= gG$=f(Gru/6a0=R%J(˄k/eaM\O:}đ =Mk(d(P8Ft,<`~Zr\qfql2,2ŊaqyQ+#4%f3)/WLmMЧ!k%/&WDh?U zv#(b>vW8Ru5h 䤡ȍ3zfASSQQ KNs9/P/[f3J:`Dx8_SI iz@z tE' < 6 'A~z,yZW~|Ud)!+#cQ&Br''*#9v7Bx$ @)Q-N R/ʷk;iwHOO"T%cqu/mI=;_xQWP| w!. հHG({+ﯧ (H?D~p?KP\*A^ĿH~:`  Z'pgO-*?6h2rn`xWXma\gsx3 $  U+ >1V9'/.B0uvZDA{k8 WBɉb]J/=y& o0p?)Ay>v=?Ӵrw鳤ٽ6޶nt3Or2s+o73)iH[O7@*v\%0DΈlR{c9wu}ǻfAR !3G4j$@+HF(x+ Y2R*,3 y{Ʉ =x8Fop?-]"c *?nU9:/.[ohSSǽSY|"'c?EVq >pB3<1GOH"r2yY ?4=\/|Ad,3 zB:U\2.\\$\ .܆T=j$U<ЍGU@Mߢ&[+>gUS܅fLzbw0eΟy~ C=j`4jqȿ!!O H~u<8.2]÷Mgg@*±&2Ki9* 0D> =mxǜ#<~,2  Pd$'z\u&x,&I5LE6<xJ3 rU 8@AX͟:ʜ!o{8iMϧC6@MA<@)yp퉑9ϳPLDM2Y|&zsXp^et5y[ X]_SD&=G#9YUq.oܮi>^zLJ({8fd 8jW| oxҬ>xp>ij ψp>ЖpX)88Tq6.m'OD25?.G@.Ж6x15]C!=>"_pvO*z+t+O&z*fINr-rX.! q[Ck&8vnFc{ ]~.xB7]>:% ixy5OƀqTあ*{ mO߁GcE^K4`G^j24>mXbfXd#w=G* S h`F3ԆioV]䉍IEFҦ=LCE >AH/gK-/ aU }]<_/ n%2\X8IĠ[zX<|^ h|4'("ݧI>*<\|GþGAiΝ=Mkmu=% iЦ+xYp4!1x }*XfW4 !)CrdNhп(Rj+U[!LpP 1%u$O.x8 &'>eygU3Ļ̜`d}P±rqO(iO K}Ht'?R=n :; u)c ݰ(ҽ#] x'Q*1?~J<1\L*. ι򘨝Mᒘd!o"KX8{`><f2!7⨮Y? ]xSUg:0l7",F_ C5\2Xnpf<3x#p8@@}b/C|)xXxW+3I Wj!"o4"g{ 8}'8J=ᘉ%L7녏*k]'K8~AOLL{}] ɓ0EXf3id\xG NS]& ;,=*x`yψVT2({WXda.}<~C7dЧ xfS}\ pWˋa%pEZ"6pSVN^Oz+ ZhԽ0SV30:xfp4 /[h< 4 ~pI> [DCԎid& PB ~3t!~W_#/D1t)]:`IJ+}xp)չwyeQfMUCҰO3b4 Z [jOr|&0uV%pN7%Pp?3Lhv1.E'.(*{F2[Wwc"ǐx%'sj'L,B&06:Hg׈Ul솆wx ==VJS!7Ah88 #ǑӝC74oSyN,r!JX? k[ޏ8q7wO9vwatvކ>Z4x{(舅.=ìUE7!5׸nqynw;2ywJ͟Gn܍ +)0e͂9b2%C6R)U;V{e]#0{7O1j6#;58?H NMjPFT W`y(q:1PT"Yj3ׇiaSOEډ*5禗V഻S<.Q^1cоuA(&'Ă8,6GO{ +zeG'7&$θD&D;QYw~ZyЖiis$z2 D{D;`O >O8GDWs9IGѝXeǪF@1$V |#{U*ˮ|ё78#~ Jq(.s<`LԄ-T 9g`\A@33{|-<.U߃?'Ll?x}h6EOħF2湌zAfҰX x_1IY[ç:vmPus>]:m޷mzA҆uQI&!'AUqJ#& L(:Mb# l3k7SE/ nf 3 OTq Lq?lç84JL/O$#7%IHz 7EDRGt(3ucz{y N)SPpNkiJ?}Uӗ_:!~gSAyz==K|8Od %,-ѵ\ - E1L7!af5) p:;tjsGQ^ip 郡EB\w8_(C2)!q>ͬ,VK }wx3_sd*d{!z4ew$秙>m኎)*b#)|>{&VгK)POd__$>/`OlA`C8^4/X*qƂ6aEz߮UQc 8_gS]τ' !h?ơ#A ex-teox8_oc9AϋjS  l㝬 &pp5*bCf} 9w_vN ɂoz(ͮ/A OCmV#I Xa#3[S -EN)5] 9Zw@+r{F$N$=r}w% §YL$(txb׸/0dVw{{­uހB'xQj)ƛ5߁qjloQǸ2!/"ð/=^]_eA2/ a٤)ច!,Hy]ZǵEdY$ᑫ6p |}}flc j߃]N ߥ/>lz~EF[> *Ot46QR%N"zxe/2<i&{<3'R&fV0zM4B̽<йOHd<޶J.r{*5G.O.Pp[`/NB\"8bzqjyYͬﷸ-qӦ$TZᓖw ks_5yOCO|:?urQG%>'%K|%x+<>>vyV8FgxP JpC %:28 q5GQ{^(d\ai꽦l gMޟs d' 8P  *F s2Y_0![21"E ,GBSDSb4ą^n1.GeU CAxC!J@5Mzn9ДcYn^5i!v\'T"9 B"~p}sĉa0ftF0`H?ݯW 8KXTȮ v?)H5_#m  1t;?EL^E?Q xoO*n@z28k qf#'ºqg|pd<Xs :#Uv骱b %/R꼞1pZdL}Xd>JRz:xF1{G4ĠBCІ㶉hDXRF}Uo0L p@˜@ (|+`D u@p|Fy7<$1RoU}?٤b_8 ztcIJ@tAqԄDW8b 6A-#7[ɴA))|6N"Ca>I#+/г+tXWV:Td)qč >pP>.…4@}02ꚪ=W?4qs1X񼐔U w?¯ tO_pE* &# 2,*|,#s*YP2Pi(i^-( ڇUyɫB8M6(N8#Oܻt2 R?e)[6G0KLOO2t-'2eధΈ KI'@,)Z<[#>6hA1s7;Ft):^2v{^b{s]D/ z͟ԣ;$!x `ptNLO cj'l4|hqwm4x'{nmlS̰``5O&E (ϓn +vuS1+_دbӷGXdu'v0 Nw+E[L $)oVDPU|\Ȑ}s@L-M)@p +KZ>R(z4>!T_3R0%E rpcTWmg"a9y{i1Z4+n]I|%l 4}0>` >Ev /\f+%/ /b.@1sG~Ts{k'KGO5%T]o|ce$ƳCj8D)O,$+}*O\*`_g\#Оjҙri 5j#+Ʊ7_LL10$0RBL+uHlE"LIeɔϘ)UB*GW~͊뒯 sMtenT|zt[>#O0$x|CKQFGŸr׫cg>|)p> nAaB(N=F. R>r3=HA%>@F [":,. q[lh=#NU^*QsT>.V;1^+'iXC{ёYe:M؃2qNGDyah,Bu9?)kI4B(ʘr.!(q< 6A`νpFtha':~f|?!ꂑ0cD| 0Ye 'HѓLa0BRL 'Ǫ+{UEc9͙:#LF**WG7+FNrD#p]%e'[IԿL3W4 6n~M RqL#yjR ƣ<ӣc4΍F|mJU46&pQpaS}/?!]FA q#TdhX7\blZ]z-/8џ5>b4H*ݍ4 Al>5ꂼ>`cL! TM8TJrd] }wb-h X3! 4@5nv0g)`[5$T`e$ O4Oq-h^\ȿh)XJ`g^9T]q \%&'S+NAXė Five%Cu"cptOb\ ?P?l%z ^>":^=S s)<R'Tpi#Jপ 2 nA T]p'YCy?>wBGĵ|MW7X_v `zrϪFD\ytZ|$]WD84 w|pA;W`Zxe8N^mxksXyx[ >\}@K˺AI8"O t>>\u]gsބvy\#-<@ <+zE^}wUcXymaS͒=#~;K qy&mkYl;Nt^q*,E@Jڒq31^:vx=yA/Nwv $ v0PPPXiۧGڠ zn/jdƶQ1Q˘4@PoVhDp5hT=MeHjSVٺDŽib8]b!)`|K{o>= AAA``nҿV"t/Y@f#qKA.Tb*/:TE1 n]9\M4uHVKwR2ד=VDpo@sŃ1yH\?l!"̏:o#'P0+MG罼&AC(d+.˴L<~צHJ9\xe .9sLJѫ.HQp Pd$}uPd]aʶF@ TrxdŮM}rO.>%7zzI'r<%`f#F_{ԐV#}Tzzİ<\0P4AԠ5B.1HpST 2r*QݕI?^#Q*xvx8DCQ>4>{ޓwN гGr/n{)SkzdžT7AL )5t87j HtB++hqȡ&8'i^>Ł3'=`mT|X8@&(U.i*z4:N6h_H(˝{T!27aU`^ˡ2x'>C8ͧ_{U?R97W j#F!Rᘝ:l*'Ecv```P?N1g~9c׌K@/*!9N~;1SǼL@ȆZ=n'Iq(UB5NUBz4AtJV1@m i*Dj@3 pOݧwFs $}" :I/!?{-pV=US\AVփ%տU<k_č쁪UT c^ /Tj¡  `mHޟq=s߯bos=^oN<JR-POj1c bK-_K@/)Bfb 1?<^4G9D;cTM>Bwa'H%hO+"$p3zAoHTL2 l˶+$O t! vU5Db3Izu\mL7$O \|AN>&М.6t͂<3~gRсhzW-C!+K˾" P|`v:/Sb9 G_ z;?6V4uCXg=QX`eIЕ)ȓp_[N| TdHjr-argu>ٽ zhuKAUGjF)?60 `Y# /,{ϼLIlV( NkGч"uT2| "ω #χ|hb"]䙒m <ذZ+p*ٖC΢s Ɗ!W< -Zl{56am2)xxJsN_)eKϳwHYql}/7I~FtFC&ph'oG*:ٱ'4uap몘_zzswg>3I3p?x8>WHSPF(3>XywootK*V&8Cp>o:6ܹOvKӡ֛d5Z>^P͎6WWma,"d#yЧB?9TE!}:a(C%NMǀX8=N%Ad)HdnMx/Is=p*az d0/*L'<窯z{*x80/7[C5\J Ό|zxVV}=Upe\1 ;4}&x2Tn$'d\||4 j%@@T qyqpKV]?B '[Sk^80 BC\3:WSlXl_4)?Rr@J/{CؑU ޿O"lcxfu=,38)x .*XG a!IXftG9 =C/""f%:#*@̻(fPF?ic< $6_8!%. ⵘQлt !MG P0 D3H0_@2WR_AMoLt; @`Xw])]<]jD dgCNhj=EfaSxe@(܇8 ''M0pDK䄌7؉\{DOyY w*PAoKB2@D'sqDwPuqᚹ/i0c-tFgxȃwsV[S6*uTC> p0(LS#9I9R*n)J`2+EJ "V Q@omp.,ݷ W.S &xNzԏ:&.V.O03 7+%H4";G~ s-Rx#Gγ_}2/ =iX:o ydža}+܏TlJT:S;Glh'D\/Rl2 ~{ ͽ th DxXTبXD;Ș^1,jlЯJ/I4pNb5HpDR[p ,4/_/q&nB=Ec^=Qɂ jd:A%E0ˤL+qG2{\Y {#;S?mN)ێx]0u2gGZ .5ϭ+$<<:nQ$aDCpl9Ÿ}MW{a-5 0 W583 C1/*5@tP>y:kqj^Mx8{Xfgğ8ȿ@&+ު &_nK%48'i_z 8fk ~S]YOq~lSRBvruVOOfа^ :/' 5i|{vm|gnDC^.Rtf}ᚪUyu_ǃ *,3 \M~u~$)ܓ,2_yHp? iHn[o '9_@<x!CPlStz :aP!ҷ́ d4 ˄C~d58TC/CP*+ ޥXf p2=PoOx8nXקS:>G7|>U4zYU8@ Ѕ=2xFu1A ,|pnN=S? 54ʞKo}|34XZ<@,kzB=Y]՚V q&IN;,¡|# f_J?=ZNgPӇƝqE0Öަ}aU*,>qML3gٯ[wf6~v䃣Л3܏]3!;2=i|t+WCmYVٞÏIO>}`)qf͞ӣs[9*OñL!877'A=9GDcR_^ @8 {䰨Du%!̟p9PȿC=- ];iCNY%gH$:f5t+FF]-=P+G ^+81E3^Mz8X8P,%^g+3/跼HAjj)VNJc+\)&ǏDo70#u蔨3;CEjP}I4̽_Z&O ')??ǝQIy&.y'OAOtz?4|xmktP7z.i/wg(D@|{7z~gyưk'ot@%C#elJgTɱq@XxA0W^h8e=> 'CD>%s8["?S3NWsUu< zy[ j]c0*t/O3iQ U!Ӥ&T*΃y N8`C(ymikmkV ;tG-a\ L D܅_F>bsjixe[hJ8gSi#:pgY{VhO 򀨸&OTv2 B F BCI|ӴzrDh-g''mᰳo=g}k-u0L3:yW;ÂBcr5oHpgć,Z25+<9):OiX~=V)ש<#dDxaV9w% wgċ=L>D00}*Ϫdј8|~u >pp$pd@4WVnO3Ĺ[DeO N F7 Dt' Oh"[z,h_~Y4 n81 !Ġ`~<:Ur >}M{he:*M}`}Zx' ,zO]$KiՃ X`b9 <pfk~!j|$惑?*Dʵ ߪ,b<LK;<KQ?c6c π"EǫTW(K&Nwnj`<|MUjG =ޞaJ0k'T -~2yqO"\k#"0h|6pFt]PN`81L ˼OqQNx駿{WRx/Y)M#S rAߥ;ǒ=R[x'\<-p3VOz1J2tŢrqLN{Y+r|>p2[;x& #s%z 2'zp08*tt/nU2NN_4_:ڱC/*ӻ4c$<=qXO{Oo)1pjh1T2iVkjATKT9_Ct\mѧQAlOs <7_Az%lPߤwt}u}tDL"VI+ʁ/aABh9rmEx8aD/U'qwy {zu{zsqR+'{Y[j7S53SZnٽp*ڭc3O;bk) -pIn-H+g[x bC&wV3qǼ͜m1"=' *e^oggA೵*%cPN3~[67Z=V|:k9Պ*]ަ[<[yԻ#>Ӈq8!UV+#/&"Jq?QjϾk ܞ@s(2x%F[Bҽ5 x3 jSooziH91'4e zw_۩<.X2zp  o8?PY}![O~̂ pAT_ꮁ͚.l :J *x8~xGe %8p>q{1R4w9 6H[K\$@bGT "Th6Q@,B(H*Za5E61s2"rəO `f)0p? >i>vͭ8@_՞VyBx2TuaOOmX*jfl@PIY710 + #%)/B%jMh˧+S*Qj%xQYP1.)V\[z,2{pO:t!}B y׾Rip?,3g AܼoEp/ZhSCh{ga' m*TrU?[9˳[˳XxR"a#x%A7H F惄۠)KWxXx~-}w'& K $ (Z$xR=0QL6vaLg{|=v#<)")JLpo%{n\~¿s~+qUtjDrr5 a޶%wKӜdvob&Yd {L[ Ƨi> S tT & ɆCQ!7];;{f Gh+Fqh/0|(C$.P.:'2|tl)-/Sڱ, DQoUWjJicψC0\;%tp3TvAFȰFsM0Ћ(#P44#O˨s˙5X^z0< o븭|^76a/e]_~ Տ> 0*#v<c|U?7-wEAd7u}Oevnd)t5 Y zePV3/ (Fd2ln^ <  cD*U3M=L]5NCc{FHY}2>&GxAef1_"ѐ8oA[m+гBe#ll2JW6,7MfSɎ~C px2B'  QUi$0J"?:'aȳ?lC+l.<e՟/p? ϡ Y3Ŭ>3XNn豛!};]U@sPNLEItv_dV$g(E؋>pF8_ѐ/9C?}y\?_:t؂Ku0o /Xlc8>k& (y5T1Y%#WyktgGׁEm&KĀ%,GgvY৲Xt`= \:F=עM83:IZN}LF#A%xz83XQ#Wc%8E2 ey81]PBսS8Z٢C&g*grĈz ,V~wE< 38gL wng o\bq8ѝ(2N@G:гF7L[mf?:?^;1˻29sg0{>θ!(T/in&)a@\G pAO pk{f*+ޞP8@ALrzPJp:Ӥ"hep3IpD^P=i',x/xЕDq_D@ VP?OBtvgψ82]Vwx-p8wGۨeGܞGA$*[%xbhx+YR Kʿ?USJ458@^ ُ|}EW|y<~X4' sRt2cr)є33NᓜS*{"5ѳLG)aǜ1O uWoh|R8\@WtKLj۔4.euztkHxw:d)(GcHD >RJmLoB .IN zex[OOϏ}+_ [Xԛ:B8?)Pʜs\2l @~*^nǏARE)0Gkv*Z=u8y\)ǵv*R@q@Qi .tnߒZ1%}T%W?H%^Y\xD p @*%<MޚHq?RȬGOPNMrPa5'*6D"YtIǽ<_UµoW;[+{iQ)*;tCR;DD*(A+ F+⡚bs^,BƾW+dp2-<482zA\^tx8jDt>d"G 9=h@uʉuP f}luGx5o7aC&U!ޞeNiP+lT@}žiχ<'sZXχͷ8}3&?>*+0VuN?u}o9L2_ $<"O 3xgɼ~Jr4F&$SBPU}ʠ8_ă*!<\qꜦGWs&J|R{pS<03Ca-frx??t3K {6kzDV3UFuVEQJl6] @8&Df|W9j *K~I,rS=) ΗIi cpzP*L2 @A2q:5 ? Ϋ,N4&=PC\lG3UC>б(g>E]sFL!\4T$qPQ=" aP'.}U9E_\:Ad -RPTv3>ܟ)7zj * j(kJH9qK\2 y~)3[ [rk{nBysˏ2Ob <[{՗b"ȤqXԾEÁɯҳ"ΉJX{uI߇>~EXfTJl4A Q/Q7~ߪa? 0w#+oE[-3?liK+xրZ8B_* aamWU@I1,<' < P0`"mޜ {s\sA ^A!^>X ^.xC/1ԗ-ވ''A P`~.e6A#0Saĵb\HpPJ~H+bC~tO裇@X=?~Izsnjŝz}:EWb2*hߍ\`bP#O?&xS%\>xgo}L"|3;O>am=8+NUIEt9Ŕs&QXօᛀ!x,3yp?=t t/[ !LNH!UT1 3gŁyDž6 tW'ԥDQIØ+ xe1s>BNB L2wg'z#po2D:8YabLѥ`cR6Og%E*' t*sDFlGB/_>⯁n*<t)52x 'ަAO\7A}V UX!vt]N:l0{"4RSؿ*a {7s ƁoLn:q]*'"_84 {{ ~Y@0.|>\Wі` AT`~DHycJ/Te 0 uAVX>W)ȹ9D@ 0o`AJ$qX!*:ˁz8AAqZ?۠s ,`aA9@~\+A'xK wS~ Hb`WKp`Ga~ "{ B ޠ0t}`ЗM x)3T`

>L?`pa,_`~f)!+ y` O Xc,*g`;}XA~ @ (#ߨ\ms%D?"0z`E꒝~P `3`:a 0 |'j0:Q0 n7 e ;?r@?/ax.SbXg O A`awՉc*r 0@xՏ!O\zP8$Ie x0\ j$? ?00'`y Tt 0~hsP 0`r9U0x$P@`<(0`K4 a<9'`<s@`0xa=9' M7욭Uӈ@t`}hVS #P<,mk0j75``z}vJ h %<&xj%B@ӯy@ZgȂ0ao_&a(K?.Vړ > ${}W) . 0QrE #`Ψ}? r<ZC:Uv ͏TFb4 A@}.4#P??.Yp*$5BUKˣ;X?R(x$P`~<#~ʉ piP0bP)z?U}a@~`B`zjEe@U@ $% O0`D  0y` a~H!4V=buMk1W(@@ /EU/ʭGR @c@u U˕(``R Aw3OQ&g! r 8u$tŰ0 #`$z)sGX 0_ Cl@I XBU`*> (0 *Ѕ hOUC%l9 0>ap!(XÚӤnQ,ApGA=UeѐKh!$d掚mI@>JTEE(\@<nA. \J KZ0@4 rR ٦,P0!C:)]`ĥP_*jvsA%mX%`J0"\P<Upu\$~չ_=xP ВA``?pW]x x}_ˡjsH^ ğ=Rk]=\%w| uU`}a}@}CG@wZ (0` # 0E$$R `ED _]? 0aJT%?ƞ˧IhXR@@H!*>0x]1f Ct ~=(8Up /h_{ G>p/<( p`:Չ 7>2H$GNq+R{`cGjN? N V?.+WVGˀ7z Ұ`<Dh#tX"qFNGbZ 4z HA hZ=(4``2vpf: @! ^P]$^%Є$׸lԼJT`<\W2l&>q*zyh,/y"Wm w`}&$`GhAhp`rب|%4z z|  QwSҨx%EbQ{WYNZp0A^Bǣ`0.DY`z\K`:. C] x0C}UQUP$(wz(` 0u <h txI ڊOSу!]À~#Qh\Gmp Z #y@yT<5מ\_K\[}@WT Ǡ}WĀSìJgT @  ^$ yZ3< hA$x^> 7?!  |h%~z|_|ה.T 0wBP>eE+VnA8 ȷ,0?ۥU]NiQDP@yip%|HժcGIIt]0%DpT0@? ]DlQa< B0%Qh&0%}y@b;>NEuY=dIp ]`]*sGx $z:"r(0!@}^sڪO8?x!l!Ԃ@lP`94 zܛ D=#y׽C $KJO\BTT֠;U0 !.V刺 `?jy /Pu#KO0⠅CZ(;> 0CB-`$ 0 E%TdzWx0`t!J &ĂHPD XJcDl CHiX8qywP{dB/TstJd+`;hAx%V 8^z݇`;=W eɇ{f^>DC |ġ)$(0_E:u?J4o@-/2qX(WFx렌Z_@<pC?BwkMrP@w%~R>T{`A ;"*I+]+@<)].w >:hx@&s' ?5X/UR{T=PzE  ph _9S$@dv`;|!mԸ| p0͉bV3@*,K?08 *|>OJO%0`<I.`<v!  x}«/} 0` .0yx0_CtH(H+բ# E@[!})V!i4`W0ooP_Ȩ!\SOgI q@!@,  @bWv @%}B,|${2>A$!=ev30 ok @.犿{Ua @ S}/6h0U4՘0ۚ4^MB @ [p:^$@-!]c?xyjX0 h+H(1(Ľl3 ,ы8 *T_ׯ`~__Yt 0 s)D(( ` jhߏ%&W5 [ z@T hUAn@AK0zb;`<~0 |Q,v_#cG Py<#'>Us>N-kG.PCAVyв `;WDM||3i aPz3$%Ozxz_=S0`;H~]t@a JXHJvLS0`xJղ"mĥbSgB~c{| .+\ FPE#=0 Bp/@`AD|RN:HTA/WD!*Sp@dC2ߴcPzq4 Ah> tJ#sP0jrzj>^\LiftjfB`:H `8W$^_" j|_BB0 ~,J fpEg^Uc=@. JfXBz! p (0y@5c P Ŀ0`L# xԟX~NQ 0 Q(?)BDs$ x+T|R< v:~hA`ʀO% b^+'A,V8Ir `4aP8_S.%x `<]@@8!U 12$ 0KkE?"Hc׳$ }"L ,-{Ffp^ //νv .,ҠEc Qс0BB`CU=}t`hAc(Zj(+P$zLR1[P0` j<~]~[AqH0FҤW`<`}~ \;0z6{ʋ@`;꾯:]yhĽ}3@`< "8 B>e `UPIɄ`pV`8 __ɉ@w|Kx[I灀sϩHA`UD`zN`O+آ[SH$e@ \ t<!RZ x /<+,|/'{įxCUS0 4h_ 0s\ԑ `8/V\2{ H_ t\$=#j`;D$ q#ݻ;%F PI)CR{T h0` /}OOv`τ:=`h U_ ?=d``A+T!@\ (74< @0^ ޔ: M`' xB"]@G~\_W Ľwa0a XT#`Y< d%*Jġg6?l~wéNUX:λdj) +!=| ]0 vbGAXD`;PI@^zE~aė T?|hHHAa ;76 BT9@h0? DcOH< Kī{u`~G꯼ 0Gv%EGUp`@4w `D@H`! S e#/~>h. p2}RM PZEs0\B8v PFWJ@*忿V+ƞx+ K81/yL ]kр0`};Ƀ7^vz7n P@@u_m3 0 DQrH0P?] TRT{[#v3A\V;=B$ xC ◨Hv@Μ~ P`9 `B+ܰ U"~\  0`]Js pSgya+(0X/&x/QG{',t0`< o+bH0!Qwv*X1"yQ+(t(Cp$ BXF.`, <vq>@Є>/T ,!3 Aec~(@ʪp`8HT?EK d x0g?7?ڢh0s <"9r }ď23d$K4}T=S TTHx`I(yE`99ZQ8G %۰r`r߁`<@@8MbP0^?U>$O zU!pEσ 0P!MV6WX`;A.YrLG 0+RW/H7)XG% ` D ^bi+.^K!*T x0xQTx럄\ Czæ *. M0K|_>ɪ-HQ6y0qOC( R_ޓxBP`@5Y}W *a`DYLDx @R`<8@|F}x!#9 >>/- uJ猁?`}T$ Cڱ,I/G 00K |>UaZS@x* p0CSo'+=@ hH} =@s7K)P`|A;Ϗz$߃$+n*7?(12zs?H0fA? @J04\^ /PM H=8iIIT(uʄ^ o戦jD/iCІ^?h0?/@0? (! j o {`{ x04j}H!|į>@I`S`8XEPv;'UC`D|%+LHоj}G0@$Ne6f x_ GT OP0%u<^=? mĿP%`(q(GVV@2z4`v곃q?ˁ|A/V  σ;_ڦ32pą=p0 Ĉ `X 3`@pE`Ǝń J  ?^=T%ڢ0`9V:Ѫ0 h?Tx U%F ` Z^ G1aa)I܇́ 80`D&`9B@j˕GDѣ h =( jX0 )8~\"P0 ~^ 8Ujt*1X0@t~d oP0`ޝ%$n]b2XC˨KP ˗ p0>D 8 *ʪdǪW.w L0?# ϖ 4~> (Y` |$ %+ s)2`}る" 04t"O#J^c0? 0p~AIĕe l#;-+ BPU=q0` :Gq0rq+Wh/*Vh`K9eFˌ *K<% yXx;D>$A?جMWk=<@Bԝ6>Y8FZ>`}>>CT~`1x~>_/ ā-P߉]_ J3U}Wg+|R`BFUUWGW |]sF#'sDA!cZBP0 +yoK<:> C ^a, Fp-Sg`L8ۼ0 $/tp`0>B@P\^xjz5t`{i"ubDW< 5(AL~bA|UL \\dr^=AwMBf(~6q{5T~La0  QPGefHH@Jb?{k*缠Iq  ݽ;ĺX SGn /XHVx|ׂ_D ?ƍ B ߺu/W=pA?ANV BU `0a !h:rp3 8t;/`0`T \WP0cpDPh G=C+ $TWAB΂P]8n 0 (q$?e a? ժRGvt\d?2H0DƁ 啃 $$[d^  #G`|A4 z8=R@vǔF: 0xx+ʭä=;0^^*uz`;C0 @2x2 >0 x0_p@a `BTK1F-_Tdo8^W.?α\$o\zq@ `cxaH0!@$ b %P uX00]p x RT $'_h| v u`O @$@QKAIi?` p0  E.ړ1!.T'4J@P +17JS:8_ЂTt/10 y(_.xIЇ 0% `}aJu@:{P`0BPG\  Lax (0@egA``C01`H(%  08?O瀆 <, 0$ P`.uR{_n|H0u&  XB0@%H_`8_3VZc@`~^W#bSA4!+ <%H4\V`p ACD (2<@P0 <Ia0wx@`GӨ7!`88~ ~Y?\K4 AU80a!_0 B.0C|U% x Q%#@V#cc UJeMy3@ؐ"H6e`2r7yX*Fd` rҖ{?"PB)U|@`5U` gAP ?A`B ^ˇͩVT (0v@ 59Y.0@`}`;B xCȾ"$t@"O'?{' T$0䰆  *ĥS#TDJiMP`<p@.WP A=R`~x$>d!|IJC.Lud0  pcdk%Ra>0 ~?]"AAcxH0~D/c*vI^( x@@  >RCo1H)px!Jpxx{K7BRx |">JT DA`;A` u(,$)R /xx=8T{\ UbTԈ\I[:iXA0q'# @) ǘm }AOW+%%D`CVj0L&>*X|!x8`@0av*`:GaPw˯s0qώ|8>W`M.%0 s"e!(?N`"@ V F(,ML}ZSq4E/ `[Dժ*VH,(U}3, xA  )(|;./.|`5AQ!x#_qTkO—cP`0L ` ]a?6u H0 xN| xJ `t`< #w|^ou^/ڊd`fʺ3L`< z$qZ$!+}_+ +<|%B([Iz$ptr(ZIRriBRƒ|``8B . !b?ĕct d &0@mXí@ h!j@;P!,TR>jGU=t|yU++ $J:VJ"7`dZ 0_A 2$ȣ*8 Kw*%J/ uhT (`} x^ m1`C40`9A }G^(0` A9P!wíCmss@{ u|>Uz<iS ֕. t.W˕+)xP T{hC0`:0`A "ԏReA+ ߨ pB`B@3xKV | p0Pa,~@SxKشW^ h!,ԏ aE"G΍,P A.$fOQs!=*6#@ `< WKu\ U5X0!=>a hA0p!+ 1uN %&>4OjR_J 0`t(,`}˼˳ڠ`<3`| B{.WDa~g=R xE2}Y |AJb+e˼^`B^Иā%H/no\^!  `<ǂZ:"vkc *bߑ:C\ 0 (@>>/+O/2y2?x"xOpm G^` !x?pHiXav!ʭ{E@{00.MPRB_ƥJ% bO^,oكY1Ywj`D+ Q6k!~*z~K}V:LGkCl$ _阫AD T$VbmN_İ %á P /:G-bR(M+/@,A0A'\=VRzO,  Q,/|_]$`8A0!Hx!6 qA"RE( 0 |Ky<Eibk͎HKUJ`DĿ@UQpK`<0 p$>j8辗! @ 0>pzO,l|N6#&lAX0pI0 `䬠 P0BX B?|%`; xZʿu^tH`Kw<3c/T6t(0 P _e%xH`:A%`zX0` :cJWP3S1,}W'W34j=h` h :?/@y @8x W= %j H@U ,`|7KM"H%Ae#ͨԽex$ VAb%T>QXI.G仙j; 0`<Ġ<}@.E0 2 0@vRBWB/ckM]#(]lz^ x Yp0X0~I@ 0*Ă0@8%@ ? @ _W<  0UKAJ|;ޜ>aX0{3N/ p(l]c0 ts {.6. 0 a}DQ arE} sQ/((Iz 0@xIGVh +s& $0B؝EEPC)P0ĸ>~P?.+CFzn2  $0`: +x0P0H0D X0\ T yp!!~ YQ80P0P0#P^Gk+RiK8 XH0/BWG, 0+<%GS  0 > *.%#ЂPC E_/3,!0 /` Ec߁^%KVP`Bā$^P?V< AJ `xJ j JؓFٖ2%6 nτ1AB3AJCP "+z">>P @0.ݕ0`;0E/ ^@((ﵑ0a]f@& AK"200;HUYp)@)dP@`p0>|>.ˣWB~K׳(Yjxjbx P*A|dEpPBjZUZ0 mXe}%(I .  .ޮx!F/;0D` UP'*+b>T\JR)&*P=^NX_D ,%" !/}` |AAT!X0+X(JjJ}!+xU`U tX@T$_IUy<|: | ˕  ^ R! pH0*'0j`XH  dD_&i[`1 .بH$0 0eIH@U8!$ p+P]Z`,<Qp\(EZ_O^]$]9@R``3+*`KˋH]P,  xh0%+<<2+`>VR QBQxC/R#G g?Ĩ.( l.>W4b &p~J0-dH`!T`x 53c WG|00( \zQm\zz=h0#> p y`UC 0Z>z\f _?ˇ%İ@|zzٴp& X0P0?"ZBE0hfAhO8A) ?˕&D> 8(`K^ 6 E0yZ+B/~A.  }>R @0` d,s8e3(lv8 dyh.HHQ.E`*/z0!`< `(G4VDZ_pu=BK@ %yn, e_墨f"X0 @bH3e4A'%Ϗ#_r hf&6*?40`7X4 CC(r x>A.WAE JV?5` ]fΐE0`4h0>ʕQ"O5x 6d`{0>@g6\> `{ exz$4v);H0;rx(>J``0"RYT0sw jB]`0@1x!yPᜨu0$`0@#4`;0Jā0 `(^ || +ީ蒩];@M+=X0 4},WS4v%X`V IQq_H2<$|@GO j>UU ML`p rR0Eh!*>$yZ_>K`2e^}+Oy.a2J0yyap$<o  r`B/5j` ˀ9Wwę=ޜi /Lw,ɺ 0y @T!<*"B\Fp`<tJg!+/8"V]*0c[b@Ne@ P%_/` x_P̨I%ᄐHB h )Ոd@drğ^N`}0PKpC.U( ` A p Ġ` 0A >)LfD|o  ^t8 oLf~%d2DT?3@͋Br9`K@  C`K hAB/1G ==$` \$ 4{U| $7< 0  Pdx0  {C`9AV |% tlQ=](A 5_@x *Gm38!|GC<[^ń`K>  Hhtz W  @0A`>{v40&0K H / h%@|/\?T#˘D\`<V @@3%4\ Xx_A(%=.in  hW7S!JP0E5pQ0L(, B0 !1|A0_T ` y`B]ʁ|Gꕁtѫ ! 8!~]-"{I|4=+,|« @ PC`0A~*V:/; 2$'}XNйB`C0?"P,8h0ʁ쀄ˁ [&US!PbB `>*}B`l`xD`;u$_PQ?.V bI7@$| @bJ}_ Ywu AF %7)j~Ap h\jt! E UjU $)T3j@0HZ pBQc<>3hWT*kC)E^frCH*yG{M|HvʥsEA/ `<İ`<@a  x `8?fx0EՄ `B0cT`%˼ 0$*BpX0|7M`9A*@XB( A@9K˄~  5*^>pq.hBիҥ&ˁ*^<`0!aEbQ$ 'g-Xġ˂0pɎAGN| @0@G_+`WA9A<A~,KUU4;ò=\"A~ޢpb@0tI }_` p @$|$y@Iꮁz x@c *V0>$><SQ昇N i|>hy @\ A bJ q_Sp0!s޿-XLɷ5Iy? ~(Ki `%P`p b?@ '_nU! `H ?(w*w2u[8A0( HD$2:IӰ! p`|P @A#=?. p`<$͉( h0 00 ʲmWnH>a^!,w<_KQ0`$ xQ!{.E_5Wx:b @x`<VGX*`  `<?Z].sxP03,D 0!0|'c`( 0_`z?5m("wI`;T xCQlGA`}$0/V>J) Ny. w} 7V?! j/vPTu@FW .?#E `:K !V”` P 0x MoM=AE:- 0w!L AeQyu |A `<00"Rc x *-Ń\@,I,/.8^$Q./h0 X0OZX0> .%^.D uAx0yg__5 0}#@?aA E`!E @'%$ e`<@~ KH 0x|jj0=EJQlX0! I00`İ`;;WY AB ѯ0>33d3]#7 AH% A lur$"T`H\ B K._A `VX,x<0`9|WAR:g`U0H-s0jշbA 'D`PCP>GPI ! 0 (AQG2wg!< d ZjeߔJDB?QCȬz(`B|$4`9O0A?0qG ,B`BASAuľP0!d$TKP @>jcmH0e@y/0JY`hzăx0IP0=MT3B`* 07?Eؐ`C $8H x0JV#bH@~4JWT;ĆAa@  04H/(p~" : @ A< ߷˂| yR?ݨ0ei@\`X0` %`<>To*  p`u5@e  qr, 0#``V%uR60 00> "p`<%_aP`<4H0!ĿF6z珱5!g9w99{+PW †LdxJ#ϳ))d<{ܟ3p qtecܓq3n'e?a(dXWm[,̵S{g79Orz93c}<7Zj^xD'Bu~PE& c_V>vSP:2":tI>σ&lV~p~\dp*j03@*ܾۘv38uַ)zy׽nIswzi Eꇿ $FhI}W-Je Ŏe͌ fBoI b0`;@4 xJWұZ5NĐ(}1>}sUvoOxoEs}\3okzN0 _ ͫ[п)7oO\p`#s0d~eGu9L.L7e+ˡ@q%A-UCJ0@WE[yȸd7}7#k6VLO$sM&96"+'xLW> @KՉ` pb>/)1i!mp2q26*JߧOIINs'Rr{E*2xf#l١}U !0Cy0l3Ox[ 03vNNu>g;Z6~|Ś']?UAb  YF]ݧiuuv28bc\*J{3 r7z c]iLjTV= LdW:03 fM  4_H Wx}no4wӮo21 E]lQ~*]ґ1Fd3! OEGnۻc2SgP@5xʟꧬӡ\ʢ*y}ѡ7j%LD+:TQ"DJ#Jp0 qDCᒉxH-dNt-B†ObT/I0٦0E/ϼK2 HO3U랞`^!oxfH @Vl<1~R5 :'JF\#u1U*`Yo{;) . yw"}|p?7Xf}<3 'Vytg]MG.tBٌ$֚qˀ!5 x/G U9}s"s?!:Ny܏<": pdx8c'3*d#31K[eF x_Il3"_bv}G<<in`0 4wMf[ܞq!sXvyYͺuxJ>ǚϳfi`s4g Y2m%J7WaκjSܶuf2M =yC )OsWPfb\p="_{g Jp>cz)NVy'9<3> B9-p7\,G_P nNgc :$.׮z 0@B= }Z~Zx5A*@$`wDZH77-?{xfo R Bq=R>WU4z o 7'5}\ɬ<388۬ ${L|/pQTB3ΈU#]p؈:NpG"k6-ѧ#, ZZx_vt)VRO_~ˇ*ǂ&xE-y5m~_}?]_>ꅆNy=f^=O{>L"*$ I$_{(_ +єg)ĤwF`Uژ2 8?jvNJIR=VZ"_np(@p(*f5.2׽JeLT'+oA0[5&T KN gi$2cc>緧%Yb!Ώsf<;%k{xfzIj$/Z΢X*79/k TO;ײa0\h=+0*yӝ> 灆h2Ȥ~Kd_] 8@]|Kt{ pr@'8x+ԃ!;I@ݞc ݧ'ݷIyW  *c۹pN|T}J ,pz$|aM˙0@7`8^T^<M*wvߓpPP 0Ѝ 0{`aq԰}u"}ޟzzzK@tL A!f4LL#y薞/Ӗ')w/5no ląpNL2f-OSڱ3Yi-}d)ﬞ\f"< 5 `3 Y)^rh0O]<3 μO׆g-duByxEbrxXgOH[6}j|F> H;g!Tʀ&ڎ@k>֝%̓u[!F@(={O ϼr\^}.#آXgSSKkenM$Pp:hNIO:68ᓚXj/!p5ȸxd=qo֒\3:2D7KI#׆jI1p-_dm @>OBT%{v<îSQ_X8@Adq/ cgC%j#FN[\85OSu05CKD8?XG\_88@Nn0pˠ343mL3Au@+ެ=kH$3 M a,$uE[fE^K75]N69)yC8¹l۔wd0RL|%xdϣ1*OB]|GWjhoS 7] 땽SSi=M] Oxfp?ޮIᓃ Ss+79$aIp8rxfo}<~Rwb0^=w?/_ĒbArXf.س=ZG# }x<#Z\\:/49B36R8iep*Mb`~Y,`n8仝9\2p z|\&!rLhB ս$8?~02 3zҼFlI80ꁁUUG}Ls*,i㴳Ow9NI&N㞾krxd#yL(~5g%Ɇx,yaj1O?ǰD2h}S#/o8~\yN7\uP|J/ǠTLɫQs؏֞n҆&ֆ_:SvՌ*㩸Gmڥ;*+ZSP.Ѫx84KO8Dc<EF9V,h2Gr6Sm./`WT@?Ɂni4C{itcK? S%L;Tn2tfS<_ aRGs?ݟP4~cQ}'ܓ:_0|bhOxf Q̃ @ I:i,3u տu}*?](bS`f. \q9<nr]#g>DW*8zTէ!a/O/iNaJFC'\ayQmև`4<  ]m0|j|>mqhEaT<F:`ȵL::Az v$rJtoqsW0 ωc)Xx{\,jn Vͭ=\e% W )B`v|f#ڗp8+"DdJ9eQ#us9K^(D'se\g& Z :ǻsJ)uns\!(3/%z~LUxG.CR8)K;/bO@pVEeYuV v΅6 á='zKeݧ7}Ϲ=>s; ZlftFB%Ŀ@`yH=&xB`* -xZpC!ph(X7`~?aۦ-,3TyI枱Cig}t35hCTB/Z[q(1ҝz" >ka@WROF\sO>D饤 .I\pHI6fykI\.5Bξ+S>wtfI<%i9kK-?fy.9#8ѝ,YL 1}85c>ά8OWxx3՝Z\3'- 35+4"]Ҿ0Fre 5:aМVG ^qPV`DKVuޣA>k*0V:S~6{¢tcB4LJIϽ<%yV+Ac2\d'4ZA}#28p01 2|Q9hOOpR d!n6=*LdH 4?~6./(権IU!W0\.1NRSI"6OCr]0BKFE?a =65=sa?߹<fC+sKC 2\2$2 $=O 7jozu7gP vii^xdȽV'Oa^ RN;p.V + |1ck!˕UjĢW~> PA)Kxz>`(C.x:nbxv+Xd2-J ޓ{$le${F*Q4Wpj⯡p h0!P]r"19HR#8eX]Pܼ'|KQCfįR?UWǠrMu}8pΥy/G B!Dv4F773R MH;Or9M_/a-&6S=0K  1LOBH (ဎ=DۅnM%-LpkUYlCN~ bc_pgaOǃ;43i3' b`čPVS#"dAr:rV(}G'f*7oNᓓ*s)A=v]_NF_œ#WBR[@eĬZ'6\Ls!M !ahO% 'Zo;Hnfr:ׅ=UV.pF5l C* |0R/cа˲;x tH#SĢPe z+zu}yw~)Q0 )4r.R#ޓR0׻xJF]Y8u1= kk,XJ'L(>&zAs.[uw#}y#a( tc02& E`8۪!0ȝ5@z}'T0p?6̡,4@^H{+ b+ۻJWGOV:Z;`䘳 ZZ}.ErtR$%+ N+}{8d dh2'_{*+/-<}<'^.W^BQFa Ȑ~g*{XfϹ{=xf7g<[|&o@y}WV;ogVBZ"9:yM:6N]wW S{awU]fҨgYyw{[Ҽju/#p` p])1zO>sБ0v:J x,2- <3<3 !-M*L '\@1xd-aи{n'1@P1@~:e$PsZ~ Dad]!rU(Uw8#E0=0jUJكQzX`~|Xt\ k<}'Ebᔗf(_J(!a[!'",# I0Νjfq&C5H`^t3Rtĝ Ah]hNeDi(Rj+Sp˼+V^`p™0`HWz=h_ ը8#d jl){8W:x)ȖUў)Œ(`x\$A/ @q@1(x<Gk BxOcz=z}E 4Y1\#)+gYY`XF{ajJ ?g@0iEI6!^YE;凩8U 5"+5Q™p3ʙMXZxFtYSr_GWD`|(g9M5cE%:ɇƀJM"a"J뉞۹}Ίw@p=pf#|3y |63tb!Dx$j;O%ՠC.,TDSϢ02yfbqg0@aLȿ@ V/(dCQz]3j 5.\X@v.*Jd"7 ;՜ UTGK@Ew82{`Dѵ?4z2R(Fa63qA^T# <~.S5!\d@XRT遑Цt*mf^438/wGg+<ݷmy$@0`Pph 3A yzl}`gܲNm>_>|Vm `O6pt4\xFDR0E.bbQ"( S`#ϼsⰘo7PO_NaQBcD/g"=+&;ξ%a]Mh>.zGd6B34\/× :cRIL'؏EO@@7δkĆ4!I}sPGSFd5 yK, CRPc`F'3ddA菊i~g7(01Yja;}j6Go8G I݇4*G /\4."<(]|Bё6!1O֣)=8pAC]ńb=ZS%!iikCtlNT'IB~wAϐ"7g> (z|FtJ]-sq>-Ynci,3"Ok a 6D*0sZ"O՘O@ϭw00V1gd@?8VR".pϢ9vpo+0[tg4' }?:ѾûB~<3v4lE,kB7EN/6ͽ.$%-2 ?j3fUE 8H L| 1Hcйm.4;&lSޜͺ u(D>td [HDH[& I 37"tׅ=RO= ibwi$o{:k?~.xS(~!>u DJ; IĽL ?իr4KEgm3W93gnJɼhޱ`L3gnWCyS^+)F|ճ9=9O;}L :Gy8 Hpӫ #}e~9i%`_݊4hX"g#UvUN Y`#BYP ljP^% z?U_9ژ`* a0*Ҏ$>Ub}u*Ly ϳfRfno 1#<e}1/x?~r}`woӘdEY'[ PH1޾Sxsh-deTc}/{*Jo8xE|Nt*' 2qk{8fqLZtάz{n;Q(0/A:ʫpP@,34Hxcw^?)4G`OX;N$xQ ] =µzǖ)z9O1KӇ;~nVlC [W]f VmB {[y'Ook*t >ڂ 1=c+V;Q8).Lg`ϠGQ"rGN-C/D],&tuwuyn\(((4 BL ~#-s&R~s4)s)kFG,PAn%u0Lq6uL{pGjFݛCr۴DzQ9RnOI&L0q ̃Y=<1"V)_siaXDDCtpz*#c : Vw9dzgT,n`*=ȉNؗ/:Xj1==A0 q?BpX E7CC4-ޮ'z} l D_瞬..S};8/ɉ + O#'+0˸t߆B%N~+  p?932 %?mfO\JiC0 g )4k?K *Q~J<g1.+?4u6qƬt@-lX繞>ݴv;/gw^XEb5|[lrVƮgqNL?Sg_9*PIVi^V}rϗH8qp=*4qp3$)*rIp#ޣM@mUqۆGsHxx2um/HC7-tpAyԢ S>I\p4z\e"PЯy #}rR`{ a Òֳ>$ A`r"0 *4\jFB2>= =~~i+^Uh /⇴P*xfdO,3 =!{dsL36?nQtYBA_*#`Xk׸|}BaٱBP]Q?_8h- H0`xfo8t⹧!nYwVT[r3Œǩ{t[  ?CM~A<*]qyήq}X<3dOywh(]<#L{ޓUW9`JǃwG&3cp>5O>ⷆ^=Z67U{L3O29<?AaR$4Bb8t*83oH5'w3vVD(GDBpce#p $b͂EI}MhOt,N?gهoN sݷyGxF :c~9-At ;^2yV>O>0wp4Ar3usba!sFO$ | 8ٗ)Kd5Wd)78)L2||;>+yr2:!X\a  #a.1),;$eܱns&=W:;$r{%GW,vLnjb3hi;9*850 _<% O@6b͟y$:x2=Gv`Ra& )*|r>>u-+g{҅E504"fT7M-g6U;ɭü2|2&u,Fsf;XαCaW|KO9*뫸2C7$-[-%EǾuzx^{i(/yZ} %:γP ,|=..uy̾zAh$C.jnX*$(~$:\%+ߡ&|\ޞxEꏀR5g22 ,eI]K} ]ᐫxZ#v6C)~ 4r~$4b-AԗNwͳĦ"(ZQ;ݭΎ3`FZAGjɠ`< @(ۀ*- IKSi_0WoIay`gC3+2uIX߈,+6JpFa.wM$W$ bN,7Z^<'(΃7cF{}"6&H4pА3Cjp?xWєcdbpJiZM؎ ={zyo0aFrhsl(PR+EMVFF _`X+SCh=Tp?)@{+^xf#F^ 5LZfa'&n`r?o7"p^~a=w]#bf :N5̎ض$Owৡ(yմoi5?zCQ@l3X}Sk"%W?ƌV9SwxĘm:fa +,jnq ,xgvF2_0*PuG׌ZϢȞ&:p~2  6 ·teT& `Z 8d:.q?n1ERTֹPQ3x nhIH$xT\y\O*.97wDȠIzx lwpѼ2xePŌ+O=#S՜T8lg($)MA+{72L2O #ө=l6_CYYj{."rsMwy3g6y4糞W퓽3 pǚ%g^i&j.rS<;+)g_cëte8yTylߴS/7ШAOOGLc^H!xf5p%5")as P|H` _ @rT$/`PIuS3OK `B0Oā4:YNh3sXftN`8]DxgqX2 f}kz~|!|JFaKVp8~ӏ" uiz(5D!M(Kę1T^E2F(~^#W8ó }Ӏ-yǵmE:u3W<{)63&_{iYb*xPCT(0_}{= F2ۊ~}Qx1"kn\^p >ئ#O*p, @pk@0g!3pwܮK%*i {fw:J'Jn=O (7␉18Y`ʋ_kL~ H^]Ea9!{/<%kꌾalx\|I/Ҵ&8H--6w97gsJ&k',20\L,qFSaU:'q=ylB μт7h3}S(5K \A~Ew(oz߆Ln*ZSwFq@r?rGï<*3{3x\x>cс7 VX݄XfLdO6*m-1i_lt+ ;Ϝ6 K@孱64 +'s 1kt;nwW04K10*,f_KB F8đ,V+b ( eQeS ~][$7O7s&9֎a5lsoA}_F"3~焠R1rPc?+.Ł`U0UXTU!M|ڲjծ}R d;L+joB4:l||q\e6M19ݗZ /lzJCư:!q֜#t[뚰PJB!wq1ˉ˔T|fG"xf!Vh+sX՜&GMJ4-l,bX,g42e.z`=׋?82z7H="cT|wCLL%]0\^&ΞT~,g Hl- |<tpO1A' 2|$*o"BUr;SI3 tu] |mN39ȆA)_c)+/;vsng Yxfn [3.gCmwSA[dn;wQhS;{YLw[l3Gލ)k8!sBaN#s:~ g0?a ;Wu>xM:D3p? }Gd9)P<ڸZ粂!=V=qz`[p_|P`G>bE힐+jTXfop?n{9KPduCs]>#h@,?q#u^)&Hh0+pKKqVn B*^ cl)h(B+R=_CaJ0<4{*dq\dgW1[L>S4+U^aIUp?hHOʧwȯmC)@';P0#"i, X:J" S YBU;q!0):p)}LX&`Aps[ ^\Q䇡wX pf}.Czz?ђRpUjHqxM@9U8"::M+p0 ;,>>T/=|_=%WH @P4 6ʏ;#'#w9x:巯Nk4+c_ˀ<\l,?D^̵S}Zs ɲ׸.!H !ԄL{˜Z W] P/5@;M`ÇZn*J9OW M)Ocx=,>Ê0y.o6#érCxG$2l)sO{ބFCu [`ܗy#s7]v7FYc@(ځaI!eS8 @ݬGKE erG+8E0fwvmo}ا>aIü `4m PEP`(T,, @AyT3R"āWj2R*7ՠaЬ)@?.EKK ,u鸔 6x`.{="3{}Isn3$%b@|S\T iAT0T!$Qm`= 'K 7b դ4a~%8#3ڸb2sA(_z.YtUpt<s',NL#ry+Ry =fbs^4S&kr</QFASDQ<{_VKg_܋\qO;cH]=i[-\ডx} _5\38U.;Ȫ6#pPG̛ޑH' aBWT9.Q<\PdfSO^~ysg!nַ'bN :wh2>t*$zӑw^v'E/{8/W8ѱXU KE-)n3H!漠JT9} k[{|>ql3 ?,Gk%[șϹ擒ƉL.,6͝o r;[Vcgc{KC(}oo84o g^zZBR'OϟJ3yK99Ax0 S?TWdLtK_s4<#}tkN(`:A`}ctZb$y E0 ޗ y6Dp<2t<2DᒣNM]+ c(T]Gڝ87d*QulD2;/h ph#qj53\^M(B^exZk[;*, 280Oxf} |>ɜ2 O<ޏy@TBQ =T꽢?b@J0j4);Xr?FDaËxJ^1=?OZ2B[kr3c Ό>pdD/$#ဧRȦ#'8GeJ/:H!X)qʱ&K@'>#sOhȌeljvK kpʞ_U^#Wee$tKгk>9q0šZm^oG GSkv_UJF셊nlY3"OSPZpĠ?dT{ ˁt<`ҵL& g[%xj<(D#w-y}^dztw i~p0VAXDaúutEeiyzq#G* '  |YhR}0{{ @ŝB'7Hr|G {|w8GN":x3zzQSFH׾s]lp*s`a<l$}ۏ?+ Wc0*>|y_?(]j.;7@L6ɒ=soE"~j fQL"PB /9ǐFU@{֩=ueI4^ X3.rG Ш)BUPWD)Fm2.k_fwK}3vޖf鹷IR)}ύp>̑al,sDo:%%:h& vޞ ѫsCBx!;r%Ӈtjk$)S +Fo>؜\=l]11i5^##Etd1J,y/C/O:C> crpp]0 ts;N&#  ܞx鳍nOi^*3oes`ϸ226H)'!O2:}iHEz㉪e?X9*Q04{wZTGԾ<+&:S 38Ȏ OxfIF)xvr^ax}Y%<*i=82Gju0<0O/Qq*<OF}yZY9p > :i>?cG%Xls=*=2 hppw31#:[eRHX8@MpЃos[Nr{5 կno<tb v6›srSgc5UCӽlpdM<{ 8-MC'82C%ާ+ ŜG(Sm).Qq?%և1p`<˄`u,ᏪgLtx G( ]u5Θg)ᓅk{9[z|Z0Cg: ~εM0oE?lH8H̼ ;\+p0lRPӁFS dJ^gx3gs4V*<2 k8 ɍᓑs$:Kc4*( ]O;6tJeˤP! P/wsAMsCb0.ˁ1R|-lB\"2m۶=?vbG ^Z(4Hf^^|ҵ b@F 3Q^jԋF^ ˜\I+s թ?SUs/K$~UT ^'SlPu0㔾}{{yM=pfm-{V+UR`@WJEB7' V˲6 K[5Cd+ޢG*a:1IF,/z?%aH2A( ζd4'HC50 {+ se'j0OS]a;UP@'%rX,'cEz!h/јZymZIrW81 %34!2_ {ޞ C3Q_ޚHp4G ꪜһ2##rOUR=+k+4yO/O黢##HF)Pf,όZg% $㧜8s%9!QdF:eIutyX{iJ^ !gEVU k\fh)$44( l]O$}$XGk,^PB1IF2=>4ƅmQhde&σh\G:0l{#^\>o`ȃ3I0*TIh^Fzwv;OzI\ Dy?RkOtvi=M^_HE|N"cxˬN JmMrLfBódbDZc gDrYU_4ƕ Y re gqs7!~3?:gMPi#>IyÍg7Hvvng JXfz63=?A}&퇞Yau=`XwaFu!+A*xWͅsJ}]]]1lzn10_IWCx٧88p8^AzϒJJ0@ j$H 7x^.f_p`)7^6'Ehi Cb`ŏ<))P\O:r&b"Ws) )ng<=<̧^LʆGDbN5;PFD/p؊.+L]rN0Bja{X+Qz[½*f.rKc-}oDj;qprHh9?$F )O5-]aYb2@Q? 5Sv 0HiOT$EʜH={Áp\w93(mշYݦxxfSI_r4:#ġ!@DmժV%QwX?*(a~Y'KIpg)k\{`PC O 7k`3E qYsAxgrETGQ NȔ_:xT^tUw4FudWO∥{T+ +ӆ ر2aބO<ۄ {[4OFhkB!2fw>esy]m=;,١(EfU܊`2dzFzqYCߐg ܺO1ӼJEI=TpClfjǟ73v*@s l<_X:>Qxfy0S(>UCj}@8_{ːu$ad$Ooo=eB3Or~h8Gt`1`9=>Gb#>"c?_d `ˏ$` QјS D;Xy)کpJ.[n5ĥ`pUtOE*g7+n}9yݻNSVa5ʀUTGm'=$pf#?{u'Ek+->)?>Ztjg(!Y/!91f6sf+ӻg&>"'?y)ٍ)n̾wI>_DXhA&yAcRN86ͨ$RG-+ՙ A Iհ+)9Ǥya#'򽆶'XJQp!tByyZJ}FH֑w1*3zL}t'n,8#pLHM"2`=R)q+!zB9)}82o$E%dae!d'NlcQ;U>N/ |uk'FX8@x=ZnM'DޚV$4/{8O ggQH(iw N3 YĺzT/xj2K%7=.pdlD?887']-W γlgjڍ xR0랓V@uņSooE2J'#C  82EWоPmIק L-4a#q~ չ9u Zku~;Vw[V"CfL),eaPn~?GA5Es7e@%TS48DxE Ԡ; X@}}e$VP1YKJ%KMI?R TOώPu#AvO^e_6ϧlZ+)S^'{;AE$o{|cȣ(8@Gкiʩ3'7+ XBVG`~*Z!GÐT&*=ַ7v` V\\ rSW'゘;϶2P C(QL1-R~pzE>*=Ȱ#@巵Z]wi\ Q0(tzc8#!$u7I >n&!Z. sl?["\#d F ڦiQr>ÁYup!i}B<%P`.bX%\\?` B  9A p/0pQM2g} y7:/{[>ɭ*{dm`d3o |Agp)sޝ2 :laC>% n߾RۦU@I0^q8"t L@C )7Ġ$.T% FIN0@UT6|}Dbe^ݿkMA.mꇎO )Bβӆj &+rn<ǐ4ʯe(k%GWXl?l!sy(Sљ:C$Jp8JgL2@]pZSO{vnw`p +.R;NU4xX{]="y""MtZ~ ayxp]· 7Tx:<C'&O  7G2T9F>R<՛#!Fm (&tu WXMVqӸ`)@4 v@;`:>៴ )^2[z `>#.s[9$9I!5E<3W dzswZNkxNfp:dS!yp0`āj}O ŷʇPFegV=1[63NJ;;+"S“CA=ʁd尥=gᑗ)x'gY8#vQP˒Uh.< SYӈA-:#:Bg°%2{!>ےl'E2: VHB;ొᇍ-/6#ʉH }ӚV LmNhO?ʼn z>:# ʲt2  Oω΄gZϧ]mY-n1 DfDD|Z9 Nz3_ÿ6M{=.DžSq1iִ1_׌_}g!>{d~ީQO6; 8~w}.w[)S3Ohpp?#4@{{W e6ɹ pdkoEgeBĵPOyav2?PS ACDox##reRHD0pw&H bNHq]d1g@&I/nc>m{ܱjxdB7TmL x>$Q${@!ڌ!x|B@CW4Jp@8 O 4-F\28`1 snq\ ew8<4}!>"}DL/W@QV(,蚜yd-$"{)ML3 cqRc `0`CMP;ժ/'˜P@'C@`; j !p@`;VI4ȉ'OA/.x|3iY )CӠty Isn%0ʰ-x(ڳchsKة9ݷi3E6? 2qRLh{:Hڔ_.^p46uÂݬvޜ[ӂJ"Q-4L} M) J*&?Ϧ42Xfg4g.T]:WVu}g8*Oǀ+Qp8Y4*8Ͼ+" aBS_\cQsnz=1Z#aWVi;v8QGZ:|}[ˑZh5C2GGc`}Ī#A Cᢁ#)O)1%E(XQb665 d1&(/j[` B',p8BZE@)%n}nfv cd!p9?̓fCBW_げ.GB. Q_7rQBvN 2inU Bf&$OP"6r+{9%^3z\3Y9c:WV運7&W eyu JTpSspPdAq΍Cc?vn^N#u$_M܌ Qo4,;كJ[ .;4.Pd2 {(ح<[zs?-M4.OUJ fBeG1_0͝ЁEE$ux`hcAyYJѸD < "+ƃ$x2<<9>sR) Ĭfp dU6a¾6߁s>]k'g kYv kf›?,osY9 63)}ﺊ|>QfKW;ëo3c (wPʡ(*" С 2xd ]0 h8_1!!ꎙt>{ -7'=m9zAĭ4P*Oj'lW`.7Sѳ@qa0ZDJ}O'(f糆o^ :@gx8z<2sθ)\k ':jL[x8@e0# b71W&yM8PsvKAT5]3MB0p W 5[{*-rh`@%Ӛ!sBu<2RU ըh:<P[*]gI =$+T!:L? BC~ȍ (gFDv%@ D᫈S<E_^W=5I`@9^+8`aL%S|( z=&N?V V(x P24: lf.s9%r(3XpC2|ȼӃ#yxS A  u# Ȩ`/TGtF%vS`;@=S^WqA# T XT%U!L00$A,|H<`<-0!?@+|4JiBwP`<(02@ȿ\+n! baǞtkog<}.G DiPK9Ja'>QpC0I.L84$@$wyTg5zsXcxQ<0cC0”I#TxΙTP*!8_ SeN2umۛId]ꇓ' 63PhHn.F 2UwUzpމ闈??KdِB:ppC w9MUSQ|<wC6#8F_]73YCSP'l,J(HUT]z7O9pC.< J/_>? D%@+8BxxFJJT J҃}ډLAIJ铔01*L/]@|!U`b81E;z^5s8~QT3zTL4 ӿU׼AۏPS>}M#cw#N Ra F!,EPͅo{ʹt)Д_Կ,}M>=Q-O*q.p 8}MJKKnO]6qS˚ls߆-r-\^Z<0 5G9_f^t)Lt> ^%UP B U*ѭPJXR'=-# +?ĝxY }.np?}V aNʿFz\\ƉU3xVO~׺eQaa7t#cpɹ[3>:qv`^B#{D}O)5c',xF~,hEii0z+[{{ S =}΢ 2P"f6 ^=& =_@BR`~v~>#0| + e i]6wQ@ nNDBppU@pbQ꾠D GmiV(`X0ʮpRo :$8~[[Yޮ;fӞ銍3q:؎('(s855̿ *Zc+#ѱ9D-ww};ř Awğh @9iֻR Obq_[pj@>,gF_.u|S<j{4HAW}cy.mh䣚ޚszuz}!UO!Ć@hX;$8Ѩ!]?t{t}OD{w}s?Ws*yxHF9#n+%*^J0/]KlY Pp2=ثgT/ *FK>%҇+a.vjoy`'?m DPZJU%&I#0%`CaX恀`K\]pCH'Q)\U qc$T].>FOuP^d~%>>&)Wz(HEj*M^ 6o73z<ޝ=kx˳ˇ)|q9_R'.<馉- K@Nj9A$OZ܍(Bx X)פݴzר}p+ğ8S 6#$\~dp;9a%<u ccɬifn @N 2Mxdfs]}{dK玡<仜i;zK |1<#;?'5!G%aF!8)MJ& iP͎p>c}F NxSątx^h0l6]GFIlY0_࡟ǫFY9 `Gtˣ&HC4xeѷi9<2 pVNXR0z{9*bcbG?~ w T wCmBR~4cr]t0|F:i oF :Ob$fUMkhOp$Q&p1Gjc>=XKUJ!ם(,NZr>xI.{-:KY (4hh4_F9Z.'EqlNq}!sz-sēmtrwB&i:HtQd<DcD*I;fw&9ᡴr=<0:1YʝԦ$ glrZ4g9i \sF~ހ|56yI* 9ŞY^(@V? rn|]O 6{-~i9{N nvv2'fgXq C0 Drpew< !n162Uo;ሤ,67SRX4V߲%hI)O"BZ{O~<>P$1R){Z^<*x8 aUV܇xdo%n9%ψdf1c `1kVe+[28dB:F1-nP*MHαExf/Awx/_3,;S αlSh~^;Qbt 0g_?"G! GolCNb>tYEn߼(`Tj+A2z&? '!nr^p(Tc6xx2Wq02[zH?y5x8 F/R1T(lP"{D1E ドF8@G|/R" ˜RCep ~0jȬX h0tU"<~ @#Nn$x0bZ`V_R]ag5#``tEF b^/ĵ` WUWĊn8H~i">Fiɇs[x8IRι){AH+z65H0#2 (.+~/Uj `0?!~\_@f#۫L,*TSbr{<"h!xx́ |P`)P *ժV! BApB'O*>v>xt&cs[=:7 >lF6ܮe*ڜTA~ۈ<cŔrx)@JÓSZu0 )1%T\m"IIb&McQv܈ˍ[]!}ѳL.vx%L3<_tzF2 St#D9SiWiUp{zu}Ne|W R i0H*.Z}rVdt/'=JXc `n797Ag I~|G#Ύ^M ^~?*> 73]WAH% V>D04(X~Yp@O>%1EP!," zHGx `)L;P8$=a((0, wuyoANǾ9 n=OώL-T%0h+A^pT1)aMs W ^H3!qCg¶7|!G+~Ef\-E:+ E "os+ӻЌHπ])!w2(7AZc9jѪ}EFOEYO0uD ,8|:Vy!efܧ'=YOp$ 1RB`uI3ON#=W.ƙFUj9_SM{ٜ0#Q!3N<P  V:]ۧAh"&%߾8^,sF GKU؎a+ʉ~D{ߖa%POrJswWT: F'D`E:'P'x8/p0pq{w)3zn7H7' |`xLGu$U %*oNaB85 4gN2,.@S:;S-z &w>E;Eg^`F#SBwE3P.B5v~0H1mtJ9gbSe|?TH^tH^%qXa[h}DhR f$p01b)][` lH>VT _䏷w$MN>A !Ѝ`@p?230 !իJ'C-'-lF#< =#UUQYQ*` @$ a ~h iwlQەȌC@>/BU"OX0*^(.t•c ڲ%::a8@@JR|A18Om> kLL C^f̎C8`WvM\hΌgɎW ¦^wOsɰyHs(΍ƀpdyKT21yV+J:+UF%U,#DJO}"3,`B@>+۴wu{}7v7a h ,o9\H-WK}Ct !$VDq:cDB,gUyO)ʧMN+[6^#^P :"*`o}@p}- /q@c\] }wwF+\0Gd] -Bn,?٧B `ndFXL"P>|ƾ>"C3!xY !O!G8?[r%d! *=&g42XY@g ŽL=t bia°穙6 /SwR|^e?)*:`}O/9-<g/weNμmU@8֤&pjB ^X !BU.e6 |)zmG? W.xf4 j%)Qh |J!,zڵP (J:nx(sv5fq3Λ9R  sq}ᐕOs*) ;5%7B?@.i9w _|,S  :INEC7,P\]~ Q=5TwnXފ/x^#՗~Xm.2`N=<:{ ,4AS)jpfNgwOCz=\2rxdN)2KL*>/9OA8Vj2as6 F.a/>¨cxf|#ksy {瞅_}>Z;}ž[gx_o~΀{:FO yLJ_Yat ɩ?QzS*FzR=W/Ā`}ĮşPuOt>5pަqIVfaǃ>釅2NMC'NMa{o}5 l /sh x{B/ʠ n> @p[] 0`f`BGGT fi*đW 0]"wƎM#ۏ.OH<Th򛅊z4Xf[̆h{ymj4"sGw WUmֆzL`3hT&i)d;|3Br" 0}Q^2qf1q*Nj88|eyL<׏K’V Фd7Va 7Afɖr#j\ ;|%#{ /]Ug?rK('YzVmyJD7 WS=rZdcaMxQH87ap!)> KozLLN?iV0qx.  2S <73&5T Ęǣ@X>:W]9,f KĢnbL1[>:3|"=S;/߄-ZG:,Ѫuc;eWڠ^%a0J`B((xVz@7O?6f2釷p-{iL] W~$E1F 5XJ>|{m}>?<:;ođU>0 `Xt _D}F]}-W*//\]-Z>EP`Bt`@ȄF/,$]>{ hLbI4d&-'4{XcUaÁ-2gx|$O]g^p=|cʚd}%(>|Gʧl/WxTC sC';7ݛ}͹Z [SꔒOV~gtL(uRGza,/"=j9@GpSBfE1s xdzjԼ`+"8_{/U*>s۽*(ֆ)(w&L4EKG@^XCQ\xv"gqLN1.V$ PG%HCϺ1Ү!{ʀӟ0L 0G䍍UuihjG[[jb 2pfy_4xQ$2])NxH&Ȃ Nu*H Q.j}+;;y\aLH~F xSUU*꟨#-7*BOZE"qBkb>4A5&V1'Ɲ]6#w04dS̛x &^1p*$Ɖ+DQ B'간5TTƖ'$OT&4( 4iG?Hp)?UoFiOu–XYȎ j_K!UC%QqzfyH`HpN$v{AL5/Vt/Uo"/h?V:+ iP0_e  PB8 .E;QZ.#Xy1XttZ1BWR+dg1Y!*|d <2V0\V5_OP@#{ƲDqQ#dXB,_QZ.f0PXt)S,b)R-+\ nੜ^tbT?=]Mɍ76 B th(fw´'I ? z^ 6ttXCyX1tRJ(@T%0O@sl8| ̢8BQN. }F_ߋ)@HTr`@3CV`NϺV ۨ<Ε,,KYz6qWj|Lݻұ?Vꂜ?Ni zX0! '}^$0A3&K.qz ?v]F,ҝ8;2'$: sñHS} ~kz2O-I`G,A_44dF`ߤX0!*@!@CRQd@;ޏ}K4U3!Ķэ7)Γz`Etմ2n:sBÅu1{= iYtdf*ۑsS>31z}^MX ChF|޼%ڠ03ltjx~=0uJH$@SSdNE@@8<c[A'iBK4<8_ɻj1^Dq t#V H}X{9߃ 'T+8&d?^BMU#xL5z}xx#5I~U4|E ƿW<',J%``>SBEZ`C/QxR | A ~NpL:#CD}l0^ <@~ B<#΍-+^Vqwņxx~uL3}{otg)ZRmS3@\ 0!R):;`Kx0?#;.:B0`瀠%x0Yx0!EB!5B=cOsOJ :ic0 xՎ90.!Χm@4H߀SD@x0^ǖJ\X#p!Yp8H`CU(HNc*އa> ~&,E6jma3խs{4ܪs#`7X_B0!RzJJ3t) ~?/i}[@?E0m:Wu#w @/GE@[_AV^1` rou\r* Xun4 w+Ft$'4=OvZtn[ kVi0:Q"Ic:U63sCj=?u{} _ݧwO(·gƢPTxQF# ޗVצfC_QBWāP!NlS % "% U1SLPpX1vnkSIwus~GBU84߁aAUTOP 6<%!` WRC8FL`0!  / ^HAˇ J$ Wj*\}|ۙ7OLotko @ `]t>~|tm i ڈSA U/0`M8\OtåXB1Q 05S c [/脞 XJ&j!c#*ii)aaUxX|)Ģ*&<>/T\:<!JCcq@o/@ ڸ_?Eo=\% z5<+ǟ /6GjT{h\ί Ku>xmZ٘\RcMp؍7#X 0m `9"ĺq`ئA"}03#} G`)MX7SbPi~]<PEjX W(lu"* 'H;(!ꕞe 0m>WC4[0p>Xr^$(rSs$wA1:rp}B{/?x%x,{ Y. [#zHeⶃ=N:sfeC0*> \xMC2zHz}{ q{'H\y0+ni9B!,H Gx-z;McHSI.>z\ˢv/m4_!x|@)ߞy0!fyׅpJ? p%s _hF cT0_ty8pd-ǔϹ [ެ[PYm9-y` ||>KR0F~bTD/`J/( 4gB&^dC<%s`tmÅȗ&6JI0 / uPKK7,(@`; p{G DFJ9L z >]V*]0H AHu_cBO8KWUye~'r=jp?${Үfn'9.͌{QH* H|?/|^</*j Gi8p0֨/D4` `{x" | wF Jˁ/{cOAGtLP9?@Xy@7@ )A`t[ -V^j:m6lO l@T'4a>@ {x0Q()4 0`}i*BU-(p:u%̦&r0~$s;B3{G`` W+az#҃'Q[`GB"x@RWчS-8rmR |%*_9s(nPʉSQNHAxv!ׅ!IA#^ݷ6uy {'kr+y QD{aYz~xm(*_>VtR~æy0N7wGSHNiu*O\_^.U,< DG h$dV#x3QN4Cw}soO77-|(VDЖJ%.~ GڡC/0 ]?1>NP1N45F֟>ûL0$ p0zABK 0 {F?=9FX>ݧ76MwMHauNޟ0i08?@Qڡ F$DLd2P a5K(^N0'E K8N罅 Uƴ]W!6(c:<|򙣂*-'38) ix5Y0U^@\5P!i?T0a`y.@}\e)cH(#<` U|xNHĺuEqq1>ӀS yhq c F| op)z9O HƧʁ΁eTOO5ɌDG.~V:NmP/ 'K*y4Zk`Uヵ_ ΈՆ]ȅ&>h<?Qyp\ \Y9?9yǙGVd Pdu=#%XDGU` pIBC wYT] <|zHZ7t_|;8_g nD`tƊ) VN^;% ЛĂ !zL0!S894v* ]3peG3aϡdE| Oât2uQN=5a0 {B+[zt/>#L(0 w`ˁ``G  % V,! V,z|aCU9ޠ+Pψ@`WՏ4 c ?+j}oq*~Sjp`<A"|/g 0K4 + +& `O"~ 9G߾JAP'<Hx.T ŜE HsA{ IK=B h~\3P `3`:xA8|>n | ':`: W$܅c'ś5MbRbs%ЄYYPY$!,| c=C)A` /MV4AV 0eO)ұ_0)Y\ ^ pC;Uz]>T@ >h~`<0/ .V\@`:cbW@ATb[XR*J> 0ʀ`&{L\G^*ĵR_ҁ0@wO RNo¡"Et AZ1 x0!J 01v0 `A˦w?z5kD$b2z.p4IbGY#./wJZ}ԺE/U7 ,}x0xAd2>H(Ap@,`*0!+/IR H|<BC `, BU ">ewOF0 Hˇr0@>L<9YJqEw]P>"]`DE h!U?=`B샭pcrTt}o` $!( @0Bx%/*{:K.^zݫ1n@$@?H(~S@Q(HPPցQY, pB@ߨ*V_J >"!K0 %SGeV#|T`7A`@Tv ʋ.ZNJ2t+Q{n<=K]<`%d:xW$|AP@`ğՏ|?KG !Jȟ` @ޞ8)44`Ti 0%!wDKA[/l`<:(1p.0`|/*(80`:>"+lt_F tapOۿ=Q&c K0?8@ˋM8H. 0 PCT? ~y4(wmOlZJCWpph0P ȕ*y_ C~Oƻ=/.'mAa` `|Ff,n /8/ ]VP1P(@% %8%gAtz*T%xȷNɈ P~O_~`A#/~P`9*iDi/do:!eGeWT%z||U`~  >`yMUk m>G@=$ |%xb |}6 0<%V 0~& =Z 1" PC`6`<bP@.mBGt3x tKWl5bV*QE `JbK@.5s qQ( J/S?(m;Oa@JT tFY:^@8I$!{LhK/#A] 0eK/'}eP8 " p E' ;a,0BP0 AbAr1l]8OP D-X@D7!x0 >˽G (&ss!`0_:}~\%>$uAcgd%{lRG.$.\@  }*V Lb4|]/АAxx >\_ZOxkL?K`; UO0`~au7x,P`<7ʼgv>z%|_yѓ/xJR#D|} Sx_L`_C0`.˓)Vm@Yx 0(˶3؀ Ru0\$J}R}?$"`;0c#y00@  D?=YJ UR lP`: XK]ߪ JB/v0\$"#x *T*wᎈ02r$J˕+6h h]1 @0 PP@P1*P4%xa%]b?oCһb {&};Xu zB>Yp$uaJ|`;U+S?z"4 ~Q)]h-`hAHmׇ5yQp ;3p8X@z@X?ʪa`%_/1M o JPJ x0yhC|> =m\m@ bX٣W+@<$P`BwáQpA!J ʕ$`Uq>mC`.}Z.(ATah0y ]d4F ȁ3rf `8A IU_": `}EBBy\t``Ah0@eVC x0, @?U!: "Gp@- 0CV]PD,jGR`7`}İ@} Qq@U!y`rU`6 j0!~?8/4$?@Ģ=:d gĠ=1-OPR^=+:Qc|h B]@FIn FX @x:W"SGı+?A='`8z$ c cJ@$nX$zDB^> IL 0b? ը4p0B.W( @RJq EO@@O*LX5<^ yP?Qx٤ %A$|_\݄P2  qw O!'0u0@`Co,|V^]$%G1K%ʸXD}>헄,JUCex= ufՂ0>WG~wZ2>'{eiC'~fT&@,/+@VT}1YwZ(HU( oRsө 0@.~ڄ{/@x#h!.{ϼ<_?>]q@0| !0= T i1͠q X//UgOOTŐ 0)T<]zTꐆ 0 ĀBG;AFU58Aȿ]4yGݛ:~ 0`y(Gխ<a, s`<~r HIU{PI@}\[,Ā`A}(0`%:EJE0 P`70juPg0\>WtK.-Jv0`/p#`<` A/F.ʼ,B*U` b?WӔo@@@!weFp(Uq?~% 8dِ o@q?DxÈI y%/'/I* P#zxKx?,|K$?r:J D$B&* 'ʍT !c  @v>A`<./X^`;(= |?xܶ@{0Yb0倒 0_??>Aj0}p Vp?R[a`GeN>:y. e `EVbX0rV PE1nxHQ/=W 30?[c,3|߈8 ` A`CBS``B!BwP{.!P! +) 0C+/ ]:KD)$0@wy@ AA+p0{>r60J0! gFj 9D q0j DA,S<Ec+ʋpp@/9q"hCqwj ޔ*mp`jr(HQ`~b1 `Se0nA K/Jzujza4$|T Z~&˄ >\ zd Ib+ҥf @/XJ\J3.%p'щxC~λ+5M) ,D |Rnd`;D(t KĨ 4r4 5aG1b)wfʼn` Pe Zp`: "P`K0@y_U\V\?AgyR#@ p0  x0> -=ı#Z՝}>Ah}(H.@ , w`0>A D`?GUCGA~\>0@ Á2CG?t$"젢@5GXFD,~^% BV _ (͊ "U|(>\x3ڣF@C:Fvu `J4^x `H2~ϋP` Bx0@p 0|~ !"zP5 ʹ`CK0Ab+!@;*;gWb: 8I*eP`8 RQ~/ UBڠv^_0S,H.0!e?,;`:AD$C%x&,JͤOB }C KGuA.]|H/F8 x  M/%`:i=!`! Ͼo@> xVP$0`;?P?h0>B@Bipf̫x K*]6d'td]$ ED+ /r+0x+<F X0.@)}(Z%a崐j^ ǂ 2@lO4arhĢJ_R c.~S~l9/t/(`p 00 ,8 p3zT\=IX#B4@|^XaBH|4/W:{ұ0A1aA- @0>% bG\:0_A .gx|@`7ՏAUGGn=ȭ( RH%xl|ʭ AAexN^ iq8Kpr ˧؉!PꨉLYp.TU;0P$w.!\`; H pUyg `@yz˄rE@`7"0+|%ƿ&?AApG\ċHWEZ;`ˋixw{|G  Z )j> z.C?,pp 0*˄`}D0`D`yWH`$PT],.XE/(p9R?/:pQJ@N_xQrD!3 \x$xP\ϋ 0`0BB")w!< hZY}\z88>~bm\HXA0!J`}UA6T&$a`Uzw/>{d B ` }GRc HP>B%਒D L!$=V}TQ `3szX p0@t$~0%U;`>z0=щpI/X0&C`}\TBRyr57(<׫ ?AeAx0 T^! /+3Nx`<;_T2?!>0j N\`Bp6= bP#x& h0-<%='&0T%%a80=v(_?;q PЗ,$<HJP! *>80`W'aOT  0"2} p?h-}<pB (hhCITTEb*-֏ oYxX 5x@ ѥ`%_F`:׊_ AWHLr00ϑ4C@``:0e_h0F "$">p Kp0 *l*_V <`z !pď;c+Ǝ Sny Z*Az\ 8E.$QsF v{=rO ҳR~RX8`CJRhr @8|%+Ïk~<~ npA`<^%y_rpH0!Q(?`~= Gc4x. `B=BQp @h5(f hH_`: Opp% FR@@p@_*AU}< 0G*ƃ0J<2 ?=1`간IB0\yD7 H'0G{VbB`=Oc#X+\JX'.^U ks0tH|@)5` eP #`p (9 PCwB0@ pP|Po9 h%p0CxT oECT;+nrʐ`985.h `F`60` AF&]0u@p~Wq]?4`pr\| )p(KP{5]Ѡ 0_*eL _ԫb %  C}p8KDB~R?`? _lM?O( |t `r G\|x@8?gÐ 03r`U?J@0Fp%c)PV BR 0@ ;px$~5Cy.J󅆁$XP^z#T> zuj  "q\2sAtЅ@p)`<>džpA3'@,.@ 03J]T=OP`B|$ִa0  깢@ 42g &u-F:x\2&!Gg#_**  @X0y"Ah 0 2`tx X>/C  | IC͝ D`bP jzTq00 } |4*Bl C #X % X(8ŁH }Ozy2|V%~|} Eʋ.$^$ +zGw" ׬8 ~.(> qodN^|+ʣOPq`;AWz p.VKA0`reXJ4ǯ| 'g|&kgѝ8DY~ )p_t/b@s{>q P( / *ɊT{00@ lt0Ph몠Hq/<a *D `; a?G >@ xBA+sOIp% _T v ` K H)Gu ]LQ `8_XoiG ,)Z^Rw ƁU/10"HŤUJ( h$ >qpŨЀ~Y P9X?0! Y` 4 2Syp1G+@ AP@ ]^ `9DZ(V|00bEMȒac%^:ˀ\~?g駀3@! U2KG39.%H0t-<;Gy^ʨIWb>t/XхHQ% ( [o8 <TPq懲Q08?@T p0Y İ [ࢶnA70YK0m }^V^gz;`0ǞȾKH^ PJL!w p0_EY|PT 0J |4PXӁ (! (0 AyK$b7`9^}dHߏ */0)^\^~]R@ 00! 0?#ȂX0`0PKa0!:>UUmWDrH`~@s<3.˭i F_0 QfHˢp`<{   :A3}O>$ C:t.x(z 0!_`P!A_}QCCP  Q+PoKE@Dd`X!NRCS0`9LvB6>0OF<3ila V _Ucަ`4T7ܪ|$ DT+O%:p.^ x0!|^L$^Gu^^KիV#Q ~} * =(0%R_"1Zʩx@ৠ" pH)p2r*VD H:R' <DuAp\_I] @Hy0?hK 92vM @xWQw%^/<DJB/R م+q?(術$@ H0`/H>w;: A>>DtK IG\V\@|'qRpAJgQfA |.pt2e2"`;/^gx>p`3@A*G:/C x?~0_){M_" lFf p j`;`)\I*ˇu꾨C0\ h3w!0& l6?2'C' =H@Đ%+V{EW{p0EXC+A`^ tpA`;}H!-`;Ed 6_ `:d5 >8T 0#`!6Es (R/dT% [Ě^ha0u^g$`2%~ĵ }Qp(DMo (0W|  p8%ߕ/.`4g])O`<>%.P g㧕(X@Pv X\uZ"xO"$$A$І xQ z+*@- ^ `5C%R|$+,Xp`D@A+`|*g5P| Z%q\ f PbH0s=Rԁ2?! `80e%mX` AvXZ}1HͅXn^+ H|_`=B?|Z#-A7}~_I$Mp%v*`|+ 5C0 x* A o%T`0 |  A0 {-5_+f5<д_0   #wG pxJ=.p ސ X00@ իiR>}w= X4 uǑk43bĹX ^XI/y+"Ap6><xq*`;U?.1jEv /Td@`4G w ՈTy ! x/J _UlĄ!$!:\%$B1 `:K XCT\Ư@L{D`~]%GW`AA|.ZĐ`<8 AzBv #Aڈ%"@]X!PP>]g+|`DAȺ|q깾y`0> HHKLl5PCS|p,K 0sCŃ8`<@"X0?"@t42<튀/(0AT5$.;P`}) @=/QpHlOՍ<-p`6`  .Y@C t/ ?U|O+- xQ?\d C/xJ|wٰ0` 7D  KRQ(be?WԂMDvT ] ]N 0?./`;QQw$P4=T:85z! J~)=|wĐ<(u Aƀh0_`0@| [58 `</j)$ lypD\V+Tk ĸ VyGU4$A@H ^JGꄅ4<``0>bH0 ^!J0`8~H!-Uv4 ppB!U 2+Fetz⮮+`! `XJTр~  T>0:BZ`P=*b 0xƉ{^G{@b>VjnLntB$`; #gOtAq$`{0 0P 4RIPN!h{@0PIWD_sOMs| @0 P0t^oz`gzJ&?ʋ&o j^ p0? yz>JO*50`8!p*+- 3*@N])?9$x҂H|RoC7 P@`;0!$ZDidA`!x0!Ce/RWj^!K"^ud¦>p p0!X@ؠ c*` pxH /_&\AqG0teOK2| @Qw<y}{0"PH"ZtK@' + KHITĺ &``<JW@?CH 0 00*m%{8H !o\$ e0`<}@||y3T~+DM|@!$Y}dJ> |^%,HSF KHr3=  ` @ 0 eXMO+q` `}_x ?Emî:@rh`APÀ0@@?Q礴Q`t.I˷A{3t\g@w|]?UKuQ,:m` !Qx(AT +z|dj h {$vPx U`A@( p *0##?KWԎ<]?R^)|J~ u @0A$Z?VgAe4y^ .W70 0T Wj OJ}A{X5j}}DPBhɠT~{(|@ 0X_%_ ~ 0 BGı'G$ ` xeߪ D 0V?Vp M4ODLe0`}ap\JҰ= /I HG'@ wĀ JZ.~`7 |T]tޟL+ 䪉X*SR# W@ Kx?*ZiDu@ @t>ΉEP0BJ` ~]W5$ y??*QyJr80@K?}90^/T BJm_5/"@-``^6)}&T%z?@O!hÃYANA\ Exp`Aw(\ @v 0 _U`e`u`@z77@!uX0x>THRP0 R!8 0^=lBa @`B0cb?y> 3̓ C!Bz~kmȃAKx~ z1;0H P_b760 U<0T H4*)x̾PvN% x@.WĽ"c݁@ `hi`9`~ޥv$TI`|ċ ZL+mA>P| `<=a~G꽠XA<>`6/TJUԎ ]8`A٪DjP,4aX0y*T&WFSFl+FJ. `<0~yNtd L|\ `_2l_ @,/@ T?Ri'`T K|l=ĕ@xxgA */wWDe'@pA "G0|.lj̃?]\$4AT$`V^ x0!x`0`_m6 0 @o6I`B>$jˑQ N 0t*_8=\x1V x (狾_B9j =Yr H-@ đlHp c#X`0? x"$!0^/A``<| >RIJqa $x?<}}B1P?Dq}@,(=1,`:'T?Tvy|D$z3 ׂ0t hAjĿǵ& ` ה ?DcJ"Cb;{D`  e$O$Q~I TJ4|%/s `;Ā`B[ @BZ  w:L˪/R.D ^ \ p0j>}6`?H0%y}V3rXKu& 0!>+1fͩ# "~ i3 ʇ *Z3n{@|"PG@# \]`%/` PX$S}_a8 h XAR (:LH 0%Q K !`rrpH@yX} H`~˿RB7?t樽x?P0`L "*U*/s֧ǭ x0 PF?)inDjA E)vpk( |v)EI3 |`;x~T8-2 p KslBB` `0@+ܩ+/5XC`yj_>3kqyr ߏ?BD'` \%8oyJEPAV$ *; *8 0c`;UA XNP`:pU /te 2nx*Rg$J2 HTJKeJa ZZ0@Vp9 G >$0??VO/ ha@`/|* #(G9Z#(!@(~@/ymMW3pFTX`  W5J@]t!B (!v?@cY(|_2q߇b`A\* (@/W ڠ<:9`Lꁀ `p#^=PV)>fUAY,/ UUX;{hUexHx! j=/q4"`r`D``<ĝbWd݆``K%UJLJE$ xP}KXA,Cc ڹqV0LKxA&陀Q,3 `A/!x<`}oҏǢ@0 P%?4 xT\4Q,`}ڿs@Ǡ h0A!QUğ)TW *A]:^0`KD6'йEP0˪ʙI\>X!1(4y(0_)M`:0a~ +wǀ$3+ߪ=U= 0! H%+UK+ K./Pga0!1 ` *?@&"`zA?V >##?3hg3Չ@A4}hDOt`^)T\W= O.0!@0J/3N?C  jvY@5!!QpB0j( */ ! > }?T~ (AāQC`83XBW,!aǶB `H`0$%Q O}Tn f&a!P _.)-O06U\M* D`7.p eH%+EO`2R`CGğT$[ #?/ͪ.!%= G d/0Jw!f)A 00JVd@0apM`|0?`Kp>UAF=}.*w#``*V>/.+ ]> Ep`~ x @`P$!`;_AGny@4 X0y  C@;V$ sSqp*%P hB |bH)")iU$ 00}5P G" 0_HF)?w0{ikG{p`:AA8||RuC@`Ax%//w0@(0J H8_ !  KϴH{ݖyNtHp_OYAA 0o<:]JqxC! [@qtZ6:ޞ>e_~(0 '!pAPa(0r` ! `ɚ0$R4bg2h`<`; ` D_p` 0 ADq'_*|@0U/@HV ApDx0@wEG 0@ߕ~+R݂s` vp0uĠ x yx;/xy[FJ!% xjC *V 0>^`8@Q*[g`6Ā>%A0^8?| *.0`{Ţ`D$B0/ c@G`D`D@`}䑠H/@tKx0y/4{1@xD BP0 y< 6QE`+%cT p H0o0`;|< d> `DĐ i}୅^Ńa>2?` h(>[S) ` X:20>Z  UYx\\B@0I`0eA$x C" xB,J}w*NEPUI$"0jax0_`%ҁ)Y x0 @ 0 Ut  q0Z[.  0ADPK(!$`l` |@LVowV*l83NxB@0J` āJ^: @0o J0  /P`|UD@. g,,B1W?<  ڵA D4>w0>%S⁁.]G Ao!v/Kċ0=r݁VAAT@ (_`}A!`@*[f ` %_L]tlC xTZ-4wI#%n 0BF6 ?"X?-;AI@S DH*`x ʿ `05X@`x H*;9 tP0!^\3Rt`9h0(x J`z\`8AV 0# BZ]Hg  .\3+:<8d>}o8} \,8_<XLbOE1=ʫޕ^Z]}UUȧ,>ȶ+Z>><ҭ>O rxRą yCblCe^2aŵ 0 +=Si}7:nB[=f+0F?K:^?6%@?/4>P?^ ?9*]5gﯝrZ-f^yHOZy$!@#AW UQ'%p?ήlOP[O>vcG)x /BX0 wT:*% ~եc`|^?.`xA.ˇV@0t `AYP9@@^N  xy]hN3-cr-s{T87$OBd\TQ PsVSeު-443~5Q)V(0<:oJxv'V4׾.%F/|*iVP ~(pdzt"5Gjop  (~2/.pBՒ߃ \}Y4z ?>_|:T|!L0`4ˁUG`n /W`x* !_ \2rxRR>$D{4ct/$!NP@/J}Tɰ7#3! J _>@%` @hK'BR )fܷr@at F $Ra'|q-Fq?=ݧt]+b#+HX0>AyxB/@4 OM@0]q%°`0`(/| ֩ËG{֪y1O7ݷwMPp7(%jCR=x8+=ib0QTj n8b)1 '1`Ac  qp&{f}!~RʘنHM3 5T1_0 ` @ G D`B< ("`[J~,vrW,9ͳ1JB0O0GT/i{}>vlTDAƹ˜X9 {1( U;!J'>!%+RpXilt`^([O)NFt#9Nsy+ۻuJH~>GVΎW8oo XzX}Le14eOuòZ{xJDɌ3W{-$8a-P3Y*X4/i3$E$hLe08`_Q[aqKȻ`~dۦ B>#s 7<ç̩1.O qD|kp R鱟?%%TF7n<3î_£p/Io8FN8 fƣ1Un'Co>|؀WeHGDCIp_p.3>5EW$>u/xtsg 1ʘ3 ~+ܞ"|2rxƞp 7inU8B*3b,'czL5Utxdx`~a4tO&é{4& q&^: }t#{Eo8#΀Xd)sx- +R΍KǸǘ#kd [`7y3á[yF^6}L?wS1d>Gq;ƫcUq@pkć848}{/wϫ>#<u W k&~%S+O+5spRPgpIf #Ɠ{4~@^^<Ȁ8 )} 7g! <3V޾bO[z\͜6 `F4?VK/ h +D\oictsiY CQ0AzW@.L8P\%خ`AA`<ąJ 0RPyJu|d0A-}Wi:ҝk{ޟ>}xɝ"oxFD}4/Vt:tE*AypV"fBs\_?ÐxzƴuN۴"# `|X$`TJXG}Eiz+̠xS3x}xG8$ PC`<+?<% * I> 'WKO:bI|$`Ç4:'Ut 9%VXr?DAӞ+|*ZkνFǙιtdw}R~ UF˜Ж!/ԸB0y+j 0{U @0EW~%M.\?_o'8"(UCV=ꨤ3NRU$] R)xP.RI}GFb)P!T-8 1r@S7"..2B(V07[rQ i} }6G#H0@f*,126$T KTh1Tp?weE$p/;R&S/.oÁ`?~& s /9QSeonfӓd0V&F[`q>+5/M\;'ٹ ĩtNEٰI@@L2r̓auѫZ+/ozܮpÜ?QZ$U 'TCɸd]\"aߎ>p89<2p=z|3CJeggioC z \^u}z,'ޚ鹼8]`Ot;#>uvF}d (OM [@ yr~aI~>> ,#"rC=`p=G8n޽<|D,"3C4 ˕W|4p=yP}xˑ`8iwǂ=p ^Ma $\,h]/zС] >>`q{Np&dq<}5"SA`џ+pL'=<I/wĩ#!<'*Kѕ;\45>4! x8`|^|3g63 l4og{߷у<:;:3nٞ?GXù(sS<&)#oX4[ dp>5 z}Aし((`VR@0~ 'C. OJB?)xun4,Diw L>`} 縃 ωt@@ VKzPHxFe0)Wњp0>ѯ$ZUGO:ȴnp[3 ^)zp^=D>}"UO3SIu:@C+<[o{gd>'7i.(˽l$*h)ՎQ=>E:ʕrQ"IpC^PA ! ~/T^Q HxT8&N2ԟV͎T 1szl+~q_BF|<#PǀkM*ޚH6m p3zT>/out2>4 n%|! E JӞL!0 :$E_jRP ΛL0 /NpYOPC Vmfu=pAq*v>|B- A\HL@mӝ ,Ʃrmy]Pt'Ev@7n7^4 \b%j˜8rR>Ep8.V}Ooor zmN;_)QAd$9;΀)bAʠ1Ċ_(1ߪĕ*AAr8)L`* ]: s9C־DTumd}sⶐ{T)*(xVk#=syMM'<)4fdF`Y?}">ӑ=(I<$vyw3YCU=xL|ׄ .ܣ&Osd!pčj0ɫ.>@+wO lqȴgjQ'E֚-|% M!Ss?#ޞGе=Q :hD4U[<-xB3ߘ-ToB%@p"^xfৃ7' \vpd@Hqp&`8,pP 46i/^x^sЦP 'Һgn*@.v)O5NtSfֳ?1KőxSV͏Izm ?Rad2s=q3oxfxfH85̞U`P/q@,lV;)XN`eY R3jgq*{8G%yA\3;}% "`$}. =_k']5z#_XBz@7$O(h '7l5O Xc</oK{3uE +XEfhQttк+VO\]RM!>ԣ"L6y0Oم&h㾞`d.1,"D2&ƫG|Io dIdW<2:kx*bk1-ĭg`Ͻdk2!y& ̳¦w9{=T=``>a:zY1M oGZ;S:77,{ '8^4I3HApUC{Ĺ~APgR 8_opC=YmѨB{3Lqt%45_C{fӀ~T /(!p A0!_qXδO p)3;[}j{-Ӓ Āa?! BZsX0!pK`KL&f.?T;}|Z,?#UQcm9( 2:# P@eY{IV*Dl5`:Gɿ :R {#C .*<ᓖkӶu>g Dc>M@$`;ˀ>$!W ς2( q1 Z}>n]$ͮ4{q1adHp+q`c`)@}Ll薚*0 N>sQa-&9m\< %<#Eψ6j28HAp;e*\6߆p3 c` rd" _ܸVz{J32lBu  `617T83u `^,"9 @:rOl3J:]ֆa\<+I֧眢eR cmcd]ӊqܟ>2`Ճ UOH: C^V_3NBSJ#=O"p) ۫w' wIr~!]qv*VM5 MawuutӶ(οX:$24?PL ՂŠaV*FF˜C[+ ܒ %ty< ?FKP!]Y˴7=>NwzB5"q~:92B( `!d(*zD5@=1AIMƁ؄SsThw +hp.~$Q}7}ߵ|!K[19t#(WC@ױT?]NzZɊgzƜtCHk)$%Մ@+uݳΰ )!-%*)q鱰PƄoGd"f淣՜ rQPg%&EMo %А8TҾt$Sb ꯒUx}LBsB<2s''9=5$XdPi S.*T2KΓ5D^cAB]JP W짋aЯTIC@; 74 >Gzv!m ϫOz=F }Efl8#ԷI”l]4qn9* l! `\65kT ֓*!z+`ݒ. 9?8@%ǫT<sEf;hpjD7[ly> ~4dz3ݑMn%3oz,ggQr'"he TńaE8t-tM1鄣|g =3Sk 6y\͝aq8QXŭ?c8?8 ܦ;tuX:I&c!PganJw_7;ƍogs[ܗ{r=1Ěd 5 T >(V&7-Ӡ}HxAݭr=>*# x[2|xf) *T/%'̃qP@j"2ӞT +xl2GAd[ޓ{3NIa»O1a[)%ScMS<8XdXH Jn7I+D `}DV3`pFJ]Aρq/GJįfv+38X)5^aa|]L <y@!V $`18X0B~GI/8ZX *,28p2cr n0 jze4}vp@}Bg pI%.j Q[pAADq)CSćd(Ye4/H&SE1C!T#e8{=m nCpfߛ{x^D׾ǶǑ9F$,Ѡ=IM@Zn_!$= (񯋄O+H!$aC/}%+UV @y b\L AI1Pt:Pʔ $/# t -KW|ϋw>7dÄUu*sj{?!WFE˔d7[_3!Xסc!A/%< mCġ#ꠓV]-TX0Kw t@PA*,'4Ȍ<.1ktzd، =c/B)>X)> Da\4O`'TWz8#Āp@ĭy{ -=q[駽荞{_zFu}Br^f1(BAbSַ7mpFsqaz6$ 3'ޘMKܓsTV3sw!:VnRo60|d6{fz}4=mnk86|(΀-^iEJX ܘ] %L#?2Q>kx$xxUh9`ND`}XA.z'hwuybݷW4g:j=77dx-~m(0@ֲP@‚T S wf t#6JTǠbN4 ގe0)H2%PB/ HpoP{ AA (Mss{g{Bb3t)C1txK~$ { d%D`Sy2cgPJ;&I26$Fq(ӎuDO' a*Γf[jWK {șg>uǹtӓPpp/ ᣋ7n0J _kb@S 54K<| ]Knd}X1XD^.kLj6Ϙ|thѱ7=·zD-:sJy?y7nO8]M;Ǔ<`I)w9=h9&GPOv ̹24JdC pQbQ(~ DypWK2_ .8ĿӐ~D[)r- j 5)\uXJ`u ?5`pet*1{_3 ΑpK@CMX:eL`ix5Odivnr-NGdƆ |1I@=o}wRѢ\tpNGFê1S>Y2ztoe&o< oeFl>r|}5o~1k'g_/a9+xds?snup:xIۉ:Mwt<O 4&=USEj c/r}M᝭Wxfs޹]a+eC77mav]Ȝ(pE1m="sc!34A;<Y bÂ6 ^!fXӋs\#0 zW:3ێ 8C&Ā`b?@d\JG^o<0 ΄?PGCЇqJ!!J[FjX35x$$ " TsBbo \qyd.ރ*{'q§G9>}/oor]ԭb! iɢ82eʎnC9yO ġ/BI_(ā<=>ᐦ*'lYW[@_?N2"QwԦ #&Lh,@q@>Gi20WByC<&oOgl/]0\%|?$HA8 p4I%?Gr@0!mP=//JT@#`; O.((Kx2%BPXCRRxW8":D ~tzEY˨J oR[C `BC6^i4(wo0-ڡFpB?./Cz!Ԙ\82z9-7fz|3Cݦ!L  K0@Tfִk<\ {?*]˱{@(H˕ =T\X6F! `_T^ґ9e[p0K*p)~\ %+I@g/{I{)x8bg/f^p/!X_*HIK5MCd >ѺQo}<2<J&HIhSW])g;;nݭp4ְfV`~ O_o~|3>5OxϹzGI73`}&a(ΕMGs I GCZsV{j"8@T" #(PT$DEqLFDsA |?[`D*@ Siѧ"T% ttx:*c8?i1N@! Or';Ĩ콀^p*dS \[L.򮐀`CK.3T ~$We.Ӷd}ߤMNt/mxf&U0T@AD%ʡ7Qi1U,g*f=D:!$kӐ ;+P.>ALb.;q( ;j! Qa I@.;KUI8jAI5a:# ʁ -ΐ)xu\gp 4Pdi? bS~ x"dj֨R`_R|DNV`\~ޕf\S\p!ɕ>M$>Ƒӌ)OW1)- (3O|R+y*_N'fB0? gXXb_2Lq~h<ðF"|/#|Aw#qQZ's <w#a}+jEʾX9YxЀ)fsxԧ0"Gh x0_j`hD2>QYԎA T2pfv2UPɉ=:NF0\#ݧ97yyyݓgNR.O9Sƕ)^ &DMDd6iⱓ 145Pt) m oq5.#uU[*dS*cJEѠ@0>~!rcRd~<˸;!08#O%Z#X0!X@2ҠGg%X3y ĩRyzM#7ٙolɇ3wy sB 3*!סw1m^HK7כA J|X~>4 J1(~#v8fc/'#T?).tϓ3CLh1l,2oh  gp=mncg0[Ρts7SKߪQC*2GU(Ġ>:+ w!p8 b:*>IA2 X`_c@lp2Q9,}G* P/ڿ^$~?)A06; A|yli}Q٧&2C0SgU@/@8CALP^^ EQ@e5bXdKNDxHa;8pNaN`|Ut*>`ġ%DKirˇguL p\UEj݄@!+ ʜ( h|VKO0a|0 8Cy j׊큛 `I\# 6_̟=<ܹPG  Xjbs?åzj2W ?+2<7ps TO͹{보 g,3xfehO垞k<=n:]m3oN;g?\Nlo}Vit]_sw~([ՉDt0V0x72r#F|uWR!(gFOd&MXحq)+./%T( +W )\KAW&y!mںLnY35 xK+O2fPK=#l( ˜J`8dE(j $0?@d~b M} {6Zν,w(G9MDߋH hit0\'D7yF8?1O^% Ff*8m= &#>%i+ ?hCi<No_{1a`xՔ°A8z]LU6C7B@ JxG Ix /Us xHW@B*HBBtÔf i7 T* xFi30ۘ!Cx_MPqݦ# yp"rף5FyFeDSF [ɩwl.LcQ:T=W̺.x['Ղa?'Ղ</|UiOVBDDASBv%Z%<~C>z3MWxTeI'Q5iE OA`R{ϣ41tĻC3p7u),bɾ Iz40͝ Sh2 ďH"o*c $8ТǝWUzr\/5#MjfuC}k =?LWnk8ڰiTpʬ_ΊN/g 5[_>S។S[$3;kf_u}HO)AN?w[ w\$pN\?.;fÆ}.P#,pIV  Jz_ W1_?Ϧ ZNH0zP)=._=v p] *x[-=mnk{/Qi<8=ouƑ|"Wxu`;J4d(Jnj_Ġa'|X54B#zhLJcq1m9CnP}oo:A W?ugЀ  *V*!s+A2D[ j q#¯ JbMF-.-"30*%A#UV$o@,ϗE*V 9XYrA&!0!S 1"{?H'bpW`d.˫3BxM"X@>44:KDzD*c:@C3fɜ,QfMrO a LM`h 0`y ,V$3p捅? ~5s&tz 8g0|%/>/W1+~F.於LpS0`V?0 B1UUF40껍.4b" D{TBz# `^NyPx *t޳bor7wmnI0 Jx8e io|ry{kӋ}i?O4+װ⻫k% KiӶ}&t(Ξt4}h Dd 8$\P}e Gc@:> `A(D A'~TP> `n2KpQ^z5Ս^ccoG#3 RBڿz|u\ j$2^%I94|B@R=)!\oGm V (&x4|"q.fm?3xe[L^/_H>8p2>)(3'o ]i_q`hQ꟟#ʥx}mc /f%dr0g2 4@@0`63ۻ\ɦ;HyΧ^| p uN `Q]t:i  g@,+AOGBΙyͭNa E :(JZ9w Fx0`08PUkdJ'2m7*ixeEj;[# 4Y& 8OOr7S*88k{j0xxH(8=^:q.O\NΧ"V6beWe)2@#XT%OJ!= z6!{dU0c<3l`j@q/iHKoºZ\r$պĽ<+_4,6Orِ#5g>g3g\;a0ͬ  xͬL3Oe;{5MgO21򞺰]n}e.`Ш ~"Lwˇ~pKNF}ˆN)b7sHT|vKo.x0`/!D+/<KҪ8'#dּ*j(e+ZȈ"TwxSƚ'áSpdwRjy=Yz)o/{4:&0\1&)Ur.⚠{ҁ}/('qp8\# x={`1gSB^Jǻd`,AN-mg~<$ᓝOqG l3}:=o_9kšYUu VA PQ`;(B@H]m.DL$0`Ϗu]DiT I|[(LP\ӏJh*Ҟ>YwMyiᛒ:{LnOs"}N?a>^ h 7 L"!E0#(%Ext>oߕ@J3TizLN60`G !r~|`2kf)\Eq?ftxE"Ʉ陘%͊UFvB攽p%`}yh^ؼSˑFba.o[ w9a[ACNP ! `0HQS,K⿫nWP8?j]O|`}D'@Up L9_ؕW/5o`TQzDŽPP8Ukh7}x hUwyyS|z8! n$i`O]x\,Z 3+(~vҨhɬ2O8@@O 8_}g{ݧ6ۤݷwn76R [ܗ;f= +>ph,aJ/?>yӶvf(î0_ʂ5@5ꀺSM=*3>L  İ@PGn2]Qq@0x`<W%+*-hsәޜ0g{umz:Z5W *'708@@t{Ҳ?01 l(Q p( 0PTB -Th-Fy͹l3s5ۥm<<ڝo{f!>{ 2 `^vyʩb8hCd܇ĪcH] !>.7)-s;AxFa2?'QQxȹ   cU'P)3¬0XE2h':b':aT8 e4Oqr qLKg+ sOu1ø-cTuK/oxȆ1K'@-IjaSL@+.h_:!~#A^f pGj7*Jb<$eUBtG @E:CKfe9Y1 >Q\O <¦'I00x'`G*.@[%sne^@F7/U|E-6ej?'є bUOpg3"4‘6 ,l؏U A8:9"Zt@\ι2B ^y#b^8}nKohG|xfτ*,0*n`{L6O qtgErDO{5Wh8?Ax0d% I.@/5p0} Qv/xd͌3[x63 J*@ `2Lҿx2IP2LSQS Ko0T3@ x<A}^<HJ. (Bg xȎ^cN-ΘWy YYFNm9a{a ı9R`p{qMεZGQ+m:Ft/>@d1r, |{:#) PҼB<^X܍ h!x?P%K_`‚U)˔ƀvF%A7Dh谡9%}-&j'hX+xd A %+>@ VΦY^k\f9KC0}G6doYJnF[F?2U,s*Dp:Đ$$q|J' ?jtW7H"oyã<^0c3#Xf7l/lZ0-<@p!}9)58/ĦSxQp0t3Hq }ET $0vC^<^\b89h1O@wʪO? ~^%Yu`; B%+rgv__dJ(`tX2//T4ww A`';}msZBt 97oG%"yД*/.\`YGg?Ș p! ZF ;;'ioY˻{ӪaQP c*0DEGQ,dc3"0&8/q",ˁ5% INҁy}H&J^S(+>-D0>)`)wC#P0UT&'P)g zxnDvq>I4B X7 5GpAٚh)8Bs6#Ci>"搜qїsZ-qM Ƨ1 LjׄчnώN=qpA>Vʋ兀g>j)VE>4$^%A5_]?|>F 0VۊEO]kU!o@"]NDY' UžȦ5&M#c²VWF'ԐeԀ &m:2xz'Z-{KcVEc-rL2 q *]7w2F`CiBŦG-a BX%8JJYN]`X't"Ug#?›:R–bi\G( |0.1x }Yc L>ߝ02kOϪ#jΎ~b'ntI 4j!le $b''rs"t#IY'HL n `'rhZs3#!Oc:S H*,N5U/Oua#ǼVAxfO+Q/r(^l%O|C:>Sז$?sTP%ct?GDS/'̱iS!gpC‘UE, ?D0Mv|pL' d]6) q HjeAPV&U֟ dB P&,gK|pVއlf=a1:NCBvpY ;<;fv"gptҙkУoS 8C, ~Ý>)9T#boT J _ *qU7 ㄸ\H#'B&\%5AASd%j,*T2ޞmoK^Xs/84OC&aPiP8 i?GtF!z0@8U8RBV 'B}檠>1V^\B$\`(P`~K!w|4iT k\'h8T |Hb!}')Y` 'S%`m_Fxfup ! /pd9M͝έz2lFb.^]AK.֩wCiXU!SΌoa(8oJ$0j;Sz0F ϸt89`d/8 J+[ᓁk^Hy6ptq؊K- ?GL"gĥ{6*up@Ár`C@|Jl*6"ÊT M0ʪt~}/@|$? VfM7i p8K3{no a?0C·ABx @MH:$ W8 MUA`OQ̮K9$wLLcT%> Ԩ/G⹮`F f2\ZiXJ4~ݓ새 :&4č0fF FJC#6[px38JFT<3Ea{[Y&갖lS0 .`A~D APEEaG}]AB,1pHh]Cյ<"Z2^F/4?OiAd^+1)Sy״H58Zqq0J?=Id0  S#)0bvͽK{I}Mֶ1[v#f`wtM^ix/v5P^ F~G[NyNF *c> A{ߴ3XXt.!3l$mb /."X}1Đ%UPTFBq @>\PˠXy`?wi#t;&q ljUϒ:VȰK]P+u‡t؞]?R, _RsC0``poݷ\<.}sB" |zC+ 'u7"T\5CPʰbs.;nQʢo dd)̑UWUZL+CΚ/[{{-pyUsJtS/ad=k xC&cb?I862OJr900taIz2P0 ^^d1gp,G yF/ B.6ux}${ @-c҃I8" %Ac%Bؘr+t#S̚8D#}z4%SG*~8/ܰS`V'^C*L9:1d1x җ^pܦH79g )٢awS/l~WFZͷ$o5ol&_A5W(eypWU[VUfQOczyEǫ's)O:rsYU7ǗIs/xYp8f l.Ca> P쐿kL=+|[mC>\k8䊭~Xi" O381`^^\1Y`;8 @+!x@!|OAzZ L$00=u(~Ć>*0 "T_\v5X0P8 ` q>^YSS$"8, Go }@Ѳ@ ~03V R:0"P jw$!1ry֣˄ ˯:Bf Bθjfut2I`pC\v{] o}.prdJȸ| \'O_ _͑-(fpe8|).;_kFփ+`/zwsM|>*1z}?O[а̖YJl}lz\H A.|~B*\z Jj|3K^(S/@(7TC w?/bA5@0a}PE]:5Q/%,"DD IV>`6/8=^84\6%7XŜGsCN  E:z!xgx pY 0! h )˅Qs>W}Oժ.F֐BN1 jA^u'" `` `]7;ټ Lhs2$I}2"ׅ*' գ7^9cOzY;Y:Ko MU\F'-RaZ;5<{ws7mt.{ɼә;ڳMCdw#%S) q d&BɍB3^,ifFki9 Oi#;^h(j#%T\kFݱmuYCas"pgLq|\M-ȉt_5ap22\$d@+[vIČS:'WƴXx8# rE)^ޜ |PS/uZՂo. y~ N/Zt:#յF 9 xo4#2HhP-QdE{{DOIPPuS$Mdoj*ʽHpG啭dL%ݚ0JCV*@xfH,pgǥb6/U(y2NV]wQQt,G0˦ŸJ,Ug!,T┲.a עeX~ySm^o wSՠ5Fsf K(<J³6ayB2?(eF/id&mNjkYNmUl5S\eb|1 {H05#d@V7*X&[X5gxE(.zvZEcš 4 U/g#dWvEn/)쌙B7= YNeuB-рU].! x64:2kl*J΅sSU*%ZcM*Vǻ[H#R1tNt70E^*KZQ XwOoSU*n%;fc MR '.l"ʚc?Z-)`__Fo9 4}>эop?R9eiaOp.%'ތcH2_#$OT4xtyjWLA4OU^@ *i(৤顮^m=]-INhEhUjF!_ SHhw5vP0a4 yw(zHB,11kxg៏hPf#nBʜ:xG(Ƣ1RHV\$Uw >(׺NLHDzVqXuӰWGc|G4gD8r`.g_~'­F0{&W[,6$:' Dhh nQF2!r&w}E)2e"Pg>c8B8/;ID`f>2J^<# `1Z_%$uwV%mog, HTδY^Wf|kef賀~3U((A}] 5[4# W[wR2#`}G xA}Ңp@^\EIpʄ@./9Jeh^vK:|`@4>_j+mbx`vo(L>(G~ 4 ,aP]Õ?kg`+:|!},~>~ >@[P 0AH8`Vo}=d!ad1s* Dޞz0Ma*!)S l2>bt:pC!U 4˧+#Z4Èћഛ<.=V67_>0 yktGYUuqpb@~@%|Y^HB jKāI0AZ<\ `U+ a"җo+UE+(Dp=P >>|Fʃ<Ub|_N(@` q^U%O`GW6q[N|LFst[OCаȷAxVBUGlFf$(K1.W22 %6׊-]샥;aFq(|DQ0_A`K(*8P0 %~p^nr ĉ?ˈǗdH`I5 Uh?D/T0E܅ O h^J[<;=0? pԪ:f73(j0j,YX)H0abGW*T\8>Aw=(>>z}ͻlnhDOV}ģb Cmmv)aTa2 4o)$>wzsoonfmo>C5(ήaܺ8`\ο4ѭpw6}Vxud-rQ^UG? Hʁ 1]_=#?Va :nd>fmysp4Tw>0> xœyݤ{8\/UI罈<0Vxjyfonwݷj)ψbsy sIXuBD0`ƟbRBgO2J3U#H\4HeVuv+,kov6cqFJȅj/܃p(Pq !@`$&*T;m0 'd*p gO4 f~\d$=Usѱ.8gΙSC"DbcDp$&JxjuLGT5`N!=srRXRy sÅLWUGp+;Dj!?jxD0 ӱ\.|\?f(+5M =Gc p41|0xg]N: LbmنɐGX?#p G,#S3?д..W!?ƕ͡TM/+@,< 8ڊV~8/Mfj9t]M<)/ڣob&>3_([eם2/xTC _tD?>=Y9arw~[zU46D p7x,h10 8L `}z)W% W}<}% 18 H0l% < $_ sH AooolS"j qyI6XfN3.[4Hճ:f !"*vY݂ "Bs/sɥ4#``h|T:u`a? @Uz^wƦ-W +`mSCT@$)T~6^V_} zB#(vDT_W ~U(mBq{қd()■L0J@CpC*[cS9?ʋAuj@<0rJ34 z~ =VIwh x0%ҏBhEYr_o ŶU79kpzM;eRGn_pi"~ Ȗ42P p0P0QxKK!S™`ā,Kխ ] R$GT_J<AAE`AQ*aFܨIV $1nr?4| 739vyP={R8=MaʝWVtGQgS[fBOTY'?p]nܦ; x](邆P @‚"eO›Yȸ-~**<3{rvJLg9KMᓖoIT zeB&.{{,APsw[vԿ0ViXr6g{MC2=34M|^ڇ uzv7mޝg[ŷ/`(δT AǬF!h|-xf݄moh hԷ1\Jͥ:.T"zxCgbqx`up21[R{yݷL3usOw O`x9sI,H{pqc!q+.*T 5jr#y`0/O=kW;{R>ఽdCL񀰸t '( T`9#A S\+e>G%頢4uJtxǼF!pZyW`Abfb)wW#LD"PcѸVu&G4HxZk>!s9:} \&u@ -ztDG0b\$ϫTPb̅3f$%kvi`DMV)~w1nc/kj İP/HȽ(u |]0B xf /xZ_DxLmN%0jf~A"ppGbcq!4¶7' pd X&'^*Ub;控KOWM%c z* Gq2 -.W>@oD@H`XI`v*Tu&?xeBl2kE D@?0ˁ_uSIB&7-ok cFq ZHOs=0G^:czpHOKOSB1/O9p/<$O `x> _C7ׅ0\0` *pM+m"X0> {|hxM5(jqSGekP30CTBulpMLsɉQLld%i~]O^VNs9ɝJ. BQ, )R3j(;R.pg GbsŦj X=g:+[3}sܓpO/T #Mաyy}O(x2MO[10C<PP~% TJ-zC7T H'V]r*Xk(6GGN><@`<<QBT_?Dp`}Į/<H%+0XuUpM?~AMðKT0up3R%ETz}PYp$('˩V޸HmOya.#9b'L5//(ڭLjɃ>#X=s8ry̿1E-ﱽss.~Jl&xf 8y/hfu%``%F0Gb7jO+aijb+f=uyƩHKЕnoΞH5r<}<|/R$)x_O0f@<v9ߺ>8 {y.じč&qd£:޿ yve# 2}ۻ7V4 [ j,H* ϭZJ0p Ц0\R]J>@C@egN c0 y\0C{ۼר~Jaңp][7(^0``Ph Vx]u͸є<3~\ iK.*w`h= 5UAPadR #2tp_jv$;NۚS{3wMޜi7Ϩ65'd AaH^%X`xg0 *n}/WR.Ȯz x [ZZp&%UMq`='%4  $-ꈻAa<)Ϋ@^q}lSNUp>BdOGԝ$:q?rciOF#"VL2%ߟ 2^#/8z (/po$jzJV8L prWP?\9Z=^{8gY$g4[`sՎMO>U E;0{`Yl&J.{\ ᓿ `~GjTy P7V? Pw  +5N){{Sp_ zyNBsrx$P⬕NT%SߥyUW7()C X?$%Avkg`< _y*Ttvq)7\:3+3 ƝM^39z U_ˎnHWҬ6VW1y髃 <)BH0`Yz^@^\!p\2.ˀsMK#3 $V.[G?(RU@s?`00ng*V/{ aW SaXb>;`qz+0 擁\%yOOAbA~L TXr_ ~-σ) 0m>CK(; \·=k BXNԍ|`-{zw#xSԞ≿p>&x>3*<=Gar>%~"LN2xt.68x3&83Z4 |FH1' G3P\OI&ϣ$#aLS? n t0Gšv6 f+lF>g|Di9?9O+UsyH-V?-kG(ZUkm=> {#sOD-O|77\&yে=u FB.{@'B5êh >5,3$O`،?N&'BzO3LnOΊ!pp=LcOܑclf->u?p{d]p#Ȟs H LG!\Z ]0v7z.G٢&0 6 qͨFmnntg\w L%XJq;*f?B");u[-՝=?sE =KSBƒ MGNRWJ= %e>Fa21,K5t7Xxf Q޾Ȧ1n<2O|6߉ppo!~ $C瞦5EaLbV? JJCHHHU SCCysfPS*.//WvRDkY` @~"P,l?*FUxp!3 .*0>^]*BlID t >Ap|| w@K`SL3@G]Uw  ;R= 84*z@1//WuOdjup8RgBf;Sbq p?Ϥ ɺ8{qD\SyxG@#1Yl .Fӟ.&&S-j+&F@*NjpSãG!t.Q`땷9|2s{>T U sURtF6 `Pˋf "^(PWGB*AĀ#ᖑ0@$?Q9HO 䡒̎BX0>!$:PBP0@%(. % j(/%0^*4yƈK^$`צ^.]'r _DæafYǽ9=73Ӣ'yTB|8>xG^ F 1|'t/xSJ(Vx0@0y-P}Lh  n'|b™s3S7رM꼠 <3pSCQ#ȸ =Vv0hOI$}ߟ`'Rpfx2 bw͓'1rbgE . SRД=PuF*؍H|y{G!}vMSĂ>'WH|<<'}\_gGms7=nﺻGYxٷw ";O0Lw>7F۶l\)(S{27g&C'HR"oI ^t z} g)^8ľTj kztÇ~^%A  W1_0"^g5M` e>7=']4dRAh"rZP" ȸ Sd&,74t茇8߃ ݔy|:?p%}뵾=n\ a3lQ[T|KaW OX(DlV7=71񉰐=<.pSΝ @ -?ǗÌo{} $_jW|hn p5gOgCB#E?qu*F@͝gF M;x_kNDopm`R GpG<`Gx~V#`f<;OL ܫpXTWcֿ@aFꎨjrp΋pLz@P3p?N o΋Ad>G ǂ_ωx.Є9Jq5xg31.LLHӁ ;뱃ҩ$F5y|Ǟd\s<#0`GT=VqN4@$|~_FY^=#GOV#oFN~%xy]ʿ/Gk9$I}P,թG,.4 O~7T>xj0T JRw͸Gà0/U Cރ15d>80=GmV .j^`x#WR\@R y ΃=pf^ƸY\i/<0 {n N \ ƪqRQS3mju*:2E/XRxzA+*Eu?킑F;xȄ.sG 8|(}8DDOox8@_q/4 ! -ky" A{b9 p0 w<<ߗy@0Am uX{4LI2Jj đ'؜Rb@`0!@\ICY >RE7/SP!`AC4=jCBYp!SSq~*[yT !J_=@%$-koc7,dlfZ='^e#oxne4&.k 2MOPq$KR4T`# ߮ݏ//) =0< }Z^x$r\QmɨK:EbN$SB u1!`uezM}au/W4 8K2p/pYp?+{斜F<׵g]ޛIkul R *AB8 |ɨ8ʀ$|r="_>iiΨ@W㩵'^h3v'Z41G $}"x %u3o枖;{^2@v{am}]'V7 %WM@*]r?b傗r Ϧ8o mp@c#CЍ7'~8P`d Pk "\ XQޓ]_)d;A4s[som qFT?=>UB11o,.1 Pf:P]cPTaޘ˦9LӘT ][lyH?&Z=EL DzJ׵n}ٹ#fo)jX'Vw*^,GdlFwhq •<( aBNsd-OT=ͅLe2|)O{V + 0g}ZBWt:`0!>J^֨NFŸzu0ĕpHcxMbr4ΰQƛ2OAIxqz{! T ypf zO&>\- q У 0!8H!6HC!#^Zyr{yGR[i0S<9((&M3 J,ֈS=b Q^)lvrTa0 2Vu] 2y G:CkJkjↄ8xxrpu-f <@3`t}s^P<먰Q*xQNj>\6xbi5>w: fE󄕤;WsaIᓀ(m˄!Ѡ0`  `B]B6{錗_A( `p0`)>ix} ?T_1<]|Eq"ߥ;}Q(Dp<% j$s͉2AU}ASGaOslP j E#"x8"-d=ߵmVngt"b ~]  ^3"e>#R@@ߢޘAVG  BPREpmҷ_R"]d-8>x?D?{yk {/<2z; 5g{&N^/*;1~:X8`@m׼mC,[785>*2{t}h:}ͽoni;_W# N-@CwFȞ̤D#D{owWIҡr{ *:) Cx2?TA Ű *x\3qU)Xt︘`(ىMz`/Ƞo߫̾TןR@]@)h,2 ŅF?ބTt22_}C%`v޴X5:'R;,rzB9:;@D}cv p eV9PIZ<> .gbpt)iD7]Z;x`%D#תN *I_^X$Xd$TJ<&s4`+I;B#<d!4_1I'P V ,.RIÂ3e#=h6*/B9t' @5&Uyv03đYؽXV_>+8V?GZƟsύ- Uahg p4?ܟ1 S\x|F#d\'$x9rL"5$W r>q*&]^<#_5OV;}RdxMKKTBUi7^Ea1*I D<#N9i  ?LȵyX&0M|!k8qÉ22+GB*0g? Q}:ȸYMVJY8F#po&NLix._x~!7Z 0[X{͞L'Ӥ*!\؁P6zFf̗gTzk ͞]kHS>^575q XS56BQ 6x)F?ǟmEFpP+ [J8&c8uAx{ه'T%)KW 0X`˦Oy@ 0>/wQkb RJx| †$tت't+T\jNJA ajABV<Đ X$`uY J? ;;;"xqc+^Nn%c{͈0 p8_o {xf` `0@aAXB$Yw,x!Zl{W 9uX`D(bc"PsAκ8_9"P0B5r*\ *Ԫ 1`q"#I|0 hwB@SA EP#.Rb|]0z_s8ԗ6#"=WECb28\%|3~⽬({z(J;*K?bD@΄0eb)E\5P {ا:&O -{`)W逤'(+T CXlS3 T+EãaL9`}oپyF *ڜ_ePq@@R>جS{?s@*}kyפ=oHOj%=<2s3 5L=+/#tdL,/}>z! @//x!|! 6 ^!_UXS]<N R^ pQ|v  U EшS~EʪFߏzd%(S=mt(7J(>/qo3v3S!?p`ds r\3s|: Ӭ6!7S)C<33O^ 2NpF}Dc%mSeA xbϽ' `J$V`(y Kh+1VDŽ;QxJ?b >xΞa\j !6Z&jW8ۚg 7"p'JЄh .i@Ι.<^+[ g2NB%6˺cx8ihHQαO#%<9x8?^GXf$a^a*yRt?O$=NӤ杫p{9\2 ~pbt5*%!> {t':7 vlﹷwW[KN+;Ρ!4#g^\VO@d@0fc]|t:bT>ardl+U,M~/#r4/p B!6齽`?>}js!'6*`W3|=C2R +遛/ %DQ-Ұ/S4'{@ EE)`41RƌZ@!<֣ΈXt؞]5T' A`_{vwݷM_-zJq/zϊpUƚNy-6pQ|z 73fX U{3=e)@k+ϡ:|yGD{ x+m:@ 9R6>$e^ަ$[+g/e!|?CaUC^C&  kt< uͼa$"MS\#Ըpŀ[Dhj^њl^ۈ`(x5>fSo 7b1n fL1+?1/gϵQcg aY;XdNg m6Y;U?4 ` P=S> !'l !}()0!Qz_WbB c"$ˏ |ں|U ˨E@ `*ҕ@H%WvDW ]>rD*3V8ʯ4oc! tp` V̙> !`AAI*U<8_ Ќ> fŏzw A ݧIY-gǜiU8h2 *Hg#胧x 5jY1`QrA^&9xyRh8SZr880< @;ケ' o  y|\ tAVTxwSSLI.Y3pP-t (xMB y%P)q\j.pr jDu!w 7N.$)x{3e|t4t IѾ&Q[?vvݸΛB!/AEL>M]/JDq( ab*p %;qPmEtd.^'z%$P b2+'ЙވЩett #qzIbC^ %PQ#w|(I G*={~Mԛ!.:`8@`o&o2%y'(l6a7_3n7e!Nj.j\<[i\R'? pK@hqN)%Ɨ@#(wzwSz<2_*#/ ~3T -L3z.if-]+umpdOj&b7KXg4y5R5 j# >z0=w}r o j^ 0`qdD5W@Ks!ˋl]?p)ϫ7Za)p?1]"Kǰ'|v'cHor cr$аy9Xx*>#p",3|GIBcd\63oN΍G =Apz9J0?fC:pGYgxi73Wi#4k=^+fZ6,hD"E@a{;Aa`ώ ["3wlbvw .h8`[y"ߏ0 `KB ԇ} }YHD."y``1îu)rpOkdPGt`~yZ*"0`xP zlF`oOwo:,>"@0GfłivF2t5'5?0;i)p%G_RH5A,zt7S |v4?Tȟ՗(V ~&xӄHR0Ǝ3GjA/AU^_ <^= 0R),ù$gFc#K.v*JUGjP0' hO 8.1~ %Z}xzy 8{}6+ꈽ >\WjRtE&J%/$ab0)6Dg@(l l| ˻WABKD$~m:I|ۺq7L,Fd~ f`~{9IRBڬJII4`„`; @ ڠRp˜Klt(1sQ`\.p OX0 <C1,`wC;'xv RhOl2 /u*CGCNM\L9&N8%a!t>tm[{s i7>ӡĵV V.^+{];nsˢ0MNEP&6]z)(4`p !Ru}{ۛzMj7P{{yOvܞ?4&p2u&AGQv ӷw%O1㽘,e9nۙN8}Ep(î(>{ ]f}?G@`\ "ix<x P1 :*//Z\Xt~~{ӭ_Uv2hhyf6tݷii3{u&e@pDw@XY5 B4 (&%ߋ0&;OA঍'ꉝvƞp`1QeFjW4s$n((0, d8OXR~ ,{hQ;{z=O q ZR?eT{XI.pʀGASp~zOώ7v+D+ޟsYBNǒaNJ,.@#7QF_cIXJEB5xW_~Ed8pX#fLK ~j, ! Wغ(o `#:$Ci| i"鍽`\3pY 4y3Sd_ 0>w'̍2{\<2o8qac4<"BLxD?}*i+_`gxmB1*cuKkazMRQ/fψgնG`Z3/lbU 'X}D PR#sB0ʛ$X3Nmqp(l=UBh*B1.,E#=J4ў~4٥@8)`[buҳj0#P4|;&#>6=/p2S7SGt!2q#G- 17Gt˜/a5g"y|ǎ3[9#S|<Or I%z"=oǠP卑@9/V0`~7y I`T}ESre*Ł!|eF.gG!h0 {k`}ϗ cqDR ` p87f'Fs3sYS@(DG$ xvDX„ ~>gׇ5OgA``~tj)b  wP5b[j_ϦEGB?B*B^a 8@pjXeu*.GоKwUrn_8 7B<3 U<~BHOp $Q6 * `P=U_<=`>a8*E5y6:8Sfyy(sTS08 |AHbX(.8uNr׹TNz]ΧU~p o [6Ty&RCp BKKY'0 ӢMƞi ҹ pp {ב9L;8\z:x8C}g(IP,ZM<_^6fӾ-0cc|UH<8PdnǣQ.Q8_`~y5dg4Ci1 pi37M{}tSKLXI&8Zphᚩ+ǝN׼(ΐ]`]#os3v۶~us*FS:RѠf((() Y]"T?s›LTD>zgh*P (P~RM>~)ш8>"XwVOA)r%`bA @ǫ]Hv;>E8W+ǂ3s /]}3{s)խDH#Q/pEO鶩8ѨT(WS//S~KH8#CгA:@h2EqsS`жYSS8UEAg 2Q \ћ82 :=takV!k:Qfm;Q/~ 3?_@@?4 GɀL`;t"OM/s@ WJ~|JD@AX`<}XCR''`BS=q8`s?dJGp nC8`@@ x0!(Gz"zl ap@Q 0$x #$r@%<Į,0,|܀yl 0U˿l.` 45.TĉbcO`? T0(`xM*~h<` %Q Kzy*^ /⡛@pA $ )t/[WSv+~']" 0=  `1x0?>9`N% %E%?]b1@@>,a|1'&0a}9Y0 0`rTX2%>Le/'yTpG-)%cN*0ɰ >1`Nɢ y, JI JSϕyp0@WjOh8DP*J0!A@%Hwb3y%:JKq@?$?q{VH! HAWe*Tڸ2%<UuPKU#J9; ;E*pGȀ$gzMPI^O^D|~%*w=!AH5P!?Q$ۃ C_G@FC h,`o˂MN  QXQp0: x,ȫ(0xjnpf(`vm|,! KWP D@/G$ íG-R! V ^@<h0`.T~P`K?Ii(z/ 7A._H * }jt "Iı$c$-T4x$Gqd0 uɀ `6D 0B]_% mߞ>qKzO$t0 4!(".3G>S# FrLJ@p.wā(!+tIT?T0҃`  0` bO_˂` %Rkr`_ 3(; r|wn Z]0 @0!ER%gtyAc-ġ'z>j 0)$To?N<`V , ǹ~$(AIBT>T< 0=<^=p^߁tE =` TȚO$t|>$dw, e/jtA.p$x~ `A?W| X+yx0 y0#^\K p|  _ڥE =XwGxd 0_3`0!z{L[ph%&o΂r7<`~eTJ^Z 01ur)P# 7~ zW,|,]OH8Cq0>  QeL ;QB.&DXi`!XkVj#aq| @`Rh@ά񊁀{)!\ 0}Qxp@πR8 @^g>$UŌ_σ 1 /NU=l!8ߘ% @0..PEԎNJ/p? @t^H  `DZtP`:xjxѭcy׼!`(G3XUx]_0Ű0`<ѣl?x0gB>d C̕AZn$\  >@(! Th{_tx0-| Eèhq,|^>8]TL,DWǀpMXP!`0?%TNC/Ĝ`Vv+*?, p$ 0`Ry|zP  x T@$*S[uqp0 %`8QBLq2؃-WՉE0I`W?>> @4IV8@%BM.W64p|%%  0 yx0_*@HR?VA>%  ^@>Izd+ 0%M]x 0`W|=g 0!PAWU˾N0`DU EFO.KՂXMAEDp0VA |II Gʀ`<J0! 6Bou 0 \đ)Gz~"y`Ļ*e=C`yqAZ n0 J z}.G<%~=T*)T\% `_kodKX!y~aI PU卑 CBHB.V˿|z>g@U>%+1` A!^<W*iO\djG`?BJ|FEu+ 0 }T(K6a% h_nX,qa.Ecώ ]u6ZjB0yiO*[](:iarmP/V2ua`<8>:yZ+`CA_ JLH1/~}0m?ԹRhot0hX0=(,I? qU_ `0@xH0 vEnX0`:B0 o{x p/`{l@(+{$2#44 AXJhʀ3z#}_ޏĀ` H(H. XB |S#uG=9d p h~@xg/`讉4!*Â@U >|K(@P?:j0(>?ŧAm?r6p0@ bPVV(93x~%UBPC_ߎV` b+X`:A1\_~YC,A,`BR\"vUPbXH`;˿ UxF@q\Ǻ"AϏy&H> |!Pa5 ~ r:z#64{TlĀ`0 Q 0K:%0l"b BV80ERV+p8i $ *+WU+ґU6Fl xA08j>CO#*C;1xxP;IA_ C {`~2 ^?/R$+ _-ړ +0v|R X"W BV7 ,!MB`K ! W=EF3UEꕂS"Pp`4 p0 }/ ׅW@N}Yz z`*TB@BAF<4HA u8=/WGAH/^]0!"WAko ޭ] RD!'u&3|?W ^sIb HK`{xp6|PP ^/VT}0 `+݋9he`]*!0㹺>#KB40V hH>|ET$Nb0 UʋcH/6i PI)!$'gԆ@}ws؊P`Gߎj@1$5jX)2*!y.( x DB0~%'.Q./P`a߉`\? IpCj$м!J@ʝ.K]L`#Ax ax(((W\R (Q( _rN0 `</.@p6x ܌*楧^ˇuKNsx0%%0f0JT+$0 r0@VW "/9~/C+cCUY` `; sev|Kzr?tʤyECVI>, W`{0OAXB,dAQ `D $z40|$rYn K=0@rCUS  hGqoV 0@#P gz w냅w"H0@SwzM >`*}PWA"MJ X0`}+SbX0t}X0 ` Mhύ_wY @00%J//| `ڬ~0 0BET=0rT 0͗MVC`|80JjDF A`y| G A b0@ +BDU H/J\\#zc@4I0\ xf*k.E`9>%j`9Đ6\$*#R1:@sǔ"z#w0daP0CƬϴ!pC ~~]5"N2=w +M^A@ .V%?tBX0"H *R- 0 tWf4z W<`IHCN,<,H>UPh#IP`;PTRzh>]9b1Sɉ`y$B\p0jk*v"$$?,X$`|g*E9@(h7:P}R ׵wу%BAx0A0mh9Pi%_A* G6〔Ʉ,`;%! o}j`  raH? Rao@0?|K~SS@Xxm` t>\|FTs?A`;e ?;.+9h%AK`yqD?T=xP%y|NI@dU|L ><?ι0`W˽?U$`5ˀ9@\_0_[ʕ͠r_~zp>,Ap0 O@A>1xzG@0wUbX0?*>X+4P`;hA ð8>]DЍ]`>1]IU ϵ1{`:`G  ǥT2y \4d?VEG<% uݠ[Ш] `;.10 }4P+g A )i"Xv+m~`2@zZ`C _! h//T /doFPB.ƕ 0\ `{:j |SBW?F̀] h0"}QUMT` WcfX0@A úcE`` ^<@<9l`Yt$}A//U N  I'FApӿktp J U089 jx!_nP' /07 ab5@xR/A.[j U(p9Dz :$~Q Ж t ~x\IP# 5QЏ*( /('AKI}G ĀTw )x!A.0oB6XB ~.8 X0% JB rB 䠅4% 0AV^;KAK&Cty@`8ԁ%m+€`0 AT OeZ% /ԃ yx0bX(A!#F|UJC7~<K㒷=bɲ hB;U\Ɛ`xkV$W00`8!OcpۨJh`CK˩xZ`BBxB2*_ h0V =S @%?[+!=T׋Շ~-f:.rF4 ${Z κ.ZT?$: /_`}׻bpU @B@%x*ƿ0 IQur bX x4Ss*xaxJh>y0*ժU1@xn `0b@0?~WAoM?ם`)ӧ=G Y8z #<`uN9ɾ+pr^lxxXg+$ùqO\V^%ee yeX: ʁxWP0vip$ +|K:/_(rzs,+@?!U.#T%t6ϩ>E?Drダ/eT$/6PqA0EH/^\HER@JTFUv.D# o0J QB#ǁOp0c`H%kh'%NׂA? 0U+U`zwA"8Gx0 G  /?xy.PX0 s2*z`~#G% @nmV#, oT^?0t(0CTh %X\3@Ճ> `0ڬR A= z 0 T]Pf  0@߾Pv$x)Ub@"iX0=?^%Pa?!GH`@A/R /KP5. {?G2@p@,Il0\=! ĥ\;IW`;\ 0H0u* Ude+ރ׀XP 0 6`hy@0|ppH<(0> ! /x8/`+fx#`lf`Oǂ@tx $3 ՚T&'>A*X/%t/lx)OA09M{> @. ^%ESbX0wU181 0 `0/e|Fӡ4JT P$1bA0P]`yz%~UOQW>_ \ P8xQ0>*b`2xqD&PY:dPZD%" O] bv 0 HB\#T8 p@R;U' ]|%$*0 ZTyڟb:|`s cle;g 0[>9YH1z0.c b7.RV_8_A)@4J. J|l`;  _}z|ߏ⪠ ` <11S 8 %.AXBu?t d> +ttN ~ V x1ix0 D>|2@~'<K@%`%KD8 x0A)~ό@^ P H0`~*.jHAUmHF>bX0;E%'hJ)8$y`;T+ `t$ u `$h0]AU\Y k pp`=j<ʊC&,KhRES?˄`a>蒬_qrDj:UP3Sãg/n7d6P?/Oo"L@CQ;=\^2$eZ?82pa'  c t 0 |P|~{/mz?UU_MX=g ` A@` A`9 m+xP8 +Ax!5Jąq+ԏ|K%P={N^4p,~X8<l 2`p 4 AA< f jN@ ࠐ?.Wy00  `<0tf . xTnXv(T^\##q  .A.?ɤBE4g P`b ;|@'T UjwBP < p$:yTiTIL{,n(Կ'x`CB.Ku*UKyq0!%N:ʬ xC{9TP x@UyAY |n?_rh xVqS%AAIJ\ pG6 E h! BP`P@ `;D{kCHQ<\2L?XB M 'P9b$t4`}Ǟo 0>@x0@ r}.Tr  cቯG㰆Ta0!`:Qv\ut|  G"HD%VXN GznT*9 \60]X]IӦ(CDj ip0a0r?G  OgǚgWY $ _E" , W7M`x> $x`! # JD~7'X0H$x88`` *?"O9o(o`}hpiz*b K+P0 n|  p0X.0Or]Bpq 80A?Y+../XwH ( 0u~5W S+6, Cσ\ r ZW8`<A% UCg\{0 \ @||O S#0y3Gy0_ĩA `Wr G0P@@oE@_o ȁ `A"`ğV< 0./et%`4(02('~8,0G. 0A~qxVzP0:T T s AS? mDGup>˽Vp`( 0@xz:A@T>r0 D`ąJP(0>ׁK `<~A/M 0@wA$K<>  }Q B0P0`D@%]B!\`~J?wnP u +`\%{ h"0CEr+HIN Hح_mt灀}n9~ BBJ`<`< /,HD  : p0?*p%(0|l/T PC>% / T x@HϪ0ŗ ww/|%gUA]Pq@|0#@xQ'\<ρ0_~* B0bH(etP@T$ FȬ!,0!! I! p ŕ ־_98Հh0 8_0 >:?tj~o`g2$'P`$ |8vX GsbGY<ԴNMN>TA! .7$`D`!?=9+Y `}%/*DA4IX0`_Ԥ VxS Z I/Z H! TnhO+ _ Vc&`< wK~( &WH$`:˕ 0` (?0 H0Qx` ^T 0  Đ`>`G @ʕ]'}*pBC@ HՈ?kRtc6B6p$I7>j1Ȟar`: KxHletx\ r+z\%.kP0X  =Q^/<t1Q4%(A `JQ 0 1Q I/TJAB G?A0"H0w~$5P $Uȶ*XK6t2Pw>Q M#d.V`"H:9 x,x^ 0%"$p0>}4 Y-3++i BO S {o˩`:&hH.J(_u!KĠCIa-D'_ $ 1 ~QXZ]>A(R= !(3f9P`ǀap0C?A`ڐ0p JakA0!x0`}C~`!%py#G l >E锨< =0X0װAY}VG! x@yO]x#ɝB0opC ǼzTAl*+}\`āh$ `3~֖7 $@fB0 d=T PZ^N.*RpP0^"pp|~xFt=mpɘp`9z`}`*bVw7-~> X6C?VAN*/mx#ǓL/@@p $@0 F+/V?k6rBpJx4״aw@ 1s0A00!| !'P`D0T%1/s[+!5/\cn(QD/W8k` ^}XBj P0>0a PbjzH0u0!Q%LF%4Ʈ)##0 4e  +' \ 0@y@`~Ox (0$`<ˁCٶ= x WP ^n~X` &Ԧ<!|!2  xBB)σ A. RG&`<̺$%>\T_Ђ 0wV$ <?sJp1籏Zafƀ; 0*ġ(`B0 ~>U.Q0@^4o P* o UGO@*U $a s:@G~P['X ('^2KP|@ )@0v?J+w!, IPp$Wz湃/FL .UdyP!J@ 4~o+_yGOF wX bO|w=TV|%KC0WH0wx1@ $ sz\^^ d/ `  (_q,7j  j V%(]|%emQA4J `~Dz@< DB: 8pi-vѠ 80H0VG 8-`y@m Xh!w]dK$ +qPJ.V_% !~|~ Pѓ9wK>@! 0>H4~%6į"ߦ3X @%RoXC_R[1l ˀ=X0hS/H0@ x010!JKd?hSH*RK0= G}*WVbM( 0?P>6 ꠼p @W_ pHZ`DuC. 6喧`W3jPE 90q_u(ʰȰ Tz 0>6QJ =$ L@Cy~TE]}pHP0ʘN4Y#(Ut p0*.l/%CUG~ @B.W}ˎWY_fڎ=\ q %P|ZA # P?(  H(/ ]U9p@0G)BRpOA~1 p`K0Ӑ@4r4t d(O, fq ` l<< @PBΔ!`}U(1p@A,sYrppTG* ZeA%K> W쏐/!xy|K= T4zIy  @EjJ@>@㕃 J//'5QI !wďe@ $Q1#M0,q/x>tp```{?/O~ %@%P` w8b&.)|ώ BU`.` İ`;4J{j+pp`<~ Bj 0 !PBr `wr).# C4cȔ<ʬ` z 'B+ 0% h@0,Jtu0`5 A`9@ %}*h3rrv;{5ӜDǃ 0C.CE8H(+_:`ˁX0P+(*!s h 00 _{ 8V %+~)RjP.jd*p` s  @}R҃` /Cĸ!,Jb@սؼWhQ a !JWN/=^l{0??` #0 i4|$x!|U(D^_⑬%lq$QP! 2#S΂HU|:% RH41&/%EÿHfht=! '=h0  AhQ=,t0` EU).VaQBS~?F3ZvFM2⁀| p0ꢠ@ `AS-Ly WS8 !!tP``<Z ?`ک\3ZH`(P0> !1 H!Ep0H%27p?"`BAV X)A.T%&)`  P00!*Cp G@!{/* 'wP0`AH!lK.j=;: 0ATv"Xh& j\\ e@0 /BF̀x0 x0vg'΃ @?@L7N?H/*@ȓ}UM6 >yxwyp!+@(1Apy~KAK.4 @*jf@ "G+C=X@!BGip 0|$*.17v\$+VYzFB`5 `<@Cb%`8*8Dj<Q/~A80`#~\Iep`BUxxtKTj ?`B /*ğꟑpq@`:w В oā(IA -  | JTLuM U~T#8z4IA@0`G! B!Z+`W/lh X%9]@`b6Uvj["P `<  **Uz=7rV $|U^)HLt%\ `0-\NLJ_Bp A^|?+@wC*BH0w3(| 0>@~=g=|0e/uK c P>^]t0DêkmdQ/8g`0%ʪ+@1j gU`*JyXw]RB0?#`CRLZu ĀAETdʪYX?3T^Vh0!2S$$~| (0І7G+HZorE ʁ P`AK0Tfk߾ZΉ`*' ]0 @ m-;0`;ľ0 x>|' 00! OAa%S?Όu'\uǀ{uO4u(4j%K<B0>y*0@dUQx0 C`C`/݃+ӕA $p]`LR]a<~A*?l Jˇ+.Q|Lh% rz@ h!|H.R:A>bX/P' * MZr.A /T$@`;A8˨t|+c:@ x 0`T0! ?E)cR4ח4@`  IC"'M m/* X0`9đ'}EWT jM&&nI} @|%}J b80y%"WJGt!2 !%yՄ(z;U9yOi'D{ l@P!ec0  BA @i(  p0A%v+*TDV/o4!^Jvz0=KhW?(=*`TK(.A5@qP]lۼdkⰇ5SmI0>L4@w`BBܢPCVS 0bH0Bj#h0ߐ(`9| @Vql+)e׼ j*urhReH? 0 U 0 z_O=r ZACB0`y `GꦁmlaȊ/G`LAR`EA0i 0`0@*U JKQ)T"`D< !~s+.0f 0JR .|''aA E*e_f8~ <``T%)8 0_%J`D$_2/e0`A r <Ph$fܗ .0aX*~QT(G'$` (AVpu,ByH\IT} $[݁VA CЂ x0y. "PR0$c$J `<_R?ukP ` L 0XBU xX*~ y$P0!EĠ "@0n?` aA+i` U (aAŢ`CH00`@\ .<  r,(`;jaꐃy/nAOvh  `6< H0W|#< B@R0| 4tX08`C  ``|H 0!m1]" | x ^ >CT!|0>.E\@,HG _%u.@<`$K0@W.'˼AP  `< /- D I`:%GS0>%` uj 0*<*=e@)U+PPA=R$" p p@`D>  D{0@]P`AK0_cIUHGOu4|Ksq8&5 _g ‘g V*bd>|>*T~sp?WK.I`+8|H"꠼KT>c< A`y9ctN斷6ӞΝdS_6`9~ ! W4F}mSIA(I`r3z' Na\`)G(: 0~xU=z`7 T \|Nbs څ3 pU&8jBz"@ .` ط9?3{~?WC `؊0Mł0,ֆ>"@ ;~ zE\>/nm%aE.U.0? / O'Gs+"`=l#"UrǮpP(6 !3Nv 0 R8_KzG82B< UH/ Y+}|*R=슂˜, QMAh0@H {x duPC(e2/ߑZӜ* ?֒,hW9N %9o8$ʂ 8X `C%V `;8I2i@ C .P; | Azp_SDhfR"sp8@B@-u cFs<)#8 b5:8k{''Ns'1r P烀F V|4Ì?(TxJᚲ2SRo#UD* PBlwJF!-J38&wݧy;n(Cɨ8x8]q]XB8i/}؛'J+>q4OM74zyCd vޟ}p+;tڛ1QaQgպB#|^af3z(s#\ˁ0v@y_} 8)2x-W̏jm25ZZ䢄1KşT(`Ɵ|JQ V@/:8)8F؂`~pxGEԔ NKA}yﺾ쒷>JǎWvu}O ޏR`Wt PVn5HGD3%N B+Bqs1r@Ah / :haLPL'F@|+$0-vݧmʉ| !{i"*קJS Uhl~ADcb3iM$s{xdy33yt$8{ۆKA&Mč)‡A'2DŽ:6pҡ.m5`0Gǻu0#@RN4@8`J t'Զt3U>*0 5L<$p N %ńZ}]!aEm~`~9}1O)HB)1)fZyQZw{͝b0go*7X|Nנo1 ==k}Z*x} zy@ChS8FVZL0@jJt\XZa JBotJT^.V4. s{=0Ӆ5(`@oHx0P@./3*%qMBpJj\xۜ%9˻!*L LĐ H8y 0u?{jJWC9 C0o՛abQz7B0+oi0S@йPPs j˚)uRHq_` /МQLIXC8 0%fbgl+ȮdR:\]V-K,Xt`EJA> ^ׇ c1,=tG@8T?((@b?/B@>~^$\;2t4HO8] ݇J)0`B`<+V|r98C*z1L-&@' JʓF=x1?{ 0PG8 `aCja9O ĄDD&J`.D#c$Rx:GSX\qdu/i FEW X~F~&q՗!V~>3T>ɁzadXd>pdId0k n6uSeJ漤œ4+A9{8 GBOo]>4t U.g̈?WU_!J,y.$Ϗ=ݤH) xb5QJJh##7LR"۩qɝCq<Hh2pd!<}pd^aάS1#XӿP0CwOT@.CF%+(WPPJTT2`ȡoDA\^Q.(HLpBݚ;V2ăJǀ`/6рTjp2/j}Ex)K^RBa*5Mr8|rHhCCeDC#4Dyl_^-Hc='Fb|ό S|%O*C$I I*9Qc Pg8G#u0`C|?n1 \t mǦ AU 0!"Ow?$K/VJ$P8_½!hx;O p?i@ֆKZ=@8%%IFP=F>HVNN GĮ5xgЪk ')㳉:\340~'9cyv<\B24-I3{n]2|Q7 qddiV>g ?>{9 aH9X^RF^F|_s'ì``W&ra> !BI0o0^̴dcݥG`-m?&: mmÝsbtGĪd jD@hhRX'F7-xBԽ`b8gzuy齱7Ov*?xh#-:bCSp>2,M Dn6aL&.ct7\!Gڳg!t V7sn{!"tgFAOd1cCiøq+5J-o_ Y)U`4~aP)yv(}/Y  d;g '1o3Q`*h'zZovM7 a A\]&ӑӥ'0Bg bNā*1T rǪ/eȫD\|tՙ*bwFXl);8_^1N|S GPUn@:1 f3ǃi|13c#ȧϑ;7IϾ"U={YgSa`2;n>25i=3 X GF !TbT%5Lީx[h+F$1iݝhЧiFrtL3x CSa"49Z&I Y),JaW_)9i 0Sitl-}aSDLלMozjqꭕ\d#]CuJwB(B?ގ&ϜOfp̐h3A1N nw#PXJÂ<81A )sHHR(8]S,J +Apϕa==S:SB3T#!AR84r{h= 5r[52`EHdVD\0FøJŌ^to0d$: Q kDzejj<SՁ}U45xS "D2{0OMAk-F*~f>l Zƪ1`ar<Ԇth#0A="O4Eaড়+W8l`?R=!:bqPlূ28nU³)\lrt'xЮ:U>؜'ʉ@r  HԢry}l՚gzF{}%/҉ЉjauI (W'x`1fu>~@g?-G1z, }0 '7/v x bS%j"uKض%z=/Fh0!;l#!g%6xzI6s3I7&gP'{=>jfg!eнTR-ڕvb&fT;ztb*Pѿ(KL3x_9A73 ŞXnI&v7:EwW=@CaG'…p(׏f76*'`x @~)P`;A Bk)viةQ0з=<Cn&L8@FȾ>GJEǕMQ󇂢+b B#F_ ~4j@@4]ߝ8#A1P0 b0N c ZEj0p7E 8t8OK @^΀ND-P0 TpZwn+$00X |$? GҬT?T? Yqx0REpIʂԉP\ JTZF~%P0X@{K4K MH%@s>+V˰^lB8_߹ ՗zPR@0*5@f}7/6ZY@Ł29=R5ʀ?t1"pv'ק<Ӵu&lxĨE>!NtD&#x(> M==Bde^hDtG] 5.C(;9x*yp'S)5דDgޟ|>d 0m>UjOTy ]^!^{<עXWT KcPoIMr*bsșzBD8@`fqIk 8d1MogIp W>Pѽ\q΃j7i)O@\0Rth7BuXO"Rcs_ :ޞNpdNT~pg)&}4p>S#px-{nyTξ.ϡWlͬx_D/fzpp?DB< φ zDp~]6͝s>]<3Y9ӫgϊfns(@O8BU|3M?oizv4#=}6#z}?@+;i'&Ӣ4/f,{qKjZVDapkFɎ,r}6=d)rO_!"?z?tU|ҮPUF obX2BvasgwcV`.z"Ah.k=S Ӏ#7ithFN a Cݦ , kۆ0?`H"a>bA%aPh<)Ɯ>xh(ţJd_6b.JD/'{Ԓ!Uj*SZxٞEƁO8?`fa 8 O*z6o:,RJ1#M`tMf *S ^?:Ih)|#oL#<3= tFhd 1ުi/{ cq5ĚuHZ_gNO}Ht/&E'"W=<ᡘR c{v?q2;Pa Ã&^:ub?(5~`M@d^`&XO׆NN&h˚9t88jYZ8 q0BЋNͩ~1cp*SXtLL:F]6E$8qOVnbGjw4u Bg'-!>}ΚE_"GaPy^c&k&W8y<'O{9;zq;8|ExH4g?:՚ng]СELo] Ցvh[zy<>t^b,S,OI0rQ&lǬ eױWz7; 8d |J@ pO!aaX0O pb1o'm4tG]pUST@ .Bx@ `BDC BqAM~^Bp0@T"k<+Λ<3FA6}Ϝ/ T>@+~^4xS/6""5cN ad'{ C1$JV%EfV huW 4CAA&X0PB"@)0 D}|^ bPg[UaS ! e(Fp HEu0FG@!PWX~0[d<] Q?' @?mL C%C(()yZRY@ BP }W@K+& Ƥp6sU1_恶L"f2k|A!^^$~ P@TgL 8(VoSV?G&Ekǁ?NT3 _H {kᓑg_^*Q0SJ;p~ ܘIA8@_ tt~p*\}ܬ8Ei\uIh'8¯:"^ 8@V S4{L1"x.f>>xdvDp2r?tbjuO>/WHm\urj3p?}<p>?M<3IR;#-a(լ2O z9W50i.Nr]VZ73 Z )So"d-{] Ďsq]sG: d8pWǡx0 =  Sq8$ȃ;#(dxj'ΆCVsg'3ǹgTLJ:L<ώ-vG3deo YI^Z42 Y #sYYzOosXYofgTΝn낡W r,6(IAuF7)0X , a<:qS5&[0tD$s A> 8 `١` 0 UMzxQp8RqO !C T #/JVO*Q1s)d!ġ(`e[ѕ9@j#JBQU^U2)}(?(%L#-eŅN;M68>q"5@w'r8 ` Vg0_Q :z DDDWZG oa+b8=hgڊ9Tc[8_X9W3MͻřFhkp vjmd3  vݒNGmoA2<զ&PR' 7:cPv.!:d)#_R1uOH(.DN=%%M|hH";huN:x?7tZ 'c{Y0X<2E:6TH(,4jw š*n-RǞ=xmcJag?SB>ըG V̉|Za?y=gKSh{'9Uq`(8sc7NGx|N(ISNt.X)Njڣyu9* eh)-#X̉b03c!o8?R4_)p pRL63'T'g 8zJbfXϫBD#H?2L.*=U{*g3;F+?4'{(V#V=FE$ '?X B9;i"Axjȷ "nr '^"~ `lR5~"4ϖ)poY#9ɕ xӛĉY"R[z4ol1oU3Q Z5[0," r]pfA!)$@xYpYb\S}ncV*`aL  |_`B=]* xC f˂;تϤy `(AD x "#녂‡L!x z .~\]Wtx|گQHl=<h׉V=R A@<,'x9_1"Ia!ђjԍ@wp58xS(H+' @u @}~qh 0`;R 0Bja~Z梈 ' ϣXi@]RNIdAF*ۅWWt4?4;Fj"{4AW/*Apa}l3_TxBh*vdSF=7/'Npd0d[顣]F3kN2(H =?N=Ds;3 fRdp\ ꈕkɸ}Q(d㹏 WknohL4E 35CΡ2! %q3 p?L8ST~q&NO3o Wy؋dFqЍLYy \@-*o{-88[>wkپF7WM`~'ٳ?~88!>I}SuNmͱwvn9}%ϸ,ӣ\Xϼǣx{}8gINt={3*t obbbboۙ sՉ(J?.ƣTuAՈõh?pwg\G=s9GD*\$@Qmb+8Hf%pB A!v6H@HEbC {"I]lX! 5CRzE`ޠz {F")AB_/I}}tݷHFȗtڠd=.;s!VHGN ~8p$ :Tx,! GiM4ư-yYN Zw*tV4=X!W|džTf,o8C&.?p(0E#yQv K_3 >L&ǯFLxVpN0 G``^SvFXm⻏i1D>oWhb54# ~Ft' )ȿ{!ǑBӏ'&PL it<|8FW2C 7g0B*`*D\\@#)PdVbi]Jq'֙ HLD#^8~dF"^/{HEXS6E"p-|FN39} g͒H{fI?-#x BjHr:]JNIsĭ Y>ZG,{;"^#Ϩj;ﭝS"`^x8*p U1A.(GJ1^*W`jX"q|+97\>LG,UIq+rqpFB!RȠKq?|fk.9Đ`Ձėb=4ƆGE4>0QZLcԺRE)c+;^]TS ,(g=?V~ P '?`!Lɳ}BӢ@/WC;#gĐP~5\VN+31g~q7a)/N :3wt} dUp*ypfDx1^%M|>lw\xs^C̹=آ>&1$Gc<{}`Ģ$8րx0uj)`ʴ.S4  `?IyZ;iAL}+9ۂVA@_:u*率sb""/HiߝC#O ${!(~Q|~Ϳß6 PX*窝ZkOomJ$+˫Vm76#CpdNL2 QUJt2l3u H"{KW6%ނXuZ{.Bbx>za *-}ζBlAoNېԈl.\,pS| ß▁Y:jU8&Qy6J9C/ӳH޾_wc5fJ^Ѩe,8""%yOGUkDO B1ٵF>Y|ni'KNe]Mӂ6i0<ʕ@m YJy#BM{?Ŝm&zXfiOҮ`!zr?t**QW1! =\O T'28v+d/g7 \ xyy&?q9kBh8@i3/O'Zo\p^wep1&&Ggњ,jbx>#cxxg<vm8S38Og-0k&o S1Z}t}H%&~zgEg~>um\(IFi@(P#p*3M*ǢT]jxwN?><0~Rie*_ Q!e}T$*>eϣ0yguJEjwF_ qA@">2@Pac pS̻t*L(`ΆB2 zXqόK0X*ռ&TH.ɐA>.ߎ.|1Bz {bS?8pd j3VtUA?&+dCj}|tݠs)2a\ņ(Q0 y4\đ q I/QOppX膂0"@vFj?.`/` pz7#`DGv׮-`4~ 8`?딹^\!]2Մ0Ŀ M#|x ` |{f; 1 Њi_yYq{~WA)P8P B'0>C܉X"جV^?Zy<88psN $ u ŤB 8fWԮ٣-m-.x:s%q{9.gEc0\ .V0 DsU 9(ĿzB?b?EJ*Xh<0`ẁG,6xSG o v $cA*%%J1 z[HfN0g)/0ڜ?,ÿd^`Z8WXόxΉ#CFb!' 0B.|<dW{IO<< ~mFM]2|4yᗒ,rI~ @(3 i٢՟g? kB:QP@ITΝe1=SW<[{i x-ﳽְ:#zޚ%eT-A8F#P2Tw& ;AEC8j.3cO YpN*} *%TI(A77ip!ޥoW'iҶ67UݧxA;(o^xRt-vc{ĸ#'"TlIWÃ3&f;by t{8)5ʧrī Ӛ0"2x,4-1aSH~?/w|v'Aq$)( )i\ R~^T$pgU՝g>hJ}Ϋp@zP[uVX5 j rldkon9IM+:;; <M9(&,8ǂNCިL_}x{ZkGj#(AαY_q8qc$QiE3q=Rhqek ; Ao;ďM öHOTG4BR =a\k0F}9[c\Ʒ⬸{b1Mj2kXY0 q6a&ʽD'^o=o*S@3]Q`8!$uWa;>?6  |N,tici|ω#d>>eʋǦ %q)X0|}AC7A XخX .?:"<? `{|!&/6\S C@v-#%K#36432<ITp@$E d0L<{.S pB,|J\0J Uk@,՜$e:#@]n Q`& Dxd82#JF̆B0TBhCBZctK~t!AC3BP @ևY H~H3w @8~ΏjX!͊˗E VZpGy p!đ*x#r[ hHSGGa!`"X3IQG+||J?RhXL8'9 f2ƒ?ļ0YIAgN=<I8<3 .EN#`\_*U?'T9 h˥]oCH|@Ա;/y, Yx8?g5 ў"g5u|[rd3p̿ㄸ Aӓ s7!饈xH3R9s _ϧo 0%^5aW ž~l/6q~חi+[ݶs l{{^r/z  hF ˡ ߃0\7xʅ" 0;NiY;yٰ`}(C+|+0@`j" //*W'\ٹ0?1~1C:c3'xfayZG C/;tTdaᒹ撸dF Y\!,O*= S+UZ6tGc`Jh!A:(Ti[63}\[Lh*9mX=` Șkp]>:lPY 55xV=]pi%MhkD}hOO\C#/)<_?$xsxԢA|GQ~B2_(>pcqwsBΐ*Y l2EWIUU.PuiSd #  A8z a:|WN.$3''uQ.'r=f9.5N!yaHdPLiO:{3kuU"gwMݯ'MѨbΑf9z|/1:pj5.ƲAA}. +b p0e? p0 C5S|ѵ3;W$ O\6oӒ:~w}o'򯃃d?D^h,>J pL8~z=Sa*ƞv:^T<%` 80`CFAx )?M@pwx(i"kx(a8_o#STϽIt^P\=˞ @C6Jޕmzf}<3{"=N1R01BMV!3USH^> zcrjįt5< yO'쇩Oի6 x0 zH?E@ ! `dTF^c=Qx!ު8#~/WpWBq" JvyZnZfPPV */e2GNq4ܟk`°\5pd/x3eUz69%At8`8AΆO3{4uQ ~"O>uT{(7{dTeڈ/LvF.M@{ >,DlQhpmU[|p(! "PAW?cpE@m@Jv5hdPH#R]*\9(JT_K=d+ |h>@f  (22zxd#&7jw~Bt:;gJ:A 縎X8}}A(eW qLP0|p\7If}ӡxdAS+9*;8I8 [ܚU/ Lno-l3܄838MKף@V8@,Hz}P@ncZ2ADT TlBd.A@S枢Ti]+Nwk~ %p< 7:(˦rgIAonݼn+4JFOB;7aLAX>٠+h]ڦKAG*HUs2`0"RbP/>_7OQ.^HT$1|ʠ󽺹ʮ>*@cnT]+Up3]JD}G?AxJOnFr7ߣj `L, 4~ p0P0Q"KB.8$hFJ]Wmpo'bQBvq8&>CV HP 0$㷪 `aMJhl2}|9 A<dUD'EI*itvHb`H µT*AxВ%P1$ۘk8+S?+X:O|Gdtթpkp?J*^XSE||/UZo:y_ 4:?W- 3C4bc&8d>ᗞN?IѪ<뜗>$9MO6rᘋ)Vp٦҃z%sWeBl ޣ@#˟A&{. x^?VapUF6f_5b8d{55O '959DB7=xsY^4jڶxf3O9o \9pA#`ABc|0:\9@@r.DSǼef^'z%8A # BZa%P!'0w hoWw^S Ufe@+342O gFns;/)z-8g(K֜=<P 8 (z":BXy&D| ޮep3Lk;EA2*j>yq2+}{ [ C60fiowtiv@ xf'X8'X8W$'}9h֟D6}c!'khXHz?Y%6?*)9s:-8$ 0aX8@yf*VG< B.%AB 8(xBUV2{V/՘ moEBtmqpDNNvMQ2$~ `( 6#] ?a )f?p L‘w/C8sk j.W{JVw+8 `j]z}Zt10s= ; Hjǀ5V j)&~0|J !hcp>?ݷdPi(%Sk:pA./ 0@ P@X0>{Ŀj '+h\ I!Eso3?F օ oB85k2*۔z-Ie"Tq>nnhNDOWe42>Ot3 x߭/P}^9<ԭO \R BV p,w ?7Ig#xn4U1^3joe;?eXEko{xѿa6ܢOO ~$A$OJDJugX~g\t*n a5@u@1KD X0!ST %. 5a%cTU\,bjƍ<)+?8px8r9%{iOJ!%]^Ҙ[)) p(Yy_w' ›۠" 0@ x!(  `$ \$ j=x<nP+>/AT?&<Ȏ~T<lj~߻U "͸0@3C:U;p3}s%w⼼~K'=!p -"VlӫO4Jm^ozlc`*yj_>:FOw RgNH}Nt: N]-\V@Vxp!: (hh0_BFEKe: S%"F/Ƃ? ?u^! _!`WZ͌`Y`A)0+,xcF(HDigsϯ ON5s;. pd0S_/6Cd%7y @<\@*[xfA7@!qD)q\La 2 p Uh] s/ p$1#<_@?1DTWYFjV '%Lqgo}onD^j*luaτ7G0KGQ;*u,H) Xψ?<0@ߗ4I.?"*šT !3W{+D:C1$`t3 x0`4`x8TD˓K:n:@oakt=X-2d&BSW7O> zI.MՃ{M@Ӎ;?7"&}@zH#QhV 3G)p?#gL |7w:>#{i_0ݴfE㸜]'nC. 5H# Vog`w3KdVĠ)teGZzFt(8_>}{`M}[5gNwi.as޾-&Cnx*e{W h0"%NOO iCTtӠ!!ko70oF_*u82:lV)eF>瀼>ߠnDv%x~Z\S1b@GV<曹U+/T\"Q'@![ pEꄥeU\T3<WjϸP կ^9πBK26j|c=\ DtD m p`ĵ@V%`&]PڪLQ EqЦЖשNP_X.:2b$#) `<,@\ * @ H UG]|xXȁx~a Xˇ|"%rL$:#0Ra("`U.V.B󮛰t{M\6G֜"`|8 |͉尴ڟ?C?ԶYd{g7+6&eI6e ul:ɘ*<\f\J̆I׆i C_ϒ?||$0-S4Jm<%E \%p8JC{|(cQ5Z@BGX[q&$>[7 5pC2&Zs tTp=@>+U!{MCm5BS*Fv|N38#K1z.U􆽶7p)I@8 +O @>Hýѧ 4n6Һ_%i;2C/a :;|#CWO=v( *Nf”;c?S x!ss3p 3ڰa/`e1oNyA>Ir!!< xx0?z ECjK\ټϺNvq#d;Qg(F`y{,VpwU](0rq-(!v| ݧM4z{,RNʩ]mq{NusG^o7۷As@peR)`F BZġ \|P^N@6ӳ"{#K̪Z'N#k&%, x@*N0aQ/N`B?cv*{_G>*TnK՛ nv7`+ qk@ B7:tj1EMt~B80 q%`\%ᚧ }0)\#{>dC'[0Cפּ;.=sd 5-7ddC!T wIu 19?\S/a4GN S{bw ",ہĂ?J$i$LVS2eW,S_2P<<%{%dUOzUJ'g)V2NN%ê]ʄ\?Ne=^.$ 7=ۧt)q!*)&ᑤV=0f3g8[Kxh t04U*ghh;T0x4p&sRr>"rz@>P 0:ty{82HK>ǐtaԤ N^_t_>9 hkLNe#>f>4"b"W\"Y+` >:{Έ [4N}/HGAqMPJ.?hFƷcR\'waNy6_#'S\l R/w 8GZyʤ p|kG*HHx,ory:U@F3_BX3zxf<2QV:?Q֓XE)]žW߬k_^#B?Xc:+ ?N򑅔קԥ?}՟:SL&8F=ݼ3WRЩ?"1ypɼXfϛ*gg3]ά{qyu3WgFC9b2>)J<^~8`Mp}?} &v_l1u?*e>+)H-vR[PRPRYUxv~i|(X|p&$Q-Eʫ@0>D@%0  7g!֠>BeY_4DH)  00 @`;0} ` [G"!orC%y~PMG{ޓ8h*<@p8_LAjG*Ĩ;weJ6 XRNt)>Z3é<xf$2SfQi>w?ʇ!UL p0$h0?F  @;4 [T\/QDCe./slRbPuY8%s跟:%Iy f~? X 2muoP"U *e UUxx42ԫjm~\3FZ`?7݊v0 ppKsƌFelLyJJĚ^ .* (.T ?H܈be _$z*~D1pBx<³J^\ixb?Kիxx h `t`K$ 34dD)7aӸ/[}ep*,xk^lt7"4qɬb;i)B@ *\\>Cˬ-8 (m@8!PЕ%ORX2`\]0!pJk{Sі`SA#`}c~Cʬxf#g8 z$>qy&p2 &zTTwt jb$qƷĮ}z@*nrh+#O=Cnq' R1p'jFaM dNSwO8kᗏ#ec4,xfF3N>Xpirq}r_ku&DŽ/Oꣅ]o{> O[ܶ<3!B58@t8o*;>}+88瞈+:(y9{Nx4ɋ׉*0)q&A U^z1߯/߰ =mUv F,04887toxSa? Qo{3`#a&ryB?L;nmi\ۻА'RHd *0HG#ǝi zLq,X{T9ZPHeaYֳv+W:P ;~Ǯ+,,(-Yb|CjMGo~>j!L \U0G_h0@wT^d%y 0T,J0DԗttaӄA{@`d$|_ЁB| a'28q<2N8|Dt$or=?BHx8gDejʕT#Eh)mdb] l uF-Gj5u0̜Fmd4\C/jan5_ƧD'>=G <:9GZsyxə}j~TST6+$L@;J[wwI^Ohy4XU"1 @!L`}}<]I LۉbAі>FH'Bӌ5[9Im1#ď}w i?8h ,ׇSGLN2 k Q/fSAObmmJx|^%/~cO)UΫ$!bكQ ~}l\hu4i{$Dnެ@X0q\.3xu #~`XW[ǝeBѐQ[Ds::=\W%*"*Z hf^>SrFw,Nv Ձ rx35E$/ƳUuxh)E|zTƓꋁw#LܾaA|>[-eY5p1+19R1od Yx<"H;?gG8f\J-/%CtsvgHgW~:T}—{4/16uS5-3ȷ*d׾X˦p0&TgZB.QK_@ܿ$ n x %܏SǔQ悢 `U;@dJV4J/D~x ]O@$% HsUXWv7 QA)Uc\l==,>vՎﱓvM0YɁH3pS@$az W`:SP+%Cj  m0${x=0#ْT`8PV 7ǜ?TF d6 O(^ꎏQzvnTn 3 &UOpº|Ea~ΆXdSOɐb7 (  `0 80%C.:œ<pB..@/8#U(?/9'; x! ~*lp2,P`A@=P% Xxk v ^mOxgeʦ.PAQ9&w QBsg (`<T 0>@:+E킃㫃!$JSUG.y0 ~| 7x~GWRV<]qIyyv/#A8Mr+ 7(8s8BUD^% bCjl``D GPJ3fFGC{)0`>Z/`A*AxEۓ$՟pS@|:O5mFl*=ʎ:G»N_Opd1~ F4;* lhͩ`0>Qr.X?$ OĀ`Y*/yro8JUwu՜ TWFAE:_C 9 P`6AA Qʈi'Js!c!C@ OXXdu}x8e$B`K OVx 1A ܮhH03i ަc[I=]Py0]$>zL2?~%@ы[;7;GRE+d0|O Օ8F fM(Gё05:#'`0U61`M)l3 YwX^#|-vRa #\4%,Q"X%q.*ǘ73s7sl2 mg焙n p}ZFhQsAs DAA»Vicތ+e06;ݶz(5Eieb{/C xĝmPFX6L!t׍{kfo75vݷ=0H8g2A!zROu< CC17jF#T(UX9+< *|e!>L.@Td/O$ 1UGD QdT4+s4sxS?QM:"V; I%7K搃 >R_|W%D"7/!QSR\ԋ=EXzF湥 "M qJ-Z_O}u[M+IbTq\e9X_TUQoߥfC QaU@ceT}2e7&lE]cOm5GL|)@K ˥xx>`*=Lp~^"8z2*u٤_TqJ|W=H=~w<,H=2#F^ TT$/Jডiৄ*و&;7jE͝zWDbH>d@ROdm,2\>Ge o:pTMi '(G1l|xdPzd> I hV,@0u':VdUaV*`@_TUf=uMkJ4[ڛVoOnljx%MmR7tX!RJc b]:2(8Sԗ2/<󂞫:jboF޻}#/Nt8@0/S%ڵ;hg=ǽ?rJ.T&G$a9SSᨕQFمs_fH~tg0z𧫘Ζ=_(|! ![{'kb)d,V0KY^u3|aB|d`$HQ1IӵF NOp/ܺAc&Ʃ nl3s=>`P5g _'3 wk㟼uz繞B<%SG@^l:79 adtk RJ.g`9d;3,[)F1CmSM=KT%JQlK_C)UĂ4X8 j@8@9e~ B `}D2 @A VO e^ N mSƀ}j> <(?qc0_W%;@])&UTH3>.cOpJ z`3h06 (0 %\_,N).dG H]+@g !70j /y8 P =z*$ej ywQ4:`h0^xA?@C./? }6@7HS 1 L$d8R@n(J‴3 t> ĽS8hS @`}b?B,lj+@8@(2g`V)-@,#'{V7#M= -C  y|ufӎ}={(L>„<ς(`;A ̀y 6|<!BBj-WlP, h0(0" ix)`8XPIxO@ ]F j 44Xz,3>DŽONF)N)\?'S _s߱TmYп W? *Kl ѪԡW6) u̿ fq+X( *royq`B@W'էc_(X: D#w8+/Nyٽ]'7<)4d0EU6a 2a `qL>ѻՂJG2>dܸpH^a`X`[^O'H( /Z`<`B *X^> (0 @t|%*wCWTo7F}us(Az7omK.Ϗ'nhIOX(/-m|#`@+hn ^PpUߍ7 T(~_mS[FdJskM:ؙ>ۅazO|֚+iZ[@GBb=A/_{ }Q[2(|Ҁ`ADZ1%hfANЕ3 OTn>]jxhuOZÄx@LUշCOE[ fMr#_n5v|g秕OOeBhPBSQ#.Vcĥ@q++։x@,Hp tj<P:ke$qsb.u> Gl2 U0}mݧPB4O27HkNa톆4=X9_{d /\>hf;NOV>$= cK|4X\?7fg䔉?Fu'OܤbLhB8 ƁJOx'Tbyja{>q_8= ?F|=OU4;Iq|;gCcOJ"t() 8+?*w]A!@`,$~(A |З(1jŔ;SWuP)P0?*Չ@mU"*<o0$X0!\ja?b <\hc\tdž>3&)oA%\3( %Eн\+>22@#  C') P} 9-t+)#H3&Za珍 ޯpA82: 1+ME@IQ,#9xSc0`Dz%|j}`j~C y czyTDWT£0`|z_XT5w((^\.f74?B3g(3 v$qT @301$ !WRp@.V%!z%Vq]<yL8p(CAhFa>bc'b-p* V@؋Ež\ tg $X҅4+p)㑒D8dEAqzL42S)%E1|,>q#G@`}x!Us $^?~5d Ct`!0 1A,ʚ.L4mXJ'r <~ 22WI}Q#6$04TyF" uէ֌O6Spd+%Obᛆ=麈 2 `P0Hߊ03@xC J2* ] X=B΍W՗k{T i͈6mPΝP!6XIt{v^ϡk&Q'I(d[tɣ*A5e&{VI}&S>N) ,wXW74_`̔(+ZV(u U0_u#8lWuFʶ?ĺ$/c ʄg_ Vwͭ$nHvM -G)_x0@U‰CP]C4QUbV:R$%/@C$7I ”xdz`)TiH8ʕU J6 d0A!X>\@KWR ُ8akͽizzJ}S3 ~{ Ã߿֙d;QgU ˜j b肇5U$m՚:5b?IV 䡘h2 qГM +$b"v,XBa *\"0q\j6#Jy L\M+sͼl׷2q$:P%HbN,~'&aR@h,,Fa?@I50gumqRztDZ#J[cc3#=%:;ca5#'cp<BL9Oԡn3"*#5$2-tMl%OUqpϱҦPS ?#0mDHNNv S풑N1pU!OYgjJP܅2ž*/ |QxH wf&\<'Ikla[}F?ZjgB3КƩi77>q@>j!Ibzh=?'3EȌA~NRMcSJl&&O݉̉u "mGRgixh]m]D3( m̷p%1c8ҭ@c?˃AGRg^q)gr&r$0_.`WEs>$v8sxisn0WOLuˠ!&#l`ҶeNg@YgY0po #g,:u6v)3 [ N53#U :GƀAV/Tp @?EhtHNJNJR!$J*PM  !Ypqu@P`T، XbĀ"k˾~HwMNVm=8ŎMO-C3> <3O d`sb<88?S @߰x;:;px $G* AEP0J `)u^V}U,eGeU)T? Hk%  v ^fX̪:6 0`B !]#_ ğON P(VD˄c p8@c_c8LΩ JZ:>pMl|l8>:y z*/ 3,Uf}A%N@v zR qh°ޯM+E 0R0U`7$  ~*8%0`~ H??aQD2y_]1Fh)+T%z]Z**.z "}@%[ܦ՘SjKdyWLjFtjNYxwѠSj+JZL`  80_@=O`9?3z>Q&ž`3zL~~=\yOt0iX8@_RH͐DEꪊHgB@, x UWk|30<]`9B0 pBpت{P:(%:*ϫ> \| Q t׵L( !* cѩlfRJrQB_ EƓ4񣎈y9^h=]aOxL;f=ŤOJ$ul2S3yb=ԍIyN|qܟJ )?xxd+e.˸L<)8zG"UE" ) +7h4!M!׍8yt?wzv&S"B[IglO'QjAnr_:kó 8@`2\'}ѽVoޫgڪ$=;kz6Nk4<ݧ u" KQ;*15i;EXw7`wda``XWTFRC 0 _&_o+OFwg4f`@DuC4ݻF@OkKPMwxJq# "ƧWA=wvl&6#IGF\xr$\EnJ;&Lg`tl3v sntOi8snmA+hYwm׳qaP*UCxm)0  TN)B4_8kJH`+ yi``XS'lAzpSˀ*S|}(/%pSJZgjc#00E>qZ#)A 1[kf-7(zH;{| X8@F ᚹ)KCsx#z;?h#)5\ePfuP)]-F! $ tߵm#\>2 @' V%<Lܻ愨?贺'<#Z /vKPR`!+ +A$"?>SGTV [s%Yz>Sh]{w1#>m|Fpc>jA\uMX0d''Y:q=BNJ5V={8"KFiN(",&[6 &V&pSUb44f4mAXfC0 /|>+T.\0e~j5 Fzʫ0tT4 S*Džя(V_E[cU,{$j;{Q0}M: 0'MT@..O|XףV"̸?`ġܸ<9&CC1s>%"(G"D y Fj]+ֺ'gjX8SĩqTjC4`C#*h`|0MO% 0EϹ88;tRci7[N!* _ :9ũM |l &>?SZX26 ϵMeBm(* fǐޏF`a?2kIu3'HqaVe',Ohz;&I~@O|;'O8V`-C)q#h%!8lˢ WD=g gohf߱bc|S YH&,*M)%m#Z#+py ?K ̫@gu D(R5),{B ,X,|]T=SGC. _ u^%*5J'A\P9_{4a m_t^^*&7(C")>5jDخ8pPdHyz t T2$cug7SV4.  G:!K F%p_+W:pGBXH KER1B p$w)U} `8 ?T@H"aL KJJ?(pd rBOixMG?W& dKyYӀ_#˧8DŽt?`.x]? BX8"Bi S&, kzf@͆޲M(8@JE,jtqx`~ >9f 4#NY `?n[m  ĀB!y6~3'&5Xeݍz% z% T2jauC"3x8p]SDZxFǿޑ@Ȼvpq:"2!.VF_wC<95p#M[+ *x8\pQАwǒS!OV}gN/8Qo.='xSj|w pC ǀwWyH6]88ׅ7wqU("}AǿqA)uUDJ PLHa?!nxs焯Lz9ЦL<گíh V Yp0"JC!O7,2'Qn6%TLqwp8YέG(w L2} }"սuXuͦyz8,pCJBgAH tF %^%+<T0 h`|5td&0*((܂ i79 x|4,#=<}qcE1w5564p?/" .? '63 ΢)[SΜ{/Sg'7ͼl)Pxx{+0#g!Ttj"=Q`Dip2 \G9ޓ>Dj%p?(9(YN4Ou(vP!2賣W3{Yo{[_2pdp(} 2@J VM+3>'jq3O-ӵm"+ {w;N"' jdEU!CFUqxqXۦovTLnwf&2g<)(p,Կ4+ `^<0mVNy@q)~2 wt.kDɄ~xQDMD\ @zG"%:@BT BׯO~.1T'c[GK*ATCNEldiNIRI$H'5GƙOA辅/4y|*LNI8/BųͣԈG05Sa`\8@BA>D$=6]r2b2%%R@-3l(SGX2:= ܷNpj8{4F FUِAĠP{;W˕+0>b@9ӆ0JcsDaW߀PQ  T:O5R,ZtI}Jdڱ*,wS   +~wǠ6Cl dHWp˚'D!  !Ts}M9i#H՜M:3G C͟zH:x򹿟OYzp8a%W>GN 8 f,f_oɚ0LA|>({m%.ǵRU| ?x|k8/-px.S|VfSb 8Ld!SѬR L'B*ĚpDX+<LwIeO"\!$#}>>($b5WPp>J^|Okr<uO0͹!(Ku.i&(H!I/ ~ 8@C߉f?j|13uSsxhp~_SiS a(oyPM**>"n>q7H}QQ8҇@Vq0p<)2c >F-g|%MO?W 9$Q^ V py>P1Icɇ G8i?<+;KcdȤjqf'SNIg}{sELx-oo}qz8TMDn^|8@%;TM:*;C7Aݷ XK:O1_!=}Z,s-_=<֪s&FB^^#9ۛW$:!{۶Nst&?P0(Y35z5[x;* p xys !tڑ`qmDꗏ=N?KOx9m;)>b E{t->"`i#6؂+0{MA=]`.νK$L s/ EW;0Q;ӌ*J}ldf:թXdKDaH ߪش(}4d^_$(V t QKcXZm?BH;3aN~L} ypm}) ^BB$L- p1Q';$ߨ$GdQPlj^9WM*N%3:3(OAWd Eo'R {khv)x0 RQ(GttBtąHSKWl@.SQ*WwC WVEy}Xd#B1nKcFFUFͫ s1A#ߧ_F$B{o^A0*-̷F|P!.Ag]5'i4JIɛMVŢȝʔX_a0߉TZKopb#CHc@*N%ОO V#\?{PFؤ.Uj0O<%dR'.<2)^*kO>~2.e$URSbRU(d@ EOpyxwm4p@_!NgV=agG:>qeи<OQ}< j^ȱ|z l# Dg|{ŠZB͋ЦŴ8\'ՎDkC=Jx03$êŃ^6Ne'xσK(#jd8Mq .x'\h@ΨC6q,hs F3NuR( E yMCÜGrp)>?{[~ayU4Vw n O+l%q?Tk83 {,}yf/:0]1Y3@i:-Z6a^=XQ?oprB0雏aC! D =W!RcߞLА r m"_Č/T\QX}@h%Ǖ|߫++ǧ.gX;E! +T|J#x <]>3kHN<)?K} T$ %˿8NjҦ 0 =PhEqw_䬓xSHT03?fЦA*<*Q%s ̞LA?.TiUpڥ@}T{fuwqbXByFUjG;y]M_ x!tf0$ *-ZuAc>} 5BXmHH[僸|K%DcS?J ȳfS59GU0p?1}i\~<@P Omʍ 9:\.?pմi.5B3o eNZ3 ,g@|(>>=bp A/e?B4.OzSOp?/om*yyp>,^yeMC0pP?P3o o3O w%ZP8KTv T!:0x +3 RˊO}>Fo dWE'L/oV$x_a*6C^%,y'\axerxe!>L~}~{8dUӁN 1*x /UfT<*< cp3 .6%V?{ǟEoz}{E8xd*Eό*""t  7g vBc~>z&%k{Y0g8}i8`8(~H{Mwzl3L!:pL`qf ;mg54?HH"gj{jC{ヘ186@1_V;nj *0lbprxP!{X"a?= gT%r(F3PiQsO#a8UQ;XKwM;!8=Z*~ ~&-6}YNJ84?aaAa_`XPW*$ œ:v}_~!7B1,dynVm_}驞QH:?L6W[ou;_pm 5Bw1ǜF$Ŀ!ΟA@ `DyxYwpx:X`}xI3x6a hmN9CϸCl4܊:q+,,,)#8#KND%M~#$>D<\%שY0 Zh8ܼ#92ȑn=`qŠ8@B=88؏qZ XC0r}p󌊷pj$,3p!4{tX84^yeΧ"{DOm St28PvsV P122;'yйN &p<)Cz^"'ythد>G U{^ޒ0Qp@(-4 όC46BƈcN ETBsCGfÃ. 2`g!y#ܞBd"3? 2&TuU[;Ф)5jc_Y%+.R`ƒ~(ԊHLA`!*BYSQ~ڵRΫ>va8@Fe=dSZF# 9GDXSo𸺶?E@@gE_.5oB/=h@, L?&fpR,36L(}$4uǚD^N~આ7MpW:OIS% hWaJHtG6x*ڰX3I, >Ys,X3/% >#H3@x:;saOSDv_JtY1Ga_`LE:?'  D>>.9ۉ`.Ox4*%O1s)!Ѣ듢{nqL%3̶.{=γӏg/xse;T(=; ?O/k_pGE=[F*֌r Kg0k;V1gBza;_:k^}MW T-pAgNQzӗ&)X  p~l -E>Rc*|ʠCT/֜0BP? JIzq@it}<(խpQUT2|{'N y}&^Hـ;]+U5/WJ'=Z:z=Qœ%^`b]z? %h_Nĺp_tL`}=L,xA @1L?m_ v4I E}^`wA}D)@}p`W=UT}w_˷RDzeY2{7`8H[ϵΚ.:Ov4EoJ7 ~Bc?S`8fx8~/8фzxխ*>V5V@-*8\/OCp8_MSlaQ +ߟ<31@JC|įz1o \"3 ɂ9<)wx P mZ=xXdOhW{ʚ9m4U}3v/Oï_H;ѨaLA:r gg:;q#L6œ_U)HG8`J³"n I[1ЦyJD!0_j L ;T]8\\=zxfIip?:$&Oz̽yu#a5:$|dI^9ˀ/pf#6<ӔvItX2r8@NS: I̬ArN.˜ȴh?lSMS1%jǿM;q94<}9?Aף?.PIWAWuEϦ*F7ї$ "5*zfˢ FafC(ђHu )ݪ{(oy&h$$EzoCVB F(c ~/F4Lx8@G ZWU ڽXt5;ܯHum%y~H)ꉡboswiᥙ}=-nk˪^v&*1 I9;™ g'Yx+U ]Xrk`TwM۫әf-ç,r2Q'+?d Ձ yGLC]lǒ.5$m/7 5}K W9XO3 yīn/ (<v<)Xؼ j%{P:2?WGRvh0>_pʄ(C@U"ޠPU3|Vt7FDs E/%`5Ga#?z5bp@Dih^+w 6S~xO~l āvq8_M@4~>XLU뱲O`zJ_4p3SS~JOpeA|P*z?ArW3M{k/?a) <ġ:4\jƀZ`.#c {ip*e\X%6 j3(|X!?X(~~AU+}Tװ8't3EйQp/.z=ekP<ŹF/B>ZRX,{Gb ܏-?Ufj_OPfC1UI'ԃ2! {YY, IR|^/ 8n_9L1F'rLxez-<ޝXLiȪ-E**|)*J#~Tp~ 441! >0@cQb됞M s@ҡhs+J=j3j:A`J}<]@$/+)CSɝLP|Z!ٍV~ ؒͅoF|ÎցV#i-O j=^E.d{Kq~'}:]0ߏ TҦq錴>H(g8|{ѦCk54ILde0P^~.:%<eu xLsTKXN>Qi {3z r'%ԑx=V xD:|Sz#|uNum@xIpj #@p x,޼) > ٍT2/L8a0 4ӿR4^׫|iH3`'wGS}8t:#g~Prtc 3N 8}$~hs8ʉ@˜mog`N9$*4UX^2Z~ :e0`'xg@;YKS&8@L Ux{cTl]N=?b`s@@_@@?4 9 a|1h)ywŏ!%` <b@T%-Kp~ CP2D=XAx)<%`QD!x0xz`~z,~%t@/u $< 0`@+UO~탢93e@T 0AA}M%ςAD94\D-p`:A-` `<0IQzR\z^;/ A/?p \/Dl$\Kh?( x!X0x@y /V#|IPb@q8@ / /X\]LK^ ͗Xmy`g>  p 0= cԛx` GD 00y B'D24I+`^| ZbS> )`F,ms 0x Rv&  حYp _TGGWmD%P0>Dd! pC@xK4 COP 0`r9U /@@^hI?D_ @%d 0@r9O!oBzr9VJ=P0`~hso9΃ Ŗ`xIVYr Ap0q?-W@p>%*x (*' E0K=OPqW_fXë_U ] 8bQ(3|H0 /UEs%+ۗCX$PPBA/` /pz-,.TK/Blp^(JlGQ&`4!% K`E$1-]VG!:7;f0`޺P s e]@`}2Ud$KU 5T^Ԩ8O<~򺺵3K@A7 (0%!#͹zCU! `HEPq$!I-zJNA^UY",n 20Ļ!ʕ||69XnUA0WXz~T‰wp~\_)x0H vJbI.J(~[$M{Pз| 0@`;80>, 0>Tu!~ 0P 0V?K`+(.Dr] `Az-3ջZXK4KV_vb&l@ 0iXuA9DF@~)x$0_S@ ` ` 4@`80@y( n] Jacx0T!uOu0>JV%1A@K\$(@`/.bPA y~=F$p`;ߢR@W/HxC𖽁tIp 0BHEﴮ) ( BHV w?o/K T[`{9(I= BNreK 4ғ!Ղ0!vA!V=n@q@ >T /H0!AGfN8 hw!*]>5 ƀy*l@w/A$ +a@0u+!Ujr@qrW]G ~:>P @\m8tTP`~'qBkİ @y1gKx-PRFj0 =lS,a Y~ 0B hA^/V ?6_\`:K`A|0J )P>`=RJ"X& 0&Հj,=*T MzD ~A $ˋ}X1 ?\ `p`9>Bׯd zT^2,V*^]?`B>1?P0˂^*8 (7V~0{ BϧM3: _@`w%  =p`9`4KT]GHc ԁnu+}%^$OyO|! U=J@?T_GV$.`D =k ?5S@ Xv- g` `8А?(P݄WZX W: 0 x`z+&l*!˯AX 04KV12G2? rJQaEC`Hy !R3T h0`,@{8 EqEYz!4p`|%`}\1^^&qxjm5a p`9U_*!<: 0˔ՅNDf |#^\>/tBO0{  ߗ =Tˁ`(I§}0E^>QR9x0`˾ pWaD0w(C`0! Վyq>/.(!Eĥ|B: uF`~\S&o+B`w8$Qt_P8o~Pd O]kՆp2$ h0BA]!u80@%0 0caH.#@v ؖ>ωU^=>]PM# 0@CI.=H% BP0JJ0!B-R+5 _?Ɵ~H$f+|+Z4|~dἠ`CGR>^_P%>.0;)/lk@d `w pC*C pEKA.. @|t;V`J02.g߇הpN]*5Yx0_bW\@$H@3`B_-(I~00I#3xTh A p`B .]t ?P\]T;R 0%$! {sj8 CcCM+u`Aϗ)Vs0 PX$U@t[}r P03$~  IpGbR \ ǻZN`+tfwjVn p0!;o j`<|I"]`BX 0 )G  a `0v \?/U"@=r0`w@J7 =CRbP Q`}E垢$+WC`DPØK2^ERI|Wd҈0,.p /bL![3>?x{X$`E~m} j Ͱ`+ h,:<rgz0@r?]_ ;Q`<Ā`<=%S c9/&|P ot>LI@, J`} v=abH01Yp0!tKUE0 ~]@8K#EƐ P j? ˀ7AS;f``,H+/!-W/7VP0#%SOxG he?6 _mT$uYG큘 Ayp B|?UZXf?eT` /!}0x!Q)@A0 6*#X"/`A0 ةRs{߃&0-OGς$'PQ( H *RX> UEJǵJA*:%E/t?2 V Cz Y0QcvVr h00|% #GȔTTe~9V%Q$ : ~:.T/ ~z8? HWA各1 I/ `~U!Ay%(z\ +.n``8 CB_<]GQ7A v0>̉U2 CP0 `A/YA` B_SQˢs 0wr7> [b ˂QP!KUp`; %$W0t@x~D=v=CQfsH"` 8U,=D`9 $%%T\ Z$} x k85AP! *8!/oI 0^/A5R`w˻z*ǀ UAzIT^ r@"|!(`<$;cCA//"`rRP I = R%B]/ U'.`Ŀ(ۺ2}0?NEƥ#4|>Z`{KJ I 5m`K<`܋pؖfy]> h<V@BVw! m x0@:5}Pr7_2 0B ^q(K+m\fdIxXSJ"PA'3)Z\ G_5U+|#8`? h0CzqR m*+U"k~^6`@ P`V+.TKJvx0V<`Á0; e K)p 'Һ|`94K }ߩP+I3 K@T_<`? I x$+V> 2?U,I4Kkj\`s4HCpALڠUp0<y/,R7<ы K,}@µ"0!˺p0`9<PO䔻R ? ||$< ?TDe1p0`/A k0ʾ%]{u `9_RĄVy+V$<_sH!}=TB}!+=įWNl1+\^%)Μ~ Ȗ 'P i`G`:>V˂0?_V )!`<J}t0 x(K 4B!zy_&% |%>/S|<`90,H`*reâ~`~((O`x}ldPߏDHz?Rـωs )UԆaA ߉ UB94Fp H   ` (H$a xJUx?< qH=X0! T_A+xppAj>|0`h0E@0/}k{0 %#2R?.+H0wC& q, yp0A |\V.A_>%jR^A |x h(u`t<%t8Yx0uA@}_{@` a$JP>K!( A}ݱ =I J<>ˋFj` 0`y~!!-PC˄{`QׂHD azFCtǕ 0 U4ԁ.<#_?lMr6 0? |F|P!+S +00"*OT^Hcx";'w  EB,HaAʬ e+/ zeV `0!`A tTʼ=]AcQ X `y߅(@/ʁHP!+T|!+pՉJ@~x0A}[J4r !X0pp`<pQ+J0`8W I/߁s` BGh$0[~ @TJTG6tȐ 0Yx0?pJ7rX0r`G5br`5EA RO4 v`jgf%sIv$BVk=3h Pp!ed4Auw@*F8(;``~APa ĀsAHFDf_ԫa\2*TAx|$a JrZ|xJ92J C|PO/`H)I!$!}Qq`fWqбTeK0t<]Q<@ɁK!E`]P#.`~Xo#HORP K~Z p0}7Yc}1 AU^Ająj˽@uVTi`B%o'a9%?^A | |dN@N\p``0~H\?0[1Ah!,y[Sj_.~~Tbp>(` O+G" 0CEޚ1es  vh _x~]1@6 `0 |_@ ˁDxPJ8y'4`!DY砕ap:ﻶ4VUѠ0>8w@~3dp?˽bc (l<R,>( N$ 0E?f &<@8!\ >Py 0BALp"Bgx y:$+ p B/ 0 =,`@Q:˕!.gf^! 0%yH*FW$d G4oX> H0~x |v=J]@ h0OUyC`~A0! :Bc/q ;B.r?` Cm  HB[ev0+/{MX0 yF}()T~"t!EiD?~  eQ !e]c?F QJA8w`y2 p .ġ7ZZx> oX=QHDx|$+ś/00=u)(^ P(Nt!@hK[P?V皯Իb@!Z\?4aIL/V>?>@@C+<D: {E2@\$ C:T]=G0`9 } Kx"o8#"LY`! H ObP+>A9J!B Ġ`(8p  &x0! X8 =Zt!s9#@@ <jD8T =lRNj P }Y<T\ )"Z~`mǓ$%T=/V 4>  |D2!:%!a70AFL !ⱈ0`<\ s?,$AR*Ax:%AxJOpBV hIGUbp>|N=cXPPzFG 0*? _eq(H.! 0/ \h x$.U.HE`C&yP| 9hlxeƌ 0yr x~oF x ^P ?߃$B , saĂh58 y/tH8*/1BAT% OG@lGVYH μx~/pK]X, P`:>@"DnT 0 2(o cĠ`A@qJ :> x0w"fS@ B0@Jc#_= `˄zbW$ +`0! G`Տ rB0BX30`@1Zgl)P0 ?w [``Bxzԇg`<U@Z Ǟ2u@hAW \vpv %Չ9vFL @r Pa l"P0xP^]>S  $.4!$!h`@0`<@=T` z ? JVxW@ H0=p~ȫ x]O>㮓i}¾Sj0wāێ ;0bKܣQ`A :%P|0K?Jʠ(XUEK=p.> jƠY0&i@˝j/&)0 (cjY> ρ01d qHmA4Ew xh/t2h<+@5pE> @{p ƟM\&%u`0*v(HC ] jI <( Qu@p`B<~јx< 0K+/#C`=Kt0!\~ pU/*R.xIR%kW` ` @0 ߗBYTq-.V]AOg)04u'/ix5(!*T?1`a`;lj)0v$;9YxpB*:V a$V[zIx`$ (P p "eNl`D` -(ϱR=TI.& Gt^$bAUFC ʁN \#`B#a<B:?rFJL(%m2G z+ x`:% g2/ x7%`@q A @!3Ġr8 p0HCgеL@:\6 x A/i  đ`4h0A^flHIl//GM!<` *H@*BGK.ފ!`;`0F %a/<sГhdR @jp<|Ez%P`;mH] UZG9 u#r+͸`7A ò"`<G ?.hQ*ApC@qp")T*:AU$pIAA? tL  T O8`@<|vv{ߦ*V? ~g@<;D_..hY|Ӣ  00 *`;`:$y_+pJX?H|_Y^Qzώy ?8ooʱJB +pr=pA_& T?U<&H}0HXzOl|Lz @/i-. @6ǃj * @gp0.z6~x>.&|C\G_OCx?`7 r1),3 ~Yp{iЪ'l^a s_^ L2Sz0|.5@/%<* `:~P*BUԴj pP U*4/:? w͂ QS@PӒH2/!ދ.h@}TD (@` KT\!E χ rҁb%CUM8`@I`uoR` @ mYtR_D2T(H..xA8( *z ~)$[IV% 3 4ER*+Pl4K.(P㣁ߏ@>LvH`;Ay}jΐ7`(\A  ӹon\PK#8@9e0헪ldAj53 a@U9#YNrp$.J7%`9zbvvvqtx>8 0@p0hR}RH0_C3A.tw(0! ں8 cϗ6?%U{(CoƗC  >dx+k&ǃahBڎ|#lh$!^?σЗ(~^+jG5Np07%~˯ցCX0Ix0!c020^I-UGہ 8X~\>K/$_ip`RJ `Br C#|W.@ zڔ=A^78~KI.=x:.#t/A SD0@x"]VT~20PI]GZ= H@ sk32ȠrGO` 9. `R0]aaA'G_gWX8?aD,d+t*x 8X `98 m.T)*V?WEm[.(|N/V3G,M\> 0ڔ/&m-[@ | TT^_b{okO^.w#< :Ip ^R`8û~ Dj)X X0!]dN1 0ZQ5GUAv{q`xP(B{@0Lt d? E~Ca|///TF8x`İP hp~~%|?J 8WuYx|_Ȍ & g*_}DFs@<P 嬨N`8@?YEr $*/@< >s_S B` <Ba,$1$xPb@edJ%!c K*G cP]A`98?`@KV;SGxH`ApÒ@`ASG/)5 0 0$/RuXB [n|&h~(: P0A xEȳ> V00u#K_*PE#a/8Z9 Sc=rl0%P!_U>)`:`yw*sAH0iW w|A^ A`9 (B_U$cB x==1܋e A  Q (0 0# EI B@t]1 iG`7@~!o{_5bS8| 0@4 &EQd~F.T/P`%"eûHє0^#(  qQzP?G1Z~ fÀ(  P0_ӉjQ42 dJBX0eL$+躄J0>bX@ Ӡ E@zY\0Wp6Tg% w0biЀ pKQyTGAЂ p+1;X0 e"0~@:^KD KV|@`} TxRV_v~F P0?y {zՃ|І%P 3^WrVd `u@/ā"Qp?T$U+C'$ tP52~0 oOƪ0; ~.\ $ $$5X!xˇ;0Wا8sЗD (_A.T _< ,NPc?r*0R0op/0! ~GW=!AA!/ df%L-|p@  Qǐ XRN$\wUG`9WҤgQ9ðc~T( p0;A $uw0:^6LKՉ`!OE 0` җf,`T XԽW&f˄J&Qׁ SnX0 !zg0R?.4Ő`;GU|z`9ĵ^PG UL @ H0P+@$4 p\r: T%`UJx?>V?3` 8~c6\50 p,W`|{*@1=lT~$X0" JWs0C` Ѕ0O]U pAT>Y@0~, ;K#-Xy|Yv/h0~YcP{70@|! ~Je!]`vR B Ӵ V*t0@ 8$ -_<%!z"?e[I$İ`@0J@p;Dt!V "  B7X0@/V\ =L?*  /ʋ%g 0%Ldd&A@  P:$dx4>:cb X% |g2(+ҡpx0`RK $y&6e 0o%z t 8;{̜W۰yuT% U WP^]l@ *< T@ցMh0!`)z^۷fQEᩪ=XB CNGL _QRDVᙰ `;WX۝ X`~0PH> 5+l%c`|OaZ!TX *`(0>JˁD>4<}h0o *Ua2$!W$$osp%ঊ8!0J@v ' `C9X.(4`A  Vπ]`< ~h0@"P0!?@d`8Ҵ I%$%*ˬz`F V7|`}|ˀ/꼭3 pAS h0߀?J#*h,$p<}X0^#l?`h$ H~ N`5>.ASڋ|hxCDp,U`?! /s@]A&|/g3`>y `< GF"@/T 8+.j\Z ՒKXd|Xo}AD %Lk_^^>~`;YЕAP>tuHƫCz. xF 0_|27`B{`~V\$Հgw`0`xwK6㒥G |$@`}(:| `/AƩ&@`B~/H\~ 0ߊC( ڀ`<|^G||".ġ A0x0]Dx% Q `0J )XNm .B!̀x0w$+ʔY.uz #0`k' .xxI<['0o bU@ Uڰ:)8`A0@ T\ȵ@ʨIx"B1xS}1i}`tD@ A"2b`9 Q"C* @HuzO7$TX@ "HA Tm `5 I @A *$ *V\xzp`<`|j%W,"ddu!,8_>l`9$BZQƐMt% ccbEq2/LAHYP`7A@2[ |ŏgP:XP p0 ^?PK⪊ h0@/e5??vBj``0`;V|D^zn@`\!VX`Bx^> PHi~4D%00! #ﴪ.<ʤD@zg *~$PRBBX0@\= RKqAm.[O## ~#p*6r BCк@`3h|P`:D`U^ (/H9@L#>`{`A T Do))|$?'?:܉ H0>| vsv }t^" \\=C(@ H0^`$P =}^Ϧ|| p3 x ;=3F@"` 򏏄 XH0%$}M0q h0eP>=#ĴZ# `/u /zH$% ~``^@) AJYT m 0 ~?m8 G @"o$H 0`x 1/wbU`Xg,V̿ `t@C%C6Ub_%`E{0l `}@ ( $], جP%! `< *#$ `<:t_ S P˦j 0$ P 8>| _#@@B!2 `X0tB'>0P!`~h9 N X `y eZ)d*'TRnkp g.x!җ\`z>1 gW`}0!@(TܺE> X0@^|!hP00x?ٿ7@FS}'iC> 0js TqWixE$R 80F|oHBH0x*=`0 ~$+`nuhD+8>E3bP0ox!,I0!B Y2*:G97Є  6!AW3`C h`{ꀷǮc0"X0@A. h0u3/So.L诃]lC`.` Vߐ` , 00% 4qK[ a0/ PY1B !{ <pBS0=ch0 )~PX+DuP~ 0`ʮC`x ^B?TK ~ _f!^ x`:0# I A {B^K0z B0?.*Hz1X0qh*x0@r`B0x*U ⼔`x`AHJKҘs~c`0CҰp?$@<`;0TBR$$ @}^ p_UjK4p @8%BR h)~ 5(?|80>" @ 4~ Opd 0 w rBTnj^e Ox1`y,][?R p0!"@0AQuy+ D4 Ey+`<Ĉ\P̂t((ɟPpp%P@`4`T`9ĵt.Gꇅ5>  8j@KdjmGx@ua݁P H4UX@U*cL``?1`<D9.:(H0 >y@ 0b_Dx0!yA``9AЀ>V;  !DVJ ?vit` <1 0`;Xx?[ 9R541*?L4 80gP`׀H2 %h\ h0y*VҰ%((A X 02K` ҃_DO .^$0`𔬾ļ 1X*ڄt(D %  p`Ղ~!O  `;UX(; ~fQ`.hC _ Db<$QK6L`8@`;lU.#vXh,@dl@`>"x@q1`6I/  pAPA@gP8`C f6zqn1'QT>V<!(KjJ XỎJ[S4i<a}U>I&9!F Ne>/`0  * 0 +.TdL0` l#E&hAF^$|t hJD-S_9Gw3 WD:xj/ö(?g# ׳#r{G1 EpxMT~X)f]ㄑi8G$E/>]4|M綕Ԝv@O<}=Yj8B:V~ @Cq䛃#ꏜ .AU cKx0`BQa $ xC8 ^ VH)j`4P 4~H!  c|rp0`@u7Z4 x0@|B}cB`~+n mC@ط}m:#A>I@#[v Uj  PVN^]1ޮ *z\x|"5* 8S}𧻓+40]X ϪT{H@%„jvl/J#׮@|(d*880>^jjS<$1Faq%o,<,hMi$,r z΁SL>`@A@%`D`~t <DφE1,Kqwm+wA3^?ӆKﲑ7z0`UT8@I o1'AKF!ɝ 4 0pD iqG` '7Lҵ )j=]!u{7e)PAi tB8(@ qw`p~&2* 3PT.1g>[΀Z' gUh F<Lꗏ9;K/UR8\jvQVxQyqxL $ C ml﹦"|rCD@W2yIO@dw⁆MQhgr^N3ZcBR64jgGegMXa~ t0R9Tu޾p@"^a6m بH+l!'>tJeM@1EB. 8 ES8#&dZڢS14O)Hzipr>W 8_9 Z}~#*~>_0|mgF \ǟP/)>4 A;F3I_?跏G(X/ɤ~(RĬ SK1jO"8/+cU2OGhz]9ņg.Gxj~CۆSy^d #J\% h8`DMIiv1Ӥ|r+s+㧛̳5}N?c&ZxR^D^@3xJClYj+)3ᄊ<>$-?: T|`Y꼯SpxEU@Vy ,;O0#Z#nMaKHײ wJ熧PQ_  C**@04pā!`z İ`A<.Wበ <^ p uĐ p`:<%a}T0zt l$ I[)-Sj bLI!溧08 ^L Gz!Kcǖ{aɮ6(2iUW{59YԼ>^Ҹzis-|O=W.H 0 ]ǃ pW}P0  }`{Ox BMQ=.30 WU}Ayp DL`8 2<;~_O ĥ_S cHZ/". ce0>@a?/Z'>^ )88G~$j p#p{. C%`f 0! 3P)SGoj#Oo(g6C.E W *=1#p? &GXe%8}oIV#]v|`xFȿ>A$St p(>>FC%/`G@(WAl`8Vs|<щ@ =BV;JJupZw!bW\ 0#"`;0Yw6O?#bU2wyfrg.)DS}'kấ\kGp# y=O.@pr+-,/c@SA P `Ą` 5`+BT Pz*yW*bujPK`P $W)?K`P DV\_PߋB\ 8BT  @^j u#' J{MԽBn_ ߷ǡ%WP8`!JԓӞdD7M!t_0 0!B@ ʕz#=4xq{VpfLx-*f4Wǒ/&4lxeA Λ*]ʔ9 D2lkΎȘS{;Yì:oOnmy~+@+3pbޟsw3!*).}S1{| ġFw!{٩D{}F AAA`7wWwv'&)3APSƃ'6fO<*cN%ـdZ J:f'H!Ԭ'T]HtIcOw}Xѳ/E'\{0xJ#>K|&6"26/U|J(_Z0"!BT"߉^:$Op+?`R1Buw<לc~Wp)X:ZrN8NE)z<⛝V}Af(Sqg?øO}-jZuaP-KFzM\#BhOzމbs?R.,GWoDfc!T#˫(%<t\亨O!sC6'2wpEΧb!%Gp]*^#5QBߟ*<;v9{ Ϝr ƈ_ jA-T7i5_@q\r_ױ\0@%N3@38oqVϧjM  p9 gB?Yglˑ9w^i`儬'qB&o RtM1ax;g` jhR8J&!Oqs]Z%v*x8`|+pSpp>MC>͞rxeR}aϵS8`yx0!`늌^3/_+0`%vPP0  0`8 ``Enp8$\}H |=.G9Z1I0o`WDb%Ce/*i`g0:Z? v`TOxD`,!yQrw* bhd0̼HCp C  u K_=0 "H(ReP0AwtS u}vSKux-KT!~;x;G@F`6iƸz(I9sQ}=nO>q0pJHXrEx.İ xftF@D @| 漗G0 `ACV > DRytC`VJO(`}>\$QU 8Fb)Rٳ7a|Gp:8#@~= GE"L1^ 0'` D@< DVꟌ @0@E Om1â:z|$*I.W*)_yˋ~84 "8^PAA4?! ^ !py0^hRh)` jK/LSO){+Rz*NroO`ug4T3=}S䎩-MCW&{mS0}fE̹BÅ!x?:#.%P(D>P}4=VB 4p_>4 g0NކAK*_C!%{-!H鳪%{D0:w8[PSax }!`8`PN4Mg 7gX2n9ޭC{nouxf قfy0֮t= @ӄ oE q_}!lbxHZ@^nfzE?C3L%*+`W;On@Ù̸SZ-1'x\Hi1F?LÛvIST wYF4d9ګxꕎ x:#(7a8P{p@-=G0¡c0!pci&Ġ9{ ?t}:IM}ؙ=}飽yEoxԓ`Q& clA z(V3FPU_?+bdNPP qtp8t^~pA_o P$8U(^+1RHyMOv F >@.;Y4LJ@d2L!"~WحA_it}>l3SsB~#8żl}Fpz@x҈EZ у]]_:&8b4Ā0IR q&NQz (OH9HFT x͓|O1cɚ]n4G 8#˛6n4'Ӕ>]ECE3Dy.pe Oodnp3O{t-  &wDy hBXZ<J-gʞPXP~ʘ)tPMH)Q6j)\|R`JuM:sa]G_SR[Ig DA}|!:#nvY b?w%^UǣB?){0Uo W4)^@oi<4. [NŅH@2f|)>ӟy?yYt(o@*v6 B3vNN1 :L7vj?\3_C U7G0U7!+r}=!0_%o{Mp˛̈́OCddFџ0)tdž a:f~qmǷV|2gD-*xԵlAC?0ά`53 oq )I{F;m5 Ur=N9Êj%z+n&0$(BfQ]#a):uje}OWteꦓ/""{f2@\ qp @~f =~!6vaLGbHdBFT` nALa?/)^J+. Ȝ)JN7E}vH J8x)[aa>\ ()^qٺ_<Dž7q% rL3W #՗:ݹ%oXGJ.rdȜLx8ʔVWOdY$!.'X8fxf >`.>ˇAzj<0˨: $)Ǫ|ќ Aa#NB*Π, 8(BCy9莊 f:h B0_?TTc(KTOvc7׃%4=}dj!:z n법 7dd'A,z8!E N#ᛩވWC*{,p?a<Oq8>%ޞϼ5j >p.K狤,2 ʟE9AqrE$*|)Vt0bPA#3:|H|0I d  $@ ]{N _J(oąLPBJl !bx=&/Jm}#—{aL`9H0`s:]I`<TJ.$?U+c$% x~. _c.x8!=uPh0 "e @`@V+ ?#3TE/@$ | HB8~XխnYOӇYT#f%K&}vHG WV糾W;ޖ, d2  n p Ȧ '`0RZ 0ˋի/Q21X!įP="AyJaK™|J^%CA֨ʀ (Z:3")K]㕼^!UIX8jܚCN83\H3x`~ j#?֩rdЈ^ #"HB.!yA{i<0{juLJ2E$ _.p0F y0[+p>-~(7ߺTyp@7h)?&&)F _T%8_>U>qKNXfxfO թs6pPpOa՟tN@ok6?k o{ ^+Nouu{vm~Ƅ1x&/u>+Z:4^m+;TxS+d#FU{ oXm%c`Ú{{ޝ߈<\"x'T¾So{w1  sT|~(CC䗄g"(=23 X@R0+=+RI=1^:IKd qr`u+Op2 ݷFc0G [~^sWÅH 4Wo$ K/%S# n DI|]]'8LU9бPq_gįzӲI7y=>\x$J-I &qsu?CH'8Ԇ(rx1?TBqZy<SۭIl| rpj^ B#r@Y`* #]Pr|Y0Oi)E^ϣ8@J -@X4GUDGK4d\](+b &!>;R$$ac?gj]4͠"ܫ@9:0٤ 8\}QW"ܧTαOT5tf:N} ޓ "g5gekiw~s{@-g *%$=}5o{9u'Ϝ8:0 N+gVpvS(~%?bp??V^99{as]8|30J`0D 80Eꁀʯ C򪞌D+) = ~S͋`~?:D8RP!=E@E2wl< kc !о0@BEPCV)~N LvyYdɤ͚Jw*{x}ip r8_ /AGaf`}#Wj <@U-P!P.qX1TK| 06AȤw"%F˜OBĶ;@ X, p/KVw+;*%8ʶ;

%LB\Iv '8#W8CD@=hc )3 !2'sέif)C`A.   /T·jbVR@+zl)F `>%ˀ5S?=P|.^%]`n*\T p0>ca=U)g,d%0X ZL,đ(;2 А 80xI[Ҁ$ |DpED%S& Hɏb3Byx UZP+; ěv40!*mN"]v1a8:JHO25T GoQO)`)pJdx@rdJu4( Kfr r\3|rJ2J oOrK|uJD%yX&3 2+{r~z˽r$sf' ɰ q9Njc š  +LmX(p r4pp?ipp>m/{VV1ћ{M@N7l-oo{[б;f4><^{{č&(#{Npfɍ*|oN.wMs)w2r`h߄0KI$KՍz@9KxӘ@V@'6Zsփ"E21}$ qp8FrC"pFCA! D!|=<);"yCs%V0 &M;،a\]+[>,Wi !!/PPHS8MR:# )a>?X`가D[R燀3CST$yk*Ҧ#@q?Uwm1xS^ؐoZq<:\#[;[峌p8+Bsa!!AOذa0C.#:4wjpQ[~6jM5f0 .ָ3Yc1d2t9#Ͷ,s 3aCFZQ UU >NJBl7z"a9T/e B?֧FDC4NI=:2vM|Cxғ޼)\y@0A_Oi<2 SlW8fyu/$M"GU8@^r\fky=ν 5JI8,!po2ZRRL#*>r?j+46~"uOhz+d (XS vt`p3 P c2A:i>}0Wi0wL33:HTBW#{{hm {{~:a pKeͼu`x)8"I:BH.% X" ,)X 0`wg0I*/*z43"/U|]1l ei9a/)~ƍg ΰa*x8\@ 4H8_Ü3 ̡oT}faF8ME7O i9(GN`{/ȉB=GL~Ml4#7H'ƿB-bF@ V`H8BIpL# `Wr؋{*Y?@XzW>#? G_Y<"够RܟaBNi Ƀ77 V`{D*<|<N gpdNëgBb>+WATc 8}{@Ď`8E Y&/_vO`;}|<>:, G߇Sx߉`JN`0!H_x0`:İ`ñdXh8i^}5J!qO CpSr~Zi8I8~pFPC*bfvZϯ~H{Ǚ]U7$DP< p2AD +.ď.U[?)L:Jr&*N̿D+T#=ƈhTf0PȍH`dt3]&// h26/Ӊeό/pSe<%'5.Ja#CFp@(*8ˍoŜv'Q)b&~8[w1) FQdR&@adLt|ApepNWp8_ȳdp($pA,< 2p)iYojTۜhFfSRX^iWlV!a}tLr.﹧VJwFS66jmkV SoozO+IZosao& Ǵ\2:x'8D\ڊ:Kr [y` UGu`?NVAWQ΁Z "9D;ܢ^s $ $&L0@ ɮ L f$ D$9YxRP{4mk1N1f(u)If]\x80P0{]3Ecρ1S5Eᘜ{On?4i;L 0FqxC 8JU`Zii0ʉ/QkM9+W`AHaJ|\'.༸|PM*@#: _x RI^!*@w^q?8H  ''G}j-PxL/p*{ۛs73 YfOi_2)aezhf ~aA8o`ˆO{pĭ`uC,ɱK)$T rxe"jwi556$hp%JSƉppv#Q,~Oiui-Vc[\5 5 =C'aA!!/.!i~<ȧȫ51%$  P{אBPvTmň!@C(Uf8?n* 8zmx<{V@u<8cG)-=S8HN'< z(FPHx]`+Pq۸ɫ*\z^i"| _f2?uKa?4uB넧ߵSI~)ϗ/Sf+$ մ0J<^pq5/)S_k$ x {T7Qw22<)5M2s%P$ЋT(}z(P>IqpzHk$O?25:<EHKdڽ/w}W5jF~}ߜOPt2Y<+=RH_pSW< %'OoS0uf,{&(4N#8jS3>2x0 4D|qOEz@ &ۣԏIMq4$4)*wݘh=Z!``_#$l3O -ȃ0 g $rz%4 hlaSolϧz P0y0@ hVq`\K6I n)>>/GܭpSP Aό@^ (r?P$*T% *J> g{GW+? ccz~uR<%E~ )!\sFjyY2/VM76 ᚳO{78`?p? ͉>jn9A P1`Ht`Bu'PS"Iw[>K/2*^cۡg[0 [D}JLDa(DP1 -W[6z=*30-I73W3O <H8_׆`+;` X:@#<4aBu8d(Q2|# l!X(`8 J/VJ!wʝy?gxd0 0O O]@*Ct6O#+zȔ-1Θ 4yݱ!} şu{[{ﴐi+i_yכw;l# vJ;$Z6'=Q6ٺt{zsiߪP)hN@*OrswTE7$;(G;XY(8 ?U#7|˯4vᇵ>^ޞzzw޷& Dj |!0Pm0\Ɔ="}ƒL{Zad3T~7ZX0!;MZ_:;`c*saMUH(52To>S BUGΪ#֦醦L`s X<);xu0J˫~ SOy'@*UzL=tx?g2qO 3?K0:;yx8@H *FxaD&-.᧌XV}dHNiApyqoIbc?HpG$\*Oe0`!+ҿ}?܄Pr&3}ע\L@pƄ)x4603m} ;`Ŭe$hpkua|yΡfX$XxC!%9 ND;vJ b|B`Y(0pȐ$>͆J&xYiIm#La*O bRЌ#p4jrVvS  X&B? p84B#{)kǸ)ߍƚZ # z58wtJ@*x 9D9X8I\!@lyÇC4ß9W +%aN!pBX_tseߠく jcw8Z' dԽJcU+mU{hQ 8'1?`<(.QpX+V?:$~WRN++9ѧѶh+Nu랊[sa"$H8tK[H\z$ hn(MA02{xL_ryzS]ca"THz_MQ3:2k/./z`0`ꄚz `D`AdxʓY@aǺyx$U^ ()~z aN,J`D}y>?x%c>ïdw]@PL|` `(GO_N7OVs1\8ORj4X'/0f9bj'+z? 6HVtS={)f:r# ¢& p|<$CbE^ςB"}#xf 8B\O%p:fP2ib+F{O!Qq`_N<)n;f㎅)cO$||ΝpS2.ZV 9 ܪD_D%>| BP ^)j8!JD\*cDJ*;webbZ5y; x*q*|'4+I=m!ozIB6'Ϝ:#Wt;C͢Qwg֩KnS1RGu\1_zWn{ܫ 5^"45#gpdá}|28d{lnm[ p)Ù?H?!qt{ a cstw2)#?ERe^ ]KvMT & |Q4X((YoSF[0d#  8 ҳ 8f x)xYbUJ#Al!K챿0YT X;|ZLH gĤiD>ҍ~#lU4#!ԟE^>ޏ2BX;xwbs DrXӚIHa5Ŋx_wHX!y=!QF|)\ɁЧx5UN Q Pbr;{u@и/z:!d2"]BGDrq;bhZpG@qD9M$ܩQYlu1Ɖ=oȤc"oS>M3o4Xdɉ +*>Fꚡl"Ɵ^Sh\|N0; ?.\|'$T3)?NwtV\9ḋ;2 ueA;?oleYaN:gv}R/;|24nt99K@wժ*)XvE it:h4O/7qwf[N@ P7Hax0WINPfjwdixzp@jwA} HUQ P+\x)Lɇ>%8j 9x0^G0  VKT"OΎ2ޖe9\\JGA)ae< {C#F^<:0e1`Ne]UaUzqUMFS O epydF | >1V@Y7|4ei2 O댱d laL6!w|մ^ ] -gɫ_bZ2݇e UdxmV_^OSŸN+BZ悟22}׉*f-JG( {DΧW$]cfSDd 8W,h)\#0L~\_0?|>:NAOH:9F B +%{hA)$<`xد+t2"7C.V^׬`v)?FJ)hh 2"4D•Q O&OE,@uC'ၦQu.=\p3*g1:?T< \4fƙqGW @x!# 閞O, 1پޓ' ?AwrNJ|(AbJ}㔜``<_2f4*agIaC¤g _Gk$!*^^^05*W1Vˁ TB=𧷜KNj"*p3~΀Q>" UI닔<` ]qrAzEʠT(>% -x0C@?qSdN%?!a~ tqD2PD/s0Ā 3d*_<2Jޣ{b_Om&3@0 P!rR3F) r?:J%3PFpfx[ ++"7P8";ތgO`شt"pyR0=tT7(:* 90+lwOک0_( 2Py Ft'O4^5EL32zwӝ/< 5ba+OsCW~%ަ=-\Ocx#Щx8_J?ȼ+۴daxпt>|(g| H|)(<@[5T{e/G@c [ju&A4h#WI|NW5\;NJ oEʙOAL;p9ByP~#߉+z6E E=e^35ATa{vj%&j5;!ᓬ!Htpf?6t4EcKQt_on lmGM?vO:<{Ȍ |4Őb`m'kZ鴽jC"ç eVce<=_Fe_4QzJ;G$. z_P|7%-u1)?@| +A3)R.VGe3R^0jb`{7\NO(<% xxL(fh4>@fl)oRzz_JD$) $)SEdG F),1XJ.q8ZB@ zy=(Ƥ|Wd;>`hln'uI٣`)1ݤך+T=SDM@(z! (/e-%mjsdiI|S$VGL-;HបwS%d)5 :i3m8^:D/ܜ'm4B-W4\vՋ^ o|+q@dJL`3YڠPBt+*Ja"GyPHfYXɒbCD|5nKLkB788ne`3bEbT5Ιg#Wcl :Tg6elR쨺V9ngԊή~23ZVV,{ RϏ# {?0a' zt $?2XX}tA54x%)r`J_V>o# m$ih@2A@0PLa;? bN:0*{*lG !sO!$ۖΫtTO2dkh؍Iߢ9#<n-qap@AG4.+ A KJV>,%pC CaP)?@ h SaDX4+%>}Mp8_ѓm1  aOMG DDMą 8h+6ZRҊWK=S Ǣt3 OO# j  PR#V\XW7 pyf|Uc+P~ 0T845JtF0ˎgi'/ IA GK> hmu(xSf:nؚ}iAy4}8%!'iM3? SS*#̼3O :VL#ٓo{\,l;f &HI]܄" >ե4)MftVB@+C<@;P#BA:"US93 vzk +#`qBttx{a H(ceӢ(P73^ρ'rO;fv1b > G+L8,($%0ennr6yWO`0!pu Upʕu@X?>T=.%+~\j:Ɓ~$P3uC'S ApGA Xe%>@1W UE%;]$LDA[h4b1v+?o73p I7 7!hDKCφiShعcy̟?y/{,PIGxj,S`@>yމN:0G&x㷃@D!& YZ88=U@|U('3}LEL&tF_F4wXjQ#+-B!_7t} [hƸG:/ӾR)'O#5qbE b>iO#LJ + Ep8_?wy!'/Ry]VϾ@X2WFo+' UK'1._oOl߆jfMQBv{.V؄{(u3ŒE/P;1'uM[^lC*57:*SiaDl iS QƂ4,rQY )xЍC%V=BjGsT)bwF6~]Bh~M!, z* Ld*ؑ1yu}=O0KƎOzI߬p%O0EIA*[13S >& 25ONp<.\# ʨH.hP.2*JFr\щ60^ dOOɮOAHz,;iע!i=RN|`3zhh1c<}ЊQ0a=USۜ3˚5CH9>|c$ɮl⌴iۺFO.7rsAvH`t p$x ߁o OiI(GplDzѠpvX5oͫɂk] N4r2z}̡9ь/4m:ίB *N gc ܫUˢJ.%gJH,3g-+ VG1uG}v(3keN6ϭϏ>iA(.$xWƟ:nT4]}g8~*P DfcZF>r㑪Eꋴ~I/<͗+p,bH!}q9:Hm.EKQn3 $tI:EY-:6.eijj=E`(WVtEmkSXe7''Sp2gΪ_d1 gIX>a'^?IpYpX酜GOc2tR p? JSMKaɤ?. f ܵEĀR1NSXcdB74G"p>#LJͽ*MI\}.៝@*< sCƧ< &GP̀fO{޶xMS K_3UU?%5''!؉}!FE@]J @~8긤}4Jժ@,zP8@3"GRIPhѸ3zw 3?Oxxft<=r> ̵Zܞp#0r.䧄tB+z~Gr"!41xe,L pH~9^ 1U/T$=@0 (8@_G*'8B̜< p}4@ If?!`>Jx\:5h"K;HnRqCpgF'g1W=6[*:#4A f3Mgˀ yxUsu^6"A]s|2Mbwו⏍px E U^V^cg xKaH(^ʤ썤>#Ft |Փ Vf=*P% y.ˇ.9)OO.\l`1| ]irgHʮfϭL0TaHSpQBRH$9.^8*NjGyDhroub 2q\OpQ3(ϼ)(<6X8`C: Gs(@`Y(T7aqRB',%J D4q.!O2 -:q݄Ѳl|&u_.S\{!cz<^_uy~ 67МHB w\{IO-}:{(PM)պl`>LD3K_Kv @SCJ0o)řO6$!| <`B(L`~nۻyGԾF(xZ#`Ra-V=/ÁÞ mVJZhO " :.uξwt1/,pAۇ2Pq^a!!AW"Y>ת`į@N*۲QR R  TJV>P%F_M"RI:4M3c+lدI6FO+Wχ-J}SG 0OG5%*2|j*ׂ"Y ^1TdφBN=<ҴQF\3mJ{** =UZK(̤gE83OI80AMVlQ(P@d#"OKH$#pʏGҭ&Uly K["U7" (+doOĂґ ?4bLyJL( Oa5T ),S 8-g_ ;\0'kg]"+]J1I5 9lA/lF3P#g !&s=:".-<뺏Sb"^}^#}`A%tgJxZoHqpz<}>5`_SVAF336 O7R ` ~>޷A-XC/QI`<$( zALwVOxG'9c`Dx~d0`yP3x4ί_pd"GFQ]ozv9aD8A2]Cd! Ό=+f71fⳂ+y8͇xاUe y3df>j@ <^cm`0`9- nO*dsb'.Bޞ*<P. (h9Ϋ= w{{*r{l[X*AB{꟟%'cIRLcā4sɅqT"8`E20|Rϙ>#(8mR<o1G6|$wxdqLg]^ȥFͮN8b7.,bR'xJ#UX9(! bP>b*f"3 l.=Ӝ!ԩ0< ,zXKH1GIij-4 9B1`+ EaAQ,SA߲=L @J/[`8ߡU9P18]'H8IN$gB!A1s^h&Ox3{9yfIrF+PA}kss`WGK~pckpS MU` JPJMT_ }?ŽιfC.p3PS ^?-n  XHh0%z^ xh0@U +gG0df^:\i?t Ll^fA2$~<jB$zx~= zxH|*x3f))׉Sa88ot[{ 8;=>H=#' ›9c߃']9~+5_ȫ$~YwDüEA8M 8)Az_=`}&3$zz2p@!?/FXd{ޮuLLcM cB/ߝ.&;ޝnuBw8@\+dg'T{JDAiGyt(ժLM8mt`t9;ʋfqj<-;GƆbo>#yR+_Gcm=q3C_g(fi*F"]{@>`VI4%P0!#q@ۘOz"K(Լ~  {}мUP( ]o_5mgMCՑ|=ɠt~?1qr* "Rڀ`}0=;"*.T(ާNe2cOf8t$|? | )R y::;r7)< 򓦐9 Pё-ͼ1(lc2=̈N-I$4JL4' quB{6O/RR3`'9ԃD[dg# $#ƟB$ 7aA!H@8C{؆W[o  Z9$?@e?8iJVN 1߈nOo:r?Ghq\/ 8F>fx AAvO2CȌ$=^FHg.D=Ur֙͆_Pxh+I,(Sˏ_NJZ:/ oO7iH`)x@W-.׀Q8S.`ȑ8_ހ[m*y2A0̼O|< b:8ψΓ/׶ÂG9 (ՆIl?8ARaO#uL(;q?J6ϝry>s<206@;\Q0` ZhDOx %JUŭ,2.*gPS\8ά.UO<z]ee>,k ?OI8Fy}4yCuIi`^aBx&VK@:.GM.K8Qq/OpY4Mo8ugӭ4f#7S]>9{+f)ygUA6ᑶpy'2gQh͜1o/gƄ |=gΦ#ww}eV *%İ``IP `PxQzN[5@@BBK ?.. @0VQypXl `EϪ[Nx8`}`=w9#p? ;O1"<<8{gM0_l! `!uc>=-Oʛ"C3{0 _ET_A,+  @sɞwIM!\6|; 8a*N{Qg\z@p q]?U2/`}# x0c`<GPa(d'.]'uغx'pʫ-ǠoAQ` F29 xz7Zb N 6秝a1xfN[sXd(͋.Jdd`K: {߬p(|)",`?ռ. sP [|4hGO}du{HSh~P|/I< 0 |.t/Lp/T}#,O|!,Dh2pA%V(3e{=0/-G k|*aƯR0` iqz'R]v\":H0 I]x0`H8ǿ4()_|Ij0_ p |"x|j%B 0S"6~yOCL.0;u_W*>ʚ*J* O$<TΟOAGAG^!=h菪ճ(9 m Yt1XFDZ)r9ЖާDCv4wj=;MMa oWUEʕQ=[ϧT ͓V:dp`!f}k BxlꙜ>8GZ8D/s )]Q|FxTP4w eV &E5ͦmBJr\&WlJeGʡEC01p_Z;-C%T|ʗ{~˂C%yOEʘ5@הqFl"wfEC%D0F# .'% @.l2]2OeBC/G "鳤3Τy܏OS:bhX3i+Qg)_t8Xf1 /X@)7!O@|ЏI5֌F|B-''Wʥ?xע)AB z},'H& "rz[u=\[a8f^:dz]&O,3$ a=aP)y#9#O:oaa a]A`TRPD-P%npF?)xʨ p@(AP*UQ}T eN뫝7ΞO8᫒|\,q7!DaF^ٟm}%RVf#= !,!ʯrAtDߋ8y}HpV$툂 *CpS`sЬN @SDi^/xˤƓϥ7iYP$p?_W{x*~9H&O7}pfI>~4"W|XN@p\pF" JDD_@|~My0J Ā ˁ ˄8$./`Idi(P\^7R#X9@V8 S@p`'G*f/{n`eDo_uUti0MAPztvūoojӜs]_H}0Xd3Oy̢w|.["kZn)!TVH "2M 0t%`O+`{sA %|Q**dz'z_]P`QPhNEʫUyX@Q'Hi% X šb!Zx$b`pOuq6N)@P+pO]eEG9)7$5I63pg$ 7 rhz}<3 m>FD4p >W@&*VN0  TBEܬf `<`0`pv/:]?<D.'@  y݄"  X)P| )W} cXC2t%wʿ48_L_K˕zݞ|Jn6,z`~Gx!/]xBʋb;B`}uP՗.J"/V%Ox Z 0c HDqBG&r5ת08@NOTB7o}o(#%7xҧ79ϝ%ͶLyy֏dL;bw `(J?_^Q0>e@LY?<˞O0t *[#`C^upbd#).uES 0+xCg`<0J<tJTk<@ ::/TN04>*x|Ʌ$v0 ߾ ://hq+׽XA PBC`<TKĢx&@xz] PP \UΫSk ,G#^$*hgqK@˧͈fi،yɡpO0H!*I^x8C*u'3/]a@>F /\R#t0S4ՏM2Jf4` F PxѐAc\zȇ3nxuZzq ,|.C1$KVH x8 U1ۄ}n ν-8/8_ó:}A Owմxn3g0ٗ Iwe20d%v uc @S&vކG^XIn1uez&8 M#pcz+tssdAMž5XQrgB?iӡLmd 7<c2Zba(A@Cn^% %zB/q͘Io7 POU|?XbwQl!\`+?P,R]v#4`1"UYNgCaF0}'/Xg LXYL\D'+@ϣƩ@!\0aH8@QNq1&?wDAz}{-yq6wFwec{T?2@OT"p#3c!a"&[$?`>Ӎti rG(cjjÃ?7 *,@̧x z]]8q8G%DQMXZ8r9ݷ!:DbREWFL=mXπvIU+\C8\ƨ׆aCw0ZExeV&T\]eRL^SP]N*nFK#6\=`O%٫fvX;v߈qlqx8@H'HM` !&3V_OэEH##SBE`pPt@6`>) >q8,L#lMA# hc1!ΒM#.`eyУDފ=δ/&*7QoGZ#EʔA6e#'rtuSTQV 61ܤJ(}@@?)??9X* -z.3 gڎOylz⑚an? 7ҟaP8?pg67Ҏt S?U =]S| X18pW%w0!?TVd#!3 D4Uܟ5`FocŰ3O!$VՏ??]8f"y_*1' DpzF^!dVf'H4>c^~$=NDIu"pKOhhm>CUo1ISzxGL4w;)8YKr?S5{7'9q ˔K" ;/P.{dFboDl^Q;w`* @Z{\!zkpGˤ#hzqOuGp\߷ x. tB&83"W8 R0w}@fjtl]cb'nQlJ: /g@q9yH)MrgZ`fXdps#Ρ,[-r2&<ۆl3G:N5&gB=(.@C ]QնI;{sZxB< ѐ>yUAA/@! ! c}QYܷ1_d'::v)'p8vp>>zL"CAL@`}>$p[? :vJO XJā}n~ >8AU_+AT ^;CdOF @4 PB/![c}j D(DbUK˕-W{!cѧĥcV"豂SO -_M_3OlᓒL('MN &.E-\2 $*l͢X9FNiFbUoM?D% $`9 Ĭ%`VrX0 C7Đ.xIZJ4@ /ߞtz^#J)waNЦIA`hꋔH:c 0s~{MBPN`r$(CE' ,36\[C p*s=}gpqg <qÃpAQUTPGH||?u$5cCN,A `C\uW R(p%-_ō\0*o9O#a>ʨ ?.EA*)0c1]vkzxf|ϯIv汪зFw928DS| |1XXۂ | dj (o ;{AC?A`ˏí# S"V Xy|hKNA |V  Gc&bY \..{6vk>Ⱥ5ZRpdqե:p 4p1' `B0z)SLu^ri80a : 8Qy? `} Qˀ7t{6I23y^,ImQ O+l{ qhX0Vl$ E(C/XCb)[`g#}>#u"Px\V1~xB./v=W AAXTMl]wqS *= *,$ߪSU2!0AA.qJhC_ +V БAX0 IMO0@0>L18W&'JTˋ&/P_iO j 0>_>>gpp>\UbX03O^=`tyˁx)P .j|=8@_>*4 et UMðqiwoBYF`n|=A"A/` #q!>CeԜ}tFqpnSUGUzpNL$Kn 6b1eTD !0"F{T Ge`:`;`0*0?*~%۪AZ"+maV24`:9RԫRm%U!LjzaDhd2 b*@FdB]Z x[:GV#<(8@AH. hUn$!Qp >)2蟍t[Y;έsNiA*#_b4DFI] TViqq7 OPp um!+RTu7`-Gt $ ARs0 2d2~u#!`~U'7W4g5;}mzL/q (ꬬo}ue./*&d_z_N/xa`B0cPqa\87^kzd^.7HE_iwժ/'ӻl}a$)aL ؗZ=%e'QlH[}!+V~((ED Z CHa # Nl>sƍ2rJ$V3+s7owv׈Kw'+{L B6nPNQ>X}AIB_=&7#S%qb MI8D#z=&R5TJVJupt;S {{Hd٤GDlG *S iz>z#_ m' $x!tyӨ$*o6gJTpvY]n-mx: ::+G">Ɠ͝t\Y,z৏h=R'BT.W?ՅN xeOO L<}w8@V.Ҋ!߭"m7~F/H)gph YP `j֊Q>a;ޗ{s:-</5gB% .Z-6}xJʗ2ᇠ 5gq#_ƿ5}LɅ}wq&/z``Ƞ<,N >`nPQq_[O109usE>me W4C%XLžv’_R"~IyK?Sv; \ X0CC 1x!WL6p?+zN1@*6G/c:!wia⛜\ܮTJ˩n5s2ʏw{Q[pd@AseQRR H 0>bP$ !ᆬp0 `”V.8@ < -V:䠄+T#p0.`P0 }(+%\P8?||ꩀ`;`}KMɋVeF&_ ΀Sii "f)GtcQp^J{;޶"_ ˔i"pASa<Ǐ<-l} އfIF1"1KH1QIpS $<J/u_P %C$?q$(A`􍽒4x!/| -@0_@(8`A ~=>>T;~>xL\ B@%g v|?pSuoɄc1dzғnxP/=2!`Rp(t ̹D/^GFkг|?@,WG! Gͻ NL0@灀V:]K2EH0!=Q,aǀPgTz`Â;H0` a yrX LL#*xHN%R#?I(x}m^ eJQIgsD`AP %n FϧċDUm`}`0KWM MɁ5 ml:8+`;$ML``0J. h0X ?g)(0@ 0 }oP^ }G.T!L0$p0``DOd (AD$?$w(ra>90`0 2 <i QUn~<{? _p WxS0y4zX`{Մ!~]@5z(0H8Λ w%MW#G.S< %/=L|!D>"?^%y| ` T?Ǟ%H$_}xd@ A| M 0"?'hFY BHPU}"AB; }T>OZܮֳwww`C \". ʠ@#ĥ`B$& <5/8 gĿ!7 (`.IJ`,|i9H&kQ69|a(q0r?iɐۻN" 7F27"c>i[ m+Uu]FcMZu,pF|. 2jGi`F8N7mN4ds&oZ:nM4uℕL Y=({):'r]{-,(=o~8#2"\ё#Eɠ^ }SxA<=7DG%7 T_8Xfbt&EMpE).4Hr4W "D`*d\~-6_8t>Pˮ>i3jS D~b{M?ApUkc1'.PFrz ڂ?=QU$W8#/^:vp\F}.I'*ψRWTe?P]+J&Ot)\4Ym+<Lj͗\$T$<2& `X}]> 괹ߩՁz2<BXb뾄3J<]ߥ$UF*4)Ǩf_:i謤fФ) @0Fu` E AU;Rp4A*QGTr V"t|#Op?t)>B]w8㧉? BDW0JA ~rA/QL+K I}ZcJ3FbJ]-@sh7KEDaL,~Y86$E`JWp`0#X(`.Ļ8F WOY~O}<ƏQ'S"V|x7]QsOk%p)@pL$r#}4T1 ` x0KĵC`:`0&@? 9 !Ir3foHA'*%%^zOK~i0QtN x f'lh\GEG5C+oWs9P''@@ %I!h)WeA* 02`+#PM!ld bNQ(#)``~ʁ.!Q0E=P>BNs:i$(2LBD=HS^^j +XIߦeV ToWgs>p*\% x )"%c~|bB`0"`8G>D%Nhс.xEizc~ *  UJ5Jx J"  IMި )HGL ~P 6X8OzRu L7.?J' |nѲ!XQ• BЄN. AbD Z*cf2Irpgc< 5A pb 8B^oL @ƝAL IV. .k@0 7@|)(((>W}W0@< `<1ZPRy `|d CyJ>|>;T^;"n u@>_`i  ~_iti2(x=9qjNp-Fm o0h:0wvI(T5u"eJLy^\9PuzmX/U3fpσ?p {*p %=@xX_$|J.0!QpvGURbY|Q$ @-/+xS mlȐ>&6Ý> t `hp?i]AEa:ܴ`|)!Q0釨0 g/ l,-aF@SE@ x0-LJGU@~؄OayǿCn[:.sυ:yvۍ'm-ćW?6(7񯈮g%"Glj?, **9OE ?w.B*^.@+?-NIӫ۶@.)x#`r 3%`H'x8_6_vyy^yZ$X2@)/i?wT"(dݢ"vF ~c@ ?ZHb|Jl2 )~W*SHʏX} ['MN'8M{"\UXjS1YȂ[C NENUj<G.v4Ώ$ELgM/to#C OO L0+Al_wp~6w=%&O]K0wAtcI΍!heEguK*@ M@ীK*RR@Hw<З&;TJ'߉sy7%h8]&#0t/%b%R:<}B 0e6uf' =v#Ȫ'YQ2:Dm tZI~aDǶ&^K R4a)h%O rl&GZhP@#Pӏƺn ˓SN kVqqhgdGǰdk,[rLk/E@l@$_a4Hx 4td".1p$Opf\С#0ef/o{8$_Q{ܤQ Y)lv3h !JCYJgBZ}kc? qJcL,SW>kȫgWOw9ɜPybwj Q#4*Ep-vcP|gZ,fX8{.jus<>lnu-4SU֑}:SjUvH8TM f֚W0BA/0_~ @yyuyjm xWĥJ}{%p JqbG%|ۣ@ 0 Dx|Cqv 8W]I>_ ^Z4|GT$i0Y35_&Ȁ,~献x޷ 's{gϜt> 'TS*+F7wi b_4K:3 f hAp!(Z(1 {N*J>xo7Ă++T/BH0!E|?l-P<+!*$eփ %12Wbapy'.@ҿF~.VAVd)abZQG+Ǚ%pB_A@ЦAj= Ģ 2؜@< gH܄`?g6x)'Cq * dFxfA_0ᔀ*q%Lhs㕷h& -b ::?N윗ǃ>/!Fu !* z4 LiD0WL ǧh "'6pvV5 `= 00P0@6 b#+/K˟V/ `#IWPEZHYj AD%x4(R <.?8p)`<# 0J{Uv+̗p2<# :Uj>V?iYxy4Gl <՛9M;=Qp>+AzfV.4( 8n[l^f鿹.48p9ӴN"\0l󤰁 ajty:tʸGP?1@eLL @{Ċ#PN 3a*z8\Pt>ʴѰ0 TBuR3 8 3 /yz% Xx^ x:\4w@KǧMıPKNY@(bI[/fhBJI6+ vS%Ois\J^^J^]4K4Hg6G#ᒁ`+t5@3f̾ӬG'Ϸ|S̀xH8 ``W1V= ` \%0`50-41|q-às$BE* PCQroP%p8i`ت(E` F-[Kd *nw;azcžS,{E'":cyPwãFx+sҀq&NG H WJ+Q?\g2Ҳ$c =RnAz>x jf\ѥ5!)PB  V?TžGײ?0m 0A># _ˀK1MDA/`lxSRڿ0JiE 0Wm ͅ#8!#jPy~@a DB6*pU*4Գ(uDL81m*( ?D Uu8v{2t+l! ˍB^ /W4xfݛ OB=v'm†*ߧDBay(ȼaQ ՂBA*/d:"]} 1T$c ^@џŖ\*RT(拇~uı.0n.U. ]_hv^p@Xθ!A&@OT '[.'a0Gjm!(4/ HBP-HxBhG@(fv>2e4q炚^a#I.荀PV_P{>#rM8e<3燿m0i>\?Ѣ}R7}4o2<3:YvtBPK55c3|&WP$>m_"jA=6L󫎋.=β3f,Mmn8)Sjp{_D8+b&(oWJ+sRh>Q't)K3c涖?X|}mڐ1.'MH'I}C&hnc1UP5,J{<w*B=ՈS$W|{pMs?O}M]k'.I=|4bZW|@b\ XwhqX:J wJpH=׈W||Rε>T2):(ާG+ kFDSʺc=O8`]& O*H^[Wx.^Ӵ 0O| az8:>+B i!Zhr?'b2j5R@*-!O[USe?!ᡢzMp3㡀_E"OFv%S)p #G0Z )v}N)uW"731xS1fZŇ7%2 LJBS0'/?Iu.u'm0| ; 3*Q%%Tg^SS6>SAm:\4;9cc~pd}? ?zT $:lR5MC!ُj:ֶ~xxn`Gf.Up߅@ O1 i܌YoF5gl/쑝Ӎyi2:P ] |dq%ef4ah՜ #L~8"y7(kD=JX/>%{7 M2PDu_3?JtdˁQ|@g&lTB:":hڀh#U%;8z\6cu{!B;Ȭ2"X "TTt? XW;ٝ=p3Df.ҜP2!F6&]g ,áL@ك%BT w|0?>[z+aۄa4 |} jTt$-{*Q\RL\ }_Q؊-葜/iȋe` J +?`:2*8O+"`\7o}C!au"Vs+ i\IO/jφi8y a\3އp@-xS0p`<đ/* 0(<.V> _Ґh4np#_Y* (/剶 ΒB0^ 8jx@`EW4 `//8El2`xJ.qDl~}. JL80c,IS>x{x2ؗK"W)V ?z +Ղ"}5;pԇS:s'+dMgP C]\~-INRΝ Xѓ %>%.\   @İ`}\=@ %Є\p)UX0! N-(x0ߗV◃$$+` KɔFߤ"T<q %_bT0V\j0$p|HȫKK ނ^e)Tڟ}Dꪖ|G6_{Uʜl AT衲`p<#w:Ju[8Tt2sd~s.-B5&gpVp@jIpF w=I x00|]  ?/<?x#oDp?P+qr ҽ !wݢ=z=KG}YrpL-e!(hI&8L0?TЀ tp^r)Ѩy<x`~Z-.KXf!&KU#4>Wq?jhj"bP%*A8?9 @4  ơXv:`_DguF Zkz]ZSx`B4 +k`~?T#*?@b]Ր"}!2p؍/m0µ]<+8̿HОF .rvk%F><OV @C T^p)TޗUB_ >n8Bgđ(G 0 L8U'F0z|_V5 %}g6LhXfyvUlj2sBNxC2C i= p /ToApSa!>Zhf۪zv1M}k͐ưpv>չ8HǮ4nW ԫQ)|pw(ߤ;= d >qġLA*(rOYuM_B8_J Gc<4@x%t) 0 yz*W<;sEL$ θ+Os4$ ӎ f2 VI5 `:0/P]R%X@ڧcVU4 `%`;8Q(z`ı%4 #(I 3< h?xJL$ T 0+ x b_.qBS-X4"G0UŁ2!%P㏏R2 93KL@,J7).J `P(K*^p`9 +kB`* İ%J@g `.M dH\$!(> ǔTv<g3}^|0 El, t#xGSA㰼˜#V\&ZeD>R={IIœV$`_ z@0&Ņ+".<3:3H34r4dg؝)y<㨰hF=GTI8GdKǥ`˭{{@,JQ]8c|Qj7Tr]Y8fȸ>:&X`#/8%xf`*02p=̒P' zj{`ؼG>o2bW j0Nf4̞<)\xʙ#p4rW8FNɥ\l^]Q F|I<&h8_3'<M"A~'yiHiwA0`DdN;&Hٸxfڲ3x"62!k'g>yggL|ys[|ps?`p"0eI`Lj G9rG*gf$8q2.LGpURyt9;80sƌNk '3lp{$.,xNj Ǔ~00盹`;A O0`~KO "> }RDt?hD!ltʾI8c~+RLTaiүv>=~$#\D3D[@"29)DGpX:Lp#LG]`A +W(V~]SG=Ks 0CP`P!R ܾS|(Y A 3?J4O mmh$!U8G..?FS`8@N`j0rڙv~]WHAJT?c:%0@)' r?,6qbnT*5f@)@<~}wE[4A( `a0t`JL'PK7l#\/~}@BA!gF pA\H/`ոH.ֲUh[24A Hv }`B`"%Jե'< wp<"LYp|!+B|\]\ m0gK˩qˀµ{1. c >=i|ذf*8(XAbp(% Ni\.Jx[(fb<3 a rLys@5$*uB3eV<鐆 r^> xB!BrYL4VJPӽ=L^-'A0`̰p)g)mMAX?!} "'U 5\Z=MJuUȦ%75yc4dACMpJ^~o `I.Sx@C_ÿM)rrĿcqS# ; Og~++|WT sJ>usJΈآߔ"oT<) 5\Ц7rYz4p3>N[7fkGI F'H;֏`Rّ.UHN$?wISP ԓxV, Ӎ0vs,׺>% R UգxCGOAE3 <咝+mg#q lnӯ$ý2AP1- _*)/[9F|$~8hu{XݧMRHy+0`+|}J?wp1 G)FOiP)"8u$s'/`}a(YޕWHu bn s:k+?O7='OR^>S, xJ~$*-U K dS`z0@@)ğg 0!` U+d0CApv2%X@á D8@DJv@ /V$XTãW,!S0aL($Y OѢ4$ `/1* | )U`M<~y Q KxP=gp@Yu*CpTpڑ7Fa!!?۪ے/O B(_+h9+Or?p}LxSa `իRbL?A*V a@^WΝ/Du  :EPS ?<\}_A$z+ǃ/Q{@ @gv/E7z~DiI!"H`0X0ru}W7 so9wWngD,Z>_'z ?AE?.nD\ \<>K `t@v* R`Ǫj|P `|/P2TJn1W]U+U~ҧHCxe$ gpX\E_gņ'4p`#O!(po o8J, +fb!;$y^eY{>Xd[ V60T#X8@@it^[| %{74ՑMO R_t:jT}ɨf!S@CLCF! s"CK%#ϵFi70xf3:4K?S8V|38_קEgȵGhz|b 1M~L ? FSEpI`@6Qp0"h*Wa006|`k#2pQNxREB% UXO@$~y 9IQy`30td`lO)p3V`+Ip:;A*SIpp I[yb<+OO;JI))ǴZ$ Zo0S40$_ҟQI\Nlt}MR)oH E? $!):Z\; Rq9`g@ ~ib]Oz4jrHSۙ ]=qĭe~(8Id'[.^O8eZ`ā9 ?>c 8[Qp<ĉ~*J(|KT\Tgd<`i0u<.FA0`GQ:#IT^o_D#,* 'Fn `$KenGբ3 `8 ix@>`_WA0_`}KժT]b"HE7VY9!Чڲ Diqro=wwHWA*>΍Ro}BνΌ-f5] a`ACk < pK!VwITH]` ~ը6 LhhQ)__SW`AHt(:+jBP0?-J:ށ͸Ec0F0`z@%+/Z0`J?V;`<K' `(QpA .QIĢOV>=>jmwS`)@ZG%_=QxZ`l%AH `?[,ma3J+60u5Vd~`]pᓖ}A+F0 aX< GIB'`Q=0$)U^1,K K!:R0x#GC? |gҨ:D`+0?UPG@1Ttm0T0_J6<P!CA+;> Gp`/Γ9:ǀXϧy* P#) CR,ąꎉA$8_ȾWL'v}fu9p3 зHoH1% YtGzYT6 H,PBT:T<-Uhh P秃 >`( ˈFG8`AAτ4FD"JB8?U|?(˼ऽyƂ#S>{@!%G>rhMְ4aw{sAHM!1*Tdd؈AG^JA_pf`)r3R~a\`tv1WdҹǩLa[8{*g(W {iB07vbLUI,y^% TׇC7u™t,3޼2BB" u77 '^%PpH>"80@+vmO=ʀ|oz!!L(Jp|"OW&[ƒFV9@*_$0 (X h~%q~<p0OeRR, b'L|Ab!$> (0@KAG .p|>7`U"|iE@nwݷ &w}6UbSW`W h2n4/aY0M{2M`2p H/|!KpJWk^W)0 s&x38 A:DO+,"hK8?c|<, e PExP]#jer?0 +HsJ7aDN7IsLDDdK8tDl?'4:ѽ [wٍZ8C2JFתEyT> "B*1 dZ B#ca`R`B/eS^>|0EC <tnhLy톼T i`3p ?֑E{'L*n2>C}& 'pVꇧoר+H΀BxD4q8fbyՑ<=a2<,GL`y@1TwIsW }QGkKZZ-uG <3( VAX`w'N[¡&IQ e(y8_Ne;zk~Ne3F(;Z`_Sex=S8c W+yv0UQ.V#0/Dp:O@p';GC$p+G0Zt%Oԭ8*}`3 1W&~ ~VSicR1*~Pt? >nȓaD2C/=Kxo)ꗎJ&8v1ѭ-pF%44Oph`xvD KĄ| d;^׸Gщw4 >.@9`B=2.0/sOh;T,gIBǩ'63~~AQ̽n S8v4q-᝿F^u$o*[ E:;W3 SfAzo|71 phƦm:Qx<@y"Pan8)A J3j$E`Wi` T Vp@S P,a |K.WP MyUꊞ>bc59{``Ce+#$c/a *%iwIPdXۜ*pp!fCe͌O\|GӇ4|fO6Ѵi00C$TJEE?# 7>»*UIA V OC0C&*Si4<<ڨfL ?.[`CVN`$UCʠK+A`~U*8ۜ0M+4urn-y&dB|?Q T"_s: xxʀp|@p8Dx`ƆD`L>>!}ɤ&p p0c@W>R= "E||^^UTUI ^H=|/?W_‘0KE m0%/ ^ GBG|ّRe㑃 b?5:9yʸ8k'k -䙇Hd# ]}AP24Igi|HUY˷ P*_7 ՗.:_7`(-ZZB q@C1Ls`)~/V~֎oӳHh qwǙ`\WU=/ic:DŽjQqXC">({De ))-8_!z|FB/u`!/ IT}R"0ᯚ[ p0^@$^wǷ3+Iu|D꪿),pf'U&u pA aѣari3t!|#Uh*x@1);2ߓ"e\۟o_UȘ˨O+3/|W D"0VQX:dܙ@`Gw +@i@ p8L"LJeFc"(WgfMU7 onMWѐuo9X_=i WegD(̊•@pS tX| T.T ;[<}ȷ:D-z'v \9}+ eʁ | /p1?π@'IyF!(Λ.9 forDg2q+ نaNۨxS%./}%`r.@t)0@y< ^֫#F2/րD1,Jpp+U3'=Dg(q{50_J8PMERa`L *<ֆ".EvDU(ِA^ ڵ~xI%?FE$_QS0X&eqb yt:]UH _908_J2:-$@Q#[|])~AFU<&kYTDL@Bpʯp 0/}xt 1q'਀4^OK<3} W_U0pϘe=AnkZb|GfőR$)ۃb]`ޚNِM˂*k`< ۋk(޽*!s%<~IQ2f5Qa,QnTuꀓH3Sg}K4=fwCxgn`B`捳 ѬTಪ`}2OgWg(V#. >W'@ k[>Z;6O=c  b@6qx `Չ̓G>#Y;fS]խKHFj!j.3 {{"SE:>*_7Eli߷i_w0OkO~0b@|$m, X8L $qZP9  I:%yDt_vbR]qW}4j&w%_` ^!WRp!VMtjK]_b}>f/?s7,z: ip K>?i;(dLɞ #N([Rb}%5âPCX A0 tW GF({S#P^lFa4*U[>]ntEt| )+W\b3Kr}ш0u  R*IvT$*1Ctux8_ϳIXf\3Bh5pet3@[K!{'j'zTG\* IT0E4(*&~-9@y$PC(HT1`NR%Mi0HJPv#2%C> {"~Ҳ /W@8BH* 10>JWP`Cď+V>Q;?J( ~Wq`b=%Q氺?&Γ>rEOhcQ>^4F5m#CRF%-WGfca PT~1de^ =yKC8v: 3f+w"r*x{'Z&yУQu4IX0!G]n78dFu1"OL0󁛻µwgT̽4ڪ3IJ]#{? co[ |(I MgoQp|V#7$'g XKi(gxuќ=L3KxhMrFG 54 sA Psfcž bPCV*py+PeWTi+<"978@p@)xd*_ N{ѬkO Ց>uGr@c߇GGP$0qqD35fl)(DZGg^X⬤B(@&0A}X's76H lu":GC0rzRvƟ}m=&mϤ oI8d6аt@8 U@<)( ,JǴ` C$0A($%T 0>H0ڥA |%VqsL ;?)C/I]:(׋ b,êQ'S8B0x蝱jgA^nUF1?=8 txnx DH;$(߃ 6f >tOn/=pO>$*O UBTD()-7f Ӄ_ gUӿhy,4 sfSCV$)0`u@R* ρ0>KL (0^ 40U<6e!$*`<P)sѺN}wY3oWF۔{˺fx ` Ġ | 0!*DŽq&A`:4S~+x ozXMϏ \+GQ u T(Ժ  qRA/Zr?`y' rP!~0 SxE h*TL DHJZ6 Zeөl?8*8fq.mž&fQmaM1ٳa;8GDLdT#08-WFq}Sw!c7SBPr?{dC;YIaLy0'HhЍ>)  jye8#JHqx)8б#vL> N=r"*"шL \.>.ß}+c5O|340Uq0ߔ'O:2Ñ˄RDO"s~it`s ꏺ(zL'E:*حt8@C/HC:L7O<QGISrd >O| )z)2Nx9?rÉx` _ ZU;bb))B8'(d )OHFƅbqz8pG-rr_buPO}`3x)yy*V#Xqx7+Ո3칧Nyp8_Ag0#t:H[9 [X0,p0-@/ng>0(g5]'CVw_IrnF<3o{R,[ `s@Aƒ ? `{$B>DR|O A/~*+%>@``BP9s/}   /&>7`ϔ` C@1_>`=P%XZM` % /hz h0>'<~`sA7O1"{xX0e`G|x8OϓRt` ˀ `$yIxt''$ uU? ,!zXAV,`Yw}~ g,`<`wP`:V: RA.N? h0]a + W P:W73 Д J;B0! A$KUL6xJv}y7v`}(0 Eм!%0?;^ x^%Zv G7|t1v{| @0s$'*,Iw`<`jV@V ~7o-)[bX0" OoMxꁀ U|bP$2,?z x0 pQGh  UA߳Zy!"J7{+x!`V問8C^?VG`J RlV *SUR`9@uB0 WUIw0@ *Z Hm᣼Aw\0KZ \|4/ p ۫A<=Q u*]l 0p0=2UyD> `:aT.t (Ї:I<\ / Y܄@~q 0>IG+d ; !%wwM*5PU%KBqdݴ` >JR P%|0`}A@qL rx^Єĵ&g%'ԝ`P@N.הCEQ//S= y:%ՈUZ; 0#`B~ x`+nr@XL|3" 0`AC"X!QJPCP 0r* ?j, Q }7X(9_ġ$JN` `/2hc0!  ?C`Xp>U9 K~a)jЁ]=8@@y`\ < 4 ` _ D 5(.^h0@6rz' 8yIUp!h9j0`A0<@hݣ8΀'P|Mg)U ?5yE?Jʤ`%yVFOA/6-R6H0J ]Rmy[C{3g^``:GQ_$;x_ `8@p>pEE p0%dGŁ],3A T~)T0 mȧȥPBj@,@  PBVbHC6U%đj_m`tJ3֒\ BP0~T^\\?/t _ĵ U {| ;@°Q}X2Đ`< L\tȠ8\;#_zCЀ 0Tą-`&{dI!Ap˷?xax0.3;XxBe[P@ao<Epxt/:{~ x0u xC0xyP0%PpA`<9c@0$ћ|]ҿoOTs⢥=P p #~Q}& T`~UPkӠ> ҥ}U@*8p00_cTk^@/?0P{> @0@iz<<E.QBW+kT @xd*Vu0>IxPf`ee&AW}v A0~˔)VnAqS`|TEbߪa`1tG<a`<ըB 8*O}9B]K_XtXx=;Ol 0B@yu!ϮJ8Jja䈎^#%a GT3U7N֡.DJ`;A|P!eUtJ`;`?@rWB#dPqD`6z Ԁ[T@a uJ0 TQ[S_L 0vx \G<''{ޜ.xbHB`+ap0U5`w #@H0 t/WUO0@| |ˇP=Lxa?p-V$(!DPaXOh Ag˽b>G@8 n@q 0A jA G@crksZVڪp(xKR -Wv80?V @0^}BEAxG[N?7>@ |n @.U۞7 0zR\P@0`<惉J?/3:UC60`%GGYvt 8PjTA`< - {_% `<~%4y=nx0 Z%fA//&r阑c ԃ ;.>  `}U}( 0x p$!uGV'?GSֶڱ{ @`~ ~|@) O%z*`! @ J ` . M_\0`<@ x$y:A0ygO|0`<sl>` <$ _wK/ *"AN12lp0w"Q|4JA W+B0`?(σ 1~X<v{Ύg^A_|U`,4^@$:%lJW`<B9}QX0j{G:àSLQ ^ xW0]iүL`P98 ?G~A T ?"X_,AB!2-P0 xeV?! V^v%*3"W uЍv]N  `: r@`GS#A `(G5P0!M @߂U<aKJ\ (-/Q0PAL *MZD- P`(@0 Q*9*:>?Ja@r"`z `W[~@!>( %<ի >x .UK.B`9e@x|+PRD*\$QvLl %.vx0 a/u & (^>S w?ު%8|*ՆKB@0IO3T$* X0:XX$>xv Ѐgv=Z`<;b_G |H/;{  C+)`Dd+s@P0P*@ @V `/uc!tAR S**>O]@,@0BC0`h%~ `8ܬ ^#!A! {SBIxWO{> +kjT80`:  ?WqJy@ BP0ށd 0`?~ _ Ġ`<\)@(*ػK!B)! B`<(<>n @x_4N OAđ .((ڹ@@!7_O`5SUR `G!*T~XwAA ʛ|bS _j^ 9f\,}Z)% bTP *:`00Om~$E0 0@|jv8gfp&(P]wv`0@|`./x(Q|D`A.x@o9$? |tC@B ?ʼ$\`@ /Uߥ:0uaC@8 N\Eb 0}Z>x~ 0 x0*%'u灃$X 0`t 0_|  V zuG@]T0H% ]| uAaP8@@|!gvH"/QV5/q ]}`VxF($=)(p` u((J]. ?\<P\ 0ӡv?/xyUDE7*?8O@B*`q?ĖW9?` X@jD=U E BzҰpzx(DUL0>8AH;ʿό<`<>Q) ޽Fp@z bX9` A`Ą?>A~|HT"~@`bU+sǯZG.o4ϩ%߳oO C?|8vPKu Hh(0| tcth`7A `<:<4P`CV?ʁ h0 x0 *]?*!yx%Q$!>%toIa{B8#0U$ic@7p38Q$`GY4_`&'À{0 I.WSKbH0T DOqp0 Xq Q':eDhS=b0 +J(DqL 0] =l@z'0!^\ 7ǔD0 :V _zϢߋ| yX^X' yO2/}+D PUK@DJ/AV0 W\:V>Ss {" OC0 0 53/VR @`8HUϨPup0.\!t(y5P(*8b_̾0 (0r@  ĚGJ/("< ap(D @4ˀ;'*  C՗"*83,P`:>5SVR#6ƔD>#DrA00%K 6*<4 V%iUK/=ʕ*<AAT|jժ.(@*T> ~H=7-\I0z\J`; &>0|GpV%V^/ H!#S{G@PqD ߭.yT{ÁsB0t %0? H#-U]`Aǀa]6K@;򟐾 D`A/Ealx 0  } Xb `|vGPR;DxyvH x0?K@jtNV%TJ9 (!@ %9L x^(A {L#P$AieH '߈=@`V%ĨRGӃ=<$ bR.%iHd ؃+@`~D>_ <੔)-L:M!p0>HD/5L p|\\$Տ+J%*TB2bG`tdN @0 dH%Db@!0)yֳT0,+^=Sfx"@W>Ct|;@ \lV.@qXBWP}l0!M8Xĭӑ G `Ep`8!0ʇ^TK+rjAptYu=uw Q w>R+TP0  /+RMS, ROHy``b_?(hN9t`0>IuZL@cTyݭ^B, 0@00FU đ'Qr_ʽmG?.ہF 0 P0~ t'AH4/_~* ` X ׵N14`9 |=+n%BR+`` $I:0` >?9OA z_TˆUe!5ʾ4#T?W;. x0@DYKI3ziPB)E+)ApS#Px!H\^ x@/AWxz\P?` *];rwX46??2qBcxŘ0!v7.V/ΟSIX|P0ʰ oՁSz\  WUV>=P&p`5 0~^0`N%.>:%zɃXa<,/4|B PG|2V x@G~(`<1ST k F 0!N+Z _ġO'> qx |} ~" xBEƴ-`4|_D ig`;D4_-`x'aRp1ǀ]P2Ρ `x~`=U@t @aԆXIx(u4'X7PB&]0FﴂX!lm= گP>$[>V_ů?UA<By=0>|PO p p 0􀐃00O  8\b?`Qv+`(%*FV^hfK&)V$Bg_B}T ,/(.Fb]AJUZ@ WVx& :]0>DIa,ppK?"!:p")*+qiw?tIT%-{ Gӈ0l\.Ǝ+K0@_L% hW % qƠw> pr Gr`Tj/  U^@3|_R(H*p/pĘ\$( 'ڻh<^?جRcÁhC/U(!?'A(P@R`(.C@,'ǿD#V*%fP`G% \`j~?#p㊾(. /$%6qKw@00`%`0!{bOJ2K^ !U$ jCG`~W|\\#Ctz`AbOT\5+WKBrp`9 HguBG**BI$ 0`OK0U+IP`I_d\ $\RUVF_D ax0@TW8]`<4^ pK%x@8CDcJH&%!`i q "g +;jaXxj#q,`b1`h>8p`|@ KUJB8r T+Txp <Q d0JMW @ X@>Ip9A%!Z)QĢQ`~m50f/,%.l`9F-*P6?~!ј}.x į|.0`ޥOa>cCg@PYFH ,>>)UKUhu@BT%K[e0 j!_ڎH0^ωcϧdTd4PR>^V3/E@w(gT(ET ` ՐB}0x X00cU * T8a᪋pg՟,4vSA À% VA!UQC +&$?$R6|7o۠`@ c& GhPB`|/OP$|@?$|| y$  @Ġ`G ]Ez(xa P!*Å@\TU0! xxGB2įN( R >/ńR( hrc?$6$sG.$* @`y0<8` KՌtc ;_Ёﴈ@ 2 p(IIGʀ!s xPc: N% _@` +@!3 ,mC`D.}P%*l Gʾ  ! 0`՗@1 8F"_ wpB A27@/ISAJyC7>GMAa+ a/%|.TLE= ‚O@^x}P@`<%.9p0 P%+ccohX|~0(a.-T{Yg0x A{8;$T\ 1Ruj26@y] qFe ` C`)dn [6W4 % 5_R2N>% }W(H0PL}yZ>!}Q1  ` UDc./H mh}Z"0TbP8_NT`0tRĠ\H 8@F8H0QP0 vxP'b Kfz^ Ci܌0  |^ʋUeSS2L `U`]&2!To2{Z\ PH|=ކ@0P@9ׄ`DVp?t L  OU>į0|``lPpA``C@030 <$Ip@Ճ T?4 /00 `@* s_'4p $$jWxATtH0v`0!cL 8 |qsMn8K`,`< ,1|H-@~>j}H>#C.RNh?σq_ u1˃`W˿_A4`UreYCAT?V}w(,at3y{yr^ p0P0 4MkW$$ˀǩ3xhx1#`AT}tpP ДWV}/‚M; XN|0  #痉=.;AH2|xeg~$;`5&@C lWX<~z\AV0/BP`<`yp0_J)<`ˁA0fl % Ap?C'5@`3yHȀx0q? p`IBa`<=CP?/IAv4u_Kxqr=:LBA.`~QSR8C %0 A KPTdOm:%AX0_E@j4`:ya 5q>D%ty,֟? ^ 0ā,h> "_sG4x0>cE1 `|Z(u8`7EXm` t/PBaGtM} Ð`:`;(0@v_%NdT`@<1 \@KҊO}K՗tdW=8<BJ3`~jv_jT7R0_ąJ 8%_a&H ԸI@ˀ^v|u sF z0@_ޝ R& a=!P.Ž? 2BB S<$T5*aV<*@*p8 <w& 0 8hWIJ\.$b_WgyCޑY:%Z"@$+{W@DzOVV:\\\&!'U*GW^/U0|~=Ғe 0 A T `ÂFʁEh|։%߆KTQ ofz0# Ux*s0YxU_|I"'&@`<+c' UV=ƃF.@8Km4X税 [300AЀ^>r*@$ĺ0T>BBMa`#AB o֋@_*Q, ^DbRF-K0@FKJt  PRƒ} 0@0 p/Up`0!X0`AՁzP<@m9P 0ꁀU˂ }WƋ`@"*3mRp>@K CP?ðBX0IT\R JA~~ ?.Qڡꕾ @`:AYzGs%₮767QBHШI P 'f< h0@ X$|`Dʂ0`6 V C.xiz`E[ Q@9P`@!}$Sn)Á0 *g1?]R P%JW1P/_>%@`7ISBCڿ*> TX.)4? uC^*T;:= 0A](?D ܯT@D'A<A@ P~GĊ~G30?q6¸a & @ "G Q؍Ҁm. (%pb hJ. 9A A P%@wAx CV$f- h_, x7G`9@|8  yztM! I9Dܘ0*Pa?>$j` ? B}*_4V>\z_`t E#|bX0>Y5_ ]_`:> a>.y~o~І %X(;|h i@1\ Ё|AJbKT~]T)s0!`y_AO\h (,'7 -8AO R0%P0 |Kc]' V0Ax1p _IB 0 ` AT`  _~ HAr%BX0` Jp ˕$ vc(R^We6% #0p?~G|8,Wρ.V@`?Zh,IT#L^?&RXJ 3 @.M~&*s \$n~ xI/{xh%&%63C -0BP~ j`X|p!neX8'a*N`~*(t g, ` N%tx? 0 * 80$`<+!9qA (L_b,|^?mH9@j/_taN],/ gVT`$ID`~ W GJ_ n`U6B?Up=1*XL 0Er$!+ݠWg@ %꨸~[Wz-PESK(`; 0%IVVcsA`ASb%UbN0b@0 z$PAg)z +j*U< >Pi]9| (I kp p@|` yx o^gP`<0@@M:T~ h0xxC)X(Ǡ_ ppPwSML*vɁ`</T\$(@<|_}QQV!/ JT?g>G AYPYT3h!)jTĐXX0_"RX295&kc@ pwq : H x0t;}  1YpZ* ^xv@t(T DGL+X%`"0!װ00 Z++l)@b_ *GPJ`yS _~M4 R`;*az` {g#a |#`(~ @A JǪ0`0  B>߃?=AL0`:0 *ITD Ar/~<*`<| @0x(bꋅ`3I j oD'@H@:"Qx0 0?DD6 [ށ$" J(_`\znd``@u!*/XXk DHP~|y>`>U`S 4DB4AG@0  }a L `~|_ A/v@`^{?KeFQ 0`<=A.x4`?gcZs*7% `w `|wMR  Tw>yVx@6 `AC6;.2> H`<0bZPv m0@֗DƁf @.SA%`=n54p$ 0$5^{s@0GU+۟V7p$J,|#*Ll'RT =4@T$-80~Z>ozl@w( b::0| ԏ`;!|! *i.vA\  `W..j .E.t%?S@D T==΃z)a>0 g6׺ )Ձt?! 0@/UĢ k>O`.E rwT`+4K$ >.->W6BXK/./f~SO@>ꀬ=qxWx`4 Pc֘GBcq-_˄OA j"pCﶨU(!< AbB2H% |/^Z0l0!! ?,>$-~,C?Sv`NKHc `0`U#AR-G1z3 Ͼ _W~"(J. ?@z~xЀ C8`y^%3`@4Pı)P`h0?"](~Z:D;e0X0q Jqv00@ x0P(A J .ui ( *r^ &\Q!8:$ t~\ 0@ wU 0\s"P0 v}P! x0J%cC̈́`TՏETm6;MQ :Dƀp0`m|%C]<=!/ggՉU 8!`~4\O䁀 <U,|?G{qXR*7PC x!x*:G ! T$(G.D>|IyxjxJGBLV׻Gj|C~%p^% Ж0eP0JBzʋxH0bP Ӕy ``6 @tܥ^wF]( ,!#tJh@j  !tv h0O")I5`q$6 p0оp*,{8cg@`UCx~>Y95ҀtyX<_JRBPX3`; p(0bYy}|?0<`ˁ. \`B<}} @8I7/ے=B 0!!>ġ-R:0ʜI`Uqeq3> H%/[m:eHC ?B @ `BKJtv ^%|! >@.oM"^8 zJ`>Dk (UWr@!$ WL- `e_/40 X0Z%fC<hk.aOuUPG0!|a0y~0!pzh) $ x + !!EP(%Q 6O(/Q;Eܲ x 8 ?UogX %J8I@8I ȠT? x*˙K)Cb!мk  td$ B ,.wġ ⿜B@ f}! H:Ľ꿞B0C~5Ao$x(4GT?WX0 ԸK\(Q_jZAj? 0>,I"Oϕ>NJ>/Zc#V`|BfR#A )p\ 0>/Urn%@KdK9X/7 A<|rꛞ@?J|xh/8(|%+~U?VO3Mg( B pC/A~_}N>\$ `ġ, @UM)JC8 0@_Q jV$Q$O7eW*`7 OhJb8`L!Q/g0X@`</\~ BA!+wx#vN>?Pal `<Gc7U)`X qqr`;0BX0CPO?bhXg(  0%yK0y]4Kࠜ~~PA 0TrިI&|a& x0 $C`^*/_`;DD p0ApAPAP$*+ @P 0A !V@"rD,yg-.T!j%|| ߲)c`4J ĸ||s:> 0"P$! KiXCR0r)` Aĕ` `!T G);Ѩ @$|T 0<p~՘%-V:  Gu}h'0ĥbX }tU*@t``~ZϤ/@S_x(Q`> Ā`_I,A@0>@WUT0dW 41`:A0PIB _}[vӀb`0P0!E '*1V 0 ~% ~V* f:%+P0_EW((gP S!x<`RHݧ;W^P`:Ux|P$ 6R^ΏU`!KJ8%aaIp ` T^)pDR$׳ `U % o0<.]%`;@6p@$`$ 8)S= XkA`0xz+AV 'ʽhUatA^ίޕ mH 0a,`@0Kzs.D=$_Xد\i^ 0`$}l/` .(4p^\0= P !B0dp0`:nF @" s =W`z@%oh0"*V2qP`3P`^GBy A1 `D$Q2t EC8`B. q$`Q,/'Pu8@L@ $HV иuxF|jҩш, `1$`C`AR%5!` R`1; h ATyy`I!@ 00PIB@ 2L` *T)jo0>eQ\3C>\U3HF``;AA>91G iq(0Q^0tpן_ hPA4"SP0`pB/.#K(` 0j0`%nĿ`P`0"ˆ`Ht6$ 8!;= pQ< nfvW0>4`0!~/C``<0bVE@xQ v,xb <D/(AM ?0 0`;W~X)y $@ @!+ ΃?UŃ dTx &2 p'Ѐ^  \ 2x 0 xO+̿z bbLF$ x0b@Ϗx{kQ2d`<P@uB (3 H<AЄ   0@^>S%6 XJ eJ@P s~ʡD+4HeD?0 p|:`xVC=\'ٛH$dz 0# , #ꯁIH_` U._ $ (4 ZtмW^?ρ w[*A\~ 0UQ}T ȖP 0@c<`;XX|ݨ0Ctr([4d`9@H@5X^M @0 V%}XCpp`0%D*ű@*:U ``A'A AKŐBσ p0o?p ?t$@`{ĺE@` _cw] qg? .5^Gp*sv|qrI<2 S>qp㜍M<3ES$ !3 :F`:< x_C ~e!1( σ4I#2px *Nu|IX+O6D&!._o1?Iq| o V}1^q gY8dPeZܓ~OzzRm ;O=p9= 8L%t`Aĺ/]B$|"J*cH0`d"L{ъ7Ϗ:5jF`/V<ޗ@s@C7rMe  ~ q}둃[/~*dL9HέK2s6^?W)! S@)Q(d0> `ER?ӇP}`~s/%PVs M*~%IhP8s)7HB <B "~jfO q:< uH p# 0̼ipy=X%˩vs < Ǿ=&J!g&=ES*[Iɦ>:_SIW%}^(f @&B@;S8!DP8jƁ a p|ʀ !mxJ.WGvky 8_@1q_p  wόAXC"Ⱥ/@~%x{pA}W< (̓:xf^yYg՞/w;jj2 g]%ff'Ih/t{iNl)AwB``<<ܭ.yU5p `~GAp@+aR`>dpÁp\ح|虧P)S'EC <C$00BPH|7 r _s 8 Ux0Ao\Fؑp .iA޾pL΀-дЦ Ă($XI0^Ã*p(@Տz0d"ش~x{ bu*˜(A|x>Pp? U"D1q4|\t` J|Kn*fT{v~؂@*}]oT-c@ b5°LpMbX ˜ ;5P>}ps_yiX0C0`yC=P`AD?UA@ X| O?Co,{@G H8g 甫Y^HU*~3lFp@*`=UΓE&FTBZt : ƿR 'aO 7n R,y+bm뙻7GzBs78?' %57ápO_xCSF-kpq@ @*J{grEΒyK0x;pta@paX!PN}v7|G?"1#$h͐Jc[<])`Oxc)QH/,qՍ!g:Y;$7Иhi/DuiH9b #U]߬pȏr~_PQWN58;A)kZx~=c/ea=$"_ {_oPΥ'r&+L88)F#=򬩜;I '*WzK)Gñ`X2;8Do(cN0#iUMF_ژ\z1*< ˽re8*;v&z~yׅKID4t?P?I 7QƞYO ;@(8_Qb*ߗb=]M r*~z36Q S:i'ja? ƹ |ȦX}&S!<ק<4.p@ߏͧ1*z<!63J}[ 9ġrz0p5TDW03s2CN/<p UHF[ί|F['ZLmK1Y< ٣F,䊏7p[̃`s}Qgs]';,:y;c[f5O} I'.+8kSVŸ}ΧA*pxu~UDm./Er+Gîw}>D,V8", 6Pl3 8x|0?)8?~ <'!#r}7, 0bA@~Z Sy/Z;^% ?TGbLVb DlKˀ, Y2BAKp+U("m70Y]EfnIPݗ; 0e?REt u WP E*è 'סn'Ɵ7$0coʏ|;Tfigq跫PB_<~B'CBH@`An~3a $x(.ڼ8Jp{iVXعLBB>OE}Bĉ6J˔Q4" w@3(K!z}G*L*| N B >+0G ȕSw'{q; SqĮt.8 !qDnt'%Ytᚳγ]P!N5llG^tb$Fk9+*UR ^&_(3g=3<gVp$*ݿ `4%8#DJhZ$h ĵYϽYzOC򖢙EJ mR8* `;D"`L) .sU̦43ʾ>0 ?@(!* #31H0! Ax 3GII8@~ *|6; rD4W+ <PC‚ 6]ImބP .B|%GwB(S 0%EF@0K///@!P!Ը8/PPP90`:.{'ĐR+Tj DpB<SID@Gh8fpM\g * ^A4($TG@v/D<+՜ <`$EX@'V0ng$lj_'{N AC@?`tD!#!:-!+ /W|)~ /y  ߜ# pʇug ,`A(KJ`R" Kj\q>AOO/@-6a_<͈O>^(4s͆yWQH ~<5*QGZ֨a|L\!(^ $aZt0-\ >18ήR)$+HS0JR;}&6#9W xD>ƃ?+GcystC [YA:4F8xCwqH%8*ľ=*)'e*->pg+/cv~Ljʿzc>ꎪyGc P?T?ESb]xG?XPU F?a!Th]?:wI~S4i p{YQpF</dt:r|cE&8H%6ق+ >eI8 rP ;MA T^^yMiUKޑOX8_!pKޯ`G|. .x9 C7V;|d|>W o̒O mGНά陼C r{7|<{i\}&v*n)Z98zO=:t`6|% ` AKT0@UR+%_97apAVD<ˁG4ٔ0G#+P,pPA85@c펠l zi^B!h^L|\*dI7NKt5ǣ^Wv9:P p3T D|)0FQ9=/< gJ? 8Q'c }WR&JkwZ:/Tꢩx >Tp`vn6 z`{ǀ|dp8ÕP&N\;#8'Sxd(&mk"<2q_\pswf6X`\3 i Gy8}=EPv:\U,H˜ Vť!J|Յ84P;  )KF}Gg|KZ~z3y J3CXx)?v ZAڵ+mZ Cĩs@Pp`: l@0t=U.9u,^ʣؤh;<hL4ϦwLd w 0kfoCzߵ #1Vy4vl+G68`XK i *#0 $HF3.KJ t/ ~0dx%TW"j?p Ouz *xf|h;2:qq+ i1\#zGs UdTT =R@} /.^?E#Ӎ ` 2Fu2yco hߤT i9Z+AsvN/+7fB0Tx?^  |D8"`:4t2 $,IᓇDw8Sot6myB֎%Ş5ru"w t4 9lU>!Fpo ƀ(Mpp?0||o81 `?./RÄV{í8G䎜FP8nĭH{FK/}>Ƭ 7t͆; 3:x3 " \)OwKb[{b(m%d%A_p<y3 YB,Ξ#2{t*&83 tywsS# + rN=XŁ@^YR//@g3oobqgzުILja4Tߩ`y}3]1 `<p>n逆?ޜ\# @GL9u~dži7MPB %ܞy)ONg:4Wz熉0ZCޅY 5yS>0+ y>?VM=#1"C<Ѕ3 6QbRpO>4wZ3G9B4#L-agSfNHT įWP %5Q`X?~T} IN: Dqr?r=xxdGRƠ*:zqפ [Ww `/S$~ 19@񤺰8e{,Szy֨?%PLB O%70Կt2B$+H?U*C%1`F2Ua*ڬ'3Hr.9I|&&4\H ) 9DFg k} tY+wW0?<өaYAM􍾾5:zu}>X~VՁN hgUmTVM[|z&3 ,,Cw?uxaG>$O3᧌=q%O)#!["/8?ޭXd?.ְp>/$ yx_0W,r/UEY|`z *D >r>$4ʩcDM nfLamE[: `0P0 |Fυ08 ԫ._/}Ov <|$@ϼHLZˋā*=gD$a\Q|#C`g[z#ι't=^` --MuGlw#b6;eAE't ꈭVIۃȽJ?5U8_c@ zaw)+{Jߗ0+X0! R 5JP9W_v@ ~ ˯ 0`:a~%MlFRVxI0? #FiISBQpB FS Ћ* 0@HW_}X`d>>$ϪA ~`?yU+_N?Uz0gQax[JMjϧ3 ,,acgq+|Ւ*/Aff':@S J[ JՂu&Ye}Zzig*~ @X D+WR&M#g*ʅ(* RԄ@tHq9$rQ`* pe'A/p['> IVWRH5 '*<3" -|9tz\7;r_u00!*UGV̾tT#`—.L-1afa`Qg)B MgN@տ@f$wx;')<[+/K\ ʢBƶ@E?0_w3 ͝o}{k'l!%zw&&)$bpvJS` CC#*>pz ,xB_ DaX]hΊ=pN?`.-aH„(8}kX4p?,nu7 ʑ:irJт MpBt–FBy:owЄC>N<鯹\hf &3kӶG*9=(Ļ@-o} @HEk&tnqU # {f`U\ˠd.g10 `;7G&Swp_֎AC.x0[ۃS8/0-сfd"\h8Q/^Y02}vB ~m @.,DŽ(!Wapg|Q\? _Pq yw~0Bxx XǀU)|]jF.pR(bx@HCsBm("?/5mm4JgDtzx U?v*>#‚+F!<*Hp0?"X0QAd=)`:h% @P2e ~?K/V3;x D Ƹ89\ 3_ 5uQ;㻛zQL}j0fE}8>`F3p;Jkǟ QM_/x|!z{V68sR?曟PbO+-|諺mnS8O i7,i%4G~$xA~PYͅ104!+J/ r4uXK웄_u˨7zG')BJGU {b<( iCM)◚?/x ~PqP G$^.D˔H  xBV<}bPэU`{TR K*|K^>di28@NJv0q\[!{^A[lt"\L|3/<+Yfϓ@~Io/Rʇ`f/V>0{ ~ |3B&0j˄ J$2%$ %0?yOmU /`(ؘ2V]Ǿ>h~ߪ@ؖ% $ XJUBhh"0={+ \@P^@7MbRb@0tH.]`$+> R}ǩgI˜*ˍ/ChpENg`/xf2PLN3Z}>aE2M 4G)x*K  ĥbYqsmnxR! VR;<িG!3`ŁTT>?'cSr(gMJU^* xxR .`*H?8}W?zr1&\ڹ= 6ٺksE!Y>$B?*ӂ#Hfp*= І8s7VAj?>8 7!j*4uNl` LFA'%ps(> s gE ,tǶ hv$*6gaA!0(-q~xE`AZpߝ FF㮘 }%@:a R,3~Lݘf  ;){}v H/~OCxgN+9>黋6bÚq=BC1B(7⠢#요(_Ou!;g[Ga8*@^; =SP]?aY|N !,W^V=&[ E+.ny"vJx%~V?.\:J IdK f D׈i'A ?JH wˁRHNW1OV  `\ KxSA % z 4wEJ0kUG~o~2 ! :|є BO!8OGYj;عcjzzP)GEިP7-IψYplbZTw48_(7g[P `B@QUث~eB+UXmh./.E*)?4~!yE!d.Gσ<~ 1 }N+JVVbK`\з6)?>@@Rb?4?8qV%>JUx>aʾX0!|)P*rD>ļ]>OU]KE KuS^>ކaMՏf~ JGl:@"ڥ% }8*Ŀ9X_.oU*%7 R'ۆ&'R2Fr8vXNHkp&ko(}#zxg@ :N*hzi&Tu|=.Z_,K%~8)x!p'K|:E~iv=7/ţ +8%\0W=H(nF`1ol DWA ' Xx4+ԡx<(4#OђRh=Ũ5?2N*4wE3iJ@,/v+p 2EN y/CqxNG}>*,3Zx8fg0 09'V8}'p砍b@I(H@ނ- <%0:>?꿪Tv8A`9PLW>4 "U_PDW`$6HVoD:%)R_`8P4`.`<$yiSÔp筞f;ń?{ ᓁ &EWC1^b7 0$. '4W٫ p~:{!0>ڪ_1+ `APK2:WUᒁAL`y @+@၉`@8 >| (m8%)(*;z5AXS(^ Q0?#EbG p0_AV~^%  Pp@A S هw1Fc bH! #,@:<A@p!_<_Y. T `(8A Â5ĩ?@ @(QM ˁF'ƨˑ]jWoNޢl`ƪ˕)WS˜@P"C04^%xjTx.Os vf~'Gι =#Da~0ɆqoALQ,T-p(@JDf4NBPq$z/y20{($$#mwq3Fx狮|"fT;6@PɾOldfvU p3 0ǧH8:]`o{|3:hh%|X3qᚺꋨ _/8EJlspP`~h<*UA(A0miwnpS ؖ]Bbp `;4dOa?"ӿ}E:>+uJ+κ-UMtG: wHqNq@R>=/F_>c˼. !(|<!H,/'Xh3T61`R@]2/R> eTw h0> ?'3 ^̑m6p>,i`% q;x8lPvM,*+]lDIz@R;N %V91)s2~AU y x _?ci ) 7O+3 _xx`=΄z>{`#3/;pGqUP4_&[8#!B&9`B!=@Y~r6-u*=Qj, #sy)ݡ- f1poϖ <<*wcb1%/H"ِȏ=GD{eG=_;%hy"o/.#U^l)t@`<P~|ʡp&V)į"v8W T-<35]z=ދ 0 O ?gSӲ-MY flƩAvtUv" L!$_(A?a$}A,2ĩ2yxSJ`~2@x0@D/`,U}JpDd^|I [̧4"Y)N$jG瞻 zu[{m:;g{/6ޟ^ׁG?S:O  ~_ =_i3d4*< Ǟ/#΂R?TPR)aCL;[ljbK4z5 ll: x!c)AA2Kx,Qi5o{4}q*'r<2u >HRz*\ .FC$;%jσȖ/V:j(S՞8fxeg㑦uY"C<<0-f1vI &xn9ʀ$FTRᘉ2X?7p0JVҀ`/K>]({ؖ0|r*Ā`GXBӺ|2Q79sN?Lϡouk 88$1f)&G>)^L>+/͠[lB%ܰ>_Ѕ ā#pp5YhAĢ:#*ʀS 0 W :@ `DؕBGtIW >,0/6 o%vA %f j22ePBy}„px` 4W@<]ʱ˜>?' 1T% ҵ`| `; `ƒ+-&/KXY&%pI.R%|P `J+˩!Qߩܨ!+.ʕGǦs#t 'L2ɽCu 0 D\.Ī t߈޸4oub b^|K 80_ :;gB)9`$@8~ U|iyx@dP?=1R8fwf,Xݐ~vP 8RZ #b1eREg$( !{HoR1x0``flD0(!A p |?FjU|:D!hS bP0G?7F`*+ H2*VH ~K*Bq>Qt |8S3 ޞ̸8*m(^x(p@oFdp|sZUnJ:$ ,!*:D^$z`VCT0HP`Ajd $uG ~l,ݰ #KD Q` ">Oϴ% ~%6;H2|edo)$ߜWI!#L' hh-?#'rx;)z@p 78NwY@(N׏x9dR p o,)<^XxS!P 8_x.g9! S>ف""`v$ 7uq*Qp.L^(sH$ E/ I@֩ХBT(8 υ:,@{(ǽ/HB.fE8L"4Pa|-}/38*P8e%%2pWscv:(, g '}0quwwbs7f  AP 0pT8)LÖy͛xZ3 7 q*)T>o8*saCx8}h ǒTF0Վit@\_%PJ#W?<,Z4pK' ?LEp2hNdD5[\Á]Ոh8lX3{5 D_ǃ)"Az8@Jaa cn H#jZM:& :/ئ{Mb,_|Ǥb_?{FS$ pLn⋕Hf /`bB K`/S8jج~=O%t,opz/ --jώy=[C$:p?(xf|Ypᗵ0ϞL%3>.'GT(2W(6#<` GP=a ,"S0Xp( "+Cg\8ò1,@TíjsO?FM|x;1k=N'S<lʁ)rxAOE'9R|2`'ja?" qy~mw顒_'lGg- vߍ .P*lҬ_F KO/T$bUU=Zʾqz>p1 u@1O/_ρ2^ oϘMtFL<~ ;ɫ]J~٩\3$)Tϫ|c c%DB wkpw5~&<߫6:>:0m>-Z .튂DD9i=`72<> 2쭰L4gn6?KM oL57LPdBB]0v D ?կρiz53O"Os)nnؘ} ꊀ%fLo_aBtgk`s=8Ytcf H ^xFE.[jb3&d|IDIsH*s}9e2k G:=+ka6_}a;\8{ uUΆI695;)@w Ρnp]rj\yR5W\gSL!tPQ𦟉 [U/5j'Ã;#@U8.,qGM fD!P8"[OB9SZ[+[Ipd9}.x5{ͦ܉%{d_G\zEk1r +?X|V_I.A .[z !0>$  AB/`yXm j%h~bg P ,$MX0 /Տ YL"n`BoycJV^^$P1 h!<P_A_O pAr;*ώy7QxXKx `\ yz]+< X( VL Th@5|./(Jap0`<ɖ5'xgC>Mwo^ӁN#tF.~Uz?./VEP+U9}Jx c8`_QTdV^prXt~JсL*@0\W)8۟WR.  ^EXCtyTAQA)'5 p}Yᐌ5c(-Sڸ7T}ʄr>ժ~e$ D$xFFw sW}W/y 0JC,B,?UT$E/àw`*0n UVP!u2p0`;0^`?`}|{ʋՃ]GZ'T0u^$~ _Pd_'awp!7B [4Yn *y=v@ n ^ϻK&

ⰡɄDbdg8&= ,OO͊[{j(IIqL>,Ǵ@<""~] ǕM}\op(<)` VJAƺd! F-CP>hyk Xߓ]ڜץ뒣#Sq?vj$F{0qㆎ) 0L80_Z:?((W)TA ];>lKN0\ @IR / |ācӇaQH0N6 nx7 )&5x\ ǴyWt.":,E+U4PI ;Ωǜ+<|62$Q׺1OTB(2̰ADp^` x #2!CpT;,O5@w snm'Y7;СN EEg}%8]3ɯTљ ~zM/ dH7͊fo9ѹob}&8f %SErx3y,@s^ !Gℇ.T +U\!~+1SxS uJﴙH|`{[5{bOQC'.+nf$Nh:59=ZO8K9 `)=ߏlu!/Mto26)z=Vx CVC3q{I(Uyq Omz5mz3 6 C?yK=p2AU7zywmsAM,}!?п0wK`9|F0F\>ﱓW>`<Ax1ObX@\P-Ss 0>ss{@8 Uj(8_r- Z̧cs|b0YӢ(&aP'@N 91ĂC6. 9 }Ss12p2tETpyU澧VR-rVg{܌9w8p/S, EG!K&J|>Bs{?Q q+o[Aw'Ox`ˌtI2`8@@*lN797ÁN5uLD `x}R߫Tr.`@Otž;@JV掇#IWEsN:3,K//@['a/\/r<-2EH۩\1ݔ tF̟2=lgLFؐ1"7a". ޞ Uk޶h," wbpLy|3eGE~Yf,idvA[#lu[Rb']Xs t9ŕOpo8֭Mu2 ]d0p>ѺN< @pRkj20tP3.:#t21;Y?Zq2P o &0FGs6Ƅ+j3bd1"<8!Bp>AcbЂp'. _TyWxf*d%pdշcr-ugO/'Ep ~|viC`yXv^?İdDgk j83:Ls'QAszpǜV'2~߳! # KNJ}׉ُUڐ .(JKSh0}ba=xF؎c|GEr V p  #A?`wGcBEƢO*/D`ARhd qx0D*hŔGbM.Fp!Pk{6^`AwGxhāx ʁA/7 >C@v*0`6^^뭟egxfu39amgxHvTU@ʉjU(p)ރ9ORX=`<Ձ`Yyppx 1)4ŠU-VuRPKpiT4 @JOO j~>k@ ZXfC!Ҽ/1;t!CS FR 8 ?J\x| Ht;h˕|?Á 2 OT{V t* ADQPan AB]W) `~% w~;eP01>|p@>>+L!,? DӀ (/B>\_Yy(pCX>%H?JrGߵ93=S*4ԏTsaXʄaK/|'CVG&vOtK 4D% NPacap L.Ƣ0Q1ې!2BTހ@0?" >ĥ?~UJ#` .@G *@xKQ/U-V xʁH3Vq? -N"*m%{)+4:8>B}UnPr05(Nɲ8P}Lq(T8L)$lp }|ŧ=6@kbGOp3?O!\ip+4TSw߶Hʔ!(S>\?QJ 0 /W{@*  xJL0T~!޺ ;os- `BG˽jz :Oq? FN "0:D+eHc\pXbxCp 8`T˲AYX1@`4=l%`Ρ(b 2o{mcgW=Yx8@Bk:`w<٨F%+Xs˜. PGc$+.tt?Kܲ(n P|_>p U^%aW 1`%Kk,oTyP) JmXWG BG@JUG5ZunㅵO .p>B,!06²g^oni^uXX`[ }S8z.xzg0P>>ATO:˅6P\ " "$>R+š +]sQ͊i7DGBcv&:<Ź+Nfp4DPTӧ 8rH|)=zx0]8J!M})8 `G,W`y_ ReSS8)ꢿ  ÕI夏~[FAOlfapS\?Ka$~>E0].Jzr ž p0= y ^.D~ y}_ցE'ҋZIS\` ?՗V# x=$1ouP)Ck6ޓ+WbK"#> TaMb/#[ȭJأ9Ц0WʍPZ䃬<`<R$B.Tp r-*Opfߝ* 3<&@ sշbE]. >Vİ8"!X 0 ڒ& * ovIOS'p36aJk}zW< z* # ! IL= xd?#/mX́OkF2sq}L3è_I/p5簖 3-/~>"H (%W043  `~^ ďG˵8&<2Tl)=4@'?FgSFZ9 mz`B mKIS䬌2C`AݣՏʺU2pi>0 <&| `*>pn В^$ > P f xGCCJC%swH:sc<:pGL'q<8_?<- q{ĐVi')wIm<| +9wM@,6Sg^xv#_=x O\*`&*$b':rvS|}9UԱM #J>_@z5J5(f;?2N jQZ*JĵRhBVD?˞:Bq h8`D14= @ @ExBUUAe  EG_1so ,{B$T]S\Zs:0|y/P(hEE.#2 O$ L$`D`t HJʇ0fEIxx)>/P^>U>B K)WEVQD4 qpAs`?xCk lf/ʬ ^1tXB0 O)sTTIu GIx,)X@.bXzwz{#`B$QToL/d8*oU2kk6rM¦`"SHpB@"W_ `( +#<] nnA6Nui+-\- \3 t B0Jϗ h H(lY?TBΟP pB逥3/x*'ǚpD%$ƜH]qG- 4rxuvvɧOf\lB$ #04h,J }2tEp{׳i;rVh2w{ިI` 9aB Kɰ2 5bB!`9A*T>#Kr :jǷI1 o e`M2 Rj=8}ߎƟ8.!txA8{I0J'.X,y!S3! AA 0``@h{̝/ xHTR`KUUB5 p`<`G<%( x0  R*] iU1+{sb _65NpNddI9# v T/ m@M~4 0A놂(801* | a) ,s}Vcl7ǹI,}  !vb`p>黧1аa=$ W IO8)+ aURVVXmvύ7L0t0{-yq [sš`O}>p*yƉx!G)z,qH5A@p 5h Q|/Zr^Kf씈d#8\ a*P_m|Q( q}jʬx0tW?r X^%G.U`իV`Xg›@s UT&`X^G*{OdEW`R p P@‚0`35"SN!@P^Q\?^ PUt C{)teKF œǀtFi,`<:_+JK)`jn~ k£BNG(+sp)R<zT*R^](MSuE7jKʙZ`%_b(00'JS!NE\]>~5OqFgS~e(UTEӴpx=}c4BF`mx@5J2*zCOi|} ՃafmLf V0J*P6V{JsGL}%]Xd[f~Qٿ}`lj#lEN+hqF}MPCwӠwJ0y~}OwgpdoO}=kvSƎ5]o{[pHj1`J Dmp̗ (3L8Ήsۢ{Y*]:,3w[+s~z8@I_^m>OPȽuBx8\C؜xo2 `Zx/ƂSZdh#fTpOY&.Pz=4QOqB444Ɛrl)kA淦Ӏ+s|;Si[RV;Hp#0S XйIp\$!#D+h%.pp/)pb4d~@1AP~ ~oF a|  +/ X .+@)$&hUݽ' (J 7ѼX~2s C  U_g RSH`| Ps^"ȟ9uArÇQx >s/m]K`SF?>Sn2j *B^$ F;p9?QÀxC/N0! V>$ ipB t~k* rxKT\-SUYYDY"8ˋxD%`{GmbEB@zb`{ KcϽA$!O@$u! 9$>!Jb0 $ #\*f?)ǿ) WiR|{(FGઃYH)?aŹ0:!`͆ O cftUɟ;2Iuh0@he7|d$"$*xKN6pF@ʵM(Z#%^0 v8絟8!}>e,:% aK=X(| )l0Sh@"Kp-:)IF38_79/z@+u6f#3xdswcU3Y^/& P;1ϼ&sx&n)=8\\@#C.%L.W|O\`}Ap gx. $e/t<]7# P4%ǗkPj 8tcJ8`rT<@~ 0|xp谂'NvqwuQ.. |TttTA@!Zw2k0`$ 0>GFKX |@qX~% + ?|-ox+Imq ݪp:>0{Gp?/&Tm`}${0ƤF`0?3Z4%¨}iu.}X?Vx)Lxx vЇ\#x"( f,͆͸!Ƈ>a͘k݈w\wwM FDDBqDc4HC?!PaG+FN\dQ 8opf snۦGvД,gaF pB^.tѷ [1p(FxwR0Ϩ>#P8@n+s7eAI{$cCzRUP24܆g+n7="r@WaA_F Fc`~D`C;;GWK*#z `#Zx< a~QtB|^@2 $\ @ ( (uSL;UTG9`w hh[ )wiAM>  R?+T'f0t>pAd0N>3C` ;#"p*j_6E  rYp0`Ģ˿J`p_` hT]8 W@ p}k],9jUMMԗ+ 3dگ *.ָ;A&l;ĂGO 4Jh"/UhZbPNJg @0@`~uNXB<`8|BXGB!VG w9`*q^R '=8V2eXeX;$dF+)y'Z**< Hڝa$Ů`E-ι</Ro4HDON{s\Nx.WFÇUID|,x(gCt;HFeH9͕ &:\^u,yV?@4+v>[>%o &Vs [x՝d>?:"$yqhi9I^> Vzyu}lꇇT/Op8EBͰk;tϹ꡴>"UAH0&+` 5⛴NN i0|:gAjg49N4t)6[RTOuCm ?c@HV1'2t̼ܷMs!S1tLjF?$Qg}IrnpJAp)U*." #__upȥ;zBw+4!wY7-aIC(x{Rt |tr}H>w+cšicZ"?Ht*=%V t#+ORJIQȳJƇ WԮ}O^yL3+XCfW+{NP aC62_ ؉ SnBp  `|/c|P^v{ `ET!uJ6):<~ D.9K8lŁ G̽.LM]v /b操B ;vj (gU0V=V~5'tb9@:ϧFc([N: rsd*e৳vCO$-} oD("c60R`XSf%d,`ӬJ:Q'>.!HUQQP9_L 9@}Rʜ+?$7$gTOd)a H`!n@b@  r2*)Pބ/\5 hj0_Tُ,IF BX}`8?/fr(Y3phWw0Ko%On< 0H~o}4 `a {*WE/! 6h%|8JO98@@(G_<uF=tyq:@tufGO˩͉hd$'Fŀ14j(YƗ$-Z{xh\f1߲00bhc8n8`BxM'Prf]#»W xS}<P$|'AT| < ׅph8`@ &%QGL`:oӊpٴ`F>;L '(5XEF0ѳ s G/}]<$Kc ``$<<$C`},6C qQ'/K\\XG$<#(0DnȤDR^D` Xb_@ gKǶU!8IA'?B߷A!`<`<,J Տᔙ8+v}Ѱw@Q\B8XCn) }qX{LUbX cݣGSL/ppj`P alyG)!/xLiho& j V~=yus}BYv7+((+=Z Q3xJ `5'C7z`'pʃ ,Do{caFt3OlmݰSzN;,b2pH8uތxQ BVi&::7La,Z] *TSW@:|0+r?)C0 Wȸz/`A|ǃ0 P?V>kG. X0| GG J7tq@m2)/o*.^ 8QINaS`;`BT(ժ`xC/ !z>(U M$v(_h%-҈#;eȠEhMAݖQ$gpfd2P0_$WȘ^Fx$7 NzTUy>3 YpC]! CPA07U= ЦQ\l#{|u#p Ev| #M>!SoQB}Gg%H`T gcg.낏A{WdjA'KAޑͰ༨D=Sy5Oґ/dbP~ap\81d!,(ƄC^HbqT J`G%/"`A(b$|y!Y'zcFsǞJÂ5h#SZHJ1tpߏ˕g/vKk~vl0?oIdGuVj4O 'Oe&5*\F(8_\5/dl#&kbJvIEJLр84S·Sz.cHFz@xФ*%::dDy3W<DAbULFAp0!`C p<1OexS'ʴԦPj(JN?P :L팻!Ap+pwO)_DXcPa@?̬8#% !Q)[ZHKK˕2x02k w%jåx"b@ sw%p\R/Q_Zt$ BAkzd_sz.ַ81[)xuuSjUX`%*z9 !:3I͗% ) l]rENu4e>{èFTJfX8S rB"s^"gMtB7 @OnF0F0p>f?:J U܍=7.Go/o<3#cJ{#d/ i]$GR| R0r6xikBzyGDM/P PΟG0fulXfѧ5Rx*>*8?>#uts5%{mOk D}=޼8pI)(!p?Cy0LN`,zD$_6.0]fPp;΀*TpD:_]H- a"Qޚ *. )'O'iޥ"p' .>UD>11&+Ĺ :\|Tt{/k{8hll2z x8~YV6d2r.gstfѣWĈO@D <2 EG q9ܐP~৶PO465OV}ѫ$jGJ]%Ь}x8 .^ʶ5 wĿ* :Z&,1(|{ //u4@? BvBrtG9?0jhEނ^_`t 7⚞n "ԴX/8(AK!#P@HiX8v2U0 e O\0?/PNL=CExT 0FKV9/WW,޾#!VjV/ ``u>uj`BW!|Ze~->Dr[)0> h"mWj>!u 0`} c`?TTbn iH|N2 HBi\"P4%%~ UsI\A?5p8I\#q(j%P>`C`~v,HP<]mwH[E vP'?})9y 9%FÅ@t.>rd$0%<j $ߝ Eû!2l)՗e/z]gL|K0@ٟP G֔J~~i  Q,K%:*˕)w-/#2dT;N`7$8Cgj$GAR\>F&H -RF- Q*S%#2A# v駎e;@< 2SYq8R `, ˋJmR `0$R)}8*ͫV\$xVe/ ='s?FK>6\=WW%0u~o^_ uA ww5L*1<(O߾ LT! *;\x)P0`*F2rɒ͍t,4j^^u' Aǧ˂w#.kDio0XWB cQ= Q0l `|*dD+7R>0:XCK^ʐ ʖ0@?/T |t)Pj Ҝn 'F, 0f*lij@dِd28k:0vVF|?*~uG%]-"Gf)OWyǵmA'{@LA}TWͧ d?[z=;cT; @!=n C/)#O%0ԺIe=06aj{dH ?a*)k-P*',USZ U8 ݳ`<\@<0~"JX2ÁF:G0bτQn>>}O "#6$6KvB6,vUwmAEjlFOz0?%Åb? T_}&XMBxG'\X@UgA=u?J\e: s^8DG~AQ#a `؈\O_`.H+wk N=X`"xDUtL'LB q/с2z2yHMf`9@<3ãS`Z7M[T<&)`397is[p[s)l%5ɲvj`܅8fJ${[)D'?22nPq( ,OyC6l_gѩQ 8Z05!e=,QOzsƯO t8d|bp& *W1czxIjz|K>ؗL3M)ϧve UEAKke?J.%?gyѐ x(1k 72>Vpd) 9(L;0uG:5[xSz'OqQ'p? x8J#`Tn? p>UAɑ u[}Q^C%F#(!9+O.<`_O遠p>+&\#+ LckmJbjx8 Ս-nwk.ߋժ_‚(G+0IQOyTP8`_*}/E=[zj5ETFQ~\E@߁E5s@A4jP`tڡ]%sNP9H)K@A[0eQU)HQ'_ hEeè};mOX!Z7Gs h@e!̓B2% _X0?UqTP~JE,Pc?^P@VCW_襨?b-< 0!t @59OB߇+.p'DzAC"B_艷$?{tJ^p*,?]^mgb0uw@8_( AizPmD&S  QY EvȓP9dbiLĥBH0c8x }P(AF%l&!^%*@PF*+U~cB``(0@ye>:o'GB.B/PP/ *#x0Ac/᎐.QT @|KWAX0' G dlF@* ?#أYIP$:gt<3N݄]1.O+ `x@oŊ4D%LlȂ:9TquYqrp(S'za23p|&xøޛ !NPVJ8h1 @%\ AG^- `?y`~%+P!KRp~4*/ko C͍ c5Mg;0dԃ |x;Gpe8( 8(p3CQPd; dLQ Hn0`#!WÁdn 9Â2n> sY N5nʜxPET 5An8)`i.-6^˜X:Q.|z;&V`D+B.vNW:h*ɹ@ s0p\"\2 . )wx3<8@[ &0 Hq#SQ,Gq!3 <( 2$Z(. I+ ơL˲ Ċ.iA*+AO |a=$OW`Ձ1YP8W/\(ʋ}fePꎪ:\.8J º 6xznt)r`#*@vUEYl22/yt04#,xj>˭fȲ; _9/`P3ne744:P0>X@//-Vb j^< ~)|[a5"<1OZ^7<KW ))dOޑu%@h.k XޞbN.;X)G}7p&)tQͨbwu@t 3<.h8_OO`-ˇG+:SL3W|R=DB<| q~ʶO/u 82dCT7Ko>Iol޶D}6 $4քc%'6*.8JKĂ.a60WQA .\~ Տ tJ#T-RBW°q2!-X~\< c0 !)a+b<NĂP@ z% 䪕aa{E`zUg=j߂5j ?~-.#`<%`QBpEF`@u G !my\z⿫3g0ǒnfF}pT= tԸѲ@ryG2k3̈aTt:q#!0Ǩ,? X5aᵺԌHmX3opG<~C3w5p?UglPpJ|* Ϫމ^3cU\]i22t3O ]n=j'{^=7p@קSF&5/%oi 7|ι7{՞Vy&r/|p}lL8%"7A/p|X1Sݫ->!xdxB铼 Fb.a22ay#zW$:bo':Efzz1ϦE/80NS ?a:akTl3x j( (Q!(ȍ/@g03{ B#ãO#qdEST=<Ïp &M%#|p :?Fx# Q:?3G{Aw<_dLt$=Qs 4w"aۦ`iY(i;m/<{5gd*} 4O'Dx >.V^ i2~E/O=Zs0 WPA IUT\3XS)ïlITXHt2zmUC#\=%y@v=pCU!~# ٍOLGNkЀoX qO:dp>B# U@TZ5Ot2f^p(VP%8Dm,,p,jj ”p>,KF@?$O3ј!SZl-B`Rz0E`{g>O 00`YHd$gǣݪpSO*} ^JՏoY;Cs x| X9 h1?`9aPYJK@sbpsE5 f}A/Cs@@'Q_%Axd# :UUV ? W*{CÐΩ~5U3͗ 0P>_/ynţ]:K*H0! JtJ//Nax aC/@`ɂ^ r`<˼KT7' @O9bX,PF. pFpSA0`\V %/`9 ~JU* zQř: _`{Y &A(Vāq_㩰B"Ƀ'pXTiu5x"BWixalnf)LkBƉa1_1`T^?H*.q%R9KaR cM@qp @y)s0z T\UhF*߂}'xA2|S "> b߂0>_T) !PڛwX,uPaYp)&b-H xJH?˰GCHyX:fp%C0, &1M֜@P!|A8ʼ, †d xpd;R"C 2nsm.P؈2$_΅0Xf㪏_C5xQPS#0Ms(FmF"Mpi0S `4FltD cH0tPͣI\% YTZd|KlH~8b#tX5YX-B}\N<,Bs8`V>ّtIBshn ! gO={ݰJ2222YV& s7w&{{vܢ@B82el}/0*^-.޳O1(r&@D#h AtFP"M A|=oS$`,k)#榉Ԝft7G+ цab_sZ 0S{i6',Hft)tE\p'P`'ʉ *P¡o$ g9WՃ? Hf ZE`Ū~hBh9<J&P a-ĂpSL| T ?X.I?˜uR\[*B\tE\RxDO] $惎BPأ4w/ޔ2"9h8@_?U *.Z0SE /hR*O}*mظQeRf myPPApڮL,qAO. D b1P-F=Qx˿ ^ 1Ty|g85Z 1rd2sl&ѬSmx4ҟz1@pjv5Ef9ӛq35Gz=R>=7>_+H3La U %sf&9i #y̾pF `d 0_'2^$iEPW\wS%bd߂>өP`AլZ~}?ձ Gx2ɄeM|u6Oomх iBh`"Xjuu >'#&WH6?G&7 %&đXއfck*Ÿ; I*`81, [['nb@19@9qQ(z??46!ayyl z%.|BZQHS~N?nmmax1@~7;D-T)Qf>#ZH g: KĵCTڒ*)M gU+R,t7Q>"ԂeS' ik#rhÇ*W<m~3^ ^#[ Vv'' j )gj(-8~ r MzƯcS~@#!HhL=mJ^;Gsu9)a2g9`G&n-zK仏\'ۜv| Jͮi[6y|+7  žF>I ^z ' ՈduqF'J3q@hG'kU$Sa"% kZ`c}FHlW'KK1gZdYzG9`@%gchb;J_innԁQ͚5}~ʉ6VG栋B;eOoGqS;3$sXȷW0u@>r?rjLgf0psWV|$ec}_}UoV9N͙V4#XX8?;E3 PT/ \۹Uަs>?aM/P5cs|]>DeIаzI3I5.JNR(O2>[I%N ;W8+9ǤȟOi\89y`AˋJP2xF(xK7Igd߂)NĨug”(7cz4(^";YwBUP~R\:)K:B*$H2 Bj"(0X;V dk!?(] B%mK#"@ڵ?@>5`Z6c\|`Q+.V#Et ,f)? |[á |Ŀ̹Yw%   x\GZN<%"%Um(^01%{x_6PW@' pJW!'xSՃ(?.D\^ HWqr`f+PѯA 6zB*xFTJ|5\4}<+[^x+S `d(UǏ%Ѓ˔6ZTI<آ4pQč{?Spe(*4iW}G4P l f(h.uIZ|R]*҄f^ "@0 5_C/_UM g>D.̆"Yp U@_LjH *(qT{LnI<燬hB><1P04#A *{دsp~%AD)Q)P0x0@_r~oޝAK1x4jFvuD) 0<ߩh *c7T"MX2]XnpUXp@'A(2p@@%,(AS 0dN8# P( /kvf|c,0"64<#?|P=}m0/8ؖ?PPAB\sm6S1- cBT0_T7mx>V`x:xg}} )IWk&UGW{GH\^fد47FaHsgN(#%FT"q`SI'u8cP*L 8"0^?v/5eRrBe\4\=.GaH0`> _CT!z6 QJzp0$~fɄ.h|w'?>F1a~\$`r)G)/p*|~xP'GcQQћN2 }?f08>H"{I,Qצǚ{Iph JAD&)pQ~[N4A{po zF=N'01q֐` g6K!O=vrjs9H),M7\]_ >f4m'1(ԉq3_9 #SQ׭Y85^mX?C} [K%>4߽ ̳bb׎D.k] ;?X]Sw|{YN>w{Qt/9_`Uxd@Ryyp?kggi:x3UʻcI}/Hx 75O<0M@H`ǚ<5z#~ p_i$" pUp;(FO S迺/r?O P ycJU3 pC$<.:o{)ꮧz cIU^!q.? iםIF& *O 4~8bI:Ag y|@mOU^ N D.2](|wo{8|@pR}餭ЮCwA&ᗈx @w4( *HCxJ}QBx0B@p88P<_@i:?*w ac ;"O+аGtf3zWjR:p}:`}OT4H?eҪ%MGïG}ZѴx8 J C/ i!TB$PxgR_NS6B.0@(:]$;*Xxe0`GS_'P?/zֹk) ?FW`[O(zG@!"80FAr0r kt,4?恸2^I=. T1`Q1Å iߣāQJ5/ΤlU/z uZRbEb?S U}Ra>i0Ga9T#} ('+eRF x`K1VS[T B0~;m|j?eJT χR3t! U TU?✃YBԗoݪ `  o; P0 wQ >@[@TZwt|pU9'  7 `Y n/`rw|*ERl 5xKӛF_~kP)h=jm8ʽ~"T~pp Txx3Dj gLgE1' <śo0&6:n۴*4茵BvĠSuZU}@\<)(JgPOz `>B.Bl0R62#'$xz"R}\Uz,x0_E8_}pSc=e?Q/?^U|J/Td)P'MC/>28o\L 3C#dFa6*9bPtpOHݪV0t!813Eh ~ᮼ*yIƂ*UqrOFp.#N֏W<+}8MLRNL5& aåg~AfVOgŚhXCLlh؊6;D&8A*(U0HL|* X$ȸ!* J&-0_1&L)pn,9 aH$x2' x9YsNmͬmfݜ`hl۝ aAztn@q ·d _F K`@9_`7nHO`aT2m .+3zg? YWI SiX8@QIMy0aAKƅQ{`)zD5jDǺ30Vݠj[(RA9Vh-pyB/$oԩ5gA jPB:aN`6P3UBX0_c`VƿU>hYbaNP7sú_ش(xI r@):Gt_İ?ד٘0.Wp/>AcDT0D` `8š A@%heW<xkmWR`U׍l^:rMˉ#I*O!3hGP&Z,,,O;j . a s\cuQUuAiL% 'T;.xAR)Gދ2˕/H j~tžx]@j?Prs'[24!2Q#@\8@@%MUrh}]bS|&(>?T$:#ufrXh.έSw(#|3QeWkc0?-&C"'+/fJ/iϫ)~V-1{sogzayMkX<:%k{;kteS:z˦"֤ >u=<4?N sx}wW:ǫ1Mncs{ƙ[CDÀyu6CIhgk%GㄕRoOQgTǤϹ`wpKE?pdJa{(rz!o=w' Rw ާ^|f61QcO-68)F ʾ_-`C)Wz_n ya ?0߃ UGa%kDau.aB`?02#ꇫ+6JP} zW[`}xmfXgADAVETur%2Ј)Pt 'n7# ^ ΄jf3IzU:q h|Rc1 {ď 3Z@C6H Te]x^_x %@t蕘΃$Gʀɴ.*M088 R`/q- TϿ˜DRA9Y,9  6 /mM>r,[i(1VU~(WO(PvKscE eH  /\lFД@{}SASo]K"Uqc‚@$+@RR 0@ 8gzF @CUePbʪ09ϴ8@_ Z$Jf約I>.U+R4ny7i\@|_q>F٦a8A}I &\\Ӏ+MQ(88@@*xgC:Fɲ@]'2 VT=&ǔ*舱/猈 \*Q+J3|$*[0(JHuzt芮4 $Fw:82xVH*42 ˆ5SSC8N=QF]s*=w|;W) S0`D"k:xeJđ!AG TV FJWeOa~Ÿ%' %{/./0d#:ϩ$S[r]:d *SGvԚ:+Ϥ-xSF?W *J(^@ЇxFPl#7zwӫF!` O}X : "pg9& DQokFN9B2x*ia~` R }}d ׃JRih8@@|X|MbhޕJz|30anATPfHxf%B2.oܨKo|tIuF @.S@k%+) `pCsar@ gԺf\hE z ` ;^ sl(>@ xVVFh*ư.}sӊa8{aO\ 6`*.S0j y`)W@1`o0TW w{@n`|IWVq C\Q2pPᓽ^ippǀl^|.tY6杛ٲw3wpxm͚{|P GpȰ8h(Bq?aĀg`j$_'bG @y?":Eq *M^^3*ՀB `Abԃ=[BuU+0pp;dI*•'>r#jjcf` X:n[+RO03 `J}Oǀl}A@z=aAD U4p9$)@J$H;}aNc@ ^ 7ρ -01/s# :MHR #W֓`}K@x˨s@\#HL"@U C rbQR+>;O/%x]+֒6ЃBx$P$<ʤx}@Y~4)Tx m֋/yI']1Brs EDc@'b雦a`PHSfU"v{2!'kB}OtV 0U(>߂K|AG]Fxꕁ* y0Xf4Ӈžp ⭟X %z>}k,B}~d '5NOψoUܟq|΢Ɏ]*.x8_Bm%ASX:'-9peĢ_cj۵#ƔYd^2%$Vx~ P8+f :`B92ue Jt?Q~")"LPeE6~s?[l2J5΅ZE5@ҒT }||wNr.x;Fitߨ):zyncZy%YXIxY!K?{O-a:xg-e{Ɇ!M^):"jApЮvU>rp? - /Ku_O*3DdaxǁΕ(P=V;8|43/<5{0͌3W.㉩4U?zy֨43ivA<H8/f)&Kρ44Z[\ǷsSݰ?K{fxbxRJ .হ4 0^] 0ߔ % 8 K}}Kׅ6մCd!@^>#a}@8lGU VeW{DF wVߎJ%+Z**<2|m\"  2 @Tġ/0]QE42X-'h!@.BZߌ p DIhttn?e:xgN+Qa򱏣|y73/koOxg L:}> 3!ALDž04 xy8w`WW0raF P-t0 (UիQh(4"ӏIrWޱV"ŴZ"()2H#` 'y%P= <鬪8~P/[QoBjX(EL@_ڧS0!@ДVZnU V4!J(8%IA!z&Tp ω'| 'p`:@UA?h։~R#Gd( LS$x%}밄F %ҸAQIUp ̞|P]1>QBg/':C5h' `a&G<>Q(*]ǎ5} dG%˜(/ F<E%3@ {OѐwId(rOƛxn lj0)<€ φ M̹  !0C2P WT14b>͚I~%>@8EB)uʁr8 ąTO 0!D_PqCe x0 @ը+p0 ;(J W8;Q. TG0< \FO8 :rc6faG<] []&D :eAe 'wqŠ睷;MW#+'w ^Bp  'FOp2LG*7M.T^yJPzZECX5 uKį7w0İ8*6p?d#L(j%p J<=Lx? t%{vFdF|2`iR{^b}Nb!:Nd Qu# 2!c3ĤN ~!^0>PE^%mѨBd0@.(jF> sR">4>1`Sa߹t pl$ #C>.~Vɦofz 1 :;'+@r'|(Arڣ"*)'Q f͍DpN 293dF5/E3cDQgfΕ@\ + fԭp6:|%TT{{e% Ω$BLqdF~:t2'x0(xm6v6:sB8=93b˜kN}PmW07VwU=HE>%cBC![x#.oo8L@$ RC gSđJmcMtɌCVJVF E1a(3+ӦX1fh۸j?d나KUJ #?A_ 3+"j@Ew2c(KV?<%bqt\[?Lp™JˁU> G O*O4QP8B_=M>S+K]T즄 2K"$\%@$z~|tN #@0U?T]{T>Ǡo‡W}y\ى(Dw釹2ݜN~Y2*\ q}P x0R ?HDz:OV'"OeXc2-|֕=?` Dv5ّZv DGSb߀Zx*t4[Tۛ{'p pf#qy1(Eаd [~|G`p,/89mƇx9tm=z5T:g`I] 8ތ ̈I*E5 l UQvjvQ;AHbw1(!ZC6$j^+W[e }v@2O|TcGnIбX](?pͽ8fniބ9ׅ6Jd,~j :twɘd)?M$ܩܩGCPb/iSxB+l:f\Bq}Fd`UƎai>c&]Z6]_LI@ӻZ fEKg:z;ruwxg.UgQQ@ȿ9;Qijd#G,F 8*L߮zuE +) '\H! `ZzxGgrƒ h%3% aN4)ƚpSڤD&B-=<hR2s(!>> |QSjLl PSPo0Q>=F+:-Wx ( :V;ǿw=Zp W%A`)@'gXɟxʘ@ M]}2(={QBTҝ\ O;%Lz7SE^b8B0U?|4pucfX'ijU[L^+:6Ynv<,>gF@ dK >{A$GP ,#`<4BV OU4_ˏB_% q%! ՜wUBiNp#ⴳI|2ᾃ9{L~?^f`"&{>FH@_2EBE6'FJ*bX?</?4 bZ6}xwN 7d##?_Q$XzM]C3j4xԐfogA8R r|KS3W6{ dfdJsi{1dxG'Eߍ9P8`Q1xH3P:;nՆ2i=}=?rxgP*JA/ O hƜԣQ<8 t?C7=$w(6:fi3I=.!:a>`}f#@ 9tP^1V0ׄp~SKk=_0KB\ϵ#xcoQ-S}p*x 8\5G8)m G|'0E6B%x59 R!VxqI/EsO X'030p>q/X P}FBX]$}zc"GEAAw(Ll)i$q FP0>_A tO:T_ NJ8_g`#] h)j>A.0`%W _!hK0 `v@#$Ulɡ,z@|%ՠ$/|#Q k\sʨ' (1?`惁n?  /R u\ԸFq甩N}mIN#[@|d:N}aPQB0#rv81$MJi=O~q?oϋ G{~j^ϱ*4GXg>+IzʁL|Fr) u!и/׫?0p?" %>9`B0`$>$ ! P*Q24k˜ `ĥ\ %cڶ/ĨQ/+JJ DD@ H@Y1()@e>.w"t# Rvp3Tt$* 'H1HF GX&lX<Dن` 8C.)VC*0?>_6RNGBg_(շ^]q}/x#{ t rQe# d0`< .W ly|eKDPH@x? 8}6^W}VcD>d 7scBԡjǞIՀJs40ͺ C}!:*]tQ?t|:%< 0!bIx0'  Z)AB@Stq 9xf 8ڃ >B'wga W &wҝ|&+?`P0fx2Pؖ%b:]V]JY$Gj[0M2ȵ"x `:|$$x0@JewV _Ur"z?"/H(h_+ o-> )&n2cC^'P@@1<2A8HBؤ 9Ux9U`x 4[@&  TABL{ԻS_SPNj% gW(]hȣȰzyH+x/]Hfw 3DX| * hAg@4tl)@@1!u^g@V 2P Iz_0Icv57am, D`qA ӑ= D%@u1D?ΥHJp:#yO C^w炙a\TGƢ*`b 'v82^š@(gnA9>:_B(!w^FRqʀMʿ'P 8v]c<ө)I@10r3Lg⯀BEFo  x^3֐=\Һ(),5X~0L؈x!`0AX< ? ?WB *.[˧ (0x>$@1.|d h!=Ul}tR,P2J@S1z:`0SRAɆ) L(cb<߳DsJ+K:`? Dt`\3: jDۇ ޶2{-(e߲H|VM+onۢ[{޵b*c&e+$~ hl8L,D:PjWHZtq% +m1zx :=9*\CZ oq@3h BS ǭQ ?s*&>mww+3Q"NUR)hd H-m@:<3wlL@RMʪ'/R~(|q" M j .LW#PPwșﴺ3|_J!`E\jˇx)y8^#yqkw??FTצDA=SB\f: &֔ Kv?-ʘGGPubG*}5vJy4IJV`yY|xA| JDY`HlAvz3uцG},ttN#p :L]4Ԝ E`Vt)0Us@x DNokdw Jp#6srCuJ 4UL=exadV<a[*!1VB$:j |{G mS0U[8hHW %P) ‹ h ,Rx!G?S4CEm+x/=P1}x?B20|&BQt|h7) *ࡏƁMDN:p`VWH\\ G1`9pG5b? ))X. PQ H/-`S2ӾD#P9.Ȋ2~e1j6FN U\]pgXZ CEmD I f5QF/'kZwat3 `Z ucπ4J?R=";[5PQrP#Wpx|tRhH^Q+nG)XDJ#4Xd  vV )V$ǽ -|}L%*.Sn+xS T <Sgx!B]T  PK䮛YZ̤0bJ p)ToBB\L0p/@lw55 A%TXGJ~%?ocPR3Q&X`!έIXd Ue&wij(Pt[-RkhgdL</s EEAGP8+Sev4x]B)S7s 8@NH #8ZJ$\kbQP͸؈ fL%GW`^p7+TBtS\UV"@a?B]pՃ#O~='/ )AJ!j@? 4~ ʲ20 Ɯࢪ}O_im>>n|vl)'yқ 13'k2 CAh '-NaZFsOO0E"ů]^P!Q⛌3 Jtz*V`@ 7]'{ 9#<_X= ϗx%?@yR10H<~k XߊzVEa`3bIx)[K HB ʀ`xUJ$T_|fhC XAD%&/W_84kpWİ`>F~?tR%Ywƒvf΋ <2N(ԲCBGc c$i[L*`5Jpua٣t>mA.a_I\'xNZtYshB/~m_~d& )JP2:!h8Wm!7݋7G|XlV< T8WtqOi.F'57A :q8={fHJFI6-=6iJ8։UZ7y-`4U ^@,. vAD?sM9|\Pǂ\%1GN1t3",HߟkqW9"$5GYxK/ \錨lmGĵ_<-oe.@8f!7P8__xof! ǚ0h^:uBumZf Vr\TA;C^-:7”6Fq7Ac?ǸWxdt荢Ιʀܦlehj+P Ps?,-״SO4N2 CAŨ*@ j*B{SW Ό뫶^:XfQ0##E٪|3  ~t0ppw.Fma?46S` %^_>28ĊzSO,a!THaCnYOQz0zyDOi"xz|3I`/Ol| S~:u`M}j:L( ޗ+;dNc@TQa(灁 j"K/ "A<7R`p-s6N^$]ȇ2* jA#}$F]/#fQU0_v,H+S7!qpTv+BEj'x4jϜ.Q[6]QPeߜ#rସ{ ͒g~|{ U9J(vQYy@#.2#"Bޟp?wERp<;F Ie$s.5Ƀ\Se b4vx JV\G8`M@x%z p~ ItdK8 (1rGwԼ,/S/#A!ΡqʥfBOaVB0>xpECMgՉc.SoN+5y Ɍ։RnTBqqQ4xf#'k|MөYy禟pHr$&}>Td\2 iB%#gB`yxOM7L+^-fxf%pAx=|<7Ěӵrm D#1,mK wဃ h&qR2{oISMIeAd@'p8IՍt6 }x_.>{AL PqWuKpP\_jg`ǀ'P˜|VyR 6E>`P)FBGd?MWҡ cG=4# JKTς%/"bNg`5`#_A/#JD X2U$FPBRK}pFܪTb `82!ӝlu'$'aђ]ƓQz8k4^ !ax<8!>"Ά@'8t;w)58dd3@c $1(HaS<|)P\X)`A 65?00, `X6 RX yDAH60_(xp?YsIƢ21-X!0_ z=̌4voaA=@X,/`hn lsO0@ʬKl Ǖ1CB0cc?).7$|~+~j"$:Qk\8M( $|@u!4y<8N88o>* ϔ|xEgEP燛0K*V 7pD2 ,q*'Ã&x)xTdS 7BWVBЭB lKo34/"318xj##/8ϼA )R2ۋ8!V ҌQYda+μXaݰTgt逦@wHOm!>O9y?SPrG_yJ3T n`R LQ;,J)#/Va<2`h0>`rȡPfxX!U^b2R!"5OB. Uab?zvWCӸN6=Y|%+5 G FA  j;0'7? Zb͠XQ,xY(%}汳O`B Qn}P0~3fRS0@cN0|8fgR:lg My3p2,\ٓ`qg^m7ŝͤqXA?慀FpbˠC~j~CV2}G@:xd; 7%@T&9|B88p(f;6Ƞ7/xx@S^X&]^8|tHd!3eDpL\L *\ zWAPh3`JUw Y1:>T .mW_C!x RP-&> L8tGP /'o݇2%*/U0a(~%/E8$~*W@ؒ_^2A@!@%+u$xS~!*F K1P0`LKU@0QxqxI.BB ȷñT{LLsڜiODoGCkHƝz{ab6atVFS~@d,p,H$K(3{ R3\qn|tsMd3GRpG=׈kmw*uPS` h.uk};Q?*;3OY?WUr%tP`*i:/}@+P룒|N}'`WӮOXzxOdn!8#&vPppyFAkpVP⓴JI܌)h_aeŸq,(щ` jP.PqU8yj:<?DžKA 6yZ) Tď}EW'( \JE; ^HSA4 b(+ ƂҞZݴϔ>_ަ @ÏkHaGYwYY2d%4%/ZYBbrT::e0ژhLV/ `#+_/}IY2>pH@@]U 3.J %/L :3N4Qu"7*U$yPQga(QOgT3٥@20O?zȷ;×o/t;p,ouaޞn+, S0\/dAҘDbVw?;2>] OMb7 H(2 ms 1_Cz?cVc"59c6TKN T%doJE!cDl42rj% pK!<@H$O4U /U>N3}S{*?焜xfʹ f^c> Uij~<;O |Fd*/h p;'^$K rp)0Dp9}In=UEɸ4S+RD/YQp1-)5WϿ-j+.B"~8=SsBQ!pBTڡ/DЌ] VD?=5IĻ{N;(%:|ygȀ}<՜V}YԼ`$p`|<IjD`F],/"2Y֎ET]p)?ǎ$`rx!\ *-zӰSL|2J 0!*|ҜD.0v#/=p~4GI/C!fPXb:%KC#{O4O8dGezCȾ?R( P0? HbX0V-R8ӞPFBt+.<̪o KovMjo/dIcG} JO:#$88_4t)`;6a,Yyw+qcXyPQ˚U L%a@CUjq7 Iv$ SQrp C=š0!рpӣ $= Μ& 0^?0 ĸ 8%^rCAB7O> pNWbmxXiMӱ٧6+xX+*l4" Q2cЀUH8HÕ+XL$%Ip@]]()z4}SH#)B<\(:}Cx5u)/w[a&T=[֌"0`<UCPzwOQ|G㲣oP ()ypPBz>}+%/΅0H$?.$KB^%PLB'teQt^B.Dw$)n,CB$ @8瓌PDVF u` +ti["' s.׈دo@) CGZKoD$HYDz4t (S> @bT qׅI=t$߽,Hj-8ilp%:]脟ߩH4Ǣ:@xn|v `b'Ub=#_pv°96Gp@΍m9NӚEO{fHFDG,B^|Kyӝ dJx~@%x |^st`b ' RrL%)\ef *5-LJ oTyW~<"jiS]QWT[>^ T@1a,a 9P!C<ރ)pxApKT>/] _"Gx!T@ !&*^Yssp3.A $OCcț  . &T J/ %C^ވ 8.T `r^SˠڠMìdY{  !^a8NOU&T;Z8g͠ o n$ `~c~'v-njx/h fHu:S HaXHPY~+Q]>pb>ڥQazB8ӉG?C=Vd+9-X[} =ZP vl<jM'R='`f2F(i=8CH@PCУdwN&(06C >/4| Є]/˔g#a.V%Q ]r?i_ 009AaP8_JHN#qQmAN[5(V} 0GV@ 5'>*U O] Ŀ>WS*=?LZ@#a$OZ*,m3Awπc*Á_l4l,...Oi&Rn̪Nvqqq3@w,~@E8˷jDLJBqZ RU 喝%;Jd g _rN1{ w ?l~Or A.+a _3zb i~%.7v>`A:C.Ѐs'?(iGXZM 0[$?4 <`<3A>dϣϓ"BSw ŝ [>x8Oy]0IP]b0x Jމ'`BS=6`M֬@}#`ys^( ? bP0?40>*`, `LG$c9| PY`  R$__x ($yc򇿛&K ۀX `qO9s@ߔ<$ / T a=9'T 0 K4 ƃ| \ 'DCs@U| a<9'!0' yPa=B- 0yPa=9' N`:@yuI ڨ{ޘUA4/QP(“Q$\ݠ OTMe>`;0&AM|L`I=t \%@vA2 0BRU2CД `u!B//DoT(UK͙x0 @}5V 0>>$05zW|x@,` CD*\>?˵`q0X0 (`KUD A/p O v C AwC ^d2 *ݡK1C%6/A!`sN* P0 B]AH:V4yT$y_Dx96qu # 4A`|>ʼo{P9V|(}٠ ;5LlG `$ D1돪\n}͠K4d0@u T"0v)o! f>R?tz`(0_}SݸazN8@NA,`޺!@ĿR:! >ƕx3| 7#ڪp|0@І$;:`;đr埇ӂSO>ta,}{_p?`蠂 h0\% 77aA GS`(`}q#9GNUt|JAj;@sjĀ`A!L@AR=|C t@`.(.L@`<=YÇ#0 *:׿P/4"O~H ^" 0IUK9{!/n2)Pdp`8/R x!@a:IQ`: D=+]0 `0yKpk=G4  0KVX>`~ ʸ~`%H):# ϵX I(0eյ=.WjL? 0 x!}Qw|)a(D(}N{.]UTMVGUS\>]_[V{ڠ@ T ˋG bXU`BrJ ( wp^ev|t,q+`@0 W -o S! &ŏoSqj@ Lv(H{74|HT*_   )n*;2+P2TmG,ez_@0!v @$ f| G2/ݵH0@?RJ (0>P>)LDH fԗG߀$ x0 yBk聀h b5TwLh 0 dV qpQ=#zՒ<He0 ω2[=Bs}W*hF%H@`<KXX8_LՂƀ,~ _VGeU(Cypxt0H@8 [!֩ ,/u=KyP+@<-{[`0&pu.ށ #%U^\W﵋gcB X x Y@#z~ѣO@#a-$?/0![jKޛj8( X  @+]P B@ 4`{[F~0@=U(KPy)(K.V^P\]ٴO`<ˇeJ@0xA_a0D`GGVI7`a+I ڥ[ A/?@= 9p"]d0C40^>}'ǐ80A`9Є\ GG"Ab3LH*V|zYx@P=@yߣπK!h0~~)uWFC`|9_%S @BFO%8 (aq w A/(Q `/8w ,|=(@Oq0@/EcC?R8&$5 @..}]0HP`<JDHJhݰ0j /.|b-hCp|% :P;kO 5P0Ywj({qH A0`;Pq:W3h8`S`@4IR.(}c= <#b|`J@x%⻚^aH!@1!:|~Lrm+ !_XTDDUA a!l`x%+(p:A!7ʴ E6 ! `<(X (0G}IQx*MS*"tgG6H z?.Vz|\ T }L>4 )XK "Z.EAuϷï y֍  xKo͙D8!z|!$[|Ճ&nE:J ^"is#s9r hՆOJ%l Ug@. (+`B` =˂A9t 1@: eT#ӺeNc|%7o* P@(8 x0NL ̕bZD` @2 a&žA$`9Į`B0*_*6O)u n(B[`Áđ$`Hv 0% 30v~ r/c>P +i#YR q,0@Tv`:x tƳr|]0x u.`\.x:%W_ I ʲNa/}X7 V][ Uz0 NVOۉ` 'R`80æw\sdm°{tJ ,P^V)@8@WH0~B<0 `BO?TjCWD P ZmQ=!6m,H0y!$0@v H~U(ҷ1 h(K 593|>R,2 ̛vu*R xX0`x_. ք`:D5_zi! q"s1E ՗P($j* t}ySWi+ ~ J >Uɗ B`JϠ WB H>N6oxupX0%`=Uzo3Gva\>:O4 t*JKDsѰ=P0`G -D{x$62EʢvP0`8IAhy ܿ]N` 8]UKՍE`I' G|1 H#P\?{ݷx`r`<'@ :2| V W@@}B#W,Xʂ$EUE`xFb<T) x |2 ܠJ.QF`xCCdN;X~\FŁp .!,(V@`! Ôt d5@`j `*-R`gP > 0'qIx0Z A ‰@LKx0 Vԉ ؞bGa8@0! $%K+.Χ`.0=`qp8|$+8|5OU JP@Ď H@T ;.! QD%$U==T X "**>CfH> 0UP| iwBz>0.@y on V"2T@t P0`IJAX%Sj' qh0ǀ\&!B_Tl8~P0/"C\ c jg\B_@c@Q *@<@`HIX@$UvU/{2L`8A@  0@Ѡa \Pa>$ 0`C|$}ρɩƴt`pBO B]h溸HωCL '*:jZ }P0@2WxU\Yt`h0$ @B0!T>%6ʋT>Kl x<`.#+9+`C@`~`9D~t^>PS(1ʀ)TX`)" p0 &p``80m!%U[p.`9Đ q|;=|! 7@#`:0@ԽH)78 `A qBPrBRA?4M'ުv@bxGT%Z!S0=u E@x!!R1? H0@B0.I$q<>Z֨R*fo] _AKA FA+`^>H x0!0~Ճb H NԺ8.`~x `E: xCIg4 `9PBc=у OGAˣGpC>$ 0]0P0 %$ /ᒐ` x:A`uA:?uRư :=iB 0GJpA'D_h8!u${ 0@!, 4 o4A C`0tI(uaqD25; P`6$ _ 8 ](B5ejp%}fn1tu3lAuWNdM> x0|"XX(/췔jqJ( :~%H XBR"P`/`7ЇVS/]zBNXByz0@l ԩFNKAJT !_N! CX`1*0@V%H~Y~ʧz| иFpv pUD}G``AՊ]p^ \`;/yQU@J `<xTE4Uagnj]CU9p<0ab`8!=3@jp]DZz Z` 0P0^o| `; h0> KAҁUBb?|-UŎ?懱DA*GдT?%Rr0 ;( Uv2ց,$ Pp@⁀X`<<@8HQJ*mYz0Լ`$Q`pK0X -5YP*>` 0_ j"P9`#h%`;b "`%w|`?@C$`:ax/-}p0n+ Hqx0UbG_' 6 Az*,(BpCT! w=\ߕ[+$ˁ ;}Xnd * \ Bp/Xy +=AxCU0mxK(E*T]7ѠEA"`}AB%0 <%@WvU "% V %ʛ(/GK<^ U}īlIU~?V# o u `~ACZ /V$ X(8hVτm `BQBJ'%~@ PAV(C 0@;#cC( `<0*}afA_Kt}Gʪ#S|0XGX* U[PUBx@R=H.`:`g= .*{ {s DF<% `a,JWja~&+ }J^nq$g, u GR@ZeB{Tԝ$0bLLĂSDx15 `.k.U<6 _X[PFl ^$g_jtptz"L";4 (D-vTHaVzz<+90 U yz1 3a vgP\:q}>2@E ~4b`K..TGf>@M ı/ʴeC l$XĤx0^)< 0p4J!Q= ^߆`xWYp`UB #qU ߆Q`v2 0^y,6$VmJĠ` L `TxP0eF̱jƙy :\`] }Q |İPvNq(A|=#Ϝ0`  &<^@(.,48 ʀ> ^@ ۊ`0w;| ߯> %_r`0 *`BfAy x 0v%$b '禑;I+>⫋=` ].R l XH/ @殗 $A0E]<ܨ /!( x ~Nz"`h^LQ%"aKw2h@`05|p0 ).\44B0bX ՗X~ 0`%~쟂B`9UB 5~ x A~TCc풟s8@~p0y Q;uc"!| #ZA(GĢ VGfl>a0%OӦ@xeؾ ,AK.Al8%*"J.T>C~Q^x pG*27t|]h  KIP0T =v5iW;@ |ـ0 ~8w"@Ji 0?..DMbY~xo0$ K{\$0$pp| 0 r߫1R0*lB"`Axߩ#z| %X0Aʁ q΁  `8*X|\SC.=T 0JX8_$M x0@qp1`^$~?V^Zy>>PD$ EÁ>ɷYA@`l(> `H#@`;D<%+N@{ 0fEc8 S<:([{(~LdB`BĿZ$zO\ǢGb`@8!(j%V%wo#uT?OU(HUg' h0@x#///S `B!+7T  D p!t{iҀ>?!#z @H0 /GIK^: .y!+ Jǀ\f?^ J]Jވ4,^``{PP9M\Ńʜu}  Z?vH.U|V3e-8 ܞF7ʇw`9A  #@U@ 0P KSaġ-ZҪ0.`w5U}0 ֽ +V$E_, 0t%w&rب̸ X=t h0yx !X 6bas?bULm+| 5@*@| ( ʥe4ӯ!+pr3 " P. h) HAR*P?+dP0Жq(0`yT I> A *{B\|8+P~ZL\ XCU*@ρ  d  %`d @L 4  8ī8 `%ؐh>P@}Cy p0 vz\0@Az ] u`=|o ܈ GaE_`  Dv%ny"Z$^ 0 ď+]T' 0@ hX+A t R< pX@  y+\F Sk6 H0x c(/a+U`Ay (U6WW3LQ$M{!xv,1Qp,hȔ VOǃ 1Xx'e@_<"Sڏ^EK46.`R1rTb WF j2+0 OUx00_tIZ|q(> p0@s"hmƀn@=V䀄];$ɡ|yå۠0>qAp0pĠlE#lx0ʴT@Bpr8ђBA }Ou6BQ~?.2#o2IP`}g a?(tA!D@&\ `z}?4 h0#Se`*nxp޼EPBVp0H$8J{ #**C(fz<)ZPRQp` A)1ġ$2>TSAׅ@>=%: ! H p~ā"-Rah/eVi A@q?=q@06p4 h0jC `,$kѠ ! ȖB}56P?4J`߆!8q?uyP0?P!B"H0} @p>,(UN=22#` A?A *l Y$$`}Lx@@x hU@eyGtA_y80!z}pQ Ղ q?@0 $>8  聈*K"hC D}G K.~+=&\Hݧ^?Ph^^JP`4{1H7I0_#C7q(`|A PEz<`50Ŀ ϪxNJd & +28 r@< /P8RC?me;>bL JJ< `e <-@u o\8`Bp!yK)vVD( Tg$ 0/ ]T" 8$ ">]Hp % KX~\%h)`^ T ڿ aK~6`}h,|$E** @ġ-QzC w$l!4m0|}efbhCU/ `9AH0s:zĮ)dK@W`<~ ¥J)>_Q0`j|jy Aw$'ǃ_b7@wBjc`8t Tqp0yF>(1,%*./Z͛w/G@Ă0p@-hE =|;+n%_v\gN;N'x1xah@@s=A @  zp87`C3 @āAT@,2<8 `:0 V+ʡ8y}1y@0x x>Z"d %Ex薯/]V$ >CS*0c@A0_`$8 7ڠ +VJTJ$ ` f$>`Ĩڒ(Pp?-_ "}P0UT Pax`9 `{ā,_$Io0 A`xX0P(J#YNU `Fr/VY<^ 0P0@^ yyu՗рx`E%B%= p0?CS0Y! `0 ~KKS;?lN 4|0!wϗ0\\:Hx0* ~wAJ`hX0JHJ/``}=Ћ\ 0P`|_"QډҠa+x jNP``@/+:/z`3} ^!* `}A렂 8B~.T%Q QLb``;w "PGQWքpt 7`8cGAGJ h@ A}=DR_Hy~ Pr@@>p ($%@"@ 0" 0Eک]0g6T՗JJ==0?0yGA R XHQ*O@ h AGGA B?keX?`A:>f0~0`BPc]2V+XA}VǾ?|]ȥT[\`O`;JJ/|@!2`<=.aJ>Xr +PP"FA qHd̻V{eyX$?foL*ZpEAipjlTtj `Àw<AXs%K-x0`x)R>NB pTpEi 4|=0@0`RI?=K9 pa (UЀ(J~>X ā)Cqo ~ $*=xA3P"+qQ@y#4q*ă8`UgVyX0@y?e0Z `0,4` D#E!@0%Ww1,GWY@8S^LJrD!AAmlJG4^$v3QDz!8tp0_Jݵ@sV4F1 xpAR%!` (=?B0@$089Q[3p\ 0R` л|}Tצc< @ v|x\%\g ,Pfz`<.x@l!dˇqVG'Hx =GƫV# 0}VIu1 J >WtF*/{x(K|2Kdb0{S@!(}^>pz'HX~ H `<SD*@ ~Ą |$@`U蔪> .UBVYr-DP` T?)!hB$`~|wh&'lY0\ h0 "P`/JL p04.n< A@ $R8>]`+AE3f+_($ @ A# K CHʿ AV\ p_E~M)p`; T變*ܻZq@x`AB ?FHQPpˋvr*2|7y*P5BZ!Ol `PQՏSj}@<V?uXKou\ x0*  |^?be?4L7*WB/ >{AHE1I>tO \ XCa)PO@j=*8!6P`B (Jg[}}o]P`p0!(eQ3GgnHHdA#("as>Ά@p`sv8$ NaP`9/ Dm;a0bX!c'uy/r@l@EC衮`ׁ  +8~_ qr4pǝP/H V0`u@v;'`%u`%R(?T) |CE#spD= .Bt1 p8`= ! ˆ (` A@~\A!jG `(cdWC9Z= xH@`:>ı,QB~Me.9``< x]xC9s$*P|>˻Pd 0P״==e[aVxu) Ճ@$H0?$mB9FA`!@<0 1,/x@0!'jR)9 0 XhB*۪m4T^ɀB/`\ 0zj 0 (K*9T ]o!q <RP `0@4zUzL4 ?}Wu\5>`5;@`<(y@H`Ǡ`Ax>ht H`5apX UTW P|h\x|ss?x9@{^ H?xtt0rQx rϞ~/  (mKj,Bær/ `A+YΓA JJD1F `<0t!ı")y_}G%@  p0!5*T:B<Ej{d`CA*ïbL73A!`;B<Ăt?9`y2 W"JP>P!P,&I0> 3*JeRߘ`&n <h0`:! 0? ҁaI8$I5_GʑspB/.m$Z+q-B*t`u_kKPJd@A֪I{x@p$") >P3c`A.EJa uR 0u3I8`}n`X`|F2ƢWV!Y>dp0>wvߤ#<x=Sm܀Nl\b8A1&{GP;H+h߁N  2,`!@`~K>S9< _˕ŏ j\>% xB焅78;IqTA) r8 `/ߊP/S#VՊz(`1V&]yqr0uP@!WC R\:(>V_\1Y `~U}UUs9,EQF~uRu\|?cĐQ)| İ`<~*ġ(|_U,7h @<@0AA.w@!+VB 0A'xQ6 A٢H !.me xe,^pH/RmH0> "00AepT"@=: ̼& 0`P`<< %D' 0qx Ws EX0"B`:BV?DuTN dEip@$`>@// R,]E@ * 0 p@< !,%kzƭ`| V.wU`0`h p0>y4G@Ŕxͦ+\ p>}d{ T T?%P6)Ҏa&ޗD}Id| B@C/ 1+jMLbl2JT`<&A}k'& h0<_"&YuT? IT<,x@0 T3Hv~XIDK!D_;/g(6A./TT*/xy_p:v~dBT// B4x0"@Jսc  tV| ]6y6>b`:;็wGMtˋ1]T`C߫ђ0 ].F䯓A ꆇ6=93$J`< " @C/*$! h`0/x"yzHAP~=VhP` BYp?R$SU{셇ٿ$K}`2 0`/D~%~\xgɖBW`- 5 h0qx0A Z Q"5 R/_ Wsw8cAB 0( H2g ix0 @ f'ġ$ a@h2=T%0.ċ| /l,H]$g;Ac 0%0 O~PPf $F %VH0xI\b?V_|?ÿ?!m@4! $p yn%j" ?$ z΍5R00@0%n%Q 0ߊj LP P P``S}>9N 0ue0@@0a?ptIRM_'G  0X0> BGЉhEIt0=UT"`DKN`h @e=hT0 A,AU<_ԭuV E@*]h 00n`< ` G  _K/I `: .0P%+/U `( p:.( @x | B?H.0y:%0 t[A.I" C X,y8sM `0Aw~Xg ܅ؠ`B|$K`!`< R^^Վ#`:` 4|^?O0>]E@_ 4a.XQ,:^`/*q@AR$"%*ˀ!a@_ 4U* ԫ`RY*5X0`|`0 ځx݁/̇ TC04X@`:U+/0~ĥtJ. , P`UHAÃ|2uy gOXxD 5X0@~+ 0`q@ p KUeOlg Q`.&\xvS tۻ'u8m:+sw[.~t5 = \%{4;ox8 S!fEi /Oͥ#F<^8f`BS[N}[D,/xgO ۙ73r}Yy|/p? 1,tNx+\>:>$)7>>]&f֞M@(H:?2O}@OVuWpf#J$B?Fτ(!Q-8/0ap0$4 >#!b(+^d]yVL P (!+S1x- q}T ^ ?,@}<Eû=W T u$/P!a~"#Rhժ}}$_T /0pUc17.`Ga<>!d{Alӊ p@\?AC | B5&Rǯ2 _NBU(II 'R9pV{`x2 %HG/`_b2jՉb\OAu͎+?)E }6)ϫy3 X* ϞI>Q HC_!{y<@qNiǓ(WB`x?Ku@сRaW.U`p JQTL֜idK/`$^Gaadžo4(SNvԋί5\ U"thVɞH$ jp0"#of[=U C}ƇӁB] ' dy~g{ua(Q^zGd’JrذۛsmԃD. xfm9TTԅ+RL$JZ\?T?9_aO~>j ^@P pBj8Ht2D]z{u!!ypZw\taL*4zC9RqcGCT s@&ۜЍ`pt<&V~T'.iN |ee#k[BOi2OolQ~z⯀Q}"OI3~Za> 6i<1:OW O|~4]g8#3T-0 R>^cnSe%/‚QF5@RM}@s ֨R *WP0 2?/BN%oh?u3\?ϩmR/ǥ ?HĀ`~K' RR1Np8e NrNiH@o4YyCѨG*+dtuzs< :y qX`~&( d2n#p#K(cS5p?4- y<syl`q+׿oOx5+՞/ N3G~hσxU VG0sǓՀH8typ~y5x8j^{*L3 .σ}sσ?g,OL̗i8:A5YGakJ$x8~X~}73}0w@`:8Q|&θ|%%@V0x C _U{LVX| lrEx z|F0#=hSYxJ-Wԗ(O_̧'| b(?WG CVCP0 UK_,3a=M!p p}Dn)-<{0QSI].`#W9BяAb$ ~C>t?r^_ 4\% Ja ( N0 TR<ƢH!@pIP @_aAu~96qHN@b3Q )-X!FZO+мGZa( $0Rzh&y_dK@cppp[ 겉ĭy p c^HrAo}]A/0ҷf}3:hE\\ zSDAV?xT$YwoO8w LC!wFAIV(PV"( J^sl)"Baz `8d :x/u"7(O4?BuD/GX J!J_Ȏ| yTrqP! 6 O8p|hʟgV=35v+,OFaJTDៈƜ# J(p8C L9_qYx0Qp1?`p0 |&(Fh8|j*]<>]`<'% `1 )V 8R2./lQ )X>0@<0_C5VgpI `~t"BIz9.'ˀCčACVN0  I*$ fs(zGq=|4}ԺɒGgt 'B>Hбك>]'&Qd 1Dd`~ |@a̦(1?Ѡ:Ƃ3cAHJOc%ߪ_5+1_@qF%GT ˏ2[ǧ[|:o,}YRȦb}GjN~1(~GԪON=^1T8%*zpW6OHd 8\s!,<*a"67@,}{k>'8Cs@rFoxSJvL<%\b%ⷸ)tWԚ3xYJ~/D3 7fqKp CՋ9cHC|z,DVIC^:@jZ}غWtO8d~T;5xOh7&>sNCl䦓\O4h C O: w%~|Yb~"J`.|1PV$*AbDM|$Ej0W_<+8H!!q1?u@Nx ON>'2pY"e}RX\ K 'Yx70M9Q*zYqp|=Z {I΅R_F˕hE*hZ-{*zbQK*^\0 D;qՉ+ñ3*%q:>TU1!K:G:(h2S4K=(Mq@3l#.wn}uS5d>ʪ?<]pq:yafYf4G(T08^iχ =)7QgFLp8{(8@}@,H~=Pa9^E{7+<_C'sx>=u{W,W=gp=4n/;GХc faФ pf16h8?o/ $> ]7}Lu~~">OVx<`8},G<L7*xC1rQ=Jy_Dxf}I@86SZףx{dMdžJދy듲a/dg_#zBYp=Φ5VcuN J@ @P`b(dIGCr?({T69(PoeES OzW>$(U j)qreƄ`x8uuZjX hMP$,/Â<PX\0(wX$X"HSlw+.#edBH0p0_ cF%^f¿EC[U*J/B`?aW,S731Ҟٰ>B R}@9I%`ÁJ (9)YV{ V Uv ybm* OH}p$t)=jICtIhr-c&\jKQޏqs2oU``c'DXJxI%94+& 85Qb \8&HZ\b'a b0  pY+T?*sҳ@8~$nAq$p)C˿,VJG:&ꊔ ɝx5u뼢'f-C&z2(o\Pgvf&[:Yypx2ʼn 7!{**7p/ i~~^xeUm0.,782hpgՁ~_a!0?<4A ibQAdaj[lۤ^u`uh R@\ V% ,@Q3d)@( BTt? P:M_# iE_? g " !XI")*5?мZL/޽]x?Ǘw! ?9pI +x1]L-^,9ήd[usk}H L"ʼURG2ZT#߁d* *7˂W:-.QEE8H/8F//jԴ%n\2#/Cώ8|_|.ah`e[` N(QV?o XZS9yh;r;:͎sŞ '{}yWxSp}>&4 0f9or1{Nu24*uʞwImH뻸ϩOxx^|FP8_Nml͐:fHFRll#lfyJ:{dd'+tHCDeD?N#f `18V9_'O zB!=Dnӎ `= !A#(?<{顐)(GI4tu0phLXN+ӦpФtD>`dF$PAQ)/a0ּ,`‚|Փ<+aX rJC?KF!NJ` HSS!ұ&Lpz%XUD AL / %% i|@|@4J JSǏA KL%H% V9 PwYP@/+`%*}AT@ *CP0!/ĺD#?)HxV4ЄIGdQ?8yqPd 4 3ާ oA&+"%mSDhϥu:pdKQXP50PH]>rF9 iY?Υ4VFP5>*Pt"_Tre \jY0I:ÿ A} pJ0?# 8Yz=Tx b[&XՐX&d qP|%Տ<9OA@=^_n0SO^a:E G%>Ş{c{[6t=X3Cp>™7aiX!FRiUN><83p?&3MBeEENՓGRyuT.%:OCDi0ѡ>Sk(fzj|\SᓠX<%DODqB}y܏BQi񗧌!O{5g3ONѫ9dre#}T7*=JȂϫ ;VzM:?v^ 3)?'Qڍx3nޅ׆h200aOX8 c[ B ȏ ĚTN&?J#02ƟBowkxS@Bj ?T4_D"*>x=C8R"] x%Q(F@9ߪPDP=+ R|R\@P7 G031(@aAg_SIo_䁅=O˼ҿ ~Sx bρ4C0Jоv5R4#uJ\|t2SjB6lি IK6I`-7J $ !$ P2( c`~hF]敫=  _@a4HCT%3e@1Nd6˿{8 1)<g2σAr3RSM'gI±f!,#$pd\ P5ǹ '4L8_Nyp΃z4Ww[r-W;zUD4dtP H`21"Cw†tR5Ig܀h"2TAhK/U@*@c?:?S~yMvΧ ,ru_+5ost"ȥ0@ߺ<:xWW Ahf*:'܇oIN5UIU82rjE82TO}!.<%(BJ(QS#l~L[Yt!xte=:@ 2q(;:uQhsO*dHhw |AVzHz!#W"JqL22g'9骤O~% Kt/$xFpGP![Dyx9?|" t= !#fL( ^BDSQDI}Rk IІ<@@2 ˜"`6 !$p-;W;{7G׆ ǥXdC0 G%\]G Bn6|ɏN3m;nu}isOn۔,8Cv!T}/Ma3 tUcCq@ֽ}X &/@ Pf-1T Au׽HAT _.B#h/pQuʯ1Ղ>G(֑9 SF06DL@2pc%Y3f+TTM7HBy,H0x)'?YpA># gIW IAM ^`;p : bBX(?<ު7@xS  vxRS Ub.8\\_`A z)Is 2.8,qv`L P愐 V ʱ_Ƶ!.t" 79@Rx)ڜ€=([R"<2|ʔ9}0;$</}<[ACб^Ҍ4;p'2րC}D%?bkp2d/ \]Dt2oH#85mXx|gBAd`$wL6ד' yU3ޞQ"#8USLx3˺a?+iñJ|62'~GDp@*^S-JI๘NBM}%=)g eL_,pTP.a^Eׅ5n9>2@gqR[.Jҿ~hGZ{AZmg0\>\# ,?BVt}O"P|?Zl hkXp+U H[j;j!:zAKHH:k~1-'S=T<[P]X l2H(sC P3Xn ˉP+,XXZu#|Pӧि(g 6uc@`3ߵp¸g.ݻF(Ui:+g,g&} ,?65 }cdY:@*kJ{;` ><34ۓţp2Rず!|3s?xS >$x|viOBL @{H OPdYxB\x 2n v9"v.&ɽp z,4(88ňh=P' j.p ,?{I$`< `MUl/ [h)r]d+Ax*{2op(\#`5s0|#|Nr^yvPSׅ6Xj"o^DoyYWF 薨?_*)|bm˜) C`OSv_\\H9S ҤX66f9.1zm<|#T>с)qhC,<594ŶyYxD;#p19 8Nҹ \$zV#Gc ܯ 8}jyp@ψPX8]ڠ",?`0`]U)(gI!ApA ׉}hd #Y,}gJKhI@J^UJ@ %o^ pp>f7ı0n 8M.[V>$,x%@pXN\HHcPAANp)WIX?ljjđ'ZoH L[jZnlv@!wT {R %H^5~5 C2w>H<60Kofu= a[(WV _V^Do 1[sO @7 I^5}bJ^aݰQ~~M\( oY:m[9AeNtX ݦgݱ=;cG M8(~}8h7P:p`xFcN8{F2z5Y4YN TGNsJSCCFsnPJL+S~8B/X ]9_ޝ|||c?׈ x^&"Q3)S$%. Rk*90~9ѕS,h'a}N=U^~ F:|T~ OѧH+,#a1g4gTo,偈< `v[Q m %tV?Ta'e2T+pSu($\\lxQĕ M7K<C4~@~ t0!PV\<ӟH! H\҆Jxuv$zvQ0U8=LI<Agի1[QEPJSߴ^>H#pH#ՎZv~WU6E/Ǒ8'$HP:K_:'zySat Oa0003;dumыU`L *<#l3:]CYӰ;/>x Z.1bIxvV L\pAچ% zi!Idž^C L8d''f,SO`f=zt#Ch"ɰlv">t4lOdg(68#탩y<[0_7 50uu9yO珩ʀ)~?nz1 kB2MEU x.}@u).vp۪J\8wY,JO mwp<#* `eO!F 0?^֌+]Mo<[U+U<혼"ѝ~jD^%a !âPqq< ıZA4Ŏ j?1y$Omka;_!XI`'q5"ĺzna֋*)BkD`ic[p_ov(_EbO΁Q'C::*G&Z,m("$uZd"ALj<`vڬ DH8J/TtS` ]+畂X1`v_)iȪ>ʅr^j2R UT%꯴m@fu)̟ ܞ%D&/>G?F[hcB k U# 5sFb%׼ޏ//R}K5(WYx ^w>`0copHwc13WT^Z-+>ѳV5w0ypK?%$> 7A2u'`1h1$WtՀ@8~PuYxGz&;p°>f+a͕ Olx_ஓݔx_osB`ZD $̽, "xG~%Q2/R@xV |{{-`bPc 66? 3[_R0@T/ U ~cN,d6dWD:#xӔB}YemHix3Vrq(1QSAls0\VƶDUxp)$}>IrP:T0xSb Ǝ*r3nԈA/;}{HZ0tMzϏ>Uˋ'Pnx)_Dr=lfwD>t=*IQ@h?p) Wf{m'~N( ppKlvEK`I(KeS}$U.}p̩M8$PΥr6H?bT2\=‚WB"~4`HJ_7NA,r~8#'lB%xg<& X8_B7}KH1N H7 sh qHR~aF6?|bU}U?*o@2tF<)XCz$P C 9(ۿQ׹`f#( (<q ^8 éi,E炞,t[a9lF >L2 Ŋ#>=fE-r#N"=0Bh`no7I{%}|~r_HnՐPP2Agz wJ+"$xs&Bl!uU]Z3TwH?%E{:|N~a&s^3C6rp)gW(fGR9@L֨w \ ]>>:O|wwa^&퇎1S\%}E摻`%\2G5w<3xYEpgȗܚp>P` |\#'B<(x}ᘔjR!*]]<(O;a-F:ù{v.0! P4 bJwBz$gUФp\ Vo\RA uP%_'Ѐ p=",z8 uz< KĥbWlV}]X:3YﱥGWSwܰW]q_}#eÇ՞VyY<~A8cgW5c!Ia8i`}賔f(Rn X CBjcDh zGUzj08ΆJ;b 㯦AΘ0Nγ@t!: 6ΌO 7iƠa_0pow ɂ`)T` J V+`<~)J]ՉO @0*Pspi7#]=qmxW/`N0<3/gP)` 8"4X!8gEBsJ \&9g; @Ą|~#(p2p}4)!.}M}jųzƜᛌ;`b x\ :C(!Z%S8Ktnfӟtl>L qp_ sG(IוjCpLpd_)4 o!T) z% _KL18T|H9oi"ެ2R?pfĞH᫠+{JMɗ2/0 cr鍐0;yic.@$Fh9 @+WzKψAB<  ̏pZȋH>je`J)[U09e{L5ۂ @Sc..`Wz8YBl?;8`)G ʮ0>`!(p 0 wQiqO4_ '_t&и{C7ڝzsb; W x6-pƧ;dC&W\#߁.PG?pGXXP (N8F`I̢Z*|Gc$=+o&"{3!4yMEEnCƂ-PM!{{ӣ8rjHޙ˔P]i::4/k4,IsxEO0B\/3'o*V\o|R*xADΈ E0@i?30`<2t25bo`2(69P z,.%G,kGDu.^M~&oD3Gcj2_V%x!j`~R]x \.blUe |i4C[03᫮ D,:ktvx?0@RYJk~ ?BXstܲu3ڱ*jNp~qNRf ,:Eѝ% 03{}9U3gaf#W[ņ\Fz\Г_^lR.LJR(gA*x5 L{;c2 HP~y4%uO!/\aQ .83GC@5O Ͱg6q`r/orTiN5{XsBAfJ!@Vr`"lhĠ~RG'e,3Ox8@AEj0 W!˩h2_a~,VJ $~y°}NhIsjfU es,88ۜT.LH @]A j>6А|m<4 })`7G(P $`xv% AHMi4Bjb`8_C! ՟yyw<3ym<dJpĐ`@-`w. ]+¦pPO4.ggipb@J~\X#,g.{K LJ2?&Bnl&oAp 4Bwvͬ(Q%~C7 ^879Ns'ŶtZ]L3 سmXUd,!J*|ChK9_{oQ`GV#'qk ݷic67%el36^7ob9xZ0tŅ8m0\#F (K !+Rkbp2p`(-DO!aP&[>zX%7xP%EYpFF/ˋ$^2Hw > -S(Lsl){b#x8@@e`6-OMm!f,3t61@j%D˯p3Ln+*z~8u09ӘB `Qx0@WE O5V( a` /`w:yÎBfHoTDV}~W4oi8_͙DfڈWDZxpc'ob3SbLjl!zy\WYDi }Kq은}RT p>Sg7x0_bC\46~V_pz_`\K^ C% CL#~<)pu^X&4r,-\&iȓ ԙMl<-PJ [8ZN=`﬛۷P>{|=Pw0+DͼC$x ujm0'M#<9uq鋞F>3Cd"gb [%.C駌𽖞pɬ. h_k'!p(5UЈ+8W Q8L$AVN2E|W C g Fny=H!~8=8GSwُ.'cDi]qTI'p摫1ÿFuJE?"·>E~wOyEOQI{ޟ6?IE׾MTmQA2y^~,d*?˼V Ġ]O,V:}W9ðWSjCFB,^-Rp%c՞ѮN 5@ѱl]&ɝXSPi/G@|ZdZp!/c@Q= ˿3n `*fΥãߤ3Fղ6<:nZpp()`xRO-sŒ:B@g60Tb͓0:mlp3u|l>}igpdpSp`% 惏`h|%BH01A|`^܉"0PI 㼭K% o qnr'N۸HXX&FN!NlpUWh|)^/P:D @=PȢ'`j DuCUPH{l-a]-Ѐ++å6ԏW /a4(!a'Fm!g{* V #X?#V fDgfw}EǟHo oIf0Yth_Hqqv& q_Ռ #mڿ(SZ6~ 9Å 7y$xZ<,3;{:>.:%BUw-cpSHw'h94H!\/1{t:Xf6Bx՗6O1Qxf7ȯ4LpH80ShBVAD_&k^+2A?@wsAb]+8 >V]ʪ z:ćٲq Kz P ` TDN+x 2io 0m!.UBhKL1W97 OJ;pexhNu=Y0 pR( ;u_ftݵS"|t"fLJDi0h Z#XӰX0!ϗk`)/0YT.;2;UF|f0QGDP/ԃZp) /.b= E#J<ιf3 orso7 ϕ 4<IݦNa" Ҵ|bL׌JQHe/e&FpSQj^ OxG& &y>JW'?FEp {牭4?T?/U~^B/ĥ@`}Zz8MC\dE@0ёn*|TԒlvەdP⥭-w]gЋ Vd-k7J5c:£Ca S=T,qR:xXwPOi$9̸d5I>u^c>U8>Lvjg*Fm.~.b d8W:ӱ`4G:r=Yp>C'Dfm.@f0 g;R^</xf~M^ 簘`p?& B̫D 3 ub,iᘇ`}LGޕ6(S8ꦂ'OV|K+ gjќ7=h9}[>J Qp?08c|]X <\o k=78M|6kn΃Y)"H@6#퓊ABke~ʄ(J }c\)Ĭ@+U?eqZ"Dk9bK/aY e/O`,;@.E҆jMpK!6K܄2KUSS .-@$Fu+֒_ .I\L߆Og\_.\4G2r\Ϲ_ #.>i?8pn$}Տ#ˏM% 4MT?Ps@b;tPFm pB-Z|DX8*'pj/ا™ЁmV ?}DI@Jч N- l,5>*`~ }ӾwI/e0@GK|4GH\ܽ q 5g59ǁIWIpʩR)"6p)55ۄ\uD(SH!%qG>d Ȕd Xx]mSӛx JĘFb8^pxX6`v*釵c t0ruOZ\x2 ᗁbuG)O_1./T藦ǃPsp3X!3yEC˘^ۦ* 9j 6&ju@4韠` A`;/"+.c@-Y|Q-)>Åruet|DDOJGJ h VO|@!xV $YQ`.tsn=\DB: + j}S1DP3@ q~OE Ddx$O~#!S 2\r A")BPwo8Ҷ'> @`~D"OAUt&DA@^$FHLZ!Êj|⠍OKONq"AW$s! Ձ pP;ex0y-}%'W]>7BrUƅ"Z`TBL;),GoJ(e/K_D<MTYT꺠3xpc3[|0! $$.O G&3 ,C0W T~ 4#$.%>HWmm{lܐ "4Th5T%ѹSPRj?QOQ`|N#@_ ؔ\:P$jSʁ.1/eBSNJՃ /OccstW6#^ؐ4eʁV1HJ#Ɠ8F`=Σ9N#~{izaCPC2^hULjTbŮݟ{w[0 䏫_XJ1z]x;'`]^@pG$qxZ#A:% /kl2Չ*yܢ17mОU>t9E꿄Wks Ģ.}LρU2e#\B.ؠ2,1z~GUopx8'" 1EPzI*hm hX 1kwyy]oq6ø `=R3LFE#Cx\ı(/9 N~$B! l{4$2fI"*@3@1t#YI?YS}+U4ܠʼ){[ }:`L=#/ x MK eT'&2]HQv(h:_N68}Gt>N ͩDcᵞQNU :4F}Y|;usA=_qĻ$"FxfN=)KL +gT@^4xo]<Ӿb0KS'2OP C"zExfdgkr{qk!IXfpoՃ5\8dIsz{2}3#{%\Ru 6%P3z#a (θ, $R;\ 0_TWÄ;J| 4˸J Iwm5_]Og6p3EtyLi!;\>h2n`0! (CPd`A~|(A|`A8W( `$ϛ>CfD@F%?W_EJ8Ahb8! yٴ /ᓙ2:?M.x`%\r,2d ;a3V$aXLꄯtT4׮ ({[T[7M|; ̸E`8oX.G 0f%>j C8}sb.":i& 8x V5)@Jh90)v}CPp"E WGNR:N3\$UBs@;#'0RV~0r3SP ǯ a^JV>;9I=3`թM잞JHƎ([*<W7=g:ᨳxcAoWxRP>=bxtLd)^]w9' AAm{I,ӂGAyՀ$6m™I9S&^#@wDX@v.W.<[: D Ā HV=RWݦ}^ 8߽Ǹ'`<&ˆ4hCCSh?1p^/ ..EGISA Q%Gח6ꁁ)) 4!g8 V %"O?m?6Q(ðGy#G(ՖPd#\d”T.$æ`%)8cPaAK G>:S mj/yZr@Bd)yQx0Zh/iS|\\\\ "^^ڹMğ~ާ? Fᐰ~}nW?A1y9{0&@ "&<2w X4 {v΀R*o8!SaL>Ѓ1^^>>/J=xSu^h !tG O~P2|.EPT@In%Ur?İCC6*[p0crDˆ}7SQ/~o+1~x8p[fD{wO σkKk88_ч:3σpc=dcBUs: n zP[%g#3'8`STC"0#ī*b"hZ=qVq|f}<i'BgEiuyd %rw܌oOHlYaF:ZN<.7EiQ0#'@b1U 5-2d#fρ¨gU}S {l$XSPH~ʚWTCW4DW䋵2RF𶊟&ǒ:_3=. -/a@eHZO5mLϽ Σm- qtqJK2}Ϗ~= <^Basl"gSRCbq s'3T8 tR;pz;r>#Ni7󂐧=>|a*m~3|V#RK~gWˏC Pp9Q O2 ܨ2Bw9"2+BjZԟ 7Y+]>`<x8y%sѩmV}<% nE{;>#sVs{M(S9NK,3DX)vDQIoŞΈOpA Ċ\9ފԃiar@:FaoG-> Kc8,r{?-Ix8`~Ϗψp? 8pzzR}W~PD%RN3|h~-h07 o=<(x']|"Qrtzj^]Yy/oiO%+=JYx5> p _ 6М.OXaΩg5`ӁSkUpO|)ᚾX8=^^3 ϱL++x)^8za^߱&?(jA.tƢYむ MU͸( `(A` @ryMgF;#`r TB0>U AU`U+`<}V E:"R#( x+T|.VY4|^u}|T5 0΃]Op?g/)z6<FH`?,Լ8a(r=Rxv4|C!:!5euH˜. JC4ڸ\$X8[R%#ݤm'}>Ɇ!7Jj7=\<$3"Vٷ=</|)w:B( @O>˸|Tɭ)Άg0J}|- {+ ٞ`VXjB3  IeUdp%# B]( h?4{h)@#W|.Gמ 1Ro  }oEC<~p1]qH(֊K`Ȕjy| PcTF %`}[wO,XhߏC{V[O|x"^uJa{ۥk&E{һ5(yS3 t1dmXsB+aޓAdL.dAћy9;(Nӂcx !hY `T![1ݧLUZ5ɀ$, C@0`FU͟Ǩ̀OLRQ`a;ѿȕi3U!xP ͼ! h4.А @ έ13mFt qwˡm-` FYr 8 0ʱN\_U{D|FbnBw0G:xr!9(e!S%h!9X}c9E&+}2C2l:!(XU|Dԑ0@("% EpD#x%E@֍@ >#̸ @c+eטcʘFLi gsLk'F$( k$6q#^2 t%y;jMBu@Mkf7c5. ֖N*{D0\.^U}% xEU+64Umv2"`_> *E"BPSr<Ū%uH)gB6@ax^ h]R Ձcݎ.b'Ƴ Dz)pvˡ$ϗ87bd[-GjwWtALT:fo}jr k< nT}s'1);=ς&yjeg#9OW$O|d3  i09CD<$i2xxJXnd\b~ӓkO%ވ|=FHݿiA@+L!>+..`'iB6̋.UYuޞ]ݼ3uI!ԛ >2+#+ᛆxwy?P{Ѧ'*j4-&k@,`)T$G#IۂHG/&}ra$~D'l)*AT?cWE-FbV=&c@fARi[dǻ{+zo>)WE$V7ԗ _DZ9 .ވgoV=e~ nP=ʾ_T޵ TyHWu}ncmG 1|?"F<,osf %t8J(fi%Y:/%rM$ڥK*ˮ UIĂQpMK@ 7HTᓑ4\x8wGmgpd 9z8Ҷ*6wgxf,d3@$U:0UOTx@ py<|2Tyat(..jU0@?\*q)PF8ʀ':JgO#6~]s|DMKȐCl 'O UQ v$9)+2HHzP4-6h@ .ZԴ 9`*I<,/Zƿ|By %2vX {73.U->8I' Fm='+,pޗZĄrf|d4Ot7>}k 4;S-=f_C"Y  ՀHS0@NXfj@55A Y<sc8r׊;sBD"`@W*h` B0L5\T!UcqоHtCӣQV66Ig/WbB~Onm{ <ЌDK)'J6> z'ѨS?ZDZ ^:LX-8))T,xy#=G,lȜVO?02o{J}':(X:9 4g6me8*l$A qDv&ZfnR"td# ((49 PY,h34hd-F"! [ HxA8FP(bzzRw,kHR3vwc:zd?׻M#L&v@hPx !e$!U1%ˁy0h8@'!XSP#!;M j,z_p`! ujj PL:$0̞ S>+ h—i;v-}JPz_؊ +!o0:}<O`!HqI.x k/㐂Cġ(8GTSi8_S ΚEpź}j%:`Mօ:O*+UQJ505 Op.Q)ĂQ|:ZVcy|Mi?O  ~  gT|)\UYUT^L?"_pFq# kO <b"kcS$AR{`":L:`G-rxɺ+Χ6|' ђϩ tr%a} ZЦzh 6Ly8ֶId,t oZWBx2ˬY`pyQ)ʕ1ߝlD z|f]<]NN˓h(`]aʡoQˎN9)Uz!d"=v9\ .Rt|ޯ:Hr)B {̤0*'>G :88PNą2R<#.8\ ꎨ{c@7k(a.K6^ t?-C/U;^+V]`$ՒCJ0ſf/A|?tpK{i,)#_98 g}OT# /*=n\h@#Q+ `d>rp@ܚKo-2uͽ.pPp!Ƨ7R4km-I  `A(D݀[aQ.dbW Q a&|EV~1yõ,U_a+Տd;ammEaS7ž?$rCl[4dF>Vth#ˇq|mRYPs8f"]Fiza& " (eTy<C?  xi?ǃ(0+=1At łB`T D|DŁ':lt@S ++ 47AF 8L3Q׾?02l0>e@8AbA!Kz"T8m4Aqxͧ aňìI_Nj ~x8&ᑺx0@ O φ`(Sp\bP=:e,$a0;" EUux66BDp0 :PC#A EmUQITo/{pV8ww 6pNwJ z'6Cza8_BA<|p>՝mwriN`{VD|0FΉјVi@(βQóÀIߨ=k:Hxg4ftƣS G8l)Cڬ8As7m`|M>w\d(AUUU8u(3XdWƛ/8ׇ?g`8}Ǿnz[QF0^5$m#(PU_:MͺL56,0Î:#hB F0&QQypѷˢ`D'Adk@D򿏽a1&3حo~HT?wĕP:L晹\^&jev]H8D~tDBJK%&-Y%rwOS!* z|y} Ht&z4W9Cz?A+{{ D%fӂ0X68uk8.o 0"d)t^y :~ @P+͚{+#5vk֚g2|p^8S:5:ڵtv.B?zT1nO퀤xXԧ0Gk@G <-Gk o$ՅԱ:9CNlj}HqP5Ip(((+F(M- y^tzz)_GjAԏz(T R_*X,-QcupzǶ 3OE56{5nJ6A-֎j˨Eby ?"}M1lfa?ZM2ၴǃ2RZhd}hv^7`C9&"*[2[qLOc( [dcMOwut&r?S70޺-Ni'+6{R%yG]N pu;j4|GEȽ?"7 _]GXi= ߔtDV$"??1%4ֻ(žAM JO1opt|[?i"":aʒ7#4YÃn}lqtᄊ`}PīC3mlj{beREU)SOS8%*Er4x, ~Sqԛ4dOVnc>&MY^^ yl3c <>!o<3z{cu\jFzH9wWyH[T0 c%ШT"`ފh8,..يp8|d:::ðPTiԯ$mD5\Loi6ʵ@5/tLd;$g3KSu 'p#ZG'l,iLDNpATH!F<<%WR> 8H`F~h2 %@,~:gϩR1b9>V=  G\C"&'82O.)D{ ('z炔AwʥB#a(%1`BH d;@]@a.7/_qS M&ɺN_oz?Q¸gެ~2,t^_`\$>繰 TK] ҄H$3T:*1U2R]$.ے!T;8h),0 Ξ pH'sPѐ2UO6ħ^(^  x]siapv;,;74.K1cw#0ǂɺ}]?25T˞00`PXMp `,;`A, #Hgyք]' `TD/ `EaYH>K!.(@jLâ0P5J 2 `t8%*ۦ3 Go* H =`ᒋ]܅2R#h8Vr*ͽ:K|#D6;\9aFHfMar)P)x[F,z|Y`N4G9 >p󜅻t>TC{v\4{')ΒD D?Li.AEVHˎS@}x&I%U5wg"o82 CQ$,ӗ3 YWci -\ )3 y L,C __S 5 ac/fyRiȠ [&zU:/з_ç@+ {w 1Pj˿j? 0`v'K8yD̛,j 5wN&h蟄^ E\ 3_&&ae!$m+[@L_>0,1 ah*j u׊ϟƂ˗E]碁yb5yՇ,?&,l|b>p@⚠pfYaųxu%l?fkw/e!9r'XW;iR,}DPԺ&Y;L>}>iC X=i /-OF}>Oi]p5OhXp< <2 &p:D."2vH^ C0 Lf(S[7H/Dʟj'SR`:!Fq~{ę`Qqc@(2_-Kfѿ<3{;?( ph 0f{ PVd<Lj*c^}_{?@(  jJ+o8FաDu?e6~ÌC7bHn:АD`yi90tx^\2  B@A*.W+"ciV? n-(PBj-=;|2[8@CG1wƷf8_JxfwԹK1)M5&(Pp:xJc.D.jpK:nv EF5hBYxƣ`D PU>Z³At (+E"@?q0.:q0 LV>}Y9}6>.=M$x4 Ͼd㉺.0p**Br(Z a˩řxVp D`h@ ($ b\~%E.U_b(L|OH2V: ʰHuh2SP8x P9ťNDp0m!&Ӭt+O>@V,@SAaPOx䁴f;pMʮ0IDAM60Ќp8`_HbCIQbAWot;iHs<`(^JxXmAN6pT8_FL Ou("OS!k{c3vݸ_ ŝzv"@4Ɂ KF-+l<܀`P.ۛԮ5SػL-6{ۻ+Q }pPjyD` bQyx8@GL 8GV# A>J22%  WB%1  dڼK `AĊ邕փh(3NGo2_:soSrX+ " Ĝ-y?ΟmOq.{15d ~=L!,!|%߿Q4B~/<܏8,ĸQVár/0&wױoER 6HyOm9a+6eEE W#r~] i+g[ɽ'IK:&Htf_>G#­:3O `L2p:u!f^wQ:$u><3 ǧ^v*U~99[k*Mp)fIgvq'OaZ?Ut>@Kgd`+_{X: G/ZڭP1 oxSkX`3k:`g:}TƆAy׷3Yp9[/L23;T#fq~$0Wf'U 0-FS.v˟okszm5 'Q3X bf5N-e1=ƋdLa.=LaT>auby8ﭜ[="Ǹ+UR\:'!|?BsTy+SV>ڪBT<2 pGr p\q !{}.""ǧb4EcG1&'5nC_?d]L3'g:Xg[p8nfg7 }9Xzz-u#˩o(iч$(3U0`tXvgv<X\ uVD ,7'UM$VoI>uqe{KÝ?0ɱkJJLڙ|`:#T S/WU0L ]\8W/S3<k [,ņ!pvTE/HX48#"6"h*P"p&*w?aC ?;@~>EꔱgI# rOzQqN|F:!nTEGދoqP3z_N2I>w ?h6 H"$ߧn-OU '8d"k:B X0$̀] #`|2É(atFa71 Tx{ 5s34@O:AE!*:V6 SI@*Z%k@+H0P(Įq@ jP_9c*AR(k6} 3‡:vw 'm8{JP1 ۍ#)\yYJa7w=3)"||u(}#g Ump0 B'۴*h #!HIs b|xIT~ r̍  AT p(~HB^}P' H}{?66j*JCl4F(8?*7~#iQ8€$ L}N5By$(˰،/BL ' / 0#A\AvC*q@5U%ʾ?P JOHE:@#w|$L$԰[pGQw4M)T^-tE1WCgn s8îv wb? h;c 01 bԟ|:bn:O '0_CS:$; MAN<)X3V (vxeB`p=0ѐ  ism|9<3)B*,[wG Iq! t:2#?<| sM832v?d Yi #qT _mZthw !Ӹ`~S:;$;̽5.eF>tjxC^JInVPu gC5/\VcS4 #rc `-sw0zBVơ8$ BY΍Cb[/6v;FNsgFPfMkGY면iн CD< db"jxK߃G!"&4!|۶ᮛy7I_t+t5wG#} C}daf2>#˞ !'vF#1^40L(3# 6<&M#V#>/m-=a\\Ě5A;җwB=$ntLNLჩ-P` QsMFxଓ),:ӤPV|2x9.`v!ɳ|)MxØH9V<F9dV ŕJF9kr ] {dF^X꿈zz0 #DyFJ=2* $+iݢ3Ϗ oP:gfY[m+{[4|G@W EP.b_铣Bg10 hVU#TN@pz'&cLz?/MU%3fiʀhO=><)?f_2O}HT;Y_ AQFyl-њ\vHmEQIQTb*k:^Ce$O9I`4/FTHRV$0AEZH F 'RZJ 0-P>SⰱAf Vb/$ԁG*gnih딨y\#g/XC7G8?_b 8$ 8`_3?~e-T_E'AcE Ij5ù_I-$z>}EçTs>8yN)s/&<<$0p/cCa|0%Nɀ* 3S3NN=/=xƯ|2%{ m#&^38T/:#Oö;͈H'"Uh|> pC/Z6L2%tbv䇕6" ޑ^*o:8sgLI0:xw"gDw HX2KH8MGI'S#|RR3ÊqM+g:y.1xMm=0pe8vX/aƎۢV<(SQIrxP1'B LO.,IT`*EM[ a)?X + 6: #<3@=&Id\|M\kn$.;HS״Sx|}Y;3MUӇ~jH$'3G>H)n2T@: >^]e#N<)X/[XDAAgӹ%\u_M [B%T}*TxTŁGѰ0o3SF}z&(Ã;Ճ20 \X™Zʿ>"h!.pdCHy=dy;V١١:uRIQN4YX2O=|a*IXITBo8frW"MDk/OQ%N'ݴR#:@$"phG!'9X \eģ:;/V]c O.#i\M&OɥѠZz܉{3c̼3@$Bv#6`f_$Ox pD'W;n):FB08'zp:aNzxSwi8B|~+$FdSژ"``< 0 `zkCsOM\ePI+%;*p1KN8`Ja '` ws6[xf6̞MJҘDh}4mʍQcRxB1 zu0ȆLXfxJ,:a@ttӝj)okBg A@hKž^8v1q1i5$j#NQw"XL萰dlax黾Y?)i]>K] (θۀ8!`>5e~?Qz%?Oh q`C)2#p9CnxX/ә00`@X{l.`O@`lP  X\b2hNmK:'PϜ `,|H U H0Q`0ӻP*RZ2}xf 0 gJ=qjqvݦhM>A/R"20``BRx OGK8،@=.|PDhH1%c@0KK? Z4io F?tX۽gQ-m@Gz-[wO(l@:;9@[Q`Nk~*$Va5!ˮQ"SKy$lXb 1ոe0M~ zاe"%VژG+($Fu"t!OF+ i9qĪ{SR,o]njڻPz3#S}>6u14-: MJ/z"g|&5ueƫI]jgpDw0 N(:(XzZ+Ux*@ӑq8|0 WwyXdKP9[ 9 {D?6 HW?*}3ѓV0pPɑzd2{)i8؈tFƴw8?N 1K{_P/F>^6 FN ujS‚X4GB(\22vwJ`,(?~͔ NWXHv'3@9?C?=w<[ R}Z4hGTX'F`q#!큌:#[0p??լ%;PG˫:ќ<0^ uQ?Xϣ?n|6'|ZirBpJJ9+: , ;WDA[hLnW)֨s^hjmq 7Vϑ`+%Msf34l~# ^j~=`zr{KMO b<_H#wL$[WX8m`W0>Sn⌜=O;ai;E `P~6};VL[ry 4 g%:N88`~|f#{\˺Nj <2G'22ơ(jpԅWH Q^lĿ|-5L4rqBקcc J(I;t>tSn( 8uGϯ9mO \F^l`u k 1O)ɟI*v:lP` +zK*Щ (< p^L%]g<a;gӭj%рaF)1Ǔt܉^ zyCo<:2]@2cиz,Ehԅoc o8 { H5 A|T]@60aQ u1UJ8`W `| LEjg"w{=dg‹ :hEy{7OnG&%C"`D=Nm w7+8C/MM&(WAY/c%Jp2uvnx#4"8`Euņ[ ^i~̃$Ha$I@H8z8m߼6FvcbxoM'EONB&B4dFro2-jNhs BCRip_@EP9 hE4 ՁKxEVR, 4cI$K?a/9 P 7Q>pP"<<4b0<FB0<#C.*oǥZh)aJ@;%K~-ja3$-GO0 ޓU<\ocZ1N`<3ޞ' Kfp&F)#( *ɧ8X&]!`<ı#C?}o0ñ쁠T(mx  DA:O` N$zvݷ=W;% B`~ħvT ഴb#!u@0 Z ]@: pd)L/ދ.mvnX󮛙b˫ۦ8"<, *}LĥĈǧAӦZ҃#1OMJҁՃ$( =V>̇+; 8gD+i [O9:+"O7^цI$SaFi 6^Z1n;zxRtduh;on4 D3m2's!s<':Ő ̪&e`gq<&B%zJ,GfCwtv )ygFMc`x,Ob hкDqI})sOL,xt@bt'%ЀۮӴItPm>٣qDI";)2iNgQb RG-S%M(3zx8+i  ژ 8f޳z &<%\Ru]Տ&|hROCxe0/E@C+)33"mʀ&[ pzF<@ pyv7e|Jumx<3xg} X1O<5R\2ָBs"W QDAPipR30Fs>(Vm %"|H/M/i`vVxI@$?ՌˀIk!L =O}-ϯ>;c8O&W8B4r,2D|Jq<`Rc)8x2r۬gUEY爠x.g `M@+_b @X%h)2JʵVXB%eֆ( '<|{\7 hRXntp8`Vx8Iw8 Ԡ2@x(v`DϺ@pl%G> %#"{ Byl,VZw) >0FG! `8j=TJ g˔u>z /[3m`7Kg-ᘫ:pp 3MĞ_p#]` (WV?x?jᚃNʹi%Ũ)hf;p)PFܩXP%( #5>4VXfL| hA I@XJV%(S׉=a0pꆢ7 Ϣ%g7w:tLLt^h5Lk##b@ՃhEbwh`h5MXE ābͿ @a&L^ Hx9@_ CbAsAi?4 3( @ ,:p~5]R_MAB뤏H+˛_O)FQhX|?ᚸ9_݀mѣĴMqn:}\(Ag { KEMO (%Ptjom]$BjJ} Dz )` HڦhwpGB,Tumwp;vݶI1 C%(@<0̵àq‚qL@6< BX@]^Ga۝ݷ3ͽMʍ(O\ SL &YƂr@NPr@DDްPku67)87%Tl2T0TR3 UcG+[ޝ\)E 'LX:P>DQ c>]٪WUs!&f~y 4>7}hrڻi-ᚲUsO84<MBJHwM NU3O HFg#c|#|-;=T/0DIH/1됽wa;%E 9K+6LGiƨWm ޏä<=MEW JdaJbDA16W)Ǭ29$NAOܶF2h^mmogyo(f Fy{XSaLk"h1 `fITDRS)w=;$5_*Ɓёwex4ufd7jwczz!7zH E&W d\!Vp)Q/`fұHE$JSBLjd|>_YUGf"0#E'ECgm'㛆#<Nj>;S"[Z `/_ߎuGeN?dC킖mLRMa-8drh8#M?PIXOpr0u>/8pR )>8XB {rdr7hx}8wH3 ,Q/1AS5KŬ.JA zKcVʁMS`jX}tEvWy6)hl& 7wJy^ekmv6%02 nw:pEC*-=2&%upHMC?ǃ{8e5 ]" B2 03bgįb@8_ޫaa-/Tf@"_xDdq 8tx-M-[}8BTP8;:]UNrW`|,hb>".?$0g_e~1Nd>=>ʞ/]UARj)i=EFe,.{4^湥 - lXqjw-X}T< ' vȈd`gP)xdl5BH4N)״I: (>y RG^3:Axڟu.kEB^Vi*W?T02tFr.`<1sL%>e7ހ;2=8 lvSB[`_% xdӱըJŽb<2`A8h/꺑&W Wʠsn1Cq#iҠ,lT484#m9r"PjISI^%jGp{ò%C1}AH[~ 068S`PR{1RCV<#-;fDŽszx[`gR?T&)}!~+@)$:i޸SW_?5fhaCT h8`F?Ώ i=\ tZdɱx{S G}Stʥ D 9=ޛ0dؤ/_/xY U!ЭI<1ef] RCȴ%.lSX}c˷[ޝQv|"@=咼G > h ޫ@`aR92" ?NtA]L z:/T'Kh% eђ;Q~sGجb#=N ?8FIJ'3kX^#..1l`=0r'BQ (iGEG&q?s]'HRc)Xh$ሏ^(L~uLM+QͲۜ!;4 )f^?Nd}>u@:jp2 ʕ`Jꢓ}D A Sˉw [(Up`7 ¢[A%> @0cS@44i'hFИ |#asAм=(<Ğ\'H Rm*Ҏ  lր$fH~.5mT^=![#ƌghZ}vbC1>y  >KFP|v!MP =0A.^bBLji}J$xR `)!߀x ,.br@)LhK3 @JwK&Ii OoXhpN3n.O3OySCC -4pB HР u e3ѐwG6ـ8 y %3∜J8O0ta0 ($ 0 =&[w3j6H2!:cPFB,44B&|<ԔxPcm9Γ\#iMrQ+8vZ2,ЏN7J?(L] B)uh D_4 aݖ&!p^SIbpp(u * t+۫Lp? ~\NHJBsI~sX6BH?.(3B@y)puRϼ: oN|i1LmpA: P0)&§lS'2i+<-t,ZPw //q_ZгpXhT pzwB#* A{hFN+ |FbLHD|mcA^i?x040Oie\,g۝u F t_Rtb 3?SzGSi뜭 TFP qt2Ij56 >} |*ԑQ/&υ>FoAE@KR ?DNs0BOm A`"ckK=#I ЄwA3<=X^;nf;t9P&,&^'%-hMz~\/O*TNO2\A3vqV5 fb!-V;2s z]9F?qeۦȑ)<)ךp0R:M~Ԍn<z4JxGٵ7pdb$X=6R _p|LOd50e}C`=}Qg61NJlG2xYIW ҴFw̚ #KwrDeoa+=^)S#R pBq?F^:;gCi[AmX c?cYK BFكD@xKpRMqT^A=AѢ}FH51N#SBPŞYYzV+!2T-iѓNT}dUCã8|SooE?LLkހ3keo!Mbw-z8aze~5{R\])t/Rrs?XfL@pcr=Q8f3aL;ATkGYg™%DŽp*sT$Hz8+BG!P[dAQd |O3 S,ϸ,3 ՜C/Bx⺣<25p%zv$/H{6}Bdk 'iwL<8g(S҈ABHT^\}PAp ~xF#8s9^Ǘ9zJ4KG3"?uޯUn}H腧&OE2u&nzT-4P7UdΖn+08J ~TJ`hS悘!SnVTlI/T<Yx_:%PF~(Vi)?kG> ?$8 j3P?4s@%Jxg$/_^3U-C&a•`Lq?iuFo7p"N! w$ˏC<8\x2BW B0\]˔"θ2O =$EJ׃ ]e7g0 sIjJj`DY `FG1Z6JJ&\@{U+Rp'/@-2_H ~ՊOvLᓛL|3r\ᇳHd^US3Xxx20'T! ) Д!(QY%~P+XxAP:hUJdѓߧ@8JpF&ˇ`F /.w_z/zB,~=`XBV>SP(tuP*W,I\M:}3k{0I#1 ^1W+R S_0p/DvKvc3‹b]o/ yjQ/r@P!-4d((@ U*# .#4 J:%xA][e?O 2/cJATh&QV ,!._vݧw[XXʐ~G![ W(av` άFXtB, ~ 4F !Y^8e:WR%+zh((\x[Nf):t<$9$*pUOd y Alƒz"aF\]#Z~TIqݧv3[ /Oo7GNos`FMlk"hFtG_yӌ#,up6Zn QFĈ_Ϩ(Ңӂ4&x\ WrL7O-|3 '|鳢4{,éb!B^E\"Y ! u s&T?ԝ? La(4A 3n88dg+%G糍Bql Fp SՀ@f^Φ!5xlMdGxܬW3;X"xJR"j(WϫQʼn?e+׫H|)9Ђ$|Rbg0AqmP:8..GqIk2؆q *ym?xP;S4u>9͛cr\U&3{SP '< C%{ʾ&g0*' 1> <>/L`CˋHᓜzj ڧg:17>yІ=p? dqA+i5 Pe7j2, 5&Ya cL'3óԃ(QC= _.wT.r?ڱh@$xQb7^)峩*N c/>\#H( XH/(wL?:jU"PR;i^<'2"OF|AyI^g/]o0 I$GKm=8S!SRw@)08's_O7SaMLÀ0GDž\g~$_yOZ{PB}yy*zpd7sƙoIӓ^[ '$GJh-Cq*l#.6 @*Wp(!f 2ea)~6FEa@ 0~UrbP]U#:g`(f  > #| ;33B4o XxC}Gd%}|#W[z]@OsᓼD%ՏI2B b'{,R!ل{9 87ĉ7hp sif?t4S3S9p(H#U,yr4`!Ϧw_̅NGRp0k>q N3ܮ,3cpe;glU?zx!yײVl.hM:L"''_ȁYqvhCN!Vq#k !O=X`O! .t3 t(kˏXd+IBïן\ Iw^w8xСU*a2ZD~ !4t<7ߩ}S'ꨪW R,Z^vEy1=d%OF𐽀_[CmZ xǥ2ITgfU*7,$5: Aj=GL3NG)TI⠡x8bW02:y!Xxઋ-eLꑧϳ' TD1(H+9$g_ oICgbӯgb"b)Z (ww3/C34ΔB-Vu A`  %V 0b9O!H0(x s@~ 0^`;?&$@[Ճ(%('o "RxK:+a _0#u MPψ0`A&WPPQ_}ߏGh?` @=]`~D+ff9$ɟ<F| |Ђy: /. W~Zp'HX p|%x!v @Ab}K3A`?x~% V,h~>?.{0 S<0p`0``  '@o`  Â:iC>I{ Jeb͚ 0PO)c<@<p 0 ;g\zPIA$C a!OY &P0A~PTr 0`~hX0'y  'P0(x s@h0y@a<9' "!9V*>ȸO0@?4 90a}9V /@@??zjee20 ʵRADPqBF|(?Qs?k`<8j3`:D|%T+sЗ$`_x, w2``};D`9ı(~_GVPL^@E.uCpLxF 0C荃Ka)TQ`x`9(0 jz(J/u @c%_UT1vU` k.z `;)_y(8HGL~ @@8P-0u ; _J ^RK/@iGNn?@ x0ʋ˼D׽*9 qx j0jAD2 p00bHꏴq0`}v2^ ; B x% ` p`O `9 >Jf> 7 tϥu&nد0x>UDQ(PzX`;˫ "YqPg`$6%4?@$P_lh)|FzLe p0 s @<KHAKĵv?k hJ:P|֣@tP_<`q+A #mҳ2^_YT/`;0W?U@q@AR_ }GJO>4@ !A/s` C0 + ~(Dk:0|M4N`T^#ǀt0o4wSx0@ r*lH}<\( F*ǟQ_(|zh旉@^ 'Ϫi @~ @uR,{Ku>$@0`}ј?b:z}}?bv ZAK9 8 X\ V?!Uz{G/R:W1Jx8{ʎpU~ J Pp ÀywġW8%Nd*$j}+]\0 <ư yx@4° (HUp{ +UU=o~>{ڝ>` uB#p`PU"A z: XWᗯ+Od>PNoeL H0C ()|9s x Ją:U[$`0?E oʼc(N0 @`<1ڰ/ UP?$w UD*]9 7B p p}^?@ X~ /W@yNK3z&_~^ zCWOw1,~P(䞏4 b@A`!.0uNt-{o0ax\J`B9VXz%*?rtBXWkF @J.+ѓ' .T~]ҘiJe;BPA5Z%UQO{p`H3}s:ixx23 fd>\b?5}آ,1j CPT`@x*{,R[Uψ7| 3`zt}1x$ E߀U-DpRFEx˝ǃq@ /u1G㩃S EQzM  Бıw΃$`8A5Kı, ZV ZEv4``6p^!tWJ`;`CU Bܽ̀p@@tAϗ==f phBBaGVuW3R 1$U @ 0_jH0JZ9`RK<|@LU@ A4!yXC a5"X0xo G]N"\${K&|2jt_gh0>Q v^!!Q0}V\i 0?9b" y `B9?@xASpAIbUUSIw$q@0"H0B]JW=T!$ BHBAڤ}K2,~$@BU.J0x?sQy]q}BX![շ#0'Xt;'@RwV{L`@4!e.bC`\]%0R/xp@t`h0! ʮ*+s[~Ba_4\?DK.10`%դu+t`0`: JӐIe8@_v|{S0a...h` ~ȭS )p`4DJ$K#`BOǃ| h0 yP0@p䁀 < p0eޠ`}:+K-!v0`;4`B0@Jejq_ KRL%+W #ߓګV HC0=qZ"(JN(j]f X  `7$=(,/P?~^.x<0#EK K~= oM p T)t݈~˾ h(KOUU P`ā U%./x%5_A8@N^= ~ ] |}[^.jX .%+`:~zP E}ɂ00!Zvn.X쾦`|A#@`ji[T/y_x``J [%pA0BA\\  @0 `8NU JRؕpb%2`Dϫ**?OLǀXj yp0`Չ SUg ; 4˄<6JVWB [9?ƕ^) N0V\+y= B.V 0& @0@4~Zx+e]s@0yw&̙M5v"r  Vg~MX?`RxA<+A%/o-G@@S4` P0AHI T?\ X0 opU X8"H032w(Xu 8CB}a3:`(|0!gGN \>a90 `0*x0/J0~ BĻ!et@% z%~+s`gꄉ,Tg`%`| 8#b``}>]{j`0jC AyG@\?m,(e '!s5R,` a@LASI.;T]: {Dey| /ߗ.V%NđE=~e ﮆ@}u|h)"߉@=T%/^fpj p0> jˇ:t^?j X0!0&pvL;OXG   mH0w_xH.N+L1%)˕u{: ~GS@)10Qp0Rx?ȮW C-糂0 w4_?<'ez8@tBPoB$څwl.bp`xV XKL= Qa8?NV 0!@%(o ~ 8z?{݊_"@%x0@PӴL`:h59 w5p0 a8H4  ?.0RN:櫆,d@`!L4!j^ 0":]K@:/ QG@-A5c(|E5U,~Tw5!(P`{ |\ρz x07݅̈́΀۪J(;a0t& > z+X@sA} p0x!*VGPP <Ba,$(?.OC` m p0e{1d}HQ0R+vUUQ˹4 yt/ mH@$?}7 0XBp. l z KԸ!ҁWP0@L| h5"H~pPA:Zy}eƁ|~db y~`˯H` 0]\Eaiǀe#!"_F| [O+aD Qa!\$Ԝ` 9D`mPn`((h0 $ 8K^/dAQ鴉|Ċ .!ǀ\\$0^+8S 0~8 /H̙X!PC0 u:% `}%4FG)! | h0bH0)$`e& 0?* U` p0Wax@*$|U=tT~{n"  |Ѻ>Uf p?Eځq B7. R3B<_PIô&K%ø/8JWǝ!Ͼh".PHT ! *XE 0 Xu"NUY$Q$vEO A I46 0a>EG٢AHP(1*B0!KղFjT{ +M5m&%h0"Ix`` `x<%W x+߉j:Tt3N"D_>ޠePAX/@`2os`;ĸ>~ x0_B y`x#f( s$A-`^%jjg P %)CT F TsIP`; g/ 0!ug>.d W՗L` /H`A.uO}M|q`@R$( @!y~}ꥪ'xo`5RzKPz9`@\4 Tj$]A ~_ ȬD`}}'F7+\bUZ(H<"'8 0/.|w0 j`0jdTi~$R`~xVzb/$Ah0 j**)n*U+5X~*//1^V O9@!!ߠ/tʈ-}6$0`<||-{#AHP"8 mtף)]4

|ж `:7C: 0Tr] g0z: 7"@J`A /0@e@cs-\ x\%KrZ^u`3HB{lA/(DzL !-MT 9@NP0@0_bF2!?_t?C,5A [˽gyx0}="_V ` >T0 B%zwPHˀ`ߏ0AԏRM,9A-W?P/z:R!p>\"+ӏT B.2F9!" K}Q@t0? e$K b?@%&Q8{GJB#w0Jg:nt!tyT}sJ">@C@b1$`t+J0Cuz&ʿ<#덆@0`8`<E.Â4\A K!@A@0 `t/>|PA$~_ | Pt/W\$R ?Ճ>BWt0p0RDO=$(b3xB^6:>mCUB\(@0=bGe B;}8 Qk #I M: (zWPrx0l$"A 8xRi+ı,RZ,.^a8!"j#\UAu0 w`xBPfBp @` \s\>.tCĠ0!`&7W`;BXCAA@L{!Pp'(j0OрF9 e X(/ ϰ!`y.7Q#|0?HȂ0_A26`BUp 1XM YX_]e+ |b@0C$s3q\K)0`8\2G"*  )Qx/'B4e(0<@3իHT0! VޫyM+;,%P`< T=V Owj/^LroY ߊAx0y%./Si#`:\0!jڸ+@z"* ?޺uCvt0 ?`<Ī S;`T;I0"2C/헏)e_LpPj 0  x8ĐA7RFn Jx R@YukjBtwVI @w"R ]q`}ԿE=G=Ip0 BJ+fՃ P>IHה0! ]K:.W&z: AVywz?j6 I/'K/F` (0I0 1!* C +D`;o^ *Ǐ?j`0)``;#; %Vv$$ s^[< o @=}T~făQ(0>_(B/ JuHH0>9`@ O G/JWE2 pMN08b8GO;x `6 < ^B4 pj4@Ķ UaJWﴔ,ITJWۤ`~BC`At!oB[ G?#Z4z0A|$ (,( TJc %Wz3El$Ȝjո,`;2!*|rA!KaXP%}@ ]C@ ~a~$~3 \3a2 8IvH`yL$ԫt!|o%V;`{Ξ ,^>ա(}}j] ?: @0 _Âr0XCHa>J@.<0<  yu@A@%+V;uQL%?+W. <*PO:BB=./fTq7JtpJVq@9@BP0yqR`g| AP1&-, dWT>CX06@ 5B T~ %0 C|cz |{ʫJa^oNs 1~<}:cH8p`<CHmFߗE_P%x.;/< _>4 %[,|'L`tb"U`v ?u^x  p0 tE*l+gjDh Z]&@QXh~8MbP0BXV꯰<RH?2 9=Ź I0"`0B8 G"AGU=UAT x8c @`m8b(,V h Lt28@A`xo$AB@C/W x ~<+>'`@p F 07@ HO=)<%X0C#S պDx%Ȓ x$ĥJN$_y@jJ@`G`WB 2 ^`x@ ^E쏇˕ # _ #43.R#DՉ&V qxG@, a _„ "ZQxC<<#^$+6?[/h`AR?AA0~xXĬ V#dxH^ 0`+p"1(?VSBC!"y%+IPC HPU{-z ƒ_LJX54 t9A l JV2#c QV:tI CR@A(D|Y>@ p `~=V=åJ_[yhN8ZPR+T H%E\G.}_lK+| یAKˁAh TJ"WPC?7w E` `K .P@H6`,J|Zlw'8A*ߴpE8gǁ A`@AA=70(@  0` %`<@ٳcSԛRyU  E4Xtˁp ` H` A`:( eV~p:~?ĥbRA+ڥ|,K@|} P0A E;r`x!p04/k < ?Cs\ << '3_gAQ8_0!6 d `@@p`AB\ G>])B * | F !Bx |HQ%,9A00! ??uPA ]) <\_Տzn~;-~>}3 Xp>t6 xZPQQ{j`A += |X]/0 ExJ"l&%*6@0p@.$|JXd?T! 2o q Ex󞟰JW2RQ3Tu~$QSJ+gEt x,70!~DP[}V|p  tx0>#`x^ m`0 Ew5 㨗&: }qh^j,"_?r)Ua`;K{7~1Q@y @ߍ T_}q  ^ABPB>~_~=߫!{.P%(<"tX \'&|PFje*)* J |ڧŏjAb:2p<0zvU`%+W{(0(IP]> | x0^o'\ 0Zzx0>U=`8B>=$ +h07xϳWowE}+,9P ix0@uأT$L_G0$+0xA 3u**@{.Kp 0tx^}r ?Aȿ6]K|a/W\6oN0y4{`2 ;/pXe[p[ x+A`ρ0A 88 DQps+TSq40`: ı>*h#d0gC̃`</U=L ı@`~G 9`3ilDPQZS&bP *xu* G!@ p 8)%#*`x#ݠ e˾w=Ua |( hUdImr`0_|$>0PYK /g$BH8g @J\_tj.9 =B0_T~gqH0@`}G^%uI$bX 6,{ꄿ'~8@@B@`;B}_@(f5X_o+ !<<`{Awp$EcV %P߾9~lV ]K8` }Ǫ>I 0`P`~h0AbQtR%o@0w|KH$?8@|0#x+WJ0 CB 4KԻ.H!ꠀ @.h0%NȫKцk_J`(|0  `~ yi<$BBa ^a \ teV  p`;$Ԝ4~ 'l<p`80>MX\!p0#J @?4`;C˽ =T000 BH0H{b88? h0 @!?bHCv `<,,$V:_afcyzaB@D< @h0a^>.@`~q ODx 0|?>XHŒ4z]A 0 >M'`;AJGe(ыB3~$J /6X0 0?6Q#00 $A?o@a?5P!(>`}m Y%Pqܕ x%RHWpz!KePOÿx ި0`q'A 0 [bXKOCC]?d Pq@$ JFh0|_|0'`<J>_SB"D*`aC ` ΐ3aox(0v\:}p@  wA> xU ^b0`; ?`m]9|/\WA\)bD$+.J^cKUEX @4p>0M6@̮xIT˜iJI#,u $Ђ iMW@)X0 x0x%Iͱ;~>_Ɠ $@<d!A?2 >I#㻻sI0~EyJzHp$xPC~Ɋĕ,SMTZ`p0#^2I0 {*g)OQ`:|$@yecN_0`y@J#%`P0ʚrH1 J߁M@r?Ȱ`/ĵ@$?%>S@[` x~ rZ XHX0`x|\ ]TIJǘ#\8`,Qxzz$J3(d|CTP}l~ AZ)G@<`B ^/,@`̗ Ii7|lx!0^%`~+^DyDOܘA(I`}Q"y@`ACoB`;U\ 8,%+ph*@SӓZ`Tyx`};eU*N0 ďuOʴ`,OGcB pHqZaNp dwVX5eDw 0`D@4H̟!YpDUZ t%CxKTlLǃ pA? s *P| @%B%{R=T={OիH>'E2΂V%+:\ڜ0x0!2T;!M@q:>{ZU A5_Ġ`uPԏ4V{N@B1(X 0#H@xJ`GUہW@.^P ? A#VK=%9|t[8@| @V$001!obP0A#ń@>< 0!BJ (V?U;+( p p0 h@VxwKĶ.WAA~ t@(굼,g$' 0_xK 0P(h!c"`< A:RI h0 pj@  ̚5cMV[?iqP ~ )5 *,/G``!5@8IB|.U@~*L0^ p0~ e|`=GL) mF ^#` tWh!`,P̘`<Չ7kN{@@ 8I)i*sG! Kq |%*Q.A.R tQ$`o(oQA̓c_( Z"Jr"`Gu$t: }XEkW Q )p0gI! !`z+U/BFF`mD`w1P0̪3A@.5lx(T_8A$`CˋrL >SqA@'X!?\J>@U/x `|$Q(" 1(-{0x$6 ĕM `Â+/r;?/͝ >0bX^$bAu\ `İ3V*P0P)Khx0 ˀ0` AKr`Ujw҄`7 P @0cQ)PN* D ;\F sTt> 0\XyY~jlsȒ `0$$5P^=F)`v( oˢ yD**jP _ !@ 4M:mp`F BvP`EW)ʠ` BX0@ 'ǥ?O$`w& 0 ~ _HaX0a@x#nbZ}I4.LB^{ƃB `.7| *pC}b(%  V/  0@x":RVYwT\ GσpPr>`< BW=}X S{N_AV&yR' h E|%|o~~H߉@ٝ Hdle]/M! B | J jX``7IJ! T n0B)Tիlz`(E kTr@>.AJ.J^Ck$A,p!~`鰆>DKĉ:%s0p<@(|*DtYx0!+xHx G h!#>Z+P| xYB(-~ 0( `MSp&fqW4:8t$ eya|=lIrv`UG #ą@r`Az<X O%.N!|͠ |0BP %+?`% r_T2`x A. 2zC> @FP Q@ 0ۆAD@`;&`-@둁!|J>_ZCcR+`<=S_NH a`0wk٧Q(.WaC:*R >)Y> !ğ|v%PZh(O:08@ (w 0!U@yI ^\A?!\ Ҡ`<PHB.- 00>P`Ŀh~]|#\.*@b0#P0!J >* KB ,R2 Q#$h)CQ{M@  ( 0LpRS$%)p\ qp0J'|0A@j4F/B`% QQK,:*  X +/ 8 8p> _`;eH0XT%5z\ 5jRl |}`y>rS`0+|?pZ@ E &j¬U8%2 @AAA?K > Rmq % `|J//LC/.Tjaj`5`> @TGx*T?Wb`<@bMHFp0`/ `0]`%El ljÀx@ `AGxGCSHoh$ 0eG/pBHLy(@t"XJ]b@Ǹ2hT  +;y@-vb"#E0 V UVF0 t 0P}SaV 0@W^E>  0^<|ʬ dW'I& = tίʢJbWh S(/pC:ך|  i>~>hfwAP$$` (b PPBU@~ x0b 0y`A0x !/ bA'x@ p0" 0’ HH8 `0} A UDPI`8 0y Z (0R 10GR_%Ŀ(@t j"`h 0`Lʀp`9P0Pc\ P\"*o%PE@~XC aA$3_0k 8 p1  B00$sPaAA q 0@A6XBW@I `TK9 H`BU0  JVP > `2<2f`~ O Ī;@0P0w* p[  Uc 4O`~X1lV& ``HdT`;40!/o [ j2X , 8 `5H0~>H(0` ˀ ٗ= z-Ń\@, U~ B@XE@` W?H~Duea}l; p1BlX0!Nd$/8K.TH$U[D`  uZ W݃8P`}U^ `<hA J4pAI(?pp1Uq(w`ATEu~0P0!`M0`9 X90!>>^/â Z`AAACJ[l)x0iب|$8a Gvy(0. @0u `CRؼ|y'{! `<9.P`|g o0` %'AA)`2KVIAIV?j88 TC?+9@!w}cX+d>Y.u9Hkg*=fێ(x|2.4#sq EV゚ZDT:|2<}͢4O=3p>FDU.(U8\~sHNk{7Kͥ>%_ ˽i92O OT|vp$Nέ8$8ff =# jM7f 42S yϙ[ aܿO\wpP$z,o" ?i (ըo'Q3~NJUMV&zI=GPW-:^]N:xfG3\\q<7'{3~;rj&qĉP?_`IT_U]j،1c _MF.|V˔): tF0C/ EzP,Kz%=߫F*T$ `@up  w%[N˪ +B/ s,3HU`ggWç)AT:#~1'øwY5K<%Ohd {z-qv5p9Rq@pp=.ǞI/-$v0YBH)AV!(ޏ}>}qI1Z2j~a0 qO8j|oh0#fSP2& |dpB),Bܲ5~N@Hx0_AtH1`(홀+yF A81ѐ>gySpˎιf:y p}>WT/焰>j?>i%ZT CT>/ցӪ^d%̀hf(==# ?@HO QS`0 {@ /MvHdXfOo?P&>ȈH8eʠްvO2 }ح3+۫nF8`BJ*zgAYxNT@:#$'Ā.&5(v%6.TiqagUE{OCw: ùl8+9=#A޾3O{5x (8K^Hˌ=yΧZ (j ˎ @>< nr=<ɗ]Q(˪_n)b(p W pN\di^3ܧ|#tҪ#Jk)I*/:=O2#nܴt$!G0".t>=xhh382gSq&}\bS&* ]u+B0VJVj@#߁Ӓ`0 jŮ5"E `0P0@qH! q珇jNxu>RqJE.&OU%{X8_­^m$:dH/ 'I#!5yшa;Ll2h |4c%v/%qq#5P Dc AĀpf>p@" | B !ט>\ >WWsˉPSo8|}Cj}a&2T]K#61o_Q]Ap'b~5xS-he_W}/Rߛ?*< h'O 18S=ظ!Q|"Hה`: _X ?t8!5uzyp󜚇5b@rM1(8@wi8?&H_P)FE_Ӊ:dFqa'EonЈ!_q6pr2? 1idO8 #@U<) ~cK?xx8V e9zytqĹ#]83Wb'>q<&'_ՈbtZ]$ + ƴx lF}2 puB5ډAHMD+/=Jm^ewsoWʍ5)ÆPi(MX<(I@dSS @d|fv`f u%wpI*3|9Λ =;!DإB'q@d:7NEw6v7{e;g{gzAtY?84~lЋ0. ,kD P=|iP)NF =@$s`%C(^#I`1%q `^u ӑHi3ԧM@+ۦޔDZǥMa@ KbpFK r2?%# c_hڽ4/󌅟S:GHHWPbv}H)*C[d`iا6p>XJR +uoVUfx|RhKTG|aD'SXզ#s&`D8N*4o7;no{՜my 8?VɠF>#G\uC ˕RhɄtODV^=`F,{u 3 pĠ`BGWUtQ Ya`3Oc wёy|P''43wg}VHuO E~S)eZ"f $^>0huWof^pht_8;v0L葷9pe!Seۃ/0 0a~Q?0 I8^РF Oԝ.7h.Qt3/ 88GQxt { 9P"XJV>˿3)oG >\i`uftxout6f]Th;HGAr0 4b:}9ψ75\VRz5dxg(]5F#Zq</p1N+W3ڣ*^~(~%([H#OT!y:\d0 j=WG6H%"_pBd= cjB(8?Bw!{$:ÓDs {O[?*eU^l-koq)192yـ0@n U ntxύ)MV*σ RΒ*R5kyʚ wy < Gwg|@rz30-: .&p)>R|)h/B/삾__ǣq@{MbBfx;"` u-:@48(.d,>td3bA#=NFnxwN)a :y. 60LGDnW< F^2;-UNj?BGCH%'&:|C5Pd5xf0Ξ{iqȾw*ǧg!p?jg)Bq.p3zLia7;\NENr>Bs %UɸdS;ݤF(SZ^;R1:hTt|DxTǣT#Ή wёyyg^˰Jik:.ʙ`]OpdI##aZT;#9}zeV YYy Z.{򘘘{j\(߰g3a(0P0bDĠ`0?#de~c`AlJE.{"G^/)H "x+Q kz1Au? 6}PO#Bh4kz},fミ$xt2C'#Sp?/$1@(HąAX:E˂(9U)Ia |}kĻ0PVpU n6( >Voq}rv$!SUK`N{mcK?I7Z'BBz*#EveV=dh}la _iL K~P3W0V%t 00ƀ4 Gx)a/t!(JJ_`ά5&իOeԹGC%`$UV,Upp 6tFwje(w}p`#NB_ڣ^0n$z - {C!,x=% =߻_f**u(>z.<{t3^_A|O9(p."e훇G$n82#`)Zh=f0rq@dmp0DSÁ $yy`0.šzm`lc6Q+8tec}l7ݽ}M*; `f8:?=hfЂ+>?("?h%Ӫzz@*~DSuZJ \C/ >:$ -RiO ަ+ӣ{Z ˮΈ:LN5"#Fqd^|gsSQ. 2|3#UX|0=΅ugI=] i) *S2o4KT0#mš=u"O ͈PaL.n:3D!> y}UOa"Z-\)1DL<]p:`idt~ yUz#6AO0!_rāx0@%Tӕ˕UkK&W`&ONbha(xCSs-9 3-5J6'8&->^]%2v0E yЦ.wu#u@9%}O2#+ԎeFǒ8qޏ0}N)#[$^VdꑂW?4,_ -|;2v#@8F#h ut';G8ZY O"C@K/s Y.}X)sSVq ˎE"[82k@2k<[BQ -cO:ǏO|= ! =`6`ո}n}7 b_U Xfl gѫ83b nzq $X_rj$pdC<d%>GB]:p+'H .;dP pdm"j%$&8~ m3fƬ/䚰 R= Wd"g {[Tor-{uG$ ''S%@d{r(Xt`<ġxww0R 鷸io[{ޟ@,ϱ^Z{pɞnO=.A8G>8㓿*5B i#{ =jĭs0 }GJ!QP=FX 'A5j`qPZ` @` p%`焑' )Q{#F?i7<:}=䯧,3K1>&/pgL 2c8$>db—qO{.5m H|cL#0گ΃Y^\ qP zx)$8 `UN}*'*7|=2Q σ` ȼM ^&p@αsCtz#3}!˺o/^!= H3&W$zn%3ԑ?C?P )( =]UhDq@oNYY4J>FR=؅{()# z |ߔ'xpp-AToI"~R];!%90X0@A/(Q0P0^0 |ϹpǾEg3(kl]umw' % ,2zgC(t2MA*x1O8;N)}L#Ue ?~Hhf0<u!nƨT-uW:4iC4XԌN[w#B!ҝ Lw0Lc ?It:2=(#<"V/X H9/!՞L (8c/3vt&hX.P3:B(+y3Og7^Pu\ĥwLz^xaszR ith|]&sxL{77:}vn? [#8Ź(vp3;!0oo{to=Isn<\pFNY61fhi <>V1IHe 41HQ 2`E(Γ1RqKgkHM*8\F+۫mR C#$\kgй7BZMhXP0./%^!yk4fyæaШ(3V0qGZz6#x`|x8DD@DUF>/ӧgH`GǗ\32{aƮ؄5uFhw'^Sn(Vcep z{p?6=Ǿ'Zursyǡ4-[Zzp@ TƓJ!<2s2s E^'ȜjyKx9:o]"L,4JI}z0H8+W?_?1 P~](ϨXSN5}`>g,@1KM!lfC:Hˇν>{8@F"xotuO˒ ϤYNyw^1E#6'y[zyq= $p0OO{ӡL J_"A88 `+T ?p9a'@?1Hy 4@{?ciEOv@ V% j!p/Ըf5zd0aD>2hċ0d*f܋p۝wXL~u}t4}e1|8 h)R%!{:K$|:#hHo,K&r,0T@</p:p)z1ׅ^؅R"uzO`>00n@-JtuʮCa@d^QIU|zҵoEK]!4\.W}WV68/tD4#LM609DD3O PMN>,q<|s *%=.+Bua>cPXS\2Td=Ѳ d%<И9QKo4!rh eeĚA>ؠ{Tem_OI O2?zWd*=G{ ~19OTKgXuqf6c _\I-i{ѠvpIR5n H̴Ym4ghGGHG(\jܞ; jTzHd`*Q+ӓ{wz5t“iL0!o C~t/ + u9zw~,ɸJz^'ǴxU7@C8|a7{բ4K DrVB6E1w6ʴE]9M  7 pXBЅ `ƃ.E+vtq}DadЖ__|,zmuezϴpz /"[5ɞjO6w&m5o :z:#‰D㞥P)pʀ$ą'r <\&+0|I6O@@f $>guᚸt4\%p>XJ`i }; zDtfx8@O 0SP@#٪nK 4 1cOHZ{l3 *yLěpD"jζy. ~<3q03:ηg :pbxͭ[}kIBPX%?߷ !Zc&x0`URPpo ;M}Z oO~4(dt;/Ssӣ67oyC, VHyUz%2B={t2cJ=#潲&z>8DgO{秎^PSC .pTZKtF/Et" JB2 /V%t@. Xׁ Ej|(2] ||c& ^)Va#@$]@4 P%F0*ES) Sc'2aIR9C&aYw9=W!H搀RxCE Rxdt2KU FI gT/Ӄ2J(  x%AKՄ`*KФ*Jj1pwA?S~jN #`}X)ՁRe>pJ+ t3%u+* gd{z͛K`ڳ}8|)_۾#G$QF̈sV-MQ[*d` 9bh9IVO)"URr<\?L=3/_)/nq܏|Cw9s_8 T郂UuWʫA,ˇ`"J>u u~W9;u` #sxwyݷwte!O9 p(vQ&l{m瞚{{9۵'fm H ftЁ޵i>{Ӻmm`0!(((, {Ml 6x?&&O >"ci8{@K~l8m֠ay;Yp¸gޞRB5aרV SWx7gOly+VFqFwp LFHZ}H x ǝl22ΜpI"p'鐊 K(V|gHk' Xeph1pTuQ'CEZPCBai_SA0/ u(PZIģiA॒TCAD!_ƮL\ -`ꌽ̒p9 B1J083"?z(6ۉ>U=2/Tb@ԌUoE[8`F-!WGQ@pE",UKOq0ޟÞjpGT.pd%9vXUxL' C]$.zx8xg2TTau֨QbG1hDdD=uF+>d DP\AC//PeJ-.-@CGiЊ4R[?bMNC=<(x8_ơI?_Ov2tɡǝO{o#?F&22gi9;)Dr{ .>4+nuwY58P;^\!,JtEbJJ8Ї`~fڤʋO5wJ|t[+gDjyL)ŚeC'w$8Jl,lDaew+`0`C<;h32zdžJ4! ;qFڣs[kg5Ni8Q /iˏ`?waigXTpB0wF ӯjzUVLm7bN&<]IU9M8d{-x8x:ii3 -e Ӈv?,yʔjԙ H0or'OSPx}P8?~uD?C~KE ||J#_Fg/B ݽ,BU/IW|L,x~xf~"i{N_.T`{W&:sP lZ82 B`>># sdpfq@Xd\D81|pa[Tx2<Cp@8$;o:OPz, J`o8ZH }( glp@\7B.p s3g @’( AJx~-N8sDDH!=2+%D7Iƃ%0 4\t2g '/6#/'ܗpaiP0 A/Ġ?vA"U4`T2aHKĪ"\t- <]ئF6~m NP-FKĬ(}rZSG@ u 2 PE@KH8B#A@<9UB tJ=J!@(2$ PCDI8X_z.p24ypì`KnWp0ܯaq(  w$%aLAyrď)H;į~>D2Hq.qFlgY=wupKr/Eᓓ*=ЕX "8+-S [w p c`~>8_ #1ŕT#Tn9ـD 94SmI@s/4؊u{ntp?O GX8e<,h^p(8}?O!297`(B H,YP8 m>BpVEC`BKc:\z< (~IiuR JBzYWѠ8\33O&WygH xэo@wup{3\rp<# E{e6‹͢4U>+NtJ(#@) }$U'2I uq'," |<38Ju7O%͗Cp\~8+ܨ.mp­4|0J2YZ%=DRJ>( l*'U|P*O: UmuGHDA B7Ռ!vゟXq房F]"cpx@8L_}p}ﵴzPo&p{_Df U |*9pu@~Z҃sFx=YI"jҐ5<ֈB%[Ӷ^{8#f}%Eғ{z(C(FIp f`)ú5#!ldL3y$\# YlA<5w)㮓CT(W1I7$K/P%RPaK4+W#0YӢoG}Ksȝ]P}å~4#U@`At|! x^: /ϗ+ÐC4}+N1(bZ~80`˿/|R}t 0`r h BH0EQxǞty ˼f\ <` 0lب/`APDB4f@$G sA`0R󺨺dzK\  ^>]l > p ŏǠ0`x  0t?RG{hãi4 m! 3A 2ox}2`TC98z8֩~$`0\|`0u0!_(o=0 h }?I]2d&*D8HJ=#.UZ=̖~T=A'"0)KT=et!x&@.k V"X+!CR0&|E$zw %`U(@`āF`@`:|GB*\^򏨌OZ iw :+:i=0K?Bc+u0$J}t {`T p0J4_1q0 z*`. J(02x7U'/ !a?X5𐬘N J @Ƀ $1 U#ʂ uUm Hm]11`GȞbp lA%T C 6|JP ?Fa}|%( ^ 0Jw#4 !oRμ s!8 Տ+4`;\AD]?@?˧Վ/`|ĿQ+T0!1B??9``4!`8&ϗau%=Ph D`7HTJ|_(dBL4d0@ p z { ׀I`0%Z%ϗLe<P`KĀQa (OcK@ @c5V:ZsDXt3P!Ip!,xR'_ Y$ @=h `<āXAhA"E# > 0 TRGp Qp0!` %zDT0`:AOU* 94!Xv}``:4 \7?tp@TkP^{'6X>`xh`#^ qp0 `EOhxܢ2_SH 8{!  P!y4 C#_̿p`(!:>R?VC bOH`}0} }oex 0$[r+_ @0:ԅ1X 0E%B(oˀ)!F3L? y@h-DZ|0J6 vP`ĠQ}Ulpe[U*> B6pɥY KB!{}@ǒV#U@t} `}U4_1O=P%X+/Տ,Ě .$Q4T@<]y @^r>0 >(0 a5@ۿ' U!$H. *>\Xfx0`%UT =tP` $_pBP j_%poUAT *  h0K3K'I@wUa0G{cp'`,!W @z``:Uĥ~*~!UPr@@| ` ҏ0TIZ 0 v_ wK.jPʄAC%UŽs?< wʃ9>$|4K~u0GP 0?*oT2E`*ՂIn?!`! @p> P0t h0Yp K\$AZϞ;}>@P`T Jtyj`:~?.ʔS6^j˾>*L:k4Q$ $ uXRϫO3쁀`9.B 85( g\ =KAK<* AFu`x 8C/=pK+ <@j *A6* /pk 0:$TR+H>Ev> T%j?//'~?] h0|,0|p ^`ɤ İ0pc^/LU)0 "Pդ`<8*(6zGQ}-T=;qG]3,^Uz,yB7÷%cﷸt5@y0` P(UX>0NpOPps?@Cǔ xEAp?L'$&x8 @U/ < d'0 80?pD"`;A`< ~Q>pU^%^??/. H0lB+aB8ǟ/ ULEK?Y玞/A U~< pi`<G\TՄ?b=Z`  (G'z 00 xL !xA˱G$%HCVz _:L~ 0b],t^4 "KK5%`'R$ j# b` z =._VyWT`JQ_ 7: ɀ.T CX $r)A `dU` H`@8vxXj?ww p}hv<>;5F(q $A_0ulAuW~H 8{t >`0-0ATb 8g*~0ph rV%PP w| sO&%/ DK.I7@p?C@zO 8B, )vj 0 8_v@! A/5XFx x. 0>A tqAq@AA }~T>AQ!t !r` 7(  `<蒩]HU"5FCBz~ۑ="C"Є_`0x`3c>.@JaS'  >L%XF.TI%p%A'|Kt.4G4 p 0@ Xz 0$v! `/Dyh^!XJ? 0VL yqw3n2B>Vb#`<AP2xB a J_Z/p0i C 6$@w,RvBiG`t\Ya8B0t`0@J eB*8!d0@9_N!+SOi9 KAA)P~$]JW0T@!rhpP!N t|; 4  tT îɡ 2 4 0 q İ`;D$}BF@m$/B0!a 10BW!(X%_A0xa߹4P K `A+/`g8|_^ U\V>|@3 ^[G@T߈O N? Ć5q\ 0(8 a;L@h(D0A_-p0 ʠ%R-X0cy$ P0j0%G_<%zP޼3V:C` ` %l0`w%Gj` T 'AyNuh !, %J5Ç`;`0 wj!g>;!XAV@|0%@F{0PKT Q|qx8Jtb `9^x.] 0?N S#@> XvGh O@XVc0> (E`캆R^$G h0DR#tÏ@0rJ }"'} d yC$V[JVu0`^ `; h˾$ '/!0E90JT2`9a.>`G~<|0b Wfj$(p?Gx00'xxL0`?>*IJ^ 0h!"k] YzE 90`6GꁀBd@GPp`ߙ|8`<K40h!j{| ~&$ R#W(-P_G@*ZՏ>0``}0>wGQC`:Չ#:$Z$u>^9Lp`<PAA:şy^S8@\0>`wG0tJm `: bZVV `B>* >i0`n"TR$<ʕG3Ix0!2}%TP{`v;"" DsX`: | o /UI|gR``0! 0 ,@AC`;Đ`}acs`yD pIx@}_"A Xv}^g]N p0Ap~`H `8I7HQU<|{9%`*4 V%|`Tz*} }X>}kΩ,x 0_TU_Z0 ABP`$J ھyB8 HA`:ĂzU_UKR+?T% A]tRR=70 }H@>J%X0@Xe| U `;B0z 1?FN@y" B0U*J'@H/?CTTD}D $@s6% `{<@6}G0叜+@0 0q5|}`<@ h %R)Ł_I8|`9`ąy7@% 0@w Ȩx `T`~=yx @I(VsX `a~@cj_^ `:AV\= W0Υl@@c(m#0= B*+_,|>0? |+*Ϙaz0i`AHVFd_J 5PKK+|@!~ H Y|\PC>~հHV0N5n#TB x)`tqwAp~h` _K\ŷ ~Tи ڨH^?QB W J@>~x q&FUK H01!R(P1?QhxĿzx: }@T]U{|<<  y@tfhA@;D Jw:=ɴ-D F5Ò X `b@]9@`;c4x6}tFGx_J/@\59U0=́>#2F w)"VspUY`: _G*'t\ h0IˀK1'D_TZv0! h _|eU }h!:x> p(*7 ތ0 e P 0(azY<;% @yp0`r7@H<|yxx^@FU< HR|\H 04 x0Iӓ#`8 p0 >/F8`A@P|C3JT\\]e6#ރ؃ = ?'@ ,KS~=J P0` waGrR/`.;ĞQL`>F0>HV h0X ¥~NU  4)ږh" =`A/ L*BX0`zyϷ&)5B\`<<  LB`!Ap0Jp91`X` AA vyA<(AB> @`|^-h@AU`<+x9 `āAHf`A$ p)P;PLHly r<$p s P`F ]./XJW,AAK%Qw!?`tuV@!$\S,Q|0p `_.TJB?>`B(0^BX<V?ρ.F3/.< eՀ0|ʕm4彠ѕ@i_\ `;J?߃]?0$\>Zp x0 Xp1"JP@n0`:B0%| z`2 ` ?JhP2 Qf| $!|jB~$| `0j2h wK`, 0J 0 )⠀ &~;%bG0P ?Њ\^kSbx/%bPA֫<Q0:`84+τ?WIT*p_T< `0#C,HU( rUs 0 5bO@`::R  |J!ڠ`<0*`;/j0`D+.DE8WmH"O$`8ġr`AQ mRz /% o˕P`W&YpAA`Aʀ?(E`.r`AՈ-*f: Q}P0# hCX`?$%_{Tπ`0 wj  < _x`@8V ppG_Ѷ3{(0%- ꚨp1@ `)= D*N f@ 'Hm `{`F#`~|4`A<@.26ȩQr(=նzꠗS6VA/<>@0 @ ()`GʫrR1u`$=& !$ ?UNE`BbaQ?PȜ`ĀP輻0u}{s0ޗ܎X2`Da\B p0V; %EՏ:?> İ@>  &hA,RF 0 AU` |pC?ߨ*KƏ]D$ H@W(/ rp`ޑ  .cW?UAHV wբ\}Ih` 0PX aG A((U *lEb80@AR T~B  =.^( ֟Up IG~?C@B8U}+sp0}$!V}PAB09+= H%BM@u*;Ġ`:x0AaCc`;| ^}UC 6>@ pCJǀl!+W^Dzj4׀8 p0EwZ x4 o] qpCV 0>s`:RG г|Tuc߆S &A׿JQ)T" 00 Uh@U~ 0u  wV i[C)P`BAT `<B x(~?Mh0%@C-Ko xHl`<@^J>%vIN}`<J?KV@`@< ~Dǩ$U`xBKH/ĭ0rvvo   UB@SFD`($ ` ČS*`D0_`x!P;^a=P0w+>xc`ġ*۠S*?UA{8>X0Y4>z,J6AB jA!A&B *^*/B`}`<`0 D+`0`کP4t2 @$b\V>.x}! 0 p0`*:x*@&t`A-V?߲g hA/0> XA4Xrty*dCK xA qX?A80/a0`{X H/``;UPj@;2X`:į~ 6}@Inxq$ A$|=PIĠ //$ı/wz x`:$+.診|vWt$Z } ;T|x^g2 *<p |l:!@_% ȑ=h>^ `D xd6g<]Gc+}&ӌ@ ܨy?< dH$}@)U#@(_̴j`]aH 0~%?P/12``@`Ĺ$x?D}ڂA.UX`}< J{k_=Ըp P(gĕi0x*P#{VA*%AB CqP8? ؼǿRnJBx0bH0!aKQ~5xA!Z`0#s% PիcBu`D$rLk B8K >⋟X |0B.b>: |<34b@Bo4#죰%1 0A`5 K}p pj `ZQ(KA0`?mjc0>`.>Q^$z]}P0"J`0;҃uyp`AV x*`UT0$S$튽T4s0`y^V^ '¥J~^F p %`T_MT|5>h p0I|0fX3f< `}%y Ya`6g^]R@ ~HTBUW`0 `V3 ,rV x h  ~݊'x0 %*=r=|`{/H80 vD`: 9ߏ>䁰_) >a<`^Wy6> ?`}A WζҀ X vxE! j@  Ay{+Naσ iwT܁\Ka `v~Ubn@~] $| `|0t0>A.lfADL~ W!UC .ex]xCV x%NJ7oMX/PAPTϴʣ` H0y?Ҹ'=vz `uA^AQx0@}za0`x@7Oߪ@ 8<H(4 [TT^hȬHx=$Z^Z>|$4`5>mY C `0`|Q`8Q0ʫ*eU``:DCU W`e;}cSy2\ qp (=aqwK-Sg,Ǡ% BEWځ)X|D 0JA`m1Aw|x !j;@ȐնEs| +%XC$/V`Eˁ/Je2T@r4U+pA$h >^< w@)p$ (\bU 0 P;$^ m]7hd CxASSKOOp=!p zZ6*V<|0 ڡ˕hǨgFk ꁀ{x0 $D^^0E`~ T'0A`0 xHW`D=U!<`7D-UYw>(`<| w0`aF(q&p0Zqd{0t`C.$)(T U_& _olH >OL# xKTxK*?hd぀ !|*xycCUcUd6 ` J KQ|nt$`^ p0v~ 0Qoq`wx*gV? nT? @`h!x0Jc B . (AZP0R-WǃB_ؐ  C `  !d b`K a`0n+Jˁ@;#:ph@`K\LJ@>!_V$*&6 1,uWt1a`|@7J`BmP("ڬ8Ӄ@=c*BXG/=riy /V$pA^u&P0B@ `0"~ J!)vgk|`<Pꈬ~pv(8ƨvs@ JV X U_079!'`i"lC``:AP 6q̍<Q `;%J-RT찿~hc@0x00X0FT Mb/Ұ`|/(O6e`y X &%6 >: '?R 7G {:CU$*&s h04~ :V<⡣0x@%Q0 v @y0;!r` ā@ *S~6:H $B*NL=P0x > \N6"H*x@` H 00 UvԞiA 0 F# X0AK0r Ayԗ_jڰ`yDGx7A('Zq>%Kt`:0J `pT~IhBuȀX0@70!!`}AHts/Ó 10h0? 4I TM|q`@<@  pG'PCeo .K`;ph |hAV T%@x^>DUU8q``<*|mXx0_.J@`~=oh8@  `+/h0\  _5;, ` `94 _s FH#b`70#eO⯗ @"p=/>]<.{YH'/p/R ${R Ki'D`80^Q=iI'ǔ؏ĀA-P * L_}DaP@:?GV ȕb& PԎ΀\ 0 KZp@e_MH (A )^$P {N2#A )Y(x( K'wt@P_$*9𼺉W>n`+h8`V  cV]/D$`É ၀Zl 0@C(7Deh A0L/| ؔz^նR`V^?3c'`oh>yW^ @(bBl]iSЁ|!: 0 ̏UL";|~ wP1.9 0``p0BP0!``A?|?-'0 D}>% LCRBh0``D@=4`;_ ~tBt%x> @Dj~ (Z)[N hP . r%  A 4~!X|1ՇQGc \D`jc0]0` T O`[~4>`} X0@% P+P^\T xJ,"K!x8\ | 5H0~Q9H/}-h0 JT  x` x0A%~h)0?4`.  K 3`rA yJ.Yl `K p5N2uX8 `z:\\?bR `8 X0t+@V hCDg^ P0`rqtHKD<^?@Od8?  p0V#a(`t h0_Jj2e@˂0`\-4 w{0sxIˣ?L@{0rh0Jİ`9Qq|/./Ag)RJ 00?V?t`<~ 8p(`0 ĂiA0"PA|d h0 0 J 2J>O9H$0< X0B%+qv "_A > TF "YxX!Qry*0}۠ၟ 4P4`T K/`<`BD 0=8 JPD0 00Cc& 0 y B@!!+IǟƁTJ&Fd@@<|O 0"@ynѓ(P<(K@4 (<\%0K X{נ?8j`<<R`;pP`A@qLA0 `~` <Ow:]K(`mT\ pBCP0!` Iv3H0`r w ,K9_Q<x tӐCX"P0` 0@^$xzz+U}_  `ˁ4|Dcj HS7` (\ҏ+.'ngX%B!:^%|Hwʩ`f h0X  `IA~?"PCPpA.*\3m  z$CRqj t`0> 8U|&>C}@`@wsH(AR`p@` بH`RW&s %Q(WU<5``AV 1w qx| ڕYlIiH0GU`|7'`ˁ$pJU }z#<0>h0!\^ 0#.ip0B$_GEPߏ COI{m郐`6`}/0"Pzp`p`{AYX0!!~6(,X8?x@`;˄ ? }JUPBBd./?`9.X0? $ a} R8_JǠ\^?E<[@`@B *Rb>@@ `B UAFG`9Հ} *Z3 hBYp?|F_`@?!%ށ En ۿGUq,'D`y^`0AP`Buq$dJ8?PK1X(H0HP'B 0uP`|% + ńrTbc`Nx`BN\THT i 0?(`;K^cxnN0ʰR23~^@0"C `j'5E|b+Tɀ%`0ʕ"P${V Ҵ=d  0>`9X0`z)n!< UUEnhT`X/ ~` U こxr"{͆N0Air_D`|%h|TWV\ Jz5v@  xA~ \Js/Jv˵#C'+ x0%#)_DpFa xAQ T p3EBP %:@`AAAxJ6`6A)R`@;EV\B0r x@vrC'|><{ʣI:@A| 0!*/pq>M`<4|\> 6@8@FE/q cUBToKi `<ĀWWĚ%CU%<7ı L U W~~5r0u+(Gp`B0 A <Y q  1XUĠeʠ/ 0n "Ix 0gD,H_Xt @=P@8Xu3 .(!|V ;" SN@ T `0/y+.gUw˧j!<\8@&( 01> t>,Jx:`>tЄ   RpH VPGtH8_y0x"(? IUϪ]VSh %CT߼SShZ P 0`J0pJh0@D`pp@]QRpIK`ј0BH \ 7 U` `~GTcST0[' P =TA<UUPz_x0`>HT%mD `P0 }:4` J-pPOE I0P nA@x#`:I0q`}#(0Ti^p p0`b>`:Ѧ IA `$Ul@xR M` !yKXP /@`C} V+ @U8H @0BX0_``D W VR ^3| FD 3.+~8 x .#ljJ ea P#HV MP_p3&~ @~}Z\꾎\h \],jIA 4H/|cE>]ȄbfyԎ `:KAP uJEc,@`sĥx th@APX3!|.a hB&bO)H0 `7P$xK6`8A%AVQ0 p0! D4 Ձsr`q0!мJt08 i`;~> ?.U@xpvXX%(I]GQz2wHDH $IT#`vlE j<@`ը.`!`)p5HZ5`<@4 `yhl+ $2 0H(:T H8v 0tbP h /OHї8j a5sF BDKҷ F3A}|}2Pwp bGApJhuu>\ `?0?"Z-G@%0@U|khC`~u*Soh0`AUsp1.W,#eBt(Pa,}~4Wyx0&Qp0 |=_@Rj f$@|dd#ɧ`˕N- @ww0A ܁.@,'ձqP0O?*xK T`7 | -A/.J9Gr ?VH*>UGAwT<]X0Qw/J Pr`;DA .Pz&aHU~ONIXZhpf HT jhCV>jL6 0XB}Ttp1, 0Jj]?O_^pK/.l<UXJV>@ԪV`DAV `;K@% jSHeZ "XF@3@ H -]I}": x!6?GIzM `<ąCUtK/'?{*sB/įϏ)[`;A` *%ԻZ!ȯx./ ǀ[fE_hf0|! qXwX X0 C ,!_UGON5@*?Mrs.H!%z~N'  ^.@m +4D7`7a zxZN0 x$x|%/`@0 lhj4`A{qQC @US~$)" @.8D|%6q*`B|teđ!U/ϓ QmqKI2XX / |=DmјRAb`~}![ (A*VCnt+@U%^x̞./MXVAD`:0` A Q({qV\$cID >`_@!JvKK(007mS ~4> hXM}a>/*` DŽ@a{wQ~RA'@d (|#P@ IR+A'CLS E@~@pA00``~@(_cu^Plp`A/AA Ҡxx0wgtFCc w`0@P}iz;t $|l H`%8 zG `$ CUK $Q7AV8! SȜIVW,).T  Q$9tOxAD`<J .H: +] 1,`Tw^@ H >0>JDP (T@AV= /(uX{BxCz00  0K4B 0_cW 0!oH^, z˂ Y\&%yGUvK<p`xARP] -86B `ՃL& < `_8IDUa#i .w0 @RBRI8\񩤯> ` U`K/H^JקERz:!Ut@?<_^o!6$`p(0b4@\?P@mpXAQ⨼}j/QM ĵsݜJz@x/ Z"MS5AC(O UmK pJ++a(-0/"B_ H@0! `7X04\ p 81? < 8INL} UjBx!~^d=XV Z@@? WU~p `B eDLeqRt!@_fOp-Wn o  xʠ ~mV 4) @T x;0 4%!W|%j[C*V.9AJ%)Lya 4@5bEV~@PɄ` M = ZhT#} @0 Oyz*Ā"Sw$ (dZ?l! {0 Ь,JՁW C/C<$< ZUg2{y H!&E)X@08 (3z:h.yaZ.P+3oA:S'tX" 4O(Ɛ?Q>%ޞ`Ǡ\Fc`\GBY|fnic0yOxЦ~veT䧾=gd%]*TZwfFBT >|=J2H)\2s}KQ3 s;OC0Z8t\!wS :zNU>^ w@4K|> 0 `S F#Uë XMi\5GhG 4ϏKfE_Pܔi9o “Yt` Dq`K FT'+ sN2g: U(/:&-ILjM/ϏUڢ#.؍60Y(BDB o ĦnPM!6P~͏ %`$tUXx3A\$`*1c !ze J8uRc삀`bS'H#u ^P  ` A.hZG:{I 0$@ 7C`G 8C2 x*oHH§7Őai7 !" ,X*<2> hHfB3S 5 p$yĸ92 tBp?uɺ+ZFebi񗦕XgDLsҋhxQ'&cz?W2!p8n7F<TyKA\>1Ge d\j,i !j|C?`L: iE.iٲ' ?kQUu )'3j2oUϧIxP$#IlAKfI̋" eJh&<ɔvu֞(f.hATJ.4xU2,hj'h8Nt*-JOp]$;~ 4OFN0~%6#u&S%Cu? r6tgLe.O* β7*W. Q{8P/4pIh -guJzLI•A,/@1 $gD]8~A'cp/ì0>L*TF,*rqΈ,MDuW4hF0O3i/!RXHJ2Ȥ >2#$k|`%'79Cb⣣L i@OnKA, E-6La Q 2/\1cEz4fZ}?]jq2| Pg:/.·nΖ:" cRa|Ҕ"i zBဌ !@` E dvK֌ R=2iϤHMaoaZaN>pd|gkl&"?bVc! ګq+hxDN"^dbNhy(\4"_s$ypzX?SLJ7*δGO~MXy/&ESH03aAI&`Ƨ.-&簜h"~Mށ9<;9DǙ@ ۂ2lghXf:0qr-s { /Ȝ:#i ~W"m4R m0PF(_4pENifhZ,f(`uyURN"6OR0-I 2FU~<TyP'X!IQkHF4碦;`g4 H(isR H"aZcAVfj"~iކm 7+%q*=î)ڔG1X D<Q9{X-Dzdh4lt}7|V:B0u3D~c:K\tʔ Fq+u 34)8 xzd#kյ&xTrی;JzӍ[;<ãG_{QsPO_]$RșNev5[=S8sE;=C[!+aW/vc6p3g頴^g| ̱<̘eMTNn ǁL$KUdxpKIU] POը$Jx׸iO˾%KP`Đ`<% 6D/JPLMĥj0%T]t@xA.PVPDZ00PbT PL C0;AE" \0@yRj3$&tWFl^Ͻ ަ[gVܷk~#W>b@(ɿ9)0l W ,Tj1)Ļ'/ojᓗG[Rdu=@-SB?TmWCb\/ooVxfp 8uf;\8#lrhT8P6gc|)5ht!I_Ĥ/!7 VGɡ{bOA4'cp TXACmÄ(62 pcT_ ru'e` rN}3\AY|9 FB[Z' H?[$gk30\!uqcUϪ_# \!w{-XyMO b %W5'2РhQWƇjHBڟ֟YNFkͳN$ӈςl,s̱]9> _k L}OWYA+( E^"~*(%Nyd9sc='t?_E?y5ɻ'4]6GbTmjX\a=i#i+3LoHq12AІu|z#GE<`=_a) Wzp\Pp5eBL9Bri g񣨺@N97²|>W6vNkXXʿڐnv竍xVFq`9÷xѭfg19NGPbq`5tĘUùs.{ɢ"Β)Lg)?QTucqe<YT?a~} %BC .B xnQ~>5|Zrש(8`O cAI9LR<\/#V?%J9WzNVL ZD2qȔ-I43^oD XT3/ ^9E ϰdgql$ nsVj@uMxSZ*|_W(bi Ǟ$oT ij`~=^6.PJCG̼ LҀږGd$da! ,SQ< h|z:8сa+YCk'Bf6,O SE-)'Olr<0u:(PE00QY V;ֈa0U|CV(N5 @(S WK˽FB@@8J?~L$.'"h^1\ f8 )`)*\ \s$wݶ7gLqFK_hjX4`tK`IO Z4i>ǝ00"+yވU?`b'R#

ǫGtIй'w~0M.J~iA!x=ʮ}FO1[ć'9zI >;hN i b-f)r7l/mNL848BNF#TG(S}Tn2#UDB\4Lӛ!3񞐹I -XP!]4OJo{R`$+@;@U6 y BP0@DA!>:#iSp`" %/}03k59^+¦KdO>&Vlu"r ~kAjsNHRK nֶtZw&b jssXj> Tb)qӢadl==l EOX e#U78)ZXt@6:17@\3@V3;R3F4<(XBR?Ʃ+oaMG~* 0`)q2(=4`| F@2`Rj ~N3gT @%`p#5 B 傒YanN@g,c{\~h'~f'1k茺PS L7]k[ ̡?7['BXK85"VOueO k^% Ʉ~Nca+i St`,k=!O`^9mp΋xϰj 2E9g ŸHij v\ GkCpi(NZS(TMfm-29E,m"v` +,FoAeR !/ʏ\ F~sT|VclYi̓K3 xGZ*T` 2+X=*4^T_ָ|Ӑb2_Nv2??P1F(覉}΢:LH;D )%JNBYv&E O1DQ2 ?Ħil&D ='9 T)8' }IpYFZg-²u>HiubZru?:"k`[acq&A˃00ND#!r7 & o ɱHeu_ډH s֚nwZെв( }LG7RdYp6eB`#+or*Mb |НmH/=ܓhx)QqBy- :`aODuРgV &pvq!Ѯ+{_}5:_GHS71W`Y IV~4^B_QkIs{ =O+BɨL!~#a3 fVX ώG.%iySXuge"XS+jxMԺo8˃  Ն*%flL1K3`fPVS゗kp4~FDQm7E ֨,0؎}:=1zsEEk*P^h]; BOINST8w0D;rG(v"b3i0Ֆg6_ E ȜpGkbn!wJXCs\jRR`)xi.U-,gMʢR<:]OircSaO+zpec!;fyg/E>>|eDX!\;kOŔhi\'VdGld?s#wmbM*Ŵ\:h;R@xYi2pcuif I<8#4S6(ciSqt7@$kj ŸP%6wU1ki&PTj?xb'nP=-HPr@gEH {qq|Ӊ5%Bnj"#4.0\;`uaPrGHjFuti3I;F)J\1Rs*z I:g̼.7O& G81笂̤dQz83 K [(];AO`tFGE'3˻p"QQō g׍M H-cyNbƁѩ}-8N?Fƈ)Sa1p[*q]}<`@'\Hbjo"wp`KUK[7L)S (3:NWPpehz7R<|eQ<ׂchw=n]]г 08X+7)4XZ}֌i=GpDV%Q=Zq]Iϯ;nﭹ49t =7w,_ @p՗| \1P?S} ˔ N 0Kja3}L&Q`bܢusW  xHRNpaԓz^SÀX31@$F Έ] e]N9@G\p]GHz3|<nWĂ“ Y;O|IorOmXQz+ 3}[_L4EO P2&prn`qU 6T)#L@*~a◪:XJENcG*렒>A暠~IK. M;X,3  z"W3d_I) ?e=V (SC`1$@`/b)LabFO)zz{R}UT+:>#.p~ι&wD_%- D#gnAE|>mfOf ?q+S5%8O? ޚ다y2 8 +хZ )|@<ʪ41Ҩ;JOVtM"lRy܉!#FDޏX=qOc7g4p"{P"_5kA2=pa>YB;חtG30`HJNi?G2`ΏT_V \ 05B 0x) $} pp P5Kx$!P>f:O6Y!ʥ|)` ր?  PPǡS x'\HĨ<(~K zеZDw=_DI0Su@RAxu_@[l~ 2N}ȅ>ª=[9#C?0xvagR!b2Ăp9H& #]q1'3 $J+A?ƢHƀƘ .md2UbI+ίGXު٤OTySpϑYUpbS(˟wH{8=K^5IE 6ݮBsLpdFPA6UH|(Z:HzpRc'/` r@t$ 3 Q4Ҹj}?QU )Lq:$u"]V7{el[ 4ٗ' ?Z#vNu趿H FZ}0g|㯮NCTjk@'`x@l #G_08#gi"?슋յ,qH3d\|/Kk*ϑ_I`x2t_ōW2w-EI0p&6=Ռt0!_[%K/ ?&OSzuOw&VGC'b'SO񆄠btyjx,*p y4oxEUsl) >OΚ+xqӆU4v !YwpI~ƕ? jxˎ頻?Z7IA-(ß`AdO _|sSPp|uܼNGD\ VN?04(C@I(!m&f}FY$ , UV茝5>'4kzG232'hW_`FB\7fD ('6jW=<<Ռ}!Fu.\ |d*hF9//I3@ၝO4Tڂӄ::% mH#EcOT>#O>],#C/.p/_iqgOXqFOIzS| ,υ_D"m.82"Bv#G9;;[zC}NN3/#Jh܇Gpw_B'"|'%%2`;⏃ X4PuCA٤pVyo%Um&`ѬZ#&9ax_}PX&"M6]v3eW78Œ2=0m}~I.W+Y=t-Ӣ\dqm)8i;8)_@pW_ ƿ=H]%J\i[\SKa;ɶCAGU/)X/)wSR+RqO-E4[ul.a>o0DF1 Pp`Gw0ߋK%,x1l`< UoUg{$=d34!Lfvjzw{.(6܊Cަq#8B# _-˸KBp$p`C/%~/l+#r(`D jk)Iܚ#px(y!x /WiEVFSa 0`%/`;H qYj-dw^W|>**щGQxwg\Fp0yɋTkM7ył]<P"p1 OpC<؞U0'Vi!;!mg:1MݰD-Q pƺXfx(֏gFv%s *~ '@(/43Đ>ۀ19`` 0*d=^;/pS_J#ˋ*.3bz#@>'z]ػP`<""XP!+u_5\ 8AP|= X)n  ҏ(8kUgh؃1ot 4}Yގȇm+OXB;@Џ?HAc+vӼ.)^8 V Ey4zO:b3 F3U@b%l0hgnBaLi$"$̤=]Zi֌?t,QKg{ȏR?@xu󑀐S~j2$dfth >bV z'^x9ܕY)qX^t!>dGpKq#αqh^'Pt@Y#>εwe=/V #Ps^}:mj:7h}wIzU%-px;H79VY0>m pV@3apkWep$3~ze`hv\N&+,5q}B4O;yxaz B&` uNTZ;U6#Tu<6/0V8  ..@TN* }Tq,# +:"C5^B`.x*Q2@Sd|Fl3sYS>`g{tLx.y3<0B*CL4HB|bc==d*X\$Άgyɔ#>7?G D,"68I5{RO7zt#,`|ȳpU_(NW"]83aI|r,ɭ /Ԃ%qHiSsZvV޲CG}â?+*/$IO `t`=z21&F). `}?Ws7T#cCFK:0xwbkcsxGAV3݄mypqQ!}N7yDJ1EѢ?-T3CM1cDѧX/ QeH՛OWp_& xyc3T4sΊqb3 4/ |GDxe,%s[`LngxzO~4 &>=ylO6a s`L,Ij؍ƋrɣBE82< r~< K0# s=%=B~I#>-K?Ib20*M\FNvdRjkB됧㴗}UmQ~s ⨷>qhhd҅jMM&E^ r[u&ɃTb#ރRtx=^FWD)qW߱TiF#>%rM)t0AFЅzˑ{ROĉhF)S,as{:͝EӘ}B&TQ Ȱbr̫s׸H4-WI\czs%+uӂ5RcMnoP}Bdy(|'7luIN4*BAQ8kզ@%Հ\ P' v?ahEsg~ޓd? q?zX:~=;cSv`ߴ20T[__+ӭ'X&#՜Nƫ#uA f2.-u  ahsfs*ˁB%D?b1(8ӬB@8BjT`Pip/h~ '>DrW880(z"G```:lT_<% *vXM"xR[.dPTy\aLHTꪦ/*Cb00>Tx r{^q-J/ñ! X_;n3;K$}zx—yǩJ2]6z{o:19zTLޜ)!/%ɂ$&%0?/@y ?$`yUA1#1}yXFS@$榜D~L QTw(o۬R/Bǿ+FZ"g9ks;i\uȽ OTyV+PqbץO.2) #AxgE|(SP4 0\:.V_2 }2!6 IeJґ8_N?CT%wQi  =6neL<˜Ros{, (Gv_H8\_t! =65@8"!KM0c@!Up2r5g Wwxw*Wқ(bhF`9āU|":@EF`KgX=եk14_}ymGgFa)@(NhkΌ;v@ aӉh՜<#g``|Ā$JB`ru=61T\%QXRg, 0BP0(XmFP{b!pkFC&^} _@0w\I؞+UFc`B%A ‚ܔcizDmpʎxS WĠ6ĂJ)W.W:8O ' ?]U|Gz͉zw~`MS @P@=X$bgyt{q=PpSJmS 0+m/ Rr!~.GS;a~8[:w 8FgH$zzQgD\}#a!p=S4d&fKJt FN 8c\SgMP{B{n:(I:}.l8`I0pc4z:=p?atɴd)N; :q=! ݁CZpF pd*jUM``\H" .u`mLDu=`glP$Q9I r!ްV/Os!>cq+DjsM'd0`yXeܓ |*OhUMԆaY -H.SQ_Up 9 1*j2yp*\ Q<1nr O]_f5-Iɂ3bw2Q'һJ.I Sc8C.wk^ނW \=BԁqܯdGqv ABၒ=ޒ'8"w8gI3FE'`uLN?/נRaz^D'Bl9hxb$M^t➏(&xŵO(,F48і sU%r]Txt<=1.xWR*(: & ͵(e~I Ս4Fbl&rR}B26C2\tyjўY$Lm'?Oe0a"pD/ϊkG5LEG,4q;LExRrxQ’K&M9@g厠0j2{ xGMD~//IV1V}o8yhxR7\i`|hl}3*y=qW\q'՜,i@;&b >'XC'@*eLkFi ʄRK-ʡYO10dxgϥpð*t<Q =V~j搶Nt}.LTV90򎇟jOHe+gqv!Lfm.}|I߭?6u"Ptw}ϧI?=<>eO@3DRpU"%2ΚP#֗?"V#sQw`|X0` dr?q8Ѡ>hʋQVF [-a]$44p^|)0??5?~</dhFAAA(Rr h0MaXZ<!o70Fy_<2,osy-_ m*qYȷ|!=@pAD$& CV A0 ` A ViR 9JPK0AϕvhP_] g ڣu͹LϨ?oE7AW'x'CƲ~,'xom3a?+3vt) H`?Ϧ<0C(= 'FD%S&W'tUNuRм`gTՁ8P@T]`;j# X1IVqEFQo|SB ~x$<|_s1x$x <8w9EO7!#X|FA!*(KW9p8_0mE_S$`<8xYYA KzF~6 &oJ}.bC2hO@!Pg1)"5Hx(r !T yQzUGUƩD GVt!%J%_j `tGXeh 5g#@U|H3 a uU#`%x%ex>ÒR?\CW '&4z Pu,xJ-N` @! J .v G& 0>sHBwB5 `00xyK> 6FВqCJSDC*[9;S CUKXj?|"(V4o?S qdZdNl% ::VL^sтXfw<8_>^\3Vy&f֞Oȼaa_FoC?)ojjMcDR4Ua\ ^C!" D3M"zS|*/48Hd1O aAL"}bͫῨ\ ;U{y8*ݸL32{`i"3sEsR4E4#FzvSU?#Dց։~=c}<?`p=M1v[jmV^t.៟P#vu͎4iӉbNIZ;;&.8VZGZ1p D=X49TF my"ppy>+XصӚJ6q xS>>Dp jj`E&c8Lhj}4I|׵!d~ݫ@/:t@5TS;YCJϨ`2 WHp~['sL;wGSS<ŀ*UUEp~  aG>>%?Bئ +*PBcj< duζ}lh%U;}z^0pTPh2`+|<d-_@aEr0w_Hߐʻ`r`<_Ե/z|4$J?KoIU*U8 a/A ~/U7M8k]ƨ4E ͡`O=> 3h )/NЕ|3›8V ?O / ˀ)M4*?>?KPX댞"&8 oފiqjV8^m0Qf/7T$ӞV-Th0J֯| V =\2 {ޅ8|K;a׀(SAP`z„0`%ߠHaL,%Ckϧn:ϛrxExAPP  `⿪sXZ˜,Qw~2 V hA{;p`*[Љ0ފ JTamF mawsLַ%.wcU i"%#8>W *_: u2UgOKxD"WM8CJJR3q̇#5Ǻ" ܧ x pvVL`}ҘVxiy /[hi2{ L1C3WT(.V>ݻҗA(OJCj!*ƣ>/ MZ<3N4eOpۘ%Oz `X3KY{plyrV03!$&& xK DL(D5&EOL)?\eH.KTLCvڞ b} ?!;{ijb#?|4KOpy#z1hqb{d #Mx8ǣ}:  xybw|oWt>?qRg P CL )옚c$>ޞE5wx !d䔙Y3X.u =p8~@ 땩MLL1鵒^+LoT9<'ELb/WS0Gx#'PyTA36h@#O^GUK:/) s!6q5Э DeE.d&i\?ICQOh%ƒ_2mՍȾF:Q:j!.S[=UӮW'4c ;YA w(w% )IQ.(`(X 6 i%maR'z$pv'܇xfZȏW` 3E(H|Oݬw%C鋎CBvH$*MJL/CP <29_\\dI s3M?DQtRN) )>\ QcF:lGw>yNbxzBR lXa}@*g ҽ=koOIl0xeDt0gnhtյ@kx~`3PaV+yؔԌa1zGncHÌxeL9~I[ ٕ!6_8))8NW$^h⸔"&}dvr5!ZpgE+. gj4Ak!gh`bagLi>G]p\uF/߶,aʶkN#PrsIekԓt+ߔgTMĀB/| /ABX>}^SZO2`<`B%*j=q#gsܲO:" pp8@N)XQ6Ejh8ʀ )c""#g#1LW`~ )0`.?poV_Go=F ޭYz+00a`U*K[>U\5uK_IZxGA_Jߖ5/L&([n{mp.2=[rN8~']rnNAN>dPI 00>^_Uθ<@8@z,: \x;~@!!ڊ/ 8)pf9AH,*NSō 'cCCL zUCN82%pi@fI*!4y\x(SB@h04 yw.(ʼ64Ga^$ qXeR$wfJAUZT20uSlxm)^(d$P` 쮒% <%ylspȜl]fk; #U]x.2< zYxRҡ_8%e͍›w˲2 @:kPI/$eԽU G rU'}; C2cɨ88)DP?y:*Lx) hFAps+\QǗ~h(PGo.‹ ՀG>O4F}s \1fI αlcoTfGmp(%^zlӥ\ ԜU*OY OiC8 ꔈy_JabxtFxQ2:g(kZ1v^ 2"o,ܸI&mzL,# ^ "bWjpMg\J5Y2w}<[ $ Wvܣ_osmI)JDyT61X9@W UDkYעc r&M٠a( Qd͞z<*6p7ݪ{c6ԞઞWrQoXģUT^y]~D]4C%?)FBAOcC1#/{\.+֓`1RpG5XUg4q}&A):N{-o9&V}|^$C` dpHr$+9H* | / H`X_yup1wc8L>ƔSnA ıDus%JĘ\|!4Jڸ:0\,cܬ{ Tz; oHITU0>\>//.vʋl,P|w/0 Aw0>|.885F01=1AH LE0# N0L' kgШI$]Ww:ql) pVx8_ WE|ET=)ӎel'aެrs'0K:F1#+ ]VaG|gxX`jbv&iSigzM'aZ[DP[zc7\8_cfc4(UJ@Oy쒰3 j$y3p\:;R^!NvFhap0*Pa>dnP+eHJ:\CaGn(:%03~Bw u/= ) |+DU0f@`@ 6O^r{J:?[P^|H9#oE l \#V@ 0/T>Q :#н0Fto^)^Pg J[~-ƨ @O  ayU{%ٓ? PR!,%২^`<2Kx$X{tC0!,xS #+MWZ#OVFgcASw*+O1bh菦V}'xFU (8ʴn=%d]>bUFp\G d' feg)wy۞=ө QT/I!{Z1Oұ|$sκ 2tÁy&cfc>O@D9FG:#_l3 rv ƬgQe).hȶÃ*}'8O:EJp TC$\}>h0]C\c4\j^.o Z)'>=>*lfMFMo}nWղ =y6`)hGUMw&M012XV1o:#z^Dn-`-gH$+pvӤg1մh*`<%[H_#qzS?;71^b Eﳧ%__'?I $>c/H2}*U+@#!E)hL?((Ắ4`F?F}q#S4Զ&F2¨SfC* A3Xp}O?Q^TЏgI 8F? "dk N'Eju]a; ޵D)㡬ξ xlZئ]F빰v j}R֓U>q 4IێV%+6h/z(mfY̺-i LjqP}=g+DZ9 >lF3O7nRo'4 `#ȈmDsѣGf'Z>vt N|/WRI9:~%țKv5 ϧ W.M[$2VY 3ۇTϨh$mh_Xh2_ ׂ/5~k*;qȼsT!|BQcCą@=%Dr P J` 3T?\wS-ÝiSPzx'` a K)VàݑP8 `  %w%˜#tV:(4.3o @T,2?}X)5pSˠ0? {~=Wp>US #`Ă)UD&>ގ50L$! `?<ixA~=0WjaA0UІDĠ?;W*,$&;o}e5# Yԑ50h{Nʎ`nh3 -qY`p4~20<!yq_5xESR`ġ`@C.Ra?̃ 1E~")qNQ43Mgc}nc] p$|x%x0?>:%))xt ';]C)pwĆѸx] Sh~: `?}iY24WjlGrp1r{|{C&MT_yDz. mp%)v Gr oX$ (B^GAGR+t lC  8Է* KT*LvM?븦-[ Po 3PajP~Z?ބb D$Rmܞ5Gv)\v}mp̸!wJAH3](FsP#5s ܞI΍(ֈfOX|}fe}6``hPǎ!#pBwe-nHqpkx%J! ˜Q*yw{ hЄ)`k9J\ )4 W\나,!|!azQG *4JS8?uD{"֎slR^PkG@$@XQ;Œf @8$0 ިB-sk `<(DZH~QLk>G`Bؿ_#-kD) q'z̴xz63VtNA ^Ol?IHs!b։$O }O! ZR<ԸD0/ǰ |_;r^ I!2wb!P(0V#"3qDFL;bR ݏ`#UOT@F Q1jn`t3OpϺy%Oʱ>thi6+y]uOz%8Gp7 4Y_A,'Os#Іe=菂9ai9 ptπ*:Џ) ּ7^s[5c50HF#!fy̗{8MXXmջu.LP#MV .m (rEtSҊ#HƧyήLd*Lm"˛m i.0#.],a45+`hގT}tDy DLsfGkddSrgN.r|SlHփoI2Gţ=s69q%Dߓu;s2 8pҫh]i3`DNNMZ*%wC7#Ϊprw#rGϪ60ӍnO0@d0v)Au?dA4:x ?&cDs;>zX1OTG!p2 J*Uﯳc&K @R(f Z->QVB:y.l*"[&Tn xlsUFbq~q3YJS{u`w gf(S;nqЦԒ(_U|02WzGIN|̷XQ@1`@m75d.'1w܍r}Ξ>eSlw.d '=H^}?NO%'gS%G"6iNcTb*N!U8<0;7N/WHe('?C{ Y5.;,pc!FGZK)򟇒&4[ӟo A T]/NR 9'O2 THإ@])>6 Iuǩ.9l<p|~0Q >%F j#[F `X#V}JB !?/hxF?~X r35)@XX"gCcJ?I ˜*0 *| ($:<. !Pa~kJtP)ˇjR%ߊЏ'`(^{N@/#(9AźqI<.L?Td|` I}F0|S{ E_8N.ǺK !xS CT_$d?U{)T~Rp?̼T5;±sZuF.D9P(sCAu0A߀pd>F`Xp辨3k.X0`aTY@ա _6qqQpNL(S,x0]}(3hk>.X* `Bo84Wѩݼ/S ` 0EiyzVӄ`W\S#$It/q} pW[m{ԹĪf'eɑ֌l3ӟ40֩ 7hHXVM޶:(_V^D ʽ0~>h0͗i+trȑǦCR!A`DLzON3:zzz5 v yqw˧ؤy`<0A%ރrtWEI'm-2S i ܟx2z(Yq'KT%+U<lvD? f1t^ Cmc@yBwc}b8l20B!zW{BxFap>ˠ]DejW< 7Oj>W"IͭbR{<$\$`xڬHP>@R+xyr@}\;GM! `p'!,?`67ZLO0dd@auYULP+ $Q1C< ! >%4S._/˜$^-XpIy\- VRt_| () X ]Q ` .R% 堢QM(S 8X H}SfD()Ai %3 xAà1hL{PO^8KO*8B$*.;2j ccz{>:w(dp 0}^'=P1U qA|J*k0_|b[Y3ιU{(8B.Y3IV܏Wdۄy-}]P,*'/La/AB0j8ȭHG— `̨&.B8 a0صL&̭Ο^餜ARw$/_/M4!.s ~9%TBhCH}'/RH^)!h繟qD/Wś)%=lKqV~qyX4WI] /$6<>0+1Zq4Vea3di<2sS;nc-~u^(cr(_K&W2VkJ#dSFdفi& H LD%{nRiDESmK BK+y+Y)x~5p~E[ kg?dS=T񃑏@ܓ^RsB-u_G2xFOP꬟uGyuvO>Êx؄:tO5^VѲdu^/fklU-A9x(D ](TߧW,hլy;tWx:IM!(stV2&ڣmG& m[W/ҿ±gU]+d*A;ڢ\HèE{OX5]"Y LƊu_4$f...TyupB=]rDC`(DqbUTU۰Qn<=W.VKU=jθ&5OΕ Ө~I҂T O &>:L`cH|N}R oI8ޫEDHR +2?.5 $BZMV$|Da ]SL U{De>/T> l/a)woK%@"<3ѐ8h'[=I@`0H*kn>k<@/hZ/3Oy=8mJM`<\V@SюBqHᰱ&/2u<hLD ODQ3gKEPXWb1dR"xݦ6J(bx @*0 y~;H1)bbWnLi2<4 5b2&PH-S|~o=7EF8\FuQ~VjQ EGڃ >:'W!_&CxL[$6!ˠ/ ᦉy=|?Am* eb#1i98%l8/[>F=^lS1R4v]—]o8?*Rxoz6@>L3X룰<<dPsg ^1B`qPMsY ㈶ ?.^4OHk|BE*RܮK_P#)PGr~z_N+'' ab]nިǧbFf/zDj%]X ?'O3EḨ\xXJˍ""~|kxeHækc3kÓ9ae?\"_+6lb*ix F̸=J8n^!oh8A+]B.OO7oF-Tθ7QOjfr.DwMbQZIdKtc-%uX)xV^Cb]9q|WjIWCE, T|w;ȠQ j3Z{y?ρ-2Q}#Ay$uޖ weͅF??ka:na`@qbzarG'L8yO.})2LE[a:΢pϚЎGhGbp|MPr?im k{]6+s&ɽ4D= /va2ɰγsY)y,2>z!?dj`diF/4+9tnw[9}nSLaUi)nBeɈ${ ^*L@L`!zoUN x @$*WP`<{A e# 긣XFaL80U~Z Hyx@*V^]n%0\8f1SNS3F+gL*.Cմ#  CH\BQAbNαa.4!IA7N `@88vɯӔzפsq!&>D=) π[FS nJotzM `h$R #@40jĸ 0zzנ9t?`E VKTǹ/,5b苊 P^R! N @(ՀIdug[>\3iୌ8ӡ[(Rx>:iȘ t% ^} ̭f*ڵ֞pCBap?8XXgp.BAgD#ADu JWT D` ,ID `AW,0@ kKeVh_?g_L4Hh)?n4BZXt%Z6N,Oc53o{f@CK:S_rG0$/( h%ody7(QĵB1b0d!#5=x!+æP0?? "Rr`/Q{^5a`CBz 6 `;./$ 0L|0`;?*+ 8 cM4VNhAO| y_) 0 xRȢ@q@A /+ROՉ%pモb!?</{8:"cW#HkxEDs?ͦ~\_q:y/A H+#^o4_ƚ'ӂ$oHLx,"yFq]OQ08`\%Q}7"bzpX%=f“|cz(X;!x3 D8 *i.|4@wcs_5JcUEjp`? ^nzM:E#hYIyύ7(2p?yxH3 0{aB#jmI7v 򦯢G(ev\z;hq~9'ŀzjq0A:aIUc#+K/F@}FP:[K=d!gDb^7-,G\^O̝zA]~宯E dȼ9"o 2xdF[z=CzZqϊf ;k.s{)0֘_+{8@C\9>awGkQOI^y{z(ðf*N7OS<{|?bRw~6#y?|~\“1FDl'?g2ŧT':t9JZEKbh%l"NN4uSYWq= 0Qt $7Zp+OQuW$<_?tfygס t[-^kǷWUwI7Fk au7S%&P׽H_qEZhft1z6*ljmQ#6!W Fiy<2pI*%S<0vk)r9 7NMp#YrlY_+#I1I .`*|(F-:BhnIt$-EmfBA]+ص+goNʮHeݝs0W_[]2a 16$!+r6 T/P 8oX?.f{  'K  J0߆.P) H0??L2.V%ұ+uc_s?00!BzB?@Qߒɂ -V>1'( g@EԽhEbGFwL=\3 wsC \8@HxfqnE[wϾ@1BhH> ^0F0`;@  s0_F?`>mTødfT:x2DnY3\j > `--FV bii" SCت|VqSx_}c_.Wd=#/)>d^AqX^|<=϶ M6\Mr:o8^ WGt,p3O&}3<(S`L ۅTIV_dOQ+PM`: \ ~VB&Qs|<#r%Q4RG` CxkDUE!yᐏ1$K>V%zoGumwz<:yG&p/z;a((_ ƺQh_C+G"K(#.UVC(& `QtUT|hXddlfeB[Ȕc xYӫ 8m>zB+V<F}7q'6wPvdžk єF,e(?Ej'zN"L.мMaip OV:ᒳM!Y [(#u^Fd'.SQ4"z~l՘ۯiՎD}uLD﫚ca~b -=6F>1ǃGn!bK=Xj4?k[zd(SjA8\rh=qX }V\^0@-XМG~cmWoa3IotZuLg'Ln;O JJ{Jৗ>_HJ$soS.W.fQ#\7"Yr0[GL{osǓxf \15LMw^4G"俀-in@ۂMک_K9QlO<.<&V}1Rkl@ݧ>Zr{uZR#Hw1|4°_vX5¡6e`s}T㎧oN'+vdt|dg{;g{/T]y"O u"&!u=-5jF)hj ySjhOA]9gӞ8X3(Y.v$!5z^cOAޮq6.jz#&D܄^  6qbMn@JsVf)0DvO4T1W: GFF(9GY#FP0'Kh9X:q&`d|ͧ0ÈVO{9#r4 {h/+Tv}Z4أPi:t)b)>?⏰]O/9H_/IWzKג CԎo SYd`k8_SS=]1~j{&rO X1;gSŷ|3y\*)8JA/x0>\@ ! M> .#Yx0> _}I! >4 =,?S % ~@B` {'ýE뀅G`A*e|j#1~aZj5B9ƮmdfYƑIB1ѮA ڝM^% (8_rJ{dEfG}\/,  >U<$~?/W|g*|?V$bcQ$E T\ w޲; 2 }_oQJ"`_sjIZ"7S@ρD@vWtK/ߝ W0BIP0~ec}wq*1WL1>#iP0? vO(B*۱'*O{[)cHBN:!Ȯ '`~r>Rp,d2C(Xx\jW&A[a mr _Ӄ**OMMZ6˄jb6@Bk 7hakd#RMg \GP^,jJ?>m6bO2 U`<ˁpA.4::PGOo<u3-8M,Ko{tu$tL5 )˟6Fwءpb4RJO+Azq'53FzpB ds:r2  )5R<+_ (ΙƉSq'㛘fO9o4QX a(PzN%|~Fd>ہVc~''m|g<>I"!A!@^FJ紒6(-*Z6ҁhNAIF **B&˺\DŽ`/c.p\@D<Iٞ=IL}R`P0>!t`9AUPϪBIH:^>ԷHD\ Zkk 'іL8#+Dq!b03>Ƹ=_\1d0~tLKc{\H2BF5MQ>+SBAN !u8 W(P.9X8@]x̰^\TPóu#Fj;3F@` BH ja# aWSՃ  0,AP?J=qOT0`:0sU fHC$.TK y79#|fP. + HF\#,<3^>axXT#ƀ~Qϸѵaju> %̌W5cd ҷCXژw FԸv"p#:ժ*qs&ʈB$$ AJU/I@^ o.KD_/K%w x5 `PP\ x jAk B?P ^^ zO%"C#mΌ<]I8bIlsSŅ̀F!>y=PhBYc'$AYMI;a=DRt!-"<-4"t}a)d&hz7ZODP 0R;I8@#t!\ł|ks5Bp^$d~oFVN' n?LIR-=}h(s:l+cX_n8%^2z|}+F%HR#Q䌕2f&oNOQ}&RqCcn1k@0egAoGH91I=R)B22OdhZ}.|F20gd/Jȏ=>4: oooh;,l \Љ>pSMQ8Nu}Cqb: |BF `Zj>Te>-`4m>6B4#F.Gk ztv52:LCH1X3!>O9(FAFPɐ˸7[ aR$KᒜX"O%cLnA~LKF[y1F;{Zu>e~OxtQGQ<(g4Z ?ޑG1sL|<|HT/џ:x0r|O'AUt{ThTYE!\H<P=-2Vy͵y":J \i<]-"VШ-Gj\tI0I#DWv`?;]@)(WJ#`k[LHo;V]@r´7wS-0˄4p>f vtg~B=V oRpSSvNx}GRm)U@믚xh:<E V+'XFb80o~aaxH8_'qO4``YT|MAQBz:pjᜬ dF@cA~f:3~= G=1 0!F3:p6T=#d9N^y<5hTC_4glf|)s)i6Ҝ/.g{ f[4cr1SLޜO@ w&_PO a |0Xv}ST 4m|uUѨ0@x0A'X0#` ]0d%?Re~TP**Nze9$P)I-dWKC`Z?#JFTj52.:80[S|0`AOx!* f$x! |I>~Yph8ӂ!th=cw&EⰿP˕=[A-_5~/OEVsD`u.`D?]> uJŃz1t^7u0 n0G.b[A K0`>܃G(f#Cd^{Xͱ}JGw"9 7*|UI$RR `Z^ xGB14$zG(i<+WLn<۾{CG <#"y*cQ7`b%]]ԣUC 0pph@[w+A*A3Ӧ6@)); @%1Sic>Cdo (;L1V[ ١>LjvΓ7ka+c}Mx\T]F`Uw~3O`0>`C)qh#}$}':2Rӓ1jI/u”ĒB#C`<`#VU  F= ?ق,ՄBX "ARozI3G& E& [ ޶+] NUqx p' 4ďoM0T?NÜ!m43< Ity%~]Րߏ +/zȬMh7$! C6)sڤ@HR}LnF*;mC&)NwR 4pnh)Ax6>T:qP1?FM0X ht3S4?I|DJy £1+V^>TO u0 bKmuL fdH76BHA@#*Iw8 0!zEJVA/XB pQ JǑhKVgUp,sTEG4&0ުDyf *P"_Wm/JH Cˋr+X `T HyDU`^9@AL }NP0`G9ӓI!pͲX(U`r@$`|G0 A E0E)mԃd}R@/,p[<~IQ}l1G`|qmM̰}f\U]&E1;'E<V"c:EDfЬ3O c'cz3kbxͲ`5wateyM^01_5l`#4 Sϻek1W'<2:@ub#P~2s+ XYaĊQyHXΈP8LEGd +wE*e5k o#I(QϷW55[:4]24aC4:F;0Žw"IjhC(8ٶJwXmTpKv]'ѣRw:{̗B3esDm|m(/jCxsNj2s2w;Ys 1scQ7ŎԏQτ)籽eS:;&r( xסbs[a >| 0_DUx_Sc:3P $ߥ: j0`sGp"&|Y2xwNi.2O.{; ! !(,鵴cF(CgsQ <<S7aU5 F=ޓ=!K+w<L  @FlBͮ74XeCiס7~5wGD*VA+ x0r 6`@ Z}T<_+o2]E^Pʐi"PvSa:W ơZjuP0(ٝ@ZЩ=a!?uEaęIWsx3Walp:xё˯1uu)*{ 8a'24IO!q~(L~Rv{}GGWeHe<{GmHC.N{ ^?#DG5}i%M<,hfV?jmr@0V `;(DA8$ACDF52$b~Ŭ:9}cdI+k1X 0怮 8bPp {AG{Ty/6 `Bp@0 = 梐q@ 3 ]lSqj8o8P뉞gKZ42 es K+%:>(2gSKp_m'7pG;F)J@@pb \2oG-; d 웤xQ5Jk'pؽ8)tZpl^3),Y6ɬZ$hN/oh20: $g @*v/T<یM#(K˼^2IEE>% #C/sW]1$8 P"4&`x  C?;Z@grrTf`[(AhS[eex!`\/ +F# 'OZtKcKS .bf @o$p;R$gԭeAp-ʊ͡r<ʑkSYI``(? `EI "pS/SR@`rZc/S2촠Wυ0<M8J/=H)۪I $YxiqyineI#Glk ET튒n V>?Btxt^^_@>+v~"3[f } I8Q6H@#{qw%Ԡ%B?F-ൂQ1k*h2 y\XJG|TomC%݉tR؏'GN;|%`[*zL5)drn.qrCO.$iX(x\2x@P)ǩ |EH| jӳ !L 0D "@`dP| Z?sŃ#640 `5To~%Ap0{h# wO(7aJz.@$q@ 4H ? jY0:o`aA ˜$ %J%Xg `BgT}8U$4V0P2 `P$ Ix X yf x~FӰM= `ž`t ppxAwX΅>eLO][w ץNXD*[Y+(So*{%nqd|NT,rx9F%2kR hg{-iD(OibuB1 a;-9=#)F3( â3 /K:).d#0m]E!HiC?GcȞđ23G>ӑ SV"=?EQQ4Zh#L~_THF#rϡIO=RUb0;l{AџԎ>FDEOu~OC(B28MM #$ctRz4#G 78,ԚZN`)쮄iz0 bƅv5Iɼ {j9Jr Q6HDŽ-}(Jα)SRBb4 hrr=Srf` :PjzO~Fɱ ϳ;FJNnnݺmsicq P)mQ\\hoz4q Ahg#A>ʶ'=#gl6@Li.~)2jFo;X"^ |cB;J:)ۿL:ʄZe>v/.n FE |a-Ŵ猓>zq H*o8zMDn7oXt/Jm=!j3gž DSNŁZd?3_CwR.OIц`hS&`?yKt{žY- aR}Xo|.g(Gg:S vVKn|Kσ6'>3c;@ŒIލK^ 2 0Zac I8{D99i?E;ƚ.r{GURjc7awPI&EZ;F6#pgk_tSٽs'u*+o 1C1.x0єm4Yb?#;Mũp$g QqRêžTZ,C|+_sc5ku,!yPXa>Z:zjN,020VkpVY`UTqLTryp.@1d=ISҁz\J#2@.qL3Hhc'ᤦ^ֱ$|zBʯճeKh)I x;4oOF0Q h53LsbS ᔴѐQGk[X1 J[6 ky{f@&X*1 GR./#C@!G|s{ur6w1gX8}%0q&cxS"@zuS֐_͛a0H:"F-QoS[~`.zې h6`jR(Ma18oU$Ç R?#zvЛ{#~ BO7[@7q+8yuAE hI6ɈUӘOr٨£7HE#6H'6J%_l'V<EFM&g^v>šc{>QH\(56x{9j>y4+(VIs6w*Aph4I~մMhg:q ʼn췼N.xZ,\f/n&sMB9x㌧DfH>_p!0NkvMjq gk*k#kHuW|Jb6Wz( r%=gSˌ x5{y:O _~sus+޶pqE' '<#O< ,k@`X9 JժU6\_.F)=]{no\]BGn W*"MĠ T> vΓnqԪ>~^ztS|l1(;0`A-FLA hġW yJHA, w $S 9Ϳ0pA/Tj`P8 P蓖A-h3T7{ U *aLwNjr +..ӯE,C c e;/9)/}Bte O)*L3VxSBd!"MZ%6YP=wAq>qUP#+AJ$/_+q] t `p,p@ >}k}/oZXzuN- ǪQ9@C.۞G ?W`KW.FDkhT.aT:$Tl^ 8}rl@ռ(pwM!; ` < lKҋ> )9=c}֓04d nWJ# JJ̓%\yYy}kʍbQv;Q$ v>`@AU/"`-|i*{i,t*6#c$C/zυ HyzUI `J?%#`K>1l2Q@ #mA0L PRbGw0@, `U#+P| p0!`yʯ}΄TB` p C# `P0q!OB }?5V _ R2).KS^pSP`BBQU%   `{'E (c 4IVˋqWRl𫶈#--Bx'$֕r,̈f'"2їL'H\g`-@*;xJ+3qq9Zi&3k5 r7jѢBCmƞ6$Dx9`AK6h`GakITZ[HvZ ~3 Z.g3@C?A*OUzd\\}V$~N ϧQH!I Ī J1xJ< ׆ pw*8. H' QU@/VϞav,R2G%Ш9cS1ǼNO|]_jH^NthB46 À9t'̻:sO:t3I<;fϯj'\t;!x)`=H'er?fe_'B^R_gta46\D~c>WphмR)PKWhw<:pŚ q9ZͼDwB8u>e*N-7? x<ǫF.mNzǩ4"5ȻvU@0|>B* 4+ |{}6 c0@\ یwi;υ0JH]&6 D+<0y縥@j[CgRz≉M+ w@&n<>5T)1~/y+Y;gγ8_D^]K 0qĘqp4s}۱hlY=lnx/sQ绨wASΘ`cX'0tg5D4cJdo6x &X|P RKw`oEԘb}p갻GW A`Bk, Qp7^R_=8H0 1rRI18F 5_"8=Q\\Uÿ20B77TQ0XGVz`APp!OQ.*h48"ZgK8W@ć<{)BvC-]?(xp궂E]Ԇ) *ªlKxЦЗGvmS#  w ڱ~@=XǽJ4tFaOtDAv ?p8@ACAF:?C.yX8MTSfW6{’` g<8,uF4KfQgPDMO & 0 ElJ.R dmxgA @`Qz#_RfS_/ `PT0oڜUt?Ϫj!PS] KP0^A $\y@(' aa:x!}@9`J?ǘ`GGA@w| >}P0( 0 `| 0zʲ0H(`}`%oxU/`< O +x{2/ˁGAS$A 5U / 'Qn e&/2$кT %G Ⱥ4$a}(99i ~?Fi0їE( ^ @/dž/>|}=]>#D.3Ij c[|}\&< /\EG'οr{Eaw=x %ZL6Lh@8~!h=`eBw1&dd9%EI.0of>-`U/I]2B,؍RO>ot1󭝍 NHleԶr%|P54aZ7z=@zk :mes/5!=X#Mطz0]<(,ItuO01khu)[e%(xbNӭGnWYiJF=HBTXPxX[adn;dc1W3Īyc\јw^;8SF/_ï2#JjyOQHGg$Iƴ{z}{Q-0D0N{#Z.M}&ݣ&2ѢO:]\)d=SHޓm82&FuF" \x*wFkm#;ZZ0coP- |3Fūj&01nk+_ i `y.U0`#$T?Ood|њz9>,B|tԹ\aݔ6ɟQj[i*kk2ޤj-o G [#{y8eAc7yƷ|619bpd|^u M tb-azx3б]P/#?+ 7w8@Il3D^x}8 crQIamH]AK4Y < H0|%j,#o `y\SďwV^]\BgUyO^ę>$3S{Kl c(0T/>H)WUT<_2h b%, !r꿠9ި ׈W /UZx_ uj.u''ӜpX5g/>i?>$3VH^-ϸ)_mo lҕjALՁI<|RɌ'>fJ`vdN+ WJ`[ǏШȍUoQ(ykT:_J۩p2*, #4rthul~_{M졙`.IR YѪtJOrYIUَV OL8%7eu}~hm J2cMXoE+zx" h)X1hd{X81M﭅ֲwi9DŽ1!V[m~8It`P0?mX缧nEOk:c19_1 C5Iv-r;Y>*BDGACb ޕ=DZԘf~+h*9=+^' @A9@*L}LN1J1 c/J:+ B/-JO A ?WQS}Nw[%L;t:<>RsԻKQI\?X@SG *iANq!(R;MPxZi=S7^!&8Z4&zAqu5o=ďI@ɲ@"2 `Aw<  ^A ?!X~x|K_A#OpTU JeZ%GEM=6Ϗ ]=.\%% US.]Aa:1%4H@1(fqX{t0 _D{8Lqc_Mg\#ۄ R#|\%K2c;8#)SAA #^P]%`qPF/H0P$ѿ %y`~HH{F#$MPU#ĵ@D@}P^d` ?Z~Y\u eP~%|=dgp H!%|KsHO8`yp0/` yH)0> Kکh@@KWP{=t»ЄK@#O`AOA ?FEB;C̈́jky.vzu C#nO\K>iF!`h6A6/6 %$P*mٵV#ѝo ]$YaQAReGܗLѮ\Fc~O'%&2h3>F:|_GPÆߓ"H##DـW##bZVfCM%!Np- "Z2{$4x%@!|ɎFAta&kP KƏGzF?&CB\ 6;E'@K7z|R0l-Ic<;_ny>("7N[O"}.<<8׎O߿,23ߧtQ%;I;)/ Sw=+[s,i QG[^'M #-dda"^L5nӍ=uV=h`#)ZT0W?|kbeybJ ^U?Qo,k;/ōlIu6Ytf9HɭG7w\Ni;8׻/mnw?\Zc_}o[4ܚdv)[ƍnc{?3@d2K j9U@t|dO[yFv b_$`1֨@}Q)0T`G_PVP1XJOuPx9qRRp ըAC }QڑӥqӴ[tS| Ό 4׼+]#BqU1'ġ"L.$^*C5zeWW&ZOg56"2^ hN F'pF,Z$0? }h)U<V=X,oY=TV / !z?L{gT^x> Ƌd B>'0@nvO=F7}{[έ"чD0 .8}q?`pҒoLAAġrBWV$GF1טzD1i3t\3Նc '"`!*ODTg5BщSK)H q\h m_AX̨~ XvAg0IT+*w]6="8Ȃ- 6t~^$|}ZYbWD4h Np'ǑoKHBC?(#~ʁ/C! +Qx %` _ % T\B~@`Q!L#+xRQp8B.xdq`L8N2Gƫt?~=#Bș7*v ֯Ѝu8ϧYr|=8Zp&{B8Bꕢ`:eIjc:F[M)SB(05N4)0`A -< ~xu)2> ѨSK}\50V V /O uo?]O/Bz+)@0f{LG(`v9 4.e'½s**EBi7|egg"D<Xsl]!hzDG4i.!/ԢC єluvZjAr,CvUZ@Sdiw5@1g Vv!{?2gԇHL'/#$x{ms ̓ UJUW4 }.S/"9hNHdcXlfa'Z$<_@E'4%)jDl$:8YӉ@[q@R2*SQاצSK&p  W?R=ڱ0͘ 7Ɓmr | 9>yZN"#uϤ{n&rBT:lD j;Ξ(0V-܇t/>޴;~zvH  $z?7&ڿD~TBΎ7R8B4;⿘fLُI_`f*rOG/粬=?OT XWLFXh,TuMA񋕕o)߬%wq) |P(ӫ4'O4OˤՂ^#ɩW FmNfi7X+]kj~b^LGO-#?cX2}Iũ{$)+CA?qv`GPdimvM'1ǡs)!ۘsUJ5E:yU'UW:ZOXr!;E}.6lV]Lsyg2 ۡ?T7M4%-mQ, 0^:}&w"\(_"´l- 3# 1[wxp\tȎe\>y1_4C\6 <3_s^K U.X8 j/nozjWpmR$gf>d O8F bRFFh  ;9GOaDDyT})9oT0GnM)SIj'CYH zk˄fV:_o# |$ǾL.ق,*.]T}JՉ)?K4aWqpjPiѢSI hUKƣ Qi8SӂPCCeꀹpfseƿЦ|OGeOm[\wO` 0BX $*6yR zKS:D1>4 1t& ޞ')Pqpi@ ꛱u|ɀ(եJY 1`.@',2ʶ/mz|SiWaGY$ {ɪ 4bM."+7~+J0!~hK.H`UsŃ.MĈ T| ς< Ȕ-X)}(0*TA  p8ld\<%` )p@s `V< x A,H 1M&q^]`e"P*lȓ<)TM.ohsE:3GlK! S'qٰQszX}B[@>D42 MO7Z%xpg 1M4$c&WQtO'Nh P\ t;Rl\#`ڀ)B5ZI }P+OVt1Ўu7K*pP" DF}/CEPXhjzЌ3#@;drD>S 3;?R1<-|( ~)fD`媯(~ 22Ab\%gAݫD#@NpSLKπJ|I0_mAr.baQ".'%5ӕyDo\FT4I4_:5-5tF 291z};6>B\XªtuLcaty :LcK]NY`)hGSߧf;%AJ79Pr@-;ʇ֦50w"0OW:ZH *J?aΦ3L't8`IɅ#SJ mF83y36E 0fP:n&Ӣ].7D*R ' jJٽDI<T8Dǣ21\Q6$ 'tY鴹 䋌*{V0| 7ڕAD/2t"z[v4{Uw{Q NB}u!͍+4_%5ct\ў u CK%DRƆwGB)'TRfQxя_߀aGAO~HrFu/KM1 r HQU=ܠV@E.F½jCg/wgxD R3>ў=5CNd=֞uF}%OO8ޣxD79$Wk/O<ft_6ch@4݊)u9"t_>>Jcj2 FzW.^+ep0h@G Ő/o 0h0>~h0(w~=o`N! /4 `Đ%UA|')UD˨PNM".^%hU`Tw`BSQz!-RRp ұP\>0* `?Ϳx8@@ A4 H$߃ p0T 0R*A7hA & A\ O > uWdeI0 ARY8 0_d X 0ŕ / '҃v w ŏG`<ba<9Xzsz 0~ xX0]4@XI x ĊOx0\#"Rb,A3Ud |1!&?,0sT/&vC JT(> h0""P@ Kx|8!0y+T$S*PN @>nq @i3ʵc`|h? w7J3 |~A; aw< `pA4GtI."@@ K0 ԥĕD6 @% `)E݊Đ`BB0z([5wb0   E[0  h~~/ WZ=8? 8B*PT݉`MjP z> V x0% mA `R(J*UO JEBaxB8oM="`<3y"RJ5^6pal$r\V] :V s< J^\ T{1"```>?/P>/UO,% 2D P ip@4BT!@ٔbă2 (! JGȣ葊00 4>Ut~"X0IyP^jOq?>`"@P!/cARBD`7|=f*rŁ9`8@9XJj0E|EJξ?}=:}  _ox8C 0DW!A  ByYy}lB.lTI/`Rԗ:( qD@ r}T`Z=8;%s>#_ U!`t/ S{l: €`~A_Uŗ, 5P0k]hjoDpy/ׇwJ_+x0 y"`: %5`MMhCb/e?}Y{a00`}ďk_}?R `0 "]ު<_!4"<80`(< $. p0_`KT?X AK@6^ ؁/J*O,ktJy®h(Db@rPKd[A`=``:`<0Q" Y']`v(%xDYpHJ)EzG`Bp` T\ 5z`aPe !쀧UR4V^bJ> p"*GNR|J '` D`0[R 0WI`9O =x:0 8% v$ z$|UP!C$l KUT%} X\8X<8^^0E =hN *"*g>H$p?T׀SP`D`!3ES$ VK އpD-t(`yh XKīGQY}IB3 ́.w~MA UD`GRW'=ՎRC>˅\LhYslp`` 0^> h h8d`B0`x C.> 8AU:$N!Km8{R\"/\  dA+ШPL4@!`$PJ0焪(d*A ]P0 KfpJ;pYudF ScBzMs8 @Xrh$)R38@$cyUU  0HVI[c: >`B~ "/@Oej%P4`<T%/ [r0tuGyh.c2 0CA.І=i7>x0`w,>V$ԂJ/T\ gt 0@ *UwĬ{`(S,"ڬ}[*||} }8 j<8K0h(D߈)G8MK`}بK/_? A1csoh C(`C`iYp l )eS1|a/A#T+/dB`@*~#`;)~eמ< :&XA1B4f>l`"P0 5:jİ`:ĐR+9`E%.0` @Bĵ\P?xyxn A%@tJy2`;;Za~!!*x `A 0"+Tv! <@@Q | Ox@عH GY` A!EjBP2u(uj+`@+`<- xA!UpAdM>;2pJC'E<`zO*10Bb˨A%0^_jh.$Ͱ 0!`s!!E%H@!`u"@0E//"MGxAfVzx ! uD``@.Upjd pB%@%#P_ 8_ׁE @K WՄ:$qÍ0?R叼a Ntl `ą`|5[>N%xBr/l1z"jn@6.9᎜I@."P|T./X0@n`0@=W `0BrǸ D=Gʋ+1:` `8-H@7S.ҸHR:B;PB`A`ULU>^ʿV_a -HU2%+M~EJ 0? HUS80! _)G<r{|%! P0 ` đ(_P`Z%(T1P ^Twh0pI`K$P| 0t$ 0a >GxZd  0A~_  _w oCfm+߭B1 ^i Ppt`p` 0 x5== |Qz>O]bH@0[ऩߔWV}A0>ٍ@xG ! =8$3^? +ˁm` !J]R. sK.| j>u@CEN8  !:]uB hĀ`;GH)7KKa(꽃% `t uXD``ITAtTɰ`A.V%OyTIqxPgL"J&/QATrDI|//3V 80eJR :*@(``A~İ/R`UY:_)R@  U"YXuXft`e+/ŇZa| hBbIyzK J>I*x`. p0`  /2gO}H 0`.gvPܙENy1CWj$VG5BbE0@5\8`G  =ϥ xۢBJu:_-<bXXB|whX0 h>)u ~Uz8j 0!Z({|4Mm`<`A*Dp": P`R?O9z/F Zm$`<<W^&3 0t '3" m a'@.S,0A ~?/WqMxTH` : cv@X0"X0QD(BQwP(R}*x~HGbu..>%@S`AoO w*KEaA/. @/LBTNzP)Z`7@7. u)?Uc,`P `7:4|]j~;"g@eeu0 (O+ (#mJ` IBÙx{0˸wuTFpV0 8(Y%``TZ  A~*g$`G>ʗ=tJiL(Z` p,|>_%zP0i @0`o " wTv: ?A^WSpB0t@`0@ VR$43U { y(8_. ltG2p^% J-X)P( *Z B/w $A,JV˫W|ya,MS@ W?]!"!:l 0+Sd Q #q?yH0 `[jĚ;F `:Ur$ IG_z[`# A@ M~_A Rz|Vb<_ǔJMO_j0H B_dd0S+txA@\uRT@S K.JX0a0bY~HRT  `~%PAXnփ>T=V=`AQX0H{`0=E@0^.=< %`}T}UUpUB8_D`yr̟&dƕGqK0]8/@>/YOiwx}Ȓ ҽ@`ˆ8֊BT`A8bGǰJ~xd h0!*W=cqF@-P`D~БqP0gR J=x$[r,!j_ (n ?`@( N 8 >W4 `;{PU ߆hs +bL.l7x~өrxv% e )$!QB\0}.6s1`ď*T>rAŃ#!  $uo,Ȓ x(^U"P 1(ڀ0* AЇ8eJ蔮~dn*Yb,2h2CHHur 80~@|HˏzAL8ZA Y H$ H=V h04^ `)a0`}Ci`<0!h0! O"pxyqT`9*=.Gx:@`:~ o Bג}Rt}h)g$`ApehjgORxbwЀx0>~$O7"`:+w3b0=T$O5a  QwWe}0*0B#,!M+F-RޣxU V C#σK{` "GDJȫRaKP$0 h0?gԯ; E@$`C ~>rz7N΃ P0%  w!3`:ǀ  /@w+.@(Uh@*/٪<.~TH4J@@B`:y*`5 BJ&gX  @)U?'A`< H0c`AtF?1 ˀP` HڭUB@ `<,o{ՀhB3A<ϣ'i.@BWlȦF Z("ŨDhH8 yh#;ŒD 0r$1 2cVq}XH柃C jYѐ°Jgǃ2;F/JñQ0].ޒ$@0aau3~SℑQLpL 00ArU6NKGS=`;A(K.!o0lzD\}hh  |pJU C`Ā@2`}/R+<#`F@T;6 V hD(K.`v@$۪Q(c;yYx)= ><,.$! JJDaAR(1e<\ 0Q~1W0`AJ\(s0 xyX0_  =D Ǹ (B@0 [ fU&"0@ `]l3٧,}*BTp@' g`A z``B<(r  ^B|%^KUtAIU׸=h `:⏆TAX0?"]!BntJײ C 5H3Js0Rrp"\ >Ļ言<`<$}p`6KǪ| }Wt~ әxT/gGpcZ dsH0` 4I<0]F 0| x> zxg*/r `Eʕĵ 8N{Yz w THAU}yqpC  0J`< <! 'N 0@0"X@.?A`AǾh \0`0$`e?3e(/`g/ + V b@KV*JW$0`8Չ%QrR Ah` ; R|?<^C >`!`}j,|LDi8\B ϱ#ʃ Ah@liq@/|>0`;U ^?T? G.Z|E=@DA/Z, ~K7KP`A  N{̒T  B 0_- +V;9'`;ā Jr>ڑڜx C?檄Q ((J01(@ގH $!pB DT!t !_AT|>0ZԳ `G@_;uHE}x.?V`<~`lİ8_]@pT xˋB8 ` `|BVw @`J6ͩ?0{t5<s ` WvQ0m (0@`~J& @DvU∶Qj@`Đ>*'( fM0.Z%0?>R^S$ @`<0}B (3p y7z j~\ HC  `"87 `| O](/o@a|Pa$f0?TKV?8> NĆI^  /\j ]p`;?:h@R Q{h0"UIFmPpC/D~hL~(0D/=40W b0 `]5s_j*;^KqX +Gcjp`: @ڥx!`~ B#*V >`c<I|ļQ p0J"P4iI DB3N\ :*b] < } *}U2<]54,A^a5X0 !p;O 0xX% p?p|!B( 9%@BH_`yWѸ:P 1;.DKi΀_ D|Hx0`ٸ0CPwn~4w4nSBY}U֟$_˚le>Pr`}0)78?~;xE. @%zDEA'6<z0E^C%͠ ɤa !D  @&Q0?`@ _ *ևaSˤVgC)9|z8H/`W ^?` ``Ďpu1 A`:H<\փˠX2 )X4_j bq@)P, oFW˧0L? c%D X ~ 8'м 'dnթ&T>;W3O^z  ^EȎ X@BP!nZ̯PJ!?R3UY ~]! 0 D*lKы0 `B< ȒGV?VH`+!!RwebH[2A``;  #&p0 !AAyg$BI0 R" B0|'3%pP`< B TFĸC> Bu` X]zd]H\ =~Wϗ2B xI?2(?/ ǣvQZ,o.3$ ,!R @W?凌 &`:`<8q![@ [='` *BCC~T0HXAL`+$`6BC|2CqJ d0x!!!]QqzTQza~QPK8 o0E`0sYXA@ TTGx/Lg |80s] C9`;ĝe~$8_RƔa(%%B*ch0`ĭd> @l$!:]>.` A *C% [``;?eX0uP@/_$e d  K../}]`(%yNHK h|8pH0!Ou}x .$`đ/@0`Kp0>eÿP0Ԩ0  ~ 0!%W:уڏ]` x 0?GoWİ`<B!#{L pK})>l!?R\%PRUJsBPĐ?Q/J˰zT` %ڭR4V 82 0ʁZTB7^>/PѠ<҄]A $``x~Wd D`8|^? 8J+p<3!Wtȸ 0~8@`Ka{@y1x/` E0BH0PB?P s1AV=4IUG1Ag<D%_/P0J8c)ày`K1GSD0 0` f vf4đpB?j8"Q0TָmdN`  h Eq9@ 0 %,,A/˴ <  .Pn,'O/#D^io7tWY: p0!Y>aKU$!$0^_4P#)S-KİCT+VʃM%220`Va*}-92 5_B}>AR}V砉 ip x XVC&@`~B<=p 0 Hˁ/ ۞/Ɛ@0x0 QAWo~<}X0@ @8v_֕ ``;A@ *0A4y>?*M~Fo>s0 +xA/ˢX0P Ł:t/@yx?ʠ\ p; y~aa*e]JPTF"Ip{pt `;0jāE [iv$Pgo^\ܔd'8G(4O5 0R`}}\ X`{~ ((kp( op0s4+N c0H|*V#0a 09@|H AI< !~.0 E@]//@0"\$CpxB]X%`J:BFV#~Xx :>Pu`h*0G %bH~x 0_ժz]  04~$ 80>=ty|3iT JG*7QS`" BX0Tz=f`}x^B?G" W4wD@$ hX(iwP]F?徨}@`}/}B/* 0`y@13djx\?.vjPu"D("$ȕ N̨N|`<UAE@}*q`<"0!%%yp!f  S}?S % T> Ƀ" ? 0>WtJWfrq(3?ǀ,`C)ā0X#bz/0/U@ "$ _0(w  p0> ??I/AT?wU^!\TQq *Vp%LP`^}@}hOPֆL ^$QCK0n}G4 `xKWDo] 0@0Ax>ؗA Fr$ @0#bIx0@J+v3p0Տ곱]YˣCd2*p`<(|?HOQ `;G.W~V2_)C+<h[ü>n*p (0XA./.naǵjuۡ}pOp|A< pBa?  Ă T+< j?AR琅ސC`Z 0%*./ `Br,|]QQ_%ġ`;>uW/]%C# 1P ղ$P`tEÊā(~ 0p?GMJ.3]!EڠEX̀vV`/O$'O0Ut~D>`x*AZ$~x %h!.ij#@zwzJ_U{? ?/x';DhPA@v A0C UCuGm֎\K' ).V> L/Tn5 `` P /Ga}!05X9@ekǓ>b!R N P(=\@ 7Ax~`O yp o(>^%jD`ɑN@G@,~%\\ qxtt_jU&W0y&\%^ htx"|Y$S`:`<.`(ՏT @`AЄB H _X0ǁ4EVK˖?Au)r{ɂ'0J]z+ h\ @yZ_%`Ġ`a 0A^rtJ@`9#@0I.D(0@p5Ba<8% $$C 2SrX x0@ @ "x@( < @j͉"HZE$ 0y@`./!bWO 8]?!2J8<+/ `24|  #>xh@0 B V?߾}(]I !%P[~.J|Ο `XBp`Ձ })( h(BP\jP4`;A` Q`(a<p0 ]AXB@ů 8_̶B3,  V*M/dOP`D.ۢH!p>e@4~0{ypB}1P`; j0!}q@ ?408_x#X%`BI׾+>7@IY/% gr0EyxI ~_oͣ$`GyaUU* Jip6Фa4yz`_*@,B\$|+ph`{7/ v;XFm!&%T%/EutG$|43A|`;hA5P?T:g` %1 JT64Jl}VHWQ``/ąJYt'8@29P@лGj`=TKT0OpFꔨSލKի//VG ʼ>.UǍ\ A>W؈F 0?yB/@~O)y@0IJmf0`<!*~fĉ}yH@. ;  `; P!RPY/D#*V̀}DQ W̿nnsX:`0v 0 ~|>@Q@ H P@/hA !(Kq$J\0 OЄ >UY s? #G} [|<GA7_x0  @E}P1╃* 8CK8 ?4IGH􊑉r!؛|_~   N 0 AV%Gv* h0`~İWgi* ACRHVcX (0  x@P%B)_k˄@$B>0գa,%>hܥ 0`:X |J|GRxj xK( *.JwKլu!0$ئbAׯA AP0`> ՗B(# 0#Ѭ6HH @`  $`^\9  &:0jİ\#rȣL\0j?BA]iRhK|`0>pI=AV1x@+E~bH0@r`9GĠ <eO`AG|Kd@`*4!+m(Dc )T X0a@(R*@pB=M?<⑀̠xNyK_E8`:! p |r.ˌBT|ƠClc(X| 0>HBUB_ CP `.LA2JI6H8F  0%1%RW8X 00@C/ T0@vU?TRl @`h $<Ӄ 죣@t "$P)B\1q?KUP\ Y0~h8`D !(z\$$#78|`B<I*R>Pě.O߃ @G(L  (0` +5Qz (>/Ӫ@/|$v%8( $ x A$,v hu" 5*.(ec`ofD b@Db@0GTJ`O>@^HP`|^X(AI (0 c`(P<0k' 9y 0yIΪx70QX0!華S V%0=J``` nHIZ:\% (iP$`7HK@!6 hC@K`<NJİ j8 M F@0 YEBX_ĭĎ; 4\ L!b Y{ @A#AKT+b ˇ7#@tm~ "G @.3.H~m p`0P(DbX0? ^=Rt +/y(0> Qx‚f'b3`%,  iqp0yP`~U{T>+} p@IC4I0@ *1eAЇU*75LR X 0A.tL(X8?T%1F&$u! ]d` 80yT JUUknIT=.VJ3T 0`|/^DjP9J):   )X0>4\`<eTK*R> JBs> *0% +.VZ0E\%XA`Qw @ԼJWlr`  @0>?|x<%wG\ 0@s0E}Wnl9L~ UBNxKUMU~Dt H>0?Ch 0 C.uR`>R`W Ձ@8 A~^$)'11`N> Ac1U@w @%%SqJyQDb6`;0/+]}>@ `;A .T$ _ߣdG_4%1O`Qz>0x@yJlmU#X0`@Ā`~!`A(ۺ"o=ǒ}G"UWgA fU L` J@2FUѾ̀\<R K==?m0`<˔ `0^H-1т;,5(p+@`e.8JERPިT>? gdRd @ x0bZJr AP0I\p CYz8~43B:h pǞ"wp0"J%jE d  0˽N~.@ Bhxx@0X`c ! @,E UxqQX0v@y.|d?.}_(E/MX2 0P><o)Ё q!00`BKCHı, >=pH5'^Nx U#DŽ`%@j>_<| @]CS{%(n `v*9W~m>xIpiwHd~Ď<EcӇX )<#KyY`B w.?\D$`+0 */v `B P<VoTИ $ |VJtlHBB`B=Pl{~yy`C֗0 yz` P1Q_`J@ 8#"^̀h0 tΪ x H/T "V hCx/ ^jѡ00P0 `{Ŀ7ǁA&qbr`y P Up9pdmA0?"@UV.ud`AwIT :(:D=-ĥu 0`xQr<jOz)vЀ `0 `~T ؔ (0|HՏ<^$ρ?ִ0`/0GrVPT /h`0 `xFϪ`#``<WAT_t4P` ucN*XQ J4A {| B@(|(\mP>U=$Ό+  l`x:ã../.T dbX0A%l! ``8V* p mM |u0NC/ eV@%&\c0TG)ޜ\@ٰ`EbTrcj`n%*eEǂ0ЄUZ_ͭN~{p@  z.\Uc ~<8`7T  _Uv^d J%N/?-EnM YHDy`U0>%Yr< `< |~%$ h@ 0a`}A/dKxnqR8K`:@`Bd?.p`<p ! JOǏ C(aـ AR#`tz$,U0`:?hC/A0"EDxT8G2:~?<<00!t $>!#yHP0 oA`; ]4ą_s^[.~X#(ީad}t}2EDN @/?S{j Xy*<#@+ p .T<^OAp(8_Ra|UӀ$|%1A0 s*P pxp@//T+E+T<:pGeT*~O434 0eWLAΪV>TV< 00ʋ^ , !P: ^*%Z/@7< F?V?J_ JV}P`<+/Z 0Qx0_ar@Q;Ċ%('6/GQhP@`40`Aĥaˠ7L^G{T?a," /yoY @.LP~<@9@JH10p ĕjj˄o% AJ9U!^x`B0ZqTbj /5Pr}wH `;0!9Έ P 0\>.P4&  Ipv48X X㦂 Beʠy`<< AUjHo>.Wѓ800L~n4V0> xyt Hy%z  G\:1t`4 mTԞpJf8$:z.d 'bB 0 vx>^E `0_ʇߒFŠO}`xđ (NOBX|`H0`: ,z"y$W^W(D>T~6J`%Fxjp@>oGu` 0 oˁ@%a=@Ȉ1,}v `AHV;@X`PzA&``/ H B_~d[{(  P< 'x`; DmYx8?qTpԫTwB?X!x~L.W +PBpX qrWxA=X0?>Z\G{< f C)& *@~<3iCB1c <?x  _}Py?+$0 PPǁSw0? K(h`<`(J.`~~:O `Cjhqc  x0 x.U%F*|?Ё GQ~@ 0 V1( /Z Qx0 c` ˇ%5S+ .<$*V@tj5X!+ JZ (K^$J>?/J?6 6 V <...v,8 a+J 8"|KU.".`@`<`}Kw_PBP!2_gP`;:hUyDDŽ`Kā$} Ĩ?՗{@ ~XU~&`< x @ щ0 QW1Tkƀ<|=US\6b$m7zpp@, VxB~ @/@%c"US툍%AW=_[iA ?c,a_|P "H0 ˥/<$QL燷4`8]T?..JGͩ, 8@% ؛(d^  0@0Iw?|8\ i2\ 0`B_0?w8ep0!C.{܏ 0J{h3ft`;T p@zxԂ` .XE(>6$|_X!̏ 1ʅ! %J.UHxh"bG葪Ոhf4T<; `<u?8 7RU{xxsr$ `< _40>%Pv&x(Qw`0 n 6`B1p`CKKnp (UbJH^`8Ї< =XK D Kd,%ˀ<A{AGʰ6ڻ0bX0?=R\=] V !+Ox, @(v /ِ%~d6j``ޢX(A@Uށ` T ?;|ʄh{_"CR^=h@ p@@p   # @O;ǀ* I/ W+dE.)t`<ʁmáA UΗP>0`R #"w _[O|_M&?.$*)Q/u %tyz@xC.*`I P0?.LhD3P`7@ iv`D!+UeJc!(0\ p!"J6nc\>AtPK NJZp# e*/̘ I//Wg|=ё0Q5J~4KV^E:L ?3* O)T! ?s꺡)@/OH?~@p0ܳ  (ċ@a !BW Xx AJ>R"!pV'F Pw |WO#8@__A AQמ/3 `$Uyā'Fߏ&|DPȼ'[b 3hV X|0fxKkGz]|I+H`vfhǯ&&/AybP0*m!z Y ;_}8~ϭo:oQ}yÇGΧ"\-ʁ"wɦUʸd"L#{i<|2&T*Hg@0&3P>2VJe=Pdf#Pʠ 0&}P"JCVlb?A׼C zp֩.Re27A޲T@ |tӃ„Ml1G8f@źKKRB p+b2pA1$գ)?>ɱBeb oq8_>ߓRq|^Gf ĠQߙBz`<̪>E eB[6 >uO}[{%+[)~|)0~nj x0=v T`tc"c#Z)AL Lw0DA9_ 0oԁ"\> 0"`G`}"o_Q 3U>|(̠@x=xѰ /@ :@|Ek ,]7 jJġ/ r>F\~5c% HbUG)7aφAk>)xH'6+y3I;!8 t'xWu~8{ K>-Ia_K\>HvaЧ+J=j& V],Q>Gy08L! \e>"v+5wYwմr ˇB_U+!}Hܹ ˂y, &ȗDaL%T+/C`BB'Ou[#b^Wt#E .22=Љmᴹ;,Fz.ϙIJ[dڹus^L*pDsᙷdޑវ($ |>2ՃDhġ."kJVPօM{{R[HDljnH”@@XCTt#/V !,)\@X@ Qv`A4 IxFk?J\\_c 3)i>åv*JpD`=5HXB0 ك0<Uj.+Ra`n?<$Tjx)7'U $ `Lx,P*WT쯃N{zs['AWq=σ#?ap zaY iPX< d_ir& i ! 6NwA}Nx+ 7 cJ2֌yG}0Fp^-c2p&5C䛞{g '&H4DEHޭH`gkB"Vw R!zپc]!B=?No'.gI_K&F'Xyp4!v_ p7$+[f=>gץ+b#0t!|Ej`BՑt>a݄E xzîg'򓭡+u4Fc<Ѥz{{E;{薁SQqIId |k:OGk)X8_ʍKw_IQ6C/9pds YJ6mgcOk";S9Ov3~hMMVA kz8ӿ[h.^kܮPp@5r%.<%&R{]@ǃc1Š TJS@00ו $J!0Z$rʏOly=wXE" mkec*Q d НVϟacqtE._ ւI` D =nSz(j}Y9ѕH TXO%"$h${d> yz `:T g<#@Bxm&)%jzJ*SV!LAj{9o ^'i#FL:(+ʀ-LXs$_p:`Eʇ:W K5nj@p['C/ꏗAq( h`xy)R #za-X^ | B nh)j sI: Pi{ kos˜#B .*}f]  h0?"_?ȫyJ 4 A~aOroz^xu#I5.0e<׷ODfv:۴[4P*q<8`GF^c=1'`^Fh +!5rZ{sFL]\JgA.n$|JT?bWEJ5Y~KvNn 8[S DM!'>vaNˇ,0%v?)yvp/x;@V\#L!AT 0PAO`Dܤ3uO`Sk'C6{*ٴr=OV ۓx{4G{" &O{ ]O%ϷUVߗ4+<%o@뵁8 8BLKy3Qg.VS,\N(6#zV<*>{̎G5ɰBBBMkυ6ԐR$>.PA |G^> p0! `;DpT;00  Kꔉ _@\ hB.rpjfbq_Na\=ܞ~Ȥ t]v\1aާ0K[Tz9㡙ٔ[O5Sǒ(H@%H )L.Q*VB`@n:Af%b?>"\鱑O 8-U#Qؽw`8<%fϰ#8RB{zH;ւ¤c8|бo3J7C>:q0‹ Kυ2ːZJg&4B?ޢ/ 2Nh&Ti~cͽ'pN4 GGR9waC*z6$z=Mi:3=Ӡ4=QoZ&(xz X%/ R.. ِvyZTTQQݩ5[}߭<5,7[Xqrߩx:pzW9]uK(8?u,gjJoRae朗@cuOϡaftܕ̺07ǂ(?V [$H+8l5i#N@{l/k<~"= &b=әnﵽ?+tnualpqLwg8q|Ac[޶fnof [{[&T~**yrFRa6w]ǘCk-Yn4*;Wz2 ۞8X3\%=HEʼ 0pؕ$.Ui{PtLт);V5/r. s^\ 6ՏA4 zVYP#\eH6" Q=w BB '6af ifkkx -ŃÅo?#Ӟi냱uqN <(I/K.2Da*Qp]< ' {C3|yF{s(UZ$JU_iez= yq2gޏ 32pe 6)`ke$0 @/5g}rt'1B׈@ԆGH@8hwu!?a>zl*{˜&D Q$|?}϶D$ɞ*TuL/ >W\J#  {(hfgnKǕCxfx*z]HB` ƀ$)X0>T ( 2s`9d `> ¨K.ã/V? <l_ 2BW˽ϦJ/yʼ]U+8@45d=n_=b74hSQGǐzq\_8D 0 , 0>J ﶦ@^^Tw@дHuM0zg{|2unYج2?,)ʘ"`9@tA( j*)оjXώ 0J*4A CB;ܷ8r>x)\hS4y 2w MHC0F"BB,0&j`İ?r6V<o"Ɛ'! `Dj巷;ŨW H 8n# eR)A/@:I*jrZ?5҇b P`{G)rc< ;Ty:pw@gT'|XsKq\9өPMRd! >! O0GBP>X;64C) { ms^VJ`b]*\~guO;TƐ=2 ~(٤=4KR(Ŏ %` p64B (؉">UqxMKO2ܸo'Oa4vN'ϏȻb޴ B%Qv,r-'fQv"*h=%nț#u/M)>gWFmFAa_y𕔼~ʳ UyJ u<\*G<mS8Pjq80vBE{y;J"P 00g~x gꔧr+ ]CJ=2%\g@ E f)3B 1@s+}P@pϗXORU&Gțd365bK`db'¤=o񖎨N(ȼY:r#釅>#=dQMRQqqOu+(9q1 Lp+8&8"m{6#ATtKx|8 W1rh1>JOT-z)h} rDLqˌ qSP9_<1#d_wƉWLo *9aJEE]U4F' 닚c f?/b)g%$ yc5v6:}."LUp%=-~v{Cs]/ eJ~}Zr?K"T YjZr::ì̃T}Ni*;ϩ=hD ӗh|ۛ$ΞXg: XEOrVphgNת$ ֦2.n7S;0|Gjc=DcF1ڞ}Քn!*ja< dl0kOO!3wox!͓_eƨSH9S>YhXH6sVd zҹc9^k/g$ |:yw9#ouNz=̘[ӌiL|3\JJ98٪vcA*%^:i>Pǧ9(Iw{^<=$+;xשּׁTrw3hj~:^Jn/&xSG}P-t'!VoktOzRcBLos7nNO63%[7! /L UTsL ;||ʟC%*>> u?^:d& ]mD%JH@-i.mN;x(KA TJȏҰ"lC%{]fGR@{j޳н/!q|/zpM* NZ۪orb>V\ ?@0*6^TFq@R& B!xGSv|t5!*''ӣe&a[*|_ Cc z @0? ADV`E`lE|Q. z,=`2_\䟞hC~.\->O \d !. Ѳg BL!0 8µXԎxp0>K n0O(k`C1*+/^.MGAVN4J:7sxz&%u4jýuLŊI߆10l8A U!1T3K  qp0`.p鱠<.Ri' ԈO8';ylUF\J_ϒtxQ>'3 yxR%{"L k=wFL Ġx;J+k]ò@Pf) *UpFV 2%{TLTwYadZj}UӐ!.+''V|Jg ^+<HXM.>Wz(Թs@|ItFCN9Ega0 `Pϓ*衘 (|PL2÷@Ba'0lSˎJnQ&8<#*ୀpOJ\@=@f5ԒbYvbA)@X?Ed# İ>gυ*(KO3,H.V%e0!?UoœF:%C6j|Ģ%8)1 9$Kwus*g PD ?VA\ m@8_:<[GP YjF*dFyE֐ƿ xؤ|Oid0xJ۠c%0'UT&Is}5I&ԇFa:x{;>#bG_Ň.,$Dܥ$0`#I-V;wxQ}7cZ?T!LQ_h=W1(I PJUHH/!0? 0 e$H0Cx0`  ,ե(R KM*G " @H ~ 0  PS_J3CI_AaM )'J$1 1vG3 uc8hcq=ft? Pw [}05E!6HrN~Y ){~G<FgS13(lf{#oyG 0^ ע $RE;d>a ̧ٟ23^7S! TSzVOI ^wi?cԌu߶$&{a +ScM:GGptW;pP(y"`bB4/Q=/tEWH&'^*a9<G9 E Qj{V#?* T2x@!}UOlY"'"syP^(no{ya_*d& ,/{܎õli7oMM9_D`[ 4a^HK Ss4iMtKOWT<=~Ny6s;HΨpY@#\fMLWz m*V#<د6iz,6qsɭP%RS&qlfeLk3:ғa)s{{|i<Τ;y:#i0D)޿!sԏaymq)u6uTKϡ)pw 9?86a铽51ci۬ +nwc<"8mD>EJ=w[=밯}G<࡭nPΉwC[׏<9a >qO-O f.MsDLht2dB$u0}*+D x w:=(|Տ3`KF%~1u0*{N=. xa&O\`8Al!0GX`@ax0hl"LttnVꎄ0N'Ьk׫s9עjF0ϩZ7 SF8]tᐅg\4H!KTآPA~k.SItGP`00_~cq*W8e!.â=Ύ0@!)f*zaD]>e>"~3xSP0>eH.T=P@`6r>kA"L>U{=Jᨬ:ëQn < 3lgSυo W.X8 p(yjS22h\ޤɆ䔜_FKQ;YS˾] g2.MU>˿}V.(@L$$'2n)p3?Gplr*H͘JFghgd>3&L~ ?) kj`|~ Pu V_4O5TtGZ'۲7Lw+{(Ϗ9|2r,OAG> LSɯ 0P `| s@+h\۵+VjƁL Gʂ e`^;FҡNiP(QXZ(Q& @U\ lLKՏı0@3u_@`Ag<M=SA/oPğYxÈ0@ R`8KUT8$x@7>*+HnTx(U< uQpCZP pc[H~>$ u'FiFN'%8ڸH^}ᚘ[ G: D\u`uIf.H'o%'9^ <ƿv@9qA8Fr X|*GOPU7 !f^(P&Vd/S*d{ wX `xgғL>85!+gPFBB;Mhos`51A0IXc R6{xLΛu2~PIU8v}ioȘHyԥba)>\r-822aN[ݶx.a9Â?UKSy Ĩ=ωH=EL8i *\U@gOzm+tfm>rg{-{yֳ):V[o+pm;=[w~+}Ȱpw9"8f7O[z\ #s#ΆoEx8! ޾_}?[o=Y[o z!/M]8N@`M800,vݬw*۶2|^WU 畇B#c/x0" ~ |6v jp|'T.#k dB*wt^fݼgrUcUMSǂ# BH@Jx*4 Fj/ʤ#+.Sϧp: o$/ CCW0iIaq:-L3~ 6>Ɔ7:*,k>1݋5E8_ ``!x(HǙ J$J.@/ި?۾UբGqH"&UD+q/Fjft>J ^hxd2z6 9NiǼ)?%By]`V>7ZALgG!F /T)`PavpeIbN:yq|i<<ԡ#0>\f\ `{H+>.J}~<σ%.իZ]HK l`S? G NzY<3U03bO#L˜j$T$x )Yp @,,J}k Oy a H0KT]KQyxceDJ 9^fo.z[Z84r_RILdw!_U ψ˱k\  x#0!c(H@7C$B`;X0;T^<$P/ڲ|?eI`f;D'0MD&M:-C<ѣV*?6^A/R] T,AK4 x 0yFzZ2'7о)54p*`} ‹6F@5O{ 8s8y>z#KpOU]' br§ [<)*Z Z@ybU> %m6`'0t8/xGRJDj~9a2vf|RGo%mĮ }X)8,HZd)UKlES u]+0^q2 [tHM\# y5@|glebeu A?oYвl\3 MR♧tEPG;*ϢڧwV5tN31T[h Tόi:khMOSjsKzP0b8C0`hw, B(r $*+2~vʇKvf( n0P)P\kO^EK4@jԃ Ro`p0>Ѓ 2&^B fp<%*T%dJUzGCK80`<|FԌ(`7 C`ʾKnh)  pBH_R ((!B T_k 91ᡗqT08 G5D~;Ӥ89/#8̫I9QpSaPr4Hji#9U+uWTLƑ|d&ۨNFP| YP6iiD}>jF5Y+lcrM!@m+wk_ ('Jto޺Hy\GVZWZqc}3[":D3<>ʙ}4in<3rWv(x)dO:u5 W (+\LFK/% ^q5 .2rsxd5+{yΓqdyF/՜mqL Ǖ9L+{V߄QآWMk:}mdlrPv*69cF'Pdɭ^w9l/#wAIwgH.J_h  0`0[ldF1H&GCf1`Q@9 D`Z2 `#.!ETP5$=x6th ˖hf*8`DP1 xjNc&FۜzTz>0 ):Q HBSn簇P (bct,AkL>G$_Jf 8_xqF6VЅ 3`Aa!%Qz%FP@Q b%W`z  ?dv1ِ㼷Ӳ6"E>eg0IlEhgL K Ch]9&. d@iLI=Zxd-&}VLk  Ƞ|S$,:C ``AV>/Trw bX Ap*$ *Չ^<@8I(UǃOU @| e@^xS(A÷.?p`ivuf >1\e>#+UE@~i$0 *yn6.$sθP&#U7o@P^NpC"S/>3hP0?8?z7 `ʕ^!x@K!_Uy) ժOfFl!HlGV1pF:tFgO(|,y{) \/c*_ߥXOOAO5Ssmãs`V8৪k#Wؔ ) _fR)s08B/UX<~? 0 Z`K JiWy * ,ћWXqs 4x `AV>T !9ڷ" h!`?3 Q;á9Goh"GjC3QQi xb ځk·Wc,c_{Ϣ'BP>#~|8)5GbaCWg@Bvs#:%_XH5*3X:~Ȅ8 a XA;U> 7(Uc1\e{8} c|/`0wߓm0 ~ rpZ& I/"ԇwvqDK4=Tw!}LCGvdS\8ZMF"Xq=rF|;Y 6w*+4G0^pGOpdى4뽇@):&ߘOng>ֹ~Hꈂ3Fb2# p`ʨLFFG ı츔 (0UU8\ɦC Zq %.Vay^uNa&jULJh0>BH6f:vx0 |/BH_\='Fu*98#_g)[zy8dM9K%̌u 6O Sca,<+"c*Ru{Zx,O#/ cyJ9sDMmO:NoOD# RJҐuV *T:`2R£{ࡵ T0H+E`YGQNb><Y b]ˀ0J#!Q(0A@`Qt)0_ĞZd  H/8 `{GuUA @#`g(1m) ϗ{D`[j,i>RgE5}UKVh.4x._"`?@ el_tYT:438YVEt]ǦZaAoaRPp|}/~{x#W>`a5B XJgZbxSRb R̼doUSyT`TQROHxKlB,@ ]EE%߸odB&PLJ}movM·>+0/S}9Nv\'0niy9wlZ?! Ux0^R*UBD>oIxbI! _ϏcSF}=;/<ܒ #$޴='F(ɶl夘.۷,\;ܷ:y|Sәn2DϔM0JiS%J=5NU'`\z:PXOr<O?Y9rBj|w+/oTL$u-G$ /4x]MmgP#!ӳ`3o-s3,a˶F+7&;.tu}nZy<|M=N)/aNxw}?| j"xNBCl=oN)/:qwҐ~&<i<.ùe7bw7za93oW8v" F&y\CΒ|U*? 7E*>Ռp:7ǁ{`>r c?@ H1x6W[E'+4H6b2ʬL!)-e b @* ^%+y̱ԝ`V{3|[zQNOEXUiߎ%ı"A 06*.c9G/ `j5&w5WbX pvoD7Vg*R<ā)ѷLO gQ!60 8 0?0} S%(Ja9CUr>!3{DPQŒH|)}huS-zUwaA"[@H!1{,~V0pP &'cr.DyE;4R̼)pASG=%.z /̫<:<8) /ҁ p"yUTV#wqLHezbN"NJ^*ULZ5jưJoBHc@!Pdt׺iӟ~F2'{a J =x%`0Z?tFq{T+K8ѨF#4'Om Nw+<<X8@D-{$5%G]P]CȻN@@\Bli`;6xykt~Yw%it.ETe⑈@0~P<<*D} V 0ZO;yfg#  w^f> x ^ p0BM?z.h~Ǟ >`rC >𕈜hBDrM˅$w#m:bqA8:ҳ`WoX ATJb䉅ȷ|*_ĤH>EX JGފY2q/[՘pgHSпGRx9@W*%M34#jz Ihf%P0_{@(8_sP8{xxnJ(p6vCW'B /.kBt0đ a Ke!$ A>RjM=C0Dm- XeBCoWyk@e{mLÀiqbzf82_pdU=ߞE\ SEtfCp w:*x b0 ΦL }priB=ʧՠ4_Ue lf)PeH HBxtWt  0êL@o?'̈/߉<_A7xb$e?[&$ڶ(تC#`;U V%PPVլD%`*pÉ20]0{ QKXVi\$ΈZ d{R = #Bg$|2S<1L[&tUOm`+ƉzA+%K`AV@%>, T#0H ` \ G겗B @0^h1Z N-`p^: '=n zr> T:y#᠏~wdV"1,~P0U]8!8~]$43Ägܗ@xR(`$Y>\ L3誥<{DE>pektEJaa8f3SF$W* HR2 '4ͣ8g7\ ifk 'F)xgm4#1xW(qg ĝ9'OT< p-޾u[Mo}$$$h!pNF*&ΧLmG!O8_ԟ 9ZIXvxElf !W*g0+Ycd@\uWR4F \!{@ʴWz\0Uo{*1aN;NDOs1bXгw[z,GZO1e:"ڣ3r冑Vv 1Q0 )>(' KWDJ, 1$O&8)D=" @8 WUq@\)p`:|?G?2z^ >|/+{, ѐΛgG簏Ɋ%v>FSBV  UW CUrAVIjQvE Dn <==/OP! r,r)=YRm؏ j(j*7Q6N  &+=ޛʼn]hu`*nd=i]谬UOI5S lSa6F (8IGZ 6bc B>AJ J;E ..[GU ~=TKj+` T02o\rg" ?׈ RUox-?Pch0 K\WTҴepG:>K ~˾ڟMDz6@{t $R|f|TA=N)ꁜ ^#后i]t1s:">hmi\3ZS;Wq$&dgq;P=SZ$̸AL0 `<˄UP8`?PA/t! 0!"_ĠǭP:>ITXTz6 U_`:c@9e QumS˅ F^22@3}P&0/,cVv&<OP6$!uP Ylf^LPX|)@ʄ _T4bVS= ˇ~% +w5S#GŒ pG xŴ{k5Y=/pg\`!@^ Wdˁ/60D $*عzoQt~ݼ!'Ndgk"G7S$I(:./DdOԝ_xG<Ru.&#z[Q{Di\) Z.I;v`ϫ 2kD%m|Ag)7V^1pS(W:a]ц״kvl`T"FK^`)C[:#$1rVLNV~J"] L,!rR| =4dcBB[a SUŴOK?ڠ)ՈK@S TxUA ĥc`|܅ ]<KpHuDSDOTz@a{R{,R^z P'x2PD+ @SV?XQcV{YNXuai$yZK 9[T~*ϮL٧;<=S804a=5!xfTX|:3G՝I}Y7TA_Ms֟/Z- pp@ @K?;S |R`TۑQu xjhFaO.'Ʒ6G\GPi}N.! x(D,5G`:Zwz*d`cqJkfαaKBBI\*[wg4 HH<~  $.9N]}[9ǧ̺pOt2t<&6w VȬŬ<2r8gt aWENiCcM`|AfIS{{c/p+Y{{vႚg͹XꛡӮkxb:lt[7ؐ3UF+r 1+%ʿ7?j@ĵPt `1Ku@8X8IrfV#0qlv*6Ka|3GJxǺZoX% y% @~0_{re`Ux?Q-0) N7a`ĂA]B x0@#=/T <Y\@$) TO*Eʕ ! @P ⎎:I}iE6+7=/?Ⱦl)`4% AAr:o!m _%x{t?Sp2T<@\ 0]Jђ.`p<ӏ՜CtL(f/TYa8]c'S<^}=+Z& GDUоo@/O0>ΒbSAL@xg#`~A|I/j@$+g|!(IzE(8F0{ݜwiopKVlb7jN(ui ܄JeR0pSL;d wEQA %٣|!:^b$Dn2+ՆFNfTi+1l'C L2m)[껜(ϗsV*}Y*\>?ʠ*)Z{!L(t`נ8?Mc&(S0y8|!5@T`=v>  0Kt/n @y^p ja%n`2:LP8@Iw9_eE3Ĭj'x !O x`m" NOdbay>İ} 8dI/|h3 pRH!2:;> W@ 2֙.ӑCoH8a@+0f6qǾs:iy0F! h_{e#xK(J ՈVL dPZu4[M LR6<8*)}DrZw<!O!ϳʠ`>;8#O5ל87Ư<:}0B[PP%ETIkǞ_TMT[:gW/zDjt-4aLjj}oN+)qҔ8s! gަœ`2GU}`9cdnu| όpa XB%3`~T\} 8P/%cR=΅0H H9`<P0}⺟~>@|S$||>U*  vh`;$ T'T?>#*繽 .* CRFX,AZ8f < 0]D0_L "\ 2RDҿ׉P W_` BR9FĽD[OAe J=ð:"IIz20N+[ )zcu!c5ޛ. Ȕr8,IhV ,q+G_-XF<85)^T m\Ml:#3#UC0X|dz]zڽ(=\ᨼŌp@ڃiW8F%\h1c&db]K}OGlu XE{ye<8Pz>sc5PAi<W3Jn"SFh0-!3+U/ӄ랪Vru!AR3 ?b|,3dGU7+$u'Goh۾wkw2,n[29I[g]oÝ}b+k<{滧j\"e2SQփT=zNEig<Ƥ/ǎ92Wp8W^t'}oZ7aܶStӧ[}$Bi[gFL3;-"w7wzuwws7v쫸}W#8YN~2ߏn[z-7dQIVyɶӛ!>旪T%%J|^ bS b@iy2 FIE Z\; lcK[n8Ouȷ\6i ?ы (y^| ?5Y}0>*8jSa ,(Ŀ%P|AGAT=aLEبJ/yU`d W`Ze]:`U(NW'[L$yWqY&uqw8@AL@8fsI1VΧ<:?կ}:)@tBՃ;0~:WWQ?" ^#R`(A H/P<SS myH0)RB$ ."2`Qv{h%a֚- 8xǀw0zD+KmUwjq?R(~}Uvp>JtG8E)2gWD= zs.jaĈ\|)D 0!H@;}R$PO`İ`<)z10 +~Az|%PpD!<4/t}BԓB$CLN \oS ه:oOzQej0V;m @==|][~9 |^0E^#: Z^k"h6M!AI`zꇅl2`;` Y0P0P R0@J jTȂ'fH%]"2<6N.)L  0e B8B_*cpEhK5pEXE8#l֓Q,gǀQ )oLA?{ ܭt . J=a D~Ec0T9?c0GsƇ/¥f OCGޙΝ/e|3y4t4& zm |c;`M9SJp<1s<?A, &b#.[&6\5CX/BICr}Zy&( aA@`;XIˇ/`~>>R]ό`%Q&!J˕X>?WK_,DEZ`tFaA)όC{(1NLDAD (GUB߾ߐ`A\j $ޮ(81P*И8S%Z pAT g$^RzSc! /`~zdSp`  %{ޝw^ Fty"xz(=$K(!͝V(iԊ\ "`/WFHN|JezEFÊ>Q~6t4a~@D"ƻFx{uMDM_猪RE0|޵FqAP~ hWNsѡyK4BL*ڧ /17j* ݣtwڲ:}Z\ 鼟TqaÈG_@G q'U83lQX1 ,11=εAxeO">ŏR`-Q'm:GFO^/ŏUq;f3\ !Lm2l[⚁٩i2߃+^eMﱝCξp8~1*絡{yy.I`~SRVxtb\f8|^hJi|x8cFֽ?mV=PKSyyvW+y}5p)D5F, #g\)FnMgгާѩ gأj?4,TQc _VӀY6Qp0u\J@9^E4rŸK D!*@e1`B(D:h/*sJ0%|"tF4<(! A ^Sx uB\>Bax\xwυ0L'(V>Y yWb@oZXE00` x /[Gb_d("PBlBaޫLt_T7B]#‹ بI$H V> ` }az̠hknS=L_#FxtŎXej,2 <+XOޞjbYF Hn}` Ge(,uW:Fi8!x0뜆0ެaš `` ŠT VǞw`<ļv8V'ΘuYݵ)m"O <X2=>*k#2 ǘOܨ/ ɝ]g|*~?8I?>q5 ŸJF@c Q&+zn2 o0`_|Dx}UUGTt σ~%+P;Z#45HNi*͑N78PyУc:#/ɕ0BP@A)Z d|x:t#6!czB ?8FAǔyp`8o `K!/hُ5WǂPAMUAG:p`~nQ:$ _#OVq%ׯ5OV:R+[:qL3 #O\yoἘpvxae+lzDv `B8p;wRn3lH$4X> ( m zA8)qDUxy(ցtXlF l);r,b1X?J^HR" KboKX=ESJ=Yhn2H߇$U88*3e(JBnGsߟ{Pp-OcͱF60C==}[`_uiq6;\ rfIɶd)8RX@@ 5 z H0@ CT>V h0tHU|} g#$aS߄/  ׫V>eì7@^XG8 @$m<ؾ-&Uv<ҹ~l>&@}>L>)q\$爂oV!.G"?"F @$KKq ! *+9J%Wx)A0VOԉ%QAM޵󽯬<'.*./ `z30-LyE‚i+w~.xSA"(2F(Iŀ yp|䩩B0?P{Fr_gٰΪK@x5hx+qY QrxfΆGVooz絲{D_@ۆ?B&L䟎\SH *K꿈 P\% |?0>U&ey2G9o˔|/\) Pb#yȂ<ն~HJq/Cf"Cxލ `\r=xS`j%)!eb` ʍx(y BV?5`P_2_GQ?8`?Tǔ籾' ~4ެC@G$O&[1LֵBGӗ##@p)^ KDj t~\]K'NX逦 BG'%e TH '#, h@AEI٤ U,I%o\Pzi<;Dac OlEM `|yG[3``D_)Q+K U{A&/U ?lUM0F#V΂mOo:*ڄy;#EP0+L 2 {*#JuGˀ⹕W$G(H9 3׽zegЌ)tcL+ GWUl^. ~%f7y2&Ν )m5!Kf ׸@ϧ%>ߞ [h4UVxZulDJeR+TE:шp}TjJ# %0P $*SGr Ty8ݕxY/**.$pAzl2n [C0 Y ͮM_(\.o``Dxd|>4%LwpmMH8@PjDwpэZ0HvN0o8`HTSg$D`!q 8ƉXzOH}\' P)a!eo8g;LpQTDFzj8#& @)oD }}f>Qa*`oxeXHG'#}kfyMo5K:|"ORpjɱ^pg zSqPrC`{5@Q\)8C |)xD?{@c  ʼPΞ eC5^.QД\ HeqP!VH)շ|GC_ja@NUc:qx_+SZԒl#P 3DT'y9Ej㻂>7K)!T?TzF7LJ\ **w_bPR=wM>~+( {z2/" lX|fݿ)0\ $_}>uIɤ' * d+CSS|(dQ8@@bRD).qd&Mg!ߘKO *Q!x7tlZz$,3餝Ǐ8{1jQ$GQ9S)C4.f_M>=cn(Iz{%g Iw 6,> ra@)=ܛD>5xdC'Sngp'78_g5p79ַ.Ӆjg?~۴&[yӥ6c.l;O5lVHW ƐĦ uMcs [ agz<p8)?'} Ap>6>&:<$ = :x0@yx0U)`_!*Gi(* h!x}`_"O` 2 Z)(K J;lp*qPl!S0J& ([(8 `0UajS4yHJ+jQSkU@0uH@$+mP`;yr)-\! /y`y`xHV=g4#<{AתTsf+҂u$˘8 `3T2/Kx@.˿-K| z3sp1W xս*ېC5O2|O-pŅpJLhӑ0T/ı?Zbsw!|xLz"d/^gI.0ƫOW:m1?SA@t|P0~vi}0J 0`(BWt6Ui(XU}8\%$_!3OW[EsR PCߐo63/)*;DG (&5\C`PC /@$a<`3T<\i g^ %j(V=UHQyf EV1D1CX9R'$LaΆD0'zo `BCު޸`K^ 9A@))@UGppA *y Ig R{WqwOn~-͘'ToZ_[TD#Z}Pa0P+`q)O]fFH XA0x '/>jQt"(u=u?]B)st& Yx0: !_l{ ;Ǎ+;p(0` `4  `B JU)5oیU$QNmNg`.|H3T;>ttT;TSS:v.Q_h)|W6M@YƢ5 lJՃҿQ ^֫SxAȭl%1N~Ud z`Da0`j=`DF4~jmFg9˯ `t *ALjl@<ڴRW _狯^`~($ HT#j#L< 0H D`<,YW7E׺H JT>J8 4 p JY"x{ʮ^1 @`@\]|<ޞC%NE4v"r.u:C׾F3򂞁E,^ \>{iV%.CFD(w G?$8>; =+jdzJyݹ(1#Z 5HSQ}'+'g4⯏4FVXtfˑUCiޏ?Ar m$CJc͋]PR*|ņࡿI~F{+i<3Ss$irt:'j/n0荬SCI:G=B6ܻܴs޼i/UW1Ca_W/Ν]C3ᓒn\t3s[_48ڻ4jϽLɼkul\xfKw [@+ƷWxǝ]ooHXۘ;Y%l_ۮS3cwV-v;1s,g d S>$|j"qKQUHN@a/@B8> )p0JAw@/L2~ !0>Xa<  T@/%)c$pj *~AF$(8}Qx1N {J >/5&TT] oI\x38Dlg+4~J5N3zgOw:!v}ʄv\>݂b4 8!`{aMBTz IjEJ^$ jx|mp 0`:d% `|$J.S{AH)JUUˡ<  W>Ї!DXhx%rQA{B{LA!MCi_Fh؋{$KS*1 ? `;h "E/ 㖴 H|IAx|^GH':hjIa|/[>F#`DȰ[d Ɖc[i>F =^dJ4sD#L 4J@{ I?V*c T>)qF$ 4`C(TE]T/4JywqـHA@AJ0`xh 0i 4U.l2ޞ*C++c`8fxI_}qS-M`>hۙ1%ZQ>qwM(>X$*>B$O`? =Yyr~ :oryLjP| 0<%37B@ T 2||+q?+&jv6`G4_%@3u-@> 7<{› >SbA0!! F1,:u$BX0$ ^$^mIO*W>Xf x&zC;6JJW>[ǢxVy~?#$#sXPFO t]-$opR A `<@2k*U+Uyη)Ц ~_,|#Xzj_h2lB(H7<(+Ӫzِ ^=DC"F_"q805`(ʍSi$跉g/!nruku6 ͣJ_TcXFiWj ƒG"-O4uz= JT<" KA87Gq23ly*L7R#)7g Y]b@B1uJuD` )xSh!**uO=OE!zWgD-( xK/çA>"oC̩ : W`x~›|]ϫu`: F `}R#" 5C+&\<4WOѨ*qj4|uY<'C'ԙ&:S/OZgl+u| 긯,ʥusOfքU$Sx" 7-ӺHJ@"ӂ-P)?~ @MRԜp8hf!ƛ0m<@/0>`itt8 0=Tʬ~_@S\$*bIg| a8 j>ʢQـAT>T%QNz?%SNvv.1/ @`<:x)sH箁 @|GVQB4`;Տ ` 8?щw)`Z*0 }=NI8"\N%wT *agpyRyEFdLZ2J.z88% $֬VAby7Ȏ+RjaGxaOYVpDhyLãrNe=!~ڳ6zi>>ÈB}I汽Y~7a?TP% ]4^}|^t2^h:W)+H'_^Ĕo|ꚲ7r[7MmnPJZ{,35$MQ/KJQk|<ͿqJW7CZJ \hk?F7WLHɏ:Pş#0Bv3\qx8 g}^moKC'!!cs_7Z3GXf7$܉^p~{y¸d4Eӹ-{4sc>$i!l ͭ?/IoK6y&S8?r;7PzQS>0E۔d30pH頹O7q?٨t3 ^k(Snİ!( |@)gB@?GCE wˁ bX@=WW*|x@q$8(+ރW{9;6 0%&_D7[3'qhKXC%02c:בs*KJga"O<2OA D&nH^;#z&0s>/{\ [i4<߀}%X.ġؒ 8#>  !ĵp./A *Ƣ C~Uwp .#u炈GFz [帣..?K qa{TW1RU`.9 @v+?/U P6PwKфL"sā,0[aA*VHLB `NzE$M"&9 -^C)~">\a=Q "!PG4jr&~@Z3I@F`P2 aA  .0VAhʛ`|QTR<\$7"ۜN)2$NQ;"PAxIS ~9X!1#4?T.8#D{dMxO`s'eGpela^m}A9y3/Bz7{78?fAjZk:]:#Ӥ^hѲw' SL(uZEz P2uR`ĺ ʛC`q\/0^QT0~\>~Di8b`:BCW>T@Q9 $X(.iApS!*<^%f=_3{&»zZ+ `x*.A E4b8&x: T2rt70>.``D/H*R40%y!H80?AyϲߍqWˆG^"gaf*c 5>tP(AK/QǪAGE82Jmp(XZ?L⹠}b>5E r7]aO Sw \w=O{h)y0bX@BEP~<Ŕ@}?/1L07߫J|~=DB@ +/@Gm @\T W1<5`D V︾sB*}{dg4S& Ǡi¿`@_<(,KX j'D32}L@&>ꙢU):ad; UIZ=x-zt)v*V|I `@ R3V%D%*WT]0>脿Pb#kg;˒n֣˜; aJRd^%?#wG+d`tElD21<-hgyϼ3Br{8TQv76D, ep?KpwXuΙ=~\nzM,5Bz:P?B\McSUxN:B7D5g1A0@CLB0=GT)+ʬ/z\A(‰P l#0_c$>Z)SBEӃ%@"ALҠUi?Wı,I.PѠ0JQ a(`~DC aO?BѶ3lN#`.g&6z_\['0PBy*'eڧ9dAHwϩnz0./Z0u;N, =4jΆV<{9N2. j3Umȱ ,dR@)㈕R3͸EvWuo{u^,35N>ߓ$a $Iҹ!)ע`vtO_J>Uula> h{q`k ܞPR2:u.A͌y~/+}sD4?}8X8@tp8*4uqݽKuOm SN-m0m;1g8mE[ +2Cjgcqn["S..IPÂ-iJ Ÿ?+&N9G羯#_||  w?+,YMBBCxA tؓq|I>+2c( BtNmA\Ԡ?UaF=V:<\zpiUEdžzɇ+ /` .ի@0/`f( UWr)V%ρ\B8bB-@" ?pB.ߗnךg=xт`l!P5wPKC~+hAd\:g 08 E.DXK.Qi=P p*xuCRC+Q)'m  $h/T@8@Q4w0 Hvqpz 23筘E,P:x0$_V>l%O!Th=9&:.kOŸU"PB# U{IT||=XWBՁ)j 0_4xpd%-'=ِ JGfzra{WTE pFϘ ݵ6-i!qt8)}/jZ;m d 80 _,͖hq*+_ɻ*O j1//>g:oERu&?{D%џfi L|>c(}VˑQgIYt`>r!S$J":^1V#PzD`y`<:/gpv y 0!|#,Q+}G%*š;ӚF h=%RM| / .t8_M괚h#>J[ Nu6@}Iy } O+:"a/)=L 0`< |{<Eʥ`o`~J*ڥ, 5')+>,`|c p0`}@=9 AC_y29,D@~m8Kȼ;fB^>{3HS8SR`b) 3A^&Ģj@( (/XGad#y6F#<镓.aWl ϧgXM(JQU3oЌuO)uړSStڠ?O'r#دtY.0XP},Ǣ- qx0E=e.}#FU[pB.T<`0Ag&Ƭq'B'M{\S5df3a JT|\ 0? xҀRQT g+x.#=o ]Yb?IX#ޞL)=럢1RCR$7`aEU!`/H"q2i= }#Υ, 5A"Ke'1T￉/0_?*R%5ץ& fe~>)N GILyz:C6_{cEJ! ݇}>ۇXh<#jǓL¸%+VҤɤtǃV6mGyYp@bX _'A DKxx/ꕗeʇ%W/E޾RXfhf\]8E|į=Q45mα! jC5q(uBS 8#c⊹:Nؼv:jeN2Etڸ}b+0:SGT^itf@(?u3X0=w SL#?A /"hq@gѦQxp{gɽ?`#THG2X#N,/kuFp nO_JsDC}Ht H~=R0)U_o덧}W\a;\;Uz},3Id2k ,,qF V *>?ϻN;7;{q£\M}TY3Bs=r77C}.9׳/Ooyr}/WD*CE{šM^؍~su2ۅeoj !>P/zަt=6:rzTqǠ8@T⹰ɾZgxN)-:"tMo{mn BA&'eu*}?Fo ͫ[z77$lIXS9ǩq}ΓO([4=޶5G2 [zG,)IཕzC/0O/c -.hЧGLIs̝S/@e:u~%->qJ#β#QI 0p`k&KM --N 8 (x82r߉UAKv'f`CFg Kӓ')A/]Q|Tp8 :JE߁ X(/m E>}~Mtb?и?=8 xT~!(0 ^>. =-  X@ p E*\8`o@ATOGaL!xJp~IQpJP]2y9xT*쀫xLp!!"`! 0?"W1@8(04 8 5bO!RYdAp0` ^ | ,37Z B"D28.P=GFWe?:VhjĨ_\qaja{7W{њޓɸ54+Q;`  0J3PHrR'w#ȌTL H1f4X\/yxwթrP ؖ ? |jg*0f?PG [/CERE+d0$æ j^@q?VxYa?6_~& k!(%zW$L5`/`t?u}R0`jT|m)8ǚ%0;U1LdhFI6P*ޭu)ЧZ_ARz7М`#R2Ѣkw'e7g 0@#V5 3]soZ>Gk$ȉx@/ +0^"h! ,| WECP`8xR3DR K KV^4'@E. >Ѡj">BͼbCJs\\'0GLc`SP2<`;0~^^C L*V;?.! R@ p3@'ERG <xRuQwaoJ+O&:CnV<Ȼ2+5m jHY )pKh6ρS=Q3J99SUqH@|K~QSmZJF7d=ɐ0u2J%*dyg0?0P@xdc*qїKT:IpWgjXIƉh* 3+L";w|,"BDr <"W˔)P/%mg7)(.70a7\F|)"ˆ`|yRa,%H#gdWߔ>Leș4WAwP<#z&Yfb$1>#*'k3쑷' OAmJ(%ʿ$lRT獫xE$2#]DO/Yv_'A>#&>Z@ I?: B[RFtbOKy@ Z?|< %`<ı'2ZsQ'KLcrA@x`Uw$@b%@>9B^|l:sy)Jo`L"7+9j9|hf~%LD^_?k8.Y FK:3`)\#t|T*5EUJUwd(d'=U 3HdGti u,,3{F'moR68~u}:S '0y{ sIC&QH:$7m;rywID,2s%=Yw:a&wp!Nu> *8@AXdR%{y}ZSmo<՝Yqj:'IuV:k_67-ފEq2=uo~gQ#\NPSw;O {H=N& 8@TͺBEp3$]CEї'$! #ûy۔*:D@I0C쉎zӢ'rqp.+`c6ԗ*S?XP$ P?De;u_ԨK\ 0ʯ_qW.|X<=0T^{qbb?F22d[L1肌SmPd=0zh00Á-d< ,\ac}1 >>(%+ja5*yߪP˜&@pR BQwAPU Wj~$ڦx 2%q&VN—&0\M~9_GNLHAsU(&(1zQ( ݪiE}T7ꇾ?]"SW+XhJ*Q8_u&j߱ DC/8-o:*uH(=. ᙃȑu.,8Ӓc7h]>m >;! `80BHB0>xDѠ` \ EĻq2 ? Uko/Jı!P0?"RM敳MAOՉ0E\G#% ~UV_tT( "$/;NRgp/ፆ3'>D0[q. `  ^ F*`vN {#IU*ONG F X`oeA <k`9 t'H{$ @8p>)ԟl\zg!c/P 甈A?d':4ja-`SȜ &`:@8|X +f 0@ "ϩ4`!&/t p<gstƎ{G{6`ꂠ@!}&õ}O0)l6NЦ*d=ޏFKi ( ^V(8@I>;B@Jd=wMqOaEjpEz\~<7lvCn+ КxH8 `"vIO"Jp P!Cq P$-@'}#pvH%]aհf#9LMQԖ871)p'sxD%>UA 30(?ʪ 0Qx9`JL SDc /WMK~G% >p]t]1bp>8?_~&uT)= =<,)$>,7>G(Yl0<лxz_ {j! ZcGSoAT/Dz#Go Uu֒P-`f ^ +\} 0E @y5@vpݿ%Y=vN`)D+4yH cpQF~9[0fPQ|TMDUAVk۬#krctR>>A3+'ۡBNXgR{|&uyM/קAM.lw+pjiZ-tU];Ru,3It DFc"sJ-m(c56ҟn=j@}NמBy,3 4{LNS؃="7<A0{ IIFF^_}@*}~+ z`}AH.(0*t)UQu_5C%@{F@~ ^8Д>@&N MO9q u3ϧl#~H@{ ; R1៺iZ.4,gQSq^v4'1h\)9p!+L32}p=NyTQHzN+<;5,3 cjum@0P!)x 0<mq*2| hA-g0 ` C 2.juP#0ÔltvWVb=\&Szzύ<PF g..}<:ˋDn BثpK<Op[wf`d$<u !T#K ] OڨERY_{Ef&ӯ*,(R4.0i{sy'GO11$԰3V$ <3; /OZ"RLj-!rL]) 6t!Ϯ`:|5N[6^%*x|. ˿﫚\ Bk%*3tplpz'ъsZ#h3TOM2q;snN E=JF> Kx!{DU@N( ~|E=<6ELP8}2.;0MK-Pr X@T3yʩhP p_OTz|)?/o}\vi3z̞<ħ}nŜ>L\%3pɓZlS償S˼'ޭOҟ!$O#c'`%'<}L`PS `<~ |SF6bR0T<3rh{ޯ5wc Wݺ72ylᑤ?熍3 ,j{Ҵ wMw{45vc,_cS([4O8>4j}sf=vo["{coRdN&a&V@r4im1OHd5+ #2 xLh8^3z4ȗNBE>ybjf B\)Fx@8$ 2T @4H/4~X\ B1|.4!^^ 8ó%`  U=0JpOJ/\JDP/dX]`#5J W@Fe\F0!cK[!aӡ{6* j qL"x:x.l8NDUA0`<@0E[h(]\}eS#~X*ً8+g$N'@F~!T|X d-H@B:0`P?P7l%D;>Yp,=4!/#˪.E zME%864?g’+xdGDykd=q+oXA"7IP^%OZ 6J*WcO񐒪>xQPG%VlyR{WxA/4!0? UЦm싋_+x0sr>[˜&L.%BX%9 X)[`mv4]}[ϰҩɂ:V<(gF 8 X+#,Rʨdŝ7P59dB2*5z@`P |'󕱢h*A+)wԀؕ!;ת˘ `J; h!c_J\]$0CT>P$`Z&T)WE% -/uD^ iF :hwxv+`B般 ~x0B@?gA2/n~"~ (*AF嬲4X"*.*AV-Ly% Txh}rGT6 lGOLbukGg*F(NgDc6_a;rjx{\̈́O ;Zm,3owh>{Mg;1&$r\0 J5 }^0bYx<c @{t7&  Idkk>A(& !1-`wd5 %, HW  dT   F - / H 1 u =   k G  U f f  E")p i=!dbnO 2X:c&bg  _ 3 bE~ ];|c B  a # ? e i 0`t 1V  v P  ^  8 ` l R a   / L N 3 W Xc 2 X # R f T 3j u b  J e F W . / q  Jc_ K  M|m0 z  m I e J-  . mmO N O  c . Y t  5 s { @stco 0֎ud(r  d <%flexdock-1.2.4/resources/demo/lung02a.mov0000644000175000017500000134742212177715062021155 0ustar sylvestresylvestre ftypqt qt widemdat 3n (0†s-EXP1>`oEXP1>`o0(k >'s{`T#`PoB` Tʨ1@9ρUA sp 0†s-EXP1>oEXP1>`o0(k >'3r 0†s.AB\P1>opAHP M$@b<26zbX RӯpJ؛ςNP`5G| jp20l@`9` > L'o* 0h`0@^#b}9>wgP`5 [ 0b}8? (h@7I @1-j| 0X0`Jz so=hP1>F}P)5O0 @i^R"@a߼σx $I>A+9?&% ps~| Uo@o_#ᨒ%NQtno`O,| O@7`6 ~|]p`QA4| On (0†s?K` 4o`+p`~J`|C C _`0?%ͷ5047@GUC0@U+.'BGSj狾a0S'#+xG~&O1JK40v X_ü<\]U`x1$%@@e1xN _Rp`:\\$O {S:"QP0ai$gġ)R v8Hat@P zu`xxHWW:lT@$(n'd A)XB/>np\[љ  D'3|.%QPf 0 @}S|uA)RD1OBBX0? RE-P8TY:<|82`;D`~yz0GZ< n3eN}  @ yKՈN+@*X(0$ê"ƈ::'X0@]stG`B;y5A`B0?v_Hҡ `<   80pC0~P={=C/T?q &@G~)̀AH_p<``B`! @%x\%+լ#~?%@0tBXA0!]&BՁ["-C)YB[`a(Jpd|-Bb̾eGꋽ7RDl8T P0 ʾë?VZF!rU~{GA.|>"yAp.B@`@^mM/NT )n./T p?VVR;$y`0`u`; B$Lb`CӇ g %]!:?y oK|_p!|{l/ߔ64IxJT=*LQ-Vx*!sDv* %I~c\>q0c T~x0U )|#`~`}t- AH *>C  !P=WBYq|㰻e1G ı+FC,:C:$ cGbU昿QT|RA] 0a0# 0a0#` ?hx !*24>^ ĩ[㶺H7!xUZ @6w( ]/UkI.y 0   lxpA('Q.ЂXC!U|ͣΗKQ eʄ=TUz8#-bf;@<| 0`t:U5^E 2"^%12BXIvR>Ue?B`A//J|"JT 8*5@ p0!*A@>W_O4"LAHx `*/`l  *HJ=QǴX=݆C  h0c .)ZR0E O) AFAT%+DaQ,~0 A(;ق>43w:+Lsр[} Z%}Fu2a +[рJBbi0LVcb(nNs*Ӄt_[sD3$TJ/?,S5]  @^Wpz(}kd# yK@h 0,3  ހpVsnyz`@@0qRU^7YB2 7&$_KCzb蒪%`;XB^F`;GҺ-pi W C5]P_DO`$+r s:`0y`; V;.)``;jy sj:*.$!DYAx0! PBeH_گ'}0xQO *a~%b]"U=OH0L:R` U~Yw C| G  h}%0c^%qB*vJ\>L!(Jz_AM݀/f`Ḓ (0% !* S0@L- T?J% | DQl?@`<$_ \W}bNX|N3XBUe}Mly`@0x>%}URFL@K{@V i C+F7 0@4L/X(J 1-`}wuڭR}l0^^ h(%R"ώmU9@0p@*c!( (`4JU9 *G5K+pG鷋}A0^v5~tJT op!yM/+VֽFcq /­(z 0a |?AJA 1yxY# BIp0*Q@EتKĀ  I @Ayn!"IwKכB;"&AJjZ%O32]}3~./_K? @B>$\6`h\?(~ A46H A&  X(Ģ0%}Z.`BkސW00~H;g[}&]uSTw{m]ŎX0 D@!J?ZW JUIt`4#`4#@@@SAh x~wUV(8_BOǞ& PVeP4OJ? P0  RG|]=~{bPėrh0B`퀃(z00\ P@@!XyX.t\g-HuXEEX@JELH%x$yW%T>m~.{^ u`jP;mpq?RjY4@A%VQDi3X˙UJeUxtx_> JsހRp r >ۀ-&qYG%%T\|$$ƖN/DV& ԉ渼A yU(뛁8P4K.vA(`?獀`Aڐ8]0E%B,R`Wvb1T]X\B%J=ItKT߄*K(y<%o'p`: 0X(G,J2&Ӏp0bT8Z ?qX0 !x?xp vA򰅠`7ǸP e|hDptDXO"$!$KBp'{!)nyh`uΤ$>|BQxTeKX[9<]_֕C0.T>Di)Q4t0As2B w(>U^2) +T/|G D/!)bm`<Ē|*[f`0^جχT^$oս7,`}$+/٠LT$e x!*+J830`8BXJ AWR$! VP )H)$ORţ'TW{W禶0i.Wh0|N\%4?׫ ^\%}iVxKD_a@,$( T# B |t$09P A_+U$xHV%_It x&%B`97:<~ `BLıC,} 9 5V?uTc|}gfF< AxCA@ʹ±*k&^d h0x p%P W0c RqHA0>ěX[E0q\$lJT$nS %tLa` _K_:A%>^+\-xJw#af A  (+D*C2GKBaH`f7 M%y<D0`Z/VpC iwĉʥNJKY2DKKa`L**tpy@00K{iQ0`B밸H)8,%[b~%+z%SνxIV\\RB_0uj% pAAʀ=?OA~HUG󧃸 A  e 0>^(\? /OĂ`:\ӂР@`A)20<*3DVJsh0GxJ޺!>T;Q1+Ȃ z ޶x_h0>-XCT?aH+&sĠv`NFJ A/tK~kV-FN$!3`;3Ahy`BO|`ǚlj;Rh``[ /sH`< UP0 ó~P^ @> p^p?0DC\_|]V` p`: gx`AĨ_'P IhP``ix0_zyGjx5)P%5c.?FT`xK>E?RG+UK9_2U `B|T!OOzr=L\.T   @8|]`: >@|O@`G0CTy#Xɰ0 x FZ:a H  %W+ꄻ0 8p<>|\J#KrQ{g4Q49{:/}%"P`0တ>% H0`g9KHkQdS`2>/"} Izě L 8mT>W(O08?`?}OpUQ ?0``G0``G@@@h 4 xX_j}PBWʭM;ճD#x^V 9xB%k4 4_˔ɍP`X v_]:"eq@E{I!@ԾZ=B*{'@`<;..P%`AmsH@A/.'ypyX0vQ@atW@/(8`MT="JjJP^2 @pՃ \X^|Thbp/$,\R@!Krtny)#@e? P|@ "= `AD}W^_zȋz.t&.I!C/ı,Z "h0_)P`v"y`6^$%[AMd\b %tsP:Y`TďW>V&Ϗ=ޗ{dJi$j\̏7Π0 pGlG."Ec&!D&_Ŕ @ %uZapq8rǒU{ëe:RIPQ EșH!D' %jV$wt%"@up0yؠ `y>@v*V  `AąZ"ap|x*TmvkE| hؔ%U-Z^~](IJMߗsΡh >=}Hq89_ {lWZ7r?PC(A"@fGՁG TQ9_V'J|Uٚ@J QZL_^P@uT>,}.{=B?_#ވ +7($(KvfPd>{1\4%uIH NG`0pLB,wH8}M CP͚2y/hXEUU}@X   3t`4#`4#@@@@I *HwD~[gKtB+"8(R>(V_wC8/ TC0`60bX`S*d 8W95xYw2T 1p@\hѴJKp*K$~az3 \`6_A@$|)u$/}@% `KIJ *ābQxY A0^bPt$`)[:FA. }0w<徙K: ՃA!UW?XT:YaX0Z0Kr(fF &j 2 p0@ʨ(Esew^P Oq|]P0`~ULmhL&˾l*<x(jwbaݨ C/ V-oKi8?VG{:D``<@<!%QxBpBxw)hO0!APIU?@?//* @!#mށx!tÊ x0!)L;C[h(P0h~ĨJsh t~I~c,x7 ~%v0!  @CV\>AP`Xtz>0?l3zlA3B@P`:B xKp0+P0?C.V$ 6}Z` ܜl,@VF jˊ(';0\ h3 d 0H+wԟM1U./U(ƍ$ 0WNJX^X/3H躨sFSY0` ^莯[k:|>T հ\9$H.]ÿO`TB#`;U*0QzWp?oa xJ."` ^: ` R;W3&0BIxCU뿴x  ȗ,.^% |~wU``A A 0Vz$r\ B]/rP*CXlz^AtDR3d/3)UP]lS eꪠB˺Rt`AUc}Vґay=M(` (C`<=Yx>OUtŠ@!t, > xV&>."BL `ġz)e)8h!ꆿV/x۸C6PƉ@h>HC>"GY8J }5HK.5]p g@MIQ,*yꏤ e`=PT\] UT 0uAyv^90hA/:\R(DPFsi5!wJԈʁFj a)c@, ֑S C 'XGȉ0C"(A0yA*`1@0zɃ`DCPQyxBX0|!_/<\#bsT8 uDBz~P`D.* O< z p0@@İ0zmB` Ɇ`0 |\ 1maJ7ߠ{XC@4JT hA̤oqG4`KKZ!JPy% *B @uvC@$~Kʢ(@ VAP.-X8ª00_ EaT-u00,K/bH  p_n | 't`4#`4# ?h@@@?2bYw]RF >~zK+˼4mCJY=?8-` |:%PV(A0A ! RQ}]ݢqP`KˇGtz{R}{ ~K2 UlJqW¾= @`;hAP(J(  osjN`B_P#+2#D2r9`<hd``:â.UJq`x /$3V38%AwB_A h) ^Or p`Ĩ h<`7 #d.%* $ J+Eë*"ap_B0#AKm=dmJ|uTJV\ LJM}|`>JQP0!^m\@3y)!zYF ի| Qr6`R`<`nP`~UΗ)xp0@^Yʃ`<|l)8 hWɧ>נK*$ @}?*FA, | \ R5m<k iv ~mY 7+Ix/1l`FA s/ y]jSр aN8l!A}?U )ICpqC*KՃ@#Pe#nBJ0\$.CǷ/􅃂R` ï$9/V?p@$%yP0;JC v@`< tF!';dTb h0#IW1~   B&&5#@@^^ Rע=Lꕉx ں`  P!P3~]s G:p@T9hH@@pC0Pf /.WS/ UyDa U,h0T$L* ^B^^Մ`?@_ px@8;8; J<3tUxGv^_U-04]T ޏ |ʔ@: AHCTN>VJ!yOx^o"`}.U An(b`B 4%nW@8W\$A( `yıMZ!;P Uԗ*\IoO/~$)WS9!_ʄ *( Q> pʨNJJ|;)јHuG=YIσ$~)"Z9K ZP ⁀v jԨo{N ʂA.Z=/U=h t8 X' !+>hB~..7*(+bAPB]TudBx>+/xH>D` Q$~IW=ؤ0 ĥtPg :`yL9 1_%鎃 !БB R7N `;ĥZZWGcN8' D>djհ kG  !XAG -WTo#zb ȯʙ`g2B:gҮ.4>dM i G9i G9@@@@0> I/R> 6@  T0G}>/R3rH }'H իUH ΁ 2Ww:!q0Hc ƒx h$ iT@ABhTK{^2l 'v=0xK= )!\9Iʁ_ʩ76` z*c(  A.P#΁#Vyyg AB@@QsB7 =#0-O?00J"TJ h:ԥKCH_\>: ĺ0GT I՗+ڦV* o}T=[.@πEL P)z^B h0 @Gp>: NH]sʀȍ:l B/p `~֩;0J..c)n Ȧ fyN@dp! @U*MD Q]/~vur`8HUAV?@ %=Ta(h0_JAzHP A W\8py@ʔJRNuP8$ h>~.-ϟ 0Um+UU~VUa0@QD@rRH0t<.P<Z `;w}ǪHx|ɈubIpRLi@_1~ `A.yu*s#PAK=wx4 VK_#PtMtԀ0늕BC@r+0:.|h @h xZX?罻Ob `?H}[-F`\Z?ڧ^2`ğՃ%[D uZ#FP%#@`xXk a`dIBBTc"zP :%w@x ˕5=VhJBEnNH犃$\GEh<A w{£@yI``:Aީ> CNYR@@z:^p`:0DV_(21i0tx0E+ c$_Ky̒#dP` J]RS A@%*?ߪG> `A30H0? ̊8/:6y*h+:P00/ {r?W~RӖ σ 5(w7w7“`89R>QVl3L[.`ABeR,nG#J\:f ^-SoWGJӏq`0jRg8^ ^P^>ӁpKWb^s JQ}ǚ4?I`<{O*lPr UACPArg~^>/薣D5,AH$ $%x2yH0v*n)zGB`⻊jH@ ` kX X@A Pʃ%x<[H I0?"H>z$B׆UfHD !? RrQ4 `"Yr`<?CȦQbԤj x˘:`<BP0!E_+o?%h0V]$*}&=T_O0Qp! |:V_WVԹ`B0>@$|W B@ \{7W = @s@F^]'QD$ FN?PPH y|ƗL6!*KUj힔7h$̃>U@ay}.`g5j}4w|S 0/Mar|` m.{$>{hWQ`<ĠP9_eظ>JLU4߁TB8 }4g}ڣAUp:!NO0#CȠ}IP]G 00@_:_`_ƫzZP++Yw+/`B2<\$QHJ~tP#ՈZD&WwaiX\!P_綃   P^%IV#)=%(]>^<5{F_AaX];٘`h +.+WVa`AU}DOf+"ߏ` D 2\eo#tKzʘ¡qTU3 TU`:D(| DI8?GuW 8~\} j[$mXyxZ^V'}Z^@||}`" 8Z ?AV?.(E|iYc- O+m֢ƴ5P^?.B6Dt>=Z@*GPHG.Ph)Ttp0r??yqp|cgp0 x`P'|Z#< v@Z xI^P ҡ 0Oơ(\su BXIğuM7@Җ!Q10u/C?dTKMbPA0< /?{pz}\h{={4j$%pd BR<P y7nQ0!EʋT"ӳ@@@t`4#`4# ? P+[? @Rb7͆yp0Uޠ:KVG(b`J`U`@@@ˀ4~,zK1EˉG$H73.i@yRɪP^^:áh0%CrWp @`_ c H R,x=T*EG BCyZ?|:Jmy|X *e*}T(<пq/E }_ Ph@ 0!(~vhI2 ǟڡ# }GuH`eM'wAMKGjZd 誉C@ @^?\``0% }P<,* `AĠ= T.  %@P($< 0`& A.xJ`AzCRZ&~%U]}€h0! %|!}Qr`5.(DPARTO I<x j !)۠E.X0 % ax 0Xr`/k:ԘYR* @5]K+z#l8֯x!(S%{3KZJ/ ߽&1U)Q7%@> c*k0eriuc@*\W:}VG{+l/fo 4F4+<.aՑo#BBUxA?N%/-Oj5U! A K I`0ʃ0Jx0>U=|y5 fz 8~_QJ>A8"/5)p`A)OxA P壭 y.WQ+O(aά  ~]T|v^ݙ %z=I?|0Yp@@@t`4#`4# ?h@@@0? ~xP0ߣ2HPpN@b\Լ}0n0 Kb 2 @ EBU/PoxF D\]~~D`;Ժb!}OG `:Bՠ`~*.N =)꼣'Rq J"@qH0@D['& h [bMp]@A = H<4qzA`Ď}T^RmtxXV֠|B8Չv_Z25`T"_XK 'xuV jJ%wѴ{1=*SF`r ` =E:S2z@K%`V^$+w|?d5T!A~@ځ>8(@eߞ\W?jP80 *|?zO6;/RhBT!_lˀgN(^ G |0`G7 890`QߊPՐ WHT~"qsA tA@00@8H澪L$@`@ҏ&E &'i G9i G9@@@ hW?V| `A{,X`8 ^v]2M pBDU+t8"`'iK wM ¨8F@Nb p0-Gul}^4JP0^2o5%zϳ?JA`zUbX0IJuh;^J Q.>+[b4CJU /"*DD@ H`RQ|A(IX^c% At!G&XAݒ,V3*%``<\;99p` 09䄓 | z8鿺y0P |~_ B!+ވ(JP],|P]/)` GX!xKs݃;h(ĪCy*h"h*.lfp eO ́@G> EϨtgE`4}ˊ%P`;AXA<#bB>0!tO@S&, ! \0jz38K0vtuTOMa~0@}9p  yG":$xyAUA|R .v-YwLX^/>AX@AV x9,W@"Tp`.x@0 `U=kW8 ƒRHF`0Y}o8?`pD+Kz 4}.5xPB]y0!~.rESU\ țz @ h.VGf_S1,D=^9dH0@@4 {A.'6A@?0aMB>C4@*M#H(V^z$+EL(t=e/X`m@@@] 0a0# 0a0#` ?h0q XBAشPA~*pB~^e_I>. 8%aBWLZD UC_zf yzjثt0cok< R Ԩ!-W};R",xR'C& ` $BMo0nfH s~_Οu* yHfGg @^ p%]w[Gk`<@<A`lb((bP`~``{Qm!e!PCV<*@(T*<^]R:zB118 X0D 1&Vx _$> BWđ$ X(, `PJ 9uRГUeZ (+(^ʀ=#%x| Aq|0_EޑL?z]}Ł,`AGB}q! I(EP80 %B ?Hxv>)b}=\<p`~DH;C ]m,UpG%MPH8ԊJ"ğ3AV)/|Dp`(A~#{ދ\2B!ɜZ'_G2&yGࢪ5va,=0${07{$Iui@A0J4?>eN*8֪B66c@yBNjm\"ǁ `p?!xK8w?#z)AHP쪂 /QHbw=~<"wD``CU2`.`rqpKKwALo=Qʋ?R .[HQ!hCGи{g)"0a/ C: ҒC0`B !*WjA[/';*Q#K1Ph=Z3:2 #j` E"EdL@@@t`4#`4# ?h@@@~/3N٠~? _+A\  O(H>%A]U둽!0?TWm!%M#/Xd́ > 80% B*G[1` (*^UX$ @ BP ۘ0`y/T\>80. `!İ:`f!(5Ex"jYW cGxTU*XvU$$+../zntd2 T[~x0J*G ďh'u䮠" ~80t x/ީ `@`9ĕ~. ~Gq?XzP0u` CV*@sޱ_}0- ^^v%UJ 0e (W<\`-65( WB.-zfJ*x/U) .`H0BXA `mj=2SU ˂@ O!M 0ĒށƱ$W/j`XVu'AU)|/Hy ` իRzN춂 OˁR *a?!tQߣ2HZ %wЄ%S#I!CDŽ*Nj} 4 @wcFo0v?//T$0I3ʗ=+7ӸRp`9( ՏwK 'P[E@(pWԾt A)J|Xrx|+/T}2 ˁx`Aĥ#_zzFq@8#,%0!Q#?6sAjg4cW"# XHPeIAT$vWS?Vʾ0$T h=3`I;桙rwx(@/JPX>TsYad=$~ĠP٠zU>0`BAy]{IA.Wٸ0Z6/{I`O :{iW8"`[UN3[H/`y1J2c&AI˜00>W==;fxG:A-H@"@ (Ns0uH_  ?x 0{ 0{0.vSo9T=Cg0{}y PuT @@@4)ttepveWwj_/3ۇ"' w,z4\~14ED.W~8=mm:mt/?R R:+y*Q]57ypY9 A Jk04?\˛UjBWwf\[_`Ɂ)z)IEtf';()v&t8Fd @ՁVԘ0MgxB›@;K BxWǪbzqk:@~e? &˥}X+s(f# _;0͔bᙻV3N+Hh}jn`3ah9 GɌ<~=UPL$P gĶFæzٔLLsOOoS鑘I 8_Y[I8ڸ0w};' 6Эt{ӞJ3>1lM.`SPPO;r0eQ)VB%Ng*gjgL}dsI±՗ufxr#UAI4uȌ(b1# uuE\;!LV13rn%Fu6^|?@1EDADj|ciQf7Pu(fG=0~@>~ʯwoZi<)*):^'w;[loX)"Apcw|Spkgsm}AwyMz~!2=Fxpi5I)I U)QOu7|3 @@@Ϝw:=8F"`M qȪAQAS3S6ȋn0SpGCшj"d}S>$>3rjL֢QjoW>:_X\'&UP2'{U&Q&~uOG)WH W$GY|I"eV)3Wp}j$v3} dIѺS'|{##Xksl՗L  qJFzD-lXRJE#3lxϫ]_9xSfgz;,m Um^*d:&tZK7U)0!'I>}Xd2hHa(fc0ZMΘ; <2'>x،:.}&?eGt~?yuVNY˜v:=dWM}^'sSO0aOxFH!XOت/Iu¹ј@Hy:<+4hK*!C6`Sy \&li @@@0Z"H?9FSxuO&lv)IWcBFz 0r7.Tjbv9G!/ӍO <η` ?>S`hpedP*p&;\27p {ѿL 4?|tP)ü?NDzROԼxgMk eL8| ).QAp90Xcxz c?ҵea)= g ok8PJ` ?(f1<:lȟ㞯#LsFôB_T"r`)՞^6)CQx a$x|Q)7: ™_G3  Z芹~nD7STuN8t)^b 'ة& Qږi:b5e~ ?hV&9 _pC5{0(f` ?G,Is>@:+/DS4+!t~`dB ( DhŦGb1 ړ{H9ptiaD쇏lsѵӪ[$ @@@03 @@@0G#Iϟ i;]KU~p3W aA.;{xL;$̫q]ϖdXgOLCЌ) :tG O`kn|)f*3LROyGw5z{KcpgIk  I6Dz- P0`j T]@J%LN{_ࢊwڬ9(@$Bs w ]C07A:`X.>"y?焮=ήJ}0ϴƘE8;ޱ! #rz(xNXJRdn 8e3 @@@!mޚO  ^-S|Lb\'"5'i87Oycn I7T^,M[8œFZ Ruφ` ?V|)YrMLU9Թ|SSr}@(tv]7nj& edjv08@S|]S:% &Z;@*.a<1D5/h!K8x 2J^\s#ޟVEBX)Q}Nʈ2 c|xG/(Uc?+۵Hج +?T#Z@}TqY4CS8Ӑմ>춈x2=(fxfCQҿlvhS4%!P|) (/LO:#n u0SWN`(6<|#iz?uPar\T^C0(f^mr . (xʆid ZSdyj/!U|ÿhҸh ^a˜@8N.Q1DEЦ`LqU( P\0p$^#.|[CqvO$W0Xߪ/@"ݎ9^;J 8f` ?` ?n C" % sI6`L%LRjU4vp}hb##G~Ȝ#cGAL-VUYnprF4/; ebHO}ǟ/e+ˠU/.lSf` ?f` ?,hjfC{DN,fZe^W0|cABry.`"e c7^մ'GMI'ˆW#gR!M&}N w8NN(3Ap(:Ozh~Η,qz!ڀ6t%{7.*S#mؓO8h` ?(f` ?\f`֧ kd42D`wfXq^<|ÊF183#逦Pp~CM*]<$3M]#NttgP ޠG39t F !L|0SU}V H=MXlfU7R5>yσN` ?f` ?l`& d㯜=o8O(+hS8IY.Q;= 0^2R#`)Z?ĵ=Txf]-d@H#YDsٕ(:q2@g8{ϐ. d~'!k_\4 0`*p+zTMj)8Z8wWL+rP303 @@@hԥ<8x-e#NF3|COp6 gK:\H'j_>+=^Ucl#@) ~ +Xg6EY<ǿO1AZ\ +R C``찄ҰB\d""Ԇ3 @@@+Ew;?U_7PtϩL25P~R< @@@}"8^Ws4:y:hqBOP S$U²PC'Py֘ d0`*!QAHQ[:(JɑX7 1Z 83Fod>6x)F+8^5E[ ՈZ>B2a2My;} 44G"$\*n}" i0Splm` "VKC&۪z!D+ n dލbÿ1 g%IF֪l`:VD&?ɏtd +S鉓h(}z <=Ѱ-fgP6 ,?!Mշl Ds]g9*O5FAX uh:HxfSHƣnf@cUuk5Ў">̼ moOJ#6$]dZ]F\>$bF)g)r+4'HgR!axBF @.?E @,R2*0")&",gQI<StTz_ϥvs]{Z4{"SPk xĿ!&{ʉ["p :7o\jxcjt+NJݍ/o[lbZVD`21aYyhb fMH3x p nq?A>@MrUm|ij.-:F3`eq(OѪx8_ݰ1 1S5&`teSP'͙Ebfe<%& ) ;<(fUST#V*.nW`>e`R5qqY7Xl LyaggMYڐ,DW1ՋWOЮ³NZxfA޶M&kv4֛0ؒ?檨u/Hc i9BWW%d jCK$|t5f->S{y @@@0$ v!gO9IP t /lj㞃'-US zU~wQHԿëfsMǾh(q97AMaoLms!ya(Shؓ]cW*LUe2RƓum!A XC!E.K$fM3eY{\fN`)ʤa 6GSّƴdF7w+}]T\WQtjdLhf: T&Җ]OAqLa7xGZq:.Lž^bq 2^n6Dw(8 ~gS& 'IxHF7Uȫ &@Ǔ <-[pd޳)姭V/eQ)G24ˁ /T=Gb=r17A EX|G6 ݴ/ Zj+7;bUc'5)9(fA(a'& %\8ÿƺIv0l)C (HU>_3rtBъ< |0f M `S=6lfÝɝRDbA/4flG3wwOF˃T(A&'3O`\u/~DfXfC2M{iTGn1,WO0n2/Pc ^T838@AOTՃGdC&٪K;ΞzLdwbV?SYM)פּ#<),Vߎ6c^\v育xMe< 91SX. )Y##UBɧ68@(H8O$% C0(fFZTRj3A; |ӭxS=6~`}X1[NNHNמHny2NdFR*P ?zDz›PUZeR7=A}&܂+ڡ™x0ݺXf4:r%ZFthTkvMxmwAZFOH0,N>s9zagÜY<8e3SGdǞm<`*Mk)|yu|2C0j+c'L2j|t`5Ux<(I?* H0֥%' q'g$ LȜF_5+d*49L"D6~gzgP l 86x)?2k}8SI?V;emؑd/& 1>(V/?ALڵ@q~?IðysΣR'x3C#1{V@"2@Ҍ4 | t߃sW|)_G/{T̠q<CL_Clni#EdB4 Su@~r@K)8_]S?Űf{I/ڐ=22xgȧ~2d[:6l'i((cmWO Wecণx}1E kKxWLD: Oj@ a/WH|uS: }HC5t†j{I:/]^6Fi?:j6F??O'<}3Op8cš\ ^D7/ޒ8:lp゙O>Ǎ.P˄T#i9<[N[~8Q`<48B<3GO$07RX㑫 [*6:"uX g /P4k<07@xf_K)~SB\޻[lrhuRQzi%MO eoTp1uKj9`)jCn3~a{l@/gckt)ұ,/, V^,)-= ݞ~S>#|+rD]in:}! 4NoXj dM5?þ\pg1 25._*hCi0"h`8, "|</N8Rf*X0Zӯ 57m8yLz;ňՎOUht4 wMrwa;oAŢw1k̅! /xa[ ӕL_PyIPp? 8Zo2V>QDW!W2U *S(d6qݬ3 @@@kJ橂qnS}놃ɚ$uG{}6mΑ?]3(ҽx<#}V iZ${ `Ap?>}ߦ`<1R)<9bx2# v_ a2&P; 0(fZrNcO=M4L2:D$T2h23?}~[7y:ш8*tf̘ c%#[8Hkc? Hy;HsdeJ nwx;4z*ئ/\  ;WS1Biy|J '>7"WW i'ټ8d3 2E44ʳϨZe d) ™?qdwM9df` ?& g֎4q05ɕgC1AV7J 3+T;h#E}8@QpGT+$oF0IcpD73xf1`HSJ҆> ^q?Wm0\W]S;3PDZ[ Y`.)`ݎ}xf2> (C WI SnytՀT06Å_h/t-\N/w*V>/+G[,*nu>)z_0yTsCX`ܐK") }m5*d jxISE +&bIeKa5bSU 2ণ\ 9_ށ#M]l:߬hy y//Ȗu426u:x)`-Wosd:_΂YW(`AW}jJ|FxbÁLnUU< fDvqAb4t(Z la@=PmZn$hSAE#O:dt"zՏ/4d 1_FB_,^Ԕ:ܤC4yk7Y=J0TɳMQ[gh2%ؠ2VAѡ8у*YOi#\ϱl3(- }&^~dW`E?'6pDdT#2nͩƩ.@7! W">|)M{fZ: xUr. o+Ύ/{X749/C:!L:Q@b3/KϿgt-QNc()F-%WJ`_֎#Q">^\Gaf&lbtȲl`+RWVz^zҕpƲ# cn?~#=.sx;yjnr8USpS/̫]04>#j (J8L#5I a_[:7˰"1 M9+B^SpP`F'/-aM8`KqJhb_@ gBwi9b?OWÂ?2WVY r?patjm|  iέo+ btsI-)™?—+/QDHUH+Œ<'k(%0΅9OsAN3sMN4{`g NfFLKD%꽟e[X0&#%N|Syk( B`!a\k${\ܚF5ioE.>@JN?1A,l)hhMd=|kwT&O ަLw @@@0}ȽFc12_Ky_zkk@_G1_C)^V,U%_8S)M;.#;}ptM0z,YN*ZOB Dv32w'z/ m+RobN4uw͓Q.j@#55)2Kf7(C@wl$ uh iaзo{_Ϣ:&s&|3 @@@¨p}8)9~.EIV?zBH0S0^ _z@q )O_Ƀ/oep`*"W)&xcLfO7 }jڔ`% υ3b\Ɣ`Iŀy T+q?]e\uP(a~#@ ˇTjEJĜ֛zfq?b`fmM*>!j(]WLzp&o߄1Hﲎ pнP(U~LUMA Z=e*P JC;Rq;\z@P̒ @D#0 i`o[{t3 @@@D N%<#7M~Uw8|ғ\=z}]xDxeCtaIz%V[džb!+^0aW}L-|1 5Obpq,UX*5m5Bq@lG{ :% 09_ @@@ڞkF/f03"WF)H@/]f lN^GѡG`w3"7;'3iɆkw4qH>OQt90pѡG0SI'XX02?^0)EʭS4K@ *2U v}ڧ;᪥M8Ç|i\~$q~G3MQBA<Yx}Pqf'aU @@@ڣaflZ>p,M2)@+;0~* ŵ2@+I^ 8P$!d[Rh^1~D_Qx0@+oOQ l½0fNa^VFM ]n/Y0ϮwK֌ eTu V<)l`Y7ߥCؤ3{1| @@@(f` ?c dϲyVF ~xvvG/ CH)(Ŀ e8%y ?R.#_ף o4t) t3M P0?sw*l)bV7BNG)Rb'KOQq{b8HR6T0Aٕu{@D!"N*YquZq03 @@@0m81hG9-RF !0 0}V+ 6mTh^C7=0EJzX!(jR~@?`SsOjAaM~ _$_z4հΞD!™"0D?( (-l+ j-f"xF20 '~ @@@3 @@@0xZLXaY6pR~0[(Z~6p(q_ 2ɎᚸR= C0CxfƼ/ nHS)MF]]WM}[DdV 0 &?Q݄x p_/TR0P#9@f8m_֣M/o^R~_a0eC8^+cL:8)"R27mwυ2j戎('FXX0oA uuZ %^0e'Sg^?_{!UVBC 3 0:; j5\ϒ=M5.297ށ~WG$T naI8Tf牎*tk*!Oϣ3M S;Eéd=XaM+ڪFђquT]l錎ġ}A+υ2uE~n%OMן U N%: ~ua:\3 *6GcodSlx qYy YC[(`pFHaI6Z}Mr/od>nRdC ݾt^,# d\T>;/pwށORƗ\sFK0l) Ę0R瀀̉MD7 8d{zbC?e ~s#sy?Dy,c2t˦]0P8:ݼwl3Ÿhoyq3zLc L0M 3)I8fIi2sI G0 V\//ٌx)jS2 3&I' xKDatu^S'ǀqIYЦ[I=}fg J;ð;V ?걈!|yn۬i% ,K-aF6dIO1W6 { J$ITJ큉 INQ? !B)M) UJ|n `՗dbx~^^I*npSr+Jd$p)G)oaF&yWfLFXk04F_8RzOZ=O*#^}wgrNq2:`1IfJq{`y@?(C%zo8<_.7gG+xVE# @@@6 s{"dz"` ?4`gja;֎Ȩ#6:˸)>$J%yրG<51,)a5g ;ǽ}J)ڵPauLL_?M<)cϦ| U9w@\.龜 `Ճl5L6wʹѯ&/ aקe2-`׼L(fњևJ:оh6@2Ýf)2%Ն eqP>?t^3]里G:c =UI 7p#*_"*窓d, ,LxYhO `RɣNiN*0%D܄.T`z1x.fF @@@ǹ3|)G'2CS`)φtD {pI̺ :>xfd"`GTu񑇓І4%t6koֳ~Ĕb5'I3p땔 a`̃O퍑` ?f` ?jԍiqS0tIǞ5,›A BNtBn"u:rY+q8J¢FJ. 0tRV="l9z@='\^ʊ$xGPR_Y "@BUq? X |$ @@@(f` ?,`u43 |fpTNH2}w`$ut7I!JJ!;\݅ ׇbCX\+ _PZ#|;3|G<_^,c6:+ch8_Ͱj8303 @@@"J4LFӮQ%(3N5՗ 5?)Bq&817:6EG?@^?h,G. Vfj}.:#OndMYI?H(Kհ10)hh8M+q4^]HzxXؠfwtȩX›WfgTAV?4"t08f` ?b@> ɎkCE>ޚ{W8[:x7Ẹ8=9(c f",usnaOPf{K~獾 0)S ufǎ)踛F ¸tc4~DZdxS:}u:3 DChNׅ0~W~xH KgRhe)wMWdk\`<6.^Vkm5㲘>3=wMS iFC>QB6謆Umo%̮@'Fi(+Fxd4xbW šud(aZ>(fCaB|dOH@'Ѫsl` 4<v}>7 }]E1ƭ#S ,4> X_gwJO r?bRsU֒op~o<3 (R8||]U޿>V4ƄF >n "K18dž2|W` ?Z>[="6ad$VmԈ)`ƍ tq{03Z734MX8V6,p3ooV<B5o{0*תhN2EZ"q4~ 0jG;!Qs{/3t8:p͵3jԚ iѠ:5RH_j T|Z @ {Ʀ_ |PϿ 8WuPcf{ ͽMi3V hफ़3;bM @]y3N>SAOj#94iX|f4.j kR;MG™pDþcQNhδyJ(}篛=}^{o` ?f` ?SWOO=G:/70NSC?^"1%]p2?50`)(J@&r;Cox=dk:u^@ǻ#)V$:=,a46MLgMtfl釫77MXģ՗3r @5yuNdC]OAH梪(NG0je8ˇdެANx303 @@@Qd kcM }Pk<6." mȾH+3~ җ+V ՔtKF3>kf<)T:'9U`^rAM/~ah:@`3!0mkB ?΁Ni:AORVtrCEzf"A"/!n&D<`ۻlO; RySFBOKs/S9ɡh5c`T-wuv$qB/x5dJ 2# MM$ &|yC!L)({_PZtģU:Sqb-,2XdL񍥩.tXdeF!%P8s4(;Bh؍8^KDi6ȨzX2D' ϑjP_pJLeGΤyJai|g7GWa|5?`GRPg)\tuM=}W\ /@XuS3|%zh3$NH2x'40z:;a^8Gǀp)/*:O;>3h\_t;&hJ>J|g԰.E* c0Wh{iv-4Hq=N} >qF( /T6-8J 7uli A_E=N2clNDy+pft)9߲̍"] aOP Of|ы% n:CMl V 01،;]Y V2#upFI@hGр)݌x)bxe6-6ႊ0 O^ ?lV a>r&0_)M2hph*8N$mNşf.S;Њ@ 4xUF1`92"#8EgsZQV?=o i~< 1J5 :0 i'f4dS2SmZŸgcJN\SJ3~䄯v#'shM=5ğLJN6~Le {$ m խH)nQCSӆk Nlupf!ɀƹRcglWIV *fڽ2/%jrd<2 7M4cvR|a3dNQB+-$ [7 *,L`3W`8jȥX`_eNJ*V; w`~FywQ=. oL3@z\WV}0/SeS䦋^#pG(8q9޸3(e.  g#li9v;nbÌ9RJNN.tb!<éB:#TSjM 4CI w6u8h+AvtJQ PO&Yl1ޝ&9E|EQy Zx)G8'nI3I>ef5Ҝ 6)}ĔQy:>SƥyQ둧d)^FyX0Q8S!pfT6ttoۨzh)Uf+J=ΦO/:͸ECbsG03 @@@0j7 j(@(q'(sPuaⓃE%MU ^sкE*>!]~o Ws_q DS&d07nWلcݷrv!{W}th8 zeڐ}l[t QߓGVwPsQ΢N' ձ zT`,}Yt*<_t om5zCW(닔0~Ma4)+)`h=qN_DHpcaw6 83C2{ 5-h֫t )<@2Nq/ ,dSqB+ )L vum{mɿĦU>D5" u0茧d{yP:%BjSX2߭M4?K=Uz_=T,_4)|D;?g=+LmWsnb"|3e›jySVCT\\?l0L mwLIxڏ)M'I`))ocqa-*=nɇr (' uzUBjT_[f}GUN}oqocaSgS`xgF Z3>4"_x Zwa񸾮EZf}j$~;n>ϹrmڔKM`(Q:z1@q~6zDMA,yD!|d$gZR`q-z }DԊ CS7ȸ8J]oFQ +iI 3z:mN2uPRp*12v:|)%U [Q Etgj| -TD$a SS\Mn +J:P; >o oZuTʀB(L/TV t 6x!U g`ҡduGqL-ui2@:VylX *sg#_{6(U ^KL>) ",m Ejg4f.wL;IO[G`rf͗k c^EdDґSzѱxSZj)5̆qFĦ NCĿ,h{sA6ʹ߫P)yMRLJ}?$wx )w!pE(SK'›q*@gg%Q*tE+uvO\":|ftdr?, !Z,npfɨT'"#1/޴V^2 o6ҁWxuuo4 y{I;/M&޷pwGlJNv~dGy*XS}D؈#R#_ zpWg`1Pit14OVC|0ڋDd`4`$3/WLё Ԧl/9?03_FRtOqrGb饦ILH1bBQu5δ_2#Ɵga(WfCv,d PU"ah)Bcx QEiMc;}J# D'JTM#Q_l)qB _S%Ɗ O Ηx89 _7r ktE: (%p0%8|)^ ߑh3zX68)P%(#_@ɀE<=Jib.3. eUy&0"yOxV˧m534X:JH TZ\ (>qFo-x zQկ>9u$q}xϩ*,,2ai]>M[-=p?QG2UgW.}tQEw(fC>8˸(ڷ["Np jfc2)}0SBT;W@`u /\-&WU ǀNΌM=HLd:@8vL`x0-IOWaOl0eXqOhU&&dS?2NOW'+?h֏H)t@Qt)V9z~׆` ?LmO0FJ+W^p!lN%?şLsEm~x,[` ?l>-2.Ÿ(xQ]G%lV%axSޠE1hAǭl0D| gr{5z4FDN W1_S A1kNxh8Qd|^0:AsA(FFb|(us-x[ Q`ge Vc憔/ ţ26:!a8Rۿ/lOȐ)@ dp/1oH7.'' Xxf"IG&=IQ40(e. (5 ZqQۏعB \[mgA?hˠ}kOkIpͧޚ:#)[w OߡRX4w<3 wh u!F'^25F-7Pt?8L3 `W8#D"P:;UtD 1`fؙ!!`}vv<) l :XnQTFJǡb/5`8'` ?f` ?82 =sN'HS ~ b8%dFHpxyYp)oڊUE!h!)iG}ź24dGQԃA`jX3 (>,% 0~b; jިWo=ɘ|): *Ar@TReB3B2a/[+eRF<Z]B t"jf,`]9%;% )ػ$#ڕz:!T07~=c(f` ?i_pQ]\E;`QU Ռ+: ~}z "xȈ5q"}Թg:1Z<:tiEE"5BT]jAFy67YDžS'?)}4cU19Ώ*^0ѕe#n>*UI81uU*AF[, pI#ftUac\bRx)E 2}\]ճj1GB9hрWÿ6{ @@@03 # +i)z;ϟ kz\#G d,LL)S C<4!"*(R:Lp=")kӶg>=Dž1 u:elƚ mXśAXg #`iep4 H08Gd%xRZ;TKCZ7W6|#/H~g1j%!r 6صE฿`8_y'N` ?f2ZjN0h8E_6%T>8Zp) GGWFrMM\'!Ntjܝ x* BSa]fQ0`utw(j'wGq^5R=?aHW UژB?aw` zKԍhCp~6yß䇪N: 0Ie}6PMoEhM.Ao:ƞְhM8_[Au$M%`2=uw!4J2Xp`C!q2W-eX)L>lXvqS~> Y"VqQo{Rc\S1L3;))w\mIi݌9kS /XΤ+мu9Zex)THFw$b\3\1X/ќFddd+S8EӁNjU:C@T'p鮓5 r&ƭﴞΟ$H#28]=p"ߞ笓\(1hӃ>R-K KHN .;TL]nҐYL#~pX*Tfmax !fB {w^W3zu8#Y8*g@t8t*SSԿ:Ef)7i;0ð(U%:!`zS,otMEmm$E)y|`:C̰MRb&ʲ炛ΊwTl_oC3vY.(2/NL/@fֵ›9SI7 Y8p4pe [ЈJ9ao ›dw2D3DFG! o@3Y#%qI:BqE '{{Y7?<#Ek5M:~wf}cq{i:F#sr{JpZi64pLI0)//63צq6+S&RjZdicLdylg0`>"&l8#JTig" }Z 4C1[N.1>H4tw+ @NߓX·V)4#\&?ǦƇd X9V9E K SwSc7P #N Qf# i4%R ghu_e+:5 }-T=@̿Ѱ.gFv.:Hdͫzj_ڔؽpI v7Ŕj5洀â5ߡm8'1QqK '5O"fF61<CȂ`E %' &>O"xSo=أ)kb{gTF 0:N{:Di8($)<*;3S^C#4c2o "q e2p +qͩTdBaX&>W#E@iD'ɇVI1{9Z9Dl޾%BPgFO (f482: #& nl=Hn(JA4yc㲅Nf:ibUExvf@i% {vsxL}OwElO6~Fk 4fMJU=ߜUvzP)%}# k=->gȟ @@@.Lz\f@ ;C?8_)Nɸ2xV7Ǐ6D+KJ:q#lA ߭F g\tpapfL}R0%5V]|gW"(:x|Rtf|i_f&`md.cot)xBjAQ:`EZԎҟу0(}vU]dFUB6g89Ǟ @@@(e5D[}g$L f%KF'h'ƤHD;Z#&DGshFi?'I›ezY*+t2L_Q0hh&C(/15܏WArcgն`3l3 @@@DL:J5Mc˫O F4 U&ohv\>B*lK(`QW K:j|*9;*Ƙ >ct )*1;L;0UI@GN%4?8@Xfz03 @@@0a 4ZdfS*Bv7_0ٺ|'slL @} iDpJL’'.v٧br] JddqƓ0sB5{Z-~7RHPDeMy$l~`ElFMMևSq`:AMz4" C0(f` ?u߸(P("8~'9| 27ec̏7x`eǰE` m̟+[⒬y1L O8#byBdPB);0BPKAHS ӞT3]8@l+Ub`o͖1|*QȢ4 W0*Ţ]3Pp'& cS j1|xOSaF[&h[`1a)Ph" 4P32> ˹liT틼^_=j t%`Ԯˈ ceQ~ʄ$Ef/p0ab)ldcVF& ƈBjo6TAvFV 3FhŏiE"7p5G`z/>2"3uI(~ʺ) @'4l\t+bf 9HPlGki)\⪿hW#f< կ'tƧI) [$X695q LXPLzVǍr?oyF->:H@ =ph"9XI$iZ9E.8s#ml}!jijuqrJ@7u?&c_4f_8++DaT sr+o pnKv:=Lz5V)WM){K+&șfC+񑂥^{A0s 'Z!u׽.aFln(!%8"j}EVeyZJy )w:˺@IL7CS4O goJ2?P),-~8]]SQ =I& M TU 0]ՑyޮɺB6!ݹA= H4>XN L3(f*<?RFf qwlO 'R2LX8 wtuїl?P)I/X^Ω6m ^Rc:1#BF"AŕtīruxSj]lH>Ik /1xLH<)'8h+NRH^FP2Qb QR q6-QuF{6L2qD;-|y0Z1 t @@@ E!HRBJ]3 k "]ߒ?TvcV\2Fna06`)|d؎d"y0M&cZN20&FugŽqj|5Va]p^#{_rgsGeB`,ũ(VԷUpE6x|"> Zvk0 y6 '"qp 74!` ɚG_ >qժKt]L⿦Xm9m~UFX2 ~ZHO~W*jm‚Q\?U.nb0;6C *#`F"FH#mz:3T?rW﵊"p^1к]i6W.MNT2-dᇈ N`yt _NEܾIhi(f!Oڼe`"a m{:<|U~aHsL LFJ !qSvG!x5%'y# pOoCXSJ|wzG}d') hƯ:wRR6/ Ro] W T0|2!C2apSw$ Zrqs9([)Å!&&K9IOHAXyS~y8f›;=^`T\֛lG:xfN u-mr{m thT pQb 0wI+ν 'd2)%CT= Gp`2.nn6XҍUmȠ0]ߵ&ak[U$ @@@(e5BAt7 byɼp FG &1k`g4yv2xTx:\dNpfhf{~  03RV &iFx 5x%rFI`^)SA׺oDbѨ0B0~dא C0ټ8` ?4ǁS(M S;jka8y\T vZV2 `lo*z 5㧴p/UAK+/U&'ҳ3ؙ:/.&X$7ӁIk|{UR#M*aӿ̌Y7Pmq Rlj89(f` ?=+цB.}'%S82sF yq'_ȆsKLDT/ Gc ^NF909ʋ³] GiIdm'8`*"mHFkEKcvaMS3a `0a#f` ?^{J|~`횢Y4ч:;AIHu{.0}>Tp` ͉?"k{LD8}&tj,[=cUEN5ŕL`}#O.8*qF< CR-W"z03 @@@R}8 gW$>p]7SB.xS]WQ2rmEDlX-i2!-ruK Fb ߢFpnǿTQ`y>tfW;#$(YRQKƴC::DL3X./Diqz)SnQ8dth3ME3(2R7h4P,HYƣ1#|T X:W탌:C0:2}Ԝ/ ~7D# /fa)*|dO6~iD>յB՘eED6;" Bc#4 i`FQ·Qo2(MaxZ5aQ]&0`iced䷳Fmid> ᠣFͷۼT[-PRKB¡0Q?/W};*YM> 64˷GcsDmPvŠLy(xA܀Á5fc(JBw%b_?rmH ׅ(Z7:H[RL2D#l==.p[C)s7%KfȂ .u ~߁M [A`?{Jǟ!6xR]qz6ӂz;>)"J%i}LЂ ٕU;XƖt+ԏhgaC .ME{^SUA3%m)R`.MjBf/(fm0&1Ƕ9\T!y%'*GApu&2N<[q? TE7f#H.3C3r^"lGW}hj3 ZY FtTD?pAB w<X?Ѩ$`*Wǽ`)!W25igV\ڌqf+rra;Ooy ik}{d|o$O05L3 0}u](ΟMY? cPi)-6SA3{ T^jnM!({-> @@@H+ Dz@f3do/9 L{&aɅYdtkᙀUwj_?s $#Aϩ7˅O6$Φ]4E}03{D>#ދ228(f1Ayє%ϒ"dNFEVp2hNW޴kŢx6``3w>Qjߜ%8C7cM;>3=鿭9M2PUDpȁM98`D9.|@G05V#%2Ӷ` ?T8v^KBW F|ilU si Rh)lF҈L ?gp,R\dd; tX63ڢpS?*a'F`wFx2 i46"6B/I Em8hB쁵"$ i~yZ,=` ?f` ?gqJpX"MTP|F6!? Qʹ L8F.4#VG K P֥_xa E :x),̹_RاyA![Y0SI ;L! "# UEkjgf߂S @-(f` ?=5LPo:̞OqOA(ce} 9ЕF$rJ/@)ER6_়_b69( }uJ$VsA0k? /f%'iRIA3{% D[ъ&giJj*#A3 @@@0b*|sQѪ6xSO<>wJQq"-T15kzp ^0qP|! NyJ.``EÓaLvyTg˃%`Q?Q? AF1WL0$(N X8eC58; W&Sⷂ3W=p#QB'R- x#B` ?f3H1m3M.g GM8W) j?j7)/PbmSOrWj"YBVjYB@E.$lN sY֐"24#dSmF-o9pS\/MS7O<#;<Dxj'|?BsXiم,"Gw=n)_}`䏿r6F Ʉ=`|67t&:ɂd/$JѨC^ (|y>#&}N+&r7t"F/Fʉ[kg }޶bT-C%N d3# erg"Qu \M|1&r'Fi{p+z1X}%`*c!0oHG> EC=hPqO/CLaWXep¿Gts`y RaNx//Bt=Ǖ'\>Ç殬г *ܢ71rMvnY$RY1O$DM2g+U3p_!pJ%m(v5Rt8@TUY?J>6mxL+Ʉ?w d8he5>fsRͻ͈9BD]?uRAs/rďxltE> @4u(P0 f8[׎^;8p~eS)i%zx[m:Tgb4PҍI>"`8)ƺ|)5,41*}Qxj4tDʷy0*d{',:doS F(Z$]3C0}l3Nf$0^4q)|D`Zᚱ*JZ!5MuAW7; )SljqQ*Wk#"$F K,+2)PC|u\hNɞ(f` ?( TSE@0؜!QӴt' NNSxf"!"xC j@f#00lXr$ /hHŨyb6z{a␦G!*NaЌ0+LfX/[[ԐL`F Х; @@@03 &mMhZ*Mi@)}~LrJ{q~Bn(cǜ SwrƬKCAShK؃(i1{c<'o)֑F V3@`C]rh,2T)s5b# n!|0kTwH=܍ ?ZaXTe8d{ @@@03_$d4lVhj3d"C7і-gNz%)ՠl ,=-`Y#o@D9s)Κ:q8`JME~xhu*2Ka+٧ 9_R]rƠ0dF{8=wuwY{ @iyȂFOfviLaezDaN X=?X5#S\g>%E|uÏx@~U'Sew 6#X\z݉*7d<ċm?(f^5ϰ/Rt <RNm@ gd,v51D}OP ޛX>FZ2֓SzR0~.,9>!^#! h :`CB7MXZщ2ȆFl1';`q Vl@tt)ONz5o"htղ0OU8:R9U@WB툘Q v[Pà*y}4:jK_HvM_ѐ\B;%~2CIhbfŴ2TDi\&>f!JzF9msFe]* 6$o @0`1H+Y:)&$yB=#YutdHP S<\>"V%P3l2<c2« sz{Fqbi qc8WCaE߼&!ym`U eR+Zh\A墱wki+LaLƛ8u#.9קNBᨍei=ӹoB)-;` ?*di ZT'm_ooKQ7,ڢhoxQ?緬Ș~L,k};gLDҏ,K?ыcjY&p!Tp5@^`TaMz }r4B&ǥA j=e ouqݧ"u|m~<1>>)R<|+?_9\]36@bTjɆd8 #B2Q &ȕ n;h?(f+Db+}#ҮM(Wr4 )yfu\; "<,25^࿆aʗ=6 |)a\W6_ ّXSQʈ[?U>=iUtbg#‘h,78-EDͅ3 ^ 9Eeء"N{K0 xdOvx3lP#uzk{#ꯒoHSc6<xQg2.Z#8eN6N.ҙr qD#J<83!Fmr?o><Ѝ30G$M%̓8E!܆ S=$p(":_(:?(<EߟOsjpwO.FSeyU4 d"1q @@@6ɰ+Oz46\2ÜTf?q?Qa+')$T^V!יU3 y@ܝq;nv+o( ; \H;8eц` ?f` ?V7dq#T`BѶ2>0͠CX *0l#yFEr4`~&$ Ǭix0P{b`/ard#j'63>#K4FE3\ᑏde$(f` ? `UsW R]*4/RGu\1c3FN B&Q* 9јoD`q8d4# )5U%Ȇt[orKg!_ Ϙi3ɶy1V %M\9`ҶmfyNyA7 @@@03+;)Z +GBKIfCp~=T^h"44F jDi4`)TypALona/Z;zȖ43q쵝4a]X -XM23FH/)Oy 5$<γp>2`-t;USV&&#R1OHj*<\AkwI۷f` ?-l'7qoן iiSG2Lu)kx _!DzﱑސwD~VH³:irlB)MZl6QJpJ/Q\g.u'ZW|١jbQ%& DQq7OJXn`q{Y}P7p6#xTK?0SV?zۘ1)TXc&yT=xflZ7QU4x*UK˅BdM]@ÚEGz$ aHKVz5%!#`0`gt# {KpF B&z:W}@(lg08[mU=0(Kճp}Rkb!9,Mo&2 ~O'85]Ҡ5“#%/1^.H} tGXSSF5J`p(4wv:jyҪ11JAKQ Tr OaLAX\#Sҟ~-k͌y_0 "a%W6ɩ9wL? )Q9ly!:r@*v2+Hρxb>U(!fH az]TU0Qr\?4hgC~z6"|6tg{tfʼL >u5U#!w886fP+TV+jLD%֬XiJy58حc54LJv+3B6"bzx+2u2NfПO2 3h]8S ӂda8Z'Ty[MX$-+ {Xpt`QZ!g~#|?|l/U=R.T$N\B``:AZt湚J) 8rPȈ*ɛJJ}$5csAg7a;&Q3r  _ױrT>SbuDq~f~E`XOUfAo8 Wbh`lk! j )*:ʝ oao0 aw.t| O<) R:Aμ)=_8Ԟ+< .|)b푏r7z+OtF9_ʓ)FGH&!Sv3LutG4QalZ\?`xkQ'Dn#0@ا`*,ᐧkh1!@p*bj\B4E";f7PAui>SBnj"GN`HV"48 hGIPH-! cwFjb HVP(oUXN} (8Opw{ @@@ T+LBs?ᠧJY3Q0f?.poG0IGsY62*۶2[wœHz ˜R"_JNt99VutEc^8;Ӂ F_d'x mLkn5,15;h00&oEz5T+pH#߱ 6 { Q|6" B/w\;3T2mo(fXsJgw73:!8 P{J'jkSL=#ϊ}یRxƧ+M?4+k@)qt1F*N[WGeGU GWRq)PJdFb(NC~0äֶF]9ʧ5gL<|`'cWM)&Y"|6H4“wi^WGXb\Fj-۩N\nL/+F`RU@japtZj2# !rd8yOvf1.|Fg[FeIRQBd"vM^^}Y:牘Pɜuă!th +v ejR.l"5 jqvAFύ ML iwGLaȫǮҏ((f3Dطԑkƪ&9k4|p,4iT/ǽ5ɬ %'hq'YxˆWzg1I./{<[-GxAj D|0 4kRIpvo 0aa#BhG`<̪=h:hMsD+@1)\I 0dީƚPVU͇*ao8h)%yejѓy,PgtH~6PW *q@=yP0`H暐š~H#(`3dŤAMvnt:)Pyp8Βi^Fv9"k:XZs8w ꀷo[~8DkYE.(f` ?'" d~Wd@*3G]1 d/xXB2!d1Rn))Jrz00^SmDw0Cw.2&?UDzm_qB0jd)"a3'xS*I\AaTuW?, XbyM (vaRBBfiN3 @@@0jxC©  i*'oWf\EH52& n [Z/xZI`4ՑF uk>m*v4?U(9Ld[ NψRa)?Eȏy(&,(/So$WnD1h)>ETQyj/|\N~` ?f5t0'>2ewO qوɸ Hc$r}H{n5IB>~ D!k5} &١m3(C:bFWH_iIi!L*ɸy`6^)ne*dZ)MJsNRiI7V|N:6YN_{ -6X§ ^H+#6֎&QC <3 Oy DwU&g` k$;7TXꌠ dθ@`98(Jw0_rw@}8"Ux6>Cڲ"+d|)$i8ECȬ~_>VfCT_.[#>#** ]xxpGmV^9~6.ϱ!Hyc i I۳ I˾!#kΜh7pB֮)F.A3،)t xLvy/Z#&r${j4,3悘Xє 83d(>5LO\^#8 > ̡ yxG3xPcN3"xa7T#9}z(#JU$@l`J"IRC2eJa xS'L6<W}4܃)DVqQ  v>#Hw<@ga%"x|%l2G cEC6ꯎX/Hb?SՂq,3+e{GL\KP"7Ī.C0v3r gXQ/Z % mH.(~` $~@OpĈd}L~AL+ ?oA2Aͼd#7DtqCP ~Ύ 57A f]*yO ꯥT&QLM9G"r@*UO~)& b0#q@NjO'?4Ո2jM8~ ixy#߶Ar #M} apsj)74x 0ŭAްɔc2:p9Abp/U[WW >2'Hhʷh;SJF0daLE8֡XD0O )}&sp7a8@mƾ%P֦1 x ~)ד/@!xf2t/ OU)2s9>ht`VĂ`X1$bJ ƣ\>h񑑧6 콵r~'޸C4Ĥ (/P<%6Sec2wmGUw[0A \;\D)*|#iOQo&A dkM'/bAd6g4$k29Ӕ؆b ^iO<3(f3w^j4 8 q͵D|0`5 RT f`'7"c6- NBy\zD32QD. L>nzgޡ37Dr R)K؊F ]2/.iTp1zVǫx3#䃑zS^/Y2_] Q,m&,"8S:UD _qWH1?i⑕PO^uPvɾf2#HgT@A奔Rhjx* @(g_V@#Zlf` ?#xΕQ's߮ϴ[S,vdb%{-5tH;hE`,;AL)/rnyԃE,#t0-*B,I6uq[h#6xi͈h RpW+Ŏ& m)oOuN# /O'aMđjp\a:@ G d(Z}` ?(fnSpt33`(S`SV{G@HK8?oFQ6yI8S_4ث=QM6/A+Gp8χ c('h/SsaJ;?xD !ը/5PhDb8yMUT#1X:pz [QPd$!Rx)~s??E`^aVh>3Ng`QOe 3 >|sOBν:;SVB].i%!hBiv`O&L|FmOHSċ~+UW$`/1!Q=P#"LPX n|ǫdo(fv)4S>OLNBg Vg,U<}wnzJפ)fo=q?'=# 5(| v`BTaLA*{U@KVc>tiZPhf:J2'fr3z]-$GلJ)k8OB#PVάMQPpP(NylM* " f:|`0̄W ?43ZqAblhR#¤僢3u w!6I|zNf` ?f"xͻ({qNi%W:1ͤl!K!h[`dm<pO!%貵c *!PZn]pKތ@^b~ü>u0#>b#%UOSՋMk NO^d(Bkh)Ck)"Xt; 9ALEàpX(f` ?fƀgT\OC0qѓսpSot^H՗hS/%#Bf- UcDd@ҢpMTT&/+(~׏F!Xki ק7wS`9* EtgD@)f< .4ѩ8Q t궀ߣ4pݳ|`bR6? GYr~=N3 @@@0*n0˽:'? I@%AIx3ct=F\#E(O07wr'Cl{m)ԢWzHXl+8[Rʙ{f{I^DKU~nmHB..hJE{ /6]sOxSLivp!>/mb3 @@@0om @0u3lS"(nq5;Ď4FYb-P@5l0ڌ` a*s$D+$[ʇdԈ)Y}0Ħ šp_;#jB)dZN=6; 2C:ptV?k;.SšNiyTPO3%ٱu!PVu<頰)>5dC8c<;BmWU6 Uy)x7{&HiaI_(xChWPf&-,j;5Ee.|! <_aHCq?\xA|f,f(FM"@oEwZ11Nkc8RP*ua ezEՔ0tv cs%TͥsMwM^hEhTB<&fL]>;˜wjcbV`Xw%ipS]ʭKL+C0?\<#4!vx7,`fTFocVoH @•6#n"`)Vp!T<Ƅ᛫Xab9܇jMt P{dI>N =hQ|Gy*C |FhhmyN'L/!)ޮ#0(%f(6sE&e6O:=1'_sHUq ]N9~B 3ҊȀAPҌ KMdXO+*Fo6kCA{doWg! d}`GNk@G:Tw ݂:@q?~_n>/.1 Sy=r˓C0HODP!c@&Y{OZ`ʔeIL?V2p,!3"  @@@kdqz$dfҞAۇaܴϪJ%ɶ2+z)E$I@ γhžv6$)R3lSѤg/:ǗEJKۀp¨:rP$|3&SDԖWT荠>FV:A ރ0M&̐QJQ ̕VDUٍa(AM~UWhRN Sk~ pf!P‚ؤON{k4=c&#?% )? {Ujl_PO GH\b~}_Tv/0 >Z:Psm`8_ؔG(-'xS @Sw@Ƌh=}~ި Fk :Qh NBy4& G\ƐRpoyth7{'#h:7kDB A!8TaFq:Vdf9H:ূ]|{') 2Cup6hL' @@@eѠ6E"zhV#Z_1GU(HO1 xl,-3YʋF(Ddm%>7+ˤvQyC>֢=΍n}0f0RrePVb)UfJ|AMFm+$8b"@v LRKСL<]1j/}J1SKR ktZ͆+ڒ%OQf` ?=JL^ bmIB'E_^ۘ;yu0ș=h{) I":Όab4}KXлm]Td=0k!8S*m!E'%U"ea{.,DD/zkPr֊"HD), w'є23נ6G LڎG~ "c:xS LȤ_|0XEpB4[=$ b8)+Wd 1A# @@@(f4wrX_C/Bt^_G0~2J _f|;8)ODBcg#ÇޞTձE("i.•X,:N1>"䚠_* LJZV:O ¾BhGC'Y :<>LOh8_%[U}/<(!yʾ^Ts‰n Ia(0N4J0'-j_K $'P?}<8(.5鰤iLP3U8"# a(h̙a|?¬}< غxV9_ 1J=̙S|^J|ED_-&zvKʯs ItߎƂhfgj{Ӫꬬ\q0S @s{Umڠ;2ˎnNߓ(fw$&=^O;d.VfᐯO*M(pHP‹7)4wwX!GoЧH=42Z;zZN i,CCɖ|4N4ˉN|*>3?`VaSCۯG]h+SG=!` ?f1wDž|,|Qk@-JQ 0v'›^'})!5ӼPH  ST=ޤ9GP:Md2{f2ceӍLbEF~ڭ M=pƆsALmHHRWLV5?@;eyUܧEb2x~ y%3& jrN @@@036Cbp$z r0fVnF#`Ww|n)S:psH:ZvYX&'|c - r;5{#%\r:h8_H8γ2x8JC M)4 Q{Tx` W@Er P?-ݒvP*&PtFx#$#YKMl` i7FLw|r0jVRqa3(&eeAk!ু<2iY PFPk,/ kEduU0՝/ؼhdkJSM pLuu?4q„[]SoTXSMU*$}B+ 呌h))p%mV:0SO {Y$ O<k*OVс[CBu~#L 1C)l)/.U 0j`}tw~iƅ A;^7٬ BĠ`/  [ (VOOcywp0L9_#sMlkT?8"1 0Pg}DQ:ael@@sI '2<) XњbTa<R ʋUPXViЧ \ʴw+$~>8Ԣ/DLԻ4@5x<:5.do!mHXk}Ys?t!GBqW8vxPRm d|H.ѯA# ~T#qs;~FI}QHdjI2^R|c@ڋƏt^ 4ՈH+K ,Gwp{ @@@jƔ۫p<:_7S".S=2}O ߁wh,IO hlX XOM&87bjKQဥNGQ?Rŧ1(+`SQW4!ް1f([#{x~\<Qs˜nt>rWg0ƴXQ m;r ے0κWX$7tKXPzc5 S%0v'we?ɼ$ Ÿa98S %˙ a4(SmP%6VrĿì!R;H/+3[-*5q@ޒ,Hυ2| <~KOuEi?^FY@W*3b UU!rP5:x)|4D2ُtšJI4 @@@)F"00)ҖO6: IVԄ=R;By׈JˋeH4P)K Jf5q(?N3x՛:0 .K+R&(?c]PLʫh!ׇ~!qizQ~gu(yBE}VQ*`[ DgG49Esy]Yjr*n/( }l$컍xE!)+h닚cV0s*ۜHmq }sŸT6Ogzg")kn n9ƕ@bù;G^fU1h#6Q,xTK|, %8Do[¸xc֗t ;w 4V+x`)_p7PZN(d7H0IC }$ i@5ꓽ>G8#A%` ?f; ASHJvhV1UwX9E:H1b `֛~mOop(fߝ &$% {|?r"hS!YǨT28xL>To*f!M>dcV*Rڏ8@MaR0a28:f#>ۛ{k/ h3paw]W*4  !6B(K^]rE .)=pfO/ sJF_EYp.Ln'tuD.bJZT_:Ʊ٥ߙ4bb ?RaMU82ăb-5^A^B_pq]<}sM1=lL03Y N=nFt(T`qK&E#10> hi(L>DDIU|PBlh%HuTEcm@NL6"AӨ8h;rp7]D?Ou a(3S9/*/wH1aJZ3lZN>FؾF8_Yw@`wxh\0RSXf1'j@A04f ^iIN2Ha:O)g(6g p0!T=IԜa pwFKB:,4W!cSsRV\?TH"f<)s};T_2Ȟb5%2 񣪯EBp9n =9%1-dԒ:8Mrwѥ&(f wy1?3Ɲn5dO#vd}D/G+Tyᙆ(πuVca݇m߶0OV4M)Mp:wL Ŭpr?C![N/hCO# q T_㠰I%0MNFg1q) u4'Ў:Q=X/Eͮ0)pi"%gz_^ p72LжMj3HN,:>F[>5O @@@Y)~6vAM_gDx:,x'8(Be5Ccl;|g Ph*H_̖ѹ?3v2gvtw7XT/ mpS y)%De'h(ʗ'45:LS Նqo@"zU5X=CX,pS5Lꔂ>e} 'yr*_2V5],+Ra(f` ?f‰vy3)Su7RXH1+ u4ÿa}?T~ˁLF:4<-Ls0c[bR=20Hab+}u;GCXgoɚr(6\>R 5 Dh;V /90)Cc:͔@˹=R}a2?UL">uJ_2ꅡc#R`)y*9ʷ9AT іHûb?|;.o*\Sf} lb)%pR5/95[LšS&*tp> )(/l2t+#?=3R:uG&g.,`#~`z&ɿh\=Rg8PS0mXM~GL #%Ԯ'@r89` ?f!Jh]L2rf\YT{/51EJ yeT;[gk#U-M #}fpv.zk%!la Q6Ά&! oU~3HRa(Ň2X5oGJ=ԇ B7l"6tbmiNǸ ޴W{Q[c|i3n 60_1.a Gj4$ޛd/74>Dc5,[J *͙)2eRk1 pQC3F ՁĠ(J3lD tFS'E\Pt)|h0,Gһu%%BF13+)4`5"1SQ﯇M <=(ZW6LXNӨ3G _/ʻBF.C:zqYRw Wkx& tOΎLR 8}PhMfƥ_V\B܀oYd}U題31$:Y&V^JJqW:w#\h''Xi)- @@@žqIChgGr8x 6$y2:`rd tK,(&Qkdl°q?^`^9a,]b2rL"H2m2| "9tBp3⇅4ǺT!:4~GZJH)(?:v1aSiwD6&#_~ST>2 iͤw*s RO{Mꇛ(™R=+wc;XVF8 NjY%T@TwJK0رCWSh*ff(f{c\sp@{<ŠI+|+81X]`=?CWD^ANJ N*$^¡{Ÿ[N6_C. "=6У)AO_V@oz/?"81~+Ti\mڜk"NbE㩴թ=BEJ5hFXt pfS&>%2T7V2xdf` ?C4h 5^41V,{FU<xcC)A>&@opW[t3v&'pY` ?fC!IpWH<!v7/_Ĥ{P:T _{ I+.˻DAfzpS%Y3?ӫ/~n">%+SDQIдVEM$y&2;\X:!Z@d>6lr4>3 4?MG7 P/pP$*gBl?`s*+|~+9LI_.2bWJ?-zs LJFբ1Pef(fх8RhN\l:0L.f|)l&0H7g>#?zLŇP)C+a;+_%#sIE.䦔$'C10`s0N}6FM%Rѥ0S櫽84@vDjmSq@+2F|305:ibid4vFc 7bRrcgDž:q(ZP0D' #EpvZ`3RRLmCj u?RJTul V5#a.aG =c;yCΟHl3Dɏ!vƲI`{z18 b aR95}(X8F! f` ?sƁ:B6 :0jth% x㦵r XV'P pb\hf͘ xMo}9PjՒ`h;Oq4(C\~kFS,8Q!tN4t{G`Y}QN!S VhA"P#]n(f` ?f!)^JSwǣQa{c1-+š}&{OIJbI&8h  Fi C:YդZ |Ed]!`) l'8_ʳ$4ehdzVN {:\0D bg5žqv<f` ?R[GCaz"GKq@᣻ u? dd2"DV3HtE"б"khf3lRCU qO>4kFi7F?QTILZ/– a@xE$#=L%Ŀ t9=̢fwzLR\q`Kd':ښ @@@3 @@@0FppPS=MHgG]pigpSf:Xr{/t 莯P;Yk"gޒ#'0ǪfC'rJ2{*U_Da^y Fdj5Qv$ K ێp_0xxb}!fb.SӘuYełWzx~ F)j\F8|MN>2c#[  @@@ wl9ۃS1"ͷxO0IC5MX3WH 1 SZU¡03HnkIӎ>.! DiPʍݛb``{đKPNJ5 ls  j M&_5 4&d i^}JyrX*!AFBOe~PD"3;YO( Z;532 z-9+#%k`ezxJ3'4r~)L33M5YXHTZC 8:*dw%7=` ?(#0()wCrJ*hɜdS"ƀ./UT73G tx\qBo'41;cO9bKUolT[N-seaVVŀ}"'"0H[r5~1HC!4pψՈ5+'2||JTJ\_d:0X- Jꯥ/וVR];I$ @@@03 @@@˜xg-$cµJ@yHa zpL :x^6$sJj}IzL XtfH:1xY0;3ŸZ;I_tP!W?P7@] Z42A~,H=$FbJ` ?3XoDxLDjNB%0t"uHt)' K+b#WH㍂Eq9ɽ0}B[x-4V JaxP9ьsGapQ$ D.SĚ}m HnL)Fh؍/j9w'k \W:l3 @@@(f7E@ij*">0ȍĦsw7Oy u\zB*L>|_ߖR$0qA,hoy >כ**YI|# j,\P$mu  -lbsᒨGzsd ;>Z.%WcB1YΌLSSyc|GP@ iMևHHTZ=L>h{=F.RdkVx3 @@@bpcm y.dh6W"&GFgɖLisv70ZqIN;[-dxw4ԝW*{Hh)X/i( n8@~)rrxO:tpD4!%Yϫ} ryO Dqpp9yq OLxGH {y2"0Cq?ZlN%(jo.{HO` ?w23ǝь.[4fF  ">N.υ&4Rê B>Lk4>s½b[ \JQ໺pv dDSM@8ڎ47R `rv2L>2aL8ǀ2qs; RzCX̜ a|XeQp0w:&BeLu\, c%Tt9*鰦 dFɔ^Qۄ2|?03 >D䤉8Kc:ϟS4@tȼ4&w GFɛ"t 8_b `U:4çB6 A/ W:Eo;x̿Guz#Ӯ:M]o @@@➀@S[>M1@Ip/ӧ'G&&"2(n1zw!' !;kR&݀xSC(cqe>Sq7)=2xGBV1Necy>/\!BbE'~(f<;w GwIUXZz Ʃ u"MÝ9D}ȷM `v dW ό!(WiMN/?UZ&q&9MSRw{`gw\=- 30gO 5DN!q:sy͌56opϣ~=w_dWR2F@Ot`! 󩘮Hd.GT74<\o3EH303 @@@ۂ4O 6{Z@ɧ0:Nz/2̈ֆi  EK=QqR™"iKcj0nUio v;B&~,#2Oy' uU|b9.pѓ'GӺ6pq0(f` ?fωC9~|eHeZ ]vF@_8J~4= { U0#X#x:PMS E0mN*U9O2;X`Hc0[ }X` ?3apiSOF[ URԧH=Lz}9bȹjNxv;ĕ>ƌjO!Mw* 0vNb(wþM8+X)궱`=gߍ8QlL"ѽtxiMwq?}G xgLz&8#) VWtV#%&x O;.%Ecg!M:jу&\` ?+IFSN:i)Y=99S)4:J0 v@5mj @8d Ne4. 84UlF#2P/✞mX%1M8!ʠFCf` ?Uv%bS4}w*T"%C>'&EL i˼*£-LnuLpJr{?'o#&RբH, aRFPqSu/Gj҃)NO猺rk(RIQ}2p {!JN"f^` ? @@@Ʀ:= 3QED/o)ʼ[U&g~T?8HL,lz-n <%Eo$-r9@Nj7c:Sy0.r\{8)PgV:@{k5@FMQ- $8j-Ld08Ju< af(f& \$_TNO͟/dE+_klI힊o# d̵;G:l*GlrSMB߰J?4 LF _ߘ)Lj󒑏;EjT١XdсPS U@+exp)c#nxWLz~ 0nD`J %`9ALxrը'j;0“4~kϩ$4gWLc(30pZ4]Oߵ# &FD#%#5vLq EH4HrmSK^xE@{.zô?`f.'^.D &`u рЎc/2cTgOO0B":ʱƁ)@1)9 $)0S]>lDM$y6QXTFdNq8'j<ox"{0 @@@sAj/Z!N5ƞv@p(|bQwTX.p<=@tDM}lLíy90.P3WqDj0N`L~ᶍbExG&YT'0vldB~v9M/RLc~7kFt:pfsՇvP1S= @@@0(fud 2b"=(e8E3IM>T@O~4p#GnxQ(J;ѹNr13c1wR%#I dv (H 02z@:@-1<=pS D=~~ f:wmɖ4@]' PFB@V@4a@ hqB#Gn!jwF<"£05<$"`O̓?z5 ,4F޲ds:M%3Iw@Dl^J:;! &F|8@UѠQJWkc9C.n !+vb`*rg(f'<}ڎPOSXb!k8'mR}i8xL"_$^`iF2IF5~ƁoV2gδš%;5sC!sKlϛ..hDdb.qDj@iU<SUOTN|30vX~jυƃ avΊ›i+}g4e+1qWTdvd'OsZ J O#~p pCQU BDi H303 @@@SBSHs_0?пRّ5l &%;@)HHA"><,(D'\3$~4DKw3%h DRjQy{l*N@[}f[o3`S255LEqOHJ0 >2&HHD(f` ?fF퓂E/I,7"Bp";,Z0DXO d_F u5}[r5һo\ Såz&=% ^G4f⣄\PΆMsO+" *Zbjf:AQ)'᭝f 0+BKtGMHSΜ[eHS};⦴k'=r[˕0RǪEG3\7ONOvsVMzyG.s{@s<6bg1bW)"+f"|N^> Ů @@@03 @@@ֻ ^ѪpAu h3b f~DžMW@$y U3 YɈ8X.EJ/USv ?xY(wS$#PHd=d)L|1y|L|@|B/'fDOj `q@n{ó]a` ? @@@ݠg }U_E0S +ψDxy%_@ t Ž`\ ߵJIcdNN㪏 1#Ɇӏ >=f'baAM%A9pNnKFhT30O ILG.R>RӀ`=,Rajh)ڄMIwvAJphZtrL)Rd781ntW(%SX;+3i}k&t8AfNs=2GZ )DbD+wp3DɱEZ;$DD?.)1C?zt ›0+?ϓF3I* P=3:_Ap+ʥ)aDߠe#GwTJDz Llh:qZ?L~@bm p|HR3` ?fN6T</HOu 9M 3JB}$.t?L$6a 3F@.dx:L$(ם\?4c\J1w{m(F;IN d!s]/0>1B Hbr(9@g䉈L3 @@@(f& $-u# Uր0wz_>?& yʦ#L9ֹ?@5βns'#C6`ځx#`g] ;7I(fyўu8#§?j̼LY\1Чr=;^>;&}8`,ny99Ov0~wdW VG}2ôuRVgyxE$P4;db>'O Ά` ?f.OcoG%RPpWm'p<C8@M\&S& KR: i}{B<S.I^Ld.ب ćɆe0<^I0KlDR0p03 @@@03 DZD#͞T\ZLrt)ƍV Ru, !4Nb} ϴqo{ZBt)!E~6p #)%'3d2dGcLY_Ռ;l0Fk 0+o,/=` ?f` ?ƹN xvZɱ4OXT'OuFY֌ ތC :5ڜInAUOvҘ wr 7GF}K$'i gxS860h_>pyZ+ d+PoÊ|}? R2bCM#!|3r.;g+(8MfjGFZ>>B>` ?A\٣H,{s=߁#uL2>mkMtp"gמ G ?|gpS A!!]"^ ~UjYHA/6*=xS)T6ה{镠VY gDbzq]ldaqVhV(yGm;q6e!Xv0` ?xR߀PdǾ O zıL2|fuS qIZFx0pxPii9`(oj]3`te)T(mCQ"zhz5'>ӆm"lȎP5_SHG-"$ i Ⱦ>Y@; Z GǰGDPám8*uI=` ?!f+퍁r'ӁM1ړ9 Z"jA*ǿiNJgc3`B>%AE~>S cMJ'%29x~υ̫ hxS*8R| Pr !WtX7 ºNtS )w$VrCֺ m {dtt`(t>}[DT):) ;.e 9N)0S(t !?7=W` ?!f` ?fÉWu\=ϘU5WA s"֏ (˜ r\{+_T.^GqcZH||u<1 gxQ5 P$/l0)@ 1 DBBaҕKRN%BMLL` ? @@@04;r K}4˷YD+ g#)lIh#0%Jr:*MYYbeRP|%0??UQ 5 f2} c/82p@0(f;>0G,fd i{WΓx;C\̗ z=ؘ^3H$y$h0BQr<%& CA$X&)ΜyDV2'UL0r] ҥ6IˁLp\3"p306!]@&BUǗz1Q<8Y7yGAZj=MϚԍ xc!Q  % 6t"|) xj~{ g%QVAx^@@3imj"!M8iUB֜zɒ@7u4yEOGPk peKC %fF$l-QxDDy%++jA vG^u(f&<ȸ^7#ꔎTA+:iȟ`W ;m4 LV|GR&3}3'N`#4PeTB؎ÊDI!va` ?jOCCɓ&6hLiP !>.`)gPFP 㰸DS`PX;N20S|2:穅8` ?f` ?ʍW'A,<]MK.=̣/ Zz" 8e}|1 Yūߏs޶FPgr.F3Om$zpˆALJʄ;%! @Rx)Rq r5)2ဧ'K)|h>ɮni=&xy+& Mslķ,ݒh)-硠303 @@@K4;&UnK)ј%dە]F7t8`CWjF3;(pLc & דNѝ띜"@1dAM|'Ӏg36+rG9@\fvp`QA4| On (0†s?ßp`QA4| On (0†s?n (0†s0x w| `ol?@0!cb}9~ m@oRh `6 \@`נs?C`P0| On (0†s?Cp`QA4J' `aCGp9 sA=j>' x`6K`@~MEXP1>o0(k >'/ a(?  1@oހ0'o[{PZ+I'(`6A  `BȀ4  8 ()x|SJf2`/< h@7#`Db|0߷B/7Ɛ| 0EVJ/)P0m$ǐ`BPs@}Ppd| `66@1>`o@0(@l >'  0᠒%}uIg<mS`%ϠP1>נ`BaA|PP9 aC @ 0Jyp9@p@R @C.?`6   z h@7 a8sn (0†s-EXP1>`osn (0†s-EXP1>`osn (0†s-EXP1>`oE/8s=`` !* `B JT 0UQ6! ? pp`;A`;z\M7 @-4\_Ԫ]AH.KB%+JA @oF#%ǥꁁ؟ڄw =*C`D R%7h0>@}|^~>T?&H0'O`:A}(^p~#.LI{b0BM.,\2 h3'#徭y/)X2. $ }h0Mo y;J/HQv@5GU!Ҁ`<0LE֎+R:ɴ0JsÀ0`C@K֩0y@08]IP0LV p(HQꮜ\_.t`<`0?V5@^^ ]A WD('AA0A9]Pb `A?8` 8! % 5_by?c3`8_J!z_O9>(+dV.ҁ(AXB0@,Jr)Sr0~(K> ǂZBP0!P_a\Pږ10`P0x Iގ`<0th|Jwl }T 3ï$hak恁 h=/WN BB. |خG0cDjVu>#X@ V$)Nrh0<U *TZ5jZJAڢLB!dS\Ol0%h .Sa@`-X!`Gcw$ "%j;P;y\%Q-}Ql/ AT> y栁`D+ecY00RA_x(a-TK${*FWϏ(N r`~KǻJp0 "33pP}X.UnOc I0W!yw ,I@9 HA R0'"qexD&@2AF"@c%P f1`Q`D~T^sP=UrڑE Lxx0 9x0?>_֛3lyir`wh:ؠ@09NBᩑp0>@el(m8_#A+`d/~p|T `C惘@ BRV hTL h+ս2nC! Z@a8`~@E0ǃΝG ĉ raHp !zzV2 8@ DžQ-ɼ H̀dh \$} R$ 0 v|^ I*]RڮOխ-WxJ x(x$lڜ3`K˄BR Y~"<>?Ap?w=MBUX`>W`y˄ E YG|;'Č>V[Z. :"4  eʼapO %b*?G}Xƴ]$bYt OPtp0xKT ڕcS+kXmAqS{t8|Bҍ"xF ? Q2A=L (E-ï&_Vr z Sa BAEYjhDZU-@x/Fhf x1 x1f  \p\^$eM( >? ?ڻU>Aٟ4xC&UW  04z$_/*1/G.?RT B0A03/IP1/ed?=GKg O) ;|XB^`<</DgJjDžjbR^/KUE0 ؘ6X$cVY KP}F>yd '&:[Y{UlG2O(ǞP=Tu4t`?GUp:08@`<^7Ϗ:L PڥbRc 0`]5@j5T+c2w @,%T 蒪{ʀ~p{)] 0> y0 AJ|/=DANj ù"+V~*jJkyͤЂ\=h?Z IA 4^D{['́'1O,O(FXpu0*vxKS  ǵk@1V/=Zh0j}HV\\C2Gb_@C< A*x0 ?6 ߾ g }2HH )P{/x`%B8`ą |! ?C@@@. 0{ 0{hC@@@@0 G|A^mR`;G_ΐ9#}(F 0H@0! p0!*ի/ԌɁ!0zĕXxZf4~<1Ym^%+򀆬J0`hE˿!R]`:bI.!|>8`s`B%>1p z%Qx -M$~^_T`l Km@ꙙjc$xx@>ܖL&%zMޫ3xXI(>?n4g|'!?6cMʄ`ċ!ui)JPP4KSG wp xH/T  %J|'4{xt ypIPeG P@2XJ@{ďT{{:JgAV<ɠw&?ȭy ?(N%< xEE6)~RpP~%90?V^%cBGz%s9i m8tExPQ ^^{c!+0G-Eo5ѴKi.B./갇G ^`8@LTF6 !`;%|{%Ę ohOǔFȫF%|$ SUhO9,!/t ,BEwV$dY?  ^/(, &F/kĄyHND\]P (A _s`G)&#ĠyvAT7 uA H.`g :jMQ?F yX H%qyHI0@*! 4fT:{x0ptk `@ \r/u@Py_՛{hf<"i G9i G943O x0($ @ %+R'|80|.SeA+?ߗڨL'd?gY)[H0V$+Ļ2!T.Kk?-+!< `AX `B|U`+L @xMh9`Ky)Ll(l@5$ Pw``;U+cꂴ ~*0_/R~``;AJ"8r%bO@X)m)"^ġ}lĂR:BFPyw 8'"r?a % Qqt.40 /:*x?lIUA򶪪b`0!Wy| t 0 F .! JWp9C>Jvx [ޞ_.mC.M8=V( @CJYPR?r`0(!G6%Xƅt o ,EtAIxА^WL Rv:>T4%T)*.$J/8 /|F@ʸ`ІAhX(ٳA }VHIԪ(8@ 4 U`Ardg( h> >F/7}wVA3">;` P h0eƼT;'%ށ)yp$ GP0 bdu*KyZP)mNȤh0@?\>WH#jP@sмyhuBX@ʫT]Kv\10@\?!) Dg/8HĹW2^$P@\B,.SDU_zGKqH0E@l2t,"P>x"@$ڎ((!B:h$DV#G>yWUGAZ_T .N( 0\ zJ0(0@ QqpP\]_ .J=5DX2J 7x3 @@@t`4#`4#f 9p@ MKnj߽Da(`~}W;5ϩ/O#s"vT. ?TxK`{CԻ~^1DP' R|%xG>| 8?.rS] /z8G |B `C?ar\%Dv x0~`9A@%+%TTV1_SŁ @xCjQ@;`_ @Wh(gԴ}S4(B,pD.=DxX 8 *]Q}^@ɒx>Pb~QÀy x?0vcڇԿFf0]6_A //(<h 9yx0= 0!|˼Z80@.V C#l*LA?%x!^Z)vu``(0? e@U+oAEN1++x^WaїUWG;>q8 @W `;Uc?5`~ H@,~`b0~.WUq?D$ySjT It<g)>m[,~] ,> >`sKDIH% ^1ҷ`s&]xyy>z0Ѐ (( N $yPWU^"v0z?| /Q߄m)I /@P=B<| >ۺf0$ `|DaRHʠ`90QGv{[2` 0?|x h*íBX0^Lr U燥ÿ˽\?/!P!Ĩ?rpp`|C%߶vE "x0c y xud<@(=* ``ʇV\>;=Ds H0%`GX;B`>e:e>( 0"@A60>s_cg6 X]򊟂/ K?<`<_)}U {_c I*ARPP17!@x> b IÂJ8eEʂwDV⤜|,yLheXHV<Ͽ]A< `D@}Jբ)9@y fʦ-*NAV%<>r\&`ߗ{@M#`<0KĪ;ă9C DN 0UvbZb ] np0>2|Q=֍ | pЀ{Gl b@0> OĵT¹s`* vAwI)@B!>Nng>?,#A.JKj^-L` ?C@@@. 0{ 0{h 4R `c@a>1`0?%ʬG bU \UYq^G'yx@0`:BA/xzІoSfVAqAU ď˕"l!) @(<`}˽ߩYğ% b~@y0wE_ m#Kꇀ+}~?.`h9JAoH A Yqp~*O0`8K8JTyl|) wT :*gup< `<ˠ0en4h 80X0!?L2U /;*rbA(3 ڕ#ʰO0PBGI /gA. Z_g0 ,z\%十c*\ `DC9r~w3Q@!P[_x@MZ6-  H#dL izӂ7 PJF+/+WL*@xKWZ^/P0@ H ~1xU AP!V &Zja_A3o/Tı)P) `BPz_=JdVlGʽ\% "rEC(0!]=t~<$ D#9`vXq'>@>0`R'/qGrhM<^y0"H0^%A X!(K0(y`)uxNUA V j,Hww~?yN<Qr D]HdάxalWʄ+X"pLŕB`Ճ_]W+96Ht 0`Bz_9Ā", h 0 ]|^h0g9P%ՏkEWf0bP0|?/R2܍`ՃAT$n@B EeaDp`;UЄ8|O 7*#%BHAX 2sՀ<>.ML?LǣRLK Dc}W.̀0~D`<5RLh0!ZS?ub( "_D`AwK | mH , T\UJ@tHA<${ ]$.@A/x}eljX yTRؐ@C.VKVY@W$xH~ p0!>U B$5*1 J/` <|DЂ '@ 1  ʡwgGxx|c!_ڼ,Fn (@U`;\TGI5g 5Zy.Z%# /Դd (%gT@ߪ īEҫt>8(/']4=@Cy}V#PRdC1$'3XB`<*T% cG\ H"QB$E~}^<E`yQ,K^X0` ޲xQ>?bO UщE408etPp|F|zժ0Zgyx()X*ˁ(mI`;A\.o p!$U(/V%M ĠJ@g8H*`| b KG)/gH́.RH`;A X>.]Ǡ 8 }S ˄(Kd<=>p0"XAT x Z>%[%I J.E`9 gA{BOK(D P<>*߃T?AΏ#Y `;+k56%x}@)jcYz$ʁKg뛄*[ZFD> x0 ~HZ ~Ajx#diB8x0?*qZ(}Is80G&A `P`|8 C@@@0] 0a0# 0a0#f: |3 [xGL\J/\R 0uQxA{ D%`8h)# lR4.I.-XC ]pqG@u /~h`~CSPARw C\>Zj`և"@`A.T$p T$ ˇ Z3"@ `<ğ?@?RLϲ}c*:,?@x+wDUjw)ư$ R3<&#І\]ZΚLP` 8!{V`ʠDJ)q^%RBP@|{:?d$ LHP`:%P ⚅w8(ǀ\9Hir\R;tA%Ԩ~<p w5CP+fLD 0>յO>x@i`  = F7KV_.Jj yP0/E %~rJ0`<_@UBWǀM\ M  `g?> (0p@>ڿѰ @ jP7U|Fb`B@ x0>Gt] <08>~#0t}*jЃQuT.O@xx0 `䟀` 0`;uF8 *4ı y.t^|ASik  "7GP27 "]0[8<@xIiU8EKz*A}.2u?l _O)r<LIZ*VX$ G/ y0EʨCBↇ.\iU<>P2#xK/*VGpGO0` 28PL \ԺՁiŀq(TWMe@<nh 0b\ J/Wt R6#0eYx0!}Wbi`&]z)J OO'pˇB)0J^ B[qF݀7TNH% L4 ,! y^<xvܠ4|A2!K\@iu|HD@P@Ep`KUDY y_y`(f`0!/zHAB@5Tv8 \0ϥ⮩WOByZjz9 4#$y蒯XX\4 CD(S8N4 0@`Fࢴp'5C@Vy~(]GX.Vo0d`<\>V|*;ɧ~%ޓ*.2! Ka(u#;$*W~I?]x0 C_}4ؘP!+IAvV@qe Gď꼳T!~"0 up`U%hx,@$ ZwGd?sr@v+?|_<* !%{,tH~=/'Mr B'L*@<##<8|?f(PT+(/"%@0vEb;Ë_$;0x]JwU5Dt8N % ?F~@[øaZjW;  !x!4 *8tqr>R0+O#hBzC+p0 hP'ϿT>=^Swȩ`TJ4!~\?/V_X:G+j"FId}O:8dUA8SE>$wb<" X J< %f"3*G~xŌ>.@> JW6` 0>\ >#X H*@mDA ֬f x1 x1:  H-"rFĨ~wA^@$h<Q$y8 `6 |~BqU0`|>%OZ`~\%nUe%X3*?(*;ꌇ;_ Tx⻣hd9<`CW^جK #Z 2;px0"Da`  $?R_ty,v.T%|P ܥɃ7P` G0 `Vv =?suB*/E09NT2CԞْ?V*W4~$"+08%Kjot Cd"pJ8ܣF cJM%>R@xժUA0` J VOT+Dy@4KW'd|>k r<rGV z_/ӈ\W/qBT co D>\E@cЄ$ Gf, X0{=d//J`8|荝.eC`Մ!A{U¾y x}Nt R$ //NM/Ŀ HDI~>"AԄ/Q?f%\` jA//T\Y| 0`xum,M) /&Z 0# ?7HAu#b @|8р:R* p`;Ax#p1+rP`$2l6pxKKhK`@pCB,x1@`E(ڀ0!qX!E7FcWĤp-ԼKB!%(<* j}S,V*Έ0HDKQV |>yAT%@}0e.'P1UzȈ0P^ Q. !5~*~QH0@ %C @ @Q|^B8 AVvb`.yx_a?;V|8B.d"i G9i G9f8 HA}fDa,K!jU0.U Cs80 \>u @0V] _]^| PWG]$=(8F p0 ^zA'Rpus4Gp0PЇX0bUN᳈ $!JCk۽q@0`/V U .#"// 8p]o`%$ `}Uc`X_S8 0@4|%!)R*R"‡vLNN vA}DԀ.h zBzwT197!/|bO (?1Z@` !$ >RL.J˼^ xǚ IOPC@@@. 0{ 0{hC@@@@Ee:~  x`??TqP0$@_)4  AxBUǿST-"LKS0/>)Q@ ܾ.R=j$(H}863A$1p *@P`:$ ?xR?)UU7[i;zZ `BqPR ^^J6ۃBPeHƳy00BM"RD% |kdƌ~P*>R`< A(vG B0JQT/O}?, w>LX A HGBqr=qy!4p U. 5Ht @Sx(p$7P$~ >/&/GVqJ$ap BVsTѠ_(|NLa:@p0`^ ]VLim'n UH!~*%J`8##  ^?``<ՁăP A(\ KF  \PU A~K K> ˬ0] A@J>f. A$|=8VD`znEŪbBj* ϕ@WC0Elf(ɾ>rJ )hHBT!0G f%EE}Yl#KW p# ļ#VO%8&\u;ĖxI :  ^+$aAE/p0 B\,"Cw [&W'Bz7 )|Һ@xR Hwt9  |;á xE<`s?<`s? hf`D` }x% X8E?//!K U>Cg, twizqX3m>aA!+Լ `yK@qP@@X0#eljH  `9@ @> DgWǿ/J<8˕'%?Mq0! _|~Qاn+Ke xA`|KB{Tt}8~\$|IUJ9#85>VR_˾S:F+ZK1 BP!{ wukGR:0A0?>rbH8 |ψ #"[|JT)0_Dx>Z{$\߉AYx0a/JQJ3\ddn!A  /T Q0^u < 8%8aT hMSDaڎ' xJK"i8(s3 |/QvJx< *.UEރ SpLz|UDV s ꕂU+d/+X=/G2Tb\VBU|VNj//+fX!x(S38P0W\ ˊz2LZߥV! ?0``G0``Gf3 @@@'Eׂ@ p HCm`5`?6 *hhA.K!`9>%xP\3M  j$T+U`Hyr_f8H ?~l`DN?RH$qYx|=9: `(˽=>x% E| Q00%#N =TJ>UF"_ı!_ 焠 "iGM PV2̼~$eV`F" P}YQ < ~J;ἆG@`||)iW9< _),9P!^`\HJĕCq{~=bIzYd'-lH`;0EKԪU=[â&~恀ġĀ;E K}}SWt't[UƞJ 0@ZU?3ӇG>E{:%aHC(JVIpʾ~YV/PĀtT%zF'm`xNR^768$@Qm+pDƈC/sUͦ΁ , jDTvn} ^Y,0~ܦ x1 x13 @@@+I T08AeBU`(U*t79}2sU)>X`0A;_Ј0ZC/ A.$HB}3׶ߗx]ۃ3`yAP%A%`6hZ PpKmnR&_CZ| p☭h0?<`D*x0cC`KL`; 0o Ph0_^-#X6(6$ Fp" pSvb`  xA`~4+QaPw~$GHV=.ۛ |t)kOU|%0@wb--h$x!^\0~ J9UN_\8  0`DyV{UĺB"PFRjR1$!nZ0%XA'p|xѨ0 P0j$@xzWqJ"g}\ݾU}+fw)}<`C$>}Lސ  *`,/ A@<Vb ix Rj(⸰ʏkbz>0a+7` ^Ұ x``AW[Еw1J1wmH/9s]2%{UTD|h$|$[(Ug˯[Ke *?~w^\k l@NRaz8F|VN " w`~Txpcޗh `ABQqvN*`!`~_E 3(`V^$Ulm`Ry&|JPZ<8 h0eİ`|~T`UKjǃ `A.0_*Áz9yzCV|Y)BWv0 `<%B*laA| BR$~t^s?!IT8L`  #G`K̛nvʲf\I`4Jᆪ SU׎-`B"KB4hh&_C`A+NO$H.*1a<_eq+Am ğLJA,~:Jp7*$yZHeѲ3I $xW㨧ZP0 Ղ yp0_[>ZuK@8J_KW(KB㯨uR B)!.H~Z  h V]}@(/QP % }2h yzٽ5'}~\P =P~ ~j$`./s 0?.'TVN >;̖8@K`v=}90z]W0r/V  < H *<V͹n`iLcO̻` ?f-1Z8 VL uS!D'.@HA-äd3d:%{ eaW|G@pyw0x%h( y-]xʪGF|FUGϤzrf\2X8k^7&`) @@@0` ?F⃡M(RS"$$29eWH8AL^_yu4ƨ8Q=mI0(d$DLg V?X2{9#[ɱgzh FE4B#4L^|_: 3L&-0^0G.QGRuS*# $$ @@@0(f` ?Y4DHt)TSQ'U/w>#E <"o3TLk(i٥&=;u@f!56T]DOLUSd^`뺹!P3xSmx%ּ7#>}P2UaqL}2 $^Xh3 @@@03 @@@0^%`}xɛ{L`H|x8 o셢[W >\ |u]*#ᓮxd nQ`څi<ý.(&˗& Q4]f ` ?f` ?fSiPXa_ek0G"@99Z ϩH8?m[{==9n30}FD)A)?:J3ϝ?ZMii1`dQ z'Uzp)OCL@1>x3 @@@0(fAU.{~`(xZ@ΌHŸc+V#Hǵ+dflfzGǕw[8ʩ1х2qY\y=6- gഺb+:|$ d(;`eG4^P? g#P2S>Ze}o SG_h8@B=ƅKF?TFZIp0Olڠ=hp]` ]S r*H 3A8y&D,^rj;3 R1J\H}fuw W>:4 uBF/ $<) ,S'&\j` ?(fg/t(g>Lu0硐ܚ@hŧA3AM(8?駪sy%gsq_]AC9aӃ)z|ه=’g.g}US8F3Az^B Fc cW}l)}sv2^ Pd7 ` ?f |Θ|% :.td8a3)"vLT+eiȡ37<:ӴC jJďCVxKWwU0a!JT| hf` ?iЮ|_'IxW~MLRo9)? vP'{}C$u)f=R@rKGFlO>T;?O,Ll uu0(f0ҫft8@ o4\3h1 Ǯsᛊ1g\FP܆ 50 aԗ|LjS?bǼ_|@(Hȯ@f:S ; p 뉛3HJfl3j2ST(F.zo&0'&FYLɓc{}=g`RQH'P303 @@@nSj0uW 0h~iXјkՍVҬ[IT'07 =:b`gdkYMB4omvt?%-9C_ |uκc5柝pS7I??=~a2|eo8k8daf7q'݋CtNY:4f=u.T= ]bOf)1.i3+03}>n0< }1FU@yT ߛGҫQ+5;^S zجϪpKGW(6f{>]VT -]xbvEF zn\$R(LWL0Y`zoE R;o`h0 8"Z! S(0Zj8L[0!E|xIZ>Hl{# 8sgM['.e&yp) wUП.9`A0 5PDPz-fIi|3 @@@03 @@@0=ɶ<]⾃q0a3ɴ >qW1A.>U2g=2^I] @B>X:^_Q.!3I@k; Lz ̟ } X&ǎ>)IdZ"5#8O) aV%+.EWhRZfMRNB7zy@? ɹ\L0 PG ԇĪD  -gw^WGoW'/  @@@C03(f` ?9J̀d~K*!UW0?bpT^ܰ L@.o, |N`}X^:Ϥ>.Y8<):$`?vk™3TJ4M`k`~rz&Lh$AM@H/uEq wZrQt, iUKƈ *dTG3`%QՅp^] = z6F>]F%nvXX0`DZJ>/II{Sx)>PW~C =q?H../8)J o tρ1 ADxyWpSeQ/xpiPpef?4"[!`#8`)Up _aڈ}2N uap}vgEf%}Nـyrg&UyFoѐelF߫|:;8k'k @@@0303ha:_o&*Pœ;jĬ Xc2+Q߃>S̫lSSSF1TӁKI9p2~6[ᡧ)8SOʥEhߔ;qJc;v'M JT:tky|~{c^8/auSGb8jmS&\"phM2$a[:XՆh8@EXZmB4އv!#zLN^2jìx!*R5 m#uoA` ?ff693PCV:V:RST_Ue3wn t$/_V'T?0%sT^I8o^' ;o dva qFdw1 QQw&PN(G6^: i?IhXK(kXBb6HS ҉Eः/}& pX*GYPuFCr?K2c_SvNB@#B@T;2>V]>U~"{}vr `0v*Gˋ=80@wUT7n/p0> Mjk?8$ ` ?f(fkRC#wy_Ƌ˴~R8$+wx4' jy6]9)ӃΨK&)+M( E#)l5id% 4 la X*"2R?J%QTpKȳ|O `Pڬ@=M΄`fLLJ.6~.áMGSәzl( M<(: oO GQI6>GO)U6u2L=VTSH29S 8 e_BP}ÿq0 @@@03{1a=P8`PP!M?>vQ9A6Ս<% r3cHTvb,tT72v;! KxJ8V> B'DDu+hFルsX= IFRV)pv>]:4sw` ?` ?f=TM ).\$J}pG:>A)? /ƊfWNxGC1:mL%v(RX)ո0Wq]1[̏TC$рp%SUtT&T=^ iAsjT&&Tל S*3Gd31/AP "0%ï !|S&>߷ƚ!HUhQ\ hÂ`ΐ-s4k] zVotYOsl:@q@m3 @@@3 @@@0xRSzGl3:|fLyUC 50:mѨR#SIA F%3,`H=pSMIo NsIOF0F(2LUKtu7l29tgc:ϭqpL1sN76=⃾F> Bw)T($% 2Kըz*t>/"1w', ` ?7p '!<}k$xz V=Qq@&"F" cEzHyIȼyLGqL\" 3 @@@vunK֙Nx)GFudžO!L:+~O=  Uj*"!iZRL&!O0'GG;$/sl-]**=p)K ńCҎ0??0(XCEuyALv:cQ 33=@Q#n *pBTZ<̊DqXƌȓԖ޺F/^QL$ @@@0303 @@@Blا"`*`qXJӻ`@&A2,!L:ʩ#fwԽFvmZZFMFLbvk[JJ)\5hNLKW\Ji-E*j,=21xSQ*KH[r "( _ptNG mO݀bo+|+ cc2I`@\uVS#.^ 0`P;{?04`]`^2p^J7ۈ3 @@@0(f` ?ԁ߈pb0kT_`(Si=IpP~EU-$gISW`0%9aFKO)hR3pv;ڑ͛> )GX Rvq RՐj[(4׌ј( ^2gꅒ)Rc(u޿IУ H`A|0Ur6|J*1˱i]rj",r #,xU XIxfbPH=;TT[rUq>qxڸ7xgO` ?ff` ?DĭDXN g}*cOǀoRUG(JVU|/qG;HAQѤN򝇠oS(0_r\Qq#}o0@%u%PY'(%K8#fywLvNRG430By[gxk5˃3Z4K i_ \^L%[=R =98E2QF.uvOlҟlAh[V~5N S4;U/a3N9_W0w5F֌9 AM?)@ǗzhlG0@ <،Բ>7?;|@ /͑SSutGDN] N@jdkIZ:LT$铭`8ED8fDR$& @@@03(f/ juOΰIN*c݉ NJ ™U߉j 2`UKyre]lqUr Bþ MH (ZjMh:{P7W݃?ݬ,wXŮETu DUB?pA aqgAwZJ86H$*.P:Vz"CvLƟqڤS*G*~UlI94z9W~-pS T#׏b* uSFL2lI^U8Β=9Z2~+03 @@@3kP:xSJn2Z]Sx JZqpt *g`!M¿ xFxGA@'NP~jϹ낙?ѱ)D~nLpSq*N+P2ʼuH戝RB`P `G\Φ`(.FHRJ M&Dr ,kSO j"E ?|)2]7w, `3xSo pcڣ I_VJ|sA.0c" }@gRSp Cs# '0!@?p1N)[` w4()AmI03 @@@3mS]_ eJnO~#*Sʇql)dɸ]UJ~P;1 g5FT"TFn el^0V.oL12c#֏H>)<=lA?qUlv bE^QH]@ǝ,E~vJo/;UAMr7T7&qUɸppr4h*Ǩw+P2{ZN1Lה]&~ԿGCp Ka+|(wLJR48 eQh0 ^%D^?)MNp7 v+5Af` ?(fAtEWO=@ 5, Tq% W .{5{H,a@=(y`p&$sw0`wsMU*V@W^Əy S !PLu ALPaO5828%_TpŶQ UUAawRg="A(H讫Qa5IS3,'| \`3//Y_ÿ 3 @@@3"]+SMR.Yʋg 2$-ÃS`QsI=6rS~XCoU Fj׎F90›e+ߧ:*1I0S$8iGC'Yaj5rUCt)8@mA"p~J!1R=ۦa.w@BZ0Ƙn @@@35.gI[n s?Z@H䅔;"B)};ׅ5ʤOK -]i/@8B15ׅ3GW?ѯZE]![5LHH0iG_{ƭv{̟V,~VJ JzRӾʠ3ZZe)P_Ppv; @}GTe9 QWzU"%iɚ,H j,N` ?(f0tH!F8r.+(Z22PE056hL+͏*sp)^&LY 0ʚ&B!g\2L` ?5Dׅ,΋DžʄxKȕpS_Ub ~:!+U?#"RE[u$ t>Uabj\ '` ?f` ?3js:3⅌I m;)[&7TM:>W'2{о70X1qщ6A.A:bR:;pd1~ӹE#u>(SLE<1YpV}\V +g*jkY#;O*8piFԒ{˷T$x"/` ?` ?f ~aܩ}V՚'cGfcF6Dz*rA"آ68˜Q{&I3c?,?컭8Q4+lUnSAN??QsKteʆ:H) zV|PH\$lxV0qy"G+ऌ%΅55H-b1zKZ cpSP9 ȥY$&6oNoz[3Ows#&Npd൤` ?(f` ?f0N&Ux5&QL05^L"@ U@@/r8HFʅGHS_Q0 @@@03 @@@ C `o_DjvjRj"4 N }Uz^W慿ߋC@7CmAJ?KWِQ #d|-8ѫG™q%[%uM.򎒄w`R.+DEyƸMgE@ÁHzT=+R:1 ubS\?sgSx*n\l)dJ3zuC}L j|iNA9C&cf` ?f` ?e?-Uc?.8x)\^zEqi8@AJq&&@BZFl逦w!CaQ.OSPtFOijA f!ՅJWHduME<)+"QB: OL& q+$.//};uh&g0Q(8_%^5"sc}_* @p+S";U8@AJPN)3X;㼪f )Ч %%> ^#&^?"͂ߟ.b:A(ArAf` ?(f` ?&<FNR$z .Q pO0SH(PS u 2vL.g*sHϘD% k(xDqMxSـaau2PݴR38NʬZ`Pa`2h) 7wߣO03 @@@03 @@@0j3<`)e@0?* QPㄢ` ><'RL!*/%YRoU9*|O-2dj1 ^hйM/2CV”1yqwLgDŽbGg$saӒA{s/ `9_֎\ғ:4' :. \Hޯ.A挔<` ?ff` ?7'xS?Ba(6`OìDw ͏908V~HG<%m\WN{0'bg qǎd^4xw!DlP=0{b`^k)ԧWn nMCHzb^D,UG(d pؘ3 @@@03(f` ?SQ>5>ST*u+LGULhR/S R|Ƨy|ذ8@Y` 8΀HL8?SQ &wM v.jZQ%F#&!d) ֬F?6Ξ=/w x>#eZ8?Px  2b-|G蚷PSjzu]vN4pf` ?f` ?+9SɁ% 琛 d @}`4w v U9U? %9Fឦ3O<7%H_A@{Ə|!*BK+\EcF]L D# QAj"צ@xD R0@8xk#) 9{0#1x`!ٸe|M6*Vmp 3 @@@03 @@@ eLv~2D|xiS&O.̜OިSXP0M"4Kͅ)U*9$]hZ{O]6|S&>~ w0}=G 0G1ĵEQ3;u _S;w|"p`b?-8f` ?(f p#j3^m1) G^;~0 `!SiFp+T"\izwʽ36@Rlj84qͲFf X_ Jbꋘ3<U jOgp}Y& )P#JC;0=W$FsF` ?` ?SGbs<2a35-hqꌅ9<f:̃btPBD3\1` ?./߶" uXypeT hD 1WUXV\8AM`Sf}r~5i @@@0HP![l%wL4Wq0R䕴2\lj<#H "a2չWs"F<3|)7# )o}\R3jk6V#&3~<`tF٤M/M=,IL(f>ddiHq00為MFՀa(de R H"Z͑{L) :0H8kk>!,vIK I0MxQBogI\|D` ?f` ?_9F[O ΧƂF t+& hc&XZ>y8:0WFF&o^:J -O2%]2rIT Sǔ`ds $e@3 @@@3 @@@0EMHb]2 wɄ>\2pG ;\Db%ܑfՓ4)0ʰCNw7R2X5M%v=UޣBCgc`W-ٲdM{ U,Odfh-"2L!I ` ?(f` ?füo%>a0pSUisj>Տ?:>?kc `42OǪGӥXtLhcs$!w3`xX;f2VEB%jRn.~?It)CT*_bFfff` ?Se)\bFyIh8Ē`8_NwSˉhQmˌhQU(>|SOqR;3U*TUӆwߞlDlĔ㯮#G:s*o\ 'J7GQ5x ڱb}9 (h@7 $^ 0b}9 (h O| ? (h@7| O@7`*  `aCGp9O? (h070`5A Rf|`7=pl/@o0&pn>'! @A/$  A;nE * 7B7``9%V%8 ք 3P9̠&d*  G 8 (* @>\F?>0|(9`8`BUh0P9:А?$ 30jM`8`*uBc@7W%tV\[ 0b|8p`QA4| O[ 0b|8p`QA4| O[ 0b|8p`QA4| O[ 0b|8p`QA4| O[ 0b|8p`QA4| OK` 4o`+p`~J`|C C _`0?%ͷ5hC@@@0@ `BS 4``T pAT%p}יuA~8`CX)8РyKC^3/5@tGg=%H` Z<7 B9X0!?WGE\%rCP%Pu_aPbf,! 0Z`A s @tpAA&x{ʂ3g J/y]W+{QMPE` jA.ġ.+J%ʕn+Ct< .߾هaB!3.x$}3IU6 0`"?@ \ 0U'`t,V0ra,JO簻dF֐+4 ˄)U\0\~\=|$j]=r"X0:籉ڢpT%8]`<`8K.Q$Gl3@|hbe܄?A_TUJu4Pu2+I@6Q/^?U=}.ZG@0`\硧 `~ݶVF^%0 0`ApH0|7@Q, %hg6\=/I\`=UUp\X\|@!$|(dyBS 0kqt! 0@4[ߏb($ J?Gbz;dl @LR]jE$J;S#PP 5(*}J U@>;\>R`A."Mh!_m`KDH63 @@@t`4#`4#C@@@@` ?pd&J *˕Vߞ~ ^$cq0uP`< 0`AyG>! ߀YauPB%X8G`eb %#wy0!^jwM*՗zڬ!'PT ;_U@v,tJJ_Oم2 @ FlZ\o`$?0s83~=_uh=ޝ9| y=^ jC:0;Zl\ 0 GX E0|>/~r˕Ay?e_zzK.y=\, RNp`#ЖE wȳ `<1G_@0A Ẁg݂`Div$ x%+_(  `B9Pkמ `yx @0:#;:Ҩ$Q%q,O`9-XAB@;3sG}P*+u j ߪ粫) w U~;S,q@p`@<@8!yB`~\^Y5R.ګރwт@.%!zTB\oywâ<:(mP0>h|y'C! ,!%{`[+mL<! os.8!/=[`g`:_MXӨ^8%j ϽycIn!;hhBp0 En4֕Q@#zB0j$#@8 `yZr0c@AZ}N~[(bdp`8.pI}JsRW*{U _,E>zү6}5p0~ : I<,! .G2_ם:{ `f<"i G9i G9f3p!-I@`<0@SQ&T# U>Ad?(KLT@r4!!QrJYV0ؗG  p(eRtT `T=/s `Z?q(<!C~p|òQI0C証IJe)I~ϗC`V%]҅~ø1(I?*\  jjXu!aM㦂ػjt% hA0_BGvx5*CUg3;.^GJ@ 0c,˄hYr0\$ _1ΌG9EUlĀ` bt/6ANc1 >!az+t%j^ &8ǀ BPߊK?bPA<^%|@.cE / _^.5gDO 0CGqM 磊``8`|$}YZ<P`ժPT|4h>. yV|~7{2``T$ʼn#<xqO3 ʪu7ӆ`r .*hFq0"ZP+ `XO"UK:lr x!??P*+E4 ":(r?BD!R$Q~];0p@ 0>Jt )p1&3>$ ʾ_y!QChB%PC=  a ̋A Ac:VyMph0P}eƀ 'ߝPʣj t > {4vpTYMZi3 @@@t`4#`4#C@@@@` ? HCT$II`@qHpP0@y+4!)*'< >_z3 `:`UT u &j`(oU`" x0AUuUO-;"G >}&(Bxux(TU5r)`h!+RFAD*|B& R # !9 zz {~j| *_>O˕)\*vpY>ST`90tKP`K@T!|PPz7 EϪf|Kx]JXj 0x@`BB0.yoލp0`@x>^-qBLP]pjP0LajbRB>rZi@`DP`\^}W* wЃ^^?ǹ=5ǹ컿բH0Ӫ΃0Qp!2*\/P '%G<E` P0A`8 AiG h3 @@@0] 0a0# 0a0#` ?0bH̀g@@_K rA+//Q.MYA?lM#‚+RL|A@\=W{ =v3*PQ`A9]ʕ.KȀ zI*|J.I(%V;>m   Uytj(~=RJGXTb} /={as.RJ1,kL ?|?!BS%P+NN 0B@Qp0ʇ*DJ)|eXttYOL FSѫxWM %*8@yM! |U|Ԩ| xO}Xcc1M`G@QՐ`EyUSD zVra ު*./ @]=T%(.T@`;狰H߭g@ *VbXpyNlt| qˀمH(I)p0SIwUmz0@sG$V;Vl `j˽~y2`A0@D`;W`%R"<@y~P`A˯ˤo A HB޵=&$P)ڱ8uJo+u+P`:AV % ^_=Ω=,_5 ˕[m:>ʁSum)ibOS(msS@xJS]Ν.)jSsq2b` PEz2$!> mjb.V|;<3 @@@t`4#`4#f``9A;>U=$yA$% UUDZ=T^{E pRz_W5 x0jĬ..zr0 A {fSJfi`x}~_ԍ " DPrP5eʨ!ΟƁK `v%K+I.( UU!_ hG3 H' ً%!`P /֫I"w2_x(|"8s0"J@TS[lhz#$O-2ȣzFZ(Kzo$2 R8`6A|Z}0"JP`!5ـ$ e# _?nV Q%x`:\/+āAcQx q_*πb|H 0 Lzǃ}qO&A+ J/EpAuTV:=L`:"7j2"+> 1'A.T_z+=$KT?xZO*?pCJhW2I,!Y^ .$OÁ|^ JX. x+T%>Yr ``:!xCTW@¥xP]%2$Kw ?Q 4_&CsR~ ,><!2ֻ$ P!// {G`0`< R=o.6N`%~%P}vĀ *c`v.PU%/;F $ a /C0`H0"@CM0`*8#?@ \h0>.P K;Zos|~# .Kv$0`IT>.|rX`~${'`f` ?0``G0``G! ?  @@@.xĵU_Տ~SH.JJ躐?^J`X>.TKTz_hXc& Jw-Ef O~>V#s`Nz }zz+V?IC |>T.jx~ 0!%Չp`r.L|axP_)S !|  =p`,UWG&7p 0A%^S?3{7j޵<j*`!x0 P$"LP\2?GK^ ^</2Wĵc`<q0 yxJEiA?ɽ= ԏVщ0 c>ʵ{P> x~% @R:F& C`1EQa $ Q,AA(@0? BX'(0!_}`N x0! `8 b`5P*/@WH z5E 1@t0?{`0Jt /+)<Gy ԁ`~B'2ˉ.=X82>T=D_@;XhȖ (0G`ޚU%  `0?#uZ0Axh5`TP0"P 0cATf|n z>(\0j h04J.J՗µYU+:iDBRZ`AT$% bP}NJ.W(!X!I)T= }(h$͑ b`x(x@?~+cO @@@0] 0a0# 0a0#f``9^ h0ox( ^:x>Sd6 vTpUU@mL4aCq*" h0"H0`)>n5ƞ !Dg%%Em<A(ʽc0`@7\-Zz0B \"(0)pt`; ]/j&z\^?zβ'0`qUyux0Av @0o_$0 JBG{\RBC0`~ | x(f+.V>.y)fVIBO'g{O\%0%`;=[-P /(UBʀP xođҠpM7DxJ.L 4X!Uk%hy//A|z m!P(^ M`bE9 ezK BxDRl`>=<0.݀:AJDCy*!bQuaֹp?W}zT +APHTQqP0A@0Q@ @0^ <00`ʽs0n XC<B %I`+|wB*!hP l B`^ `% ~)QwIU"bs0!H~rj$ .nހP | Ј|z\x3xE<`s?<`s? hfx8CO9/@~AK8Gl  AW%V=UXF 8B.,}7#!@}_&H0A ` _|<Y@H~s qBCHM 0Q]=T<%8Kz3ʋ^-P0.*3&Ey`0 hHΒau.. GZ=4Y@`B .8)`<ߊǗByp0 /.R $:+G9иJǰFi@dT< ,!}U j,i >~ x$vJp!UjUAN1B V ! A Spt2>~'K藈 T 8PNA"@P0?%C yӆD햶;`<p0 ?B$`~~gO  0`YzeǪk 0qOgs|@@%?Ҵ@yW<"A :& /~&|~snHc ?\^BJ<"i G9i G94 C*K*&85~7xǾ˨0y{N 0 K0F`EV c4XO@ D ,X3 P`)lPNT0!p%m`pf@ H%A#ةW 6`{\@ |}W>".xJA J_>_xW 4 UJQ?^#b`~HG#exJC1.$V\>P8@a\QOGQ$m#/튀莠fr0_9(4H8Jx h?[lH/ PG{@=_ӐZ h0$ECݱ2"^J & :$ xI|p^T#횘.=*A * <>WQ~#K=?UQ@/BJ.$K˓qpt``~D`:<{@+GEđ#XB$hĈ A.VXj%c,_?pfh!>| ئytIxI`~|>cE^NUM[ (K=r   !DC*K];'0oU?[MzEXʶh\K +/.j@`ǡ - :K+QUp 񧀆@ ĉ C ?0``G0``Gf ^, AB< `;/"z=p0~`au/WXp^ ix!7cQ J *l\$ h0ʂTBAc>F`= WX<,|$*4#/.&V*#}{%`<@"DT\JUD,%++c:尾KŁ T |LQBMS[o> #~u`yP0X0!S0@< eX9 PW}6N$J{R^"\>/peM #a}^ JK8C.UrU?=@+ʏU tG^d)`ќ K˭ɦ }\>_@{열˯x/0 l2D{\ p R4>9Wh8  ?ʋvNx `~T27פּ`v..SGg> %HTGbv#)/@UaJ.!,!O*8!I Z2G*p0 [\\4{{s~ `8O@wp0 42}@00`.C/oi~$42& 0A~_)_RX`<|>/|= 5^s€%JTY$@tBXa9a(B0j>_M$dV #*UpK.mR#tʂ! 5L,eP0? ?#l _>Ĭ(HT%FFA F1!] >mlT0? >` DjĪ\;P\:\$H<6 @@%U猁a``<q8`d F!ρb8 1(~$Ժ`! ?0``G0``G! ?  @@@08W<(` $~ɩ((0^]ꖧ&~hp`9A, o%wT5"(T븵_b? |! ˇ h_?xByJc`Q-ePJ!>z x{ !Bw`q!-^)G*h|G)7$B\.:.0@F"$T?|>j88P`6@8BI燥 HH  T @<za%H9/H@Nx*%E;_ p?"_\BA!/W)$(PL/'G`; {('.{<x qzUf x%` j]2b@$`;`Kyp( `XimAx0A /W+jP JիܕJI@/CtX x X qpBT=j4'hI յDA1F&@BJ/wK/`CKԫVCt.hBEu)0" BC `zF 4}\ !&N~㠠 !(7Ttx>% EJ)E*{h߁6QQ3/CQ~ѐbE/XA5U`p@#XHPLn V^=*[tjX CAV1NtQ銷o!D_/ͨE~ B@jh] {A HKzߞ DŽ#P/ DD(yx0 yh0  1IZ pR q0>|yʇC 0`D@> tVSK9`į =usx8Aǎ"/$FۦĂ=HT|^`| \{G0`#8 R%+|H `E3``7X). o(CR4a  A&ŁX% WxqH$eP?/|,0F``<'5#yBI`< XVz0*0! |`;4@ h(@t Uq) (%`B@)U8xCyґ`j z^_擁oz*WrTJ (B2A%D#JP(XCʂt/^0>À K0|QZq`@U?$HY^k-!&4(2/+ܰ=H@=XZ}fB 0~r@p>&ض.`z$#:X%CA @@`<˄x qDފ T$! ?@L@b=@L@b=f3 @@@0 A}ǚ ^h0 |`{-?T`vU XX P @0./e`RSE`rP`%z#9|=QJ4-R(m ,!ĵ)*b^D" /XQ0ꕏ"pUAT%> ~* To3%A)&oS>} m*-+P\z4`< *H*|׉ P<]#$*T\X4>Teq`+dyꕨ{px h ԗ__p`1y1C`Bv^xyO/T4=bЄ^yЅB+/0xXޠ;G8:j FV$,H#+  }-60 @T>8H@RG^F,4ǃ`}P@*<#+HBYyqv_`Ұ`;ܿ9'GRءL+B/-U[Sߨ*($;qXx>q~x{?x 6`C ` ?0``G0``G! ?  @@@03Dt;9B R`8>w@85lv0 0 Kf|`<ˇ@/ p0Tb`B**\$6KT$`l!X=wػ=ʌ 0_bByn*K6\ XxAa@Xdd pEMSDV@l>N>@0!$q0`C!,+,8H.j80!ws gXڪDN 2`< ! 3'U+w.QDXy80>%yRH!0`ǖE*r@yipQz .4T h0>a"Xh@T7p? bH%qRDJmI@0 @6H.Q)TuB2=p*R_\(lA`<} U3@! Ps!Ñ(A@@Ac`<l\RH)gͰ/()*$zj^ 1(g(>a0 Ph vx 0@  ҫ>0h xRejEkdy+H0|^Y|}ad< #W0% |$ʋ׀GӓP|!x#.LU`A xJ$A-@ u;)P(A4J 4*3 % [`8AuVx{)Vv`%5@ ^ s P 7l2.})"`}bj.#*BH0@zWEڬ@* 08J(^xvȏ6Ճ`8@/yU"I~ߟd0gW%`f<"i G9i G943 @@@( 6s%Q0X>Vx ]_즞}t0BXoTf]U  }~+^W REPB˼S酎2~ !.<=Qx`蒥Ј@""MT><a,V,xR8`N1~O ]}(0@!OL<yUP@@`; Q|l0 W0 yIp8@x0!x02\.7IJ8e RJ=!h0/UNXXJ΃ ڭZV^ ./r0< Kx/9T`G]9^v0@T̄ :^*田ȪPH 8%++"J?bXBt}8\ 0^N r+'δ*SSІJ0U5x?.|hĠyz=tK=/P+wI.D&+U2Ǵ^0?;ATm)!@04yx` `' a[ r 0†s/ 0ls0(k >'0 ly@( 0!n (0†spZP`5 ]P`؀s@)?Uv RW  0*T>a9 :Д?$  3}`0E3L| 0]@p`Ĉg0!A Pq1 a .h{g@`< P=X@o=  Ih ]{ (* 8WG` .!t0^@9?@q ׀`B0b@80>`6hs-EXP1>osn (0†s-EXP1>`osn (0†s-EXP1>`osn (0†s-EXP1>`osn (0†s-EXP1>`osn (0†s-EXP1>`oE/8s=`` !* `B JT 0UQ6! ?  @@@0<YtA@b`}0Jv_ h=yOA|$U`uWd'`.GCB`aK 8|<NB/@Uv:}9`<8!p `<_-80 ,U +*i"?JW*j./-sBHC/U8;'|?˼(!V~S >x@꩜S a%+Y dAT?yk p`;n'a.+/P!`C0`4 g8>)^F0`ĕ?"&XB8KT>Klx0B,}/o#kyRCEph0PIUǀqzHՃ%%?֪ U0U.MT``9A`ހ/0!ۜg1`;B!t+cjOq]cG0| 8Orzkx)P0">$}@.iSrs@ +W[ PP40_B B^0 1 om2G4$m~Zt`=_}O :@0_ua\X *(QpUX@o(:@WA*@^B?3Q<:8@@{)p@0A~w?6t9PHx%iK7OycWIOǪkQՏk^d`~||Vc\ 8 Ѱ` ?f x1 x13 r sx`;IPx* 0a !~0@ Ywn܁*]=nòxK/ĸz H0*ı,|p Yj%`D  CX!Gx `>D>{T*IEa?:5 ?UAB|U` h0%ώmYgHJ@(?\O,'D;`y0 y]S`~mU'(h!=UuN׊ԃ kdS #fVxJq80eVAH$| }X2<@`6] [mLRiP`~>皮0`;6! % gՂ.hGk) hQ.T(ԩ*P<A,І_a~ }sp@!Rc.\ G /lyڅiT2h0 bU Ǫ˿ު>ZeQPWj'+ߒq}@~4tJ@ us!`9` _,ۃFXb@9# AJU )} =,``< xx0>~EQ~D %@x  `AJ .T%*mQpC0{z[ԗyTw(ʫGM"pr`~~^?4p[PA>l+jP%أŇ<5@/ $rċXFuc.C/ʕqH` p/*`q` $|G'0`;~@y6` ?f x1 x1f3 )^en qGT< cP*ďpKp0]%8~8 ՂN]/H%L%bO+F 0麟G` 80`B`HׁT^ ?Z'Ap!bXSqZ\pdn**@Je*>]0B]<P5OdTw760g`x$ x?VLM-x~</P:p`BWJ@ 0V ` A|V9K K%b .@Q@}c`%P>AV 0T#_l//B6tT$*VH aATa80@ >E>HZ^TP4b2[" y@`lf(7D҃()ߔց`;h0bH _f*Z-L_T|ƄZ`~\$RG I!C}PƉ>\=J]U#c˔W&a꺣08@AE V?4e>20K*?U5M0` p7# ~g,rx0` eB'"%#6+x~{1s҈8`ERbR0_QG e#q"}/X!`߁ B~a!.-L&,~?>sFeHV_VT0O^1, a Kޥry\ `Հ@`9Z F A/0-L<6X VMm\IeJqxK.]GIi`9oGQH%k z %p`BAvtUp@%ʄ^jrw?xHPTU|B[TEՀQ0P ]Z`<<ZP 7\` Ďm`Q3v`<0 HBaA.@p mbTթ%!AqwA @@@03xE<`s?<`s? hf 8A`t`;DxH /,Gƒ 0=WĊ H <T ?,`r@`<0 ~ A O"+QUAI8{~*@`ĕe]?0@ xJU>{|%R QATED `S(`%p bX^_?TO< ( ,% =W(JV|T$o.(G:q/[0WV^:zCUs*PcJ$ u`V<r0?! X0^Uw\7+5D+P\?<)8P\:̠u /4?VzH0 BVP0мǣ 0"B@ TKGA.ɼ% 0 TĨxh9PBSU`9Ā "2i98  LU V?VZ?1KlHh0wD "0`r?, `<v+?HYh?Q$!xK ʿg70 %U_wuPfp03ꄢ x``34uEGW>=Vd0 ^@>!@`Cxk-r`BTFէ|ڸ=UwA! (`B(|%PH p=7|?`~Uʦ_9KGU$OT ?9AEr0``ADU)F?~T\?WTp@0c~ Gz`` Tσ~?k{äh]DZ#cBERtW/7$Ki3 @@@0] 0a0# 0a0#f@<BxEV=+P%+>S˹H.a >{À.&At`%gyaxP`A ?> E`<`8P_F i`C +( TQUoH>m@\_e7N`;+j Jȅv`Aϗo?:%Gף1/| R.02`<  H0]Xy*T2H8@v;/Dg$8x%x0?QyuD`yMNO@~I/yHW ./d! N hwQ5_Ġ<;!0`C蝊"c QpJI,M ,/P#`U*?h> QHC! 0`>q100$x!`-B8\ B]fvI"Zoe 0B W]TXh5`!}s|^V(a Qz'ʀ*uz@/ǐ)(D@;+pe$~@`G8`@x0  b s@ PG`p`:ĀAC ϧîx/b]Ƀ!c=8A+` x< Xʺ O[b$x`ϏU2 /j0^  VՆ,@ uWq<`Q#|z+0~uADAU򌟻FJMP0 |^?~$/:x& ` '$X`| a|T?LLA|0a XPol \JUA[c"^r+,O@,}?UJ'իP?Fa`;@D!)a4C||>wK@eܗ9%_/+g(0% @ T}}vՅ><`<{:lf PAUKˮuWBbC_FJd ,n5$?T%z˚#o< UBTuDZ := ?HU\^=4ʘX J KQ{~ }Z= =dA@Pּ B{Zj GĻpEs>_r{Vx \9ft- 0wЊ() C$м/Q< '{둁Rap/ap*[bHA(U@^rS PP`~ 00=BQpA\3`!  zI/yVRr 1,6 @@@03xE<`s?<`s? hfp%  =`}Rl,}A%/ڨ#b`un @xׄ `@>Gn LK0`q x 0_CQꓟ(@ q&680`j%oըSmc%| X(w<\#Ok8z|Ap*T^@xM-`< Oѡ0` ǪWM 3H]xz?| (.<À`DrڰaA/+#  0H|:_>v_yʍ!%`*zoĩ$ JFUb\KbϨ0}x 6.= Ճ 0OFX |˧x_ BW@}4 WPr%QxB.P `eQTX5@v  KӃ/|`G>*_,ER9?ƀD@*9 5AxyCX9@0 +:/b0 b~? ꄥc+U#AK [< 5 Kꏪ $ a$rTxz<[bGX=p yQpz_xXL*P"H.c@1JT` p0_|"/l ǁGܤ@V]s`BH|2"Rw]g֘ L!V=Cˆ`~AEö/r1ekL0z^G%TCy0@W`ˮqq0vU @R$)G `<4!Q H$E0 Xs )"EFʢbTPRAڠ{FX@%]P;%U ąJfvG҂xӈ@KF}R`1DB|=_X,h0` IGv2 Tp BOȤA@yP1. /)@B BAsY01/]`B%CT ^$x$ jOQ  ZAXCapl4HGB@ pW j0`=P^]=<~1P1g*< T 8X%+:h8 g@ Ua ./UvU$aP v@> ppBA 0 '|? Eb) !(K~/f%ERG_`(o`GM  ^|V00`5p z ǾsO!h LXP!;HNSC@@@. 0{ 0{hC@@@@0 `5TP is˄)XUUܲL _QH$Y}OM\|R$ 0 @xsGJ9ɀV\?TJ`0 *2 JrkҸJRP<0HG!00w% z^֤`K,`8x0"Yp0*I7@X=ueEN+P@*Ł<>/x +r8xCDm@ GoS(Pl `BBz $xl*EC@kz`:uUI0?(IV?D@;(*U xHao˿gM" @x>*PA.`A0`%@()XKFahH@CE " JlpP0yPoص<_A.˫G x1 x1!@@@@olA-_OWaXXC+ujr$qH0HX敱R9)J. (ˠ۠ʋz(4>UT T ʺDh r0^0`" o](L?=-@``8U91 ʯU`;G|wf BF pf Zp41P$ *uR .t%.9(`Yx^m p0/*/ `;r@zG%d ` cRP M/|;b8LaA (g S@oy𤜸C>$W +U|a&5D%!.-cIA$V !?{M WܢUDQt˕+/U$@ *z?4 P(S8 {$|jGPtt(%0! ?@L@b=@L@b=f `<\\t0 `<IE}DؤH0Uem  @`xZcĐ@HV{4AgF`x _C/E\f83$R \7|H00GC]GaۢJhB:|$* _dz+M=T?VJTPC(xP|@Hf)CǀRfx0SإcbHT 5Zy<"+ v{t~>P H0E[903%P_@,. =__U7/.ߏU3&!,v[cS )nQ0,W,N|$ T$ x0 *>7i0? yjwYB_ʕ4  $%=$ OH/6N @"E!Hߗ-!bX( 0_}Q|?09, x jR`60JV?7 0``|9W"qC~ >QN${a+>eyV=B *VȦ}  \$(K%|]w(d'F]Aݚ,maèC"<xITh0^0>;b G Ł(X;KĨ?U^?UآDb4!x}f%A%`+_+Q@\hIW ȢZ5=BRG2<"i G9i G943 @@@ `~b%Ƞ RAx,=@,x!Gj``h{pĐ`KpD:3|<(}CnWm-D <<Po +y0@y _}e ?T?LT䠩$J W `w6(kSʄHL  KP!MGp,P"0`G@PqN14Tr ir0"@e_QU FA>E盺aIV H(KB:?$xP0@Ka)+I@,\JH   fO@FL$B_j. |~ĵVyG % HuʁUf |(B@ʇ~cPd 0!n3 @@@t`4#`4#C@@@@` ?bd@p` }lЁ`~<  .a<00` `0#C+ T2$;DJ >/ KZP`;DĨ?/ "0` x0 >s,A`:`:5ȪR㚕^1P+E@ 0>@.W~ 8$X0V* Gh  }H0ȣS@{%(%'qrq`A آ}_<% 0v>g@yp0KqqwP7X6A,|^K)p|uG`;VgWQT$ITvh:BPPt ԃ_./ڞ` ~<Z@wDB_⏲#{G HH!X^\ 7g 04  PT\<ʮ=`|WH/{H` @9HC<&xf4 0BP0<]/= pUQ3 H/%J"Ń2`<>.pUT "+;@ JS w  K.̉4 H(Pr0H8@g DB'W%ˀz(`0"OՀw}28`G3ŀBT壮6W W H*|pH8 Q}A`8eF_ 3LB- B\GN@^_j ď{]̤d?@4AH=WT^>"}Bv^o1jZ%_{+7RЄPzxT|8|]*/jMN%0DyX0@*1R3[)Cu!(0Rߪ8!E]&;@% Yvw͌[T^65!=0 CTB;U (Đ`~{XZl Ɏ.Q,HGOPPpA !Pt0*IV4K 9@>. ܮ+/RJFf%!zifD%VFcN8@rˤjѐؔ!z\=8} xI#(y ]_`0PJ w0`"08`LvKDb#`<P BFt(0`>AwOs/^kLK@f<"i G9i G943 @@@02/H0 H8B.ٹͧz%z/g: զ9: @B>.@,'/:cz^c2>+}VwjU(xw;>`A PBG0ɘ }Rxc}"_%ED=!d_3u,?@_]h<`f v稊Ѐ8| mSAJWGEu.`C.*+v@"`WQ{8qp p0_AvR`~<_'px˧)rP{X| (%A=}:(0}y !jr'$ !Z&R*$@~Sp R w%G.A j rҰ`KOH7"zA(H 2ꪤwVyOnɘ0!vw8sr 8`9ՉCY xKW~^> #80ZD@4fQ0 x|$!P{ h!% (Y4J^ӳ@xP O^}Rlx(D匶B@;ʋ0TJa0 *G6$Kڂ60xX((RX %KU x3 @@@t`4#`4#C@@@@` ?I{Ab$jQ ւVp1$A!llhqp0X0HPaA7d > !xGQrrS !P0?:J@ zC y#jGAMȘ_(I~`|ڻ,rxh8 0c|JQ__O] arF&vԼa1,BCڠCTeYA@ CSB{T4}y@!@`;A ^K`xIRxry ).@o<Ƭ?@`jnV 0W))!x0Rb_kH$ 0%RKՃfr@" *px>ʧ   B4HCV<[ C?{ R0  p`}Ā`)~|0AA>^%|L BD`9(_xSwѧ~V nꢁ.JXIK3H.> IQ#&tx x/@9ʁ>iXb}9> ?  (`@7~ | O@7 \[ 0b}8˿ Ǜ1>9€>aB9 (h@7,7EXP1>o `@75X0`n* %q`9`¥@0!#! @C Cb@ 0L0`8O9V$Ps?t%TH~懾t ߫ CՁc`a8ǰP `‚}xj+R M$\ 04ʁx( ?$ 3OI>h~0| O@7P`5 ?? (h07P`5 ? (h07P`5 ? (h07P`5 ? (h07P`5 ? (h07P`5 Ra;A 3l` `z 0B xġ%H0!|W sm 3UH0 T  C4DMǿ[*V>;Q0`:8U V%,l&`;ǣf8!z  [bW˿yW$牀_F.ohpb`DT$U*\}x ! WQ+.@`YK;QMʙ}\T>SlC-CP|dn 0Jx{Ā$)FPБx_Ki @L~>~W龎?_p`< ˇ>/T })Շ4Pp`}`0@.PX+E%Ua|tD_|I?U{DADyL4C =BI ,ߏ}=!_M'?O<F?V=y0 A!MYs0<`~DsF` ?C@@@. 0{ 0{hC@@@@0?4IH@} $J B=㌨0w!0%F5e&d~ 8 q/rH Atٻ o^ ,⮒耀> xı?`e;"P\_A?G,L `jḾJX#Gc)P%FWz/KJP (V( TH0x>:.BNrue!+!D`r<Ճ<0}uOTm0\>KU;^+R 0%O 0Y( Z0ry `8P*`\`98ǃw)n ک3 IA jDʊP`:Ā`}V :f| tG0DRvH]0B]<P5OdTw760g`x$ x?VLM-x~</P:p`BWJ@ 0V ` A|V9K K%b .@Q@}c`%P>AV 0T#_l//B6tT$*VH aATa80@ >E>HZ^TP4b2[" y@`lf(7D҃()ߔց`;h0bH _f*Z-L_T|ƄZ`~\$RG I!C}PƉ>\=J]U#c˔W&a꺣08@AE V?4e>20K*?U5M0` p7# ~g,rx0` eB'"%#6+x~{1s҈8`ERbR0_QG e#q"}/X!`߁ B~a!.-L&,~?>sFeHV_VT0O^1, a Kޥry\ `Հ@`9Z F A/0-L<6X VMm\IeJqxK.]GIi`9oGQH%k z %p`BAvtUp@%ʄ^jrw?xHPTU|B[TEՀQ0P ]Z`<<ZP 7\` Ďm`Q3v`<0 HBaA.@p mbTթ%!AqwA @@@03xE<`s?<`s? hf 8A`t`;DxH /,Gƒ 0=WĊ H <T ?,`r@`<0 ~ A O"+QUAI8{~*@`ĕe]?0@ xJU>{|%R QATED `S(`%p bX^_?TO< ( ,% =W(JV|T$o.(G:q/[0WV^:zCUs*PcJ$ u`V<r0?! X0^Uw\7+5D+P\?<)8P\:̠u /4?VzH0 BVP0мǣ 0"B@ TKGA.ɼ% 0 TĨxh9PBSU`9Ā "2i98  LU V?VZ?1KlHh0wD "0`r?, `<v+?HYh?Q$!xK ʿg70 %U_wuPfp03ꄢ x``34uEGW>=Vd0 ^@>!@`Cxk-r`BTFէ|ڸ=UwA! (`B(|%PH p=7|?`~Uʦ_9KGU$OT ?9AEr0``ADU)F?~T\?WTp@0c~ Gz`` Tσ~?k{äh]DZ#cBERtW/7$Ki3 @@@0] 0a0# 0a0#f@<BxEV=+P%+>S˹H.a >{À.&At`%gyaxP`A ?> E`<`8P_F i`C +( TQUoH>m@\_e7N`;+j Jȅv`Aϗo?:%Gף1/| R.02`<  H0]Xy*T2H8@v;/Dg$8x%x0?QyuD`yMNO@~I/yHW ./d! N hwQ5_Ġ<;!0`C蝊"c QpJI,M ,/P#`U*?h> QHC! 0`>q100$x!`-B8\ B]fvI"Zoe 0B W]TXh5`!}s|^V(a Qz'ʀ*uz@/ǐ)(D@;+pe$~@`G8`@x0  b s@ PG`p`:ĀAC ϧîx/b]Ƀ!c=8A+` x< Xʺ O[b$x`ϏU2 /j0^  VՆ,@ uWq<`Q#|z+0~uADAU򌟻FJMP0 |^?~$/:x& ` '$X`| a|T?LLA|0a XPol \JUA[c"^r+,O@,}?UJ'իP?Fa`;@D!)a4C||>wK@eܗ9%_/+g(0% @ T}}vՅ><`<{:lf PAUKˮuWBbC_FJd ,n5$?T%z˚#o< UBTuDZ := ?HU\^=4ʘX J KQ{~ }Z= =dA@Pּ B{Zj GĻpEs>_r{Vx \9ft- 0wЊ() C$м/Q< '{둁Rap/ap*[bHA(U@^rS PP`~ 00=BQpA\3`!  zI/yVRr 1,6 @@@03xE<`s?<`s? hfp%  =`}Rl,}A%/ڨ#b`un @xׄ `@>Gn LK0`q x 0_CQꓟ(@ q&680`j%oըSmc%| X(w<\#Ok8z|Ap*T^@xM-`< Oѡ0` ǪWM 3H]xz?| (.<À`DrڰaA/+#  0H|:_>v_yʍ!%`*zoĩ$ JFUb\KbϨ0}x 6.= Ճ 0OFX |˧x_ BW@}4 WPr%QxB.P `eQTX5@v  KӃ/|`G>*_,ER9?ƀD@*9 5AxyCX9@0 +:/b0 b~? ꄥc+U#AK [< 5 Kꏪ $ a$rTxz<[bGX=p yQpz_xXL*P"H.c@1JT` p0_|"/l ǁGܤ@V]s`BH|2"Rw]g֘ L!V=Cˆ`~AEö/r1ekL0z^G%TCy0@W`ˮqq0vU @R$)G `<4!Q H$E0 Xs )"EFʢbTPRAڠ{FX@%]P;%U ąJfvG҂xӈ@KF}R`1DB|=_X,h0` IGv2 Tp BOȤA@yP1. /)@B BAsY01/]`B%CT ^$x$ jOQ  ZAXCapl4HGB@ pW j0`=P^]=<~1P1g*< T 8X%+:h8 g@ Ua ./UvU$aP v@> ppBA 0 '|? Eb) !(K~/f%ERG_`(o`GM  ^|V00`5p z ǾsO!h LXP!;HNSC@@@. 0{ 0{hC@@@@0 `5TP is˄)XUUܲL _QH$Y}OM\|R$ 0 @xsGJ9ɀV\?TJ`0 *2 JrkҸJRP<0HG!00w% z^֤`K,`8x0"Yp0*I7@X=ueEN+P@*Ł<>/x +r8xCDm@ GoS(Pl `BBz $xl*EC@kz`:uUI0?(WK(4%BZД<| U!0`0`A!(σUN`p!($l`+) `<ĺ'IwـUK\?@% "TQpXYX͇. T|^ h?|]kr8Z X^ g~A$@)`CD(d( Bp@Xu|ˉ|I#@^?K‘]O! `: Qv0(_\QC`

IV?D@;(*U xHao˿gM" @x>*PA.`A0`%@()XKFahH@CE " JlpP0yPoص<_A.˫G x1 x1!@@@@olA-_OWaXXC+ujr$qH0HX敱R9)J. (ˠ۠ʋz(4BVVcY@p`˕)z( hAT %*p<`;AT/jD.%5PBGU aQZ"6+zL@_UZ(QML@| ?= 0q!sc_m> p0?vն/A S i-PP)(KU`;|G.!!>W҅(N*EɤDQA!.R>^pX`}Wp`BbH.`8IZ`[ Dž0v?Y< @x?:}U`BaA`}/ِCe ?}1ʄ\ tWHpDЃ(_k=*d8WZp4 4ꆄSJP!(J@0@w*} .l Gv20P!_wPe_!y>%.9(`Yx^m p0/*/ `;r@zG%d ` cRP M/|;b8LaA (g S@oy𤜸C>$W +U|a&5D%!.-cIA$V !?{M WܢUDQt˕+/U$@ *z?4 P(S8 {$|jGPtt(%0! ?@L@b=@L@b=f `<\\t0 `<IE}DؤH0Uem  @`xZcĐ@HV{4AgF`x _C/E\f83$R \7|H00GC]GaۢJhB:|$* _dz+M=`~Z|_{+SA |D@l?}! J.4ywU fHAt@W& "+0@!!%}n/Tϰ0* x!K6s8Bb)$TD˵T@q.N" hX7Gc^>UL8 $^>ճs00\ {}!0Uڬ+`+TyZ-Liy}>̘\q%QhgOH@C* 3x?5 oTH@$)Pv!-T*fǀJ!/dbJp ӐAQyqt @D]K[ۆ$m'IC" xy1,/@x}0J @g%jgsA? 0``|9W"qCK+ĘO 2P&%ʕ%rlf@,!IPE o8p]5W;'rAĭP\͟#0@bر HՉ|CYx0H0>uj FA +B8f, G0 }8 ^%Ab0 &S 6( (C XZ0"=@/J^?VE֡ Eb9! ?@L@b=@L@b=4! ?f yKC.EX0.WU` @8T^aj` z>T߃DEc&$?.R_;!ћ$C,pzn9o %}P\?`e}ϨQ[HV , c,`>P"b7%N$P` OKUCXt`.T$PG`_SbX@ l;`y`0XR *?{q`;K/.ʨZ2 B.V^< J`B@8G_j/$ʁ]yH1_J`0P0A| HP{2x2a *WA@0 UQǀ]W[?@`(H.J @A(K k  g>US M/P_AW`?V!|]GuC# < Cʤ"@?kN`9(ˋjU0vP|>/o6Ä$J0ZPx0=/UJ<$c| j#7/ y$|H0J'uED/6).Ha !%`yT5jD}:*~ C Q(IMC jcB혣(:AJ.[ӝ[Lz|J*.:ğT_ح^00@y(v3 !s-O^KՄ2@y0JXQ(H \c `~GKUl{`~)$R OJ>! JjCrS CC1(KxP` ^` ?0``G0``G! ?  @@@0 1E2 80>h@p0?k@_ԗT`@0!AIUpxxBJC{E %-SP(0OT\V}HߪP#+Ɉ^%+C.aT!Bavj*m;@0 )Fj$ A, V#1`;AOKT} ^RStĊ% @qC`<}  7U`ǷAPI@`<`}Ըꋕ`U+XC K sw9Z h0@ BH0C`|`UuqJ/K˕" B `}Ŀ+?r,+Mo#HUU?>e$dQ@ j=􉎒Տ 8A~B\tO < H }ݠt `;:+NJA E/T%I>:ʣjj @0Ox3m(ê_$WD;X\ !(vy:jA/HOg0`B?[YҠ`;B/qG# |$J/.F3A  ^ (*.seW0x>`MR$$@y0 !`w3\(A.ڗwt}D鍙K`B$JOMXb x~ n%b0~_Gø*F ¿Xa`BcjC`;TyAPU%}JfD@JT$`\F^/zG$ <01H4ax!۸I&<"i G9i G9f3 @@@0 G_/j `<)0 lp^R6aQw(q`;'?Sf1$tuX$5~?.lSyg2 TK*bx ^?' >r0H8@g DB'W%ˀz(`0"OՀw}28`G3ŀBT壮6W W H*|pH8 Q}A`8eF_ 3LB- B\GN@^_j ď{]̤d?@4AH=WT^>"}Bv^o1jZ%_{+7RЄPzxT|8|]*/jMN%0DyX0@*1R3[)Cu!(0Rߪ8!E]&;@% Yvw͌[T^65!=0 CTB;U (Đ`~{XZl Ɏ.Q,HGOPPpA !Pt0*IV4K 9@>. ܮ+/RJFf%!zifD%VFcN8@rˤjѐؔ!z\=8} xI#(y ]_`0PJ w0`"08`LvKDb#`<P BFt(0`>AwOs/^kLK@f<"i G9i G943 @@@02/H0 H8B.ٹͧz%z/g: զ9: @B>.@,'/:cz^c2>+}VwjU(xw;>`A PBG0ɘ }Rxc}"_%ED=!d_3u,?@_]h<`f v稊Ѐ8| mSAJWGEu.`C.*+v@"`WQ{8qp p0_AvR`~<_'px˧)rP{X| (%A=}:(0}y !jr'$ !Z&R*$@~Sp R w%G.A j rҰ`KOH7"zA(H 2ꪤwVyOnɘ0!vw8sr 8`9ՉCY xKW~^> #80ZD@4fQ0 x|$!P{ h!% (Y4J^ӳ@xP O^}Rlx(D匶B@;ʋ0TJa0 *G6$Kڂ60xX((RX %KU x3 @@@t`4#`4#C@@@@` ?I{Ab$jQ ւVp1$A!llhqp0X0HPaA7d > !xGQrrS !P0?:J@ zC y#jGAMȘ_(I~`|ڻ,rxh8 0c|JQ__O] arF&vԼa1,BCڠCTeYA@ CSB{T4}y@!@`;A ^K`xIRxry ).@o<Ƭ?@`jnV 0W))!x0Rb_kH$ 0%RKՃfr@" *px>ʧ   B4HCV<[ C?{ R0  p`}Ā`)~|0AA>^%|L BD`9(_xSwѧ~V nꢁ.JXIK3H.> IQ#&tx x/'~$^~ 0! p 0†sO'P`5 _|`6 ?@_s>aB9 (h@70 P`5 \ 0| OI^ 0.VRB80^?h >{ s^AoA@_ÁˁOhP``b~sv0r {h0"P9aAāp}T/s`U0}T 0%U`ցs/2s`7 H 7@7W9P1?@9 :Д?$ cFs> />0ޡ u``0@1> oˋ_Xz+UZIEXP1>o0(k >'EXP1>`o0(k >'EXP1>`o0(k >'EXP1>`o0(k >'EXP1>`o0(k >'0vg0 80?%B@0>` @!BJ`B! 04! ?f^)υ 0P`<(*yX%yV@^ ~`7 ' K?\SX| H0ޟQ@%7Qx(>*=(dh d/L%yE!/5^/~ox{8`0#hH!\>fi!`U 2bQ|m, p a>:94]5R(gsK+lÂ@wpT_S[B0V^40t˂T ˄.1tLI}!Oр: `}5F)PI2H0 Qh hH., ]pG%w0u  j/AV:F搁Xh0@`/ %޲W> ˋcCOÑ`x_|:@z%+TG/X9"QdjA` #`;Uv@8t 0}G~Vȱ~@;S $++ OU8| x(GZ@dfr0yWKH;/mSgA\lWq, h0?C1<QB4̘:a蕢Z6tOwǑP"I8~$@`00D4?BP$|!`y p! j}1MWA0M _K*d0b0ĶAB ?2ap @~.RT\>DW*0HU9zH>%/̀\,.< Bu$Mx/8 `Ltʂ|! ?f<"i G9i G943 @@@`;./1_KW r~.ey!Ypy`xŀv, vc/鶏S!Qp,HbՈ00 W|d}K6j2F@`ĕbX*uwe~%~' 0!BG~2( >S5EPIlX:d⺪_ {/`1DkvX^|p a0 ߪ/ TDxMA5@=ks`v 0%r0ߎ"<$ x0 /oPGCUv$ hC|" x0@ *"Et A"*R_  ?DeQqtp{@X0@tğ Q]Vl?<`:Ā`A?_ԈAIV `zJYo%rk?"R }}/?h|  ):=ҕe`yT0<p ?y_>W)}KC@GXLtdվ J0 0 ?6!Y?@$JFzוJI\80bA%\# 5c?C`$@h,|K"P]q AI*|>3 \Yb.=9UFKW@}1( pAڨz(Q` #nH  7󌃍e*|; 0J}PbV\aP=|03h8_#iA |@?\EZɘI mgA6@0Tp`;A"8BGdlJW+Ip!UgTsҐ+ !Ġ,`hA./ҏhX@@jl` A`;U>JĴѣ`;ďxHV? ߪ=Q)\ 0@0 hL ~0=Th8xKx}Mb% $yTvhVDva ui>ҁ$^`~g~y@(GwR00|%F4H `AavyGP!AZ]". 8QP=T:Mf8 `B5 y,} =``G='ש2V%?`?m4D(1x@BB/#P~]䘥*cۡ _*0_@}R4?2`6NJ'/_G{;1P`<@83Tڀ(CU ߳#hJT]Zʏ}g>rA/a`G8JiAqzF `(A7>pT+4> _8)MU3 @@@t`4#`4#C@@@@` ? Xʎ0( `(K⭪iJ.= hJl _&f@w _BP43[$2tI*7 mm 4A <>@JP` NA4{0oc߫Nނ9,hCP pATA8)F=OBX/Z )T/G^ ap0`~|_> I.<:#T`;qL> # 0!eꁂ g˕ecE!B?OGgAA!3x?m(&y*a)8 h0!?AXx|mjX@0>e!('pT%EʉˁFA?*[^` JRmۤ x _N4H\$=|!jjV;0PĨ Z#H/aIA Jt!Z^h KT`P|±/wǀ,Q]_ Eʪ */'~80+D>N>Q x0ulkF,~?U5) TNGz+JJV `0*\?+#AP+SrwN xE~Y^Q(V @^% d: Aw`8_QΠu@?[(`UįUzB`3 @@@t`4#`4#C@@@@` ?p?@`;s*8D<^3`:,BT{u'`A(XO xJX 0 ␇DBA g!XzyKu9"xA`qpA|2FB(o@QW>˄sKcE/BV>A @.RD!QfE0%WBz%>|!yYxS#ʦh V@4 `K tx0 Z@J 0"B@ t` Ja%||tc `<%Q+c~"ʃ'@`;%`_UI'jİ>xGUp0x ?@H]j} /ĪJՁweŁ`|\K!m='Ap, v_HoԜ j}/: P0BP0 R{S䢅+,bSWG(|.羨  0H0"DRX31 JJ(y^0!` ]jZ-:|T/Yx]꨹Vg0>Q|4b` |$Hruo&"p0Gߥ`.vPsIb03 @@@0] 0a0# 0a0#f  e kB |[5BH0A.%Jjˇ +E"U J<àK:1M>xH | 0İ`B`˿#M+ lv%to_Ӏx *H h0"HƔ=/X~KN2]P0Jj@0HS~)g` x0!c "i`CA@UDp`pNG G OBtwdz*^/RحFt"MZ>\]Y\P p$}XIl g`0>aW Q0 BxMF\=T KV1P A OO;y /\KY?=׺ۓ` +=aebXCS:0bPe@@}GTXǬxGAUoU3וJ ?.K({YxD{:ȹtK=OK <^# 00_8~^ex?S$ >V\jzfN4߃ V}Rof^ Z%lh~%@%sUB=V7\đ,I-xG}, z8B/kCS`+ %<`ޞ9$.*/;|%u @`<Đ 1#샥b"3$<$W/L/M"! ?f<"i G9i G943!*įe,HJ5Rϕ[ yxb|Z `;9_GxDS@y(0@x}3I 0`+.y]WQX}#]bu@~EC.J.EC Hi%Ja|.W/ǜp2_Ղ pz)WUWZ4q0H`A՗)5TD p_ ^J0B2`^?`x2U5P0@ ]H xC"+A G/4 OTYX~|`d p\ qrp{;AB|Yy=ڷ.!'A.TJ4#` Kϫ02r`0K@Ģ"0 |1%6A! p|)j5 P^ $y %X0|?R``BTJz{h ^ `Qʧ<`U p^ʄ LZQf&P`D!P*/Y5#*lV_` TP0>gV "V$-X!yV (./UԼ?T 1X!A=U(KAO+UbV\ x0b\5?8؍7y0`0`wx}>Gx>V \QZx?UG b8XZ@!逃@;nxyP`\ %AڎA :i0`I`;AlH֕I dJ {e5%C.67 * ֗(|jBU"=*zKny_\&nI` +Sc`P,D  2>ˁ@zttD HBB{.z;# AW{t.yP!d4CG`}B0@ JUR`p0`<U*ǿ M8% #`|pP`)pC%xAW 10 ¡/% A8~U-ZH0~Ё V>JG]m,{0`~}_!DZJ)>36 _VIDSzSOu`KV5HHVڮx0ABS}Fu !|%P?pdhA,Icc8% 7K@c 1P0^꧷@WGX(|2|lH8@u1,p$__tO' )Y }'ǃ\<"XW%@>C>`<@.aR霞 C0`YA(l 9|BP0>vH#E *1$BWS\.80u>ʀ"KE//`B<˕'?H#.&/A> ~\\^ 0"/.@0B qr2EX0_j p@"(pf<"i G9i G9f@/䆀@0*3`>D%ǀk+*C p@!I)p0Aw|'Wv]B"`ď^Sn6y!{~ 5[`Y>\ i~|Uނwx ?0? /U>D`ɘ0H`;>õ1a(K0!^OlPO|`0x|f  )RB|2sUu[?;.|\c |AMĐ`UW`|F\0@w%}4Ceꇲ!@ +?TnE<?v*T?g~R3tX UUK/lW$ #(0_0Jf (@ eĦZ$U+]ի\=SȆ#@ ``{U7ܵ@$!yBNT= 1(JժUh0`VaĀ> @9R<t||UGA Č#.;H a)LsE0`:r\O.>Q8vx<};`XT| 0@􃨐 ȨPhBJL `;g* ^` #p0P~D{E+|Ѕ$%+0pGXm˂$e8B0>X0CCX\]گk`@P $`Aԗ7AU `\! z]! ?@L@b=@L@b=4! ?Hy0%g5Yz1q$ G0 焵Jǥ,' %یU*hB+V8H:=Ծ]Ƀ. ~V+t6L "Aw˯ *G+/EB${wY3q|Lh TuŠ>  \. 4^rar`=.%`Cvq0WGB_,izY`4 B|T>0`FS,@z4>֏zcJ0<\V : X` *vT{U> 6|GlQ !pCBҋ`l_d3`W3 .x-]/ɸ :A(ޣq@.T^\tEp`!WՃ !zq `<IT p0aQ/B>`}<j| _>''P`B`0@s AX!,%p_X!~ע<#Pq?@>0@R>]ƕ 0??ҡ84!Q `yy'ԧs eBHV$q!P)p-w50``G0``G! ? ~GUʽoBP V])Ѹ0vp;Cʫe#(x$N+ *@BɸR~?Q8P``(]-<q(@HC} BP>: mArp7?ԿO >G= D%X`,DEY *A?PUCA*UxOΪjU$N+P9 ۃ^$}Y0`<@6`AUQQ8$; >R}GT`0AXU޾xӓ@T|K ?ZJ``9KIKBH@]/FHP)L281.$@< $/%ty@(l`9<@9G;Sр꧄u=t` P_;y2燊/ ͳ *ꪸ:Wq4wpBpEVʁIFNtJJu_jsY(H!8J(c@p!Td֩` /#ʿ~@ p> <.}0yX!Jx%ﰵЂYp!L\ _}^>  ~.v1(}" @{>~M:P<>w^/*+ .@:),%+ JJ@<7U'# "E.ˀŊRq`$ WXHĥS,)/pK` />)ڲt'ɕ6LWgxKQS8OW@Ux=ͭ00  !R֥8uU*5H&/.Sl _p_ ;`y`X(yπOw"H(B  0C@@@. 0{ 0{f i`7AJ=`70 !; /r:@/  .倀ZW!x A T.2&8@wpr|P0RT,s`y G6 0w>%*EP<0|>P@x #yxacwǥ&@B0!6"Qį%T" zȣ  =+r ۡw64u R y_ڬ~{߳@<}@A0_ 6]XQ`/gY%f+P>a`<2J< .X@0H =.Oپz-6X .s>v Oǡl Ì!O2r~`JB0%v|J <f,"L̠vT]рb _ʋǍ C^ `;\]b|! J:!$gϴ\#e0Sҥ8] 0a0# 0a0#` ?a0P0 RPp`:/@=~; }_ÃļyH0yPCg̰I Uo /k`04!FApBT :oE'.($r3ILn3"]/lAD$ы *ݠlxCN 5HGτ  XFl >U}WQ4XbG"H(P?IE,Ia .h ? `*( bO2mS00qYu- σ?S'wAIW 5G!~ H hJ$+]}uHd>K.>$V摯 04u}h btͭ@`8B pH~Pq?  .:e"//;tx .@DsXA!Nr-XBz,!l?x!̩0 |?R;f1/r$))ζqPpK/ f@ 0B@ z~` X߾  R=VN=v!0``G0``Gf3 @@@0 AXq/ E{!x d`v`R 聀`}=x? UU+. #U`_'u@oO+Q@:Df 8`0!o~Q, #e OT\ *5f`6^Jp Kj<<Dv '0APu2GӖ$?`-qr-7йRh$/ԧBt;xD`~ (?|;/9a|=(*:P*I` ( 0`Av !(HGU~~eJ$#1 )}'>Qx y |UHT/!.|?O*js L!tVU*~xC$ _KWy'Z?B?ˇ)|\7+T$~S/;P!^^ZjErA(/&* } %$ T%@;}WGGnXK}PuYzMvM>WTl4@zP0@ &P+kě0jUFє0'v Uqsg` h+`xxP?Gp0K@?X;{ۃ@/8Ѓ0bA.jO6\$5JRd~u9`g  @@@t`4#`4#C@@@@` ?fx0*pwh cv0 /J譮`0"Uõ 8"4K0`<*8`;V oF& J"?*0H 43DK4h?|IJ߻S7_E 3,#Ɂ %oժVN}})9(0/VEʡ|WZ5yQD}媄Er'\DX9^P G?՗*Q`; D0`hC ywg(T SDPQx]'Sg?%:h0wā`% u1\x#b ^%`x\LHإUL2 uTfLQ)U*UG1X@,"h 'WDX%,C*4RX&hub GJD=?3x?ʕ}'B'm t?(01 0!X/vXx`:#Jvm0Ѐ>(W_%F.S0{hfP  T|`z+\0 [ |X=!P`<}<^X_]s"2 ЄH0^ʕjlۘ0~D.+0!"DU[! IVAh0~# đ, >./x _Ɠ !*[nτ_? P` @.(! >X 0uHC/ 32 @@@0] 0a0# 0a0#` ?e+p@ `;~Ӂ``:Ĩ0K.荼^gǃ%y`BUB P5JS^Ur& EZ@^^>t{XdpA@@H` ԃBB(ı`_X@ܛ4*⿗X) ?D.S|=ݑy.*x,U!j)Q谒@ !R\=V =V?A/| ` 0a\f 00H,T$UzTC"\R:J<}3IVFHOOm`!xݐKro9hKŁUiEiY4 0PB@! 0GGpBH o 0! ?@L@b=@L@b=:-<:<c#[S_fOUB8H5+kXGkXEx\I\` ?YĔpP/0'T֚h{x)%N՟9O"9ܢb t\l:!Pw6M@=꺭E xG~QII\\#R ,*(LZR!|?Pƴ[p0H` ?f @@@03J&^"r#Q O_DE`60Ͻb]Xo!&Nǣ= 2%s$!bBi)ȚD׷UMsoF'`*00!<: /5;wVQ/? zo!\6#N,z\HWGC+& @@@03(f` ?U[U=)B"AW,Ry]"<)࠽AVW畗DJLOV[8ey a!c A{3M[NZ Icch5 03zcqLxGXA~&xUqtd_飼q am_D#/V/q|83 @@@0 @@@03\L3+p!!i0S >@8B^F(^):G2oᛙs.`d"m`~1W +SMx(m{`ZdNsXhAGlh8VWRc/taf` ?f` ?ȴ!q3f7R~ef2شFrRg̫2'ump<0pSu_X";6ՀGq5+`lW/J`Zx/p?ujf]Pq0DԫR5̓ +/T]iH/ěRXp'A{š0yoy/V3پQ GIঙ8P_ ~BJTx)18@C4%}#~3 @@@030x(3$~l6@^aX8o3!~KĐCPx]vt*xvp!u2<01 4KVee\~9@"À63 65q8S_D%vl3̽RgGPJ ᐏC2aLb-Ē]0$nÆ` @?!f(fWEdizޞHMcU@AӏPfKto>͸RDndk,lS?8캢Qt+/$K˹S6WS6MR;T$Z$GQ$+Ȕ6}G/Ch9yl5` ?fu'uI%Ά@33y!U5W_B|0;nf5 Z&x NpS1 c|t>pC%=C<P?p }3˞h̚iH?9Iyp?_ˠ(P { @@@0t ? zM@(,1 a7 Ԏ`/ 0c2E;xWFMd)5_YAAAC{<=ESuCHShI w3h^"8K0Q$FQbZC+f(fM= }ᛑ,|`-02 ]> ɠpq={Qgɿ:n ?NE '<)BS4&?m303 @@@K`g`8S8f^ ()l<'[)2Ԣ' ``+Ro..Ux!l;?*m#to Mw)7DbͧBG>ã|j# }E0303 @@@05ym"xZ;ouQ[2͆ܜCSh{2HڣћAYdf>UPIW}!fiX(wzɓ%.ҧYܴdlwv7u$31N|ތB7ƃ6EsNc\xfu` ?(f` ?fQ >.W9>?TН\p@>;ɕ;SP@2 `8A(v:uU}ղ#ow>xfU#HGXP+]R6|)jUSՉ/e/=FDz+bC5Zbqff` ?))6~v((|1*%8q1- {:r+je$f zq}jFܳIpʖYx8G4|"q!G fұ :p")Zf/ 7,7C4G! a@ǪmEC/a&(4a͆` ?f` ?f` ?EI83*C#b'CC-߱dM+%Pc5V3}6[:Q{'~FF3pq_)a?GhJRU; ݁ޥЩvI03:s,6}\$% 0]Gc"YwGߛP{I xO |.磂w|⍇(iF#/gJ"x%P ډ16%ǯ*h`CD.o:m)K^^:ecMJCiJ F$u\3$*XOR"zLph2f` ?` ?fTԔdK"wԈUAL)>듂4>7JPQ% R=c+@(//UȎ0!|7] 0?@W L%?/V:~_>=ZcF! sZ[&ϫVo]|5™̃P}qeJO֫3 @@@0(f` ?Q%U}MS=a8@hj1{cd}_0jC:=X|)G|wi^VJjx #ʇm,anjQSq'4vXlr.f`8@Er =vg dM:'ZW_`#+J`yb=AF G C/x򽦆c_F6R W1oOs#03 @@@3 @@@0axMwGFZ#`y!~%@;|0ڐ`0)${Λ a̼Oz:O <2wGT z~5?X1WX !{<8hUNtƉmP^2z6E38T\ S5JA m?L9JYsAA` ?ff` ?#r)!w|#a// :ѽsyHGx0`IzGt8nfX (?JP֙%ॻ%8_ԹERL?tv?Hd8(BYQsFxW$7ȷи@N<\#s 03 @@@(f$1qE[`haߏ ?;)]B1|xёWy=Y?'WV% ~Ep\c 9:{ JH8AFGI Pa%UϨ )W uNo\[_z/T8S4\ajU=}Pq7>SE$ví:1Of` ?` ?eyN/.糿ZCS hNYYQ, GPN0Ծ~gY ™/ƞ% Cbɺ2>)Kؼ8L%=U:hEZP0JҁԟPq)ʁ@M2Ճ-P\Bʐ*uO]dž-dϹ`A930g ^&o wrp.m.ރ5Lfl) |2â_ sQLW+=];i'oM4 `;xEP"`$Q8Y.)>ˆy:`οw0xˁHF}V1Do{vB:9?˚\s 03 @@@O nB_åCF3ϯ`wv! >J9 LZZx+N{ɏ Ϲa׼pl38aM`~& +f:*Du"@9s}Iq\' u`8`J؎V xJL#3y(fğyΓ#MD84;fAFjR@b(8`J N_)I҃D3 Xf}sg>0#826h*ewaMxB!]D*`f#/59wW>;hi ]>uVZl)V]tU@G?(fF$ʵK`gwüdWSb$9LГc_J@@GJ@aff` ?Ƃl^W5 Kky#@gu3}p(կp]oR$*W0rBET)8 p>Xp*nqAKFy/ ow\d;v@=gf 7(<=LU0֞`G@0(f` ?f0d殃T 74)P%( +*ov/0?# R}X:f@~1q|h1~o&F 5>\nxhϫ>'2 "]<C_T'fKNwӬ"s݇ixXc̘Ϟ0303 @@@0˜n<3^G9HpG# a Kc.S߃%6+! S&;{ P(t0+ae n3҃H_xD[0$0@=hN1RSD>@8@D8" ci$8n 20'[$\jp;I-%'8` ?` ?fR_8xg sh+R".tFL0;Xwԙ]# d1:_aSSX :wGBVۃ0:;T6GHV2xΦ9L=WֈF,v:u% _ φ` ?f::s)0Տ>v2tlhQ{ &0GGv!x\ss` ?UO] )@8 Tz^iRpx@$)^ʥUՃc PpuLY}(.8Mޞ%|)??7e^^#lZI˜JH X߲P;R> d0nPEԌ`~\ ( (#OLR)x /ݔ^'z-MۛEM|1*G(^XgL; <eIJ=zcw @@@0 @@@0k sLAǿ1ԣv ('GPYqzP oH'F2ՎyXd',VӍ2_L!);puxN{yNwfύT͙1sJxS%Z]Sּ ϱbxJ /ʢ z# S%AJڗTHGS9z*j#%bNA{ᔗp)ثa*yY;g{4e~ "*Bߩ{te (@r7`Bր-Rߟ՗gT7>Hzz8?D㷆` ?!f(f` ?HJ4ss`4[uV;XW{|STSfLR "YŏZ4$E_Z}Əzf3˜pZw ~ҳ Fhz>3×O᤭)>_{mYQT( l);"D5o( b۪E`TH!ApWKEyIUGg!3u6+ q;kDrwt /a*cpCSp @(;\˛U|/0^q,1bvMaJf` ?f` ?S( )63erx{ ` z?Aׁ`p JOwhx)?WˀHVD18M|i?@k=kq!(8υ7y*cPqJ;9O$]x{ c~60z% 6(B7օMǂ(1tJUxځpGO` ?ff8ǾzXG|er> fLMJ]~.R'X,4X(I GGoL pj'}!Ka) Dxjzl(Z:;uPŃ^M>2@Ū^Ƣ^o?, zDH4FQS0!MuoDz{0  f:` 1L` ?f(fKɆ}k:yX^DhPtH.x]蜽:7ӁLhKNJD#|՗dU@,Lm+ti(8_y͝)T` 5X sZW^jRB0:P7Up@t1dࢲ/Ut B*[ע)9L$_T?Dɽ0 .D\ 6&.VW[zEF\)9cf03 @@@3ݗuc,SĒ+$ x2T" z{|)HR?QrVݛ+Xk;)U3,ow_5P)4ĵz_4'n] ҏVNBy- Bt2 `S-qFpp~6 =!ƪE-3N./EQ#AJMGIp) Tt %{Z*D/G:=SHk׃Rf?I{,:ؠeދEĽz-ȪpV6)̳zd3`l)TPRgr10!">7RۄL`5X!*`\%%.6rP`~~jG6>1:yucP*J`epXLf` ?(fEz>:;Rtd^w4Z2V 7~)>JiL NL ͅ(˕Jp(SZh)7bP~>TB=& h0\\? ltFK@<]}_Տwǀ(~T/E}_S@m_! q?(/"P8O|3 @@@3 m9ƞ0#F: S ms6d|P)z@Lnh* T?나@V"APj*M ~S.RM;SQua|0F6vO|)B0ն0l"쫃岒$?(VVXpf` ?#l8SuJ&}?={!d)uj[$2:& hǃs,^R 4ȗ]o{'̶h ״BJm4'4ic:P(˙7W:Wys#*>DAgQF֦?RTfHf(f6S҅xp%+jV@.xQm䂴Cv W `@\ݭ "g x'(47 C0-֣$NJy|~ flL.T^>B4]R6l"(b}M0['x( ՜`+U*RJ:^N$f:?x81LR.;X^pkaLeU68@f|Sf{zArR0EPx) ?w7="UcɞBDڡDoZ6V8M^Ǡg튔|C]ThpTff` ? nXytSn + #bh8_"tf5S*>Bf8eQ*':aE++41r_ pE aؖR`x/V\P{+P>!\t.O*`/`rwh 7@qO)`5vsP-R.E>` ?(f` ?f6 dw2!b}H~yAw?˜Qz9X'')t%0J-DcM`[3G"P!02<"0O4.aM7e`9! ? r, f_QI<>J mt{΁qmW#!Y)7q,5+qlH]=*՘]ފ1pff` ?ZOO 2~/}5Yt1C3\ Dac0Hz=} #ib8 KSG_u_kQhOcPQk1-pKyL)/{F#t~a^3\!uMFar! o™?#ܿ5WGC!Oުjqj 5X<h:ԓjGAo0Ҿ{4}F# jZ^Q8)Tk0z;~+&{02onAf` ?fS~tL$0(u惇 %=WvО<:UZIN"ıa#EmH1`CvŨ_ G Dm"1(SР 8 P;PXBXS FHB&7}BJP |=o?U*Ws3\Ĭ}|8ܽKz)[ôdKyC]DA ^0"FPgK)7F1N}yEM4lѰVqſVة(qdg1A0303 FcTq&šqIUu2jGP!DU,pQ E3IGDp_:M!9 ):$QGR^xܻ*`$QQf83G¡xQ;> GpG;X~I6 | i챟s14\?3vJ<)CGWX`'9Qjaul)W6Hß2Ō8 eW/89"yX)/}ARJAVX=\;/Q>W>3Ɓ)i @@@0(f` ?D?$;躺i8"\a3.0/m `\aul0E g꛽BhU)'ׇʁR0H˩)ʲ*;!HgB6 tb5ENUVxI=/otZc , n_|-EpҿQ/aq/Xlf\c0Uj^[4ԽGQ2ޱoژ[<0}{=BAU0iy0`"ey' !'>#ĵUHr:^& mD?SӃpTA5'm! @@@0 @@@0VxS%}wDaR! d ^jAzO@oO+֛`1!Hk[{yGl|U(_p,g™yz9z"t:G@b94V J- f^YEg+cqF &' dĕ_aZV<ΩWhQ]>2<Ҷ.8Oyֿr3 W n\jZ֬}L3b|f` ?f` ?Z  iA$J@E@ÁLOJW{ +\^]?Gc$J!)BCtm-G."ocF}XTıh逦Sq#'wSv#tÿf6^D<a7s}JZѐS0'T':]%Q..1QiC7ay|.a›3-W;*r`"ɽ )I›@2 |ꛉ)غ{*n wHt~v> ]$ e`EDMgj%ti_mBy{٧gOrf` ?(f@;Ǟi5W*[-]a0a ™Rt#@pGJ ˶51rP:; J#C";;DG͏!,HkL/Ƣ˜xDE@+,$)΃wJlp)|z(ǀe8 j:'ǞQ}U`(vWeÀ|3 {0$۴VTQ{[;$=UXV#Q`EYOae(S|/RSLȾxKFˮ2%^Jn~1( 2a{Pl~|`Xm5AavcXHp|_a%'_G˾)2֜a(?ft;4~)qi3f` ?f~][T;W^}J$//ȧă+q'{gSX([|k8UzC !A n6  NU|Y^VB,)/ K7Cfkh[™JǐxpF灎1`@)DaN난%CAZ5`~zԑ/ʚʦ^ZQZm+m% iY֍[&6Ҍ< dd75 s}e&;fkс$\ŭVy $WmtD.a'lpST4JHN apCqq =>"4W3q? @@@0 @@@0iO7ڢ8=D8uhfV+=j7 4)/r<_j !Uo KS駂`_W8_#0`2`bQp8ʋ& c\ff6_d@.`ҍ67UjyNֺ`(hLaOӟFq_qTZ01>"~&  bjAӛjt|d)5W`)g +NZÏcTuP8ٳt}0zb <X@'FcIW$! J1A*QDncLxCg{ fxS㶘*Ȝ4j"ֶw+F;=ɶ  v pSǗ@#OL.w8M@+cBk$>ևf/м)%ZF.$NMk<& m0f^a,3zS#6 `ax{q8R?>ET{Mw:Rp)^h8@hj\(ypWJSi_p9hFdJb`k5'-[rӻOqs @@@(f-ZS75c4'X$LϬpk3h}X{\]p YS%ixIUͫ̂ј.ct:./ˋh7YT;J"N7O )N37*HO ` ?#z|pScm]!!^)5˜2bL {JU(XXWvw)A qL|asM= @@@0rrp KMؐknĮALFa9~JyrG+S,Jp_Eb恁86N3Q y|Lbeӧ uxzD|R/T#AU&<<#JF ޝtXd=V5 ԤXff` ?z|303uK/`Q)\ -Xfq6jkŸI#8XӓžØOlNl(W>Ĭ9j_ժ$~xv;i6bq02 n#TT"S& QfrWu' a-A6BX(>a]0$8 FΟaL׸5K>T=/i2M_RK`0 A Ɨ+R] GNQЈ f5s\ 'ዃO-)<̾EGUYqMBK>%*?N5NRI@‚& !1;?;Va!H¾0D83 @@@03 @@@0𦞴~[E-R"pyDgkY$=󦩑~΄Ҙ~}La S hxEx33J5Q 8{:KBq@GB0y9Gب|gYPw>.SԱh8JndhwIj`;GGN゛OK$!fFzSތKs4p)q5` ?f(f` ?0Jtt q GjNd) '6!l-<^ojP_.% gH8CU1 p=ei1*Ń]3+z;SAMlk$M?9؟ (4"pl, f~'krQk[p!υIp)^_Cj$:xen~qu6Ȇ&| @A6w ˳WN3 @@@03 @@@0񈱞% Ic_]@{F!7|a) WWU_;/L;Ls"!Kpr@OШQ;sO gΩa)ދ:-\ f+_4Lޒg|Ee8ƂʻGÉ%(mYѢށyzm`!q NK6c!c\Af}VcDhwK;ZFԄ)V< Gj rح]O2; #=;,o[AJK21-Ux 7+Qi Sw U?JFO5ML-w g!DڅM1l7g'gnU-iS8_0VL9:Ӫ<) Zh @@@0 @@@"7S:3cyyz0D#tRvten jPy[L8@w6 hh\ԩthWncJ_Fǂ? d%\`>;_9@zevNCP>S23sB> v%'{]C#6B?϶"'8Ɇ?otgZV80Y;G3 @@@0(fL8 =TLNA`S\3F8p y% >Z^&FI"S/<-^!pK.azyꉢFi 0p8Ԁ%IտA'R%+80@fs Dc㇢ΡSgC?NaM'Di<+_\<۞dz:J`.ScKH \vQ `Jî%> *tf'g{{ς3Fn113AUJ2a0Ĩ P\4 @@@03 @@@03nP6<菙゘09PFLKuDɋ)kmi|DF誥ѣc;`5 ~%Xfp)iWʡ(D@Ɓ8)uG$ W 7ƅ@&.l83 @@@5ꇟcP; }.xJ ïg:|~ӁQ= 6L5s` ?B|Cǎá)b ?2~.m:P@E>7;U9b#(}$L! IF:uXn4)BOf?]U 'W4ty @@@03 @@@MউG#tX F`_o 9g{Ў2w V%RvF0 j< AZQ_Pu_)ְ mz``aJڠgIߧn@S {Iˋ} ?2 tG T~rqS N ?ঠ+G JV a+.Mn7j^cث`_1<6` ?(f 3S!N _. %3ptB<Ly?Vua㛇bj w_mSKL?LuVJ 2fpDxRVY×xS|eO0e`jl$<ѡm 0fN_U R\+Ak#DOHӳN ڔ[G @9# ѓ Q?#n2JKzJO3p` ?f` ?f^+#z#H{0[yBC?C5 7bHc'Oq2?=3=$"LlZ.&Su ?N҉j>vlo&&)0'->$QJ-zPqAovΏQQ )6 ) cpqvc?%maS?8V7O(]_TVIi3 @@@(f^/% ]$2!Pfc㥺@S5n1Zgjoϧ{Sm7ӓmd70n$ņj!Q5yQSei)q  @EӴхC5d2 CǂTJNycr7Hyb35b+/"80s™ z9*lM=8@J&B? w ӘWw4gm>`m b'UinO)(QT@y_ DvLk#(^, +u\8^-xf(fhԌ,LQ!J6 'x sG]p\?sQ¢1#{f&34ڢC4J2UȂH| ʤU{'H5\-R @@@3j~Pzxtf %6N5҇886FO4‘x(V֔3Gl>lA{Ԩyxw<) Ԧ|S3}[9ς+83 @@@3 @@@0p*7<Ol pJgO%YF,k:qb S3u\1j;~ nAjPpд)AP /> ņddJdGJGQB4OuܑaGcu=pM֔=tVdϼdpf(f` ?f5VFt)xO̜e5!4=UBw5| HF›|"#֔:ð0:z3eLh9ִNOA`.BTX y 'eB~ 0) c?o ž.fiSK&81S oMBz ۤ㽢:Ǡ303 @@@0saAS(0@sjfPG a; ڒ)hXsnY/ dՍ0+ӁG F@`uc$hc7lbS4Ÿn}<⹝Z>|);ϩ6xKNG~ڇxO"3ASoOe*y@<pYL5# i.dG0  dErR0303 @@@ 5GccTQgUr2 a?gdvpʈHc\3TQ0t- hSnv/:1ʥ!(xnGFdDŽz!p)ϟ;Gpv⯊Rh8ZOx óZ ɑܿSs{O` ?. _}α=&x UÆѐ w`yXB T|Q [<1Fw @@@0^-Mqw ƞh߃^. cJ8}?+dkh4RLD0q"rG šaURߎa!> 2U3F-DL$OjOgS J="#e@C/Fz0{ۺlfk$O& |_MI샄ϘIxʬCfOFm+p#V4+  W6/0 @@@0IU4Ш){w:(ighn_"q8_4f 2vpb27BN.t7QV,'C0'Tv@@)OzE[!R,/3`8@aORT)q߇Pմu"Rީzry(}逥qƏOaxxf+d@ .WAM "Lc@(pv6f(fA%2ňBy-~(H} t/ qkoR{|<;xAVqP32/lqzK!' ›3-i2f2;ePN3P_2.7$:-Ipj%qDe7l&Fvcg٣82OD#vwU8S6?]x)qnL"ް,?LLpg//(ט5e#<5ZpKELL (n0%ڇd\%VN)?E:hol3 @@@yHv*0IH>Ná,:K l {t LME2E|`%~v<%a pw0wn~<#OR5FM)[! <1i [ H ;jɀmLL߃3@!>#0qB־aL93+Uj`z֥8%0`#*UB(ʘ8J !R1+M&$$&\df(f5&# g;GgM ohKA]1OSq m <Cg B;%7 ϖ:@98F|HIȇeqZ,8/~cf-o:R .gh8`D:›>q@8`Mx88AFzj`__` ?)8SP0s tT+CUUiC' +;S5&Qи +.\"qÛ>tll4 |tH5_|72 F?Ŀ*z߁}R}H;ۀ` /*Tۣ 00a箻 @@@&mOv@KcZͅ>:l}N2WMPȂ2|zfa- ڌM#lscmtˏ}6šz=H˂J]"U$tgtp &{@2! ci`[l 8y(fic'$Tp5pL&p% r$䔅~ѐ f@OF gFwX<S83m3/TG=r+?XJ #p6V+KV^ ("sGDQLHrs<30X::ơpϨy98iŹԅ‘' [k о6Jmw=L} WW ӃxOZn%<2ɟhI 9~p߀@SOk9oɻ(;™XV$,BNs@of0 @@@03|cr-5g-\ڼp08=Z^,3 j_ΐ79I-pSnc[i266FLTSY3X8 {la՝}L%Wj)X<>O8>]S6Tdl\~?Sa, !u Q{HFM ns*+p8@^0_j|uAutE+ 4oNQS|Q+X:f (Frt-n`\c:q2 eZ:95$+8 pxf` ?f` ?0͢^ PP9faL] eR_xK f,o Eh1"5Ӑ3/ cZr"rҗUCIYp>G0bjqZ#C6n1FO)D` ?` ?Zmnj5o\};`rJ>qΌUφ@cB۟&24_†=M?S泍 CkB݃>IԥԢ()jy'h<|n&`5jFR}A/aƨ?EE";:%JSO4{0d?S#[1ʩ88N PP9af(f@w>@_t0EMR3X/6/H8C2k56|(I;6i~s-^%V_V =_1 ) yV%&أ,NئZ3Rp;+ _d:Nʧ?8[o}S@DH2M30R@' šxKj ˜K"V '=ļ:$$y ssTd@ǮD6HJ4_֍&KI45G{Da]'E6&cߨ$ƚLp8=f` ?1=P}@5,2jxSv{ރ2N$b'8`eo-(H1t* !H񑡢ǣH1٣rw)o| ]1 LwHњdNfxc-3yJx !dbм/ S藍hCdJl/>foHՋn+А|=ֈf` ?g~t2 o_AH0w:N{hS=.#Wꍄ-:y[SD2 qxBkt1b.o>}G;Rz"s^XS /H1@i4T`>II6y/28`@NF^>#Pp܄(R!FBP;5U_h#<ڱpxeB<}0 @@@+ik1ᰧ0Á{0{z}p&*Cb4BU`ޗE m\^o8Au95i= oW3KA LL` ?(fnONhu4= va: žzMݢ |`O0G\;K´Ǹe)H YO쩁|CbLNxT:&MGT4ʥ`z*x|GV'M־?IQl:5ޑ|| '>ouU3[#8f` ?]"]Tk\b xi<ji8􍌩FJJ5$C*x;2WWYpyw@sSW.Q#aSj&Fw4ty/_` ?4d)0.(#֑&Fر0ZgcD5cl$0s4;A}4ӡOa~J?."6vO@fWЩg5(f:,(f0 9XH9ϟ.o'T2DM7OF= К{L30;awx WEZ`ɸ:y *lz*0j:w•7w^gB'8F+4 !غ21IJ3/S3F-l /tՆͪ&(N4NJQ^0+/xmZugbǧnl'Yw6.^ O_zǹ\xι4}l#SSȂG 8Cqy?8F@|+ cdIQ\W$u0(l۳Ad8b7`ыDᩳxSӾ[_ n2t ]KIJm߃ oAPdRȰfg;LwNrȩ}O_ 2H"Op: n28Ntt#/*NMq@(fL#D^j p*h #";oxGouXpD v6w/ r(fV52n+PwuPh졜345bR LP# 3'삝mhc.j"n($>Hx)7ku)>Zo7W%'-g[@W#DsDDA8XM" Ӣf` ?SW6$8p>ϓ5T%h労v m@$2zqH0qRt@vUюLu+0f9ܥt5:B!#<)Vk5k ?.:co7FӪZ!2;:Lir5+&n0 @@@0 W~?w=j! uZFxGP(V%^%xS%|H{AH?Λ24e0^. QwLE٥\><"<-:I>FI _3$:50p)pQ&FKFEC 1O,J#{[$0.0"8s6➞ :Hd^yf(f6 +3x|Jŝ?:1ǸFEU.X x^p6Koၛx\"DqcE-m8ԯQ .xu3Ec_VҖNCل4@SU"peP#w6=~8cQ^R``2%ؠt cGXB* wr@+;z~oC!4hg\1WQܙ߈CÀg[l&EczmG((2 3 @@@aHBh8`CczYUSf(c{% tɟsM7(0_~%`l#wpvvJ9) :œ x|7egNj,8`+𢠃=D~ ^;Ғhw uG%{]`' R[VqhѱiK,<"Ok+¸F|̍* 42pE!"6PƏIGq0SB) @@@C0(f27输Za pY-S&o##F3~2ý8xS>6lVlkũ[ L VTT0=Ԭ -*mL% J/'HE^`U%(f /mV9 3L3EmQLLw)n[DxoʁG*#`N|8t30$zJuC΍a|\G]:|jo2D&qa8fuٚs8yX֞T((4[)@00PI]U) D?a֎F@+-䋃s%0(؇IO">/y1ʩP~eO-B G:J 7:N!M4w ziZ8t꬀bOUzޞًAP:% mbsoy/X(fpT3%&Ni|/\|j!dc;3A0љ14h>Aw@NJ\+4x͢Aٲzx3u a1.8>! 1 j%~\͚~3e2Ol.S` ? z+$RD BdɆEs *zhmo \lI\0iϡ^ŋp+gj3Q{<1mƌ&N&:C03 @@@0U$daዌkFN 1xGpB@Y`\kbݤMKzRLFυ4NJ{[~M$̤_(vo |kœV?,Q@M҆Z,pSI*#u.]1>:D!(f` ?f!7W)ߒ&S<th,wԎDpO}BiԀm` _ᙋH8<7g fC+jˠrɝz\;Y_WW_ k6_y3UXyj"Dfe>= e`,FE.]0$'8P)AGTO` ?f` ?f@?mP&%/nưQ^?ThVQ aQݽ4?"2|`lLyW2hm5&&D8T\wp4;$#A2</{bKD'gzb .Fhm!:N?J5".(JVc0(\d=X!ӧϮq0QCHϼQ/8=F$a!𳂡RĴh}l)#gpt4\F/& x< /Kz)=.KQ\=lW}?3MhQ.@Rߪxgۼ( ,h>͌Fg[|@bj9{+:%VSfX!#84kП;AM2IBkI\B# ގ"HopQ-&~v 0$GR`3&FQ֠/gOgFM[!N! H8BxfP%6ߍi'O+^񵱃 8_ݜnFS Xht}.B+BЈ)SWa1;H4"Wl30s qԻî`qv]Y~LΓs? 9ANɇu5K U_1fFSt(Z =>zZ>_GWiӫ(R}u@p42*4 @aM?[fVkKFW9ɨR"  rg"a B4\Մ!)83#/c?/_6BJ/hEϾj%*b}twwf7 mIZ64QyBWl3(f1Rk}LuJ<$4|fQ`uH$0Q hZGG2Bv~ڤ`'$L5mEfv.FFG <9=3NR`fHm3 5`SUP33o ĵq6lX?Pc@gK4K*"mΆ` ?fاs$1h HYw.҂q;mNHՌI\ 1iÜ U8b]ѓJ"޽1Ao=0 `#- D%}B^;QC~JgZ<3')2.68سe Xvdܬd(lAqHl+"{FWV94<+un۶N~)}/{9 &3XG6.F+ ?/oO?l[xl{U'25/S ŁM}Xnp\o~64@%Q# fs=:/pipס00V@\?VRp90ə=ᐦԟW&P^dK,&ê8|)H)D`!XD4_C.ƈ́ @@@03 T-o6]| 9\ DF2͏˸%X) _ -T/#gHtw`bɆFbȾࣼ ԁfOurX󅄼ʝCN5#S VI.G4(P3#P2|PX)I†GS#SsMk03 @@@0*2<8#hX:7HR;6N񒷧wʃ |)RF)`h} emdi-1좁uJ$W qʹI?@ aS1Dh@|CpSlTnFLkx<bWj^g0#eVnP8{O6mn=@#s:rp‡9ǾSôo`q` ?Mhѥ#@ k#,L~PBa\%D4)L,0"pˁF6 bsDC1pS?=r Q-P(G ѡsJԗN{߾q4@]=ƫ)Lp1Sb3[0xbF3z0YDV YxMv]/ mY[T*NjV*mNS@}MIG ռ6k!L:m?ꦔaSz`%"ΥC+}Ќn  @@@jO@˞گ8ΜEZ{鰦y}McJTd= !! I<'>}6  Rn!N2;&i!7ۙ4`4ȋL ESqfVJi0aeݧmŏ@% )];\0.Uq#GfDMTdG YðaLiXت[ §;YPZudWkENa(f5`fM iQ5їՁ֣SUUb6ֵ6db oo## ` 8J =N ^CCѨJ: ]T7V0ߊH(F0]d2Ɗ##{h B?P"6#Zώ@ åa9Cӣ08 aS qn)Ɇ j Yc.(Q:[pQ*ᕺyPDqG) TfON9 @@@ɛ`0#Wpjυ ՟*-/6m>]jJ_HĊd Ք˿)tga/'홌 [ J8ͺDMO8٧L~6ag7fN@|)P<LڈqCaL70_w4}AYP8 >Ĕ^ yHKCFL<)ރz׵N''/A`kjQRpCFӡMp9F?Kli 1~l:g}n i ~Q߳NT8r`iĻ CU]p)T/A#h m!$P#ڕp@0-c 3P8|)ayzc0fFWH=W1sO3nf` ?鞵!𧗰KƙUɡH見F1x4Tjluj1CqB#~p?6s)z-lV>tD)-tk)*[$DHpPf5㳥Mݚz# +1Dž6Hs+zЌP^)?LyU<<Sq-L9WY ޒ\hS^c'} \^Y:cXP5U~^J}2򦈮PJLkFWӃ0 gz_^ S`0^./+L(^>BZ;"'|z% z?5Oڬ@"3 kNiuB?;lϧ"WpղFIL=۝ ^#*td<)Dρo< ~?`)0]ʨdOpTcQ8DJ% fHKb=<<绬 bHR։ /u @@@f?Mq?0j:LE;MA21@ (hOc"<1@/{J,Zt{?1;6$X|VyxV|O0l"a8@}*}4";4vP80` ?DoϰmG~=|}!#93ހG 5{\3Gd𧯫<<~1.y8fӽd޻g2HCњ':}LW{D0b4Q{ī"'/@U2ce4qA+g5)mVX=(fҾsq ?U0𥹹p :9ät΀ZM1j_Oߟ4_ tr4t6IbJ44}m Bz6r+. L<)2Yu֡zG t^83Q/nb3odaK @@@5!姟27(K+P:>imPqdOя3/9BF(ףQPPTnfBgP2HNsCy0SOy/ <|)2Gd!̒:hKAÁҨtT}j/89L3GgȨG_hx_DZ%*y303 @@@{̌Wu1/."CE3 )У>JBdP`?mg2Iu$<| MZrFӓcaRK)ۤvz]=\/2w0o)V%.W˸⁉3UmO+.(=^ Uۘ%lz˨Su~i9_}ʆ&t`۪(ToLS>YcDxf5ȟGf(f` ?fEw9KWC=lM̂q,'Lz~P/]}4ɺ?Jq5-C\8de_H/M*F4`b?FoQ2aKT{]bg A>Y,/W;0|){0gm;1m>l8Y:E=XТp @@@3 @@@0Rh)q@| $cc~?ê/ uw'6E+gw 8;:Q#-q@ "Mxᙥo/PI>p)J?(QfGP !ycR09H>bG.xV#竦{hEM|"?&pf3OzlL9) !TIњGBGL` ?f` ?ȯ,{E?Am*O [ ˕wbv<12sy UϩUGcc2@%%_Q Z42 c3*rV`5`tz4\ l;(ú'Q' I03z0Fz&gIQZ,_5`*PS 4Ŋvqb]}%6u-P^32:]$Qe-oIfNtZtf"a_by2%_]+fl-"2_<^%(A7h$]oXO<0%)Urkၗqa1?| y6JuUB ^eli9 D +PI=!Ltrt:94MP(f%Y<QFMl1 ~p`-|P&:`ulj5(nT3?<BXfuc 8Z&KsuOn:S`ރ3X2vZglgBJA  Tf0"Wnmsg9!:h W{5_'z# |&I\P\#/S벵26!.+FsS-v[ Jc3pShU P5V^ɺxO՗ p񺹟H-avL=0>9U4fcflo4/? AЫ^el u3QFΫ϶wiKV<^6hfR)eTޔ J?zx)툱ELXO(_{@j8`JɡOIOMb}͚v<φ` ?(f3r.,)@8C(1bj;v=ZibCFucUA7AD#A[ ^#8ЁEgHȯퟓ)M= @ (шbR 'ޮZQKP\@=Ap ~]?v%&愲=PBpu%L#oXaaSQs?*"\ĵCgw }w`ޑLDmpeʱf@xMx ~1̓0E瓌[L֮L^#/0FNFNjfSgHэŋxCb VΈMF ^vͲaw'R}KI] j}buC"L2!xU"sUW׀|uJLPH/S//~AB_6jxZq}Y}옘xݱpIkc[vp&O~saXFXggH_\yeˤyXPGidhVF* d, u6>@hAL|pOದn)XqLNlŨ(+fST;)Zql)wC6%PROp0BR`Rщz`2T9yu )u>#FIKSY}qTD7wщ S,>JB_O` ?(fb7#+ T )F2܄U+:'񠤭h)3`n6#]y@WkX B޵\hyc < -$ pޙǠd ڧ}"|3˜X*@b?y\p8?B.vkW9ЍOi I8J;{?9^0^UuO"a3٦O!y6xQgE(=^:HmK0dj\̈ XU)/؞'q7I̶J2z`e[:h_ @@@03Ovx36mD"a"2 a4QTpڳXG?iIZoE^#|vrcB}Q" )IލFd։Q$8)B_UI/6Oy<ۜ=Q13˄G #*LE"$ [0M+f T&JH :Vx h9_hx"÷5.0%JT@$8ԌOhfy` ?f4<IӤH1X!/QxkR^o(3T;DJ]8뤢sxv:ˀjV9qS'ҦDq2{)sGL\](|d| #TyRJm/eD5)V.e^gBvC8PscfŸp`3"MIx྘;aT8|byMFʳ6^z???`L-zS's&vzq*GEin3d֬33h{CIE j;53G:hxv^R;Fo O#v$YYN嗀N ʱ0S: f+x\X*E:3LVx5a1[ʮ{Sb~e,}O44}j?s\}FrD%jeʱFw}Q1lW?*Sj17.2|)h 2U,JG_DU6wJ2[c"Bd|ߵt"/ EDC;N4<Wbn&<3jK;-95C;)f:W{ ڦ<` C[Z#pW)eGT`(f` ?N6ي;$] 'uђB;mϕ)-n 2"_XSct/giC@oj9q?d'lkMH/l(Ԣ+}Qq G1`͛Igj}61%rxu1?3V#aU݉;2-SM+8#>2LΧ:6qG0⎌@,)/ Gu'pB܌dN'gj,Oi~\tE0Nx;6 <'Ʊ[FJ%(OC<)K.X?4cîdFbcݟV|3(fqwA!0`F@l)c Xfµ_'0^t(c@hOёO dU);Hz 1O6z `.6r2: n 5FcuRG}&op™RhV.0( #bZ0$i!RN4iC:h͡׭߂R,P_N='苊±,A|K[+W9՟SFc_-|VSV(_#?ϑփc0F ⟪AH!7HuN›r.2,NقM]b]dZ?2r炚f՞o탥+pTBO.;u)FS[Jtj2X;@X(Q$S (7lp+m*o_֏5Vۛ^T)7YEpַw T}~ @<6ԾF;7Z\qk?j*:M}}Ma*ڄ kg ~'v $h Ap&1|iF$ը2F-Iz?Q(t,lgCk߷p H a>g0BnhlfDgO[-CT9< '^XD#^OTEyͬ zd!.V )wXuaRvH#Ƨh306;; ()Q@vߘV"~!>OxAoLW/o)5{DR-<;6?DU\z:.R7]h0&Fس ELP:SLWtz_px9 j 1%Vf8^b8?UL#xu7q0Ujx j1a`स#Fk CA[DDܣFO# ™ unF) P"PpmQu[hnqhDjO ԨA*n\oqԢ*[$ mk\I͹Ye[['VFw{Lr0{8_S32[:vt2^v.ʅyʉMM/ LxLc*wj)IcHhiJ~tYӷMKeDpo_f3(8`T8A-:Ɠ}䖌Owz|;Up@鿸)՟S_>UV` jfE5mdm jz2pKw! m+iK ?u_w?.鐦h{OIx}OXh eW$L%|ooU;U Fc_qt)=gs4 'U/ {[!@Hdc?9( zaMw)}ZM_``b̩TЦq>N~%jZCRڜ=F&XۂrxS],@`sԋ@O@" '_áM9\btW=x87P_ Rr#=ZfĀ(f:kp0~KƚhV1 ic0ӦR6J;J%zG%!m*`kJ:,)@H;t?  ߆Ov bR׊Y!At}Ma)l*aL[Dž5yXZ xS ? Yr0W fSx?'Ub6]х715FH\]TqJz.) kx)hlaZ"ִ07[pFFS^Tj"X^,M}(&3h)1JZ_R=TkaY ):I^WtcF5%R)PRH9w k{dqY~c"n΋8ِb:3w`kIꟌi\)&q_pvoV%{ 3w*ejj`m9 3L}0X,{ž>hG>:J& |:9xu0yX$V h̚L`i]0E o5xhcj՘q3B2 q8S_zN`}$œ镴gU΃_:Ďsu@$P0F"n wmF_ΐYSH25j!weZ֝ʠ g`1O=Q+| XN7XrUՈVF|?Uo1R&a &Yِ3gB-$p'mǬ(f~sJѱTk bef4 ᳯl Ot#V_PެE'*i›:'zFik^Վ[5N() ?4twP9 m2pBGON rWq њj B6ЌF[> h:T}`ɗ3oA∻g°(\t)GgBa,|!ąK&'SEG" aɦ?Q@qG?'GB.1PTMoxlzTFx3":`nH0Ւ}Ⴉ(P u>2A碥4E 5o3q{)jc#Ȝ^۬M`n%ګpN/.N=a5X[" @@@3 @@@0]v h1ϔGN)xp~PU٠q~`2Oe^iWJ'obq`Q8DzތZ髐j{%U`#ҵH`#x~J3;djL+A\3GR"8 gE#R<:TQ7]?֪AMčC06=L"̢98r(MoXFM0Fg#U Z=0de/?tc,ltώ]QD{pcH;W*#3m-3YXSCKF3!]H#F@%a`(f` ?fJ;ր(M fbUR݁#l4LO*; ~w]^P=RH h,37{ x3^s@@D\ P ɀ@fZ~ڻpe\.Iz+Fj YOz2kũZ! ahYˎWL3feh>J 3{4^DЀL?2Bh(Dy'Lhڦ NXK آde2"^pΈǞfd/ێ j^jիQmBVLR gDk=D IOZ,a<Ӱ3 @@@0BuuУ}B.,Sm茨@Pm7K14\ PTx_›JpmQiϺSej(oV#AחND݊| `7@i+r%,ѬHVeeaaV x0NnЌtE8:BֲO|)t ^Z(S18^I[H,UՋGm^ Ix9a+~<:ygjY(PŠzu@Ig-Y@,)}V"w\gX PQ?d9os4E Ԓ_S4i7NS › 1 P3 @@@0OXwkpSf<m|R'S7:K]@AnJC*J5]C #M"K iR$N t)իp` 00 ψ͉T X ~DMVCM)r[1wQB5X<Y-pC/'Q 0ahaO~wV''hT+ .Hd_1(SzT#$7[85b<.9Z逐Flt ]0}RTpjfV-}ֳ@GbᗩE@^p{qѱ'/?_hZ @@@b]7Fc>1 M0)᝼²YR f^x(rpwǞ ˜\}YLpHJɏ%g5bGId ը.B!9a V~hiD0.+O4KkgB6 GuugZqW d'Rae_kZbD2`-ϸ:aF[єz%HRQ 'I\ʔ2'E4G(8@i&)0nacWLGw~lZ5MpشBFI\d0L*FdDŽxTЎWc#8`JM:,cpɁKA}Hc +B/ i$ I_X&4mITP%-p j车*˲)HRJk*?_ρeB&p5e͞\k{R21z:b3QȉLL|(fxAyj?ݼQt?[RFH z}PM=u<ۜY 5-UMݤW;ǭC2oTp%!0B~SĸePekoTVUpghLeJrXT]-%\jJU߂y;ƂOb;%E@dpj$oz0urEq<1jvbsa"D1/0oе[Qծ>rKBNB`-iG/Ip2Cvhiׅ# z*HSS^ %IFd4#Kۃ\! f%~BJZgWh}y} GN4NŬ&┠dџފ /&HJ5M_e,QQ*zNK)?쁓h`)pzֶɋT+7<-X4u3 WO[jv9ұ jPmh1iH_NT?zGc& iQdfh3I(6D-#=˝ |5(f` ?iwyHUJwŤ $! I:wŧZsTAXFyC&rp3 @@@0P+.0`?)Qߤ0?*^3lE)3ja0SF'VBRC%  ahS[i8$C)T7o@β|qg"2ٱ ,FZ`d/4{"xmW.X$iţv+-B|;8m ̜Pz:if` ?4iΞ'xS=Li[D晉O(rSHE [ϧVPB./٤E|jұa> Ba!ŨkhM pP IkjFV,mJ䢧M;>Sр"Xu[aٟBNֈT_eb/}#*hju^B3V<;u6 B`~4[ի.Nmݍƹw8|~ f~G1C'-Y4b}PkģBz?3$ʰFB3Kg.S4T*@)SHrjA0LashѦh)H:o5<#CO3+*Mxty썞;0vsywDp%*p/~}?XRBz^z{4_D\60_,sN|bơ{ hFJO/AFtF<!q/7Uݔdxft 4`چ%؜i:*[p!v+UҞ38C2 0U˂$eTpFѮ޼S5JY/wM G_~6ec+^ F Naff.Hy(<1WQ~ ,91SL4z@ᨡk*R-i0Qp}a:þ26#TگYf8fJ !E4;}"%gE:XRs $|)yc:b]ZƀVZhfUX*9emGHl,6© bK@*u`1L2SH^،h2 z3$.y1["ZP/@)Z=E%lL ȒX.SO`4$>`3fxP& ]_B^-DQM!H _(V2!yR['@IATBeDODkHL T_7 Ӓ88[7+YPSՈw~4xB@Rm^x Gc'zD&Ɂ ۳@OLa|ӡLt;oAV=RFy=:3d1U&˃> a#l`i wwD>23t&>Ģ1IIB5Pd0B2T9YUizT66`FE9i 4Z:f33b(8EX\(q;xh.h R`{@XgPmuTN8(f `dzC?S ɇS 3+;cƸ.&+7u3;[ U?rǒSthr:ݜJD3=@F RlFYin4 4" z/njq}d9\k%1!dXZ<"Q{pBawڟUdomWcpnVgd/ƭ&a{'I (xlЍF!\#)wgҬ(әjat O{{,3d3N $,7\&p0@A :,B0u?i0-u C Jz: :ȝ -Ȁ)Ѷ2/3dujU{AJ^2x{^HHsycq?}*:3"|EZ#>rc9G(`tF0 z 6]TE!*%Fz<;</  =u`8xf* D߾?pIR s5>F"7'~+ = E6Ӛ&Ҷ1Uĉ~*.BиAlHd<6q%&HFdՈ*EGg*ֈx*(eI*-S?b-`hԘU+ط(f*Q*UfaЄdd<=l)HLƼ`;o57{س+i) <"Gz 6p pR 8@s~ruI>wI 04/D_>9(/ΈǤe9G2C Mnr-6M_` ?M6? ױ'`5 ,Y&}`5"`6('Xp*ǡa \Xccʀ0_k5H&)‘71,Yq{gs9hGNN3?Kh.#5/'OaNmQS;O+>HJ3i!` -cp}w)6f` ?q~:tF]L|eQ\wo8MB3:#s/0P2Hr:8. f:%xGAx#ޢ>ab[ 4MFs 2[Li(8O+WM;d#yWor6tbjΛeI\*ho7*۪QװXN03 @@@_J:\3™C##S,Nmٔ28_۪6/遛$-H5-?Z5>VF_lpס&GW Ȇ'S :Rt$' c[8x*Ds Pg( :W39ƜM$&<# @@@0348R yqq a\jtBdxP٤C]7'GNƜM>ܕb{wNL;$(z;-ukQ]`1"03>̈́`]žlRwRJV}㻻#;L8( ,6@O0˖wiOOfCB?#u`[mOmpQDaPE-s6%AiZ5 ^@qL.AT: DFJErC2 _JFP E*u60Ӹ R}R7g\"9t^LE[HD5g?RZӮT𦖌L⓿Hܭ~<ʆg"3^Hx|8]nY{.3JJ? g:d!*v2(T !p<"1AM~VE?([V4pU?SU5T~[UX-w"cn šZxW<ʉK(PC3"&ءpG;lM*9|"б9>1=By).Zpd}AuL ii8f9z4C_@0`SR:BLO%IBQG.t$TXǜ~V(8+\ /×$L %d)" kpe"tWƆNx]Cup0B(r/lіX!"! &b;qx ռP63Ė F_+3'<oqWn kq& b #,{L2GmT57ќ@c@>k)R6lMu gI]$AQ5u"3jT1.NvXG`fwo|WތulU@/xl4SYD0ΥSI L Zq=Xx|N#V#T_,*HH6>t" (fE@)"5=Yin8RKѹ1p(?.,0dyfӃ4JPi ι{1P…cԈ5 􍱍Wq5 :H(cDHOBwf/@um.h= $0oLOln\ 8Š4M<+$:+?..lJe0@|GA;).l)A X(m!fwZx` S2-VTked3Fd_~B@3~C)Dn^bD}c0F7᲼YLy[F*`ΐ>4-R2mv F4‹ջ9d&%xSj3#d\p̱FJ@=MÞkd/A$&)]Bq3ith{b61zХD7c|#;k=ٺdՎ )(9?V`jhl ^1KT׬ӛH"0)h}.~#7Xܸ (7zj#ZցctIK/m) ꎇ<yH)>Ѯ)SiM[`%af}gr@>1P`)$z yЋ8|uF_03هmʻۦ ʼnq1U북n~j%r@5|fQȼ+JM4輇 ق*g(f~_ d!(rɵ ^N1" d˔x@/%#<=a%L7'ȻC[44F2":5v3P^sx`)ߨ8Z./u>^^"z£) ""A>#'9S?E `|F]j"<1 Dt2@L/wn 6au& zXfhYFG|5 }6v0u4]84FU-cv dPp0)~<ܞgOxtMg1w&Y{ك%)y?.BGL +I%'o[σh/B#%\'R.|hcܩ IVs#A$9ALcƆeq"N+Ķ=b?8|Fnh_V׺&U< І>/:@}Nhcs{&2>e3O"r^CF)zuֈt(P_d08 hpV|v:jbj'zĨd2}(f` ?1?yঀ X"j`\"X U<=GMF3~L)<ɺд)^P J_{NY[cz'mAM?) Βy8Nȝ8hqF4*1T`(4]O /hUǨl1zQ/&'CSC"66#!V dIBsOXg8f` ?Q:=7;S=›T 1O~+OB6InC"C H k>:Ճn5V",֒x@M7T4I υ9ZL2͝ Psrio/&w|vup >xm#vwޯD#X 8iz9ZwB"ʹ!ciL9` ?f1Hu,L rtmn@WtD'M xRN l0 DwĭC4!򯂊:W52R*:?UV_Ad)8CY1pHpci#xRHI3Swu+T/;ʞ;LkBI0f#Y8x44cPY=F1˸8,"-ξ άyR 4dM\?Kx\lyۏ 뜛|J^C™Ģ ~lW8 POuD)R#w| 5/*QRT''A}?AD43e}E-æO+HB0UOڻ'Ց)&U槁~LQez|3=b=C:<##cwG@_r`֎O%{'4*Uʜ1J벊 E-í:dU dJ\9q3V8L) p4m>SN^8)1_ A'CAO2Qrĭ 8)\da@Ѷ=d0`=;oQ)Q- |t)٘ZN$~ᠦŤx>V@eL,3b$IlRGdtBk78"T؏)T2FANq"N B;=AF:=l~mWWx*`Ձ 'Dj5R;3GXkx׃mC~9P\ c.׽K|+1Ov(f3:PdeS ȇṯh$h*p`]7KK@aY )b6p@p`LN#{C,nfaɹC%Ky+#@{ӵUxsOmb~ ^hQmy Bv_OhF&  lƿi~M4BMrVLOl3 ,RF{~!f`@ p kϼЏH/%yn`Պsۅ8fؽ=!W7:hx;0pX|q{90 `A; >ѣ q38KDg$ yiEw O(d9vԙ(fAFO]ED5wp^GZ{ ˂*c1< Uso$OdF!h3ĸzp=R HɪPw'zXUh3 BVM`|syWSF9_&"F ?;Z Ƅ+41L<ԏ67IGg ^3' @@@?X0āO\ĸpԉt4Ӿׅfwq 9!#+v;pR!QSAD#DA1g?Ӌy 3kؤ)UQ Gb2n,hx;Dwfz#e# 0h:,;DH&[ zHφ` ?(f1NftqD둒';:|CM9'&saXdZp)msJ1lh'7c>&\2ߧL<|)hίV_0a0LV P)Jz`Nh8lGz}`+,ıF 3xgV&Ԇ'u@^,x3 @@@zL%ݍȒpqis}j3 t8.DΙ?oj`c\qț\dȌp<:|qE40/ 7#jF#PcђUju)7Qz>Fd" @@@3 @@@0f,W:3p2ف\0:F.gMGԝf(8F[$1ЧJݜr/  %OSw?<\í6-gN5l#)˃VlLR%l~'Ҫfb@ʴ]AOiEZgӂ!(h2 l ]p(f` ?-Ln|ScM?m1XL+  2=<  u0Sk{Y@uqA6ù} JխOӿ<~,d'VD#f9΢Ac\7=t8M`+m$m)8RFIAX־3B0ڧO@.3O<}w2` ?f5aKH +pk :v'#PjHТ8v| OECFmo-ŒUJ7da9.H' D-Bvɷm#"ъ"zٰ`G2 feH'?q  &<GAS|ג"ؘVj` ?fI\e+Q|{ Lx,2R7M/0 eI(L#ǂ7I0q9 b"M*7dh/,&XSށqI(#ddO&Rd)~<ws%)!sxt-"YL(zxȰuapi7N >xq{JddK@@8J r& 0UYm:9Q1guM2&u41.ϬW OYņ:#Ufuʩ׎&h8ʈYr4p"Lhj؁ <#(|`t_ﮢj@ vM 湇Capdp@S }W}LE:N'߷2m Hsɵs)O"Iܾv݀b`p(6'M <M=q!gOǢ9-s(pTH ڧz) *(&bhGE3< zm##cE62 zp!0,MpkF8yR<Ͽ=hig8qK[AF#{:؎e;dN XE$*d`j{8߽YC+FPBz'a5Q[If40@SoM ؙM ]N765CMN+^U~媺;Xq=  2NPpxU %~4OatDmc6^Fņ*Y+S2. f 꿗z@" X|q}m p`L6N2N0Siߴ1nQ7M'&dSN^pqLJZpe<;a$/6Dh) e89?ֳS%)FE6ST$h,L >ʰ^`p^ÓkGBZ(љr|x5zJ|)o{|&*Z?`1?FHmgLL#ubzXY-Ѧ @sr?a9T(fw0r#Hr!BJBwSW nWYͺ ~ ㅎ@4R '(iX'9I<)J e.p=  40CG,ސ7<\]״>8IR8T?$"z#x1q;[@Ǐ3&yﻍk,uׅ3sBoCDhY޺fdIBQ"sN4 +|aDŽ`~޶g(f47|7GTr<,nl!0,oR>d=`h->Jk0I*&,C`Srъn1ΏL c*|Y kʢWLH` ?^Ìk/yனI^xYhǣ2HڙS ^U.σʮUjfx0l1( f,t0Dsh3}.gķiU CұT"Q$;)pa8,*O$ @@@3 @@@0]=pT/a N&%y3/1dclTD)U<5uR4Kװ^WBr̼!3?0kEk 6#hP3 g|K'p{T| 1OYV r/lX|f[J@$ mz Ovɑ97asM(f` ?˄y+:0DL' |%zdJfƟ|#R5::HxCl`Oh0Ʀ0YxSG:P?URQaHiVψ{Z }ȘQLNrks a2qFS}QO65 rАjn5"szcU@ w\tɮAR na̐↓)#ژJ92e4q`9˜wAL/>{ݹ@Xu ).:fμ%})fw93[ mo48$ \ kH}?Vl}XJmY &מ20iAm"]DQ #NqQ!SU*d5*5ϔtPx[xY_mّY:C9`e@#R1*Ak4Grvjїxͩr`@eOGLjnMg>U:AHBTZ犂ѳ*?Hxg`cJaS+2m di N m*@<!Qb (TX6q?<)}x(F?a䣗FpgIcTR2@j+1'6+$4vUx"l%$ pZg& wT ' i=ic5j@&[Ws1̓ LtN ”wCi'oXꡅ KN6~~4/ 5::?TF2`GD`v4Vg>;@4>摼b'kgB?` օ tV1_ՎB # 5z+#}:3C:!8Tf^o(YJFL3dSB n(;ޙOdpq"AC\hh75%Adg Tѷ+ÐBzHiDZ}1D)Z,|T-N 7(ޣุGgVa :g`)c2H/6QVdht(#`>\0szOtD@7]FLHd ZDx;ZF) XjS4;019UDa2faa˟ dE 1_gGh@J0+HLnOА!TtʧBp`NU8Ξ1M0S89,hK5βƅmFPqH8@B /U):N=tPvFC5)SDN |?`jΦSc'26IC/sZ1dDqz@ps2+=# ksbCNI"<"Qg 9hqG"Tˮ' n;Â:8|V hj>8&xsDӪ$zf08R#  +TX<*uKO m" &pr?迏. y"r@;Q m@R(v4ڄDG̎jfOXϜyCAP!ə8+UIo:?ʻ6YL!9rsf;֩3>p +;;% :`)*9Siue`hӼ*I(f#ɢ!xMG㑭:`)y9 x'< h9@NӉOB{"+NCc:3U;1?u`;иv(H*OaJcåo#v˜ǷojwW p­MpXu?wdm@͈D|c:DZwд\pX O E$p'ףOyS%jI,d zPo)f씒Uwn k6+*#+&i{0PX89L_b&GCgpB&ޚ@h{9>L=ϾBJdx#65A7*$#m$K`ߚͪu_˱* ji03`ȏR?T$>(f1Ary@бíx"ó Ә\&&bn9Ҋ!9s(H=!1EU@'(! PY"rc -  a+@8V%L#JԎP2X/w03 @@@*'E&)̐,D,OSek:4pn4߬s}.N)& dČFj 4<\3|Ty10@ `a}irS&$fKE@>$#8NSWKQh {03 @@@g/F2Xaw`N BEGK</zu;4›www}+gN4 sc=i1LWwUL9uP͢28H_kO5O 1=1炔FSǏjm5O_W#)o.*w!Mx#tka6p6bcﵜ}0883)~so#eY’h,Q#ޅT0 pmUm =czEx0I, /N{tΉ˔W./Y=.ܧ-lbѹ8E| |)WIj'+!O3{$G,iĩV &gEpA3psUQ.opQ罘JPw&1^x)'GGqiNNMo?@DԃaL9r*,hv()A鰻pL(8 ™,Z~m*C <gtaj@h)`p8R~ XxS5?"B2늾>xw`(S!")IFETU(+šb\/ G%hMt)#'0_mO0N:Gx)0%0FN HJ I$. wɆEVy@%i7:Ξ;MȒ̅1Q7 M[?x4`M ң)*R&p,XQ qC|"shG7G7KXzzq(SJqncC>&zdJBG)e34ӧ$Bgj8*LW68<=/Pp3o n;̀U7B~a0K- jpphH4{[-7D|ɫ*4рUc)5x;iR8(ҍg- [) 8"x)n.q2Xh"4j8߽8%iYTxG#>{EC QsOvH/2. ejs]crT4GaO`S+u u1a>t~V5I䣼L@3|7FdJ/SXIߺL+gC"`8V'Ħ.LE:ڋqG87fkRɗ`뺜/Xt ,\2:B r$qcRa+"25\SE4V ~\'o8_`Vg @@@8=WGǙ i8>"0$<h~%z SNR߯Zzli)O?=~醰SP=W͏UeEZFx3;j4Nt)ES0/u;ˆ!˾/;USO* qp~cqp&v'~BN @@@ƭL~]k:@z: ̛)ztgtA$QtdFoQ1J"ڠg4/LړFH; oߙ"()m-= JTYJyfT$2\"gۦDXXRKSH>k2c aNQ6|?/W\Fd)K (OfGj K Qύ4v1R`UApVϾ&vӌh80u頦%v~0QmQ!E*hidBM)2HPfBAG@/Ou0A F)3~]lGڵ9?6:qD7d>x͘÷xN91NOĻ0J/n.2!E!SRipqQ><,&k6 X2dREh8F: $!tӦxN'+8c>4lVS_{A' zm ELz`t4Xa,MHLčWSpm N` ?(f@( a Xk[yQ+#sX) e!<}2eǨEH?pR  n` 4 l*J rL!|OWuX< 5ƏXii+/jRK % 3PS"x? b{Gg+ώϽ; ,q3?$54cɚv\qÝr)YxaS !ߍ'ɈMxSL^.fTh8 bPARaցA Z |xfE}*5f>l) tGnt)=@Tϱu-$04$& oiXTwZLq)t4f` ?4O9:a'Fa᥷M# dVP_x|LC#A6<7H|): @/|y#w]?˟"pdpbȌ, lGsH[UVV} i)* fKL)=jsQB/[7Bp@̸xPU E̗,ѯRI @@@(f` ? gY!7Ո +'pTp)' B68ngVv%:J`)s"}gdib2SlZdQ<#}~)4GH,Z9`*x 2D3 Ո|>=ELUhg7#BH,! ֈfzB|5Ab\K3 @@@0bKtMp'OeSU K[B|B0񑡷|qGBvLz~+b8^; Nwq+sDKL+ 0 PlUR;, ewTo:*n|U 1SSwrd' = ;$!FR5ͭ3QB$}Bo9M`7[P8_XklArOtc]ʪo{Gz&2ďd82,?ǽuvs'H* :|,Ȋ.0eҐ #7>_`780`ϣ@  &\*4Gu^/"@ EVPڸJFEׅ:O9#?Tu!<y𧿂0ƽ԰i5 PSдGyXМGlm jD/ѤW&`ST2p(+ӘB)š=r9Hadk䂱"'i!_O9[67h>s'3lv8eaLRukl$zL34CqxU8ƇթD61c/T*j,IvĺTx:_EéwzZ2FLP'%1\!-[H¯y=U8saq)6':g/gFL)/|} ibDꇱ9q54& ž8dF |bK,TD! Pt\x03iDJ|"=!N>uETU(402%0ϣ:Q8`rYEF;%pI]dΈ["~<ҞLk:l(oƉ~J8dX5C,Iӓnz2k.Twѝ8HM!\X'3wzg$ibu(DUbO;OR QcEUMV63mDSN jssڹL1~6`:~I<Ҟ~uIFFhV `FSՂIpғSYBdf :1۽.@<ﭠd&>0MI t!N bץ0|F#Rb)82o<E P+IO鍗ysg5Q2P9?` Crtb73:Y@ 7z xyBmab#. i?Tal .R YwRkg78@#%X#cRḨG2%}2|ϟV;v035)2 1Цì)$<)xƭBǰ4&xSrbv/3َ‚m"=IM3 ]'N #[Mu0;N7Chn0lo:(Uu U^,յUe얧4ıS&WR&P_<'N/`dlaBdH^8Myۆ` ?㬜'*>H`)Դx+|•/mg,|cU7!{=#$nw3GrFp c$S ؔf=HSBJ3#IbV0X3 KZCХHvI*0>THP.D_7 B5ם 32 ' 9ѣɌ J糛 }PӆeV:X!03>܋sgtX>Ɯ჌=Ljɀ#Ȝ0MH.dž` ?(f8|ʘsBibDυ4q3F8e熒\$U~+`i T[c,RIGLh)n t4a좩 43t16O`)]pfMf6h]Ӄ%\1Ug- tvQ{hg(5$BHHȷҎmr08C:%dzgR谨(lE&/)Lj Ft@8ءEen hņa` ?fSIjpelx*:hF la0cfD1'ТZjv ¥y_97[B H&$m悛_lSk8{dU3 Z2i!/QCLЧcv$Vc̑L:TϮԸՁP)[l!,az(Ws* }8 Q8] MA\ @@@(f` ?ԘBlSbI^NJ=}AsLټ@z )# tWEp8S&>~pb{%P(WG.I~nKiawN kqwX\18!|2Y̽d65_4 = dDf`.JLbR%` ?f1"Js) p%ʓKLWzwo&'%p Mx˂aX+ ҉*9WXaS''^3,ThJ}*L68φ^d#=_:jƁF~™U>_6raf 0&~hecn{냆t3<١OK?U&uE"ֵU+[sbVxBZ6T\& F6ֈRT;$i㹾%9Ij F@vFO RhU=2gph6ϓ!!BSざ?W˜Ypu@5 iR̈ӗAGϭdˊL7@(%8̒x!Xg4WN 3ᠦj8-ɔ_tר~F߆L* oyʹ%Q g#lҶ`d2z[~saLdx2WMS৉jz /t򛪓y5b fڕ%N 6d241zѓĸUZ5mM~]9N 8#c;֋us:ۂAo,y'h)I fJ //nىX%{FOOܛ!Ms-&t/2ᙖBp/1zT2`/n pa7x' ~4ܭF#" v%XuKE@"dDa!E'q*ļh0?> n<2`j >8)L Ry(&6ž@Pb /l, U瓼$Yyџ [74(GLZ/(UxL'rdR" Vۂ : }P 4F8tv=P5 m{׻u'YE4Son<W7"0$άFbsObuC"L򟴭8׭:^5T4f:LdiX1y `dӺ.Nyð[$0SO1|fjM @PީR|8`Xi YͤD Y#;ii wi@aRO 9`^.V=O0ω(1u0(m8yaF»23foB ? i4tz`-8^kk?Pb#7b>#9IŋA$$ |P?Z^(.\ ݘsrMxNYj`xx_P=L 'm+_œ>8FB< \Mq0iԸݭ }LY͵NI( #b"GU$)!K{2)V(vO{\ܸ{ea]b"|yq{F+[E R\mh8CyGLTo`m),jag Hָ۠4 ~tF'h Vo?. ih/N \%mAP{b, mI*;"7kb=QkJȷKo*\ k8<"'l"q]3~[f5,zxy#Jh5 fԯWvG9QXSpQG@VX;_ ()Hq? Djn#R|3I!Sx NpFԂ(M;ZШוUñ꙽Nhh^aqVyϤp|귺j=\$} ԕ& CKQm?Lj{:xF VoDqj dfmp[$ŏN!>~8J:TYߦ(3 dWN|\l:ac]Sr8P/Na8)lOnv)RͶƿub$`q#Rg(f* {s悛 xGS]ͶdQtg)1Tf3<I2l}HIkMލU:؈#0l)WޗE1O)xpvtSb45p)Rq6(F(HġHE0 gII;>.)@.T)", (eXu")(s,#x]3鴡f`HuLq}& T˹Bu̦ƫ${ @@@R d. f6E$ w^ʦPqgzQ(4GO/,ÃE9]d̮iROx)QFɓQ )hf=s2DQ ޶39Q0c.P]C1 KhM4Q0/` aR`M$]ug*z#-j$8aD"/.#JXqxSx48yi? @@@iXHJ0ϕ&'o7Be=E@! FAJmG8h) Ѫt)ܬO6n na, QQp=I3a:cӉ)K}5k8@hcpeI:'<H4k] a;LO7ùx)]} @>]oG"%tUCyuVT,D";fQIp!dS  +<ޢ?TŞ25^|8s,WpuIw~pFoL` ?(f<,M<)pd+k~GOA")uZAI}l2Z]D }SO`At$c-003)ߠ~MHpv"a>/8B$+Y8ue ,$Nnh߸ `6y{0^> yB@aALA׬yTؐR3<;0)M!iMGIDTϊah~& =qSSʿyV6Y:?|,HD`O{!{ƃ0ju#@-tve]\?E8VϔyȞТhL>VX @@@3 @@@0*:ոtg@zv냁ΰ;JNK#=O~Nec-3 F)*6p)bGM0PCQdUla3x3I' o3=Eƚ:N Uѭ5ayb9 FM 'E2n)k uy 4պH˔@.vゝA8gK}K @@@3 @@@0𴎩?ZxEΫ6(F 7GxrDXK4}4D7S?Ni!3h3Ǐ&k;sG ^*6L*IXԅN!a!XikeUz4*2G m /f2Xm0ߗ,D茴6B(s.mosN8gS#^s)\VQ.P5aOQyd[ " twsV=Rb5CV"G.!K XVd` ?f` ?R R8^"tY5oXq&)9Z``eqT; 7 #M(iWvf>eGJ,}ʄ~.@3G@1a| MTh5y=?݃ҋ< "cw3^PxʏNwQ?NRQNA6}"u])kFbYt X9?7"2!0S qidž` ?.aiwWq)8=8(x}ce8>p~x)R0gE~g4x!;Tѣ\0C&D"3慤W{'wJ0C3~e? BPxt& dW}F Yc˜l4gOh̕~3I`*Eģ5x#P2*OE9/ܛQD:;LY<LGu#'8dž7h8J.pZ}y;ǘ e`Ppa &Nl),8 pGXx~||bԽm]tEۄ1"=ӣpGM2/^OOM+Ω#zh:#"JH1)ǷkxX:N#tdfLy(mc4lW `)a0SP8#Hn:F1[W95f²@9 lt[%|q11%]+(͋0 jl”dzH^0 牛m-o9z#:lHd–Ϫ2p RsZ [ѪhD1}vIp¦IïL긫lHY;xߐ" '>4zX o;dؠ)7I R0N|gm>*l^`p|F\~Qq=BleI7u!SlqZ#З܀{l&FŸNw]'yS._%Qǜ)ˁL^ #b6st zpLgZ4OA)*IuSY>yl'] FO 0%xσXvM!?#E0hJy'89++dS!+\@fǣ(@aM`SR8m3#hONôO{ 5oO[5K@2M/(*xSL򯈰>YRT538\$^xuO("cfu#| P@Ռ8#!r2xSˁCu#(30#]ׁ߫qp-E&(R  ›yԃ_c遁Ю{N1OŽ=0e;PIȱpSԨ' :T(#]l`*` $`$sRW3^{QB6a;PO`EXY&hp&w B]O玝Nb!4•y.mxҏ!e!(8-xt ` 83 %</;Xz3HIe`^n %R`Sg! a@ 0qJ`i(f!0Mrxfhfֆx0e  KFQz` ?$t(3x/W+S l+3 @@@G<q<\],%zAj2) \5pXv.zz Ѩ[Q8_'^æBOyX;|#-9^\;pSĉ)Cju^. 9E`̣q`C e.sɯ,Ln\4b_sH:zpf(fgU E pERrIBu |d N1{Ó: Źfqy R^3~xW;=HT+@'0T`{gPyJ&i BcGXqdz o&p Dao*OQS$^'MTϗ3#03s` ?G~3H ߡ!10h<~">3ФR;FG{Pk *Nh08LH7(|783uP[ 6mjܚZhuma>U&! @@@(f` ?p3A$4G# H#*BU713V`^8I .}=`2v#SAp2ONÂ&zJ!ХI@W+ o󍞵`3NGv'`q0 `r52p @@@03 (^ D \R$k/rCʼn6vفNAc|*g:, dIyr=p uZPocj"=FMq FihrR)hN+J5!4C'^d+>0 O~R `aGEO,ĺ(SˀiZ#ù2NG Dx303 @@@7`oe+FT +`Q6Wٿ[!*Uô8.͉ )upp8K #YY(,'ƅpV3ԔeB mǜ?! 58:ld)qgXD?F|y7` ?p`QA4| On (0†s? md $5>.AC^>' `aCGp9!0(k >' `aCGp90(k >' `aCGp9!0(k >' `aCGp99!;A| O `8p>'H7{P ي<l wxB7`4H0!{P6\')s`6 ivЁ/4 8HP ? Ps>|UNo ʶPo0(k >'EXP1>`o`6)/*@a8 O`ʀ8HR ?Bp?/AN@P @7_]ˁO70'l`B ?@7p`7 .0Y@f @)?Đ``>0^`6 $~.<|Uڱ o@^#`Po`7Dp>YOˠb}8`N(}a9@ ƒ@>| p@ sq 0j`Db|0߷$ q @IAB\P1>o?iPb}B9j|\IA>k 0 `i+h  7e߈ *?U@I@dP1>ˀ`Q4| O._p 'h1{̓0 X0 @BT$@$ 0`.mC@@@@@`:U萣ȈB$ qBoOAC`Q?@`:?0uYquv'm[Ca~?!JKx`Vl\@ 0 0R;Kh x@=P|XK.5ЊGp`0!Rڔ3*UEo%0!U%<?< /R\#p ~ )?p-LU~oO0BRjiRCE?' \@c`=) }rB0<<\"߂(r)8x0  ipǗ%{DR 0 !?Mh()&BbX0>,|*"!>j*}brp`A@^ LV\Ugfh |Q@Pxx0Fa(bJ_%QXȗ`;yYx0 H ۓbǥt :- G`G\^}Am~KGB1$xĂ | /թ lA܊y r_cXJgˠm\AP0@U= <]hD|Ai`CV?'/^ +Ŝ8< !yG0 |ՏGXpG Ɖ y PC`u1yI,@&Xxw  {!@`E*_;_]QwJ>T\PC${ݓkQd `~<ڤJbVx|`K`wxAJFjJ (TKCjE_ TAdE@wg3B MKiw᠂!ZPdX0P `<Մ*V bFHA'{ڣ.P =.dp& Z=`SRibh/KEqW`X˒ox\>.m`I2ᑘ > ,[AXO`0z]@<TLm~bG#)fl\:..U~ `9mICV?(8 t #z80BWL5@A ]Uu }`<:G,SđW^qj0}Xų{M ^>.V|y]ĴXJfyZJWx0LDJO(\>u?zpϗ8^W60SՔy $ nHIP0!+4f_4_\p`:V? 1/%^+|u]@0x!)-eA A/0x*~K.R$}_T;QgWQ$@qWP`w4NʩTT$Q(R h$`vF] 0a0# @a0#xTzϨQB: 'H Dy 0ZA ~%e~C$|%*W܊hh ı 8]x`x  0x(x9y˼ BP`7t4J/Ģߪ|HB @0AbLW@JWt?Iw*LQ)]M:3R@W P%BݣPU#i@ R*Uq/J/'8@0 .j% ~ED ypK0??1D>?'##W7  1OSx0J=PCUo+{ȸ UtܠD1x0!BbrTv2:0 AF0 0m?SG77ј:ӂBw]` b!B$B?G{x=Ϟ8Ttx]X bZB{GCs`x0!!zQeR!WXX@E>[@ h's0P$,@.(( nM!E]6_/&THh0cE?(-H[zK[#C/w>A4> z=W?Uj\2"!P^4x $j> 0c@cX %@0@,Atz/;h0aV?/// ` @a0k%LAM/*"hi` ^>}H!G)`3\{X( M0bX@@| ir )^ j^ V'@/P0 HA|!FrT?V ?_SBP CA^0? Jf˕aG/a3R|&Pe"^ :x0P\: 0j^> |@b?GAJ`*^xԦ A@^ 'wp?~TѶ6?>O4rA1xhCHI.\_f$)p`;! t\.4X Q-POʎ K.HERMQS1*J$*P\d.%! !5~_[P# F&P-8ߣ``$6v y>)6` T==|E^ x1 x1+@I0^y8Jgo (F z*HAp"PC kE"X0G}NwL`sC`/UíGUB2y|xh0/ނ3BP| x0Ex+пWr׆"^< ,ː0v.Տ/9bAqx@Q(p|$ `;Ā`<8|^>VXA> yvGB4u AX0!%֏a t0$(}c x#v}{{О0`<@"F!8! oP?! BAp@>J CBP)Ɲt=(\~ @0zHYexĈ%: `x[[#`+.P0t0꽡SHS&VjCy@0]_h!?7x1 b_tt4)D?=sL _z 'VS8M$]B_k_ y `<J U`}Ă%l y$ eʇ~]bgu)P`<!ʤVvM>ou@á0?;=08sEvg$*$`Q̭(H<`< =۲`~X|$)uN@r{uѷ `}sU'3X&T$U{AGy0Q0 xAp%/) P0yВ ~[/@C`B@8}3PH/ tԫ.,JxB.x4u p`}` 03A`В1uP+MW *^zP><[m[U[ n _=IF?+.IixzJ Zꄢ,A "X@/x]` ` wTQ<`T h0S2|B|^" B.`Mѡ0@qJ>碈m, M @T hu`ArT)搂>eHWQ@J, Ń0<| p0b]كx(#Uf A8U^@tHx 5@d0@.}\}&pL BJ.Y|x* ڕC$#*ZxP]e[Th 0=_/W$TP2]YEKZ+l>U|Hx v}Ǎ" >_ 3FxIRTg.RZ>+kyhJ?`yHJ Qڨ@OXH~ma 0"%04 ?(+ !!qw~s;DxYx8>0`iu ! I_O`8@N !`8& Kj\F h0_) $Xz p<Q(Kw8nw(V p<`LEDzh0_c Xi#`<x/L(x0zy{˳OqT_ XY,Ȗ>eՕM5ܸ$!PBW:q`:UHV_{9Ua"`t}谉xh>`!_Wd$0@SKU{#7:>ˋPL:(%?W{Ў 9 !G};D*^v.9X? L; LA? w_w'e” GJnKK@|\^%7GNh `:.`;ĬEbJd`:5Q~ez0o (~%^ph!`~T T\8(@*{G/C2@A!FN.(:l P#7#X})GZLIQZ.1!\d$CPB($P}Z _lđ ZI|w4>|II}zjj0 B g@|W PwuyMhUef@``6ġp0%YzYGWC`UVKE>\3m0X̯BW5Z.TBG //U>{G5u`}`B!}FUlL_0v 8 BˠG#^yT#Gw) @@V[8ă`0(H09 KUO[}h0c/-($ 9럠O85jT^$*`[:"/creXyfkX 0@`}.߈F {W 8|Ђ `0@<_=Wr|đ ~\%?` =^p1+ vwM}cWɖ8=@(Ŀ]T"?}&y(K`w~#8D_ *ʽ엊j-3/j  )zOǁG|^1%3EQ_źNov+|)sz5 _yJf _fnVG;-$]^\ %Ax0>|p(0x;PJ&$$ ?*U㡐5]z~0* ?T)`ˢ`A!{a @̝0( Jp>(vh"i G9i G9 ` Pÿ! %x ߗ+d $0`~ʽx@d ',?~*T ("θ@)nGCC`<`ނ@~'O7\T (pJĀ$ʧz$:4?tU..U}9Z_Q+Ӱ@ `9?<#K0HB@`Bm`-|I2nSdPC."%.BǠwCC4y7@;/ `CVcج~_¬~8I<y*)hʫ` B\nӡ.Z00`{T ! _X+]0uԿmUaBH ו*lĸ%bN>I..X _<Ԫh H?ȐH0"U~Fwcߎ+ HMLϗF D~$z+>ꄿG`(;S V'!mmW˱Wu`:EUUqjk TqP]OSթ J/hi@bX h0#Ϗ0@`A(2 1,!*T=HI& pRm>  g=Y'I $v˴iHAh>_Z9Ha !`+: 8e1P`8X_OF)@4K%TB l->V@=!ꮏ˽%!+ |DJ /GU+k) #\ج}{DG.>V!yPC.s@fX"Yw6|!*.//ءX)bx~\8]TQA.*V$KZ^s PA0?ς0W=PrFyl<`_>v `Q!GW$R@K(#(X#Uabt  *įD(K//WYKy`ިf!AD 'O @!w$gϫUV?|c㚠A_h JH"X\ ]E^\`t`}0>_/jlQت5T~5BX0P2xĠP$@ߏKTwf\_*ĮUϾP`<8E{9yFyE HTP1,J>W} g? P0vQ*?^0`{}?wj4y8ʫc>ΘA ?|E)KŁo 4DZcd*ˀ4cxq!_ UO4")P!`& 0\ S+5E4\?!Do22 hΞ8}J/SGp}n9, `;X XbL>TC@ `A._+>?.Q ` 1]XE<`s?<`s? hq \`L g9Zp!   ĥ wG?@#0mc`,W_@@< @QSj"/`0x` |9!]ۊ(`:Ճ?O@P.V#L\fz⨺ jM83d /Xc8Ȧ\|?@QU4+(! `Uez~.|`T%,I?P@/wNJ_L BO*DNLf4J@ D`ĕ3.J)jVA F̟a:PI h0)//`<Հyx@_| B0`:AV? aD{JgA7I  ?TzR;J%JR&&-P* `Q0>t 5h8 ;B0)YBUKAFaDҪK hʕDYO u)W I>H P%m*8?c ]Q(4 ,TG`..:T0 `048( ^f2 ]S`r`}}[n+ΟnA O).XSFu@vp0 L H.F^& `0PB.W G+r"H>.ꑤw0!p ?PyhX"``)Su_"- xAT ]aB@pO(.'ftǀ?' 0(EKO 0 Տꄁ*`Jj`0 M% \"k1'PpG<~]Ah0z8lAx0 w 0(0>D'>(0|>/V  WA9z\ %+U?+#x>ʸ x % ʔgǾT@aT"/xH/]hSÀ *C8`A#(@0bHhMj H0~WK& H)C/WÁP%7I0` .RnY9UyMOj|IX:2. @t%N%`ۖ4 !⽺xQ B`Ǽ%P~yP'[T90!˾wڣۚ3 .6)G#·"H0jJ!V$%]ω wsTAQb0 `.ꕏ8NV Z 86a1 K"~>lÚTI8%+~+ v /ꯂrRH1`:ˇ͂kҽt `.TB!pB9Kwʀr<t`4#`4#C@@@@pH0|zfo@y >Fs^#" <"ڮ{7ta?P n~ @ x0??PP;'e`CDC%'k  ?3)P`{Ǡm"0 7[M!8P!xx?ƇAHJ'܅^<0%x/kĚN}[A/`Ȁ,,p8@!^} `9A p /V?+p,`HW]g>$_ X eʂT~ ʷ9LB. a| 8y%`20#\y\Q/CI HS*R'8B zؐP.V\p_YpT> jdy80`A .0_{1^OAY0BP:~ʧutZ H.+_BJ@..(`_ &(UA'B.D A @BAO΃4IV_AQSGZ1EMMN>GCΐT H^^ 0 `@R p $JՉE>?rh0/T/jr[B`A<% [Y$:_ Cz0T =ę/J^8~Y!'.we}Z(Iձ(p`(J~?V '> ҏT-ͦd0<$4`$fY~L ^! Z8;]V 1)qx0`0]} 0X!QĬs%./qւ|d/aN6DJx(,y9x&!`9@0 uHxl %`.b^<Ђ7_B.@< hЀ\c܊ix0@WD`(NJ  /|0,V) 8H!sF3 qpMՓ9Rِ$ yĚ+  C((`B2Tx%v#d3|% _t#VxK% ~uPF0^c}"i G9i G9f V%'7`70gx{xY, ʺF@ @xLt!2h.Aڥ"OK#@RD ~+4?VJ("Ѐ'NEa!9,>z_#(tSAIr@?TJ?|Ns D%@(UA*H* u=UBgbQr?`2xBD!O/WA[A >(@bD/HKT yhAO@9|#U.E_ |:_9?%];P<`:Wh ubH0E.aUT : H W}GJ0! ~_4]6A*=Iy0@ | 8!ߘ 8!QJovFAJ`X\ĵ@nIVTـ0TV\ڦ`śl_A _ݬٵJ% (j r`3D~ٺ`>S_DF0x4X/ 0`CL/K E{p(_P!~<!(RBy }.^W/{K^x0a  U;~h0G`jʋr<|*; Gġue p~+K?e x!}J& <@(A?A$X401,>@y}Qyx`S.UGU=Γ\x^^^ 0 l q)\TJJ2s\* LVAIΠ>mx!Ipd0<%ARɗmFB. 0{ 0{hA 4o>`&| ;Tz|Gwh0BF@ 5F@GX`]B4M&P ؋b*̊h|!:Ϯt0 0AJ%QؓFS A&PMO~kZ.ĥ?;~)w͙``C X0^x X:-%%R ݾfz/lp)A$wb GAƁ5PB]c4ISF .zʩ mR  YqrW^;ʨ8%W,uBs|"p,!Q_ !oյJ@JZ |$mҁ +SkY h  R% >8roA4HBh?A y.Ƨc>x"̷*``O\0 0`_n3@`A|h?/]HXIGJ0t B%+7}R AQ_Ukc%W?= I** r!Hñ`~@84%B z.7;Tzz׮t^EW&cZd  o6 %#72 h0_@*ā S)P@<$P3:h/`;K CWV$xS*D`:,0 OA.\ UP5WT-6JAeJF@}8d Np C_*Ag#@8uBBT/( /S. 0{ 0{hC@@@@.`2Z%^(\6x>¡B./woHB ATǥ@<%~+~لgZC$}X0@t䬸5Xݍa.AT/V%X;Ϫc#G/2v z: p`AP0?_Uw A-_Us,y>@<peyVcΝ '" xBp<Be䢠UIy_q,Kr S3@x^v=Mƒ^VNix0`: ߇ڝqsp0W.Tg0 `)aWlWCn!9CAb8)a˕fgK&ؖΑeSYÄ 2+f#CQZ5)`:DS[HC|q?.J)HAOvQyH0WĤ!JVEc:'x\Ty^`= y`<`?W}@_YqwvQBT_x>T ĺ`Z` +H} F{E p%xGF>.S0 bUeIx. 0!"@C/p#mLp`Uq=tFACDxUѼ|`<<>U3C`cܑI)Do .!`<%+Q0 xh0OǠt蒪ӣD'T8`~ JjÖcgJ!X0`4p @v(>O ~[}<:`*jJA(V ! _BW " 'گ?;@`@? [0"VOz]V;0IT\ p@_LN ?@߂ixʾ%tV0 uKؤxPD X wVg`8Ā05QYz'e(h !puaHüQX < ,}r @@0>t8 u@W(P!` a!- CqTyh {m >@?>}>N x1 x1fJy Ěl H`C~jU DBx*D> ^Mp C]ҘL0ۣ > EцC0_ĺHVMJ=6\ pB?<[@sǀ`B(hjP  CB_ā@4!.߼^ [eA H7$?*`<W >)9GC>St` H o (\h^q8bWW} f8l1p!}sA A`xxv˨0mKKk@ s ` _'H=]n+0d %hGw !zbh0JjT oM|!pJ i|8mT իW(Q 4R6yWYBPkLK.~7@Gz| 0B 3A8ͥʣJ50@aǔ}L./X0!Yv㆕+Ab}lY俁 #~]b?`Bh𿘣Sw4$ECQLmQB rbǀл ~zOJ"< tW%.xp0BJz r3< AaxHll*VK~`puSA`}2+*\uީO%[40*<"i G9i G9L ؖ p0c%P  H\cO <|ĐP0Aİ`<0^Hxf` ?کZ늀pBDB9`<C0 8<|~$U# D4t$}0j,B! mV_0ʧC/F88JhaNxOy _cc`d!cH*j> Y{J<,>$|v$ZW 8Aa.T!*#z0%X(c&zoT@h >> zAsVý80 .VJ% BZ)PPB9 _6` MUH*@^U ʽz`_U`/g#$O򰆬y$Ѓy0 x`>*l;GL{a00AUi_/Q"7>?h A)P%-GM%wR8? Q,|c`<}_3y#P`<GX!ѯ7q#;|Pn g6U7ܗ@Uo @u<>x/~I>΁\򿏼%(E(')H`~6 +S,% yO@` vz`tP``0"/W;P@=<"i G9i G943 @@@(`G =ҳ_+ İ+w w/N>Jb~ @S⸘zl  t:/4``?=)}@BG//om'.+ruP9yht!| w]2Ƃ/W߁pQ ,~U+r'Ǿ2/0J_@' U0:|_lj `?.ZPDN7;i*6P?q\U|wx tw*^ q(;}JQ6 "䁑0t`|/\%}TK @| ?e14XAp0'Di4ԁ zKA@^wc#JrW(8rX @`2xڦ*bA⥭<6$ߏF=Cnjĕ_|e!o.VʐR{e0q0 3. ˿=QP8U|ª#8 /X `K# B RJc0=U0`9^/%Cr$U mR:~EKǁ`t>`Ī=7/AIU v˿bq@B0`;Ua\.|M[c}Νg)Si* V?^O!;* >?W8 )=/k-4<d PA`| |z ?'./ep ^y2՟V B!x!@4;c` )Ǟ4TG8 8IЇ\\t_.&P1(0$<t >;ZDcPQnp(0 /b\I > ABQJiz>hѸ0tUzTMtJCErm|F0d$`0Jˋǔ=IKC 1jq9! !|ʹ5E~$+eEAn(V \EP `>כ"pE<`s?<`s?f3`Y\>sJlsP/%hTı7M6ceQ}/`7ʋİi}"`.%@K;EH0/ V`(=O9Z 9|+gߑ {{C`?WƱ|=\`h0 a[ʲDY-G萮{GIxCV 5h8H!(>B^Y4,ĵR P@? yp҅e+pAUp`x{APV&JT*T,"MTP.PlV ] _}26 F!+yxʀd ʀd+F&5|!B0!Uɋ⬼Hթs ~?p.!pHXz":P Rp]@ udn0&6jŧBH(U 0V*U&"JF{ !h_OEBYx0`P/xKTB?oJV`;c^ x  _ ^X{Hшؐ%ϗ-xB0>~% / 0@T4eHC/J\ܚ>mX)\Z @0?"X$}pBQ(0HR_Bg>`'8ZL6>bX0HC/)w0 vy_%"WPA(jƘ ` B 4GU2'*VGIx0u?ձ^ntIVb]F`v+P pxGGJtKԁUHkX4ȑ[ d@/V 8h 8/u eR>/9_MiX/!0 UXhJ^(g /"6eWH_/|p>5QP^P L @:*T^_z0p.ow"=>e{H_ t|>fel E? 02io^<fX]ND }r˪ `̸0EK!`Kl!Ap?R?s$' A$}?\E~|Gb7X^ WUL`x]p! XgjáfU%Pl?H ] A74Jt 00B@$ !PC<w` )T6G GJ |/V:.w<%*^04/h( hD8M D )bz 8! ?@L@b=@L@b=4! ?fA)W,$_ˁ0!"H ~T^A!} °a `<@5XA`Bʨ6? }+Np!+WG_h8]࠾N@@R , j $\TVNf&x\@9!`{KW􄻚+9X ]p 4?eC`8"XkAyK/ꌋ<~ H0?ǥKEAcdn"J#At)UjG JDv,Ґ9P˿V@V }jAk=@=``A RlW{DfȍA* NJ 0 JQWU +`jj;d XBIC@;+\ Q (A x SD `H`B\!ptp9"pGSw`y  `GX0/zZ>G}UQm5Չ@_ }T#\L?_.֏0?>V0y7!%H+Oq7`| _#!U%W*&Dƥ "P~u,Z[qH0 ~%h⯁#eǐ` 0MYapn1Rۚ:?:QxC,(^X?&AV^?`RPh`0`D(P@`~A@fq/b$YjJ?MBG!P]i* j> 0_p #N0>To9|%h0`R aYp  &x˷4|KQwd Np(G+:6 HJw,B@}VuWV1|%ߺ0@t*>@mL`; GaJ*`ԁj t|<.нHTMtiPPT/\ KIV* T$^ChlG%EuDVy0{Ă][\c}TtB]"lH=9?P@`G{T-Xp A٬q`pE<`s?<`s?+!wu})Begx}hJDPLυnlb @@@B{X)?ѪF{#1*X|NNg?LE|t)4hBmSʾ4нџ~B͏ iJcwo#`d?TbRI|}=U*ƪy@aLڣj4gAU&;5M2 ?s˪U_Cɤ8VQD= "Jg\bKG纵 G2XdFnw7J0k Ӱ TEIC=.?)W)Y/{$uR.N׸[l@%JJT@ADi{%7t|FPȝW(RfG\¨83q)BeB5`=zL%vjE:'QC#(aYUy9!HUBba~*R)\# IIbPjʽM-t"bQ{n8) hw ޺XS˽BkIKs| eHkxd0 KS$ ⊒?=i8˜F&B9r?FwT8j!Mj(ÞW˂E ޅʰEA&`sCQȊvBxuw1}`&qY6fue)CAZiqKšJ*H谐XJuPbeP,-q Ae. o @h140`Hq 鱑HAx8n6z ܨ3}U̙jԧ6%N2M֩JO>. ۋBN=b Ʉn>pΧsA WzINt3wb{WL9 >A\ ck $icL-O/gh~@+:컽P~wec 8w@{)%<| r7"h%ȷd +nD`+{ˆȸ!U PuCg^c?JBĕ?ǐJ KjI>M}ԕBȆ?Ӿ<|Bچ;F *W\J:-P5xR j$]%0?j0\e@u1)UqBIHBJi*ƙlim5F|*\U^ gN.Uhu#c;` ? SĀa>8#p@S0CC'9ݢtPV^x/l5@AVX9#,{4+p:?NXtqMWOB1e\Z\J>/˖ T(TWFt䅹TFn>SgHGuqtk/d @@@0dT2&F:6!O m6VVOz/õXO)7D]=x9ʽl3)ωEܡN`L=L_ _/Otϫ5DaH)0p.Z1)Prm3 ifu5SA1}]Ho~ 5'mᚫKn7O 1rXO P%\8͘Hq +輐}g02!ixfa;#[F>>^f%^=S:JL8:9֮ɗvM'xS svp" ˜lwȕ+φDpIo!:Agܮhx~ sfۇUY@9 )S8/0yGXR3on>)i`St'Yƕ(YsF™-hB5ifJ)XpH ^Q|UWshM"gT?. *i fH?$)S*gUm[T6 yN] qSQ)Y* EhǍ<*T=f(fsTw>L3KO'dXql>wGSs#^6U\tF"`]>% qEQY 6l0!03M/AUїUxk̄af` ?fADKcNms3HE꫔ʧMpG@%8x{D\Hg{AyM5@'?5n.4B`fnCw$:FOSĈu&yP^vKyAc]{TSRHfdipQ` ?(f` ?8n)Pp\eCX6d%Fkve/MSIj!Ts3J9~ ' ,ppzn[Dppn1H` DPGJB&y)J,jBUŁ=Vnӫb(<J+ JTT\;e1a(S'<"<AwL:$` ?f5'1 M=6]=pQd|GBPJػ h뫜dr<)./*Av$ D?j | (\jz /.8>>0%+l.Z&TFooՓ*FaH6. rsҰBҎF Ê ̽ @@@3 @@@003pTDrshgQ[88ܤqNaM޹?j(h!`Tf zn:M(Ye-CȰVw:m$ Y1NT"8`HxB{aqv<". 0Uj.W?Ǘԃ6<W}Ω>^xQ8\(.EOm)ψ*!u<G(0 ih)PՌ*x@B)xyFh8L*N=.1|/ƴ Rrhf.gVR> 8B)]:3CvP"x՜7ONupE<5RuZ G|=\]m?~= >5Tzɩ*~%1>(S2(ohj}WdE@HT:#_+Jz#uǒ1hP ɂʋÞdU:g!8%/Ta,:?64Xg*l޴\d8ušMUw) _0O ü s2gIGǼ); v0BLP 8XXkGEhDkJbk@UMLi޴< }?NLʂÝ>θ)}wwOfGԚ2xvƈyxX_epb6M;V= `k`eBz(U= ͞T(Og}Y*JfGG07Ujl쵡0Va)}:3bg'O * ճp`0_9?(fy;RA?|_m)*tWyH0M?T) ̙qtWMLp)rGOPX7钋_ѯ䶧åcOpQ z@0# HDN tth1h ɓ}'0gpYL4P'D[4Džuf]\"xSIdNtB|2\)>oM#$ F3^=N'Q%|@`GZ1RXXFy@å` ?cQ>›{=x: ldNӃ 7tC90di2nJyÿC<3 b]ڤ@?+U7g3;./$U_7G\/URH&ZU"ci: $\?B2.M.U{1!;` ?(fsL-g9{ o^094bӆd+=gV.[JmL2ؓqnj&` bbG˛cQ Ot@$* bYTM rӊGBfP[9R8|Rk[nqU5VI\ ` ?\3 @@@0'\J({YG> xL(ϼan'C0̟/LZ'.E{J#X`@&DWL|Dc',:. ˼q` ?` ?fM>i+w80G7.b%9ٝ0χ6.LFJ <pB¤B7R:R1¾٤=Q+P+==| |k{%Fʰzjr? !ToFD9~rck"V V|W4fX&*$Ӱ!LM!GDldx @@@03T?lb*@;r:q?)T63߶N BL{L ;#T#4 MRǿ E{P Tও0$AVp)<B-A }nZ %$2Zne)R 7s&4_aM 2fdFH'.ScDzp4NO {lfRr6IẟxC}_")H㌎2ƌLY;FAN :t2tC@`sEՉ97&mmMODE(u:.pa.Eb` 7RfŁ`OQTTc_ ${w(! iXdunpE;~_V>f_UsƆ4ϲaZcq@.xN簩LG04;֋U]>dGɞ;?T^5@QJ)´y?ZˆӀ |ǾZ(fZ'TR aMt8mWIa` z#EAF=O"~*ZhXGtxHlFN LXQ. }rCD JAGt{hS e1=jOewb/ص5S2#|]˟ ]{)(V;r?'gK` ?39,#TBdf5jT=\ ~vXN'O!M?OF5znW2+BsAN yyKSJ%muN2U>-+܇.k #GDN\ 8(8_:cA8>?gԨ't:)Ƀ0MX1<"CAFYA7<%cE=JӿwwpɁO</NjW"qp3s+}*͞2O<ah6۞q (^uB11p>%y0ԹSD=0úX"wچ,"LS9ӼBr0ϺP]ߴ|3'2'A)UhD-Js= φVU]2sK(f*ŽcmBɭ4U6=USqM2Q)VFy6h%O./9.Χ<=mC*% 90`pB/RB#ãm%5%{0;`COi$AHCK fae\%0uG=282 tC>?I %{ݹ!1#tddD\zQY<_r{_AL!bN.á$ |,zBEkAGjrxyKA?sMSt i*jI& yf` ?#1B1oL=5Dh[% g͐(xtWǠHf췂* 59 Sh8<2'!u2~ǡrCx@%7kԗ _!{Ƃ|T:hyt ^)Q)lLuX_<R8fSj'* a*qFΪIX9? @@@0(f a8]}`ˇzxuLT߃N:NA !#ZxG" Eax#8_c&; s?% c<'$L`٪Yz}r0|w)`B=w8*v9rf30Gpbf?MHe4d|" j~**` ?` ?fͥm#\:H4S =q&(2|f4i`xh8_̆_E2q/+5*V^w4Cc0ʲa|t48gT+G$ Zz P s ZGQ;I4:ZN_v$P\$߆Dsai]3(f` ? e m`5xS(eiɈ簢F%WMMذ\D=Gf±duI=t07ߠש|x x8jyxoߠ%iZ\|jJ+; xM]I$4` ?f` ?0n~a5']MH%>x+zlbBG^[(pv͍Tg1uzRt$np@/MGz!3'], Cc\]Gȕ+ޮ0:\ѹ|Yl+Υh[*px{ ` ?f` ?MHS+:wcán~xo׺_l_:/ "p`8>aY{ûT bk'Z:ZѻÕP)GFZ 0vq<:E WA*+=нz4ӮS#:$>Yfht,rYz@ɡ54ï,c炝3`]QG\#.T;EÃGӎu nzPGgb.u! s;ڥPwx`+Gg<Զ#T_ڰH0ӮTc2JHQTFF3U:0LfzEb5ň5\2B3!ATh}~2cāŪ!GL%t5'TIjAasY0DaIΓCyiӧ(fm)..uI{Sp  *B`qkt?=l)S(bqঙ_5"Hԓ QAdĘ)8\,b|Y _bn<aMV2{:.H4?IjW}ripgl=W2l!$~,BıcgD76]؀JcwPb2-9oaJ OhF2MK$3ް3 @@@›U] `j{U)}rrj>.lpjg@nt{#SHv,I* ^,{! BpU_ϐ#/4SZ 0E;RU9͍U3k™|_ixꘟ(0 zOF2]ѭ|sRE(߷ 1o|#k_#n re/Wq ٸO8|3e leye$@+=1rpSb_}8^Q-Pl] KYnjV2\h2s'$ʧE. aGEcR%wN@oSmW\GE&U{^%1W@#0W'=G>.]pbW8k >w\V=w04`*mAS?!:ߖ<%U921F@@"i>("ۜ~)V>+'d)D sL Tu?ؔ~]|)dm> ?1%cQd?X ?<q%jӃ-5J|fVEDeYld/\bM( hr0\=Vaw|_l/* 2_&z1g^` ?f<-fN@(suVe阣U|܄+jёgQE8`fq? ǐ JMʰw@0;//T_QP9TFe}D#ho*aK 2t)W?Q(})u(SnJ5t C0 @@@03 @@@Mk`HwDz'vvA3N&VS~jb5UZ*CZþ1䆒Xz"4FX1SV,9诠U&2y B)0o g5Hg7U ;@n4!\ f(f` ?xϯ>6xU'Bģ2pw-?詏OAȟ(IJ3GOSx Sb?xu_&xy:^Ā'- #d19\* g0FH-q8)UR,m!`SmLbi?F[o O$4D` P+Pf2-F4z(h` ?` ?f5@^|?A 79<6|O>su}.ft4, 1FDVyd8]0]R#PpE7ȾZ6 ʩWkŸ!5"FT>+r "6f\?U5 Pi1% i |Ԋ@Rb%JU {j"c?|c¹%JD3O<` ?f` ?ѯFO Lzg1DTؔ^:2\&bW7Gp"Ut;2!hO>^𧪝X2g@p7'a1:z3aMĺ{(G5@q %"'8x{:pgfmoovlmvhd X@}trak\tkhd @h$edtselstmdia mdhd _}:hdlrmhlrvideappl;Apple Video Media Handlerminfvmhd@9hdlrdhlralisapplQApple Alias Data Handler$dinfdref alisstblfstsdVh263applD HHH.263(stts;,stss !94stscstsz=q8 mC} B{ 9 + y [: 6 ' ^a O6OONU U;=w ) 1ADm  stco0oflexdock-1.2.4/resources/demo/org/0000755000175000017500000000000012177715062017734 5ustar sylvestresylvestreflexdock-1.2.4/resources/demo/org/flexdock/0000755000175000017500000000000012177715062021533 5ustar sylvestresylvestreflexdock-1.2.4/resources/demo/org/flexdock/demos/0000755000175000017500000000000012177715062022642 5ustar sylvestresylvestreflexdock-1.2.4/resources/demo/org/flexdock/demos/maximizing/0000755000175000017500000000000012177715062025016 5ustar sylvestresylvestreflexdock-1.2.4/resources/demo/org/flexdock/demos/maximizing/maximize.gif0000644000175000017500000000010512177715062027324 0ustar sylvestresylvestreGIF89aov!,osk:!h]ĶO;flexdock-1.2.4/resources/demo/org/flexdock/demos/raw/0000755000175000017500000000000012177715062023433 5ustar sylvestresylvestreflexdock-1.2.4/resources/demo/org/flexdock/demos/raw/adapter/0000755000175000017500000000000012177715062025053 5ustar sylvestresylvestreflexdock-1.2.4/resources/demo/org/flexdock/demos/raw/adapter/docking-adapter.xml0000644000175000017500000000053412177715062030633 0ustar sylvestresylvestre flexdock-1.2.4/resources/demo/org/flexdock/demos/view/0000755000175000017500000000000012177715062023614 5ustar sylvestresylvestreflexdock-1.2.4/resources/demo/org/flexdock/demos/view/birdView001.png0000644000175000017500000000042512177715062026317 0ustar sylvestresylvestrePNG  IHDR(-S,tEXtCreation TimeThu 11 Aug 2005 18:02:11 -0600zBtIME *] pHYs  ~gAMA aPLTE"[ȀytRNS@fDIDATxڭI@7PJN_4[!$[zcʓۥOf$B8Va};fIENDB`flexdock-1.2.4/resources/demo/org/flexdock/demos/view/console001.png0000644000175000017500000000051212177715062026203 0ustar sylvestresylvestrePNG  IHDR(-S,tEXtCreation TimeThu 11 Aug 2005 17:51:32 -0600{]tIME cS_ pHYsodgAMA a?PLTE"[///蕕j6j$2264btRNS@fIIDATxڝI @T%P =!p7= (sD/!2LkpMa`iiIvbIENDB`flexdock-1.2.4/resources/demo/org/flexdock/demos/view/ms_misc_icons001.png0000644000175000017500000000040112177715062027363 0ustar sylvestresylvestrePNG  IHDR,s/+tEXtCreation TimeSat 5 Mar 2005 13:50:38 -0600/tIME4%G pHYsodgAMA aPLTE@@UUUM#tRNS@f:IDATxc` ZFlLEh#V6DZTgPfLg2in&-4H dW;)lIENDB`flexdock-1.2.4/resources/demo/org/flexdock/demos/view/ms_tabs001.png0000644000175000017500000001164112177715062026176 0ustar sylvestresylvestrePNG  IHDR{0MG+tEXtCreation TimeSat 5 Mar 2005 15:40:01 -0600tIME(!r pHYsodgAMA aIDATx]_E1n.;L#}L  y !Kt_`\|1"(y"(zda3".n>nU}U_]ݳ3韸Wz 7n?W*KmpHo>s'] >1{_ hG/ԴZ9wyf{wllڴ_CmY1;Zpq.b܎Y~S$6hs6=g"ݳrv8320gmWǎ'8qx1~-iy+D7Byztf@?&XK-A7rMR0r?E#1fIJ >w=:yтqzZzh@08SRp֑1^V { $ JygeeJ :W ډ\/~wHͺh:xFH)hfԀ(1)L קt#;4s`ܡ5qopz|1T4qCAxfˠ׍4t 50.@o*`* mEc:l f-&` ՃA sb@ UY|N@X<%a IQf_iB@]6wLW x /p"*'/R ˜A3 {i̤G&0pw5"˦TJc"`PQi=;SB`gB;[MH9ע$dbOuvR2J讴Jɓ,CS^AoD3A7>r`c%0bE;q%$՚cړ h\bE/2~^s ras=P.J4F"&>dRٔ6c-cS䤀Ct<\I00U醒\8!h\i.Xw|!;]@/t\68 1%'Bo1\^[Q"M ~DgL[e§# Ͼ~~XbcQtgLDCt\Cӈq#rЦĉS(7J")<a9h4H1 .rڲF^d@;m ԓi~ wW9EwkkΘt5e<mTfXb>%p9^ no@7O#I_A0k%JKC FlHMZ̿HmoK U5<.6%ѧ5fhո vm.=Γ=\]<ؙ*>(v Ov. őC;g.l߳XR.P;K([~^hER. o 6wn{^DZ}~bϖ{ͬ%5N^12$mU E>f(DdU 6OeBS ݠz:73$:(1].٪ S-5Ug. Z=L4xV=b֓r8+*đvgMuc/UL}7NjZ=}|lU 4.LpY:0_*=;?w%ԞgDqtBؙJ~3+'*p:xjX׹ot>}}]ש_XYrJvaC ͣ_bThI Ku]ആՏy>b* v]Pz9DFQo(7ƟPgM^wjXP\m^g._EqY $W=xt옸ʌ+qτ[ojuE5Ӟ!D_-k 'i6gF|ߎ 5F=sbѸ]wnl)C~HcݬEwC}uTg?`b_n=ߵWO=k\xQwGoϊZPSV9q31x}@_kGz]TDS KCp#ʥzfQiյ:v3A'ɸffsܚ}#c5/53}Ę`VEP~; p󫙂U}NU=ԡ^]O7.=]1͌|Z1{/}㸒-e_=4CBs c_vLxrz>V"Gcc/$;cul>Lcҁ;z]즠ܘ塱{w؍h}Gj%@sME3_Ȋ[̎P4 f#s["Io(^Jj]l>}mz.@h+O8A鹙ֺJ-؇xoZ5d܍tqMZauEN5]~j?6m@}?j7%uԮW ),j29^YYI @/T^ɽXY@a]qtO|[hqkm]Un2q ,<[~[&@7Y~Kp 2' ZQ?coIENDB`flexdock-1.2.4/resources/demo/org/flexdock/demos/view/msgLog001.png0000644000175000017500000000043312177715062025773 0ustar sylvestresylvestrePNG  IHDR(-S,tEXtCreation TimeThu 11 Aug 2005 17:52:21 -0600m<]tIME 0Vn pHYsodgAMA aPLTE"[2tRNS@fJIDATxڥ1 )7 R =1:A 2)X6%ܕFPYNK3dI6qԨh\=G[|IENDB`flexdock-1.2.4/resources/demo/org/flexdock/demos/view/problems001.png0000644000175000017500000000043312177715062026366 0ustar sylvestresylvestrePNG  IHDR(-S,tEXtCreation TimeThu 11 Aug 2005 17:51:59 -0600 tIME r pHYsodgAMA aPLTE"[ֳtRNS@fGIDATxu }lYaY&Ƃh:sA)K)Sа;8dP\̿D7:q)lIENDB`flexdock-1.2.4/resources/demo/org/flexdock/demos/view/titlebar/0000755000175000017500000000000012177715062025422 5ustar sylvestresylvestreflexdock-1.2.4/resources/demo/org/flexdock/demos/view/titlebar/msvs001.png0000644000175000017500000000120112177715062027333 0ustar sylvestresylvestrePNG  IHDR(-S+tEXtCreation TimeWed 2 Mar 2005 21:09:32 -0600L!tIME NM pHYsodgAMA a PLTEiWܑ6ݽ,GxU0?-?SFYun7V1?,_I~1-eKB|ZՠD?-N1GUk>LcX;sĤm7V0>,M1ˑDKZt6kIWDj6>-fUp_wAE|J\|AS0bO̩bWONE{>h5S0TH?]ԡХ[SB͡qg5fWXu}޻kښ!tRNS@fIDATxڝE@-^]R܊f.Ir\o\x^<O_h,Nm*Z!4[v:Hg@._%0"h,H)Bp( (cY`4-VH JMkM; ! 6IENDB`flexdock-1.2.4/resources/demo/quickSilverRthemepack.zip0000644000175000017500000022404412177715062024204 0ustar sylvestresylvestrePKQ2r~skinlf-themepack.xml_s8/3::&u:I:+=}4Ȓ*q`BbiwwaR\DI,yΡEdY!B#Bv/!#K]PBΙ!5iuHi@%@+vouOy_K. ݷ6)u `L9I4)3$7)ߌ߷uTjcWUUll1i+v l6q* OMIㄤ n}RR9ӲP),8Sn "|(ά'PnA j JU@1l5M}Hawbʱa )5cBfyszG#8bĖY_\sl}GS|yUOoך,믞J3 51Ldg,#q3\!R+rq\jNKS%`>X!Tgך7y#J-Cd+m`.1_:P%ga*^LJ s- F !FE7iT7@EmȂ}V%T!\]FD,x.aS!4'ar]g㟀ÌB:1|:ȟ}㟐7v4a& ېAȹbB z@qrDw}԰:n.񟀋@E_>9_Z+r&=^r ^D.]׬Ƞž(֯x=aPK Q2{؝H ] gtk/gtkrc\k8LK,eFB;TMljk$PThW+d@T!F~䍓8!э@sy!/&uE: xmpfɆlZZ/~1bj!6 '.g$ ـ 6 2@ᾯޚClDPQ}66 }8~e)&C'3DaFtBlY,jX7M]W*+K_5Ԁ )케}z ܺJ|#x0](rsvvaevaTcJTZ* J)JJ u 6ffx1ސ AWs83Vr̂)y|*" :o.g%TJӈ$TU34 N\L5J\c¶mbyVK}EYqW+:~ߧܵ4tA0p&9`g%(&L''D`ʹ約fU?Th"Ո񾧟fik3Hdk%&nUA%r*QNTȪޯ Y3_PUr"Vʓ˕:.SyީHR̊=H# 1Ҋ%)/C);4V-klpX-ٌ3ueVa#eWS_C G@ 0vKdñ@gh*O{z_{Sk?+dmTJS%V b>б6RHUVc˿&| [cw˄lA /|mٸ_H[ 5l7x)0!|^\"ŋ%5GR6[gK.BU|S )1An*IT@6k]KƷofĿ#xa#iI\r!SjVf OL"O14G؍H(Is eE97&N%ZzލO"<0I8*P[9bekA*M#c#E#(d%|w5û׊G^&_cVPWapxkqcoQ/+"R1 #1pV'j$,m[kC3rwCSJjFgk[9HQ I )F~+cNӉq]#ěѱd:gc˟-G%諂LViw U4&/#71 LaI3f D9Z9n]J4_'hCKY*jkRkvԽ؈$Xm ]5މuljkQVr3`9=΄ckdbXGsH:`mM:S$&X 1A}Uarvd>!?D^ɬe!a)b,쥢mGzJ ' \jlRݣ=FҖEy`Vp5[S mG$K 3:[ ¿EB^h|) 6,P4r9. O4۾,rX^ൗVT(l-+W')uH]&2Ks:+E9)(hp%!dKR ШnK7F̘B휖qc&mNG]gῷ!HxvN2fjzxBP*T*r9Am݊'lXDjAvv! "vQC|>+N3' y"S{ 4MGl6[.+i9dߗ؛) ެ}8#Q"؉]ih4zfx>N #dC{)l]./i8E b1M{ʬkz<v#xV+G--0IENDB`PKW1X#Ygtk/optionmenu_rollover.png5PNG  IHDRF0hKxsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATx嘱K+KdɊJRłb-XJ*!F"D7؉b@b\gw>3ηg9"-+VVV8l6%r?x_-fgguIR%xqzz2bOR ۶&\]]Q,?Z-a{{)AѲ,c5QPJe5sssA/~(󾵟jFkMLLLM /75XWprro`R!SSS1DQ)%Q8jvMZqc 0q6@_Ϲea6qB)E6h$|L˲tRe(L@AR^PשT*ض8hhURA%j6&8N*GĤiOOOn u'rຮe>R Rض8fd2+`I#`rr3!X^^ W॥%0$7~x3+Hd2䫵}}l6)%\^Gczz0J\.GPV(}Eq񑃃\<\־1i Ðzn̷*k|>Sa۶iZ4Mnoo@j5677G^jqq/ Z0 yyyEQg q3Hh4|SIENDB`PKμW1#-Agtk/optionmenu_disabled.pngPNG  IHDRF0hKxsBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiTIDATx혽j*A󱮈v?BHRI|Ծ`ee*T )F8;Xf /\e9#sn4@4[K)T*T*___`B9g>@EqA1ư^R,e]$]2;I>88`:rxx I$ZfcfYn T*Q.L&@`xHaF#F$Ic]墳w'W+>g!Ey^3y}}`2L@kcLnoP`%ʟHOOؐj|^ LEhlf9{sqFJk c ~b}rNR )eK{?Bx@RJ(nSjm uoJ) 00S^vRBABjQ*hZh3rIP1n~VZjVZ8;;ZbSf3Zc#^^^R2dbtqf-(0777|||l....2UjkFG$]IENDB`PKW1Ҵgtk/optionmenu.pngcPNG  IHDRF0hKxsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATx嘿NJ(Aa)o@ ](tTA U H,Y)" Lboכݫ] U|?idw<7g9cvc!_y'z^|qqAVSZ[c ooolnnfxqrrj5B(P(|͌#\__u*F\]].y@(4̚(oqt]L#~OOO8S)n2`YK^@(~|舕*JEqgFx $G&j1 hZ!- C0-!q˦iN'MAUU2٤x~~@h8Ǚd2a cm4MSS!@y`Cf8foo/z2B" Y)c6 .]_*;}'L ,K.@uz&W* I07eYiNdmm U&ca`6*R c,ˢT*.8my0@AtG_GY|Oǐ[?g`a`/e PeSBPK8D1ggtk/splitpane_downarrow.png sb``p  6b)v  #3:1+q(q.JM,SMeHS0T(N-(S0200R022221W6040T=ԩVRX\YZ_]{ PcHŜ??glhmllpfR`9! \\ PP,ɿ:GOHp8/U-eѵs}1@JE"~h >j3tP+Ű__r WWW*LbtX,߿?Cr(XA7X4Uܢl6[|1Ϊ%?%.YIENDB`PKj'O1eHgtk/tab_active_bottom.pngPNG  IHDR'QIDATxOZQ?׮h HnX 71j|$b4hTBAQWhVQhW7V `H/㜙̙^rP(k7LNN*0z{{ BTiT*r|qqAݩlvcdd$J!W} X+^ ߛr6yGGG9J4_<ͦ靝Vg3Ucgxx8%I2Up 3YۋFccc6Cy=_4666"@heeeffv+7;;gp8Y^^^XXBDUKK -E$GpR!:tLTr阄5KƸ M4 v2-j+HU#E$6I܃mUxpi[O4 +'sBP`0' ~h8==2DCٕc>%s+WD+ rtb r W|#V TRd P5,b..AA/]IENDB`PKj'O1Gfagtk/tab_border.pngaPNG  IHDR5q (IDATxA 0E=ZW='wVua-w'IEL$-1q4w˲lFZ.WWe90i۶( ujP9Uieք+黫K>Qoʋ_T)t_:Ky<OW?uN MPKk'O1<ggtk/slider_disabled.pngPNG  IHDR ?mIDATx=!C!)1J.!$!\I Q$<Y9Ƙ`"޳cJ)\k}4%R =h{{j&UYIIENDB`PKk'O1<ggtk/slider.pngPNG  IHDR ?mIDATx=!C!)1J.!$!\I Q$<Y9Ƙ`"޳cJ)\k}4%R =h{{j&UYIIENDB`PKk'O10'gtk/sliderthumb_rollover_horizontal.pngzPNG  IHDR'wLIDATxŔAU\q6 (,]e# Y 9 t4D{{'d:m)<|1F _v:z4}Pdl6N ldlz3Ծ"˒2F@b XVrYUx -  q`es)>vʬ; )AG 6sz3%S_(0 AR%dl`'CĐ^LLf ~$8 8a$ b40d IҠ<6___9w7M.]ƒJdɈ?t UKE N8NL9\^-^ۨF #(Lgq<-"oFPQhZ ːL^ ` W/0+(MIENDB`PKk'O1Sdgtk/sliderthumb_horizontal.pngPNG  IHDR'wFIDATxŔAU\qDB"b_!YF d]IM((VϽw2y-6bfy>#~~/S oVznFVk6Il6R\.͆)v݁WC;,)>t$T*X, PUury>/C-M=I'r~tKZ{&yWdB3ަөh6'd8|sCDŦYF0H(D:XLRn 8`taЋBbYڞ#H  ^0+{PuMqG @(xOd2|zz"oPQ5Āzv2|0ĉWIENDB`PKl'O10p%gtk/sliderthumb_rollover_vertical.pngsPNG  IHDR'_#SIDATxoaava1 hBbQ%$^DJ$*,Fh "aš]mXhl7ig;sS.fߟL&n7J=== |>Xr4N[1 jbwFdZvb f  ^6 maMļoooͫ[l6F_^^PmE!m@(r~}}ER` 'lvpt`*6ڔZsa*+ ڃ%yb l19^=G{:r~PCd2K9Hpm' Q] }G}qQBip\[qrKy8ArWKZDʪ3RRk|U>]M~jii":dh4ݱE0ffnџ bIENDB`PKl'O10pgtk/sliderthumb_vertical.pngsPNG  IHDR'_#SIDATxoaava1 hBbQ%$^DJ$*,Fh "aš]mXhl7ig;sS.fߟL&n7J=== |>Xr4N[1 jbwFdZvb f  ^6 maMļoooͫ[l6F_^^PmE!m@(r~}}ER` 'lvpt`*6ڔZsa*+ ڃ%yb l19^=G{:r~PCd2K9Hpm' Q] }G}qQBip\[qrKy8ArWKZDʪ3RRk|U>]M~jii":dh4ݱE0ffnџ bIENDB`PKl'O1<ggtk/trough.pngPNG  IHDR ?mIDATx=!C!)1J.!$!\I Q$<Y9Ƙ`"޳cJ)\k}4%R =h{{j&UYIIENDB`PK7W1 gtk/arrow_up.png PNG  IHDRh6IDATx0E#*[pZ>oC"Y\% #dHoC"Y\% #dH98v]>6 m[r:4g4m8FPe40(@(!Ya>,i€%XLӴmruP1aU2l[2t0sWv |7=D?G@IENDB`PKKW1ptgtk/arrow_down.pngPNG  IHDRh6IDATx+0DH$8,$ə8G@\ \"Ubo *%=Iiot&#ZkI)y޲,8Nv.V|q]UU%mKiZi(6QW=f=6)_EZM0̲ OY0$Iw}`A<Dq֏#)=̕1>%xu]7jVxe AIENDB`PKMW1ptgtk/arrow_rollover_down.pngPNG  IHDRh6IDATx+0DH$8,$ə8G@\ \"Ubo *%=Iiot&#ZkI)y޲,8Nv.V|q]UU%mKiZi(6QW=f=6)_EZM0̲ OY0$Iw}`A<Dq֏#)=̕1>%xu]7jVxe AIENDB`PKYW1dvqgtk/arrow_in_down.pngqPNG  IHDRh68IDATxRP]pV'V 6uqa(%Š &'7yw|~~[xgf_-nu(4i$ eޅx ~bi:sH|7M3,|>5&ZLUEO/ڶ x<~:F$aXxUU 0UaZiv\QvJ<~Ǜp8Yh@,Kn7=  -˲ww̌( y<pa|˲`4|F+sIENDB`PK{W1}Zgtk/arrow_left.pngPNG  IHDRh6IDATx0lA`'H< ,ʙ&5$o,RD?Q1qdZι;y zAk}} R`*tWِ-0<z]eY~pk&˲$IrǾ]MӄOT۶4T-aE{䁌<ϗeٶ`20 UU/ b qW+ b:!H0c?IENDB`PKW1}Zgtk/arrow_rollover_left.pngPNG  IHDRh6IDATx0lA`'H< ,ʙ&5$o,RD?Q1qdZι;y zAk}} R`*tWِ-0<z]eY~pk&˲$IrǾ]MӄOT۶4T-aE{䁌<ϗeٶ`20 UU/ b qW+ b:!H0c?IENDB`PKW1/tW3.gtk/arrow_in_left.png.PNG  IHDRh6IDATx0OC x^! @"HbAATLLLlɖI0Hb?lٖ_z߻kNP{(˲)c a8 4/q$u]e!mۦi۶)"xV<[JUUi{&Vuy%)2c˲荒PQ'x7u p⺗/@ ȧkٳ?n5 JG_0:l7 ZA= nIENDB`PKdW1"F޽gtk/arrow_right.pngPNG  IHDRh6IDATx!  ^cP7VUY9QFF*q6xc} 3 D98ć4MC7gu]eGUU0|4MEQzma&I[5X2{C= ʀfGi -i !):H9WAeIni]@dqL']}' Q!2<&Ce@\˻+y ܟ@n{1k{EJgtk/handle_vertical.png sb``p  $s5)AOǐ9?NbÂd$:&PKn'O1>k{EJgtk/handle_horizontal.png sb``p  $s5)AOǐ9?NbÂd$:&PKBW16=8gtk/button_in.png8PNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATxVߋSqri{4FW-jOVy}eErK[ڧB?FZJ$"HE:R df3qޫ}nuN[߷713v "˗/:?7ƜSJ5$3#XkADR"c8h4:;.vr…o'I;)O*JâT*!͕37o`mm nxcc,--E!"tҧI\}ɓ'չs(#y !&F_V[[[L&?r\xc)?r¡CD^cɱ .8uܾ}/_`0x; 4aCGZ0 c`5cF$I0PVQV~1 "WNşacǎRr$IJ+6ɌcB$IR(ƳgϾ3" 3cDaZ2<90!DJ`:H$m\"J) E,,,P>%/^T*e ZhZH)ϱ隸P(T*P(|ٳ""qς bbyFRJL&H)SM'$ Hq#DHrB)%0A@fR Rd)R"eRy,8@+++'YL;SZ#@u7`fXkSFff}#R+!DʆkT!n!ey"IWw>aHLZkhS J)!dbY0g_~vY 3 pl8/oLTd`[^1zZ&#$w]mfkmZ7p̺wWwuu/?~`677Nϟ?S5p,d2b4Ak8SnZ0df+xu7nӋ/VYA >䦳RY̸1h6w;w0>n=4 ȹv-ٞrW^7]%b`z1%AZB"nll|R3gΜ]ff<L"R )%I)Iaq8 Yk۽^v{u@{@fItdSN#z'd4پnS@}YLޏL`OIENDB`PKW1^¸gtk/button_selected.pngPNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oi=IDATx}MhU|$7פ jk! 탂XuPtڑ: RT5E(b&/L{{>>ϻ g:[8P!n,~ZksZkgc#cFfttC ϟaY^]]M]םǏǎSSSqL Y[5UUQ,//s-. ˃ "gϞ=s?.\vZk(XkZ8 \xﻹIjqqq J)FGGS8x B!B4|"UU9Gyިʕ+WȲn?tҺ_+ys޽'t:Pi`0( i9ye,Ȳ7oPUۤi8GallB`B9sTJ)6J)1},K1TUcLsxcŊk9G$hӧOV+e,NCZKQXkBP%}gxO{_"oZc 9 i 9q'#I(H4Mv8B lLJþ0EQBs^G%C'O@ !ϟ?@J~Ooh 10Q9([5A$ I`˗Bo5(1)%J&qEðQ5 0 q5^Z7]!u]VsPILiEEM$I!D@^RnTzdC}("c(PB1V !IagJ)jA)!ڦqSu.###H)1ƤNǵZ-199RFVոA|WyNYaH $ŋZ n 5q7*ٗ{wygg((ݽ{:`5`;wAkRI>HY WƷO( H)* ~v/gYf}jx7j (oH) pϚ RR{ sҽ5qߔR߮8oFo6_]AiwMQ1::ڼ\<{W^ݺ}m G|ݝ;wzk7oެ{~TU|i~` ~y뺦LeYD{uկ.P6@_>|OZssso43'~wS$ 2?M2>t^oڵk_nllrwAo?@333=Rv{աCDMنׇ0 y5O>u=bmmͦimmm1|qU~{;4 ƀSSSq(uYKZ 5u];k-J)g)x{vɓ{^ox lC2vv ޅ2wπ \^Ώw$w.x'|ḋIENDB`PK͵W1^¸gtk/button_active.pngPNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oi=IDATx}MhU|$7פ jk! 탂XuPtڑ: RT5E(b&/L{{>>ϻ g:[8P!n,~ZksZkgc#cFfttC ϟaY^]]M]םǏǎSSSqL Y[5UUQ,//s-. ˃ "gϞ=s?.\vZk(XkZ8 \xﻹIjqqq J)FGGS8x B!B4|"UU9Gyިʕ+WȲn?tҺ_+ys޽'t:Pi`0( i9ye,Ȳ7oPUۤi8GallB`B9sTJ)6J)1},K1TUcLsxcŊk9G$hӧOV+e,NCZKQXkBP%}gxO{_"oZc 9 i 9q'#I(H4Mv8B lLJþ0EQBs^G%C'O@ !ϟ?@J~Ooh 10Q9([5A$ I`˗Bo5(1)%J&qEðQ5 0 q5^Z7]!u]VsPILiEEM$I!D@^RnTzdC}("c(PB1V !IagJ)jA)!ڦqSu.###H)1ƤNǵZ-199RFVոA|WyNYaH $ŋZ n 5q7*ٗ{wygg((ݽ{:`5`;wAkRI>HY WƷO( H)* ~v/gYf}jx7j (oH) pϚ RR{ sҽ5qߔR߮8oFo6_]AiwMQ1::ڼ\<{W^ݺ}m G|ݝ;wzk7oެ{~TU|i~` ~y뺦LeYD{uկ.P6@_>|OZssso43'~wS$ 2?M2>t^oڵk_nllrwAo?@333=Rv{աCDMنׇ0 y5O>u=bmmͦimmm1|qU~{;4 ƀSSSq(uYKZ 5u];k-J)g)x{vɓ{^ox lC2vv ޅ2wπ \^Ώw$w.x'|ḋIENDB`PKW1bƓ gtk/button_normal_in.png?PNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATx}VMoT=^_"c|$N0 Q2 )Rv2Jl," BBb) X@L~~_tJTUԹ*rFD4EEQvwwsscR I'Nlq rWUn{3qҥŋlrrq#"(Bk,u9WZ?ݻw ƍsYĭ[j@D086Z 91B9,pm<{̝;w]ۏY\\d=|z*Μ9"D" 98E߽{{( E;wk,˯u>}u]q 5'O~NDWJXkRJH) BCN95B@6!DH}z7KKK{EQ|OA>QZX`su]s ԯs13 i.EaV<3'c^>2:=^C;_ȝsoyWVVns7_xF7ҽ,R ֗R۷>|EʝGJtkuuզi 5Zp3Bw?w4cisgI\pgN1;??h||<6?9TKփ]9 ԙd]N䓙533O>Mx]mH)^zmsppQksա}$:SSS).J)s'(B89'ϐc9wZ,7^͛7ߤi FA| > 1|`t33@69{1b_t$ǚ*8̻ ]IENDB`PKW16=8gtk/button_disabled_in.png8PNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATxVߋSqri{4FW-jOVy}eErK[ڧB?FZJ$"HE:R df3qޫ}nuN[߷713v "˗/:?7ƜSJ5$3#XkADR"c8h4:;.vr…o'I;)O*JâT*!͕37o`mm nxcc,--E!"tҧI\}ɓ'չs(#y !&F_V[[[L&?r\xc)?r¡CD^cɱ .8uܾ}/_`0x; 4aCGZ0 c`5cF$I0PVQV~1 "WNşacǎRr$IJ+6ɌcB$IR(ƳgϾ3" 3cDaZ2<90!DJ`:H$m\"J) E,,,P>%/^T*e ZhZH)ϱ隸P(T*P(|ٳ""qς bbyFRJL&H)SM'$ Hq#DHrB)%0A@fR Rd)R"eRy,8@+++'YL;SZ#@u7`fXkSFff}#R+!DʆkT!n!ey"IWw>aHLZkhS J)!dbY0g_~vY 3 pl8/oLTd`[^1zZ&#$w]mfkmZ7p̺wWwuu/?~`677Nϟ?S5p,d2b4Ak8SnZ0df+xu7nӋ/VYA >䦳RY̸1h6w;w0>n=4 ȹv-ٞrW^7]%b`z1%AZB"nll|R3gΜ]ff<L"R )%I)Iaq8 Yk۽^v{u@{@fItdSN#z'd4پnS@}YLޏL`OIENDB`PKW16=8gtk/button_disabled_out.png8PNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATxVߋSqri{4FW-jOVy}eErK[ڧB?FZJ$"HE:R df3qޫ}nuN[߷713v "˗/:?7ƜSJ5$3#XkADR"c8h4:;.vr…o'I;)O*JâT*!͕37o`mm nxcc,--E!"tҧI\}ɓ'չs(#y !&F_V[[[L&?r\xc)?r¡CD^cɱ .8uܾ}/_`0x; 4aCGZ0 c`5cF$I0PVQV~1 "WNşacǎRr$IJ+6ɌcB$IR(ƳgϾ3" 3cDaZ2<90!DJ`:H$m\"J) E,,,P>%/^T*e ZhZH)ϱ隸P(T*P(|ٳ""qς bbyFRJL&H)SM'$ Hq#DHrB)%0A@fR Rd)R"eRy,8@+++'YL;SZ#@u7`fXkSFff}#R+!DʆkT!n!ey"IWw>aHLZkhS J)!dbY0g_~vY 3 pl8/oLTd`[^1zZ&#$w]mfkmZ7p̺wWwuu/?~`677Nϟ?S5p,d2b4Ak8SnZ0df+xu7nӋ/VYA >䦳RY̸1h6w;w0>n=4 ȹv-ٞrW^7]%b`z1%AZB"nll|R3gΜ]ff<L"R )%I)Iaq8 Yk۽^v{u@{@fItdSN#z'd4پnS@}YLޏL`OIENDB`PK W16=8gtk/button_out.png8PNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATxVߋSqri{4FW-jOVy}eErK[ڧB?FZJ$"HE:R df3qޫ}nuN[߷713v "˗/:?7ƜSJ5$3#XkADR"c8h4:;.vr…o'I;)O*JâT*!͕37o`mm nxcc,--E!"tҧI\}ɓ'չs(#y !&F_V[[[L&?r\xc)?r¡CD^cɱ .8uܾ}/_`0x; 4aCGZ0 c`5cF$I0PVQV~1 "WNşacǎRr$IJ+6ɌcB$IR(ƳgϾ3" 3cDaZ2<90!DJ`:H$m\"J) E,,,P>%/^T*e ZhZH)ϱ隸P(T*P(|ٳ""qς bbyFRJL&H)SM'$ Hq#DHrB)%0A@fR Rd)R"eRy,8@+++'YL;SZ#@u7`fXkSFff}#R+!DʆkT!n!ey"IWw>aHLZkhS J)!dbY0g_~vY 3 pl8/oLTd`[^1zZ&#$w]mfkmZ7p̺wWwuu/?~`677Nϟ?S5p,d2b4Ak8SnZ0df+xu7nӋ/VYA >䦳RY̸1h6w;w0>n=4 ȹv-ٞrW^7]%b`z1%AZB"nll|R3gΜ]ff<L"R )%I)Iaq8 Yk۽^v{u@{@fItdSN#z'd4پnS@}YLޏL`OIENDB`PKW1^¸gtk/button_rollover_out.pngPNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oi=IDATx}MhU|$7פ jk! 탂XuPtڑ: RT5E(b&/L{{>>ϻ g:[8P!n,~ZksZkgc#cFfttC ϟaY^]]M]םǏǎSSSqL Y[5UUQ,//s-. ˃ "gϞ=s?.\vZk(XkZ8 \xﻹIjqqq J)FGGS8x B!B4|"UU9Gyިʕ+WȲn?tҺ_+ys޽'t:Pi`0( i9ye,Ȳ7oPUۤi8GallB`B9sTJ)6J)1},K1TUcLsxcŊk9G$hӧOV+e,NCZKQXkBP%}gxO{_"oZc 9 i 9q'#I(H4Mv8B lLJþ0EQBs^G%C'O@ !ϟ?@J~Ooh 10Q9([5A$ I`˗Bo5(1)%J&qEðQ5 0 q5^Z7]!u]VsPILiEEM$I!D@^RnTzdC}("c(PB1V !IagJ)jA)!ڦqSu.###H)1ƤNǵZ-199RFVոA|WyNYaH $ŋZ n 5q7*ٗ{wygg((ݽ{:`5`;wAkRI>HY WƷO( H)* ~v/gYf}jx7j (oH) pϚ RR{ sҽ5qߔR߮8oFo6_]AiwMQ1::ڼ\<{W^ݺ}m G|ݝ;wzk7oެ{~TU|i~` ~y뺦LeYD{uկ.P6@_>|OZssso43'~wS$ 2?M2>t^oڵk_nllrwAo?@333=Rv{աCDMنׇ0 y5O>u=bmmͦimmm1|qU~{;4 ƀSSSq(uYKZ 5u];k-J)g)x{vɓ{^ox lC2vv ޅ2wπ \^Ώw$w.x'|ḋIENDB`PKMW16=8gtk/toggle_disabled_in.png8PNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATxVߋSqri{4FW-jOVy}eErK[ڧB?FZJ$"HE:R df3qޫ}nuN[߷713v "˗/:?7ƜSJ5$3#XkADR"c8h4:;.vr…o'I;)O*JâT*!͕37o`mm nxcc,--E!"tҧI\}ɓ'չs(#y !&F_V[[[L&?r\xc)?r¡CD^cɱ .8uܾ}/_`0x; 4aCGZ0 c`5cF$I0PVQV~1 "WNşacǎRr$IJ+6ɌcB$IR(ƳgϾ3" 3cDaZ2<90!DJ`:H$m\"J) E,,,P>%/^T*e ZhZH)ϱ隸P(T*P(|ٳ""qς bbyFRJL&H)SM'$ Hq#DHrB)%0A@fR Rd)R"eRy,8@+++'YL;SZ#@u7`fXkSFff}#R+!DʆkT!n!ey"IWw>aHLZkhS J)!dbY0g_~vY 3 pl8/oLTd`[^1zZ&#$w]mfkmZ7p̺wWwuu/?~`677Nϟ?S5p,d2b4Ak8SnZ0df+xu7nӋ/VYA >䦳RY̸1h6w;w0>n=4 ȹv-ٞrW^7]%b`z1%AZB"nll|R3gΜ]ff<L"R )%I)Iaq8 Yk۽^v{u@{@fItdSN#z'd4پnS@}YLޏL`OIENDB`PKQW16=8gtk/toggle_disabled_out.png8PNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATxVߋSqri{4FW-jOVy}eErK[ڧB?FZJ$"HE:R df3qޫ}nuN[߷713v "˗/:?7ƜSJ5$3#XkADR"c8h4:;.vr…o'I;)O*JâT*!͕37o`mm nxcc,--E!"tҧI\}ɓ'չs(#y !&F_V[[[L&?r\xc)?r¡CD^cɱ .8uܾ}/_`0x; 4aCGZ0 c`5cF$I0PVQV~1 "WNşacǎRr$IJ+6ɌcB$IR(ƳgϾ3" 3cDaZ2<90!DJ`:H$m\"J) E,,,P>%/^T*e ZhZH)ϱ隸P(T*P(|ٳ""qς bbyFRJL&H)SM'$ Hq#DHrB)%0A@fR Rd)R"eRy,8@+++'YL;SZ#@u7`fXkSFff}#R+!DʆkT!n!ey"IWw>aHLZkhS J)!dbY0g_~vY 3 pl8/oLTd`[^1zZ&#$w]mfkmZ7p̺wWwuu/?~`677Nϟ?S5p,d2b4Ak8SnZ0df+xu7nӋ/VYA >䦳RY̸1h6w;w0>n=4 ȹv-ٞrW^7]%b`z1%AZB"nll|R3gΜ]ff<L"R )%I)Iaq8 Yk۽^v{u@{@fItdSN#z'd4پnS@}YLޏL`OIENDB`PKVW16=8gtk/toggle_out.png8PNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oiIDATxVߋSqri{4FW-jOVy}eErK[ڧB?FZJ$"HE:R df3qޫ}nuN[߷713v "˗/:?7ƜSJ5$3#XkADR"c8h4:;.vr…o'I;)O*JâT*!͕37o`mm nxcc,--E!"tҧI\}ɓ'չs(#y !&F_V[[[L&?r\xc)?r¡CD^cɱ .8uܾ}/_`0x; 4aCGZ0 c`5cF$I0PVQV~1 "WNşacǎRr$IJ+6ɌcB$IR(ƳgϾ3" 3cDaZ2<90!DJ`:H$m\"J) E,,,P>%/^T*e ZhZH)ϱ隸P(T*P(|ٳ""qς bbyFRJL&H)SM'$ Hq#DHrB)%0A@fR Rd)R"eRy,8@+++'YL;SZ#@u7`fXkSFff}#R+!DʆkT!n!ey"IWw>aHLZkhS J)!dbY0g_~vY 3 pl8/oLTd`[^1zZ&#$w]mfkmZ7p̺wWwuu/?~`677Nϟ?S5p,d2b4Ak8SnZ0df+xu7nӋ/VYA >䦳RY̸1h6w;w0>n=4 ȹv-ٞrW^7]%b`z1%AZB"nll|R3gΜ]ff<L"R )%I)Iaq8 Yk۽^v{u@{@fItdSN#z'd4پnS@}YLޏL`OIENDB`PKcW1^¸gtk/toggle_in.pngPNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oi=IDATx}MhU|$7פ jk! 탂XuPtڑ: RT5E(b&/L{{>>ϻ g:[8P!n,~ZksZkgc#cFfttC ϟaY^]]M]םǏǎSSSqL Y[5UUQ,//s-. ˃ "gϞ=s?.\vZk(XkZ8 \xﻹIjqqq J)FGGS8x B!B4|"UU9Gyިʕ+WȲn?tҺ_+ys޽'t:Pi`0( i9ye,Ȳ7oPUۤi8GallB`B9sTJ)6J)1},K1TUcLsxcŊk9G$hӧOV+e,NCZKQXkBP%}gxO{_"oZc 9 i 9q'#I(H4Mv8B lLJþ0EQBs^G%C'O@ !ϟ?@J~Ooh 10Q9([5A$ I`˗Bo5(1)%J&qEðQ5 0 q5^Z7]!u]VsPILiEEM$I!D@^RnTzdC}("c(PB1V !IagJ)jA)!ڦqSu.###H)1ƤNǵZ-199RFVոA|WyNYaH $ŋZ n 5q7*ٗ{wygg((ݽ{:`5`;wAkRI>HY WƷO( H)* ~v/gYf}jx7j (oH) pϚ RR{ sҽ5qߔR߮8oFo6_]AiwMQ1::ڼ\<{W^ݺ}m G|ݝ;wzk7oެ{~TU|i~` ~y뺦LeYD{uկ.P6@_>|OZssso43'~wS$ 2?M2>t^oڵk_nllrwAo?@333=Rv{աCDMنׇ0 y5O>u=bmmͦimmm1|qU~{;4 ƀSSSq(uYKZ 5u];k-J)g)x{vɓ{^ox lC2vv ޅ2wπ \^Ώw$w.x'|ḋIENDB`PKiW1^¸gtk/toggle_rollover_out.pngPNG  IHDR"nsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time10/23/04oi=IDATx}MhU|$7פ jk! 탂XuPtڑ: RT5E(b&/L{{>>ϻ g:[8P!n,~ZksZkgc#cFfttC ϟaY^]]M]םǏǎSSSqL Y[5UUQ,//s-. ˃ "gϞ=s?.\vZk(XkZ8 \xﻹIjqqq J)FGGS8x B!B4|"UU9Gyިʕ+WȲn?tҺ_+ys޽'t:Pi`0( i9ye,Ȳ7oPUۤi8GallB`B9sTJ)6J)1},K1TUcLsxcŊk9G$hӧOV+e,NCZKQXkBP%}gxO{_"oZc 9 i 9q'#I(H4Mv8B lLJþ0EQBs^G%C'O@ !ϟ?@J~Ooh 10Q9([5A$ I`˗Bo5(1)%J&qEðQ5 0 q5^Z7]!u]VsPILiEEM$I!D@^RnTzdC}("c(PB1V !IagJ)jA)!ڦqSu.###H)1ƤNǵZ-199RFVոA|WyNYaH $ŋZ n 5q7*ٗ{wygg((ݽ{:`5`;wAkRI>HY WƷO( H)* ~v/gYf}jx7j (oH) pϚ RR{ sҽ5qߔR߮8oFo6_]AiwMQ1::ڼ\<{W^ݺ}m G|ݝ;wzk7oެ{~TU|i~` ~y뺦LeYD{uկ.P6@_>|OZssso43'~wS$ 2?M2>t^oڵk_nllrwAo?@333=Rv{աCDMنׇ0 y5O>u=bmmͦimmm1|qU~{;4 ƀSSSq(uYKZ 5u];k-J)g)x{vɓ{^ox lC2vv ޅ2wπ \^Ώw$w.x'|ḋIENDB`PKW10Ggtk/check_in.pngYPNG  IHDRtsBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$IDATx;K+Q''gFI#jjK[ X!Q QB8-r3r7fk?"h D8%@"RI3 ptZdyyc J"O&^mQ 97+o6SSSdYp8$I^^^8??9!www(J)*Yqyy cl>TձPkM5ᐇ...s'Vj !`f^/rΈGS!wж-1Fl**.cm[Dx<03RJGc' /"4MCUUSCyG"4ͷb], 7Ԓ+s8f89g 97\.Q bə;Du À9WUaӉB9)Dsݾs!,"H!d  IENDB`PKW1Nnigtk/radio_out.pngiPNG  IHDR r|sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$IDATxUj*Agwو ,V`Wl|Mҥ1BK `cl5fwrt?s~>*u6 eYvf4~5I&s44MyxxZ*p8d<$ J)Rvɲ(n _^^$ {8B'cZl69;;c# CE~hjޣ1\\\`Ak7EQPTpQ%eY1^c JJ1jR0 + (),XVz㛕R$yEdY֒)___&" @kMj5bEe)fxZ#@J ssc^߮nGuRy{^^^p!?F}:ZOVł4MEZ!m۳KmsIENDB`PK~_4pyyb`:)^RՕOYk-;;;T*\e<cZ ys1RVDQ#\__n sʎ!Vzr8IӔ~1A)EY)E4MjAGSשVdYF$ߒ`! C1TUnooy{{nh4PJFkP2ϩT*@ۥP>I|K"`@Ze<==aU(f?fyzf2EQ1j~뺜I HOyyyQYZk<DkO-Љ@IENDB`PK W1Ugtk/slider_horizontal.pngPNG  IHDR w&sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$sIDATxUʪ`DO ̴ƆhkJ*8E7RZPSEXt~ygxl,0 nKȲlVqLD4ض[,K0,,b~z|>$ E(5?yS.B|r!MS7i&IyxmH)4녪$I*V>e'?J%/`0v8e8>ۍ~2ii񈔒h$@$LӢ( :jDE!q~fSV++J^G0iIENDB`PKW1Ugtk/slider_vertical.pngPNG  IHDR w&sBIT|d pHYs B4 tEXtSoftwareMacromedia Fireworks MX*$sIDATxUʪ`DO ̴ƆhkJ*8E7RZPSEXt~ygxl,0 nKȲlVqLD4ض[,K0,,b~z|>$ E(5?yS.B|r!MS7i&IyxmH)4녪$I*V>e'?J%/`0v8e8>ۍ~2ii񈔒h$@$LӢ( :jDE!q~fSV++J^G0iIENDB`PKܛC1;Wicons/FloppyDrive.gifstL``Hc`PȠ ?~DF.:y -[sN//s$%%:t(!a[nܸÏ?^tŊ+W~سCAAA@@ ^|) X_?y[K˴,%%եK{* BC/޻yۆFF&qu!6]ΡCL9a5kѱ8,lNZZiUڲ=mmm== {{gv5tuMM0Ǧ6G^N> vGanffEFNvaF66^FbF 3۴Mm.nUgaV[MQFgK3 A>{M\ gYؘYX-$LNr=aa7sdqQpHh4HP`Lrgjb&%a.3MC$5PKC1(Licons/Computer.gifstL``Hc`P  /'ᣌx~o]\viV?XF֒ē׭;ƭkR*S3;W<ĝ.?0g߿w>d ^㏗y}~m?s-[Nnru{K^\–-w=?3]3f.h69%einݱE[ 斕 Zga]lf-/_n٩a7AcmmISYɊiK-gwuev/GW4?zc )M)"af")IWVD୰DB ?W-I 7FA Kx8 $fT/` PKC1w Picons/HardDrive.gifstL``e`P ?8pÇ 'OܱcǫW.\UV5cƌŋɵ3&&f֭--}߿1c3.]0yҤI7nHI) ,))-vv066 e`uR#bI&|d# \] dw4h=nyÄe .PVqU)n v>VV&u%e1E&gV6!61a6w9q %˼zX|6n` PKhQA1)icons/Inform.gif;{?0g Vr\r=nG9tܺ(0˥[-K16j6EC4Zt1 @~r*^,;IYkk~)x\YU;-{/Z6p^_"w5[BPI;[`^n@_X 2LjcKER+WU}gYbSHDݺNEf3u Nݜ΂_ѕ$pzoঁ PY!5lI^g^3/ށC®}TJN*c^< %& /H+G&|ů|S#$I Y2# Jf%o  E.eɗϟ 6+x{Hf7#0jk|᚞/'`@yw]g_eT:b{r(yyx Rq |O;mxNN5(z܅:!hmNvKA^+3y.sؒg%/N*xDA+*GHozK(&ݣ_z>I7ǡNiX6-50DLqozHT;::/B` sviqK,b$'7pЎQq715%1qr[E% :s/QCx%f|2jU(k}'S '6y9?+V& U"o5ee9%J5@?nlghߦGQ >F|#ڋ#ݜRP*zN؋C~:xTIфȦ|6Qh,sOH QrS߰#Y͊V05#Vkz'xPw6hZl&2YטB&\a۞0vc"W9I*--ѼUa/y-68Rǁ9'k*) wE IViS=^z$4}nV9Whac{c-yevqx/2w6&l wyۍa]dÙ"ᦳM'7wo Efx,=YiC1tot5t< n>#4mX4 C?HdDzqJ @:' 3)oTLbRpUǤJ0-Vp[(U0@67iK)^F9IK:|l[nmA0("`҇ϵCY}B܅l9S ςR'WmNUAn*$x*ϲЭ ¯L4"V|J g]LĬbgѦYrG RFfZ[T{ƟC"y 7] &be05;?GeMaNnoͯhnHu;|~VZ*HPKQA1Ȍ520icons/Error.gifS7{=̷Mik*Ũs- ru1$;tYt!V#y(JWf1ٮr$+塛JW+9s^y_~b&`.]{wj1dP=4YӜ9wt4PQn2Th#".sLnJ}WTвekzz $F|{01q%KLRb7ZQSddTtglO.Wd79 S*f<'P%Dڱm!(7) cc---RT~d~*-eXC8\\pJhgTz-*J_U5TT|p800h,;uk퉊Xu#ejXH$R+R)Tj5J}&<M}o3奌~=/&Dz |y "e L A#&(bҐˡqkZ%!41}?7PH.J𧭯n̡lPBep uAkACaA ݕh_W_ȼʶzu6 ,W3=78sE%#SwC7ښeӍ9 ԈtA۠Hos9+[4p elW0ˢt7e"4+.LZe.rb[soӎ8ё|rPPs%^S7+x:2N'[ٷKPyQR)4*Ab㖫gXkJӧozҥK׮]kn+((Llhh(*//|_E\?;ҥo|zz-Zo߾)SN1k˺+WeR}w[S3s{sg38/{W3 7 9XI H,cbdpQ5P۩7Jj:.1}s|{8X]Yyytlٚ8%%94de611ps2i 1 ; b\ _aPzUwA.IIG \"-(3ʬlq҅1ɏPK=C1)j2picons/File.gifstL``e`PƠ ֿ3LNNnYzoמڹ_{{{?ϟ??}ek~_zu˹)ǜze/]ҭyϔ-s1P:Ltc=D Üf ]>njE $l0*xf"\'jbd.KR.ngivR`ac3%VFc _8;b,ŞYXWT`;qJ ϫ92XPKH0D[yicons/TreeLeaf.gifstL``r woQ0 FP̠<!aV!-nn.B0t H>9)Fb rq< ~vv8Ös 'qp0XPKW1Q*)\jicons/TreeExpanded.gifstLdd0f`a{^zҲnݺǏ_|9==}ܹ E^e"ۡ l dFu`\os\PK@C1}t)hicons/TreeOpen.gifstL``;vݹs,Ɏߧ_oytÓʹUgΜ)((:-RN#G~շgs A`s?^X+qo}A@!ş," j : O l -\ Ơ>6ҫ`3UA=g$,EsT';J[Kc nbзFa3tZY!JJ,< : /:ь=N&p<9q~6=[1BgQUldoUVv:l2`t\ѭA]~-iYB90oa5{N`g0GP~BιS=cV;bm-uO9zys%.wG7.ꪎyFUayY69J% b 5T]M_4)'TwNm.b-4c*1m0a GWrkf˯Y({R8>9{\]2`mTO?mS+(pA:zNcha6q M쮝Jz uva"sK+=gwHI!D&UlN>95/Hd3*;02v(e(MQX1% o`ЃY ۣY|\9X꾿[V2܌p`bfXʠ"I]#'#׬HPv}'GfƔRp)#ԍw l+eX/w2 BvAJmnz8w6ӼLoK (x+F(ůߺܢ'ؒD"dt\;?jbp0+Ov+>PKAC1zicons/HomeFolder.gifstL``x 0'3k)]ꠠ3/t߯֎~*|jU4} nGw{rM+/=i̙{,Yrv Q233w|£F{5k9%a~^b1eoo[.ׯOJJ*--ο?_ۅtɉY@?{?\< aş," > : (Nد7457)7r02(k*+͛)?CBnEKDDWk{2m-%-e*b{CB_˙KKGLJgTU-v2qrp`-i΂ [90xpei␗cbFņ~>% GXX%dE"')c)సwߕN>%<3J`PKɜC1k97icons/NewFolder.gifstL``xpy[9wT٨Ǟ=/L0ڛg9~>k=_syof?;_]?r?]nl oO=wכ\ӝiSxHl3)Wo{=MywtJZ—_mV?Y2_ݹ׷O=Vh?f߯Gy (daadq@q>߸YI_CGމKd< :l.Rn6lQ0ԴUV_m-f'((gnLBI.2K+44nݪj"/3ZAf')U(Mtnod`PK'C1ɨ(Micons/UpFolder.gifstL``xpw9TG/Ugͫ׸o>RG$+ZhgKlg-Jӧ)Sm;,pD#:^ >:VyJ/'IxQ49ә33[iS{e۝ Uj(fMc}~v1*?}9te+ _lOc~9-ǑEc]-{q^I͵NV~}us`׽5zRR>-̳C.2U!A ,!qf.5dT}Knω.<-"xT1rw2&jj 8q7p=@@;vm,'vf壝ӽY3ŎԊr"( 5..ꓯ'Ѧ@42DWo7&FL=qeĉ٦qq}rh88~9(r26 Mz)8ΈWE6?W,M v-2&.&Na/Żܥ]dоFeZE0}M/ Aȿ:-״u -~& tpramvAsN!kjFYOTJvqӻǵ$,(:&x_gV5bT1OXeDaV剈B2= jB%rUL,N~odB>dp ~iKK[ l O澝V9G &4hg-cA4zv7v?GhE䲳,백)Îo/4C-i3Mˠ RW -d|,͊{P 3SKY!Ѷ ʼnɖEN;:CSj>ٱb1h=/A %~>^7,9x'lAMO+Om#&_Mܐ JaL,`MB?߽H}`Q-]Y?^vIw!LPO)m'vЙT䬬ץ\eU߬d@W6nU~b ggxM=\_6ihNR-rB*oHgtSJ$HidP 1RL71tbѴY+ȕ!R]qK('bNۏn֪:FHb>H-G;p CEar)H)TFU/Vo)SdDWTb['Վo:-lZgcA$E\üMMSRg@1Jw*'۷蜁jw8A̼)$3$i8*D48Y,&v߭KF;?iu66|dlK[ujd(5+7 |Zmҷ4ꗐN PKX1 icons/Window.gifstL``8ӓjժ3gTTO2k޽3gtppHKKkii~zQQCG.]mwWUU9r(daadq@v2NOP{Ԭ*n)6Ei:ܪ3p0 v,looommmiiAs6ͿDi ʹFRNg&9??G;,`~2D4X__.hkkk]]]d򛹳%f ǿvTj2@RO魭-\>:::77GΑHXsP(@%ÜvĄmnnBvyyYV"r9S,/.. |ATf‚N B ?<\.+kZ-JXέ^ H$(Z/..%P}>#(x4L$ nOMMQ1ks& $xBKpâ݃LyعC_=!~L^Dfe2Y[[ZTjZ/y[>+y.P###4[0? =`4=g@m?(/iTG ڄuIENDB`PKn'O1Oakde/close_rollover.png$PNG  IHDRIDATxmJ*Q"ː@(DEeu!EAd*ZETO3BҮ3s:eVp8Y,fS-˥U*USS^j[2 uttxޛB@$GAzLtB$^_*?>>(Ta t:LlŹͫڊ(Ta |I`ב٬VZ* $$IB&a F3;;;===99988ގff* $<.ADQ C---Vtnll0L𫶖hxyy* Cb:YKqwwn|n{tttlld2moo3!)Rw,9qGa5g8J pZ".A-B/,,m{{{|~3NB ,sSX<<Br#BT"v#X{o(F͛$_g!_S.ZxT*\.dHt[:`閖d C<t: Űl6{Kf6j MVry8#=i4NGF Vo˥P(@XF^*u: ȧnpDQrT*XDǂ=nBf(JRn6bB`@%z=t:j CN|< S*Wl6Dbe>!ЕzlՊ[C~||hjL&///t:"=l H&L¤bϹ^, HQDft=DFL$xXqfE1^|ivB===H$/AVR4t 3`# ;f4<IENDB`PKn'O1$µkde/maximize.png*PNG  IHDRIDATxm_/a*jCm6$Nt`SH밣A(1-*+!󰙍ͬA)ǯy4{vuw>v,looommmiiAs6ͿDi ʹFRNg&9??G;,`~2D4X__.hkkk]]]d򛹳%f ǿvTj2@RO魭-\>:::77GΑHXsP(@%ÜvĄmnnBvyyYV"r9S,/.. |ATf‚N B ?<\.+kZ-JXέ^ H$(Z/..%P}>#(x4L$ nOMMQ1ks& $xBKpâ݃LyعC_=!~L^Dfe2Y[[ZTjZ/y[>+y.P###4[0? =`4=g@m?(/iTG ڄuIENDB`PKn'O1,Dkde/maximize_rollover.png)PNG  IHDRIDATxmJbQϛN hLY`%tE^DdSju1J]SǂjL=sjL=i#4_'b[{ߙ~___[[N⣼>{Z.rl6["(ˍF"L:Nggϙ|>~5Y,sܜj_[[z999I(D$K^YOOOmL&^ P|>QHxIs<L0moo7 XHxEEQL:;;i_сo6(eYP%v}ii)Ӗ`F"eHPTgx 7J4vcQЉ@~V[f;0"܍\__SaWﯶ(jGAxxY;crIENDB`PKo'O16bAxkde/maximize_down.pngPNG  IHDRIDATxmKbQKNdL>Dt1 +&BF=TcQłp<1OM,/Iu1b6:{mMx]cjj(// }\ppܼr~~ ...VWW:;;^]?g^__|ںM&t @2lGGG(D ’tssz;::~,??xdde``( $$IB8fZ1&I#ba HDE˝-uhh˿_ DdANKK7u|UGEE0b p'{ִ;쭭fyyyysss{{ڪzzz ļmmmbP$KxxxB1vEm555nu0YB,es|l1 U9N ,j%jX 9X4* |6ONWH$Xnlld%,NC'  O{qgKt-i N>׷Т'''\l__( 緒L%p0<,>#R2:(b_d>qDIENDB`PKo'O1SGsnkde/maximize_disabled.pngnPNG  IHDR5IDATxmjjQ#>Br#BT"v#X{o(F͛$_g!_S.ZxT*\.dHt[:`閖d C<t: Űl6{Kf6j MVry8#=i4NGF Vo˥P(@XF^*u: ȧnpDQrT*XDǂ=nBf(JRn6bB`@%z=t:j CN|< S*Wl6Dbe>!ЕzlՊ[C~||hjL&///t:"=l H&L¤bϹ^, HQDft=DFL$xXqfE1^|ivB===H$/AVR4t 3`# ;f4<IENDB`PKo'O1$µkde/minimize.png*PNG  IHDRIDATxm_/a*jCm6$Nt`SH밣A(1-*+!󰙍ͬA)ǯy4{vuw>v,looommmiiAs6ͿDi ʹFRNg&9??G;,`~2D4X__.hkkk]]]d򛹳%f ǿvTj2@RO魭-\>:::77GΑHXsP(@%ÜvĄmnnBvyyYV"r9S,/.. |ATf‚N B ?<\.+kZ-JXέ^ H$(Z/..%P}>#(x4L$ nOMMQ1ks& $xBKpâ݃LyعC_=!~L^Dfe2Y[[ZTjZ/y[>+y.P###4[0? =`4=g@m?(/iTG ڄuIENDB`PKo'O1Okde/minimize_rollover.pngBPNG  IHDRIDATxm]K"q)^tU BZ(]ub/PBI]kYЛ96Sۤ>BKi?9ϙ9ބOwVVVFH O} 2QL&l6GJjnoocn'ϋ_+ B.;T$РTJ%QWWW|>_<G)IH0dPBUdzvvvaaG Y^^&%zYnt\P(!A4(S%BWGG~gtttzpll>ɚL& (wŢ3X,|ǡ wvv Rx{Fl6E"D"d,H{0A)$j*CLdž Y4CШ7TU;V+]QA\&>??%(Q MM/(_\\P( xyyOP״nl:P׸clIENDB`PKo'O1Blkde/minimize_down.png3PNG  IHDRIDATxm]KbQ?WxoxѵQA_sXiQQ:TZVc9vNMǬId4Fy׳Y{w+++FQj49[#,Ӳɡ!әN%I:??w\D3s\&~_Fl6Q8o!vfPf}}} '''d2Hh$k^I8%}o 8bZy0lD(J{{{L&ܜn ñ@“%(,b8y+uvvV}yhGGl&)YVEf?_i^Gח` |FQ߷3 " p8' "YݝK:88aoo/ @KOOOQIx'a08myww7>QHx^cZzGo9񞞞.2'  ߾OOO^__+׻̽Q8Da ?C=pEx(Xǁ2ǹB^ߟ֠vRп2 nJV 2IENDB`PKo'O1SGsnkde/minimize_disabled.pngnPNG  IHDR5IDATxmjjQ#>Br#BT"v#X{o(F͛$_g!_S.ZxT*\.dHt[:`閖d C<t: Űl6{Kf6j MVry8#=i4NGF Vo˥P(@XF^*u: ȧnpDQrT*XDǂ=nBf(JRn6bB`@%z=t:j CN|< S*Wl6Dbe>!ЕzlՊ[C~||hjL&///t:"=l H&L¤bϹ^, HQDft=DFL$xXqfE1^|ivB===H$/AVR4t 3`# ;f4<IENDB`PKp'O1Q4NQkde/window_bottom.png sb``p @$g6]R.!sw_hH\ ki7 ݊0xsJhPKo'O1.7yIMkde/window_left.png sb``p @,$=R".!s-j~|5HHrMwP8oy|4Zl'P8Qىe N ,Wge pH )gtk/arrow_in_up.pngPKKW1pt @gtk/arrow_down.pngPKMW1pt Agtk/arrow_rollover_down.pngPKYW1dvq 'Cgtk/arrow_in_down.pngPK{W1}Z Dgtk/arrow_left.pngPKW1}Z Fgtk/arrow_rollover_left.pngPKW1/tW3. kGgtk/arrow_in_left.pngPKdW1"F޽ Hgtk/arrow_right.pngPKgW1"F޽ Jgtk/arrow_rollover_right.pngPKrW1'" 8Kgtk/arrow_in_right.pngPKm'O1>k{EJ Lgtk/handle_vertical.pngPKn'O1>k{EJ Mgtk/handle_horizontal.pngPKBW16=8 Mgtk/button_in.pngPKW1^¸ Sgtk/button_selected.pngPK͵W1^¸ [gtk/button_active.pngPKW1bƓ  9bgtk/button_normal_in.pngPKW16=8 4igtk/button_disabled_in.pngPKW16=8 ogtk/button_disabled_out.pngPK W16=8 vgtk/button_out.pngPKW1^¸ |gtk/button_rollover_out.pngPKMW16=8 gtk/toggle_disabled_in.pngPKQW16=8 (gtk/toggle_disabled_out.pngPKVW16=8 gtk/toggle_out.pngPKcW1^¸ gtk/toggle_in.pngPKiW1^¸ (gtk/toggle_rollover_out.pngPKW10G Ogtk/check_in.pngPKW1b_m (gtk/check_out.pngPKW1Nni Fgtk/radio_out.pngPK0@AtG_GY|Oǐ[?g`a`/e PeSBPKf)0PKi/ gtk/file0.png sb``p  $'L0R%g-||(YY-Œ Jz8TJYSb)7SM^Li N*btsYPKsDrzPKi/ gtk/file1.png sb``p @,$L6)1Oǐ9q~H R)W-}]O:7U0xsJhPK_uLOPKi/gtk/file10.png PNG  IHDRIDATx[ PV*%$*)sIIm򚽵Q^>9Osc |36{};-Ib 93)# +"Np}ׁƢ)U;Cbَ$M?Db B⥛}S%(e7q+;+y<&gZ_X)Ǎy81s^ s:m2 ӢwY IENDB`PK PKi/gtk/file11.png;PNG  IHDRIDATx CG ]?alk)Kg0?յz? 4[G!̟9Osc |36{};-Ib 93)# +"Np}ׁƢ)U;Cbَ$M?Db B⥛}S%(e7q+;+y<&gZ_X)Ǎy81s^ s:m2 ӢwY IENDB`PK PKi/gtk/file15.png sb``p @,$[/)-Oǐ9q>xmŎ+i1i`)00;Z) PKT'acPKi/gtk/file16.png sb``p @,$[/)Oǐ9;j9?ɬuq^s_ǯY0$ 4dMSL nx|)m. ~.PK+PKi/gtk/file17.png sb``p | $'hjRў.!s+Ȳ'C|욬Ao_OKQË.-wOOO=P@'(á`G%QvzOW?uN MPK+PKi/gtk/file18.png sb``p F $'?R.!sޞ z؆IDZkNz[}s铆[ VZ%' \|M #W gtsYPKnrPKi/gtk/file19.png sb``p  6'l9$<]C*$Gt0|E |_1atsYPK> MQPKi/ gtk/file2.png PNG  IHDRIDATx[ PV*%$*)sIIm򚽵Q^>9Osc |36{};-Ib 93)# +"Np}ׁƢ)U;Cbَ$M?Db B⥛}S%(e7q+;+y<&gZ_X)Ǎy81s^ s:m2 ӢwY IENDB`PK PKi/gtk/file20.png sb``p @,$$)wOǐ9o;2(0lylBo= N^8q{hxu;۵d #ޕG ~.PKA~PKi/gtk/file21.png2PNG  IHDRIDATxݐ {.Voi$b/`1qy_?*0YuU^z~Xϖ7ԣ' yKdt`8&INdc/-D2r m$/c&Dn`A仺!? .]/Ӄ.IENDB`PKBPKi/gtk/file22.png;PNG  IHDRIDATx CG ]?alk)Kg0?յz? 4[G!̟kzUտeð/\W1י9^}qQ [G.) PK=twPKi/gtk/file24.png sb``p "@,$cHŜde  xxv,wS~) NvVT) PKMtTWPKi/gtk/file25.png sb``p "@,$cHŜde  xxv,wS~) NvVT) PKMtTWPKi/gtk/file26.png sb``p  $'L0R.!s|z*4.q=!o?b ) PKM~[^PKi/gtk/file27.png sb``p  $'L0R.!s|z*4.q=!o?b ) PKM~[^PKi/gtk/file28.png sb``p  $'L0R.!s|z*4.q=!o?b ) PKM~[^PKi/gtk/file29.png sb``p  $'L0R.!s|z*4.q=!o?b ) PKM~[^PKi/ gtk/file3.png2PNG  IHDRIDATxݐ {.Voi$b/`1qy_?*0YuU^z~Xϖ7ԣ' yKdt`8&INdc/-D2r m$/c&Dn`A仺!? .]/Ӄ.IENDB`PKBPKi/gtk/file30.png sb``p  $'L0Rʞ.!s|zz`N<;KQg9W/sP9:&PK/X\PKi/gtk/file31.png sb``p  $'L0Rʞ.!s|zz`N<;KQg9W/sP9:&PK/X\PKi/gtk/file32.png sb``p  $'L0Rʞ.!s|zz`N<;KQg9W/sP9:&PK/X\PKi/gtk/file33.png sb``p  $'L0Rʞ.!s|zz`N<;KQg9W/sP9:&PK/X\PKi/gtk/file34.png sb``p  $vk) Oǐ9'T >kzsտeð w}ɶB+ wOm) PKƤ:nqPKi/gtk/file35.png sb``p "@,$cHŜde  xxv,wS~) NvVT) PKMtTWPKi/gtk/file36.png sb``p "@,$cHŜde  xxv,wS~) NvVT) PKMtTWPKi/gtk/file37.png sb``p "@,${+%NFa m~8 <"@ݺ?@AtG_GY|=Oǐ[>~~i >α,>qaI\mu0XUyųSӖ,a`adw~ieSBPKݱwPKi/gtk/file38.png sb``p "@,${+%NFa KلB B xn K#~?@cHŭd?4 X0sҤC.۶: Y)iK00G;}) PK.PKi/gtk/file39.png sb``p  $'L0Rڞ.!s+H az#;UǮ4:20sel@m ~.PKFԏx`dPKi/ gtk/file4.png PNG  IHDRIDATx[ PV*%$*)sIIm򚽵Q^>9Osc |36{};-Ib 93)# +"Np}ׁƢ)U;Cbَ$M?Db B⥛}S%(e7q+;+y<&gZ_X)Ǎy81s^ s:m2 ӢwY IENDB`PK PKi/gtk/file40.png sb``p  $'L0RV.!s-[{v0vl&) aXݑdjxHJ€wƪ_y6&ir]A~_X0xsJhPKL̜qpsPKi/gtk/file41.png sb``p  $'L0R.!s-[{v0vL^=]S@ٛ6DȐߐwƪ_y6&ir]qK֙Ӂ1xsJhPK2tvPKi/gtk/file42.png sb``p  $'L0R.!s+H2/>zY ~.PKDĎvyPKi/gtk/file47.png sb``p  $'L0R..!s-[{v0vL^=]S@ٛy:.}|O',[gm9.Zx'y ~.PK2;{}PKi/gtk/file48.png sb``p  $'L0Rz.!s+HHH8U[o~;ވ̺;3xr{λ $u2xsJhPKXcgPKi/gtk/file49.png sb``p  $'L0R6.!s-[{v0vl&) a8JJBBZC(?#*l̼[*i.Q$pq~W0xsJhPKruPKi/ gtk/file5.png PNG  IHDRIDATx[ PV*%$*)sIIm򚽵Q^>9Osc |36{};-Ib 93)# +"Np}ׁƢ)U;Cbَ$M?Db B⥛}S%(e7q+;+y<&gZ_X)Ǎy81s^ s:m2 ӢwY IENDB`PK PKi/gtk/file50.png sb``p  $'L0R.!s-[{v0vL^=]S@ٛy!wFGegf-_Lz4xM`hE(OW?uN MPKmuxPKi/gtk/file51.png sb``p  $laR.!s3ehX!ye`*ׇþΫ^`,UW`9eƆCj-LWR>rt`=`pH\BbU ~.PKKSPKi/gtk/file52.png sb``p  $laR.!s3ehX!ye`  ?>mAYd÷nJCVɬUS{ԬaИ$bj`׸GKA阪ZSH?xାUOW?uN MPKPVPKi/gtk/file53.png sb``p | $'hjR3=]C*Ldנdebemep7:ZYRQq^kgn2ҶuXO4nuuMe!tK߳8rrcs f̏k)fg(\;].*`0iat$:&PKpbSPKi/gtk/file54.pngPNG  IHDR*IDATx; Do+9B-i)))iS$Ϛ*k`6a]F)9ϲYكV[;ֲmkbU/S*bU9@FU 8 PJX/>ZQynFI.8R.QZV/9'uUۂԘg+-}An:WIENDB`PKQPKi/gtk/file55.png sb``p Ң@,$v,.R.!s+xwnĐ+ughqo <]\9%4PKwTVPKi/gtk/file56.png sb``p Ң@,$v,.R.!s+쌎Đ+ugxWIP!:&PK5SVPKi/gtk/file57.png sb``p  $'L0R*.!s0_C= mݿ/Z(ƻ߻E;Au&zOW?uN MPK"Y]PKi/gtk/file58.png sb``p  $'L0R.!s0_?뿼dEt%m*o^&[3xsJhPK `WZPKi/ gtk/file6.png PNG  IHDRIDATx[ PV*%$*)sIIm򚽵Q^>9Osc |36{};-Ib 93)# +"Np}ׁƢ)U;Cbَ$M?Db B⥛}S%(e7q+;+y<&gZ_X)Ǎy81s^ s:m2 ӢwY IENDB`PK PKi/ gtk/file7.png2PNG  IHDRIDATxݐ {.Voi$b/`1qy_?*0YuU^z~Xϖ7ԣ' yKdt`8&INdc/-D2r m$/c&Dn`A仺!? .]/Ӄ.IENDB`PKBPKi/ gtk/file8.png2PNG  IHDRIDATxݐ {.Voi$b/`1qy_?*0YuU^z~Xϖ7ԣ' yKdt`8&INdc/-D2r m$/c&Dn`A仺!? .]/Ӄ.IENDB`PKBPKi/ gtk/file9.pngSPNG  IHDRIDATxJ@>  mX(5(&{&yqL2Lewpp4_ՃFy܋轑/oƟ&ϒrTB,-D_'[B1%6zU#} 䫍VպMCI˵[Jgd]XJrqLZ 'rX)Z<~uLtG+}L>_jEI&DyG4U&Փ &/p!Bm&üܛo uɸIENDB`PKljXSPKi/ gtk/gtkrc\mo8L|U[=z ՝N1JLi?y! $MqyfM8 '󮭠wY bC<0֜򿟃6`\FC3ubP)B/=Ǖh^ 7Ÿ /(qVA%t-W&R=!Ug<67Sݰ z_JiFsFlcDяaFt:@Pe];y,pm%P7lM<&r گ6.AbpA:d6k̰#;8: o!6"eHOL66jJŢIDGfbb.jo)Y,~hA v3fc+I(|C~C`q/& nvR7?LVLg;,U*j4΁?h=SO0έP³#̇ Pw81Bw[rTsbF]l+$܃sM'V-|<"D2{=ru,5R= +"˯a nX spghu_ v|CSI3"N8 w d}oX\1.?32#&-FXT}$#B$iZa;$nP J:{mDҪї@ĘmyD -_ b: PdRpAOXwVί`F(2KZV1,orAC)ꠞgT $F2cr F9"w[r*TSbLmk m1ʌ;ټ3M HX|-~b.~H_IAyAUJs^C-ڎNWlԃ!PZAKƄX426 K?& euh dfXͿ]]9&9t( GyJDtLc]]ɴ*V>:=z{@9jW{zRAϺXo-B[J‚ʁ_QF9-B[ϕ`)epIs-YI8Xdffܵ,jd{h`U*(ys1Oh+1۽u3K 鲳N.LsQhH$iAѵv,%'dli[:THqZ(2m9&+gEB j ^4?L K7`;}][JP4A7鶸n8Tƍ:b3'1ĬT"TPUr&GM#u*=knϾDpT&8t^2l9}nX;|/ \ ~;5HU,=i xw0BC%;L(2|-on] Cm3.lhU2eɘy䶤a<0k"it!p9M\Q{|r:%BZrTpwO)kÒBZCP҈ 1N_&Ma' MAUPKDXPKi/gtk/optionmenu.png sb``p F@,$cמ,Rz%%E%y ! Ez & ũ%z FF FFVVƦ  Bvux_de:j(YY֘ ;:20l Otq Qk[ 6nzןl\ywv0|̻9%ng$np3IRﲌ Z;.XogSpDԈ&vL-b 1mY'W?dw8d ,3OeSBPK?APKi/gtk/optionmenu_disabled.png sb``p F@,$cמ,Rz%%E%y ! Ez & ũ%z FF FFVVƦ  Bvux_decu2P#3:1dIwud`'ȟRq+٦ Cf KlܰɅƦLjQOO\10].|$mȥuj̒===Uڤ;\R'^>`(&/iA-bI=EVlvtEEgquY sXsx_`d|#shj13<]\9%4PK$_CFPKi/gtk/optionmenu_rollover.png sb``p F@,$cמ,Rz%%E%y ! Ez & ũ%z FF FFVVƦ  Bvux_detP#3:1dIwud`'Rq+9'##A$5l8Pկ?oTpSqLJC^is #vyBAٹC[ʬqXrnQSV!eZ[B6}ebNoؕ0\R}<K, D.aTWiD_WFM9xlwK"ggtsYPKIx-^_PKi/gtk/splitpane_downarrow.png sb``p  6,4c"+q(q.JM,SMeHS0T(N-(S0200R022221W6040T=^~QDF<2gGd1В dP%בac?DV _1Vry'/,pS-oT$GrrF4^W Z<]\9%4PK^PKi/gtk/splitpane_hhandle.png sb``p l@$gJ\#JRK2B2sSR2s S J  -L id/ue("d!(YYwH ;:20l [z8TJϖY+)J" x2I0@AtG_GY|kOǐ[5f`TS^^@{ O6 ڋ9U4᏷SX1 3- W4) PKPKi/icons/Computer.gif5S[HQ - @Pz;L7B a  1=$-f 5E]̮ۋFbYHfNtv93m׭_|َ4H+ۢ7hvc( WP, SRRRSS322rrrrsspQQQaaa^^G%Eu>z# !0C_C"`G *238@Y"vO!32#OebdF(^&9I, En4T>k6]L%39&U;rĻU5,D͙z6QfTmJEQQZ1D6іc!gX|v| }ltDV2vL{~j c3@+.#ԡY臩 ,cYE%#ZľdhU!Y%%%H.777wuu%ᱱ` Mw"95$Xs=`IW= iNdOOX[y]KT7NլƚW~x(NݺzʽPOьs#k¥:J[d`ˋ+=dF'W?HdnǕ 7V{wjq /PK"eN{PKi/icons/InternalFrame.gifst0O`` `444 gY@Ad3~wy8s҉: >|s6jӦU8*N$w/ɕq( Z彦U[Վ"5=w3 5PK]PKi/icons/TreeClosed.gif5Skah:4"A% :To"E 4NAk? ;.EPx Z N҂Ɋyw'}+[}|K6hh$}U6Unt&f\. J2:::88X,u:ryfZn # !0 hԐ@4"100ht =+#X]A [Ȉgg"dB!Ԡ2120j$Ȃ"I(Be. ~׍j0gw݆a$,I4! D НgFͶ4epGd0]Y#,3C"y(FIY`yfڌz].uTƖH,2shvV;0M3K%xTJՃ&~59l1h<-@oZj333fsyyjmnnN'HLL~K2}SkՏtdypɑǗ~Zepq470yz0n'?~p^n,d.vWJ (͝Zy;@.PKv`PKi/icons/TreeOpen.gif5S?hQҀCPRA\A6BHX Ah@ЩZ8TLb[й Ulol)C5.Fλ çNAN}|nbksvZUPfz*J7Ng2l6|T-BAVullfx # !0 hԐ@4"100ht =+#X]A [Ȉgg"dB!Ԡ2120j$Ȃ"I(Be. ~׍j0gw݆a$,I4! D НgFͶ4epGd0]Y#,3C"y(FIY`yfڌz].uTƖH,2shvV;0M3K%xTJՃ&~59l1h<@\T*SSSZm}}}yyh4Vnwvv:T@7߉=MN#3u<[:@ϣ'&HR}acÃ=7޾_}X~1438Bjq>4Y8PK ÛbPKi/kde/file59.png sb``p ҂ $_X f{8TI(o{`C5;.x,=^>pPs4- ,D yDdweK_F03aV}F[t*`B*`B5? U&"Gh&kT*UȲ9L Q"9FѨf]-慧MN`oA [>Mx6ZlV[v5w+nX^6+P&[ F"cG+eG *.0h4U{;:Z1pcج i1ڬ_T:Z1" <^87\gXū{sk +?ytum}P}tG.͏*/2,}ҩMy%[;ݳ.=PcۖE oxdS}Ӽ$Cvu+ogțҶU5c@ {eWMr2}n]uעq9Ϭ*\6:̐\2:Đ3emKYdL{`Z|8~~8A!(Ǥaq2P%cZ|ȇs@ā#[uG*NqIENDB`PKDiPKi/kde/file72.png sb``p ,@l$^)Oǐ9'f|c^xģ"fJ<7X48|/.y#3e˔S41vw8|_ ~.PK)'PKi/kde/kde.themercmێ0#x% YJ lj X8v b Bf!_# .-($F" Ą"9! ^P=m#i& y?n'a7@q_ۢhSV:j)](x,%q֋Txp3K x ?ɟŅ 02ҴokTۥ {z{{t|"U|VME _߲>JoPKf#PK 1Agtk/PK 1A"icons/PK 1AFkde/PKi/f)0 hgtk/empty.pngPKi/sDrz Ogtk/file0.pngPKi/_uLO gtk/file1.pngPKi/ gtk/file10.pngPKi/3:gtk/file11.pngPKi/3:gtk/file12.pngPKi/}8] gtk/file13.pngPKi/ $gtk/file14.pngPKi/T'acrgtk/file15.pngPKi/+ gtk/file16.pngPKi/+ gtk/file17.pngPKi/nr gtk/file18.pngPKi/> MQM gtk/file19.pngPKi/  gtk/file2.pngPKi/A~# gtk/file20.pngPKi/B gtk/file21.pngPKi/3:gtk/file22.pngPKi/=twgtk/file23.pngPKi/MtTWgtk/file24.pngPKi/MtTW0gtk/file25.pngPKi/M~[^gtk/file26.pngPKi/M~[^Wgtk/file27.pngPKi/M~[^gtk/file28.pngPKi/M~[^gtk/file29.pngPKi/B gtk/file3.pngPKi//X\)gtk/file30.pngPKi//X\gtk/file31.pngPKi//X\Qgtk/file32.pngPKi//X\gtk/file33.pngPKi/Ƥ:nqygtk/file34.pngPKi/MtTW#gtk/file35.pngPKi/MtTWgtk/file36.pngPKi/ݱwCgtk/file37.pngPKi/.gtk/file38.pngPKi/Fԏx`dgtk/file39.pngPKi/  gtk/file4.pngPKi/L̜qpsgtk/file40.pngPKi/2tvgtk/file41.pngPKi/2w]a0gtk/file42.pngPKi/_nqgtk/file43.pngPKi/W%pssgtk/file44.pngPKi/|Sim gtk/file45.pngPKi/DĎvy gtk/file46.pngPKi/2;{}v!gtk/file47.pngPKi/Xcg-"gtk/file48.pngPKi/ru"gtk/file49.pngPKi/  z#gtk/file5.pngPKi/mux$gtk/file50.pngPKi/KSx%gtk/file51.pngPKi/PVK&gtk/file52.pngPKi/pbSA'gtk/file53.pngPKi/QQ(gtk/file54.pngPKi/wTV)gtk/file55.pngPKi/5SV"*gtk/file56.pngPKi/"Y]*gtk/file57.pngPKi/ `WZF+gtk/file58.pngPKi/  +gtk/file6.pngPKi/B &-gtk/file7.pngPKi/B 3.gtk/file8.pngPKi/ljXS @/gtk/file9.pngPKi/DX 0gtk/gtkrcPKi/?A:gtk/optionmenu.pngPKi/$_CF;gtk/optionmenu_disabled.pngPKi/Ix-^_=gtk/optionmenu_rollover.pngPKi/^>gtk/splitpane_downarrow.pngPKi/4?gtk/splitpane_hhandle.pngPKi/=o@gtk/splitpane_leftarrow.pngPKi/UX;Bgtk/splitpane_rightarrow.pngPKi/5Cgtk/splitpane_uparrow.pngPKi/HDgtk/splitpane_vhandle.pngPKi/qvmEicons/Computer.gifPKi/?ʴHicons/Default.gifPKi/DIFmWIicons/FloppyDrive.gifPKi/"eN{Licons/HardDrive.gifPKi/]Nicons/InternalFrame.gifPKi/v`iOicons/TreeClosed.gifPKi/ Ûb Ricons/TreeOpen.gifPKi/dTkde/file59.pngPKi/ *ZEUkde/file60.pngPKi/Vkde/file61.pngPKi/psWkde/file62.pngPKi/qsXkde/file63.pngPKi/qIsu5Ykde/file64.pngPKi/i\`Ykde/file65.pngPKi/&CZ]|Zkde/file66.pngPKi/WBad[kde/file67.pngPKi/Y [kde/file68.pngPKi/D^kde/file69.pngPKi/'fBqu_kde/file70.pngPKi/Di7`kde/file71.pngPKi/)'bkde/file72.pngPKi/90Q^Fbkde/kde.themercPK0f#keskinlf-themepack.xmlPK``fflexdock-1.2.4/resources/plaf/0000755000175000017500000000000012177715062017143 5ustar sylvestresylvestreflexdock-1.2.4/resources/plaf/org/0000755000175000017500000000000012177715062017732 5ustar sylvestresylvestreflexdock-1.2.4/resources/plaf/org/flexdock/0000755000175000017500000000000012177715062021531 5ustar sylvestresylvestreflexdock-1.2.4/resources/plaf/org/flexdock/plaf/0000755000175000017500000000000012177715062022453 5ustar sylvestresylvestreflexdock-1.2.4/resources/plaf/org/flexdock/plaf/flexdock-themes-default.xml0000644000175000017500000003055712177715062027713 0ustar sylvestresylvestre flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/0000755000175000017500000000000012177715062024261 5ustar sylvestresylvestreflexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/eclipse2/0000755000175000017500000000000012177715062025767 5ustar sylvestresylvestreflexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/eclipse2/close_default.gif0000644000175000017500000000011112177715062031260 0ustar sylvestresylvestreGIF89a?_?!,h6+ IT6.];flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/eclipse2/min_default.gif0000644000175000017500000000010312177715062030737 0ustar sylvestresylvestreGIF89a?_?!,>3fnS;flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/eclipse2/pin_default.gif0000644000175000017500000000032612177715062030751 0ustar sylvestresylvestreGIF89a888X8X8x8x88XXXX8ظXXX!,S di2lK:FPs C@+rѨ6G*Z"QM ŮU ^#L;k!;flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/0000755000175000017500000000000012177715062025223 5ustar sylvestresylvestreflexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/close_active.png0000644000175000017500000000044412177715062030373 0ustar sylvestresylvestrePNG  IHDRl,tEXtCreation TimeMon 28 Feb 2005 00:03:18 -0600$tIME*LiZ pHYsodgAMA a3PLTE Vj Vjv #J#j #v#j3gtRNS@f/IDATxc`dbf``aecebf@4'Ct,e~ IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/close_default.gif0000644000175000017500000000011112177715062030514 0ustar sylvestresylvestreGIF89a?_?!,h6+ IT6.];flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/close_default.png0000644000175000017500000000044412177715062030544 0ustar sylvestresylvestrePNG  IHDRl,tEXtCreation TimeMon 28 Feb 2005 00:03:27 -0600dtIMEm) pHYsodgAMA a3PLTEԜ[7Էz;aȞ_Жa:zЯ:[WītRNS@f/IDATxc`dbf``aecebf@4'Ct,e~ IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/close_disabled_active.png0000644000175000017500000000035512177715062032223 0ustar sylvestresylvestrePNG  IHDRl,tEXtCreation TimeMon 28 Feb 2005 00:03:18 -0600$tIME $% pHYs(JgAMA a PLTErrr$'.zbtRNS@f"IDATxc``db`@c L) IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/close_disabled_default.png0000644000175000017500000000035512177715062032374 0ustar sylvestresylvestrePNG  IHDRl,tEXtCreation TimeMon 28 Feb 2005 00:03:27 -0600dtIME 2@ pHYs(JgAMA a PLTEъy^HtRNS@f"IDATxc``db`@c L) IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/min_default.gif0000644000175000017500000000010312177715062030173 0ustar sylvestresylvestreGIF89a?_?!,>3fnS;flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/pin_active.png0000644000175000017500000000042112177715062030047 0ustar sylvestresylvestrePNG  IHDR 8,tEXtCreation TimeMon 28 Feb 2005 00:03:13 -0600#GtIME7/o pHYsodgAMA a'PLTE j #v#j #J#jtRNS@f(IDATxc`aef``d`$`fa6v#25IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/pin_active_selected.png0000644000175000017500000000041312177715062031720 0ustar sylvestresylvestrePNG  IHDR r,Q,tEXtCreation TimeTue 26 Apr 2005 21:05:55 -0600j< tIME ǚp pHYsodgAMA a!PLTE Vj v#j #JTtRNS@f(IDATxc````dbf `ecr1spB 20B IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/pin_default.gif0000644000175000017500000000032612177715062030205 0ustar sylvestresylvestreGIF89a888X8X8x8x88XXXX8ظXXX!,S di2lK:FPs C@+rѨ6G*Z"QM ŮU ^#L;k!;flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/pin_default.png0000644000175000017500000000042112177715062030220 0ustar sylvestresylvestrePNG  IHDR 8,tEXtCreation TimeMon 28 Feb 2005 00:03:23 -0600?@tIMEc pHYsodgAMA a'PLTEԜ[aЖa[Я:zȂ: eEtRNS@f(IDATxc`aef``d`$`fa6v#25IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/pin_default_selected.png0000644000175000017500000000041312177715062032071 0ustar sylvestresylvestrePNG  IHDR r,Q,tEXtCreation TimeTue 26 Apr 2005 21:07:26 -0600UtIME(W pHYsodgAMA a!PLTEԜzԜ[[Жa7z0/BtRNS@f(IDATxc````dbf `ecr1spB 20B IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/pin_disabled_active.png0000644000175000017500000000034712177715062031705 0ustar sylvestresylvestrePNG  IHDR 8,tEXtCreation TimeMon 28 Feb 2005 00:03:13 -0600#GtIME 'g pHYs(JgAMA a PLTErrr$'.zbtRNS@fIDATxc```&  3_IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/pin_disabled_active_selected.png0000644000175000017500000000035612177715062033555 0ustar sylvestresylvestrePNG  IHDR r,Q,tEXtCreation TimeTue 26 Apr 2005 21:05:55 -0600j< tIME  4Asie pHYs(JgAMA a PLTE$'.rrrltRNS@f#IDATxc`&8` BPU 4`&8_IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/pin_disabled_default.png0000644000175000017500000000034712177715062032056 0ustar sylvestresylvestrePNG  IHDR 8,tEXtCreation TimeMon 28 Feb 2005 00:03:23 -0600?@tIME $t pHYs(JgAMA a PLTEъy^HtRNS@fIDATxc```&  3_IENDB`flexdock-1.2.4/resources/plaf/org/flexdock/plaf/titlebar/win32/pin_disabled_default_selected.png0000644000175000017500000000035612177715062033726 0ustar sylvestresylvestrePNG  IHDR r,Q,tEXtCreation TimeTue 26 Apr 2005 21:07:26 -0600UtIME  :Db pHYs(JgAMA a PLTEэ즣tRNS@f#IDATxc`&8` BPU 4`&8_IENDB`flexdock-1.2.4/src/0000755000175000017500000000000012177715062014776 5ustar sylvestresylvestreflexdock-1.2.4/src/java/0000755000175000017500000000000012177715062015717 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/0000755000175000017500000000000012177715062016647 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/0000755000175000017500000000000012177715062017436 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/0000755000175000017500000000000012177715062021235 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/docking/0000755000175000017500000000000012177715062022653 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/docking/Dockable.java0000644000175000017500000002771712177715062025240 0ustar sylvestresylvestre/* * Copyright (c) 2004 Christopher M Butler * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.flexdock.docking; import java.awt.Component; import java.beans.PropertyChangeListener; import java.util.List; import java.util.Set; import org.flexdock.docking.event.DockingListener; import org.flexdock.docking.event.DockingMonitor; import org.flexdock.docking.props.DockablePropertySet; /** * This interface is designed to specify the API's required by * {@code DockingManager} and {@code DockingPort} for dealing with dockable * components in a drag-n-drop fashion. A {@code Dockable} is the child * component that is docked into a {@code DockingPort}. * * @author Christopher Butler */ public interface Dockable extends DockingListener, DockingMonitor { /** * A constant property key to signify that a component is dockable. */ String DOCKABLE_INDICATOR = "Dockable.DOCKABLE_INDICATOR"; /** * Returns the value of the property with the specified key. Only properties * added with {@code putClientProperty} will return a non-{@code null} * value. * * @param key * the key that is being queried * @return the value of this property or {@code null} * @see javax.swing.JComponent#getClientProperty(java.lang.Object) */ Object getClientProperty(Object key); /** * Returns the Component that is to be dragged and docked. This may or may * not be included in the list returned by {@code getDragSources()}. *

* The framework performs indexing on the underlying {@code Component}. * Consequently, this method may not return a {@code null} * reference. * * @return the component wrapped by this dockable. */ Component getComponent(); /** * Returns the DockingPort within which this Dockable is currently docked. * If not currently docked, this method will return null. * * @return the docking port this dockable resides in, or {@code null} if the * dockable is not currently docked (i.e. in the middle of a drag * operation). */ DockingPort getDockingPort(); /** * Returns a {@code List} of the {@code Components} that are event sources * for drag operations. The list may or may not include the Component * returned by {@code getComponent()}. * * @return a list containing the components that may be used to drag this * dockable. */ List getDragSources(); /** * Returns a {@code Set} of the {@code Components} that are used as frame * drag sources. When a {@code Dockable} is floated into an external frame, * that frame may or may not have a titlebar for repositioning. The * Components returned by this method will be setup with appropriate event * listeners such that dragging them will serve to reposition the containing * frame as if they were the frame titlebar. If a Component exists in both * the Set returned by this method and the List returned by * {@code getDragSources()}, the "frame reposition" behavior will supercede * any "drag-to-dock" behavior while the Dockable is in a floating state. * * @return a set containing the components that may be used to drag the * frame this dockable resides in, if the dockable is floating. */ Set getFrameDragSources(); /** * Returns a {@code String} identifier that is unique within a JVM instance, * but persistent across JVM instances. This is used for configuration * mangement, allowing the JVM to recognize a {@code Dockable} instance * within an application instance, persist the ID, and recall it in later * application instances. The ID should be unique within an appliation * instance so that there are no collisions with other {@code Dockable} * instances, but it should also be consistent from JVM to JVM so that the * association between a {@code Dockable} instance and its ID can be * remembered from session to session. *

* The framework performs indexing on the persistent ID. Consequently, this * method may not return a {@code null} reference. * * @return the persistence id for this dockable. This id ensures that only * one copy of a given dockable will exist. */ String getPersistentId(); /** * Adds an arbitrary key/value "client property" to this {@code Dockable}. * {@code null} values are allowed. * * @param key * the new client property key. * @param value * the new client property value; if null this * method will remove the property. * @see javax.swing.JComponent#putClientProperty(java.lang.Object, * java.lang.Object) */ void putClientProperty(Object key, Object value); /** * Returns a {@code DockablePropertySet} instance associated with this * {@code Dockable}. Developers implementing the {@code Dockable} interface * may or may not choose to provide their own {@code DockablePropertySet} * implementation for use with this method. A default implementation is * supplied by the framework and most {@code Dockable} implementations, * including all implementations provided by the framework, will return the * default {@code DockablePropertySet} via a call to * {@code org.flexdock.docking.props.PropertyManager}. Developers are * encouraged to take advantage of this by calling * {@code PropertyManager.getDockablePropertySet(this)}. * * @return the {@code DockablePropertySet} associated with this * {@code Dockable} This method may not return a {@code null} * reference. * @see org.flexdock.docking.props.DockablePropertySet * @see org.flexdock.docking.props.PropertyManager#getDockablePropertySet(Dockable) */ DockablePropertySet getDockingProperties(); /** * Implements the semantics for docking an external {@code Dockable} to this * {@code Dockable} and returns a {@code boolean} indicating whether or not * the docking operation was successful.

The framework already * provides a default implementation for this method through * {@code DockingManager.dock(Dockable dockable, Dockable parent)}. While * users are free to provide their own implementation for this method, the * recommended approach is to use the default implementation with the * following line:

{@code return DockingManager.dock(dockable, this);} * * @param dockable * the {@code Dockable} to dock relative to this {@code Dockable} * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see #dock(Dockable, String) * @see #dock(Dockable, String, float) * @see DockingManager#dock(Dockable, Dockable) */ boolean dock(Dockable dockable); /** * Implements the semantics for docking an external {@code Dockable} to the * specified region of this {@code Dockable} and returns a {@code boolean} * indicating whether or not the docking operation was successful. If the * docking operation results in a split layout, this method should determine * an appropriate ratio of available space to allot to the new sibling * {@code Dockable}.

The framework already provides a default * implementation for this method through * {@code DockingManager.dock(Dockable dockable, Dockable parent, String region)}. * While users are free to provide their own implementation for this method, * the recommended approach is to use the default implementation with the * following line:

* {@code return DockingManager.dock(dockable, this, relativeRegion);} * * @param dockable * the {@code Dockable} to dock relative to this {@code Dockable} * @param relativeRegion * the docking region into which to dock the specified * {@code Dockable} * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see #dock(Dockable, String, float) * @see DockingManager#dock(Dockable, Dockable, String) */ boolean dock(Dockable dockable, String relativeRegion); /** * Implements the semantics for docking an external {@code Dockable} to the * specified region of this {@code Dockable} with the specified layout * ratio, returning a {@code boolean} indicating whether or not the docking * operation was successful. If the docking operation results in a split * layout, this method should use the specified {@code ratio} to determine * the amount of available space to allot to the new sibling * {@code Dockable}. *

* The framework already provides a default implementation for this method * through * {@code DockingManager.dock(Dockable dockable, Dockable parent, String region, float proportion)}. * While users are free to provide their own implementation for this method, * the recommended approach is to use the default implementation with the * following line: *

* {@code return DockingManager.dock(dockable, this, relativeRegion, ratio);} * * @param dockable * the {@code Dockable} to dock relative to this {@code Dockable} * @param relativeRegion * the docking region into which to dock the specified * {@code Dockable} * @param ratio * the proportion of available space in the resulting layout to * allot to the new sibling {@code Dockable}. * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see DockingManager#dock(Dockable, Dockable, String, float) */ boolean dock(Dockable dockable, String relativeRegion, float ratio); /** * Adds a PropertyChangeListener to the listener list. The listener is * registered for all bound properties of this class. Note that if this * Dockable is inheriting a bound property, then no event will be fired in * response to a change in the inherited property. *

* If listener is null, no exception is thrown and no action is performed. * * @param listener * the PropertyChangeListener to be added * * @see #removePropertyChangeListener(PropertyChangeListener) */ void addPropertyChangeListener(PropertyChangeListener listener); /** * Removes a PropertyChangeListener from the listener list. This method * should be used to remove PropertyChangeListeners that were registered for * all bound properties of this class. *

* If listener is null, no exception is thrown and no action is performed. * * @param listener * the PropertyChangeListener to be removed * * @see #addPropertyChangeListener */ void removePropertyChangeListener(PropertyChangeListener listener); } flexdock-1.2.4/src/java/core/org/flexdock/docking/DockableFactory.java0000644000175000017500000000557512177715062026566 0ustar sylvestresylvestre/* * Created on May 26, 2005 */ package org.flexdock.docking; import java.awt.Component; /** * This interface is designed to provide an API for allowing the * {@code DockingManager} to obtain {@code Dockable} instances on the fly. It * has a single method, {@code getDockableComponent(String dockableId)}, * responsible for returning {@code Component} instances, possibly creating and * registering {@code Dockables} in the process. * * Implementations of this interface will be application-specific and may be * plugged into the {@code DockingManager} via the call * {@code DockingManager.setDockableFactory(myFactory)}. Throughout the * framework, FlexDock makes many calls to * {@code DockingManager.getDockable(String id)} under the assumption that at * some point, the requested {@code Dockable} instance has been registered via * {@code DockingManager.registerDockable(Dockable dockable)}. * * In the event that a {@code Dockable} with the specified ID has never been * formally registered, the {@code DockingManager} will check for a factory via * {@code DockingManager.getDockableFactory()}. If a factory is present, its * {@code getDockableComponent()} method is invoked. If a valid * {@code Component} is returned from {@code getDockableComponent()}, the * DockingManager will attempt to register it as a {@code Dockable} and return * the {@code Dockable}. * * {@code DockableFactory} implementations are especially useful for * applications with persisted layouts where the {@code Dockables} required * during a layout restoration may be constructed automatically on demand by the * framework. * * @author Christopher Butler */ public interface DockableFactory { /** * Returns a {@code Component} for the specified Dockable ID, possibly * creating and registering a {@code Dockable} in the process. * * @param dockableId * the ID for the requested dockable {@code Component} * @return the {@code Component} for the specified ID */ Component getDockableComponent(String dockableId); /** * Returns a {@code Dockable} for the specified Dockable ID, possibly * creating and registering it in the process. * * @param dockableId * the ID for the requested {@code Dockable} * @return the {@code Dockable} for the specified ID */ Dockable getDockable(String dockableId); /** * An empty implementation of {@code DockableFactory}. */ public static class Stub implements DockableFactory { /** * {@inheritDoc} * * @return {@code null}. */ public Dockable getDockable(String dockableId) { return null; } /** * {@inheritDoc} * * @return {@code null}. */ public Component getDockableComponent(String dockableId) { return null; } } } flexdock-1.2.4/src/java/core/org/flexdock/docking/DockingConstants.java0000644000175000017500000001156012177715062026774 0ustar sylvestresylvestre/* * Created on Apr 25, 2005 */ package org.flexdock.docking; import javax.swing.JSplitPane; import javax.swing.SwingConstants; /** * A collection of constants used by flexdock. * * @author Christopher Butler */ public interface DockingConstants { String DOCKING_ID = "docking-id"; /** * Used when a sibling does not specify a size preference when docking * relative to another dockable. */ float UNSPECIFIED_SIBLING_PREF = -1F; /** * A constant for "initializing" an {@code int} to a safe (ie unusable * value). */ int UNINITIALIZED = -1; /** * A constant for "initializing" an {@code float} to a safe (ie unusable * value). */ // TODO should this be Float.NaN? float UNINITIALIZED_RATIO = -1F; String PERMANENT_FOCUS_OWNER = "permanentFocusOwner"; /** * The property name for handling window activation changes. * * @see java.beans.PropertyChangeListener * @see Dockable#addPropertyChangeListener(java.beans.PropertyChangeListener) */ String ACTIVE_WINDOW = "activeWindow"; String MOUSE_PRESSED = "mousePressed"; /** * A constant representing a "pin/unpin" action. Such actions are added to * title bars to enable the pinning/unpinning effect. This is also used as * the name for the property when a {@code Dockable} has been * pinned/unpinned. * * @see java.beans.PropertyChangeListener * @see Dockable#addPropertyChangeListener(java.beans.PropertyChangeListener) * @see org.flexdock.view.Titlebar */ String PIN_ACTION = "pin"; /** * A constant representing a "close" action. Such actions are added to title * bars to enable the close effect. * * @see org.flexdock.view.Titlebar */ String CLOSE_ACTION = "close"; /** * Box-orientation constant used to specify the top of a box. * * @see SwingConstants#TOP */ int TOP = SwingConstants.TOP; /** * Box-orientation constant used to specify the left side of a box. * * @see SwingConstants#LEFT */ int LEFT = SwingConstants.LEFT; /** * Box-orientation constant used to specify the bottom of a box. * * @see SwingConstants#BOTTOM */ int BOTTOM = SwingConstants.BOTTOM; /** * Box-orientation constant used to specify the right side of a box. * * @see SwingConstants#RIGHT */ int RIGHT = SwingConstants.RIGHT; /** * The central position in an area. Used for both compass-direction * constants (NORTH, etc.). * * @see SwingConstants#CENTER */ int CENTER = SwingConstants.CENTER; /** * Horizontal split indicates the {@code Component}s are split along the x * axis. For example the two {@code Component}s will be split one to the * left of the other. * * @see JSplitPane#HORIZONTAL_SPLIT */ int HORIZONTAL = JSplitPane.HORIZONTAL_SPLIT; /** * Vertical split indicates the {@code Component}s are split along the y * axis. For example the two {@code Component}s will be split one on top of * the other. * * @see JSplitPane#VERTICAL_SPLIT */ int VERTICAL = JSplitPane.VERTICAL_SPLIT; /** * A constant representing the "region" property used when a * {@code Dockable} region has been changed. * * @see java.beans.PropertyChangeListener * @see Dockable#addPropertyChangeListener(java.beans.PropertyChangeListener) */ String REGION = "region"; /** * The central region. The regional equivalent for {@linkplain #CENTER}. * * @see #CENTER */ String CENTER_REGION = "CENTER"; /** * The east region. The regional equivalent for {@linkplain #RIGHT}. * * @see #RIGHT */ String EAST_REGION = "EAST"; /** * The north region. The regional equivalent for {@linkplain #TOP}. * * @see #TOP */ String NORTH_REGION = "NORTH"; /** * The south region. The regional equivalent for {@linkplain #BOTTOM}. * * @see #BOTTOM */ String SOUTH_REGION = "SOUTH"; /** * The west region. The regional equivalent for {@linkplain #LEFT}. * * @see #LEFT */ String WEST_REGION = "WEST"; /** * An unknown region. This constant is typically used to initialize regions. */ String UNKNOWN_REGION = "UNKNOWN"; /** * A constant for enabling/disabling heavyweight dockables. If a system * property exists with this constant as a key and "true" as the value, then * heavyweight dockables are enabled. */ String HEAVYWEIGHT_DOCKABLES = "heavyweight.dockables"; /** * A system key whose value is a fully-qualified class name that is used to * create a persistence class for storing or loading persisted perspectives. */ String DEFAULT_PERSISTENCE_KEY = "default.persist.key"; } flexdock-1.2.4/src/java/core/org/flexdock/docking/DockingManager.java0000644000175000017500000037755112177715062026411 0ustar sylvestresylvestre/* * Copyright (c) 2004 Christopher M Butler * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.flexdock.docking; import java.awt.Component; import java.awt.Window; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.io.IOException; import java.util.EventListener; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.WeakHashMap; import javax.swing.SwingUtilities; import org.flexdock.docking.activation.ActiveDockableListener; import org.flexdock.docking.adapter.AdapterFactory; import org.flexdock.docking.adapter.DockingAdapter; import org.flexdock.docking.defaults.DefaultDockingStrategy; import org.flexdock.docking.defaults.DockableComponentWrapper; import org.flexdock.docking.drag.DragManager; import org.flexdock.docking.drag.effects.DragPreview; import org.flexdock.docking.drag.effects.EffectsManager; import org.flexdock.docking.drag.effects.RubberBand; import org.flexdock.docking.event.DockingEventHandler; import org.flexdock.docking.event.hierarchy.DockingPortTracker; import org.flexdock.docking.event.hierarchy.RootDockingPortInfo; import org.flexdock.docking.floating.policy.FloatPolicyManager; import org.flexdock.docking.props.DockablePropertySet; import org.flexdock.docking.props.PropertyManager; import org.flexdock.docking.state.DockingState; import org.flexdock.docking.state.FloatManager; import org.flexdock.docking.state.LayoutManager; import org.flexdock.docking.state.MinimizationManager; import org.flexdock.docking.state.PersistenceException; import org.flexdock.event.EventManager; import org.flexdock.event.RegistrationEvent; import org.flexdock.util.ClassMapping; import org.flexdock.util.DockingUtility; import org.flexdock.util.ResourceManager; import org.flexdock.util.RootWindow; import org.flexdock.util.SwingUtility; import org.flexdock.util.Utilities; /** * This class is used as a public facade into the framework docking system. It * provides a straightforward public API for managing and manipulating the * various different subcomponents that make up the docking framework through a * single class. {@code DockingManager} cannot be instantiated. Rather, its * methods are accessed statically from within application code and it generally * defers processing to a set of abstract handlers hidden from the application * layer. * * Among {@code DockingManager's} responsibilities are as follows: * *

*
Maintaining a component repository.
*
All {@code Dockables} and {@code DockingPorts} are cached within an and * accessible through and internal registry.
*
Maintaining framework state.
*
{@code DockingManager} provides APIs for managing various different * global framework settings, including application-key, floating support, * auto-persistence, {@code LayoutManagers}, and {@code MinimizationManagers}. *
*
Behavioral auto-configuration.
*
{@code DockingManager} automatically adds and removes necessary event * listeners to enable/disable drag-to-dock behavior as components are * registered and unregistered.
*
Programmatic access to docking operations.
*
{@code DockingManager} provides public APIs for programmatically dock, * undock, minimize, persist, and load {@code Dockables} from storage.
*
* * @author Christopher Butler */ public class DockingManager implements DockingConstants { public static final String MINIMIZE_MANAGER = "minimize.manager"; public static final String LAYOUT_MANAGER = "layout.manager"; private static final String DEV_PROPS = "org/flexdock/util/dev-props.properties"; private static final String CONFIG_PROPS = "org/flexdock/docking/flexdock-core.properties"; private static final DockingManager SINGLETON = new DockingManager(); private static final HashMap DOCKABLES_BY_ID = new HashMap(); private static final WeakHashMap DOCKABLES_BY_COMPONENT = new WeakHashMap(); private static final ClassMapping DOCKING_STRATEGIES = new ClassMapping( DefaultDockingStrategy.class, new DefaultDockingStrategy()); // Map(DockingPort -> MaximizedState) private static final Map maximizedStatesByRootPort = new HashMap(); private static Object persistentIdLock = new Object(); private String defaultLayoutManagerClass; private String defaultMinimizeManagerClass; private DockingStrategy defaultDocker; private LayoutManager layoutManager; private MinimizationManager minimizeManager; private DockableFactory dockableFactory; private AutoPersist autoPersister; private float defaultSiblingSize; static { // call this method to preload any framework resources // we might need later init(); } private static class AutoPersist extends Thread { private boolean enabled; public void run() { store(); } private synchronized void store() { try { if (isEnabled()) storeLayoutModel(); } catch (IOException e) { e.printStackTrace(); } catch (PersistenceException e) { e.printStackTrace(); } } public synchronized boolean isEnabled() { return enabled; } public synchronized void setEnabled(boolean enabled) { this.enabled = enabled; } } private static class MaximizedState { private final Dockable dockable; private final DockingPort originalPort; public MaximizedState(Dockable dockable, DockingPort originalDockingPort) { this.dockable = dockable; this.originalPort = originalDockingPort; } public Dockable getDockable() { return dockable; } public DockingPort getOriginalPort() { return originalPort; } } private static void init() { // load the dev system properties Properties p = ResourceManager.getProperties(DEV_PROPS, true); if (p != null) System.getProperties().putAll(p); // prime the drag manager for use DragManager.prime(); // ensure our Dockable adapters have been loaded AdapterFactory.prime(); // make sure dockingEvents are properly intercepted EventManager.addHandler(new DockingEventHandler()); EventManager.addListener(FloatPolicyManager.getInstance()); Properties config = ResourceManager.getProperties(CONFIG_PROPS, true); DockingManager mgr = getDockingManager(); // set the minimization manager mgr.defaultMinimizeManagerClass = config.getProperty(MINIMIZE_MANAGER); setMinimizeManager(mgr.defaultMinimizeManagerClass); // set the layout manager mgr.defaultLayoutManagerClass = config.getProperty(LAYOUT_MANAGER); setLayoutManager(mgr.defaultLayoutManagerClass); // setup tracking for the currently active dockable ActiveDockableListener.prime(); // setup the default sibling size float siblingSize = Utilities.getFloat(System .getProperty(RegionChecker.DEFAULT_SIBLING_SIZE_KEY), RegionChecker.DEFAULT_SIBLING_SIZE); setDefaultSiblingSize(siblingSize); // setup auto-persistence Runtime.getRuntime().addShutdownHook(getDockingManager().autoPersister); } private DockingManager() { defaultDocker = new DefaultDockingStrategy(); autoPersister = new AutoPersist(); } private static DockingManager getDockingManager() { return SINGLETON; } public static void addDragSource(Dockable dockable, Component dragSrc) { List sources = dockable == null ? null : dockable.getDragSources(); if (sources == null || dragSrc == null) return; if (!sources.contains(dragSrc)) { updateDragListeners(dockable); } } /** * Convenience method that removes the specified {@code Dockable} from the * layout. If the {@code Dockable}is embedded within the main application * frame or a floating dialog, it is removed from the container hierarchy. * If the {@code Dockable} is presently minimized, it is removed from the * current minimization manager. If the {@code Dockable} is already "closed" * or is {@code null}, no operation is performed. "Closing" a * {@code Dockable} only removes it from the visual layout. It does not * remove it from the internal {@code Dockable} registry and all underlying * {@code DockingState} information remains consistent so that the * {@code Dockable} may later be restored to its original location within * the application. * * @param dockable * the {@code Dockable} to be closed. */ public static void close(Dockable dockable) { if (dockable == null) return; if (isMaximized(dockable)) { toggleMaximized(dockable); } if (isDocked(dockable)) { undock(dockable); } else if (DockingUtility.isMinimized(dockable)) { getMinimizeManager().close(dockable); } } /** * Docks the specified {@code Component} into the CENTER region of the * specified {@code DockingPort}. If the {@code DockingManager} finds a * valid {@code Dockable} instance mapped to the specified {@code Component}, * the {@code Dockable} will be docked into the {@code DockingPort}. If the * {@code Component} or {@code DockingPort} is {@code null}, or a valid * {@code Dockable} cannot be found for the specified {@code Component}, * this method returns {@code false}. Otherwise, this method returns * {@code true} if the docking operation was successful and {@code false} if * the docking operation cannot be completed. This method defers processing * to {@code dock(Component dockable , DockingPort port, String region)}. * * @param dockable * the {@code Component} to be docked. * @param port * the {@code DockingPort} into which the specified * {@code Component} will be docked. * @return {@code true} if the docking operation was successful, * {@code false} otherwise. * @see #dock(Component, DockingPort, String) */ public static boolean dock(Component dockable, DockingPort port) { return dock(dockable, port, CENTER_REGION); } /** * Docks the specified {@code Component} into the supplied region of the * specified {@code DockingPort}. If the {@code DockingManager} finds a * valid {@code Dockable} instance mapped to the specified {@code Component}, * the {@code Dockable} will be docked into the {@code DockingPort}. If the * {@code Component} or {@code DockingPort} is {@code null}, or a valid * {@code Dockable} cannot be found for the specified {@code Component}, * this method returns {@code false}. Otherwise, this method returns * {@code true} if the docking operation was successful and {@code false} if * the docking operation cannot be completed. This method defers processing * to {@code dock(Dockable dockable, DockingPort port, String region)}. * * @param dockable * the {@code Component} to be docked. * @param port * the {@code DockingPort} into which the specified * {@code Component} will be docked. * @param region * the region into which to dock the specified {@code Component} * @return {@code true} if the docking operation was successful, * {@code false} if the docking operation cannot be completed. * @see #dock(Dockable, DockingPort, String) */ public static boolean dock(Component dockable, DockingPort port, String region) { Dockable d = resolveDockable(dockable); return dock(d, port, region); } /** * Docks the specified {@code Dockable} into the supplied region of the * specified {@code DockingPort}. If the {@code Dockable} or * {@code DockingPort} is {@code null}, this method returns {@code false}. * Otherwise, this method returns {@code true} if the docking operation was * successful and {@code false} if the docking operation cannot be * completed. * * This method determines the {@code DockingStrategy} to be used for the * specified {@code DockingPort} and defers processing to the * {@code DockingStrategy}. This method's return value will be based upon * the {@code DockingStrategy} implementation and is subject to conditions * such as whether the supplied region is deemed valid, whether the * {@code DockingStrategy} allows this particular {@code Dockable} to be * docked into the supplied region of the specified {@code DockingPort}, * and so on. The {@code DockingStrategy} used is obtained by a call to * {@code getDockingStrategy(Object obj)} and may be controlled via * {@code setDockingStrategy(Class c, DockingStrategy strategy)}, supplying * a {@code DockingPort} implementation class and a customized * {@code DockingStrategy}. * * @param dockable * the {@code Dockable} to be docked. * @param port * the {@code DockingPort} into which the specified * {@code Component} will be docked. * @param region * the region into which to dock the specified {@code Dockable} * @return {@code true} if the docking operation was successful, * {@code false} otherwise. * @see DockingStrategy#dock(Dockable, DockingPort, String) * @see #getDockingStrategy(Object) * @see #setDockingStrategy(Class, DockingStrategy) */ public static boolean dock(Dockable dockable, DockingPort port, String region) { if (dockable == null) return false; DockingStrategy strategy = getDockingStrategy(port); if (strategy != null) { return strategy.dock(dockable, port, region); } return false; // TODO think of changing it to runtime exception I // don't see a situation when there would be no docker. } private static Dockable resolveDockable(Component comp) { if (comp == null) return null; Dockable d = getDockable(comp); if (d == null) d = registerDockable(comp); return d; } /** * Docks the specified {@code Component} relative to another already-docked * {@code Component} in the CENTER region. Valid {@code Dockable} instances * are looked up for both {@code Component} parameters and processing is * deferred to {@code dock(Dockable dockable, Dockable parent)}. If a valid * {@code Dockable} cannot be resolved for either {@code Component}, then * this method returns {@code false}. The "parent" {@code Dockable} must * currently be docked. If not, this method will return {@code false}. * Otherwise, its parent {@code DockingPort} will be resolved and the new * {@code Dockable} will be docked into the {@code DockingPort} relative to * the "parent" {@code Dockable}. * * @param dockable * the {@code Component} to be docked * @param parent * the {@code Component} used as a reference point for docking * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see DockingManager#dock(Dockable, Dockable) */ public static boolean dock(Component dockable, Component parent) { return dock(resolveDockable(dockable), resolveDockable(parent)); } /** * Docks the specified {@code Dockable} relative to another already-docked * {@code Dockable} in the CENTER region. The "parent" {@code Dockable} must * currently be docked. If not, this method will return {@code false}. * Otherwise, its parent {@code DockingPort} will be resolved and the new * {@code Dockable} will be docked into the {@code DockingPort} relative to * the "parent" {@code Dockable}. This method defers processing to * {@code dock(Dockable dockable, Dockable parent, String region)} and * returns {@code false} if any of the input parameters are {@code null}. * * @param dockable * the {@code Dockable} to be docked * @param parent * the {@code Dockable} used as a reference point for docking * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see #dock(Dockable, Dockable, String) */ public static boolean dock(Dockable dockable, Dockable parent) { return dock(dockable, parent, CENTER_REGION); } /** * Docks the specified {@code Component} relative to another already-docked * {@code Component} in the specified region. Valid {@code Dockable} * instances will be looked up for each of the {@code Component} parameters. * If a valid {@code Dockable} is not found for either {@code Component}, * then this method returns {@code false}. The "parent" {@code Dockable} * must currently be docked. If not, this method will return {@code false}. * Otherwise, its parent {@code DockingPort} will be resolved and the new * {@code Dockable} will be docked into the {@code DockingPort} relative to * the "parent" {@code Dockable}. This method defers processing to * {@code dock(Component dockable, Component parent, String region, float proportion)} * and returns {@code false} if any of the input parameters are {@code null}. * If the specified region is other than CENTER, then a split layout should * result. This method supplies a split proportion of 0.5F, resulting in * equal distribution of space between the dockable and parent parameters if * docking is successful. * * @param dockable * the {@code Component} to be docked * @param parent * the {@code Component} used as a reference point for docking * @param region * the relative docking region into which {@code dockable} will * be docked * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see #dock(Component, Component, String, float) */ public static boolean dock(Component dockable, Component parent, String region) { return dock(dockable, parent, region, 0.5f); } /** * Docks the specified {@code Dockable} relative to another already-docked * {@code Dockable} in the specified region. The "parent" {@code Dockable} * must currently be docked. If not, this method will return {@code false}. * Otherwise, its parent {@code DockingPort} will be resolved and the new * {@code Dockable} will be docked into the {@code DockingPort} relative to * the "parent" {@code Dockable}. This method defers processing to * {@code dock(Dockable dockable, Dockable parent, String region, float proportion)} * and returns {@code false} if any of the input parameters are {@code null}. * If the specified region is other than CENTER, then a split layout should * result. This method supplies a split proportion of 0.5F, resulting in * equal distribution of space between the dockable and parent parameters if * docking is successful. * * @param dockable * the {@code Dockable} to be docked * @param parent * the {@code Dockable} used as a reference point for docking * @param region * the docking region into which {@code dockable} will be docked * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see #dock(Dockable, Dockable, String, float) */ public static boolean dock(Dockable dockable, Dockable parent, String region) { return dock(dockable, parent, region, 0.5f); } /** * Docks the specified {@code Component} relative to another already-docked * {@code Component} in the specified region with the specified split * proportion. Valid {@code Dockable} instances will be looked up for each * of the {@code Component} parameters. If a valid {@code Dockable} is not * found for either {@code Component}, then this method returns * {@code false}. The "parent" {@code Dockable} must currently be docked. * If not, this method will return {@code false}. Otherwise, its parent * {@code DockingPort} will be resolved and the new {@code Dockable} will be * docked into the {@code DockingPort} relative to the "parent" * {@code Dockable}. If the specified region is CENTER, then the * {@code proportion} parameter is ignored. Otherwise, a split layout should * result with the proportional space specified in the {@code proportion} * parameter allotted to the {@code dockable} argument. This method defers * processing to * {@code dock(Dockable dockable, Dockable parent, String region, float proportion)}. * * @param dockable * the {@code Component} to be docked * @param parent * the {@code Component} used as a reference point for docking * @param region * the relative docking region into which {@code dockable} will * be docked * @param proportion * the proportional space to allot the {@code dockable} argument * if the docking operation results in a split layout. * @return {@code true} if the docking operation was successful; * {@code false} otherwise. */ public static boolean dock(Component dockable, Component parent, String region, float proportion) { Dockable newDockable = resolveDockable(dockable); Dockable parentDockable = resolveDockable(parent); return dock(newDockable, parentDockable, region, proportion); } /** * Docks the specified {@code Dockable} relative to another already-docked * {@code Dockable} in the specified region with the specified split * proportion. The "parent" {@code Dockable} must currently be docked. If * not, this method will return {@code false}. Otherwise, its parent * {@code DockingPort} will be resolved and the new {@code Dockable} will be * docked into the {@code DockingPort} relative to the "parent" * {@code Dockable}. If the specified region is CENTER, then the * {@code proportion} parameter is ignored. Otherwise, a split layout should * result with the proportional space specified in the {@code proportion} * parameter allotted to the {@code dockable} argument. * * @param dockable * the {@code Dockable} to be docked * @param parent * the {@code Dockable} used as a reference point for docking * @param region * the docking region into which {@code dockable} will be docked * @param proportion * the proportional space to allot the {@code dockable} argument * if the docking operation results in a split layout. * @return {@code true} if the docking operation was successful; * {@code false} otherwise. */ public static boolean dock(Dockable dockable, Dockable parent, String region, float proportion) { return DockingUtility .dockRelative(dockable, parent, region, proportion); } private static DockingStrategy findDockingStrategy(Dockable dockable) { DockingPort port = dockable.getDockingPort(); DockingStrategy strategy = port == null ? null : port .getDockingStrategy(); if (strategy == null) { DockingManager mgr = getDockingManager(); strategy = mgr == null ? null : mgr.defaultDocker; } return strategy; } /** * Indicates whether the specified {@code Component} is currently docked. * This method looks up a parent {@code DockingPort} for the specified * {@code Component} via a call to * {@code getDockingPort(Component dockable)}. This method returns * {@code true} if a parent {@code DockingPort} is found and {@code false} * if no parent {@code DockingPort} is present. This method returns * {@code false} if the {@code Component} parameter is {@code null}. * * @param component * the {@code Component} whose docking status is to be examined * @return {@code true} if the {@code Component} is currently docked; * otherwise {@code false}. */ public static boolean isDocked(Component component) { return getDockingPort(component) != null; } /** * Indicates whether the specified {@code Dockable} is currently docked. * This method looks up a parent {@code DockingPort} for the specified * {@code Dockable} via a call to {@code getDockingPort(Dockable dockable)}. * This method returns {@code true} if a parent {@code DockingPort} is found * and {@code false} if no parent {@code DockingPort} is present. This * method returns {@code false} if the {@code Dockable} parameter is * {@code null}. * * @param dockable * the {@code Dockable} whose docking status is to be examined * @return {@code true} if the {@code Dockable} is currently docked; * otherwise {@code false}. */ public static boolean isDocked(Dockable dockable) { return getDockingPort(dockable) != null; } /** * Checks whether a supplied {@code Dockable} is docked within a supplied * {@code DockingPort} instance. Returns {@code true} if the * {@code DockingPort} contains the specified {@code Dockable}; * {@code false} otherwise. This method returns {@code false} if either of * the input parameters are {@code null}. * * @param dockingPort * the {@code DockingPort} to be tested * @param dockable * the {@code Dockable} instance to be examined * @return {@code true} if the supplied {@code DockingPort} contains the * specified {@code Dockable}; {@code false} otherwise. */ public static boolean isDocked(DockingPort dockingPort, Dockable dockable) { return dockingPort == null || dockable == null ? false : dockingPort .isParentDockingPort(dockable.getComponent()); } /** * Indicates whether global floating support is currently enabled. Defers * processing to {@code FloatPolicyManager.isGlobalFloatingEnabled()}. * * @return {@code true} if global floating support is enabled, {@code false} * otherwise. * @see FloatPolicyManager#isGlobalFloatingEnabled() */ public static boolean isFloatingEnabled() { return FloatPolicyManager.isGlobalFloatingEnabled(); } /** * Indicates whether tabbed layouts are supported by default for * {@code DockingPorts} with a single {@code Dockable} in the CENTER region. * This is a global default setting and applies to any DockingPort} * that does not have a specific contradictory local setting. *

* This method defers processing to * {@code org.flexdock.docking.props.PropertyManager.getDockingPortRoot()}. * As such, there are multiple "scopes" at which this property may be * overridden. * * @return {@code true} if the default setting for {@code DockingPorts} * allows a tabbed layout for a single {@code Dockable} in the * CENTER region; {@code false} otherwise. * @see PropertyManager#getDockingPortRoot() * @see org.flexdock.docking.props.DockingPortPropertySet#isSingleTabsAllowed() */ public static boolean isSingleTabsAllowed() { return PropertyManager.getDockingPortRoot().isSingleTabsAllowed() .booleanValue(); } /** * Indicates whether the supplied parameter is considered a valid docking * region. Valid values are those defined in {@code DockingConstants} and * include {@code NORTH_REGION}, {@code SOUTH_REGION}, {@code EAST_REGION}, * {@code WEST_REGION}, and {@code CENTER_REGION}. This method returns * {@code true} if the supplied parameter is equal to one of these values. * * @param region * the region value to be tested * @return {@code true} if the supplied parameter is a valid docking region; * {@code false} otherwise. */ public static boolean isValidDockingRegion(String region) { return CENTER_REGION.equals(region) || NORTH_REGION.equals(region) || SOUTH_REGION.equals(region) || EAST_REGION.equals(region) || WEST_REGION.equals(region); } private static void updateDragListeners(Component dragSrc, DragManager listener) { MouseMotionListener motionListener = null; EventListener[] listeners = dragSrc.getMouseMotionListeners(); for (int i = 0; i < listeners.length; i++) { if (listeners[i] instanceof DragManager) { motionListener = (MouseMotionListener) listeners[i]; break; } } if (motionListener != listener) { if (motionListener != null) dragSrc.removeMouseMotionListener(motionListener); dragSrc.addMouseMotionListener(listener); } MouseListener mouseListener = null; listeners = dragSrc.getMouseListeners(); for (int i = 0; i < listeners.length; i++) { if (listeners[i] instanceof DragManager) { mouseListener = (MouseListener) listeners[i]; break; } } if (mouseListener != listener) { if (mouseListener != null) dragSrc.removeMouseListener(mouseListener); dragSrc.addMouseListener(listener); } } /** * Creates, registers, and returns a {@code Dockable} for the specified * {@code Component}. If the specified {@code Component} implements the * {@code Dockable} interface, then this method dispatches to * {@code registerDockable(Dockable dockable)}. Otherwise, this method * dispatches to {@code registerDockable(Component comp, String tabText)}. *

* This method attempts to resolve an appropriate value for {@code tabText} * by calling {@code getName()} on the specified {@code Component}. If the * resolved value is {@code null} or empty, then the value {@code "null"} is * used. *

* If {@code comp} is {@code null}, no exception is thrown and no action is * performed. * * @param comp * the target component for the {@code Dockable}. * @return the {@code Dockable} that has been registered for the supplied * {@code Component} * @see #registerDockable(Dockable) * @see #registerDockable(Component, String) */ public static Dockable registerDockable(Component comp) { if (comp == null) return null; if (comp instanceof Dockable) return registerDockable((Dockable) comp); return registerDockable(comp, null, null); } private static String determineTabText(Component comp, String persistId) { String tabText = null; // if 'comp' is a DockingStub, then we may be able to // pull the tab text from it if (comp instanceof DockingStub) { tabText = ((DockingStub) comp).getTabText(); } else { // if we can find an adapter mapping, then try to pull // the tab text from there DockingAdapter adapter = AdapterFactory.getAdapter(comp); if (adapter != null) tabText = adapter.getTabText(); } // if 'comp' wasn't a DockingStub, or the stub returned a null tabText, // then try the component name if (tabText == null) tabText = comp.getName(); // if tabText is still null, then use the persistentId if (tabText == null) tabText = persistId; // get rid of null and empty cases. use the string "null" if nothing // else can be found tabText = tabText == null ? "null" : tabText.trim(); if (tabText.length() == 0) tabText = "null"; return tabText; } /** * Creates a {@code Dockable} for the specified {@code Component} and * dispatches to {@code registerDockable(Dockable init)}. If {@code comp} * is {@code null}, no exception is thrown and no action is performed. * * @param comp * the target component for the Dockable, both drag-starter and * docking source * @param tabText * the description of the docking source. Used as the tab-title * of docked in a tabbed pane * @return the {@code Dockable} that has been registered for the supplied * {@code Component} * @see #registerDockable(Dockable) */ public static Dockable registerDockable(Component comp, String tabText) { return registerDockable(comp, tabText, null); } private static Dockable registerDockable(Component comp, String tabText, String dockingId) { if (comp == null) return null; if (tabText == null) tabText = determineTabText(comp, dockingId); Dockable dockable = getDockableForComponent(comp, tabText, dockingId); return registerDockable(dockable); } /** * Registers and initializes the specified {@code Dockable}. All * {@code Dockables} managed by the framework must, at some point, be * registered via this method. This method adds the {@code Dockable} to the * internal registry, allowing querying by ID and {@code Component}. Drag * listeners are added to the {@code Dockable} to enable drag-n-drop docking * support. Docking properties are also initialized for the {@code Dockable}. * This method fires a {@code RegistrationEvent} once the {@code Dockable} * has been registered. If the {@code Dockable} is {@code null}, no * {@code Exception} is thrown and no action is taken. The {@code Dockable} * returned by this method will be the same object passed in as an argument. * * @param dockable * the Dockable that is being registered. * @return the {@code Dockable} that has been registered. * @see org.flexdock.event.RegistrationEvent */ public static Dockable registerDockable(Dockable dockable) { if (dockable == null || dockable.getComponent() == null || dockable.getDragSources() == null) return null; if (dockable.getPersistentId() == null) throw new IllegalArgumentException( "Dockable must have a non-null persistent ID."); DOCKABLES_BY_COMPONENT.put(dockable.getComponent(), dockable); // flag the component as dockable, in case it doesn't // implement the interface directly Component c = dockable.getComponent(); SwingUtility.putClientProperty(c, Dockable.DOCKABLE_INDICATOR, Boolean.TRUE); // add drag listeners updateDragListeners(dockable); // add the dockable as its own listener dockable.addDockingListener(dockable); // cache the dockable by ID DOCKABLES_BY_ID.put(dockable.getPersistentId(), dockable); // make sure we have docking-properties initialized (must come after // ID-caching) DockablePropertySet props = PropertyManager .getDockablePropertySet(dockable); // dispatch a registration event EventManager.dispatch(new RegistrationEvent(dockable, DockingManager.SINGLETON, true)); // return the dockable return dockable; } public static void unregisterDockable(Component comp) { Dockable dockable = getDockable(comp); unregisterDockable(dockable); } public static void unregisterDockable(String dockingId) { Dockable dockable = getDockableImpl(dockingId); unregisterDockable(dockable); } public static void unregisterDockable(Dockable dockable) { if (dockable == null) return; synchronized (DOCKABLES_BY_COMPONENT) { DOCKABLES_BY_COMPONENT.remove(dockable.getComponent()); } // flag the component as dockable, in case it doesn't // implement the interface directly Component c = dockable.getComponent(); SwingUtility.removeClientProperty(c, Dockable.DOCKABLE_INDICATOR); // remove the drag listeners removeDragListeners(dockable); // remove the dockable as its own listener dockable.removeDockingListener(dockable); // unlink the propertySet PropertyManager.removePropertySet(dockable); // remove the dockable by ID synchronized (DOCKABLES_BY_ID) { DOCKABLES_BY_ID.remove(dockable.getPersistentId()); } // dispatch a registration event EventManager.dispatch(new RegistrationEvent(dockable, DockingManager.SINGLETON, false)); } /** * Removes the event listeners that manage drag-n-drop docking operations * from the specified {@code Component}. If the specific listeners are not * present, then no action is taken. Drag listeners used by the docking * system are of type {@code org.flexdock.docking.drag.DragManager}. * * @param comp * the {@code Component} from which to remove drag listeners. * @see DragManager */ public static void removeDragListeners(Component comp) { if (comp == null) return; MouseMotionListener motionListener = null; EventListener[] listeners = comp.getMouseMotionListeners(); for (int i = 0; i < listeners.length; i++) { if (listeners[i] instanceof DragManager) { motionListener = (MouseMotionListener) listeners[i]; break; } } if (motionListener != null) { comp.removeMouseMotionListener(motionListener); } MouseListener mouseListener = null; listeners = comp.getMouseListeners(); for (int i = 0; i < listeners.length; i++) { if (listeners[i] instanceof DragManager) { mouseListener = (MouseListener) listeners[i]; break; } } if (mouseListener != null) { comp.removeMouseListener(mouseListener); } } /** * Displays the specified {@code Dockable} in the application's docking * layout. If the {@code Dockable} has not previously been docked, a * suitable location is determined within the layout and the * {@code Dockable} is docked to that location. If the {@code Dockable} has * previously been docked within the layout and subsequently removed, as * with a call to {@code DockingManager.close()}, the {@code Dockable} will * be restored to its prior state within the layout. This method defers * processing to the {@code display(Dockable dockable)} method for the * currently installed {@code org.flexdock.docking.state.LayoutManager}. * The {@code LayoutManager} implementation is responsible for handling the * semantics of determining an initial docking location or restoring a * {@code Dockable} to its previous layout state. If the {@code Dockable} * parameter is {@code null}, no {@code Exception} is thrown and no action * is taken. * * @param dockable * the {@code Dockable} to be displayed. * @return {@code true} if the {@code Dockable} was successfully displayed; * {@code false} otherwise. * @see #getLayoutManager() * @see LayoutManager#display(Dockable) */ public static boolean display(Dockable dockable) { return getLayoutManager().display(dockable); } /** * Displays the {@code Dockable} with the specified ID within the * application's docking layout. A valid {@code Dockable} is looked up for * the supplied ID. If none is found, this method returns {@code false}. * Otherwise, processing is dispatched to {@code display(Dockable dockable)}. * If the {@code Dockable} has not previously been docked, a suitable * location is determined within the layout and the {@code Dockable} is * docked to that location. If the {@code Dockable} has previously been * docked within the layout and subsequently removed, as with a call to * {@code DockingManager.close()}, the {@code Dockable} will be restored to * its prior state within the layout. This method defers processing to the * {@code display(Dockable dockable)} method for the currently installed * {@code org.flexdock.docking.state.LayoutManager}. The * {@code LayoutManager} implementation is responsible for handling the * semantics of determining an initial docking location or restoring a * {@code Dockable} to its previous layout state. If the {@code Dockable} * parameter is {@code null}, no {@code Exception} is thrown and no action * is taken. * * @param dockable * the ID of the {@code Dockable} to be displayed. * @return {@code true} if the {@code Dockable} was successfully displayed; * {@code false} otherwise. * @see #display(Dockable) * @see #getLayoutManager() * @see LayoutManager#display(Dockable) */ public static boolean display(String dockable) { return getLayoutManager().display(getDockable(dockable)); } private static String generatePersistentId(Object obj) { return generatePersistentId(obj, null); } private static String generatePersistentId(Object obj, String desiredId) { if (obj == null) return null; synchronized (persistentIdLock) { String pId = desiredId == null ? obj.getClass().getName() : desiredId; StringBuffer baseId = new StringBuffer(pId); for (int i = 1; hasRegisteredDockableId(pId); i++) { baseId.append("_").append(i); pId = baseId.toString(); } return pId; } } private static boolean hasRegisteredDockableId(String id) { return DOCKABLES_BY_ID.containsKey(id); } /** * Returns the {@code DockingStrategy} associated with the {@code Class} of * the {@code Object} parameter. This method returns {@code null} if the * parameter is {@code null}. Otherwise, the method retrieves the * {@code Object's} {@code Class} and dispatches to * {@code getDockingStrategy(Class classKey)}. *

* {@code DockingStrategy} association follows a strict inheritance chain * using {@code org.flexdock.util.ClassMapping}. If a mapping for * {@code obj.getClass()} is not found, then the superclass is tested, and * so on until {@code java.lang.Object} is reached. Thus, if a * {@code DockingStrategy} mapping of {@code Foo} exists for class * {@code Bar}, and class {@code Baz} extends {@code Bar}, then calling * this method for an instance of {@code Baz} will return an instance of * {@code Foo}. The inheritance chain is strict in the sense that * only superclasses are checked. Implemented interfaces are ignored. *

* If a class association is never found, then an instance of * {@code DefaultDockingStrategy} is returned. * * @param obj * the object whose {@code DockingStrategy} association we wish * to test * @return the {@code DockingStrategy} associated with the {@code Class} * type of the {@code Object} parameter. * @see #getDockingStrategy(Class) * @see #setDockingStrategy(Class, DockingStrategy) * @see ClassMapping#getClassInstance(Class) */ public static DockingStrategy getDockingStrategy(Object obj) { Class key = obj == null ? null : obj.getClass(); return getDockingStrategy(key); } /** * Returns the {@code DockingStrategy} associated with specified * {@code Class}. This method returns {@code null} if the parameter is * {@code null}. *

* {@code DockingStrategy} association follows a strict inheritance chain * using {@code org.flexdock.util.ClassMapping}. If a mapping for * {@code classKey} is not found, then the superclass is tested, and so on * until {@code java.lang.Object} is reached. Thus, if a * {@code DockingStrategy} mapping of {@code Foo} exists for class * {@code Bar}, and class {@code Baz} extends {@code Bar}, then calling * this method for class {@code Baz} will return an instance of {@code Foo}. * The inheritance chain is strict in the sense that only * superclasses are checked. Implemented interfaces are ignored. *

* If a class association is never found, then an instance of * {@code DefaultDockingStrategy} is returned. * * @param classKey * the {@code Class} whose {@code DockingStrategy} association we * wish to test * @return the {@code DockingStrategy} associated with the specified * {@code Class}. * @see #setDockingStrategy(Class, DockingStrategy) * @see ClassMapping#getClassInstance(Class) */ public static DockingStrategy getDockingStrategy(Class classKey) { DockingStrategy strategy = (DockingStrategy) DOCKING_STRATEGIES .getClassInstance(classKey); return strategy; } /** * Returns an array of {@code RootWindows} known to the docking framework * that contain {@code DockingPorts}. Any {@code Frame}, {@code Applet}, * {@code Dialog}, or {@code Window} that has a {@code DockingPort} added * as a descendent {@code Component} will automatically have an * {@code org.flexdock.util.RootWindow} wrapper instance associated with it. * This method will return an array of all known RootWindows that contain * {@code DockingPorts}. Ordering of the array may be based off of a * {@code java.util.Set} and is not guaranteed. * * @return an array of all known {@code RootWindows} that contain * {@code DockingPorts} * @see RootWindow * @see DockingPortTracker#getDockingWindows() */ public static RootWindow[] getDockingWindows() { Set windowSet = DockingPortTracker.getDockingWindows(); return windowSet == null ? new RootWindow[0] : (RootWindow[]) windowSet .toArray(new RootWindow[0]); } /** * Returns the {@code DockingPort} with the specified ID. If the * {@code portId} parameter is {@code null}, or a {@code DockingPort} with * the specified ID is not found, a {@code null} reference is returned. This * method internally dispatches to * {@code org.flexdock.docking.event.hierarchy.DockingPortTracker.findById(String portId)}. * {@code portId} should match the value returned by a {@code DockingPort's} * {@code getPersistentId()} method. * * @param portId * the ID of the {@code DockingPort} to be looked up * @return the {@code DockingPort} with the specified ID * @see DockingPort#getPersistentId() * @see DockingPortTracker#findById(String) */ public static DockingPort getDockingPort(String portId) { return DockingPortTracker.findById(portId); } /** * Returns the "main" {@code DockingPort} within the application window * containing the specified {@code Component}. Just as desktop applications * will tend to have a "main" application window, perhaps surrounded with * satellite windows or dialogs, the "main" {@code DockingPort} within a * given window will be considered by the application developer to contain * the primary docking layout used by the enclosing window. *

* The {@code Component} parameter may or may not be a root window * container. If not, the ancestor window of {@code comp} is determined and * a set of docking ports encapsulated by a {@code RootDockingPortInfo} * instance is returned by a call to * {@code getRootDockingPortInfo(Component comp)}. The resolved * {@code RootDockingPortInfo} instance's main {@code DockingPort} is * returned via its method {@code getMainPort()}. *

* By default, the "main" {@code DockingPort} assigned to any * {@code RootDockingPortInfo} instance associated with a window will happen * to be the first root {@code DockingPort} detected for that window. In * essence, the default settings make this method identical to * {@code getRootDockingPort(Component comp)}. This, however, may be * altered by {@code RootDockingPortInfo's} * {@code setMainPort(String portId)} method based upon the needs of the * application developer. In contrast, * {@code getMainDockingPort(Component comp)} will always return the first * root {@code DockingPort} found within a window. *

* If {@code comp} is {@code null} or the root window cannot be resolved, * then this method returns a {@code null} reference. A {@code null} * reference is also returned if the root window does not contain any * {@code DockingPorts}. * * @param comp * the {@code Component} whose root window will be checked for a * main {@code DockingPort} * @return the main {@code DockingPort} within the root window that contains * {@code comp} * @see #getRootDockingPortInfo(Component) * @see #getRootDockingPort(Component) * @see DockingPortTracker#getRootDockingPortInfo(Component) * @see RootDockingPortInfo#getMainPort() * @see RootDockingPortInfo#setMainPort(String) */ public static DockingPort getMainDockingPort(Component comp) { RootDockingPortInfo info = getRootDockingPortInfo(comp); return info == null ? null : info.getMainPort(); } /** * Returns the first root {@code DockingPort} found within the application * window containing the specified {@code Component}. A "root" * {@code DockingPort} is a {@code DockingPort} embedded within a * window/frame/applet/dialog that is not nested within any other parent * {@code DockingPorts}. The {@code Component} parameter may or may not be * a root window container itself. If not, the root window containing * {@code comp} is resolved and the first root {@code DockingPort} found * within it is returned. This method defers actual processing to * {@code org.flexdock.docking.event.hierarchy.DockingPortTracker.findByWindow(Component comp)}. *

* If {@code comp} is {@code null} or the root window cannot be resolved, * then this method returns a {@code null} reference. A {@code null} * reference is also returned if the root window does not contain any * {@code DockingPorts}. *

* This method differs from {@code getMainDockingPort(Component comp)} in * that the "main" {@code DockingPort} for a given window is configurable by * the application developer, whereas this method will always return the * "first" {@code DockingPort} found within the window. However, if the * "main" {@code DockingPort} has not been manually configured by the * application developer, then this method and * {@code getMainDockingPort(Component comp)} will exhibit identical * behavior. * * @param comp * the {@code Component} whose root window will be checked for a * root {@code DockingPort} * @return the first root {@code DockingPort} found within the root window * that contains {@code comp} * @see #getMainDockingPort(Component) * @see DockingPortTracker#findByWindow(Component) * @see RootDockingPortInfo */ public static DockingPort getRootDockingPort(Component comp) { return DockingPortTracker.findByWindow(comp); } /** * Returns the {@code RootDockingPortInfo} instance associated with the root * window containing the specified {@code Component}. The {@code Component} * parameter may or may not be a root window container itself. If not, the * root window containing {@code comp} is resolved and the * {@code RootDockingPortInfo} instance associated with the window is * returned. {@code RootDockingPortInfo} will contain information regarding * all of the "root" {@code DockingPorts} embedded within a root window * where a "root" {@code DockingPort} is any {@code DockingPort} embedded * within the window that does not have any other {@code DockingPort} * ancestors in it's container hierarchy. *

* If {@code comp} is {@code null} or the root window cannot be resolved, * then this method returns a {@code null} reference. A {@code null} * reference is also returned if the root window does not contain any * {@code DockingPorts}. *

* This method dispatches internally to * {@code org.flexdock.docking.event.hierarchy.DockingPortTracker.getRootDockingPortInfo(Component comp)}. * * @param comp * the {@code Component} whose root window will be checked for an * associated {@code RootDockingPortInfo}. * @return the {@code RootDockingPortInfo} instance associated with the root * window containing {@code comp}. * @see RootDockingPortInfo * @see DockingPortTracker#getRootDockingPortInfo(Component) */ public static RootDockingPortInfo getRootDockingPortInfo(Component comp) { return DockingPortTracker.getRootDockingPortInfo(comp); } /** * Sends the application's current layout model to external storage. This * method defers processing to the currently installed * {@code org.flexdock.docking.state.LayoutManager} by invoking its * {@code store()} method. If there is no {@code LayoutManager} installed, * then this method returns {@code false}. *

* The layout model itself, along with storage mechanism, is abstract and * dependent upon the particular {@code LayoutManager} implementation. As * such, it may be possible that the {@code LayoutManager} is unable to * persist the current layout state for non-Exceptional reasons. This method * returns {@code true} if the layout model was successfully stored and * {@code false} if the layout model could not be stored under circumstances * that do not generate an {@code Exception} (for instance, if there is no * persistence implementation currently installed). If a problem occurs * during the persistence process, an {@code IOException} is thrown. * * @return {@code true} if the current layout model was succesfully stored, * {@code false} otherwise. * @throws IOException * @throws PersisterException * @see #getLayoutManager() * @see #setLayoutManager(LayoutManager) * @see LayoutManager#store() */ public static boolean storeLayoutModel() throws IOException, PersistenceException { LayoutManager mgr = getLayoutManager(); return mgr == null ? false : mgr.store(); } /** * Loads a previously stored layout model into the currently installed * {@code LayoutManager}. This method defers processing to * {@code loadLayoutModel(boolean restore)} with an argument of * {@code false} to indicate that the stored data model should merely be * loaded into memory and the {@code LayoutManager} should not attempt to * subsequently restore the application view by synchronizing it against the * newly loaded data model. *

* The layout model itself, along with storage mechanism, is abstract and * dependent upon the particular {@code LayoutManager} implementation. As * such, it may be possible that the {@code LayoutManager} is unable to load * the previous layout state for non-Exceptional reasons. This method * returns {@code true} if the layout model was successfully loaded and * {@code false} if the layout model could not be loaded under circumstances * that do not generate an {@code Exception} (for instance, if there was no * previous layout model found in storage). If a problem occurs during the * loading process, an {@code IOException} is thrown. * * @return {@code true} if the current layout model was succesfully loaded, * {@code false} otherwise. * @throws IOException * @throws PersisterException * @see #loadLayoutModel(boolean) * @see LayoutManager#load() */ public static boolean loadLayoutModel() throws IOException, PersistenceException { return loadLayoutModel(false); } /** * Loads a previously stored layout model into the currently installed * {@code LayoutManager} and attempts to synchronize the application view * with the newly loaded layout model if the {@code restore} parameter is * {@code true}. If there is no currently installed {@code LayoutManager}, * then this method returns {@code false}. If the {@code restore} parameter * is {@code true}, then this method defers processing to * {@code restoreLayout(boolean loadFromStorage)} with an argument of * {@code true}. Otherwise, this method defers processing to the currently * installed {@code org.flexdock.docking.state.LayoutManager} by invoking * its {@code load()} method. *

* The layout model itself, along with storage mechanism, is abstract and * dependent upon the particular {@code LayoutManager} implementation. As * such, it may be possible that the {@code LayoutManager} is unable to load * the previous layout state for non-Exceptional reasons. This method * returns {@code true} if the layout model was successfully loaded and * {@code false} if the layout model could not be loaded under circumstances * that do not generate an {@code Exception} (for instance, if there was no * previous layout model found in storage). If a problem occurs during the * loading process, an {@code IOException} is thrown. * * @return {@code true} if the current layout model was succesfully loaded, * {@code false} otherwise. * @throws IOException * @throws PersisterException * @see #getLayoutManager() * @see #setLayoutManager(LayoutManager) * @see #restoreLayout(boolean) * @see LayoutManager#load() */ public static boolean loadLayoutModel(boolean restore) throws IOException, PersistenceException { LayoutManager mgr = getLayoutManager(); if (mgr == null) return false; return restore ? restoreLayout(true) : mgr.load(); } /** * Synchronizes the application view with the current in-memory layout * model. This method defers processing to * {@code restoreLayout(boolean loadFromStorage)} with an argument of * {@code false}. This instructs the currently installed * {@code LayoutManager} to restore the application view to match the * current in-memory layout model without reloading from storage prior to * restoration. This method is useful for developers who choose to construct * a layout model programmatically and wish to "commit" it to the * application view, restoring their own in-memory layout model rather than * a model persisted in external storage. *

* If there is no {@code LayoutManager} currently installed, then this * method returns {@code false}. * * @return {@code true} if the in-memory layout model was properly restored * to the application view, {@code false} otherwise. * @throws PersisterException * @see #restoreLayout(boolean) * @see #getLayoutManager() * @see #setLayoutManager(LayoutManager) * @see LayoutManager#restore(boolean) */ public static boolean restoreLayout() { try { return restoreLayout(false); } catch (IOException e) { // shouldn't happen since we're not intending to load from storage System.err.println("Exception: " +e.getMessage()); e.printStackTrace(); return false; } catch (PersistenceException e) { // TODO Auto-generated catch block System.err.println("Exception: " +e.getMessage()); e.printStackTrace(); return false; } } /** * Synchronizes the application view with the current in-memory layout * model. This method defers processing to the currently installed * {@code org.flexdock.docking.state.LayoutManager} by invoking its * {@code restore(boolean loadFromStorage)} method. If there is no * {@code LayoutManager} currently installed, then this method returns * {@code false}. *

* If the {@code loadFromStorage} parameter is {@code true}, then the * {@code LayoutManager} is instructed to load any persisted layout model * from external storage into memory before synchronizing the application * view. If a problem occurs while loading from exernal storage, this method * throws an {@code IOException}. * * @param loadFromStorage * instructs whether to load any layout model from external * storage into memory before synchronizing the application view. * @return {@code true} if the in-memory layout model was properly restored * to the application view, {@code false} otherwise. * @throws PersisterException * @see #getLayoutManager() * @see #setLayoutManager(LayoutManager) * @see LayoutManager#restore(boolean) */ public static boolean restoreLayout(boolean loadFromStorage) throws IOException, PersistenceException { LayoutManager mgr = getLayoutManager(); return mgr == null ? false : mgr.restore(loadFromStorage); } private static Dockable loadAndRegister(String id) { DockableFactory factory = id == null ? null : getDockingManager().dockableFactory; if (factory == null) return null; // the getDockableComponent() implementation may or may not // automatically register a dockable before returning. // first, try to get a Dockable from the factory Dockable dockable = factory.getDockable(id); if (dockable != null) { // check to see if the dockable is already registered. Dockable tmp = getDockableImpl(dockable.getPersistentId()); if (tmp == null) registerDockable(dockable); } // if we couldn't find a dockable from the factory, then try getting // a component. else { Component comp = factory.getDockableComponent(id); // we already weren't able to get a Dockable from the factory. If // we couldn't get a Component either, then give up. if (comp == null) return null; // if the newly created dockable has not yet been registered, // then register it. dockable = getDockable(comp); if (dockable == null) { dockable = registerDockable(comp, null, id); } } return dockable; } private static Dockable getDragInitiator(Component c) { return getDockableForComponent(c, null, null); } private static Dockable getDockableForComponent(Component c, String desc, String dockingId) { if (c == null) return null; // return the dockable if it has already been registered Dockable dockable = getDockable(c); if (dockable != null) return dockable; // if we need to create a dockable, first try to do it with an adapter DockingAdapter adapter = AdapterFactory.getAdapter(c); if (adapter != null) { dockable = DockableComponentWrapper.create(adapter); } // if we weren't able to create from an adapter, then create the // dockable manually if (dockable == null) { if (c instanceof DockingStub) { dockable = DockableComponentWrapper.create((DockingStub) c); } else { String persistentId = dockingId == null ? generatePersistentId(c) : dockingId; dockable = DockableComponentWrapper.create(c, persistentId, desc); } } // make sure the specified description is applied if (desc != null) dockable.getDockingProperties().setDockableDesc(desc); // cache the dockable for future use DOCKABLES_BY_COMPONENT.put(c, dockable); // now we can return return dockable; } /** * Returns the {@code DockingPort} that contains the specified * {@code Component}. If the {@code Component} is {@code null}, then a * {@code null} reference is returned. *

* This method will only return the immediate parent {@code DockingPort} of * the specified {@code Component} This means that the {@code DockingPort} * returned by this method will not only be an ancestor {@code Container} of * the specified {@code Component}, but invoking its * {@code isParentDockingPort(Component comp)} with the specified * {@code Component} will also return {@code true}. If both of these * conditions cannot be satisfied, then this method returns a {@code null} * reference. * * @param dockable * the {@code Component} whose parent {@code DockingPort} is to * be returned. * @return the imediate parent {@code DockingPort} that contains the * specified {@code Component}. */ public static DockingPort getDockingPort(Component dockable) { return DockingUtility.getParentDockingPort(dockable); } /** * Returns the {@code DockingPort} that contains the specified * {@code Dockable}. If the {@code Dockable} is {@code null}, then a * {@code null} reference is returned. *

* This method will only return the immediate parent {@code DockingPort} of * the specified {@code Dockable} This means that a check is performed for * the {@code Component} returned by the {@code Dockable's} * {@code getComponent()} method. The {@code DockingPort} returned by this * method will not only be an ancestor {@code Container} of this * {@code Component}, but invoking the {@code DockingPort's} * {@code isParentDockingPort(Component comp)} with the this * {@code Component} will also return {@code true}. If both of these * conditions cannot be satisfied, then this method returns a {@code null} * reference. * * @param dockable * the {@code Dockable} whose parent {@code DockingPort} is to be * returned. * @return the imediate parent {@code DockingPort} that contains the * specified {@code Dockable}. */ public static DockingPort getDockingPort(Dockable dockable) { return DockingUtility.getParentDockingPort(dockable); } /** * Returns the {@code Dockable} instance that models the specified * {@code Component}. The {@code Dockable} returned by this method will * return a reference to {@code comp} when its {@code getComponent()} method * is called. If {@code comp} is {@code null}, then this method will return * a {@code null} reference. *

* The association between {@code Dockable} and {@code Component} is * established internally during {@code registerDockable(Dockable dockable)}. * Thus, {@code registerDockable(Dockable dockable)} must have been called * previously for a mapping to be found and a {@code Dockable} to be * returned by this method. If no mapping is found for the specified * {@code Component}, then this method returns a {@code null} reference. * * @param comp * the {@code Component} whose {@code Dockable} instance is to be * returned. * @return the {@code Dockable} that models the specified {@code Component} * @see #registerDockable(Dockable) * @see Dockable#getComponent() */ public static Dockable getDockable(Component comp) { return comp == null ? null : (Dockable) DOCKABLES_BY_COMPONENT .get(comp); } /** * Returns the {@code Dockable} instance with the specified ID. The * {@code Dockable} returned by this method will return a String equal * {@code id} when its {@code getPersistentId()} method is called. If * {@code id} is {@code null}, then this method will return a {@code null} * reference. *

* The association between {@code Dockable} and {@code id} is established * internally during {@code registerDockable(Dockable dockable)}. Thus, * {@code registerDockable(Dockable dockable)} must have been called * previously for a mapping to be found and a {@code Dockable} to be * returned by this method. If no mapping is found for the specified * {@code id}, then this method returns a {@code null} reference. * * @param id * the persistent ID of the {@code Dockable} instance is to be * returned. * @return the {@code Dockable} that has the specified perstent ID. * @see #registerDockable(Dockable) * @see Dockable#getPersistentId() */ public static Dockable getDockable(String id) { if (id == null) return null; Dockable dockable = getDockableImpl(id); if (dockable == null) dockable = loadAndRegister(id); return dockable; } private static Dockable getDockableImpl(String id) { synchronized (DOCKABLES_BY_ID) { return id == null ? null : (Dockable) DOCKABLES_BY_ID.get(id); } } /** * Returns a {@code Set} of {@code String} IDs for all {@code Dockables} * registered with the framework. The IDs returned by this method will * correspond to the values returned for the {@code getPersistentId()} * method for each {@code Dockable} registered with the framework. * * {@code Dockable} IDs are cached during * {@code registerDockable(Dockable dockable)}. Thus, for an ID to appear * within the {@code Set} returned by this method, the corresponding * {@code Dockable} must have first been registered via * {@code registerDockable(Dockable dockable)}. * * If no {@code Dockables} have been registered with the framework, then an * empty {@code Set} is returned. This method will never return a * {@code null} reference. * * @return a {@code Set} of {@code String} IDs for all {@code Dockables} * registered with the framework. * @see #registerDockable(Dockable) * @see Dockable#getPersistentId() */ public static Set getDockableIds() { synchronized (DOCKABLES_BY_ID) { return new HashSet(DOCKABLES_BY_ID.keySet()); } } /** * Returns the listener object responsible for managing drag-to-dock mouse * events for the specified {@code Dockable}. During registration, the * listener is added to each of the {@code Components} within the * {@code Dockable's} {@code getDragSources()} {@code List}. Thus, for this * method to return a valid {@code DragManager} instance, the * {@code Dockable} must first have been registered via * {@code registerDockable(Dockable dockable)}. If the specified * {@code Dockable} is {@code null} or its {@code getDragSources()} method * returns a {@code null}, or if the {@code Dockable} has not previously * been registered, this method will return a {@code null} reference. * * @param dockable * the {@code Dockable} whose drag listener is to be returned. * @return the {@code DragManager} responsible for listening to an managing * drag-related mouse events for the specified {@code Dockable}. * @see DragManager * @see Dockable#getDragSources() * @see #registerDockable(Dockable) */ public static DragManager getDragListener(Dockable dockable) { if (dockable == null || dockable.getDragSources() == null) return null; for (Iterator it = dockable.getDragSources().iterator(); it.hasNext();) { Object obj = it.next(); if (obj instanceof Component) { DragManager listener = getDragListener((Component) obj); if (listener != null) return listener; } } return null; } private static DragManager getDragListener(Component c) { EventListener[] listeners = c.getMouseMotionListeners(); for (int i = 0; i < listeners.length; i++) { if (listeners[i] instanceof DragManager) return (DragManager) listeners[i]; } return null; } /** * Returns the currently installed {@code LayoutManager}. The * {@code LayoutManager} is responsible for managing docking layout state. * This includes tracking the state for all {@code Dockables} as they are * embedded, minimized, floated, or hidden. If a {@code Dockable} is * embedded, the {@code LayoutManager} is responsible for tracking its * position and size relative to other embedded {@code Dockables}. If * floating, the {@code LayoutManager} is responsible for supplying a * {@code FloatManager} to maintain {@code Dockable} groupings within * dialogs as well as dialog size and positioning. *

* The {@code LayoutManager} is responsible for providing a persistence * mechanism to save and restore layout states. Depending on the * {@code LayoutManager} implementation, it may or may not support multiple * layout models that may be loaded and switched between at runtime. *

* Because the {@code LayoutManager} is a critical piece of the docking * infrastructure, it is not possible to install a {@code null} * {@code LayoutManager}. Therefore, this method will always return a valid * {@code LayoutManager} and never a {@code null} reference. * * @return the currently installed {@code LayoutManager} * @see LayoutManager * @see #setLayoutManager(LayoutManager) * @see #setLayoutManager(String) */ public static LayoutManager getLayoutManager() { return getDockingManager().layoutManager; } /** * Returns the currently installed {@code MinimizationManager}. The * {@code MinimizationManager} is responsible for minimizing and * unminimizing {@code Dockables}, removing from and restoring to the * embedded docking layout through the currently installed * {@code LayoutManager}. *

* The visual representation of a "minimized" {@code Dockable} is somewhat * abstract, although it is commonly expressed in user interfaces with the * disappearance of the {@code Dockable} from the layout and the addition of * a tab or label on one or more edges of the application window. The * {@code MinimizationManager} implementation itself is responsible for * interpreting the visual characteristics and behavior of a minimized * {@code Dockable}, but it must provide a "preview" feature to allow * viewing of minimized {@code Dockables}, on demand without actually * restoring them to the embedded docking layout. {@code Dockables} may or * may not have limited docking functionality while in minimized and/or * preview state, depending upon the {@code MinimizationManager} * implementation. *

* Because the {@code MinimizationManager} is a critical piece of the * docking infrastructure, it cannot be set to {@code null}. Therefore, * this method will always return a valid {@code MinimizationManager} and * never a {@code null} reference. * * @return the currently installed {@code MinimizationManager}. * @see MinimizationManager * @see #setMinimizeManager(MinimizationManager) * @see #setMinimizeManager(String) */ public static MinimizationManager getMinimizeManager() { MinimizationManager mgr = getDockingManager().minimizeManager; return mgr == null ? MinimizationManager.DEFAULT_STUB : mgr; } /** * Returns the currently installed {@code FloatManager}. The * {@code FloatManager} is actually provided by the currently installed * {@code LayoutManager}. As such, this method is merely for convenience. * It internally obtains the installed {@code LayoutManager} via * {@code getLayoutManager()} and invokes its {@code getFloatManager()} * method. *

* The {@code FloatManager} maintains information relevant to floating * {@code Dockables} including grouping them together within dialogs and * tracking dialog size and position. The {@code FloatManager} is * responsible for generating new dialogs, parenting on the proper * application window(s), and sending {@code Dockables} to the proper * dialogs. It may be used by the {@code LayoutManager} to restore hidden * {@code Dockables} to proper floating state as needed. *

* Since the {@code FloatManager} is provided by the currently installed * {@code LayoutManager}, it cannot be set from within the * {@code DockingManager}. To change the installed {@code FloatManager}, * one must work directly with the installed {@code LayoutManager} * implementation per its particular custom API. *

* Since the {@code FloatManager} is a critical piece of the docking * insfrastructure, this method will never return a {@code null} reference. * * @return the {@code FloatManager} provided by the currently installed * {@code LayoutManager} * @see #getLayoutManager() * @see #setLayoutManager(LayoutManager) * @see LayoutManager#getFloatManager() */ public static FloatManager getFloatManager() { return getLayoutManager().getFloatManager(); } /** * Returns the {@code DockingState} for the {@code Dockable} with the * specified ID. The {@code DockingState} is used by the currently installed * {@code LayoutManager} to track information regarding a {@code Dockable's} * current state in the docking layout. This includes relative size and * positioning to other {@code Dockables}, minimization status, floating * status, and any other information used to track and potentially restore a * the {@code Dockable} to the layout if it is currently hidden. *

* The {@code Dockable} whose current {@code DockingState} is resolved will * map to the specified {@code dockableId} via its {@code getPersistentId()} * method. The semantics of this mapping relationship are the same as * {@code DockingManager.getDockable(String id)}. If a valid * {@code Dockable} cannot be found for the specified ID, then this method * returns a {@code null} reference. *

* The {@code DockingState} for any given {@code Dockable} is ultimately * managed by the currently installed {@code LayoutManager}. Therefore, * this method resolves the {@code LayoutManager} via * {@code getLayoutManager()} and defers processing to its * {@code getDockingState(String dockableId)} method. *

* The underlying {@code LayoutManager} does not provide any guarantees that * the same {@code DockingState} reference always will be returned for a * given {@code Dockable}; only that the returned {@code DockingState} will * accurately reflect the current state maintained by the * {@code LayoutManager} for that {@code Dockable}. For instance, if the * {@code LayoutManager} is capable of maintaining multiple layouts for an * application (as Eclipse does between perspectives), then the * {@code LayoutManager} may or may not maintain multiple * {@code DockingState} instances for a single {@code Dockable}, one within * each layout context. Therefore, it is not a good idea to cache references * to the {@code DockingState} instance returned by this method for future * use as the reference itself may possibly become stale over time depending * on the {@code LayoutManager} implementation. * * @param dockableId * the persistent ID of the {@code Dockable} whose current * {@code DockingState} is to be returned * @return the current {@code DockingState} maintained by the * {@code LayoutManager} for the specified {@code Dockable} * @see DockingState * @see #getLayoutManager() * @see LayoutManager#getDockingState(String) * @see #getDockable(String) * @see Dockable#getPersistentId() */ public static DockingState getDockingState(String dockableId) { return getLayoutManager().getDockingState(dockableId); } /** * Returns the {@code DockingState} for the specified {@code Dockable}. The * {@code DockingState} is used by the currently installed * {@code LayoutManager} to track information regarding a {@code Dockable's} * current state in the docking layout. This includes relative size and * positioning to other {@code Dockables}, minimization status, floating * status, and any other information used to track and potentially restore a * the {@code Dockable} to the layout if it is currently hidden. *

* If the {@code dockable} parameter is {@code null}, then this method * returns a {@code null} reference. *

* The {@code DockingState} for any given {@code Dockable} is ultimately * managed by the currently installed {@code LayoutManager}. Therefore, * this method resolves the {@code LayoutManager} via * {@code getLayoutManager()} and defers processing to its * {@code getDockingState(String dockableId)} method. *

* The underlying {@code LayoutManager} does not provide any guarantees that * the same {@code DockingState} reference always will be returned for a * given {@code Dockable}; only that the returned {@code DockingState} will * accurately reflect the current state maintained by the * {@code LayoutManager} for that {@code Dockable}. For instance, if the * {@code LayoutManager} is capable of maintaining multiple layouts for an * application (as Eclipse does between perspectives), then the * {@code LayoutManager} may or may not maintain multiple * {@code DockingState} instances for a single {@code Dockable}, one within * each layout context. Therefore, it is not a good idea to cache references * to the {@code DockingState} instance returned by this method for future * use as the reference itself may possibly become stale over time depending * on the {@code LayoutManager} implementation. * * @param dockable * the {@code Dockable} whose current {@code DockingState} is to * be returned * @return the current {@code DockingState} maintained by the * {@code LayoutManager} for the specified {@code Dockable} * @see #getLayoutManager() * @see LayoutManager#getDockingState(String) */ public static DockingState getDockingState(Dockable dockable) { return getLayoutManager().getDockingState(dockable); } /** * Returns the currently installed {@code DockableFactory}. The * {@code DockableFactory} installed by default is {@code null}. Therefore, * this method will return a {@code null} reference until the application * developer explicitly provides a {@code DockableFactory} implementation * via {@code setDockableFactory(DockableFactory factory)}. *

* Installing a {@code DockableFactory} allows FlexDock to seamlessly create * and register {@code Dockables} within {@code getDockable(String id)}. * Generally, {@code getDockable(String id)} will lookup the requested * {@code Dockable} within the internal registry. If not found, and there is * no {@code DockableFactory} installed, {@code getDockable(String id)} * returns a {@code null} reference. When a {@code DockableFactory} is * installed, however, failure to lookup a valid {@code Dockable} will cause * {@code getDockable(String id)} to invoke the installed * {@code DockableFactory's} {@code getDockable(String dockableId)} method, * transparently registering and returning the newly created * {@code Dockable} from {@code getDockable(String id)}. * * @return the currently installed {@code DockableFactory} * @see #getDockable(String) * @see DockableFactory#getDockable(String) */ public static DockableFactory getDockableFactory() { return getDockingManager().dockableFactory; } /** * Enables and disables auto-persistence of the current docking layout model * when the application exits. Auto-persistence is disabled by default. *

* The {@code storeLayoutModel()} provides a means of manually sending the * docking layout model to some type of external storage. When the * {@code DockingManager} class loads, a shutdown hook is added to the * {@code Runtime}. If auto-persist is enabled when the JVM exits, the * shutdown hook automatically calls {@code storeLayoutModel()}, catching * and reporting any {@code IOExceptions} that may occur. * * @param enabled * {@code true} if automatic persistence is desired; * {@code false} otherwise. * @see #storeLayoutModel() * @see Runtime#addShutdownHook(java.lang.Thread) */ public static void setAutoPersist(boolean enabled) { getDockingManager().autoPersister.setEnabled(enabled); } /** * Sets the divider location of the split layout containing the specified * dockable {@code Component}. The {@code Dockable} instance associated * with the specified {@code Component} is resolved via * {@code getDockable(Component comp)} and processing is dispatched to * {@code setSplitProportion(Dockable dockable, float proportion)}. *

* The resulting divider location will be a percentage of the split layout * size based upon the {@code proportion} parameter. Valid values for * {@code proportion} range from {@code 0.0F{@code to {@code 1.0F}. For * example, a {@code proportion} of {@code 0.3F} will move the divider to * 30% of the "size" (width for horizontal split, height * for vertical split) of the split container that contains the specified * {@code Component}. If a {@code proportion} of less than {@code 0.0F} is * supplied, the value }0.0F} is used. If a {@code proportion} greater than * {@code 1.0F} is supplied, the value }1.0F} is used. *

* It is important to note that the split divider location is only a * percentage of the container size from left to right or top to bottom. A * {@code proportion} of {@code 0.3F} does not imply that {@code dockable} * itself will be allotted 30% of the available space. The split divider * will be moved to the 30% position of the split container regardless of * the region in which the specified {@code Component} resides (which may * possibly result in {@code dockable} being allotted 70% of the available * space). *

* This method should be effective regardless of whether the split layout in * question has been fully realized and is currently visible on the screen. * This should alleviate common problems associated with setting percentages * of unrealized {@code Component} dimensions, which are initially * {@code 0x0} before the {@code Component} has been rendered to the screen. *

* If the specified {@code Component} is {@code null}, then no * {@code Exception} is thrown and no action is taken. Identical behavior * occurs if a valid {@code Dockable} cannot be resolved for the specified * {@code Component}, or the {@code Dockable} does not reside within a * split layout. *

* If the {@code Dockable} resides within a tabbed layout, a check is done * to see if the tabbed layout resides within a parent split layout. If so, * the resolved split layout is resized. Otherwise no action is taken. * * @param dockable * the {@code Component} whose containing split layout is to be * resized. * @param proportion * the percentage of containing split layout size to which the * split divider should be set. * @see #setSplitProportion(Dockable, float) * @see #getDockable(Component) */ public static void setSplitProportion(Component dockable, float proportion) { setSplitProportion(getDockable(dockable), proportion); } /** * Sets the divider location of the split layout containing the specified * dockable {@code Component}. *

* The resulting divider location will be a percentage of the split layout * size based upon the {@code proportion} parameter. Valid values for * {@code proportion} range from {@code 0.0F{@code to {@code 1.0F}. For * example, a {@code proportion} of {@code 0.3F} will move the divider to * 30% of the "size" (width for horizontal split, height * for vertical split) of the split container that contains the specified * {@code Dockable}. If a {@code proportion} of less than {@code 0.0F} is * supplied, the value }0.0F} is used. If a {@code proportion} greater than * {@code 1.0F} is supplied, the value }1.0F} is used. *

* It is important to note that the split divider location is only a * percentage of the container size from left to right or top to bottom. A * {@code proportion} of {@code 0.3F} does not imply that {@code dockable} * itself will be allotted 30% of the available space. The split divider * will be moved to the 30% position of the split container regardless of * the region in which the specified {@code Dockable} resides (which may * possibly result in {@code dockable} being allotted 70% of the available * space). *

* This method should be effective regardless of whether the split layout in * question has been fully realized and is currently visible on the screen. * This should alleviate common problems associated with setting percentages * of unrealized {@code Component} dimensions, which are initially * {@code 0x0} before the {@code Component} has been rendered to the screen. *

* If the specified {@code Dockable} is {@code null}, then no * {@code Exception} is thrown and no action is taken. Identical behavior * occurs if the {@code Dockable} does not reside within a split layout. *

* If the {@code Dockable} resides within a tabbed layout, a check is done * to see if the tabbed layout resides within a parent split layout. If so, * the resolved split layout is resized. Otherwise no action is taken. * * @param dockable * the {@code Dockable} whose containing split layout is to be * resized. * @param proportion * the percentage of containing split layout size to which the * split divider should be set. * @see #getDockable(Component) */ public static void setSplitProportion(Dockable dockable, float proportion) { DockingUtility.setSplitProportion(dockable, proportion); } /** * Sets the divider location of the split layout embedded within the * specified {@code DockingPort}. This method differs from both * {@code setSplitProportion(Component dockable, float proportion)} and * {@code setSplitProportion(Dockable dockable, float proportion)} in that * this method resolves the split layout embedded within the * specified {@code DockingPort}, whereas the other methods modify the * split layout containing their respective {@code Dockable} * parameters. *

* The resulting divider location will be a percentage of the split layout * size based upon the {@code proportion} parameter. Valid values for * {@code proportion} range from {@code 0.0F{@code to {@code 1.0F}. For * example, a {@code proportion} of {@code 0.3F} will move the divider to * 30% of the "size" (width for horizontal split, height * for vertical split) of the split container embedded within the specified * {@code DockingPort}. If a {@code proportion} of less than {@code 0.0F} * is supplied, the value }0.0F} is used. If a {@code proportion} greater * than {@code 1.0F} is supplied, the value }1.0F} is used. *

* This method should be effective regardless of whether the split layout in * question has been fully realized and is currently visible on the screen. * This should alleviate common problems associated with setting percentages * of unrealized {@code Component} dimensions, which are initially * {@code 0x0} before the {@code Component} has been rendered to the screen. *

* If the specified {@code DockingPort} is {@code null}, then no * {@code Exception} is thrown and no action is taken. Identical behavior * occurs if the {@code DockingPort} does not contain split layout. * * @param port * the {@code DockingPort} containing the split layout is to be * resized. * @param proportion * the percentage of split layout size to which the split divider * should be set. */ public static void setSplitProportion(DockingPort port, float proportion) { DockingUtility.setSplitProportion(port, proportion); } /** * Sets the currently installed {@code DockableFactory}. {@code null} * values for the {@code factory} parameter are acceptable. *

* Installing a {@code DockableFactory} allows FlexDock to seamlessly create * and register {@code Dockables} within {@code getDockable(String id)}. * Generally, {@code getDockable(String id)} will lookup the requested * {@code Dockable} within the internal registry. If not found, and there is * no {@code DockableFactory} installed, {@code getDockable(String id)} * returns a {@code null} reference. When a {@code DockableFactory} is * installed, however, failure to lookup a valid {@code Dockable} will cause * {@code getDockable(String id)} to invoke the installed * {@code DockableFactory's} {@code getDockable(String dockableId)} method, * transparently registering and returning the newly created * {@code Dockable} from {@code getDockable(String id)}. * * @param factory * the {@code DockableFactory} to install * @see #getDockableFactory() * @see #getDockable(String) * @see DockableFactory#getDockable(String) */ public static void setDockableFactory(DockableFactory factory) { getDockingManager().dockableFactory = factory; } /** * Sets the minimized state for the specified {@code Dockable}. This method * defers processing to * {@code setMinimized(Dockable dockable, boolean minimized, Component window)}, * passing the current {@code Window} ancestor of the specified * {@code Dockable} as the {@code window} parameter. Minimization * processessing is ultimately deferred to the currently installed * {@code MinimizationManager} with a constraint of * {@code MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT}. *

* The current {@code MinimizationManager} is responsible for updating the * underlying {@code DockingState} model for the specified {@code Dockable} * as well as rendering its own interpretation of the corresponding visual * state on the screen. If the supplied {@code minimized} parameter matches * the current {@code DockingState}, the {@code MinimizationManager} is * responsible for providing the appropriate visual indications, or lack * thereof. If the specified {@code Dockable} is {@code null}, no * {@code Exception} is thrown and no action is taken. * * @param dockable * the {@code Dockable} whose minimzed state is to be modified * @param minimized * {@code true} if the specified {@code Dockable} should be * minimized, {@code false} otherwise. * @see #setMinimized(Dockable, boolean, Component) * @see #getMinimizeManager() * @see MinimizationManager#setMinimized(Dockable, boolean, Component, int) * @see DockingState#getMinimizedConstraint() */ public static void setMinimized(Dockable dockable, boolean minimized) { Component cmp = dockable == null ? null : dockable.getComponent(); Window window = cmp == null ? null : SwingUtilities .getWindowAncestor(cmp); setMinimized(dockable, minimized, window); } /** * Sets the minimized state for the specified {@code Dockable}. This method * defers processing to * {@code setMinimized(Dockable dockable, boolean minimizing, Component window, int constraint)}, * passing {@code MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT} for the * {@code constraint} parameter. Minimization processessing is ultimately * deferred to the currently installed {@code MinimizationManager}. *

* The {@code window} parameter is passed to the {@code MinimizationManager} * to indicate that minimization should be handled with respect to the * specified root window, or the root window containing the specified * {@code Component}. {@code null} values are acceptable for this * parameter. *

* The current {@code MinimizationManager} is responsible for updating the * underlying {@code DockingState} model for the specified {@code Dockable} * as well as rendering its own interpretation of the corresponding visual * state on the screen. If the supplied {@code minimized} parameter matches * the current {@code DockingState}, the {@code MinimizationManager} is * responsible for providing the appropriate visual indications, or lack * thereof. If the specified {@code Dockable} is {@code null}, no * {@code Exception} is thrown and no action is taken. * * @param dockable * the {@code Dockable} whose minimzed state is to be modified * @param minimized * {@code true} if the specified {@code Dockable} should be * minimized, {@code false} otherwise. * @param window * the {@code Component} whose root window will be used by the * underlying {@code MinimizationManager} for rendering the * {@code Dockable} in its new minimized state. * @see #setMinimized(Dockable, boolean, Component, int) * @see #getMinimizeManager() * @see MinimizationManager#setMinimized(Dockable, boolean, Component, int) * @see DockingState#getMinimizedConstraint() */ public static void setMinimized(Dockable dockable, boolean minimized, Component window) { setMinimized(dockable, minimized, window, MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT); } /** * Sets the minimized state for the specified {@code Dockable}. This method * defers processing to * {@code setMinimized(Dockable dockable, boolean minimizing, Component window, int constraint)}, * passing {@code null} for the {@code window} parameter. Minimization * processessing is ultimately deferred to the currently installed * {@code MinimizationManager}. *

* Valid values for the {@code constraint} parameter may be found on the * {@code MinimizationManager} interface and include * UNSPECIFIED_LAYOUT_CONSTRAINT, TOP, LEFT, BOTTOM, RIGHT, and CENTER. * However, constraint values must ultimately be interpreted by the current * {@code MinimizationManager} implementation and, thus any integer value * may theoretically be valid for {@code constraint}. *

* The current {@code MinimizationManager} is responsible for updating the * underlying {@code DockingState} model for the specified {@code Dockable} * as well as rendering its own interpretation of the corresponding visual * state on the screen. If the supplied {@code minimized} parameter matches * the current {@code DockingState}, the {@code MinimizationManager} is * responsible for providing the appropriate visual indications, or lack * thereof. If the specified {@code Dockable} is {@code null}, no * {@code Exception} is thrown and no action is taken. * * @param dockable * the {@code Dockable} whose minimzed state is to be modified * @param minimizing * {@code true} if the specified {@code Dockable} should be * minimized, {@code false} otherwise. * @param constraint * a value to indicate to the {@code MinimizationManager} desired * rendering of the minimized {@code Dockable} * @see #setMinimized(Dockable, boolean, Component, int) * @see #getMinimizeManager() * @see MinimizationManager#setMinimized(Dockable, boolean, Component, int) * @see DockingState#getMinimizedConstraint() */ public static void setMinimized(Dockable dockable, boolean minimizing, int constraint) { setMinimized(dockable, minimizing, null, constraint); } /** * Sets the minimized state for the specified {@code Dockable}. This method * defers processing to the currently installed {@code MinimizationManager}. *

* The {@code window} parameter is passed to the {@code MinimizationManager} * to indicate that minimization should be handled with respect to the * specified root window, or the root window containing the specified * {@code Component}. If a {@code null} values is supplied for this * parameter, the currently active window is used. If no currently active * window can be determined, then this method exits with no action taken. *

* The current {@code MinimizationManager} is responsible for updating the * underlying {@code DockingState} model for the specified {@code Dockable} * as well as rendering its own interpretation of the corresponding visual * state on the screen. If the supplied {@code minimized} parameter matches * the current {@code DockingState}, the {@code MinimizationManager} is * responsible for providing the appropriate visual indications, or lack * thereof. If the specified {@code Dockable} is {@code null}, no * {@code Exception} is thrown and no action is taken. *

* Valid values for the {@code constraint} parameter may be found on the * {@code MinimizationManager} interface and include * UNSPECIFIED_LAYOUT_CONSTRAINT, TOP, LEFT, BOTTOM, RIGHT, and CENTER. * However, constraint values must ultimately be interpreted by the current * {@code MinimizationManager} implementation and, thus any integer value * may theoretically be valid for {@code constraint}. * * @param dockable * the {@code Dockable} whose minimzed state is to be modified * @param minimizing * {@code true} if the specified {@code Dockable} should be * minimized, {@code false} otherwise. * @param window * the {@code Component} whose root window will be used by the * underlying {@code MinimizationManager} for rendering the * {@code Dockable} in its new minimized state. * @param constraint * a value to indicate to the {@code MinimizationManager} desired * rendering of the minimized {@code Dockable} * @see #getMinimizeManager() * @see MinimizationManager#setMinimized(Dockable, boolean, Component, int) * @see DockingState#getMinimizedConstraint() */ public static void setMinimized(Dockable dockable, boolean minimizing, Component window, int constraint) { if (dockable == null) return; if (window == null) window = SwingUtility.getActiveWindow(); if (window == null) return; getMinimizeManager().setMinimized(dockable, minimizing, window, constraint); } /** * Sets the "main" {@code DockingPort} within the application window * containing the specified {@code Component}. Just as desktop applications * will tend to have a "main" application window, perhaps surrounded with * satellite windows or dialogs, the "main" {@code DockingPort} within a * given window will be considered by the application developer to contain * the primary docking layout used by the enclosing window. *

* The {@code Component} parameter may or may not be a root window * container. If not, the ancestor window of {@code comp} is determined and * a set of docking ports encapsulated by a {@code RootDockingPortInfo} * instance is returned by a call to * {@code getRootDockingPortInfo(Component comp)}. The resolved * {@code RootDockingPortInfo} instance's main {@code DockingPort} is set * via its method {@code setMainPort(String portId)}. *

* By default, the "main" {@code DockingPort} assigned to any * {@code RootDockingPortInfo} instance associated with a window will happen * to be the first root {@code DockingPort} detected for that window. This * method is used to alter that setting. *

* If {@code comp} is {@code null} or the root window cannot be resolved, * then this method returns with no action taken. * * @param window * the {@code Component} whose root window will be checked for a * main {@code DockingPort} * @param portId * the persistent ID of the {@code DockingPort} to use as the * main {@code DockingPort} for the specified window. * @see #getRootDockingPortInfo(Component) * @see #getRootDockingPort(Component) * @see DockingPortTracker#getRootDockingPortInfo(Component) * @see RootDockingPortInfo#getMainPort() * @see RootDockingPortInfo#setMainPort(String) */ public static void setMainDockingPort(Component window, String portId) { RootDockingPortInfo info = getRootDockingPortInfo(window); if (info != null) info.setMainPort(portId); } /** * Sets the currently installed {@code MinimizationManager}. The * {@code MinimizationManager} is responsible for minimizing and * unminimizing {@code Dockables}, removing from and restoring to the * embedded docking layout through the currently installed * {@code LayoutManager}. *

* The visual representation of a "minimized" {@code Dockable} is somewhat * abstract, although it is commonly expressed in user interfaces with the * disappearance of the {@code Dockable} from the layout and the addition of * a tab or label on one or more edges of the application window. The * {@code MinimizationManager} implementation itself is responsible for * interpreting the visual characteristics and behavior of a minimized * {@code Dockable}, but it must provide a "preview" feature to allow * viewing of minimized {@code Dockables}, on demand without actually * restoring them to the embedded docking layout. {@code Dockables} may or * may not have limited docking functionality while in minimized and/or * preview state, depending upon the {@code MinimizationManager} * implementation. *

* Because the {@code MinimizationManager} is a critical piece of the * docking infrastructure, it cannot be set to {@code null}. If a * {@code null} value is passed into this method, the default * {@code MinimizationManager} provided by the framework is used instead. * * @param mgr * the {@code MinimizationManager} to be installed * @see MinimizationManager * @see #getMinimizeManager() * @see #setMinimizeManager(String) */ public static void setMinimizeManager(MinimizationManager mgr) { DockingManager dockingManager = getDockingManager(); if (mgr == null) // do not allow null minimization managers setMinimizeManager(dockingManager.defaultMinimizeManagerClass); else dockingManager.minimizeManager = mgr; } /** * Sets the currently installed {@code MinimizationManager} using the * specfied class name. An attempt is make to instantiate a * {@code MinimizationManager} based upon the supplied class name * {@code String}. If the class cannot be instaniated, a stacktrace is * reported to the System.err and the default {@code MinimizationManager} * supplied by the framework is used. If the {@code String} parameter is * {@code null}, no error occurs and the default * {@code MinimizationManager} is used. If the instantiated class is not a * valid instance of {@code MinimizationManager}, then a * {@code ClassCastException} is thrown. *

* The {@code MinimizationManager} is responsible for minimizing and * unminimizing {@code Dockables}, removing from and restoring to the * embedded docking layout through the currently installed * {@code LayoutManager}. *

* The visual representation of a "minimized" {@code Dockable} is somewhat * abstract, although it is commonly expressed in user interfaces with the * disappearance of the {@code Dockable} from the layout and the addition of * a tab or label on one or more edges of the application window. The * {@code MinimizationManager} implementation itself is responsible for * interpreting the visual characteristics and behavior of a minimized * {@code Dockable}, but it must provide a "preview" feature to allow * viewing of minimized {@code Dockables}, on demand without actually * restoring them to the embedded docking layout. {@code Dockables} may or * may not have limited docking functionality while in minimized and/or * preview state, depending upon the {@code MinimizationManager} * implementation. *

* Because the {@code MinimizationManager} is a critical piece of the * docking infrastructure, it cannot be set to {@code null}. If a * {@code null} value is passed into this method, the default * {@code MinimizationManager} provided by the framework is used instead. * * @param mgrClass * the class name of the {@code MinimizationManager} to be * installed * @see MinimizationManager * @see #getMinimizeManager() * @see #setMinimizeManager(String) */ public static void setMinimizeManager(String mgrClass) { Object instance = Utilities.getInstance(mgrClass); setMinimizeManager((MinimizationManager) instance); } /** * Sets whether global floating support should be enabled. Defers processing * to * {@code FloatPolicyManager.setGlobalFloatingEnabled(boolean globalFloatingEnabled)}. * * @param enabled * {@code true} if global floating support should be enabled, * {@code false} otherwise. * @see FloatPolicyManager#setGlobalFloatingEnabled(boolean) * @see FloatPolicyManager#isGlobalFloatingEnabled() */ public static void setFloatingEnabled(boolean enabled) { FloatPolicyManager.setGlobalFloatingEnabled(enabled); } public static void setDefaultPersistenceKey(String key) { getLayoutManager().setDefaultPersistenceKey(key); } public static String getDefaultPersistenceKey() { return getLayoutManager().getDefaultPersistenceKey(); } /** * Sets whether tabbed layouts are supported by default for * {@code DockingPorts} with a single {@code Dockable} in the CENTER region. * This is a global default setting and applies to any {@code DockingPort} * that does not have a specific contradictory local setting. *

* This method defers processing to * {@code org.flexdock.docking.props.PropertyManager.getDockingPortRoot()}. * As such, there are multiple "scopes" at which this property may be * overridden. * * @param allowed * {@code true} if the default setting for {@code DockingPorts} * should allow a tabbed layout for a single {@code Dockable} in * the CENTER region; {@code false} otherwise. * @see PropertyManager#getDockingPortRoot() * @see org.flexdock.docking.props.DockingPortPropertySet#setSingleTabsAllowed(boolean) */ public static void setSingleTabsAllowed(boolean allowed) { PropertyManager.getDockingPortRoot().setSingleTabsAllowed(allowed); } /** * Sets the currently installed {@code LayoutManager}. The * {@code LayoutManager} is responsible for managing docking layout state. * This includes tracking the state for all {@code Dockables} as they are * embedded, minimized, floated, or hidden. If a {@code Dockable} is * embedded, the {@code LayoutManager} is responsible for tracking its * position and size relative to other embedded {@code Dockables}. If * floating, the {@code LayoutManager} is responsible for supplying a * {@code FloatManager} to maintain {@code Dockable} groupings within * dialogs as well as dialog size and positioning. *

* The {@code LayoutManager} is responsible for providing a persistence * mechanism to save and restore layout states. Depending on the * {@code LayoutManager} implementation, it may or may not support multiple * layout models that may be loaded and switched between at runtime. *

* Because the {@code LayoutManager} is a critical piece of the docking * infrastructure, it is not possible to install a {@code null} * {@code LayoutManager}. FlexDock provides a default {@code LayoutManager} * implementation. If this method is passed a {@code null} argument, the * default {@code LayoutManager} is used instead. * * @param mgr * the {@code LayoutManager} to install. * @see LayoutManager * @see #setLayoutManager(String) * @see #getLayoutManager() */ public static void setLayoutManager(LayoutManager mgr) { DockingManager dockingManager = getDockingManager(); if (mgr == null) // do not allow a null layout manager. setLayoutManager(dockingManager.defaultLayoutManagerClass); else getDockingManager().layoutManager = mgr; } /** * Sets the currently installed {@code LayoutManager} using the specified * class name. An attempt is make to instantiate a {@code LayoutManager} * based upon the supplied class name {@code String}. If the class cannot * be instaniated, a stacktrace is reported to the System.err and the * default {@code LayoutManager} supplied by the framework is used. If the * {@code String} parameter is {@code null}, no error occurs and the * default {@code LayoutManager} is used. If the instantiated class is not a * valid instance of {@code LayoutManager}, then a * {@code ClassCastException} is thrown. *

* The {@code LayoutManager} is responsible for managing docking layout * state. This includes tracking the state for all {@code Dockables} as they * are embedded, minimized, floated, or hidden. If a {@code Dockable} is * embedded, the {@code LayoutManager} is responsible for tracking its * position and size relative to other embedded {@code Dockables}. If * floating, the {@code LayoutManager} is responsible for supplying a * {@code FloatManager} to maintain {@code Dockable} groupings within * dialogs as well as dialog size and positioning. *

* The {@code LayoutManager} is responsible for providing a persistence * mechanism to save and restore layout states. Depending on the * {@code LayoutManager} implementation, it may or may not support multiple * layout models that may be loaded and switched between at runtime. *

* Because the {@code LayoutManager} is a critical piece of the docking * infrastructure, it is not possible to install a {@code null} * {@code LayoutManager}. FlexDock provides a default {@code LayoutManager} * implementation. If this method is passed a {@code null} argument, the * default {@code LayoutManager} is used instead. * * @param mgrClass * the class name of the {@code LayoutManager} to install. * @see LayoutManager * @see #setLayoutManager(LayoutManager) * @see #getLayoutManager() */ public static void setLayoutManager(String mgrClass) { Object instance = Utilities.getInstance(mgrClass); setLayoutManager((LayoutManager) instance); } /** * Sets the {@code DockingStrategy} associated with specified {@code Class}. * This method returns with no action taken if the specified {@code Class} * paramter is {@code null}. If the {@code strategy} parameter is * {@code null} then any existing {@code DockingStrategy} association with * the specified }Class} is removed. Otherwise, a new * {@code DockingStrategy} association is added for the specified * {@code Class}. *

* {@code DockingStrategy} association follows a strict inheritance chain * using {@code org.flexdock.util.ClassMapping}. This means that the * association created by this method applies for the specified * {@code Class} and all direct subclasses, but associations for interfaces * are ignored. Associations also do not apply for subclasses that have * their own specific {@code DockingStrategy} mapping. *

* * @param classKey * the {@code Class} whose {@code DockingStrategy} association we * wish to set * @param strategy * the {@code DockingStrategy} to be associated with the * specified {@code Class}. * @see #getDockingStrategy(Class) * @see #getDockingStrategy(Object) * @see ClassMapping#addClassMapping(Class, Class, Object) * @see ClassMapping#removeClassMapping(Class) */ public static void setDockingStrategy(Class classKey, DockingStrategy strategy) { if (classKey == null) return; if (strategy == null) DOCKING_STRATEGIES.removeClassMapping(classKey); else DOCKING_STRATEGIES.addClassMapping(classKey, strategy.getClass(), strategy); } /** * Undocks the specified {@code Dockable} from its parent * {@code DockingPort}. If the {@code Dockable} is {@code null}, or it * does not currently reside within a {@code DockingPort}, then this method * returns {@code false} with no action taken. Otherwise, this method * returns {@code true} if the undocking operation was successful and * {@code false} if the undocking operation could not be completed. * * This method determines the {@code DockingStrategy} to be used for * {@code DockingPort} containing the specified {@code Dockable} and defers * processing to the {@code undock(Dockable dockable)} method on the * {@code DockingStrategy}. This method's return value will be based upon * the {@code DockingStrategy} implementation returned by a call to * {@code getDockingStrategy(Object obj)}. The {@code DockingStrategy} used * may be controlled via * {@code setDockingStrategy(Class c, DockingStrategy strategy)}, supplying * a {@code DockingPort} implementation class and a customized * {@code DockingStrategy}. * * @param dockable * the {@code Dockable} to be undocked. * @return {@code true} if the undocking operation was successful, * {@code false} otherwise. * @see DockingStrategy#undock(Dockable) * @see #getDockingStrategy(Object) * @see #setDockingStrategy(Class, DockingStrategy) */ public static boolean undock(Dockable dockable) { if (dockable == null) return false; DockingStrategy strategy = findDockingStrategy(dockable); if (strategy != null) { return strategy.undock(dockable); } return false; // TODO think of changing it to runtime exception I // don't see a situation when there would be no default docker. } public static boolean undock(final Component dockable) { return undock(resolveDockable(dockable)); } /** * Ensures that a valid {@code DragManager} has been installed as a listener * for all of the specified {@code Dockable's} drag source * {@code Components}. This method invokes the {@code getDragSources()} * method on the specified {@code Dockable} and iterates over each * {@code Component} in the returned {@code List}. If any {@code Component} * does not have a valid {@code DragManager} listener installed, an * appropriate listener is added to enable drag-to-dock functionality. *

* This method is useful to application developers who manually attempt to * add new {@code Components} to a {@code Dockable's} drag source * {@code List}. However, it is not necessary to call this method unless * the drag source list has been updated after calling * {@code registerDockable(Dockable dockable)}, since * {@code registerDockable(Dockable dockable)} will automatically initialize * each drag source for the specified {@code Dockable}. *

* If the specified {@code Dockable} is {@code null}, then no * {@code Exception} is thrown and no action is taken. * * @param dockable * the {@code Dockable} whose drag sources are to be checked for * {@code DragManagers} and updated accordingly. * @see #registerDockable(Dockable) * @see Dockable#getDragSources() * @see DragManager */ public static void updateDragListeners(Dockable dockable) { if (dockable == null) return; DragManager dragListener = getDragListener(dockable); if (dragListener == null) { dragListener = new DragManager(dockable); } for (Iterator it = dockable.getDragSources().iterator(); it.hasNext();) { Object obj = it.next(); if (obj instanceof Component) { updateDragListeners((Component) obj, dragListener); } } } private static void removeDragListeners(Dockable dockable) { if (dockable == null) return; for (Iterator it = dockable.getDragSources().iterator(); it.hasNext();) { Object obj = it.next(); if (obj instanceof Component) { removeDragListeners((Component) obj); } } } public static float getDefaultSiblingSize() { return getDockingManager().defaultSiblingSize; } public static void setDefaultSiblingSize(float size) { size = Math.max(size, 0); size = Math.min(size, 1); getDockingManager().defaultSiblingSize = size; } public static void setRubberBand(RubberBand rubberBand) { EffectsManager.setRubberBand(rubberBand); } public static void setDragPreview(DragPreview dragPreview) { EffectsManager.setPreview(dragPreview); } /** * Maximizes the {@code Dockable} associated with the specified component or * restores the {@code Dockable} if it is currently maximized. This method * forwards the request to {@link #toggleMaximized(Dockable)} after * obtaining the {@code Dockable} associated to the component via * {@link #getDockable(Component)}. * * @param comp * @see #toggleMaximized(Dockable) */ public static void toggleMaximized(Component comp) { Dockable dockable = getDockable(comp); if (dockable == null) { return; } toggleMaximized(dockable); } /** * Maximizes the specified {@code Dockable} or restores the specified * {@code Dockable} if it is already maximized. *

* The scope of maximization is the root {@code DockingPort}. The * specified {@code Dockable}'s current {@code DockingPort} is asked to * temporarily lend the {@code Dockable} for maximization and the root * {@code DockingPort} is asked to temorarily host the {@code Dockable} and * display it such that it occupies all (or the majority) of its screen * resources. If the {@code Dockable} is already maximized, the root * {@code DockingPort} is asked to return to its original state and the * {@code Dockable} is returned to its original {@code DockingPort}. * * @param dockable */ public static void toggleMaximized(Dockable dockable) { DockingPort rootPort = getRootDockingPort(dockable.getComponent()); MaximizedState state = getMaximizedState(rootPort); if (state != null) { if (state.getDockable() != dockable) { throw new IllegalStateException( "Can't maximize while different dockable is maximized"); // maybe silently switch maximized dockables instead? } restoreFromMaximized(dockable, rootPort, state); } else { maximize(dockable, rootPort); } } public static boolean isMaximized(Dockable dockable) { DockingPort rootPort = getRootDockingPort(dockable.getComponent()); MaximizedState state = getMaximizedState(rootPort); return state != null && state.getDockable().equals(dockable); } private static void maximize(Dockable dockable, DockingPort rootPort) { DockingPort originalPort = dockable.getDockingPort(); MaximizedState state = new MaximizedState(dockable, originalPort); originalPort.releaseForMaximization(dockable); rootPort.installMaximizedDockable(dockable); maximizedStatesByRootPort.put(rootPort, state); } private static void restoreFromMaximized(Dockable dockable, DockingPort rootPort, MaximizedState state) { // restore original state in reverse order than maximizing it // (otherwise this will not work if original port and root port are // identical) rootPort.uninstallMaximizedDockable(); state.getOriginalPort().returnFromMaximization(); maximizedStatesByRootPort.remove(rootPort); } private static MaximizedState getMaximizedState(DockingPort rootPort) { return (MaximizedState) maximizedStatesByRootPort.get(rootPort); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/DockingPort.java0000644000175000017500000003142012177715062025741 0ustar sylvestresylvestre/* * Copyright (c) 2004 Christopher M Butler * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.flexdock.docking; import java.awt.Component; import java.awt.Point; import java.util.Set; import org.flexdock.docking.event.DockingListener; import org.flexdock.docking.event.DockingMonitor; import org.flexdock.docking.props.DockingPortPropertySet; import org.flexdock.docking.state.LayoutNode; /** * This interface is designed to specify the API's required by * {@code DockingManager} for placing {@code Dockable} instances within a * container. A {@code DockingPort} is the parent container inside of which * {@code Dockable} instances may be placed. * * @author Chris Butler */ public interface DockingPort extends DockingListener, DockingMonitor { String INITIAL_TAB_POSITION = "DockingPort.init.tab.position"; /** * Returns a boolean indicating whether or not docking is allowed within the * specified region. Used by {@code DockingManager} during drag operations. */ boolean isDockingAllowed(Component comp, String region); /** * Removes all docked components from the {@code DockingPort}. */ void clear(); /** * Docks the specified Dockable in the specified region. The * {@code Dockable's} {@code getDockable()} component is used as the docking * component. */ boolean dock(Dockable dockable, String region); /** * Docks the specified Component in the specified region. Returns * {@code true} for success and {@code false} for failure. */ boolean dock(Component comp, String region); /** * Returns a reference to the currently docked component. */ Component getDockedComponent(); /** * Returns a reference to Dockable currently docked in the target region. * Returns null if there is no Dockable there. If a tabbed layout is * present, this method will return the Dockable in the currently selected * tab. */ Dockable getDockable(String region); /** * Returns a reference to Component currently docked in the target region. * Returns null if there is no Component there. If a tabbed layout is * present, this method will return the Component in the currently selected * tab. */ Component getComponent(String region); /** * Returns a {@code String} identifier that is unique within a JVM instance, * but persistent across JVM instances. This is used for configuration * mangement, allowing the JVM to recognize a {@code DockingPort} instance * within an application instance, persist the ID, and recall it in later * application instances. The ID should be unique within an appliation * instance so that there are no collisions with other {@code DockingPort} * instances, but it should also be consistent from JVM to JVM so that the * association between a {@code DockingPort} instance and its ID can be * remembered from session to session. */ String getPersistentId(); /** * Sets the persistent ID String to be returned by {@code getPersistentId()}. * * @param id * the persistent ID to be applied. * @see #getPersistentId() */ void setPersistentId(String id); /** * Indicates whether or not the specified component is a child component * docked within the {@code DockingPort}. */ boolean isParentDockingPort(Component comp); /** * Removes the specified Component in from the {@code DockingPort}. Returns * {@code true} for success and {@code false} for failure. */ boolean undock(Component comp); /** * Returns the region of this {@code DockingPort} containing the coordinates * within the specified {@code Point}. The return value will be one of the * regions specified in {@code org.flexdock.util.DockingConstants}, * including {@code CENTER_REGION}, {@code NORTH_REGION}, * {@code SOUTH_REGION}, {@code EAST_REGION}, {@code WEST_REGION}, or * {@code UNKNOWN_REGION}. * * @return the region containing the specified {@code Point}. */ String getRegion(Point p); /** * Returns the value of the property with the specified key. Only properties * added with {@code putClientProperty} will return a non-{@code null} * value. * * @param key * the being queried * @return the value of this property or {@code null} * @see javax.swing.JComponent#getClientProperty(java.lang.Object) */ Object getClientProperty(Object key); /** * Adds an arbitrary key/value "client property" to this {@code DockingPort}. * {@code null} values are allowed. * * @see javax.swing.JComponent#putClientProperty(java.lang.Object, * java.lang.Object) */ void putClientProperty(Object key, Object value); /** * Returns a {@code DockingPortPropertySet} instance associated with this * {@code DockingPort}. Developers implementing the {@code DockingPort} * interface may or may not choose to provide their own * {@code DockingPortPropertySet} implementation for use with this method. A * default implementation is supplied by the framework and most * {@code DockingPort} implementations, including all implementations * provided by the framework, will return the default * {@code DockingPortPropertySet} via a call to * {@code org.flexdock.docking.props.PropertyManager}. Developers are * encouraged to take advantage of this by calling * {@code PropertyManager.getDockingPortPropertySet(this)}. * * @return the {@code DockingPortPropertySet} associated with this * {@code DockingPort} This method may not return a {@code null} * reference. * @see org.flexdock.docking.props.DockingPortPropertySet * @see org.flexdock.docking.props.PropertyManager#getDockingPortPropertySet(DockingPort) */ DockingPortPropertySet getDockingProperties(); /** * Returns the {@code DockingStrategy} instance used by this * {@code DockingPort} for docking operations. * * @see DockingStrategy */ DockingStrategy getDockingStrategy(); /** * Returns a {@code Set} of all {@code Dockables} presently contained by * this {@code DockingPort}. * * @return a {@code Set} of {@code Dockables} contained by this * {@code DockingPort}. If the {@code DockingPort} contians no * {@code Dockables}, and empty {@code Set} is returned. This * method may not return a {@code null} reference. */ Set getDockables(); /** * Returns a boolean indicating whether or not this {@code DockingPort} is * nested within another {@code DockingPort}. If there are no other * {@code DockingPorts} within this {@code DockingPort's} container ancestor * hierarchy, then this method will return {@code true}. Otherwise, this * method will return {@code false}. If the this {@code DockingPort} is not * validated and/or is not part of a container hierarchy, this method should * return {@code true}. */ boolean isRoot(); /** * Examines a {@code LayoutNode} and constructs a corresponding component * hierarchy to match the specified layout. The supplied {@code LayoutNode} * will contain metadata describing a layout of {@code Dockables}, * including relative sizes, split proportions, tabbing sequences, etc. This * {@code DockingPort} is reponsible for constructing a valid * {@code Dockable} component layout based upon the metadata contained * within the supplied {@code LayoutNode} * * @param node * the {@code LayoutNode} describing the layout to construct * @see org.flexdock.docking.state.LayoutNode * @see #exportLayout() */ void importLayout(LayoutNode node); /** * Returns a {@code LayoutNode} containing metadata that describes the * current layout contained within this {@code DockingPort}. The returned * {@code LayoutNode} should be structured such that a subsequent call to * {@code importLayout()} on the same {@code DockingPort} should construct a * visual component layout identical to that which currently exists in this * {@code DockingPort} * * @return a {@code LayoutNode} representing the current layout state within * this {@code DockingPort} * @see org.flexdock.docking.state.LayoutNode * @see #importLayout(LayoutNode) */ LayoutNode exportLayout(); // --- Maximization /** * Asks this {@code DockingPort} to temporarily release its child * {@code Dockable} for use by another {@code DockingPort} to achieve * maximization. This method is called by {@code DockingManager} in the * course of maximizing a {@code Dockable}. Client code should not call * this method directly. *

* This {@code DockingPort} is expected to remove the specified dockable's * component from its swing container hierarchy. Also, this * {@code DockingPort} is expected to internally store enough information to * restore its current state after a subsequent call to * {@link #returnFromMaximization()}. * * @param dockable * the {@code Dockable} that is requested to be maximized * @see DockingManager#toggleMaximized(Component) * @see DockingManager#toggleMaximized(Dockable) */ void releaseForMaximization(Dockable dockable); /** * Notifies this {@code DockingPort} that the {@code Dockable} previously * released for maximization via a call to * {@link #releaseForMaximization(Dockable)} is now ready to be returned to * its original state inside this {@code DockingPort}. This method is * called by {@code DockingManager} in the course of restoring a maximized * {@code Dockable}. Client code should not call this method directly. * * @see DockingManager#toggleMaximized(Component) * @see DockingManager#toggleMaximized(Dockable) */ void returnFromMaximization(); /** * Asks this {@code DockingPort} to temporarily install the specified * {@code Dockable} and maximize its component. This method is called by * {@code DockingManager} in the course of maximizing a {@code Dockable}. * Client code should not call this method directly. *

* This {@code DockingPort} is expected to display the specified dockable's * component such that it occupies all (or the majority) of its screen * resources. Also, this {@code DockingPort} is expected to internally store * enough information to restore its current state after a subsequent call * to {@link #uninstallMaximizedDockable()}. * * @param dockable * the {@code Dockable} that is requested to be maximized * @see DockingManager#toggleMaximized(Component) * @see DockingManager#toggleMaximized(Dockable) */ void installMaximizedDockable(Dockable dockable); /** * Notifies this {@code DockingPort} that the {@code Dockable} previously * installed for maximization via a call to * {@link #installMaximizedDockable(Dockable)} should now be returned to its * original {@code DockingPort} and that this {@code DockingPort} should * return to its original state from before the call to * {@link #installMaximizedDockable(Dockable)}. This method is called by * {@code DockingManager} in the course of restoring a maximized * {@code Dockable}. Client code should not call this method directly. *

* This {@code DockingPort} is expected to remove the maximized dockable's * component from its swing container hierarchy. * * @see DockingManager#toggleMaximized(Component) * @see DockingManager#toggleMaximized(Dockable) */ void uninstallMaximizedDockable(); } flexdock-1.2.4/src/java/core/org/flexdock/docking/DockingStrategy.java0000644000175000017500000002047712177715062026631 0ustar sylvestresylvestre/* * Created on Mar 14, 2005 */ package org.flexdock.docking; import javax.swing.JSplitPane; import org.flexdock.docking.drag.DragOperation; /** * This interface defines an API used by {@code DockingManager} and * {@code DockingPort} to support customizable behaviors during docking * operations. {@code DockingManager} will associate a {@code DockingStrategy} * with a particular {@code DockingPort} or {@code Dockable} class type. Calls * to {@code DockingManager.dock()} and {@code DockingManager.undock()} will be * deferred to the {@code DockingStrategy} associated with the parameters * supplied in the respective method calls. {@code DockingStrategies} are also * responsible for creating sub-DockingPorts and split panes for nested * {@code DockingPorts} * * Implementations of {@code DockingStrategy} are responsible for managing * component relationships between {@code Dockables} and parent containers. This * includes making determinations as to whether a particular docking operation * will be allowed for the specified parameters and the specifics of how a * particular {@code Dockable} may be removed from one parent * {@code Container} or {@code DockingPort} and added to another. * {@code DockingStrategy} may determine whether a call to {@code dock()} * implies an attempt to float a {@code Dockable} in a separate window. * * Because of the potentially large scope of responsibilities associated with a * {@code DockingStrategy}, implementations may range from being very simple to * highly complex. Although custom implementations of {@code DockingStrategy} * are not discouraged, the recommeded path is to subclass * {@code DefaultDockingStrategy} for consistency of behavior. * * {@code DockingStrategies} are associated with a particular type of * {@code Dockable} or {@code DockingPort} by calling * {@code DockingManager.setDockingStrategy(Class c, DockingStrategy strategy)}. * {@code DefaultDockingStrategy} is the default implementation used for all * classes that do not have a custom {@code DockingStrategy} registered. * * @author Christopher Butler */ public interface DockingStrategy { /** * Attempts to dock the specified {@code Dockable} into the supplied * {@code DockingPort} in the specified region. If docking is not possible * for the specified parameters, then the method returns {@code false} and * no action is taken. Since there is no {@code DragOperation} parameter * present, this method implies programmatic docking as opposed to docking * as a result of drag-events. * * @param dockable * the {@code Dockable} we wish to dock * @param dockingPort * the {@code DockingPort} into which we wish to dock * @param dockingRegion * the region of the specified {@code DockingPort} into which we * wish to dock. * @return whether or not the docking operation was successful. */ boolean dock(Dockable dockable, DockingPort dockingPort, String dockingRegion); /** * Attempts to dock the specified {@code Dockable} into the supplied * {@code DockingPort} in the specified region based upon the semantics of * the specified {@code DragOperation}. If docking is not possible * for the specified parameters, then the method returns {@code false} and * no action is taken. * * @param dockable * the {@code Dockable} we wish to dock * @param dockingPort * the {@code DockingPort} into which we wish to dock * @param dockingRegion * the region of the specified {@code DockingPort} into which we * wish to dock. * @param operation * the {@code DragOperation} describing the state of the * application/mouse at the point in time in which we're * attempting to dock. * @return whether or not the docking operation was successful. */ boolean dock(Dockable dockable, DockingPort dockingPort, String dockingRegion, DragOperation operation); /** * Undocks the specified {@code Dockable} instance from its containing * {@code DockingPort}. * * @param dockable * the {@code Dockable} we wish to undock * @return {@code true} if the {@code Dockable} was successfully undocked. * Otherwise, returns {@code false}. */ boolean undock(Dockable dockable); /** * Creates and returns a new {@code DockingPort} instance based upon the * supplied {@code DockingPort} parameter. For layouts that support nested * {@code DockingPorts}, this method is useful for creating child * {@code DockingPorts} suitable for embedding within the base * {@code DockingPort} * * @param base * the {@code DockingPort} off of which the returned instance * will be based. * @return a new {@code DockingPort} instance based upon the supplied * parameter. */ DockingPort createDockingPort(DockingPort base); /** * Creates and returns a new {@code JSplitPane} instance based upon the * supplied parameters. The returned {@code JSplitPane} should be suitable * for embedding within the base {@code DockingPort} and its orientation * should reflect the supplied {@code region} parameter. * * @param base * the {@code DockingPort} off of which the returned * {@code JSplitPane} will be based. * @param region * the region within the base {@code DockingPort} used to * determine the orientation of the returned {@code JSplitPane}. * @return a new {@code JSplitPane} suitable for embedding within the base * {@code DockingPort} parameter. */ JSplitPane createSplitPane(DockingPort base, String region); /** * Creates and returns a new {@code JSplitPane} instance based upon the * supplied parameters. The returned {@code JSplitPane} should be suitable * for embedding within the base {@code DockingPort} and its orientation * should reflect the supplied {@code region} parameter. * * @param base * the {@code DockingPort} off of which the returned * {@code JSplitPane} will be based. * @param region * the region within the base {@code DockingPort} used to * determine the orientation of the returned {@code JSplitPane}. * @param percent * the percentage used in the split. * @return a new {@code JSplitPane} suitable for embedding within the base * {@code DockingPort} parameter. */ JSplitPane createSplitPane(DockingPort base, String region, float percent); /** * Returns the initial divider location to be used by the specified * {@code JSplitPane}. This method assumes that the {@code JSplitPane} * parameter is embedded within the specified {@code DockingPort} and that * is has been validated and its current dimensions are non-zero. * * @param dockingPort * the {@code DockingPort} that contains, or will contain the * specified {@code JSplitPane}. * @param splitPane * the {@code JSplitPane} whose initial divider location is to be * determined. * @return the desired divider location of the supplied {@code JSplitPane}. */ int getInitialDividerLocation(DockingPort dockingPort, JSplitPane splitPane); /** * Returns the desired divider proportion of the specified * {@code JSplitPane} after rendering. This method assumes that the * {@code JSplitPane} parameter is, or will be embedded within the specified * {@code DockingPort}. This method does not assume that the * {@code JSplitPane} has been validated and that it's current dimensions * are non-zero. * * @param dockingPort * the {@code DockingPort} that contains, or will contain the * specified {@code JSplitPane}. * @param splitPane * the {@code JSplitPane} whose initial divider location is to be * determined. * @return the desired divider proportion of the supplied {@code JSplitPane}. */ double getDividerProportion(DockingPort dockingPort, JSplitPane splitPane); } flexdock-1.2.4/src/java/core/org/flexdock/docking/DockingStub.java0000644000175000017500000000431512177715062025735 0ustar sylvestresylvestre/* * Created on Jun 23, 2005 */ package org.flexdock.docking; import java.awt.Component; /** * @author Christopher Butler */ public interface DockingStub { /** * Returns the {@code Component} that is the event source for drag * operations. The component may or may not be the same as the Component * returned by {@code getFrameDragSource()}. * * @see #getFrameDragSource() */ Component getDragSource(); /** * Returns the {@code Component} that is used as a frame drag source. When * this {@code DockingStub} is floated into an external frame, that frame * may or may not have a titlebar for repositioning. The Component returned * by this method will be setup with appropriate event listeners such that * dragging them will serve to reposition the containing frame as if they * were the frame titlebar. If the Component returned by this method and the * one returned by {@code getDragSource()} is the same, then then "frame * reposition" behavior will supercede any "drag-to-dock" behavior while * this stub is in a floating state. * * @see #getDragSource() */ Component getFrameDragSource(); /** * Returns a {@code String} identifier that is unique within a JVM instance, * but persistent across JVM instances. This is used for configuration * mangement, allowing the JVM to recognize a {@code Dockable} instance * within an application instance, persist the ID, and recall it in later * application instances. The ID should be unique within an appliation * instance so that there are no collisions with other {@code Dockable} * instances, but it should also be consistent from JVM to JVM so that the * association between a {@code Dockable} instance and its ID can be * remembered from session to session. *

* The framework performs indexing on the persistent ID. Consequently, this * method may not return a {@code null} reference. */ String getPersistentId(); /** * Gets the tab text for this class. * * @return the text placed in a {@code JTabbedPane} tab. * @see javax.swing.JTabbedPane */ String getTabText(); } flexdock-1.2.4/src/java/core/org/flexdock/docking/RegionChecker.java0000644000175000017500000002254512177715062026236 0ustar sylvestresylvestre/* * Created on Mar 11, 2005 */ package org.flexdock.docking; import java.awt.Component; import java.awt.Point; import java.awt.Rectangle; /** * This interface provides an API for determining the desired regional bounds * for a {@code Dockable} component. Implementing classes are responsible for * determining the bounds and proportional sizes for both docking regions and * sibling components. * * As a {@code Dockable} is dragged across a {@code DockingPort} containing * another embedded {@code Dockable}, a determination must be made as to where * the dragged {@code Dockable} will be docked within the target * {@code DockingPort} based upon the current mouse position relative to * the embedded {@code Dockable} underneath the mouse. Classes that implement * this interface are responsible for making such determinations. * * For example, if a {@code Dockable} is dragged over another {@code Dockable} * embedded within a {@code DockingPort}, and the current mouse position is * near the top edge of the embedded {@code Dockable}, the current * {@code RegionChecker} is responsible for determining whether the user is * attempting to dock in the {@code north}, {@code east}, {@code west}, or * {@code center} of the embedded {@code Dockable}. The visual * {@code DragPreview} displayed to the end user should reflect this * determination. * * Once the docking operation is complete and the layout has been split between * both {@code Dockables}, the actual percentage of space allotted to the new * {@code Dockable} in the layout, referred to as the "sibling", is also * determined by the current {@code RegionChecker} implementation. * * @author Christopher Butler * @author Mateusz Szczap */ public interface RegionChecker { /** * Default maximum region size. */ float MAX_REGION_SIZE = .5F; /** * Default minimum region size. */ float MIN_REGION_SIZE = .0F; /** * Default maximum sibling size. */ float MAX_SIBILNG_SIZE = 1F; /** * Default minimum sibling size. */ float MIN_SIBILNG_SIZE = .0F; /** * Default region size. */ float DEFAULT_REGION_SIZE = .25F; /** * Default sibling size. */ float DEFAULT_SIBLING_SIZE = .5F; /** * A key to find a system property that will override the default sibling * size in this interface. * * @see #DEFAULT_SIBLING_SIZE */ String DEFAULT_SIBLING_SIZE_KEY = "default.sibling.size"; /** * Returns the docking region of the supplied {@code Component} that * contains the coordinates of the specified {@code Point}. Valid return * values are those regions defined in {@code DockingConstants} and include * {@code CENTER_REGION}, {@code NORTH_REGION}, {@code SOUTH_REGION}, * {@code EAST_REGION}, {@code WEST_REGION}, or {@code UNKNOWN_REGION}. * * @param component * the {@code Component} whose region is to be examined. * @param point * the coordinates whose region is to be determined. * @return the docking region containing the specified {@code Point}. */ String getRegion(Component component, Point point); /** * Returns the rectangular bounds within the specified component that * represent it's {@code DockingConstants.NORTH_REGION}. * * @param component * the {@code Component} whose north region is to be returned. * @return the bounds containing the north region of the specified * {@code Component}. */ Rectangle getNorthRegion(Component component); /** * Returns the rectangular bounds within the specified component that * represent it's {@code DockingConstants.SOUTH_REGION}. * * @param component * the {@code Component} whose south region is to be returned. * @return the bounds containing the south region of the specified * {@code Component}. */ Rectangle getSouthRegion(Component component); /** * Returns the rectangular bounds within the specified component that * represent it's {@code DockingConstants.EAST_REGION}. * * @param component * the {@code Component} whose east region is to be returned. * @return the bounds containing the east region of the specified * {@code Component}. */ Rectangle getEastRegion(Component component); /** * Returns the rectangular bounds within the specified component that * represent it's {@code DockingConstants.WEST_REGION}. * * @param component * the {@code Component} whose west region is to be returned. * @return the bounds containing the west region of the specified * {@code Component}. */ Rectangle getWestRegion(Component component); /** * Returns the rectangular bounds within the specified component that * represent the specified region. Valid values for the {@code region} * parameter are those regions defined in {@code DockingConstants} and * include {@code NORTH_REGION}, {@code SOUTH_REGION}, {@code EAST_REGION}, * and {@code WEST_REGION}. All other region values should result in this * method returning a {@code null} reference. * * @param component * the {@code Component} whose region bounds are to be returned. * @param region * the specified region that is to be examined. * @return the bounds containing the supplied region of the specified * {@code Component}. */ Rectangle getRegionBounds(Component component, String region); /** * Returns a percentage representing the amount of space allotted for the * specified region within the specified {@code Component}. For example, a * return value of 0.25F for NORTH_REGION implies that the top 25% of the * supplied {@code Component's} bounds rectangle is to be interpreted as the * {@code Component's} northern region. Valid values for the {@code region} * parameter are those regions defined in {@code DockingConstants} and * include {@code NORTH_REGION}, {@code SOUTH_REGION}, {@code EAST_REGION}, * and {@code WEST_REGION}. All other region values should result in this * method returning the constant {@code DEFAULT_SIBLING_SIZE}. * * @param component * the {@code Component} whose region is to be examined. * @param region * the specified region that is to be examined. * @return the percentage of the specified {@code Component} allotted for * the specified region. */ float getRegionSize(Component component, String region); /** * A {@code Rectangle} representing the actual amount of space to allot for * sibling {@code Components} should they be docked into the specified * region. This method differs from * {@code getRegionBounds(Component c, String region)} in that * {@code getRegionBounds()} determines the amount to space used to check * whether a {@code Component's} docking will intersect with a particular * region, whereas this method returns the actual amount of space said * {@code Component} will take up after docking has been completed. Valid * values for the {@code region} parameter are those regions defined in * {@code DockingConstants} and include {@code NORTH_REGION}, * {@code SOUTH_REGION}, {@code EAST_REGION}, and {@code WEST_REGION}. * All other region values should result in this method returning the * constant {@code DEFAULT_SIBLING_SIZE}. * * @param component * the {@code Component} whose sibling bounds are to be returned. * @param region * the specified region that is to be examined. * @return the bounds containing the sibling bounds desired for * {@code Components} docked into the specified region of the of the * specified {@code Component}. */ Rectangle getSiblingBounds(Component component, String region); /** * Returns a percentage representing the amount of space allotted for * sibling {@code Components} to be docked within the specified region of * the supplied {@code Component}. This method differs from * {@code getRegionSize(Component c, String region)} in that * {@code getRegionSize()} determines the proportional space used to check * whether a {@code Component's} docking will intersect with a particular * region, whereas this method returns the proportional space said * {@code Component} will take up after docking has been completed. Valid * values for the {@code region} parameter are those regions defined in * {@code DockingConstants} and include {@code NORTH_REGION}, * {@code SOUTH_REGION}, {@code EAST_REGION}, and {@code WEST_REGION}. * All other region values should result in this method returning the * constant {@code DEFAULT_SIBLING_SIZE}. * * @param component * the {@code Component} whose sibling proportions are to be * returned. * @param region * the specified region that is to be examined. * @return the percentage of the specified {@code Component} allotted for * sibling {@code Components} that are to be docked into the * specified region. */ float getSiblingSize(Component component, String region); } flexdock-1.2.4/src/java/core/org/flexdock/docking/activation/0000755000175000017500000000000012177715062025014 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/docking/activation/ActiveDockableListener.java0000644000175000017500000001347312177715062032235 0ustar sylvestresylvestre/* * Created on Mar 18, 2005 */ package org.flexdock.docking.activation; import java.awt.AWTEvent; import java.awt.Component; import java.awt.Container; import java.awt.EventQueue; import java.awt.KeyboardFocusManager; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashSet; import javax.swing.JTabbedPane; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.util.DockingUtility; import org.flexdock.util.SwingUtility; /** * @author Christopher Butler */ public class ActiveDockableListener implements DockingConstants, PropertyChangeListener, ChangeListener, AWTEventListener { private static final ActiveDockableListener SINGLETON = new ActiveDockableListener(); private static HashSet PROP_EVENTS = new HashSet(); static { primeImpl(); } public static void prime() { } private static void primeImpl() { PROP_EVENTS.add(PERMANENT_FOCUS_OWNER); PROP_EVENTS.add(ACTIVE_WINDOW); EventQueue.invokeLater(new Runnable() { public void run() { KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); focusManager.addPropertyChangeListener(SINGLETON); } }); Toolkit.getDefaultToolkit().addAWTEventListener(SINGLETON, AWTEvent.MOUSE_EVENT_MASK); } public static ActiveDockableListener getInstance() { return SINGLETON; } private ActiveDockableListener() { } public void eventDispatched(AWTEvent event) { //catch all mousePressed events if(event.getID()!=MouseEvent.MOUSE_PRESSED) return; MouseEvent evt = (MouseEvent)event; if (evt.getSource() instanceof Component) { Component c = (Component) evt.getSource(); // check to see if the event was targeted at the deepest component at the current // mouse loaction Container container = c instanceof Container? (Container)c: null; if(container!=null && container.getComponentCount()>1) { // if not, find the deepest component Point p = evt.getPoint(); c = SwingUtilities.getDeepestComponentAt(c, p.x, p.y); } // request activation of the dockable that encloses this component ActiveDockableTracker.requestDockableActivation(c); } } public void propertyChange(PropertyChangeEvent evt) { String pName = evt.getPropertyName(); if(!PROP_EVENTS.contains(pName)) return; Component oldVal = SwingUtility.toComponent(evt.getOldValue()); Component newVal = SwingUtility.toComponent(evt.getNewValue()); boolean switchTo = newVal!=null; if(ACTIVE_WINDOW.equals(pName)) handleWindowChange(evt, oldVal, newVal, switchTo); else handleFocusChange(evt, oldVal, newVal, switchTo); } private void handleWindowChange(PropertyChangeEvent evt, Component oldVal, Component newVal, boolean activate) { // notify the ActiveDockableTracker of the window change ActiveDockableTracker.windowActivated(newVal); Component srcComponent = activate? newVal: oldVal; ActiveDockableTracker tracker = ActiveDockableTracker.getTracker(srcComponent); if(tracker!=null) tracker.setActive(activate); } private void handleFocusChange(PropertyChangeEvent evt, Component oldVal, Component newVal, boolean switchTo) { if(!switchTo) return; if(newVal instanceof JTabbedPane) newVal = ((JTabbedPane)newVal).getSelectedComponent(); activateComponent(newVal); } private void activateComponent(Component c) { Dockable dockable = DockingUtility.getAncestorDockable(c); if(dockable==null) return; ActiveDockableTracker tracker = ActiveDockableTracker.getTracker(dockable.getComponent()); if(tracker!=null) { tracker.setActive(dockable); } } public void stateChanged(ChangeEvent e) { Object obj = e.getSource(); if(obj instanceof JTabbedPane) { JTabbedPane pane = (JTabbedPane)obj; Component c = pane.getSelectedComponent(); Dockable dockable = DockingManager.getDockable(c); if(dockable!=null) { activateComponent(dockable.getComponent()); udpateTabChangeFocus(dockable); } } } private void udpateTabChangeFocus(final Dockable dockable) { KeyboardFocusManager mgr = KeyboardFocusManager.getCurrentKeyboardFocusManager(); Dockable focusParent = DockingUtility.getAncestorDockable(mgr.getFocusOwner()); if(focusParent==null || focusParent==dockable) return; // the current focusParent-dockable is different than the currently active dockable. // we'll need to update the focus component final Component comp = dockable.getComponent(); final Component deep = SwingUtilities.getDeepestComponentAt(comp, comp.getWidth()/2, comp.getHeight()/2); // invokeLater because the new tab may not yet be showing, meaning the enumeration of its // focus-cycle will return empty. the parent dockable in the new tab must be showing. EventQueue.invokeLater(new Runnable() { public void run() { ActiveDockableTracker.focusDockable(deep, dockable, true); } }); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/activation/ActiveDockableTracker.java0000644000175000017500000001640512177715062032041 0ustar sylvestresylvestre/* * Created on Mar 4, 2005 */ package org.flexdock.docking.activation; import java.awt.Component; import java.awt.Container; import java.awt.EventQueue; import java.awt.Window; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import javax.swing.JTabbedPane; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; import org.flexdock.util.DockingUtility; import org.flexdock.util.RootWindow; import org.flexdock.util.SwingUtility; /** * @author Christopher Butler */ public class ActiveDockableTracker { public static final String CURRENT_DOCKABLE = "ActiveDockableTracker.CURRENT_DOCKABLE"; private static final String KEY = "ActiveDockableTracker.KEY"; // private static final ActiveDockableTracker GLOBAL_TRACKER = new ActiveDockableTracker(); private static ActiveDockableTracker currentTracker; private static final Object LOCK = new Object(); private Dockable currentDockable; private PropertyChangeSupport changeSupport; static { initialize(); } private static void initialize() { // make sure DockingManager has been fully initialized Class c = DockingManager.class; } public static ActiveDockableTracker getTracker(Component component) { RootWindow window = RootWindow.getRootContainer(component); return getTracker(window); } public static ActiveDockableTracker getCurrentTracker() { synchronized(LOCK) { if(currentTracker==null) { Window window = SwingUtility.getActiveWindow(); if(window!=null) { currentTracker = getTracker(window); } } return currentTracker; } } private static ActiveDockableTracker getTracker(RootWindow window) { if(window==null) return null; ActiveDockableTracker tracker = (ActiveDockableTracker)window.getClientProperty(KEY); if(tracker==null) { tracker = new ActiveDockableTracker(); window.putClientProperty(KEY, tracker); } return tracker; } public static Dockable getActiveDockable() { ActiveDockableTracker tracker = getCurrentTracker(); return tracker==null? null: tracker.currentDockable; } public static Dockable getActiveDockable(Component window) { ActiveDockableTracker tracker = getTracker(window); return tracker==null? null: tracker.currentDockable; } static void windowActivated(Component c) { RootWindow window = RootWindow.getRootContainer(c); ActiveDockableTracker tracker = getTracker(window); synchronized(LOCK) { currentTracker = tracker; } } public static void requestDockableActivation(Component c) { requestDockableActivation(c, false); } public static void requestDockableActivation(Component c, boolean forceChange) { if(c==null) return; Dockable dockable = DockingUtility.getAncestorDockable(c); if(dockable!=null) { requestDockableActivation(c, dockable, forceChange); } } public static void requestDockableActivation(final Component c, final Dockable dockable, final boolean forceChange) { if(c==null || dockable==null) return; // make sure the window is currently active SwingUtility.activateWindow(c); focusDockable(c, dockable, forceChange); } static void focusDockable(Component child, final Dockable parentDockable, boolean forceChange) { // if the dockable is already active, then leave it alone. // skip this check if they're trying to force a change if(!forceChange && parentDockable.getDockingProperties().isActive().booleanValue()) return; Component parentComp = parentDockable.getComponent(); Container focusRoot = parentComp instanceof Container? (Container)parentComp: null; Component focuser = focusRoot==null? null: SwingUtility.getNearestFocusableComponent(child, focusRoot); if(focuser==null) focuser = parentComp; /* requestDockableActivation is called when one clicks in the window (cf ActiveDockableListener.eventDispatched) and if there is a focusable component where the click occured, it gets the focus with the following requestFocus() (and it is called in an invokeLater). If an other Dockable had the focus before, the current Dockable must changed. But this changement is notify by a PropertyChangeEvent, so requestDockableActivation is called again (cf DockablePropertyChangeHandler.handleActivationChange). and the Dockable would request the focus ! Conclusion: when the user click in the window, we have two concurrent threads which request focus for two differents components ! Since forceChange is true only if called from the PropertyChangeHandler, the focus will be request only when forceChange is false, that avoids the two concurrent requestFocus(). */ if (!forceChange) { final Component c = focuser; c.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { if(!DockingUtility.isActive(parentDockable)) { parentDockable.getDockingProperties().setActive(true); } c.removeFocusListener(this); } }); c.requestFocusInWindow(); } // if we're in a hidden tab, then bring the tab to the front if(parentComp.getParent() instanceof JTabbedPane) { JTabbedPane tabPane = (JTabbedPane)parentComp.getParent(); int indx = tabPane.indexOfComponent(parentComp); if(indx!=tabPane.getSelectedIndex()) tabPane.setSelectedIndex(indx); } } public ActiveDockableTracker() { changeSupport = new PropertyChangeSupport(this); } public void setActive(boolean b) { if (currentDockable == null || DockingManager.getDockable(currentDockable.getComponent()) == null) { return; } currentDockable.getDockingProperties().setActive(b); } public void setActive(Dockable dockable) { if (dockable != currentDockable) { Dockable oldValue = currentDockable; setActive(false); currentDockable = dockable; setActive(true); changeSupport.firePropertyChange(CURRENT_DOCKABLE, oldValue, dockable); } } public void addPropertyChangeListener(PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(listener); } public PropertyChangeListener[] getPropertyChangeListeners() { return changeSupport.getPropertyChangeListeners(); } public boolean containsPropertyChangeListener(PropertyChangeListener listener) { PropertyChangeListener[] listeners = getPropertyChangeListeners(); for(int i=0; i * If the {@code Component} returned by {@code getComponent()} is an * instance of {@code JComponent}, then this method will dispatch to that * {@code JComponent's} {@code getClientProperty(Object, Object)} method. * Otherwise, this {@code Dockable} will provide its own internal mapping of * client properties. * * @param key * the key that is being queried * @return the value of this property or {@code null} * @see Dockable#getClientProperty(Object) * @see javax.swing.JComponent#getClientProperty(java.lang.Object) */ public Object getClientProperty(Object key) { if (key == null) return null; Component c = getComponent(); if (c instanceof JComponent) return ((JComponent) c).getClientProperty(key); return clientProperties.get(key); } /** * Adds an arbitrary key/value "client property" to this {@code Dockable}. * {@code null} values are allowed. If {@code key} is {@code null}, then no * action is taken. *

* If the {@code Component} returned by {@code getComponent()} is an * instance of {@code JComponent}, then this method will dispatch to that * {@code JComponent's} {@code putClientProperty(Object, Object)} method. * Otherwise, this {@code Dockable} will provide its own internal mapping of * client properties. * * @param key * the new client property key * @param value * the new client property value; if {@code null} this method * will remove the property * @see Dockable#putClientProperty(Object, Object) * @see javax.swing.JComponent#putClientProperty(java.lang.Object, * java.lang.Object) */ public void putClientProperty(Object key, Object value) { if (key == null) return; Component c = getComponent(); if (c instanceof JComponent) { SwingUtility.putClientProperty(c, key, value); } else { Utilities.put(clientProperties, key, value); } } /** * Returns a {@code DockablePropertySet} instance associated with this * {@code Dockable}. This method returns the default implementation * supplied by the framework by invoking * {@code getDockablePropertySet(Dockable dockable)} on * {@code org.flexdock.docking.props.PropertyManager} and supplying an * argument of {@code this}. * * @return the {@code DockablePropertySet} associated with this * {@code Dockable}. This method will not return a {@code null} * reference. * @see org.flexdock.docking.props.DockablePropertySet * @see Dockable#getDockingProperties() * @see org.flexdock.docking.props.PropertyManager#getDockablePropertySet(Dockable) */ public DockablePropertySet getDockingProperties() { return PropertyManager.getDockablePropertySet(this); } /** * Returns the {@code DockingPort} within which this {@code Dockable} is * currently docked. If not currently docked, this method will return * {@code null}. *

* This method defers processing to * {@code getDockingPort(Dockable dockable)}, passing an argument of * {@code this}. This {@code DockingPort} returned is based upon the * {@code Component} returned by this {@code Dockable's} abstract * {@code getComponent()} method. * * @return the {@code DockingPort} within which this {@code Dockable} is * currently docked. * @see Dockable#getDockingPort() * @see DockingManager#getDockingPort(Dockable) */ public DockingPort getDockingPort() { return DockingManager.getDockingPort(this); } /** * Provides the default {@code Dockable} implementation of * {@code dock(Dockable dockable)} by calling and returning * {@code DockingManager.dock(Dockable dockable, Dockable parent)}. * {@code 'this'} is passed as the {@code parent} parameter. * * @param dockable * the {@code Dockable} to dock relative to this {@code Dockable} * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see Dockable#dock(Dockable) * @see DockingManager#dock(Dockable, Dockable) */ public boolean dock(Dockable dockable) { return DockingManager.dock(dockable, this); } /** * Provides the default {@code Dockable} implementation of * {@code dock(Dockable dockable, String relativeRegion)} by calling and * returning * {@code DockingManager.dock(Dockable dockable, Dockable parent, String region)}. * {@code 'this'} is passed as the {@code parent} parameter. * * @param dockable * the {@code Dockable} to dock relative to this {@code Dockable} * @param relativeRegion * the docking region into which to dock the specified * {@code Dockable} * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see Dockable#dock(Dockable, String) * @see DockingManager#dock(Dockable, Dockable, String) */ public boolean dock(Dockable dockable, String relativeRegion) { return DockingManager.dock(dockable, this, relativeRegion); } /** * Provides the default {@code Dockable} implementation of * {@code dock(Dockable dockable, String relativeRegion, float ratio)} by * calling and returning * {@code DockingManager.dock(Dockable dockable, Dockable parent, String region, float proportion)}. * {@code 'this'} is passed as the {@code parent} parameter. * * @param dockable * the {@code Dockable} to dock relative to this {@code Dockable} * @param relativeRegion * the docking region into which to dock the specified * {@code Dockable} * @param ratio * the proportion of available space in the resulting layout to * allot to the new sibling {@code Dockable}. * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see DockingManager#dock(Dockable, Dockable, String, float) */ public boolean dock(Dockable dockable, String relativeRegion, float ratio) { return DockingManager.dock(dockable, this, relativeRegion, ratio); } public void addPropertyChangeListener(PropertyChangeListener listener) { getDockingProperties().addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { getDockingProperties().removePropertyChangeListener(listener); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/defaults/BorderManager.java0000644000175000017500000000763012177715062030043 0ustar sylvestresylvestre/* * Copyright (c) 2004 Christopher M Butler * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.flexdock.docking.defaults; import org.flexdock.docking.DockingPort; /** * This interface provides a set of methods used by the * {@code DefaultDockingPort} class to manage border state after docking and * undocking operations. This class is necessary because * {@code DefaultDockingPort} is a {@code DockingPort} implementation that uses * nested {@code Components} to achieve a docking layout. Particularly, * {@code DefaultDockingPort} uses {@code JSplitPane} and {@code JTabbedPane}, * each of which have their own {@code Borders} provided by the currently * installed PLAF. Nesting these {@code Components} within one another without * proper border management can result in a compound border effect that is * displeasing to the eye. This class provides a means by which custom border * management behavior may be plugged into the {@code DefaultDockingPort} in * response to various different layout conditions. * * @author Chris Butler */ public interface BorderManager { /** * Callback method allowing for customized behavior when the * {@code DefaultDockingPort's} docked component state has changed and there * is no longer a component docked within the port. * * @param port * the {@code DockingPort} whose layout borders are to be managed */ public void managePortNullChild(DockingPort port); /** * Callback method allowing for customized behavior when the * {@code DefaultDockingPort's} docked component state has changed and there * is a single generic component docked within the port. The * {@code Component} may be retrieved by calling * {@code port.getDockedComponent()}. * * @param port * the {@code DockingPort} whose layout borders are to be managed */ public void managePortSimpleChild(DockingPort port); /** * Callback method allowing for customized behavior when the * {@code DefaultDockingPort's} docked component state has changed and the * port has been split between two components. The {@code JSPlitPane} may be * retrieved by calling {@code port.getDockedComponent()}. * * @param port * the {@code DockingPort} whose layout borders are to be managed */ public void managePortSplitChild(DockingPort port); /** * Callback method allowing for customized behavior when the * {@code DefaultDockingPort's} docked component state has changed and * docked components within the {@code CENTER} region are layed-out within a * {@code JTabbedPane}. The {@code JTabbedPane} may be retrieved by calling * {@code port.getDockedComponent()}. * * @param port * the {@code DockingPort} whose layout borders are to be managed */ public void managePortTabbedChild(DockingPort port); } flexdock-1.2.4/src/java/core/org/flexdock/docking/defaults/DefaultDockingPort.java0000644000175000017500000026776212177715062031101 0ustar sylvestresylvestre/* * Copyright (c) 2004 Christopher M Butler * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.flexdock.docking.defaults; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.LayoutManager2; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.Serializable; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.WeakHashMap; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.DockingStrategy; import org.flexdock.docking.RegionChecker; import org.flexdock.docking.activation.ActiveDockableTracker; import org.flexdock.docking.event.DockingEvent; import org.flexdock.docking.event.DockingListener; import org.flexdock.docking.event.DockingMonitor; import org.flexdock.docking.event.TabbedDragListener; import org.flexdock.docking.event.hierarchy.DockingPortTracker; import org.flexdock.docking.props.DockingPortPropertySet; import org.flexdock.docking.props.PropertyChangeListenerFactory; import org.flexdock.docking.props.PropertyManager; import org.flexdock.docking.state.LayoutNode; import org.flexdock.docking.state.tree.DockableNode; import org.flexdock.docking.state.tree.DockingPortNode; import org.flexdock.docking.state.tree.SplitNode; import org.flexdock.util.DockingUtility; import org.flexdock.util.LookAndFeelSettings; import org.flexdock.util.SwingUtility; import org.flexdock.util.UUID; import org.flexdock.util.Utilities; /** * This is a {@code Container} that implements the {@code DockingPort} * interface. It provides a default implementation of {@code DockingPort} to * allow ease of development within docking-enabled applications. *

* The {@code DefaultDockingPort} handles docking in one of three ways. If the * port is empty, then all incoming {@code Dockables} are docked to the CENTER * region. If the port is not empty, then all incoming {@code Dockables} docked * to the CENTER region are embedded within a {@code JTabbedPane}. All incoming * {@code Dockables} docked to an outer region (NORTH, SOUTH, EAST, and WEST) of * a non-empty port are placed into a split layout using a {@code JSplitPane}. *

* For centrally docked {@code Components}, the immediate child of the * {@code DefaultDockingPort} may or may not be a {@code JTabbedPane}. If * {@code isSingleTabAllowed()} returns {@code true} for the current * {@code DefaultDockingPort}, then the immediate child returned by * {@code getDockedComponent()} will return a {@code JTabbedPane} instance even * if there is only one {@code Dockable} embedded within the port. If there is a * single {@code Dockable} in the port, but {@code isSingleTabAllowed()} returns * {@code false}, then {@code getDockedComponent()} will return the * {@code Component} that backs the currently docked {@code Dockable}, returned * by the {@code Dockable's} {@code getComponent()} method. * {@code isSingleTabAllowed()} is a scoped property that may apply to this * port, all ports across the JVM, or all ports within a user defined scope. * {@code getDockedComponent()} will return a {@code JTabbedPane} at all times * if there is more than one centrally docked {@code Dockable} within the port, * and all docked {@code Components} will reside within the tabbed pane. *

* Components that are docked in the NORTH, SOUTH, EAST, or WEST regions are * placed in a {@code JSplitPane} splitting the layout of the * {@code DockingPort} between child components. Each region of the * {@code JSplitPane} contains a new {@code DefaultDockingPort}, which, in * turn, contains the docked components. In this situation, * {@code getDockedComponent()} will return a {@code JSplitPane} reference. *

* A key concept that drives the {@code DefaultDockingPort}, then, is the * notion that this {@code DockingPort} implementation may only ever have one * single child component, which may or may not be a wrapper for other child * components. Because {@code JSplitPane} contains child * {@code DefaultDockingPorts}, each of those {@code DefaultDockingPorts} is * available for further sub-docking operations. *

* Since a {@code DefaultDockingPort} may only contain one child component, * there is a container hierarchy to manage tabbed interfaces, split layouts, * and sub-docking. As components are removed from this hierarchy, the hierarchy * itself must be reevaluated. Removing a component from a child * {@code DefaultDockingPort} within a {@code JSplitPane} renders the child * {@code DefaultDockingPort} unnecessary, which, in turn, renders the notion of * splitting the layout with a {@code JSplitPane} unnecessary (since there are * no longer two components to split the layout between). Likewise, removing a * child component from a {@code JTabbedPane} such that there is only one child * left within the {@code JTabbedPane} removes the need for a tabbed interface * to begin with. *

* When the {@code DockingManager} removes a component from a * {@code DockingPort} via {@code DockingManager.undock(Dockable dockable)} it * uses a call to {@code undock()} on the current {@code DockingPort}. * {@code undock()} automatically handles the reevaluation of the container * hierarchy to keep wrapper-container usage at a minimum. Since * {@code DockingManager} makes this callback automatic, developers normally * will not need to call this method explicitly. However, when removing a * component from a {@code DefaultDockingPort} using application code, * developers should keep in mind to use {@code undock()} instead of * {@code remove()}. * * Border management after docking and undocking operations are accomplished * using a {@code BorderManager}. {@code setBorderManager()} may be used to set * the border manager instance and customize border management. * * @author Christopher Butler * */ public class DefaultDockingPort extends JPanel implements DockingPort, DockingConstants { protected class PortLayout implements LayoutManager2, Serializable { /** * Returns the amount of space the layout would like to have. * * @param parent * the Container for which this layout manager is being used * @return a Dimension object containing the layout's preferred size */ public Dimension preferredLayoutSize(Container parent) { Dimension dd; Insets i = getInsets(); if (dockedComponent != null) { dd = dockedComponent.getPreferredSize(); } else { dd = parent.getSize(); } return new Dimension(dd.width + i.left + i.right, dd.height + i.top + i.bottom); } /** * Returns the minimum amount of space the layout needs. * * @param parent * the Container for which this layout manager is being used * @return a Dimension object containing the layout's minimum size */ public Dimension minimumLayoutSize(Container parent) { Dimension dd; Insets i = getInsets(); if (dockedComponent != null) { dd = dockedComponent.getMinimumSize(); } else { dd = parent.getSize(); } return new Dimension(dd.width + i.left + i.right, dd.height + i.top + i.bottom); } /** * Returns the maximum amount of space the layout can use. * * @param target * the Container for which this layout manager is being used * @return a Dimension object containing the layout's maximum size */ public Dimension maximumLayoutSize(Container target) { Dimension dd; Insets i = getInsets(); if (dockedComponent != null) { dd = dockedComponent.getMaximumSize(); } else { // This is silly, but should stop an overflow error dd = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE - i.top - i.bottom); } return new Dimension(dd.width + i.left + i.right, dd.height + i.top + i.bottom); } /** * Instructs the layout manager to perform the layout for the specified * container. * * @param parent * the Container for which this layout manager is being used */ public void layoutContainer(Container parent) { Rectangle b = getBounds(); Insets i = getInsets(); int w = b.width - i.right - i.left; int h = b.height - i.top - i.bottom; if (dockedComponent != null) { dockedComponent.setBounds(i.left, i.top, w, h); } } public void addLayoutComponent(String name, Component comp) { } public void removeLayoutComponent(Component comp) { } public void addLayoutComponent(Component comp, Object constraints) { } public float getLayoutAlignmentX(Container target) { return 0.0f; } public float getLayoutAlignmentY(Container target) { return 0.0f; } public void invalidateLayout(Container target) { } } private static final WeakHashMap COMPONENT_TITLES = new WeakHashMap(); protected ArrayList dockingListeners; private Component dockedComponent; private BorderManager borderManager; private String persistentId; private boolean tabsAsDragSource; private boolean rootPort; private BufferedImage dragImage; private Timer timer; private Object lock = new Object(); static { // setup PropertyChangeListenerFactory to respond to // DefaultDockingPort-specific // events PropertyChangeListenerFactory .addFactory(new DockablePropertyChangeHandler.Factory()); } /** * Creates a new {@code DefaultDockingPort} with a persistent ID equal to * the {@code String} value of this a random UUID. * * @see org.flexdock.util.UUID */ public DefaultDockingPort() { this(UUID.randomUUID().toString()); } /** * Creates a new {@code DefaultDockingPort} with the specified persistent * ID. If {@code id} is {@code null}, then the {@code String} value of this * {@code Object's} hash code is used. The persistent ID will be the same * value returned by invoking {@code getPersistentId()} for this * {@code DefaultDockingPort}. * * @param id * the persistent ID for the new {@code DefaultDockingPort} * instance. */ public DefaultDockingPort(String id) { setPersistentId(id); dockingListeners = new ArrayList(2); addDockingListener(this); DockingPortPropertySet props = getDockingProperties(); props.setRegionChecker(new DefaultRegionChecker()); // check container hierarchy to track root dockingports addHierarchyListener(DockingPortTracker.getInstance()); // start out as a root dockingport rootPort = true; // configure layout setLayout(createLayout()); //configure the default border manager setBorderManager(createBorderManager()); } protected LayoutManager createLayout() { return new PortLayout(); } /** * Creates a standard border manager for this docking port. *

* This method is called from the constructor. * * @return the border manager for this docking port. */ protected BorderManager createBorderManager() { return new StandardBorderManager(new EmptyBorder(0, 0, 0, 0)); } /** * Overridden to set the currently docked component. Should not be called by * application code. * * @param comp * the component to be added */ public Component add(Component comp) { return setComponent(comp); } /** * Overridden to set the currently docked component. Should not be called by * application code. * * @param comp * the component to be added * @param index * the position at which to insert the component, or {@code -1} * to append the component to the end */ public Component add(Component comp, int index) { return setComponent(comp); } /** * Overridden to set the currently docked component. Should not be called by * application code. * * @param comp * the component to be added * @param constraints * an object expressing layout contraints for this component */ public void add(Component comp, Object constraints) { setComponent(comp); } /** * Overridden to set the currently docked component. Should not be called by * application code. * * @param comp * the component to be added * @param constraints * an object expressing layout contraints for this * @param index * the position in the container's list at which to insert the * component; {@code -1} means insert at the end */ public void add(Component comp, Object constraints, int index) { setComponent(comp); } /** * Overridden to set the currently docked component. Should not be called by * application code. * * @param name * the name of the {@code Component} to be added. * @param comp * the {@code Component} to add. */ public Component add(String name, Component comp) { return setComponent(comp); } private void addCmp(DockingPort port, Component c) { if (port instanceof Container) ((Container) port).add(c); } private void dockCmp(DockingPort port, Component c) { port.dock(c, CENTER_REGION); } /** * Returns {@code true} if docking is allowed for the specified * {@code Component} within the supplied {@code region}, {@code false} * otherwise. It is important to note that success of a docking operation * relies on many factors and a return value of {@code true} from this * method does not necessarily guarantee that a call to {@code dock()} will * succeed. This method merely indicates that the current * {@code DockingPort} does not have any outstanding reason to block a * docking operation with respect to the specified {@code Component} and * {@code region}. *

* If {@code comp} is {@code null} or {@code region} is invalid according to * {@code DockingManager.isValidDockingRegion(String region)}, then this * method returns {@code false}. *

* If this {@code DockingPort} is not already the parent {@code DockingPort} * for the specified {@code Component}, then this method returns * {@code true}. *

* If this {@code DockingPort} is already the parent {@code DockingPort} for * the specified {@code Component}, then a check is performed to see if * there is a tabbed layout. Tabbed layouts may contain multiple * {@code Dockables}, and thus the tab ordering may be rearranged, or * shifted into a split layout. If {@code comp} is the only docked * {@code Component} within this {@code DockingPort}, then this method * returns {@code false} since the layout cannot be rearranged. Otherwise, * this method returns {@code true}. * * @param comp * the {@code Component} whose docking availability is to be * checked * @param region * the region to be checked for docking availability for the * specified {@code Component}. * @return {@code true} if docking is allowed for the specified * {@code Component} within the supplied {@code region}, * {@code false} otherwise. * @see DockingPort#isDockingAllowed(Component, String) * @see DockingManager#isValidDockingRegion(String) * @see #isParentDockingPort(Component) */ public boolean isDockingAllowed(Component comp, String region) { if (comp == null || !isValidDockingRegion(region)) return false; // allow any valid region if we're not already the parent // of the component we're checking if (!isParentDockingPort(comp)) return true; // we already contain 'comp', so we're either a tabbed-layout, or // we contain 'comp' directly. If we contain 'comp' directly, then we // cannot logically move 'comp' to some other region within us, as it // already fills up our entire space. Component docked = getDockedComponent(); if (!(docked instanceof JTabbedPane)) // not a tabbed-layout, so we contain 'c' directly return false; JTabbedPane tabs = (JTabbedPane) docked; // if there is only 1 tab, then we already fill up the entire // dockingport space and cannot be moved elsewhere if (tabs.getTabCount() < 2) return false; // there is more than 1 tab present, so re-ordering is possible, // as well as changing regions return true; } /** * Checks the current state of the {@code DockingPort} and, if present, * issues the appropriate call to the assigned {@code BorderManager} * instance describing the container state. This method will issue a call to * 1 of the 4 following methods on the assigned {@code BorderManager} * instance, passing {@code this} as the method argument: *

* {@code managePortNullChild(DockingPort port)} * {@code managePortSimpleChild(DockingPort port)} * {@code managePortSplitChild(DockingPort port)} * {@code managePortTabbedChild(DockingPort port)} */ final void evaluateDockingBorderStatus() { if (borderManager == null) return; Component docked = getDockedComponent(); // check for the null-case if (docked == null) borderManager.managePortNullChild(this); // check for a split layout else if (docked instanceof JSplitPane) borderManager.managePortSplitChild(this); // check for a tabbed layout else if (docked instanceof JTabbedPane) borderManager.managePortTabbedChild(this); // otherwise, we have a simple case of a regular component docked within // us else borderManager.managePortSimpleChild(this); } /** * Returns the docking region within this {@code DockingPort} that contains * the specified {@code Point}. Valid return values are those regions * defined in {@code DockingConstants} and include {@code NORTH_REGION}, * {@code SOUTH_REGION}, {@code EAST_REGION}, {@code WEST_REGION}, * {@code CENTER_REGION}, and {@code UNKNOWN_REGION}. *

* If {@code location} is {@code null}, then {@code UNKNOWN_REGION} is * returned. *

* This method gets the {@code RegionChecker} for this {@code DockingPort} * by calling {@code getRegionChecker()}. It then attempts to locate the * {@code Dockable} at the specified {@code location} by calling * {@code getDockableAt(Point location)}. *

* This method defers processing to {@code getRegion(Component c, Point p)} * for the current {@code RegionChecker}. If a {@code Dockable} was found * at the specified {@code Point}, then the location of the {@code Point} * is translated to the coordinate system of the {@code Component} for the * embedded {@code Dockable} and that {@code Component} and modified * {@code Point} are passed into {@code getRegion(Component c, Point p)}} * for the current {@code RegionChecker}. If no {@code Dockable} was found, * then the specified {@code Point} is left unmodified and this * {@code DockingPort} and the supplied {@code Point} are passed to * {@code getRegion(Component c, Point p)}} for the current * {@code RegionChecker}. * * @param location * the location within this {@code DockingPort} to examine for a * docking region. * @return the docking region within this {@code DockingPort} that contains * the specified {@code Point} * @see #getRegionChecker() * @see #getDockableAt(Point) * @see Dockable#getComponent() * @see RegionChecker#getRegion(Component, Point) */ public String getRegion(Point location) { if (location == null) return UNKNOWN_REGION; RegionChecker regionChecker = getRegionChecker(); Dockable d = getDockableAt(location); Component regionTest = this; if (d != null) { regionTest = d.getComponent(); location = SwingUtilities.convertPoint(this, location, regionTest); } return regionChecker.getRegion(regionTest, location); } /** * Returns the {@code RegionChecker} currently used by this * {@code DockingPort}. This method retrieves the * {@code DockingPortPropertySet} instance for this {@code DockingPort} by * calling {@code getDockingProperties()}. It then returns by invoking * {@code getRegionChecker()} on the resolved {@code DockingPortPropertySet}. * * @return the {@code RegionChecker} currently used by this * {@code DockingPort}. * @see #getDockingProperties() * @see DockingPortPropertySet#getRegionChecker() */ public RegionChecker getRegionChecker() { return getDockingProperties().getRegionChecker(); } /** * Returns the direct child {@code Dockable} located at the specified * {@code Point}. If {@code location} is {@code null}, or this * {@code DockingPort} is empty, then a {@code null} reference is returned. *

* If this {@code DockingPort} contains a split layout, then any nested * {@code Dockables} will be within a sub-{@code DockingPort} and not a * direct child of this {@code DockingPort}. Therefore, if * {@code getDockedComponent()} returns a {@code JSplitPane}, then this * method will return a {@code null} reference. *

* If this {@code DockingPort} contains a tabbed layout, then the * {@code JTabbedPane} returned by {@code getDockedComponent()} will be * checked for a {@code Dockable} at the specified {@code Point}. * * @param location * the location within the {@code DockingPort} to test for a * {@code Dockable}. * @return the direct child {@code Dockable} located at the specified * {@code Point}. * @see #getDockedComponent() * @see DockingManager#getDockable(Component) * @see JTabbedPane#getComponentAt(int x, int y) */ public Dockable getDockableAt(Point location) { if (location == null) return null; Component docked = getDockedComponent(); if (docked == null || docked instanceof JSplitPane) return null; if (docked instanceof JTabbedPane) { JTabbedPane tabs = (JTabbedPane) docked; Component c = tabs.getComponentAt(location.x, location.y); return c instanceof Dockable ? (Dockable) c : DockingManager .getDockable(c); } return DockingManager.getDockable(docked); } /** * Returns the {@code Component} currently docked within the specified * {@code region}. *

* If this {@code DockingPort} has either a single child {@code Dockable} or * a tabbed layout, then the supplied region must be {@code CENTER_REGION} * or this method will return a {@code null} reference. If there is a single * child {@code Dockable}, then this method will return the same * {@code Component} as returned by {@code getDockedComponent()}. If there * is a tabbed layout, then this method will return the {@code Component} in * the currently selected tab. *

* If this {@code DockingPort} has a split layout, then a check for * {@code CENTER_REGION} will return a {@code null} reference. For outer * regions ({@code NORTH_REGION}, {@code SOUTH_REGION}, * {@code EAST_REGION}, or {@code WEST_REGION}), the supplied region * parameter must match the orientation of the embedded {@code JSplitPane}. * Thus for a vertically oriented split pane, checks for {@code EAST_REGION} * and {@code WEST_REGION} will return a {@code null} reference. Likewise, * for a horizontally oriented split pane, checks for {@code NORTH_REGION} * and {@code SOUTH_REGION} will return a {@code null} reference. *

* Outer regions are mapped to corresponding split pane regions. * {@code NORTH_REGION} maps to the split pane's top component, * {@code SOUTH_REGION} maps to the bottom, {@code EAST_REGION} maps to the * right, and {@code WEST_REGION} maps to the left. The sub-{@code DockingPort} * for the split pane region that corresponds to the specified * {@code region} parameter will be resolved and this method will return * that {@code Component} retrieved by calling its * {@code getDockedComponent()} method. Note that the * {@code getDockedComponent()} call to a sub- {@code DockingPort} implies * that the {@code JTabbedPane} or {@code JSplitPane} for the sub-port may * be returned if the sub-port contains multiple {@code Dockables}. *

* If this {@code DockingPort} is empty, then this method returns a * {@code null} reference. * * @param region * the region to be checked for a docked {@code Component} * @return the {@code Component} docked within the specified region. * @see DockingPort#getComponent(String) * @see #getDockedComponent() */ public Component getComponent(String region) { Component docked = getDockedComponent(); if (docked == null) return null; if (docked instanceof JTabbedPane) { // they can only get tabbed dockables if they were checking the // CENTER region. if (!CENTER_REGION.equals(region)) return null; JTabbedPane tabs = (JTabbedPane) docked; return tabs.getSelectedComponent(); } if (docked instanceof JSplitPane) { // they can only get split dockables if they were checking an outer // region. if (CENTER_REGION.equals(region)) return null; JSplitPane split = (JSplitPane) docked; // make sure the supplied regions correspond to the current // splitpane orientation boolean horizontal = split.getOrientation() == JSplitPane.HORIZONTAL_SPLIT; if (horizontal) { if (NORTH_REGION.equals(region) || SOUTH_REGION.equals(region)) return null; } else { if (EAST_REGION.equals(region) || WEST_REGION.equals(region)) return null; } boolean left = NORTH_REGION.equals(region) || WEST_REGION.equals(region); Component c = left ? split.getLeftComponent() : split .getRightComponent(); // split panes only contain sub-dockingports. if 'c' is not a // sub-dockingport, // then something is really screwed up. if (!(c instanceof DockingPort)) return null; // get the dockable contained in the sub-dockingport return ((DockingPort) c).getDockedComponent(); } // we already checked the tabbed layout and split layout. all that's // left is the direct-child component itself. this will only ever // exist in the CENTER, so return it if they requested the CENTER // region. return CENTER_REGION.equals(region) ? docked : null; } /** * Returns the {@code Dockable} currently docked within the specified * {@code region}. This method dispatches to * {@code getComponent(String region)} to retrieve the {@code Component} * docked within the specified region and returns its associated * {@code Dockable} via {@code DockingManager.getDockable(Component comp)}. *

* There are somewhat strict semantics associated with retrieving the * {@code Component} in a particular docking region. API documentation for * {@code getComponent(String region)} should be referenced for a listing of * the rule set. If {@code region} is invalid according to * {@code DockingManager.isValidDockingRegion(String region)}, then this * method returns a {@code null} reference. * * @param region * the region to be checked for a docked {@code Dockable} * @return the {@code Dockable} docked within the specified region. * @see DockingPort#getDockable(String) * @see #getComponent(String) * @see #getDockedComponent() * @see DockingManager#getDockable(Component) * @see DockingManager#isValidDockingRegion(String) */ public Dockable getDockable(String region) { Component c = getComponent(region); return DockingManager.getDockable(c); } /** * If this method returns {@code null}, implementations may throw * NullPointerExceptions. Do not expect NPE checking. * * @return a valid JTabbedPane. */ protected JTabbedPane createTabbedPane() { Insets oldInsets = UIManager .getInsets(LookAndFeelSettings.TAB_PANE_BORDER_INSETS); int tabPlacement = getInitTabPlacement(); int edgeInset = LookAndFeelSettings.getTabEdgeInset(tabPlacement); Insets newInsets = new Insets(0, 0, 0, 0); switch (tabPlacement) { case JTabbedPane.TOP: newInsets.top = edgeInset >= 0 ? edgeInset : oldInsets.top; break; case JTabbedPane.LEFT: newInsets.left = edgeInset >= 0 ? edgeInset : oldInsets.left; break; case JTabbedPane.BOTTOM: newInsets.bottom = edgeInset >= 0 ? edgeInset : oldInsets.bottom; break; case JTabbedPane.RIGHT: newInsets.right = edgeInset >= 0 ? edgeInset : oldInsets.right; break; } UIManager.put(LookAndFeelSettings.TAB_PANE_BORDER_INSETS, newInsets); JTabbedPane pane = new JTabbedPane(); pane.setTabPlacement(tabPlacement); UIManager.put(LookAndFeelSettings.TAB_PANE_BORDER_INSETS, oldInsets); TabbedDragListener tdl = new TabbedDragListener(); pane.addMouseListener(tdl); pane.addMouseMotionListener(tdl); return pane; } protected void updateTab(Dockable dockable) { Component docked = getDockedComponent(); if (docked instanceof JTabbedPane) { JTabbedPane tabs = (JTabbedPane) docked; int index = tabs.indexOfComponent(dockable.getComponent()); if (index > -1) { tabs.setIconAt(index, dockable.getDockingProperties() .getTabIcon()); tabs.setTitleAt(index, dockable.getDockingProperties() .getDockableDesc()); } } } /** * Returns the {@code DockingStrategy} used by this {@code DockingPort}. * This method dispatches to {@code getDockingStrategy(Object obj)}, * passing {@code this} as an argument. By default, * {@code DefaultDockingStrategy} is used unless a different * {@code DockingStrategy} has been assigned by the end user for * {@code DefaultDockingPort}. * * @return the {@code DockingStrategy} used by this {@code DockingPort}. * @see DockingPort#getDockingStrategy() * @see DockingManager#getDockingStrategy(Object) */ public DockingStrategy getDockingStrategy() { return DockingManager.getDockingStrategy(this); } /** * Removes all {@code Dockables} from this {@code DockingPort}. Internally, * this method dispatches to {@code removeAll()}. This ensures that not * only docked {@code Components} are removed, that that all wrapper * containers such as {@code JTabbedPanes}, {@code JSplitPanes}, and sub-{@code DockingPorts} * are removed as well. * * @see DockingPort#clear() * @see #removeAll() */ public void clear() { removeAll(); } /** * Docks the specified component within the specified region. This method * attempts to resolve the {@code Dockable} associated with the specified * {@code Component} by invoking * {@code DockingManager.getDockable(Component comp)}. Processing is then * dispatched to {@code dock(Dockable dockable, String region)}. *

* If no {@code Dockable} is resolved for the specified {@code Component}, * then this method attempts to register the {@code Component} as a * {@code Dockable} automatically by calling * {@code DockingManager.registerDockable(Component comp)}. *

* If either {@code comp} or {@code region} region are {@code null}, then * this method returns {@code false}. Otherwise, this method returns a * boolean indicating the success of the docking operation based upon * {@code dock(Dockable dockable, String region)}. * * @param comp * the {@code Component} to be docked within this * {@code DockingPort} * @param region * the region within this {@code DockingPort} to dock the * specified {@code Component} * @return {@code true} if the docking operation was successful, * {@code false} otherwise. * @see DockingPort#dock(Component, String) * @see #dock(Dockable, String) * @see DockingManager#getDockable(Component) * @see DockingManager#registerDockable(Component) */ public boolean dock(Component comp, String region) { if (comp == null || region == null) return false; Dockable dockable = DockingManager.getDockable(comp); if (dockable == null) dockable = DockingManager.registerDockable(comp); return dock(dockable, region); } /** * Docks the specified {@code Dockable} within the specified region. The * {@code Component} used for docking is returned by calling * {@code getComponent()} on the specified {@code Dockable}. This method * returns {@code false} immediately if the specified {@code Dockable} is * {@code null} or if * {@code isDockingAllowed(Component comp, String region)} returns * {@code false}. *

* If this {@code DockingPort} is currently empty, then the {@code Dockable} * is docked into the {@code CENTER_REGION}, regardless of the supplied * {@code region} parameter's value. *

* If {@code isSingleTabAllowed()} returns {@code false} and the * {@code DockingPort} is emtpy, then the {@code Dockable} will be added * directly to the {@code DockingPort} and will take up all available space * within the {@code DockingPort}. In this case, subsequent calls to * {@code getDockedComponent()} will return the dockable {@code Component}. *

* If {@code isSingleTabAllowed()} returns {@code true} and the * {@code DockingPort} is emtpy, then a {@code JTabbedPane} will be added * directly to the {@code DockingPort} and will take up all available space * within the {@code DockingPort}. The dockable {@code Component} will be * added as a tab within the tabbed pane. In this case, subsequent calls to * {@code getDockedComponent()} will return the {@code JTabbedPane}. *

* If the {@code DockingPort} is not empty, and the specified region * is {@code CENTER_REGION}, then the dockable {@code Component} will be * added to the {@code JTabbedPane} returned by {@code getDockedComponent()}. * If this {@code DockingPort} only contained a single dockable * {@code Component} without a tabbed pane, then the currently docked * {@code Component} is removed, a {@code JTabbedPane} is created and added, * and both the old {@code Component} and the new one are added to the * {@code JTabbedPane}. In this case, subsequent calls to * {@code getDockedComponent()} will return the {@code JTabbedPane}. *

* If the {@code DockingPort} is not empty, and the specified region * is {@code NORTH_REGION}, {@code SOUTH_REGION}, {@code EAST_REGION}, or * {@code WEST_REGION}, then the currently docked {@code Component} is * removed and replaced with a {@code JSplitPane}. Two new * {@code DefaultDockingPorts} are created as sub-ports and are added to * each side of the {@code JSplitPane}. The previously docked * {@code Component} is docked to the CENTER_REGION of one of the sub-ports * and the new {@code Component} is added to the other. In this case, * subsequent calls to {@code getDockedComponent()} will return the * {@code JSplitPane}. In this fasion, the sub-ports will now be capable of * handling further sub-docking within the layout. *

* {@code JSplitPane} and sub-{@code DockingPort} creation are delegated to * the {@code DockingStrategy} returned by {@code getDockingStrategy()}. * Initial splitpane divider location is also controlled by this * {@code DockingStrategy}. * * @param dockable * the {@code Dockable} to be docked within this * {@code DockingPort} * @param region * the region within this {@code DockingPort} to dock the * specified {@code Dockable} * @return {@code true} if the docking operation was successful, * {@code false} otherwise. * @see DockingPort#dock(Dockable, String) * @see #isDockingAllowed(Component, String) * @see #getDockedComponent() * @see #getDockingStrategy() * @see DockingStrategy#createDockingPort(DockingPort) * @see DockingStrategy#createSplitPane(DockingPort, String) * @see DockingStrategy#getInitialDividerLocation(DockingPort, JSplitPane) * @see DockingStrategy#getDividerProportion(DockingPort, JSplitPane) */ public boolean dock(Dockable dockable, String region) { if (dockable == null) return false; Component comp = dockable.getComponent(); if (comp == null || !isDockingAllowed(comp, region)) return false; // can't dock the same component twice. This will also keep them from // moving CENTER to NORTH and that sort of thing, which would just be a // headache to manage anyway. Component docked = getDockedComponent(); if (comp == docked) return false; // if there is nothing currently in the docking port, then we can only // dock into the CENTER region. if (docked == null) region = CENTER_REGION; String tabTitle = DockingUtility.getTabText(dockable); COMPONENT_TITLES.put(comp, tabTitle); if (!isSingleTabAllowed() && docked == null) { setComponent(comp); evaluateDockingBorderStatus(); return true; } boolean success = CENTER_REGION.equals(region) ? dockInCenterRegion(comp) : dockInOuterRegion(comp, region); if (success) { evaluateDockingBorderStatus(); // if we docked in an outer region, then there is a new JSplitPane. // We'll want to divide it in half. this is done after // evaluateDockingBorderStatus(), so we'll know any border // modification that took place has already happened, and we can be // relatively safe about assumptions regarding our current insets. if (!CENTER_REGION.equals(region)) resetSplitDividerLocation(); } return success; } private void resetSplitDividerLocation() { Component c = getDockedComponent(); if (c instanceof JSplitPane) deferSplitDividerReset((JSplitPane) c); } private void deferSplitDividerReset(final JSplitPane splitPane) { applySplitDividerLocation(splitPane); // we don't need to defer split divider location reset until after // a DockingSplitPane has rendered, since that class is able to figure // out its proper divider location by itself. if (splitPane instanceof DockingSplitPane) { return; } // check to see if we've rendered int size = SwingUtility.getSplitPaneSize(splitPane); if (splitPane.isVisible() && size > 0 && EventQueue.isDispatchThread()) { // if so, apply the split divider location and return applySplitDividerLocation(splitPane); splitPane.validate(); return; } // otherwise, defer applying the divider location reset until // the split pane is rendered. EventQueue.invokeLater(new Runnable() { public void run() { deferSplitDividerReset(splitPane); } }); } private void applySplitDividerLocation(JSplitPane splitPane) { DockingStrategy strategy = DockingManager.getDockingStrategy(this); int loc = strategy.getInitialDividerLocation(this, splitPane); splitPane.setDividerLocation(loc); } private boolean dockInCenterRegion(Component comp) { Component docked = getDockedComponent(); JTabbedPane tabs = null; if (docked instanceof JTabbedPane) { tabs = (JTabbedPane) docked; addTab(tabs, comp); tabs.revalidate(); tabs.setSelectedIndex(tabs.getTabCount() - 1); return true; } tabs = createTabbedPane(); // createTabbedPane() is protected and may be overridden, so we'll have // to check for a possible null case here. Though why anyone would // return a null, I don't know. Maybe we should throw a // NullPointerException instead. if (tabs == null) return false; // remove the currently docked component and add it to the tabbed pane if (docked != null) { remove(docked); addTab(tabs, docked); } // add the new component to the tabbed pane addTab(tabs, comp); // now add the tabbed pane back to the main container setComponent(tabs); tabs.setSelectedIndex(tabs.getTabCount() - 1); return true; } private void addTab(JTabbedPane tabs, Component comp) { String tabText = getValidTabTitle(tabs, comp); tabs.add(comp, tabText); Dockable d = DockingManager.getDockable(comp); if (d == null) return; Icon icon = d.getDockingProperties().getTabIcon(); int indx = tabs.getTabCount() - 1; tabs.setIconAt(indx, icon); } private boolean dockInOuterRegion(Component comp, String region) { // cache the current size and cut it in half for later in the method. Dimension halfSize = getSize(); halfSize.width /= 2; halfSize.height /= 2; // remove the old docked content. we'll be adding it to another // dockingPort. Component docked = getDockedComponent(); remove(docked); // add the components to their new parents. DockingStrategy strategy = getDockingStrategy(); DockingPort oldContent = strategy.createDockingPort(this); DockingPort newContent = strategy.createDockingPort(this); addCmp(oldContent, docked); dockCmp(newContent, comp); JSplitPane newDockedContent = strategy.createSplitPane(this, region); // put the ports in the correct order and add them to a new wrapper // panel DockingPort[] ports = putPortsInOrder(oldContent, newContent, region); if (ports[0] instanceof JComponent) { ((JComponent) ports[0]).setMinimumSize(new Dimension(0, 0)); } if (ports[1] instanceof JComponent) { ((JComponent) ports[1]).setMinimumSize(new Dimension(0, 0)); } if (ports[0] instanceof Component) newDockedContent.setLeftComponent((Component) ports[0]); if (ports[1] instanceof Component) newDockedContent.setRightComponent((Component) ports[1]); // set the split in the middle double ratio = .5; if (docked instanceof Dockable && newDockedContent instanceof DockingSplitPane) { Float siblingRatio = ((Dockable) docked).getDockingProperties() .getSiblingSize(region); if (siblingRatio != null) { ratio = siblingRatio.doubleValue(); } ((DockingSplitPane) newDockedContent).setInitialDividerRatio(ratio); } newDockedContent.setDividerLocation(ratio); // now set the wrapper panel as the currently docked component setComponent(newDockedContent); // if we're currently showing, then we can exit now if (isShowing()) return true; // otherwise, we have unrealized components whose sizes cannot be // determined until after we're visible. cache the desired size // values now for use later during rendering. double proportion = strategy.getDividerProportion(this, newDockedContent); SwingUtility.putClientProperty((Component) oldContent, DefaultDockingStrategy.PREFERRED_PROPORTION, new Float( proportion)); SwingUtility.putClientProperty((Component) newContent, DefaultDockingStrategy.PREFERRED_PROPORTION, new Float( 1f - proportion)); return true; } /** * Returns the child {@code Component} currently embedded within with * {@code DockingPort}. If the {@code DockingPort} is empty, then this * method returns a {@code null} reference. If there is a single * {@code Dockable} docked within it with no tabbed layout, then the * {@code Component} for that {@code Dockable} is returned per its * {@code getComponent()} method. If there is a tabbed layout present, then * a {@code JTabbedPane} is returned. If there is a split layout present, * then a {@code JSplitPane} is returned. * * @see DockingPort#getDockedComponent() */ public Component getDockedComponent() { return dockedComponent; } // private JSplitPane getDockedSplitPane() { // Component docked = getDockedComponent(); // return docked instanceof JSplitPane? (JSplitPane)docked: null; // } /** * Returns a {@code String} identifier that is unique to * {@code DockingPorts} within a JVM instance, but persistent across JVM * instances. This is used for configuration mangement, allowing the JVM to * recognize a {@code DockingPort} instance within an application instance, * persist the ID, and recall it in later application instances. The ID * should be unique within an appliation instance so that there are no * collisions with other {@code DockingPort} instances, but it should also * be consistent from JVM to JVM so that the association between a * {@code DockingPort} instance and its ID can be remembered from session to * session. *

* The value returned by this method will come from the most recent call to * {@code setPersistentId(String id)}. If * {@code setPersistentId(String id)} was invoked with a {@code null} * argument, then the {@code String} verion of this {@code DockingPort's} * hash code is used. Therefore, this method will never return a * {@code null} reference. * * @return the persistent ID for this {@code DockingPort} * @see DockingPort#getPersistentId() * @see #setPersistentId(String) * @see DockingManager#getDockingPort(String) */ public String getPersistentId() { return persistentId; } /** * Sets the persisent ID to be used for this {@code DockingPort}. If * {@code id} is {@code null}, then the {@code String} value of this * {@code DockingPort's} hash code is used. *

* {@code DockingPorts} are tracked by persistent ID within * {@code DockingManager}. Whenever this method is called, the * {@code DockingManager's} tracking mechanism is automatically upated for * this {@code DockingPort}. * * @param id * the persistent ID to be used for this {@code DockingPort} * @see #getPersistentId() * @see DockingManager#getDockingPort(String) * @see DockingPortTracker#updateIndex(DockingPort) */ public void setPersistentId(String id) { if (id == null) { id = UUID.randomUUID().toString(); } persistentId = id; DockingPortTracker.updateIndex(this); } private String getValidTabTitle(JTabbedPane tabs, Component comp) { String title = (String) COMPONENT_TITLES.get(comp); if (title == null || title.trim().length() == 0) title = "null"; int tc = tabs.getTabCount(); int occurrances = 0; HashSet titles = new HashSet(); String tmp = null; for (int i = 0; i < tc; i++) { tmp = tabs.getTitleAt(i).toLowerCase(); titles.add(tmp); if (tmp.startsWith(title.toLowerCase())) occurrances++; } if (titles.contains(title) && occurrances > 0) title += occurrances; COMPONENT_TITLES.put(comp, title); return title; } /** * Returns {@code true} if single tabs are allowed within this * {@code DockingPort}, {@code false} otherwise. *

* Generally the tabbed interface does not appear until two or more * {@code Dockables} are docked to the {@code CENTER_REGION} of the * {@code DockingPort} and tabs are required to switch between them. When * there is only a single {@code Dockable} within the {@code DockingPort}, * the default behavior for the dockable {@code Component} to take up all of * the space within the {@code DockingPort}. *

* If this method returns {@code true}, then a single {@code Dockable} * within this {@code DockingPort} will reside within a tabbed layout that * contains only one tab. *

* The value returned by this method is a scoped property. This means there * may be many different "scopes" at which the single-tab property may be * set. For instance, a "global" setting may override the individual setting * for this {@code DockingPort}, and this {@code DockingPort's} particular * setting may override the global default setting. * {@code org.flexdock.docking.props.PropertyManager} should be referenced * for further information on scoped properties. * * @return {@code true} if single tabs are allowed within this * {@code DockingPort}, {@code false} otherwise. * @see #setSingleTabAllowed(boolean) * @see DockingManager#isSingleTabsAllowed() * @see DockingManager#setSingleTabsAllowed(boolean) * @see PropertyManager * @see DockingPortPropertySet#isSingleTabsAllowed() * @see DockingPortPropertySet#setSingleTabsAllowed(boolean) */ public boolean isSingleTabAllowed() { return getDockingProperties().isSingleTabsAllowed().booleanValue(); } /** * Sets the "single tab" property for this {@code DockingPort}, allowing or * disallowing a single {@code Dockable} within the {@code DockingPort} to * appear within a tabbed layout. *

* Generally the tabbed interface does not appear until two or more * {@code Dockables} are docked to the {@code CENTER_REGION} of the * {@code DockingPort} and tabs are required to switch between them. When * there is only a single {@code Dockable} within the {@code DockingPort}, * the default behavior for the dockable {@code Component} to take up all of * the space within the {@code DockingPort}. *

* If the single tab property is set to {@code true}, then a single * {@code Dockable} within this {@code DockingPort} will reside within a * tabbed layout that contains only one tab. *

* The single tab property is a scoped property. This means there may be * many different "scopes" at which the single-tab property may be set. For * instance, a "global" setting may override the individual setting for this * {@code DockingPort}, and this {@code DockingPort's} particular setting * may override the global default setting. This method applied a value * only to the local scope for this particular {@code DockingPort}. * {@code org.flexdock.docking.props.PropertyManager} should be referenced * for further information on scoped properties. * * @param allowed * {@code true} if a single-tabbed layout should be allowed, * {@code false} otherwise * @see #isSingleTabAllowed() * @see DockingManager#setSingleTabsAllowed(boolean) * @see DockingManager#isSingleTabsAllowed() * @see PropertyManager * @see DockingPortPropertySet#setSingleTabsAllowed(boolean) * @see DockingPortPropertySet#isSingleTabsAllowed() */ public void setSingleTabAllowed(boolean allowed) { getDockingProperties().setSingleTabsAllowed(allowed); } /** * Indicates whether or not the specified component is docked somewhere * within this {@code DefaultDockingPort}. This method returns {@code true} * if the specified {@code Component} is a direct child of the * {@code DefaultDockingPort} or is a direct child of a {@code JTabbedPane} * or {@code JSplitPane}that is currently the {@code DefaultDockingPort's}docked * component. Otherwise, this method returns {@code false}. If {@code comp} * is {@code null}, then then this method return {@code false} * * @param comp * the Component to be tested. * @return a boolean indicating whether or not the specified component is * docked somewhere within this {@code DefaultDockingPort}. * @see DockingPort#isParentDockingPort(java.awt.Component) * @see Component#getParent() * @see #getDockedComponent() */ public boolean isParentDockingPort(Component comp) { if (comp == null) return false; Container parent = comp.getParent(); // if the component has no parent, then it can't be docked within us if (parent == null) return false; // if we're the direct parent of this component, then we're the parent // docking port if (parent == this) return true; // if the component is directly inside our docked component, then we're // also considered its parent dockingPort return parent == getDockedComponent(); } protected boolean isValidDockingRegion(String region) { return DockingManager.isValidDockingRegion(region); } private boolean isSingleComponentDocked() { Component c = getDockedComponent(); // we have no docked component if (c == null) return false; // we do have a docked component. It'll be a splitpane, a tabbedpane, // or something else. // if it's a splitpane, then we definitely have more than one component // docked if (c instanceof JSplitPane) return false; // if it's a tabbed pane, then check the number of tabs on the pane if (c instanceof JTabbedPane) { return ((JTabbedPane) c).getTabCount() == 1; } // splitpane and tabbed pane are the only two subcontainers that signify // more than one docked component. if neither, then we only have one // component docked. return true; } protected Dockable getCenterDockable() { // can't have a CENTER dockable if there's nothing in the center if (!isSingleComponentDocked()) return null; // get the component in the CENTER Component c = getDockedComponent(); if (c instanceof JTabbedPane) { // if in a tabbed pane, get the first component in there. // (there will only be 1, since we've already passed the // isSingleComponentDocked() test) c = ((JTabbedPane) c).getComponent(0); } // return the Dockable instance associated with this component return DockingManager.getDockable(c); } private DockingPort[] putPortsInOrder(DockingPort oldPort, DockingPort newPort, String region) { if (NORTH_REGION.equals(region) || WEST_REGION.equals(region)) return new DockingPort[] { newPort, oldPort }; return new DockingPort[] { oldPort, newPort }; } /** * This method completes with a call to * {@code evaluateDockingBorderStatus()} to allow any installed * {@code DefaultDockingStrategy} to handle container-state-related * behavior. */ private void reevaluateContainerTree() { reevaluateDockingWrapper(); reevaluateTabbedPane(); evaluateDockingBorderStatus(); } private void reevaluateDockingWrapper() { Component docked = getDockedComponent(); Container parent = getParent(); Container grandParent = parent == null ? null : parent.getParent(); // added grandparent check up here so we will be able to legally embed a // DefaultDockingPort within a plain JSplitPane without triggering an // unnecessary remove() if (docked == null && parent instanceof JSplitPane && grandParent instanceof DefaultDockingPort) { // in this case, the docked component has disappeared (removed) and // our parent component is a wrapper for us and our child so that we // can share the root docking port with another component. since our // child is gone, there's no point in our being here anymore and our // sibling component shouldn't have to share screen real estate with // us anymore. we'll remove ourselves and notify the root docking // port that the component tree has been modified. parent.remove(this); ((DefaultDockingPort) grandParent).reevaluateContainerTree(); // LABEL // 1 } else if (docked instanceof JSplitPane) { // in this case, we're the parent of a docking wrapper. this implies // that we're splitting our real estate between two components. (in // practice, we're actually the parent that was called above at // LABEL // 1). JSplitPane wrapper = (JSplitPane) docked; Component left = wrapper.getLeftComponent(); Component right = wrapper.getRightComponent(); // first, check to make sure we do in fact have 2 components. if so, // then we don't have // to go any further. if (left != null && right != null) return; // check to see if we have zero components. if so, remove everything // and return. if (left == right) { removeAll(); return; } // if we got here, then one of our components has been removed (i.e. // LABEL 1). In this // case, we want to pull the remaining content out of its // split-wrapper and add it // as a direct child to ourselves. Component comp = left == null ? right : left; wrapper.remove(comp); // do some cleanup on the wrapper before removing it if (wrapper instanceof DockingSplitPane) { ((DockingSplitPane) wrapper).cleanup(); } super.remove(wrapper); if (comp instanceof DefaultDockingPort) comp = ((DefaultDockingPort) comp).getDockedComponent(); if (comp != null) setComponent(comp); } } private void reevaluateTabbedPane() { Component docked = getDockedComponent(); if (!(docked instanceof JTabbedPane)) return; JTabbedPane tabs = (JTabbedPane) docked; int tabCount = tabs.getTabCount(); // we don't have to do anything special here if there is more than the // minimum number of allowable tabs int minTabs = isSingleTabAllowed() ? 0 : 1; if (tabCount > minTabs) { return; } // otherwise, pull out the component in the remaining tab (if it // exists), and add it to ourselves as a direct child (ditching the // JTabbedPane). Component comp = tabCount == 1 ? tabs.getComponentAt(0) : null; removeAll(); if (comp != null) setComponent(comp); Container parent = getParent(); Container grandParent = parent == null ? null : parent.getParent(); // if our TabbedPane's last component was removed, then the TabbedPane // itself has now been removed. if we're a child port within a // JSplitPane // within another DockingPort, then we ourselved need to be removed from // the component tree, since we don't have any content. if (comp == null && parent instanceof JSplitPane && grandParent instanceof DefaultDockingPort) { parent.remove(this); ((DefaultDockingPort) grandParent).reevaluateContainerTree(); } } /** * Overridden to decorate superclass method, keeping track of internal * docked-component reference. * * @param index * the index of the component to be removed. * @see Container#remove(int) */ public void remove(int index) { Component docked = getDockedComponent(); Component comp = getComponent(index); super.remove(index); if (docked == comp) dockedComponent = null; } /** * Overridden to decorate superclass method, keeping track of internal * docked-component reference. * * @see Container#removeAll() */ public void removeAll() { super.removeAll(); dockedComponent = null; } /** * Sets the currently installed {@code BorderManager}. This method provides * a means of customizing border managment following any successful call to * {@code dock(Dockable dockable, String region)} or * {@code undock(Component comp)}, allowing cleanup of borders for nested * {@code Components} within the docking layout. {@code null} values are * allowed. * * @param mgr * the {@code BorderManager} assigned to to manage docked * component borders. * @see #getBorderManager() * @see BorderManager */ public void setBorderManager(BorderManager mgr) { borderManager = mgr; } /** * Returns the currently intalled {@code BorderManager}. The * {@code BorderManager} is used any time a successful call to * {@code dock(Dockable dockable, String region)} or * {@code undock(Component comp)} has been issued to clean up borders for * nested {@code Components} within the docking layout. This method will * return a {@code null} reference if there is no {@code BorderManager} * installed. * * @return the currently installed {@code BorderManager}. * @see #setBorderManager(BorderManager) * @see BorderManager */ public BorderManager getBorderManager() { return borderManager; } private Component setComponent(Component c) { if (getDockedComponent() != null) removeAll(); dockedComponent = c; Component ret = super.add(dockedComponent); // calling doLayout here to properly set the component's size // validate throws an error doLayout(); return ret; } /** * Undocks the specified {@code Component} and returns a boolean indicating * the success of the operation. *

* Since {@code DefaultDockingPort} may only contain one child component, * there i s a container hierarchy to manage tabbed interfaces, split * layouts, and sub-docking. As components are removed from this hierarchy, * the hierarchy itself must be reevaluated. Removing a component from a * child code>DefaultDockingPort} within a {@code JSplitPane} renders the * child {@code DefaultDockingPort} unnecessary, which, in turn, renders the * notion of splitting the layout with a {@code JSplitPane} unnecessary * (since there are no longer two components to split the layout between). * Likewise, removing a child component from a {@code JTabbedPane} such that * there is only one child left within the {@code JTabbedPane} removes the * need for a tabbed interface to begin with. *

* This method automatically handles the reevaluation of the container * hierarchy to keep wrapper-container usage at a minimum. Since * {@code DockingManager} makes this callback automatic, developers normally * will not need to call this method explicitly. However, when removing a * component from a {@code DefaultDockingPort} using application code, * developers should keep in mind to use this method instead of * {@code remove()}. * * @param comp * the {@code Component} to be undocked. * @return a boolean indicating the success of the operation * @see DockingPort#undock(Component comp) * @see DockingManager#undock(Dockable) */ public boolean undock(Component comp) { // can't undock a component that isn't already docked within us if (!isParentDockingPort(comp)) return false; // remove the component comp.getParent().remove(comp); // reevaluate the container tree. reevaluateContainerTree(); return true; } /** * Returns all {@code Dockables} docked within this {@code DockingPort} and * all sub-{@code DockingPorts}. The returned {@code Set} will contain * {@code Dockable} instances. If there are no {@code Dockables} present, an * empty {@code Set} will be returned. This method will never return a * {@code null} reference. * * @return all {@code Dockables} docked within this {@code DockingPort} and * all sub-{@code DockingPorts}. * @see DockingPort#getDockables() */ public Set getDockables() { // return ALL dockables, recursing to maximum depth return getDockableSet(-1, 0, null); } protected Set getDockableSet(int depth, int level, Class desiredClass) { Component c = getDockedComponent(); if (c instanceof JTabbedPane) { JTabbedPane tabs = (JTabbedPane) c; int len = tabs.getTabCount(); HashSet set = new HashSet(len); for (int i = 0; i < len; i++) { c = tabs.getComponentAt(i); if (isValidDockableChild(c, desiredClass)) { if (c instanceof Dockable) set.add(c); else set.add(DockingManager.getDockable(c)); } } return set; } HashSet set = new HashSet(1); // if we have a split-layout, then we need to decide whether to get the // child viewSets. If 'depth' is less then zero, then it's implied we // want to recurse to get ALL child viewsets no matter how deep. If // 'depth' is greater than or equal to zero, we only want to go as deep // as the specified depth. if (c instanceof JSplitPane && (depth < 0 || level <= depth)) { JSplitPane pane = (JSplitPane) c; Component sub1 = pane.getLeftComponent(); Component sub2 = pane.getRightComponent(); if (sub1 instanceof DefaultDockingPort) set.addAll(((DefaultDockingPort) sub1).getDockableSet(depth, level + 1, desiredClass)); if (sub2 instanceof DefaultDockingPort) set.addAll(((DefaultDockingPort) sub2).getDockableSet(depth, level + 1, desiredClass)); } if (isValidDockableChild(c, desiredClass)) { if (c instanceof Dockable) set.add(c); else set.add(DockingManager.getDockable(c)); } return set; } protected boolean isValidDockableChild(Component c, Class desiredClass) { return desiredClass == null ? DockingManager.getDockable(c) != null : desiredClass.isAssignableFrom(c.getClass()); } /** * Adds a {@code DockingListener} to observe docking events for this * {@code DockingPort}. {@code null} arguments are ignored. * * @param listener * the {@code DockingListener} to add to this {@code DockingPort}. * @see DockingMonitor#addDockingListener(DockingListener) * @see #getDockingListeners() * @see #removeDockingListener(DockingListener) */ public void addDockingListener(DockingListener listener) { if (listener != null) dockingListeners.add(listener); } /** * Returns an array of all {@code DockingListeners} added to this * {@code DockingPort}. If there are no listeners present for this * {@code DockingPort}, then a zero-length array is returned. * * @return an array of all {@code DockingListeners} added to this * {@code DockingPort}. * @see DockingMonitor#getDockingListeners() * @see #addDockingListener(DockingListener) * @see #removeDockingListener(DockingListener) */ public DockingListener[] getDockingListeners() { return (DockingListener[]) dockingListeners .toArray(new DockingListener[0]); } /** * Removes the specified {@code DockingListener} from this * {@code DockingPort}. If the specified {@code DockingListener} is * {@code null}, or the listener has not previously been added to this * {@code DockingPort}, then no {@code Exception} is thrown and no action * is taken. * * @param listener * the {@code DockingListener} to remove from this * {@code DockingPort} * @see DockingMonitor#removeDockingListener(DockingListener) * @see #addDockingListener(DockingListener) * @see #getDockingListeners() */ public void removeDockingListener(DockingListener listener) { if (listener != null) dockingListeners.remove(listener); } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#dockingCanceled(DockingEvent) */ public void dockingCanceled(DockingEvent evt) { } /** * Requests activation for the newly docked Dockable. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#dockingComplete(DockingEvent) */ public void dockingComplete(DockingEvent evt) { Dockable dockable = evt.getDockable(); if (dockable == null || !isShowing() || evt.getNewDockingPort() != this) return; ActiveDockableTracker .requestDockableActivation(dockable.getComponent()); } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#dragStarted(DockingEvent) */ public void dragStarted(DockingEvent evt) { } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#dropStarted(DockingEvent) */ public void dropStarted(DockingEvent evt) { } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#undockingComplete(DockingEvent) */ public void undockingComplete(DockingEvent evt) { } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#undockingStarted(DockingEvent) */ public void undockingStarted(DockingEvent evt) { } /** * Returns a {@code DockingPortPropertySet} instance associated with this * {@code DockingPort}. This method returns the default implementation * supplied by the framework by invoking * {@code getDockingPortPropertySet(DockingPort port)} on * {@code org.flexdock.docking.props.PropertyManager} and supplying an * argument of {@code this}. * * @return the {@code DockingPortPropertySet} associated with this * {@code DockingPort}. This method will not return a {@code null} * reference. * @see DockingPortPropertySet * @see DockingPort#getDockingProperties() * @see org.flexdock.docking.props.PropertyManager#getDockingPortPropertySet(DockingPort) */ public DockingPortPropertySet getDockingProperties() { return PropertyManager.getDockingPortPropertySet(this); } /** * Enables or disables drag support for docking operations on the tabs used * within an embedded tabbed layout. If tab-drag-source is enabled, then the * tab that corresponds to a {@code Dockable} within an embedded tabbed * layout will respond to drag events as if the tab were a component * included within the {@code List} returned by calling * {@code getDragSources()} on the {@code Dockable}. This allows dragging a * tab to initiate drag-to-dock operations. * * @param enabled * {@code true} if drag-to-dock support should be enabled for * tabs and their associated {@code Dockables}, {@code false} * otherwise. * @see #isTabsAsDragSource() * @see Dockable#getDragSources() */ public void setTabsAsDragSource(boolean enabled) { tabsAsDragSource = enabled; } /** * Returns {@code true} if drag-to-dock support is enabled for tabs and * their associated {@code Dockables}, {@code false} otherwise. If * tab-drag-source is enabled, then the tab that corresponds to a * {@code Dockable} within an embedded tabbed layout will respond to drag * events as if the tab were a component included within the {@code List} * returned by calling {@code getDragSources()} on the {@code Dockable}. * This allows dragging a tab to initiate drag-to-dock operations. * * @return {@code true} if drag-to-dock support is enabled for tabs and * their associated {@code Dockables}, {@code false} otherwise. * @see #setTabsAsDragSource(boolean) * @see Dockable#getDragSources() */ public boolean isTabsAsDragSource() { return tabsAsDragSource; } protected int getInitTabPlacement() { return getDockingProperties().getTabPlacement().intValue(); } /** * Returns a boolean indicating whether or not this {@code DockingPort} is * nested within another {@code DockingPort}. If there are no other * {@code DockingPorts} within this {@code DockingPort's} container ancestor * hierarchy, then this method will return {@code true}. Otherwise, this * method will return {@code false}. If the this {@code DockingPort} is not * validated and/or is not part of a container hierarchy, this method should * return {@code true}. * * @return {@code false} if this {@code DockingPort} is nested within * another {@code DockingPort}, {@code true} otherwise. * @see DockingPort#isRoot() */ public boolean isRoot() { return rootPort; } /** * This method is used internally by the framework to notify * {@code DefaultDockingPorts} whether they are "root" {@code DockingPorts} * according to the rules specified by {@code isRoot()} on the * {@code DockingPort} interface. This method should not be called by * application-level developers. It will most likely be removed in * future versions and the logic contained herein will be managed by some * type of change listener. * * @param root * {@code true} if this is a "root" {@code DockingPort}, * {@code false} otherwise. * @see #isRoot() * @see DockingPort#isRoot() */ public void setRoot(boolean root) { this.rootPort = root; } /** * This method is used internally by the framework to notify * {@code DefaultDockingPorts} whether a drag operation is or is not * currently in progress and should not be called by application-level * developers. It will most likely be removed in future versions and the * logic contained herein will be managed by some type of change listener. * * @param inProgress * {@code true} if a drag operation involving this * {@code DockingPort} is currently in progress, {@code false} * otherwise. */ public void setDragInProgress(boolean inProgress) { if (inProgress && dragImage != null) return; if (!inProgress && dragImage == null) return; if (inProgress) { dragImage = SwingUtility.createImage(this); } else { dragImage = null; } repaint(); } /** * Overridden to provide enhancements during drag operations. Some * {@code DragPreview} implementations may by able to supply a * {@code BufferedImage} for this {@code DockingPort} to use for painting * operations. This may be useful for cases in which the dimensions of * docked {@code Components} are altered in realtime during the drag * operation to provide a "ghost" image for the {@code DragPreview}. In * this case, visual feedback for altered subcomponents within this * {@code DockingPort} may be blocked in favor of a temporary * {@code BufferedImage} for the life of the drag operation. * * @param g * the {@code Graphics} context in which to paint * @see JComponent#paint(java.awt.Graphics) */ public void paint(Graphics g) { if (dragImage == null) { super.paint(g); return; } g.drawImage(dragImage, 0, 0, this); } /** * Returns a {@code LayoutNode} containing metadata that describes the * current layout contained within this {@code DefaultDockingPort}. The * {@code LayoutNode} returned by this method will be a * {@code DockingPortNode} that constitutes the root of a tree structure * containing various {@code DockingNode} implementations; specifically * {@code SplitNode}, {@code DockableNode}, and {@code DockingPortNode}. * Each of these nodes is {@code Serializable}, implying the * {@code LayoutNode} itself may be written to external storage and later * reloaded into this {@code DockingPort} via * {@code importLayout(LayoutNode node)}. * * @return a {@code LayoutNode} representing the current layout state within * this {@code DockingPort} * @see DockingPort#importLayout(LayoutNode) * @see #importLayout(LayoutNode) * @see org.flexdock.docking.state.LayoutManager#createLayout(DockingPort) * @see LayoutNode * @see org.flexdock.docking.state.tree.DockingNode * @see DockingPortNode * @see SplitNode * @see DockableNode */ public LayoutNode exportLayout() { return DockingManager.getLayoutManager().createLayout(this); } /** * Clears out the existing layout within this {@code DockingPort} and * reconstructs a new layout based upon the specified {@code LayoutNode}. *

* At present, this method can only handle {@code LayoutNodes} that have * been generated by {@code DefaultDockingPort's} {@code exportLayout()} * method. If the specified {@code LayoutNode} is {@code null} or is * otherwise not an instance of {@code DockingPortNode}, then this * method returns immediately with no action taken. *

* Otherwise, the necessary {@code Dockables} are docked within this * {@code DockingPort} and all subsequently generated sub-{@code DockingPorts} * in a visual configuration mandated by the tree structure modeled by the * specified {@code LayoutNode}. * * @param node * the {@code LayoutNode} whose layout is to be instantiated * within this {@code DockingPort} * @see DockingPort#importLayout(LayoutNode) * @see #exportLayout() * @see LayoutNode * @see org.flexdock.docking.state.tree.DockingNode * @see DockingPortNode * @see SplitNode * @see DockableNode */ public void importLayout(LayoutNode node) { if (!(node instanceof DockingPortNode)) return; node.setUserObject(this); ArrayList splitPaneResizeList = new ArrayList(); constructLayout(node, splitPaneResizeList); deferSplitPaneValidation(splitPaneResizeList); revalidate(); } private void constructLayout(LayoutNode node, ArrayList splitPaneResizeList) { // load the user object. this object isn't used here, but // LayoutNode should have a lazy-load mechanism for loading of // userObject at runtime. we just want to make sure the userObject has // been loaded before we proceed. Object obj = node.getUserObject(); if (node instanceof SplitNode) splitPaneResizeList.add(node); for (Enumeration en = node.children(); en.hasMoreElements();) { LayoutNode child = (LayoutNode) en.nextElement(); constructLayout(child, splitPaneResizeList); } if (node instanceof SplitNode) reconstruct((SplitNode) node); else if (node instanceof DockingPortNode) reconstruct((DockingPortNode) node); } private void reconstruct(DockingPortNode node) { DefaultDockingPort port = (DefaultDockingPort) node.getDockingPort(); if (node.isSplit()) { SplitNode child = (SplitNode) node.getChildAt(0); JSplitPane split = child.getSplitPane(); // float percentage = child.getPercentage(); port.setComponent(split); port.evaluateDockingBorderStatus(); return; } for (Enumeration en = node.children(); en.hasMoreElements();) { LayoutNode child = (LayoutNode) en.nextElement(); if (child instanceof DockableNode) { Dockable dockable = ((DockableNode) child).getDockable(); port.dock(dockable, CENTER_REGION); } } } private void reconstruct(SplitNode node) { JSplitPane split = node.getSplitPane(); Component left = node.getLeftComponent(); Component right = node.getRightComponent(); split.setLeftComponent(left); split.setRightComponent(right); } private void deferSplitPaneValidation(final ArrayList splitNodes) { // TODO: I (calixte) deactivated the timer since the border has already been fixed in reconstuct() and // the divider location has been set in SplitNode. That avoids to have a resize of the splits when // splits are visible. // So this method is probably useless... wait for a user feedback. if (false && timer == null) { timer = new Timer(15, new ActionListener() { public void actionPerformed(ActionEvent e) { Runnable r = new Runnable() { public void run() { synchronized (lock) { if (timer != null) { processImportedSplitPaneValidation(splitNodes); } } } }; EventQueue.invokeLater(r); } }); timer.setRepeats(true); timer.start(); } } private void processImportedSplitPaneValidation(ArrayList splitNodes) { synchronized (lock) { int len = splitNodes.size(); if (len == 0) { timer.stop(); timer = null; return; } // first, check to see if we're ready for rendering SplitNode node = (SplitNode) splitNodes.get(0); JSplitPane split = node.getSplitPane(); int size = split.getOrientation() == JSplitPane.HORIZONTAL_SPLIT ? split.getWidth() : split.getHeight(); // if we're not ready to render, then defer processing again until later if (!split.isValid() || size == 0) { // try to validate first if (!split.isValid()) split.validate(); // now redispatch return; } timer.stop(); timer = null; // if we're ready to render, then loop through all the splitNodes and // set the split dividers to their appropriate locations. for (int i = 0; i < len; i++) { node = (SplitNode) splitNodes.get(i); split = node.getSplitPane(); size = split.getOrientation() == JSplitPane.HORIZONTAL_SPLIT ? split.getWidth() : split.getHeight(); float percent = node.getPercentage(); split.setDividerLocation(percent); // make sure to invoke the installed BorderManager how that we have // a hierarchy of DockingPorts. otherwise, we may end up with some // ugly nested borders. DockingPort port = DockingUtility.getParentDockingPort(split); if (port instanceof DefaultDockingPort) { ((DefaultDockingPort) port).evaluateDockingBorderStatus(); } split.validate(); } } } // --- maximization // remember information to restore state after maximized dockable has left // us again private MaximizationInstallInfo maximizationInstallInfo; public void installMaximizedDockable(Dockable dockable) { if (maximizationInstallInfo != null) { throw new IllegalStateException("Already maximized"); } maximizationInstallInfo = new MaximizationInstallInfo( getDockedComponent(), getBorder()); Component newComponent = dockable.getComponent(); setComponent(newComponent); evaluateDockingBorderStatus(); revalidate(); } public void uninstallMaximizedDockable() { if (maximizationInstallInfo == null) { throw new IllegalStateException("No dockable maximized."); } setComponent(maximizationInstallInfo.getContent()); setBorder(maximizationInstallInfo.getBorder()); maximizationInstallInfo = null; revalidate(); } // remember necessary information to restore state after maximized dockable // returns private MaximizationReleaseInfo maximizationReleaseInfo; public void releaseForMaximization(Dockable dockable) { if (maximizationReleaseInfo != null) { throw new IllegalStateException( "Already released a Dockable for maximization."); } Component comp = dockable.getComponent(); Border border = null; if (comp instanceof JComponent) { border = ((JComponent) comp).getBorder(); } maximizationReleaseInfo = new MaximizationReleaseInfo(comp, border); Component docked = getDockedComponent(); if (docked == null) { throw new IllegalStateException("DefaultDockingPort is empty."); } else if (docked instanceof JSplitPane) { // this should never happen since in that case this DockingPort // can't // be the direct parent of any dockable requesting maximization throw new IllegalStateException( "DefaultDockingPort does not directly contain a Dockable"); } else if (docked instanceof JTabbedPane) { // this is the tricky case, we have to store layout of tabbed pane // to restore later JTabbedPane tabs = (JTabbedPane) docked; maximizationReleaseInfo.setTabIndex(getTabIndex(tabs, comp)); tabs.remove(comp); } else { // check if our component is the one that requested maximization if (comp != docked) { throw new IllegalStateException( "Dockable requesting maximization is not the one docked in this DefaultDockingPort."); } remove(comp); } } private int getTabIndex(JTabbedPane tabs, Component comp) { int tabCount = tabs.getTabCount(); for (int i = 0; i < tabCount; i++) { if (tabs.getComponentAt(i) == comp) { return i; } } return -1; } public void returnFromMaximization() { Component comp = maximizationReleaseInfo.getContent(); if (comp instanceof JComponent) { ((JComponent) comp).setBorder(maximizationReleaseInfo.getBorder()); } int tabIndex = maximizationReleaseInfo.getTabIndex(); maximizationReleaseInfo = null; Component docked = getDockedComponent(); if (docked != null && docked instanceof JTabbedPane) { // return dockable to its original (TODO) position in the // JTabbedPane JTabbedPane tabs = (JTabbedPane) docked; tabs.add(comp, getValidTabTitle(tabs, comp), tabIndex); tabs.setSelectedIndex(tabIndex); } else { // return dockable as direct child setComponent(comp); } revalidate(); } private static class MaximizationInstallInfo { private final Component content; private final Border border; public MaximizationInstallInfo(Component content, Border border) { this.content = content; this.border = border; } public Border getBorder() { return border; } public Component getContent() { return content; } } private static class MaximizationReleaseInfo extends MaximizationInstallInfo { private int tabIndex; public MaximizationReleaseInfo(Component content, Border border) { super(content, border); } public int getTabIndex() { return tabIndex; } public void setTabIndex(int tabIndex) { this.tabIndex = tabIndex; } } } flexdock-1.2.4/src/java/core/org/flexdock/docking/defaults/DefaultDockingStrategy.java0000644000175000017500000012770712177715062031751 0ustar sylvestresylvestre/* * Created on Mar 14, 2005 */ package org.flexdock.docking.defaults; import java.awt.Component; import java.awt.Container; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Map; import javax.swing.JSplitPane; import javax.swing.SwingUtilities; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.DockingStrategy; import org.flexdock.docking.RegionChecker; import org.flexdock.docking.defaults.DockingSplitPane; import org.flexdock.docking.drag.DragManager; import org.flexdock.docking.drag.DragOperation; import org.flexdock.docking.event.DockingEvent; import org.flexdock.docking.floating.frames.DockingFrame; import org.flexdock.docking.floating.frames.FloatingDockingPort; import org.flexdock.docking.props.DockablePropertySet; import org.flexdock.docking.state.FloatManager; import org.flexdock.event.EventManager; import org.flexdock.util.DockingUtility; import org.flexdock.util.RootWindow; import org.flexdock.util.SwingUtility; /** * @author Christopher Butler */ public class DefaultDockingStrategy implements DockingStrategy, DockingConstants { public static final String PREFERRED_PROPORTION = "DefaultDockingStrategy.PREFERRED_PROPORTION"; private static double defaultResizeWeight = -1; private static boolean constantPercent; /** * Returns the specified {@code Dockable's} sibling {@code Dockable} within * the current docking layout. This method checks the parent * {@code DockingPort} of a given {@code Dockable} to see if it is split * equally with another {@code Dockable}. If so, the immediate sibling * {@code Dockable} is returned. If there are more than two * {@code Dockables} within the split layout, then the closest sibling * region is determined and this method dispatches to * {@code getSibling(Dockable dockable, String region)}. *

* If the specified {@code Dockable} is {@code null}, or there are no * siblings available in the docking layout, then this methdo returns a * {@code null} reference. If the specified {@code Dockable} is not * currently docked within a {@code DockingPort}, then this method returns * a {@code null} reference. * * @param dockable * the {@code Dockable} whose sibling is to be returned * @return the sibling of the specified {@code Dockable} within the current * docking layout. * @see Dockable#getDockingPort() * @see #getSibling(Dockable, String) */ public static Dockable getSibling(Dockable dockable) { if (dockable == null) return null; DockingPort port = dockable.getDockingPort(); String startRegion = findRegion(dockable.getComponent()); String region = DockingUtility.flipRegion(startRegion); Dockable sibling = findDockable(port, dockable.getComponent(), region, startRegion); return sibling; } /** * Returns the sibling {@code Dockable} relative to the specified * {@code Dockable's} supplied region in the current docking layout. If * {@code dockable} is {@code null} or {@code region} is either invalid or * equal to {@code CENTER_REGION}, then this method returns a {@code null} * reference. *

* If the specified {@code Dockable} is in a {@code DockingPort} that * equally splits the layout between two {@code Dockables} in a fashion that * matches up with the specified region, then the immediate sibling * {@code Dockable} is returned. Otherwise, a fuzzy search is performed * throughout the docking layout for a {@code Dockable} that "looks like" it * is docked to the supplied region of the specified {@code Dockable} from a * visual standpoint. *

* For instance, a docking layout may consist of four quadrants Dockable1 * (top-left), Dockable2 (top-right), Dockable3 * (bottom-left) and Dockable4 (bottom-right). The layout is built * by docking Dockable2>/i> to the {@code EAST_REGION} of Dockable1, * Dockable3 to the {@code SOUTH_REGION} of Dockable1, and * Dockable4 to the {@code SOUTH_REGION} of Dockable2. * Within this layout, Dockable1 and Dockable3 are immediate * siblings, as are Dockable2 and Dockable4. Thus, * requesting sibling NORTH_REGION of Dockable3 will easily yield * Dockable1. However, Dockable3 has no immediate * {@code EAST_REGION} sibling. In this case, a fuzzy search through the * layout is performed to determine the visual sibling, and this method * returns Dockable4. Likewise, this method will return a * {@code null} reference for the {@code WEST_REGION} sibling of * Dockable3}, since there are no {@code Dockables} in the visual layout * to the west of this {@code Dockable}. * * @param dockable * the {@code Dockable} whose sibling is to be returned * @param region * the region of the specified {@code Dockable} whose visual * sibling is to be returned * @return the {@code Dockable} in the supplied region relative to the * specified {@code Dockable} */ public static Dockable getSibling(Dockable dockable, String region) { if (dockable == null || !DockingManager.isValidDockingRegion(region) || CENTER_REGION.equals(region)) return null; DockingPort port = dockable.getDockingPort(); String startRegion = findRegion(dockable.getComponent()); Dockable sibling = findDockable(port, dockable.getComponent(), region, startRegion); return sibling; } private static Dockable findDockable(DockingPort port, Component self, String region, String startRegion) { if (port == null) return null; Component docked = port.getDockedComponent(); // if we're not a split port, then there is no concept of 'outer // regions'. // jump up a level to find the parent split port if (!(docked instanceof JSplitPane)) { DockingPort superPort = DockingManager .getDockingPort((Component) port); return findDockable(superPort, self, region, startRegion); } Component sibling = port.getComponent(region); if (sibling == self) { if (!(self instanceof JSplitPane)) { DockingPort superPort = DockingManager .getDockingPort((Component) port); return findDockable(superPort, self, region, startRegion); } return null; } if (sibling instanceof JSplitPane) { // go one level deeper DockingPort subPort = DockingManager.getDockingPort(sibling); Component other = port.getComponent(DockingUtility .flipRegion(region)); String subRegion = findSubRegion((JSplitPane) sibling, other, region, startRegion); return findDockable(subPort, self, subRegion, startRegion); } // if we have no direct sibling in the specified region, the jump // up a level. if (sibling == null) { DockingPort superPort = DockingManager .getDockingPort((Component) port); self = port.getDockedComponent(); return findDockable(superPort, self, region, startRegion); } return DockingManager.getDockable(sibling); } private static String findSubRegion(JSplitPane split, Component other, String targetRegion, String baseRegion) { String region = DockingUtility.translateRegionAxis(split, targetRegion); if (!(other instanceof JSplitPane)) return region; boolean translated = !targetRegion.equals(region); if (translated && !DockingUtility.isAxisEquivalent(region, baseRegion)) { region = DockingUtility.flipRegion(region); } return region; } /** * Returns the docking region within the current split docking layout * containing the specified {@code Component}. If {@code comp} is * {@code null}, then a {@code null} reference is returned. If {@code comp} * is not in a split layout, then {@code CENTER_REGION} is returned. *

* This method resolves the associated {@code Dockable} and * {@code DockingPort} for the specified {@code Component} and backtracks * through the docking layout to find a split layout. If a split layout is * found, then the region retured by this method is calculated relative to * its sibling in the layout. * * @param comp * the {@code Component} whose region is to be returned * @return the region of the current split layout containing the specified * {@code Dockable} */ public static String findRegion(Component comp) { if (comp == null) return null; DockingPort port = DockingManager.getDockingPort(comp); Component docked = port.getDockedComponent(); if (!(docked instanceof JSplitPane)) { // we didn't find a split pane, to check the grandparent dockingport DockingPort superPort = DockingManager .getDockingPort((Component) port); // if there was no grandparent DockingPort, then we're stuck with // the docked // component we already found. this can happen on the root // dockingport. docked = superPort == null ? docked : superPort .getDockedComponent(); } if (!(docked instanceof JSplitPane)) return CENTER_REGION; JSplitPane split = (JSplitPane) docked; boolean horiz = split.getOrientation() == JSplitPane.HORIZONTAL_SPLIT; Component left = split.getLeftComponent(); if (left == port) { return horiz ? WEST_REGION : NORTH_REGION; } return horiz ? EAST_REGION : SOUTH_REGION; } /** * Docks the specified {@code Dockable} into the supplied {@code region} of * the specified {@code DockingPort}. This method is meant for programmatic * docking, as opposed to realtime, event-based docking operations. As such, * it defers processing to * {@code dock(Dockable dockable, DockingPort port, String region, DragOperation token)}, * passing a {@code null} argument for the {@code DragOperation} parameter. * This implies that there is no event-based drag operation currently in * progress to control the semantics of the docking operation, only that an * attempt should be made to dock the specified {@code Dockable} into the * specified {@code DockingPort}. *

* This method will return {@code false} if {@code dockable} or {@code port} * are {@code null}, or if {@code region} is not a valid region according * to the specified {@code DockingPort}. If a {@code Dockable} is currently * docked within the specified {@code DockingPort}, then that * {@code Dockable's} territorial properties are also checked and this * method may return {@code false} if the territory is blocked. Finally, * this method will return {@code false} if the specified {@code Dockable} * is already docked within the supplied region of the specified * * The {@code DragOperation} parameter, if present, will control the * semantics of the docking operation based upon current mouse position, * drag threshold, and a customizable drag context {@code Map}. For * instance, the {@code DragOperation} may contain information regarding the * {@code Dockable} over which the mouse is currently hovered, whether the * user is attempting to drag a {@code Dockable} outside the bounds of any * existing windows (perhaps in an attempt to float the {@code Dockable}), * or whether the current distance offset from the original drag point * sufficiently warrants a valid docking operation. *

* If the {@code DragOperation} is {@code null}, then this method will * attempt to programmatically dock the specified {@code Dockable} into the * supplied {@code region} of the specified {@code DockingPort} without * regard to external event-based criteria. This is in accordance with the * behavior specified by * {@code dock(Dockable dockable, DockingPort port, String region)}. * * This method will return {@code false} if {@code dockable} or {@code port} * are {@code null}, or if {@code region} is not a valid region according * to the specified {@code DockingPort}. If a {@code Dockable} is currently * docked within the specified {@code DockingPort}, then that * {@code Dockable's} territorial properties are also checked and this * method may return {@code false} if the territory is blocked. If a * {@code DragOperation} is present, then this method will return * {@code false} if the required drag threshold has not been exceeded. * Finally, this method will return {@code false} if the specified * {@code Dockable} is already docked within the supplied region of the * specified 200; } protected boolean isDockingPossible(Dockable dockable, DockingPort port, String region, DragOperation token) { // superclass blocks docking if the 'port' or 'region' are null. If // we've dragged outside // the bounds of the parent frame, then both of these will be null. This // is expected here and // we intend to float in this case. if (isFloatable(dockable, token)) return true; // check to see if we're already floating and we're trying to drop into // the // same dialog. DockingPort oldPort = DockingManager.getDockingPort(dockable); if (oldPort instanceof FloatingDockingPort && oldPort == port) { // only allow this situation if we're not the *last* dockable // in the viewport. if we're removing the last dockable, then // the dialog will disappear before we redock, and we don't want // this // to happen. FloatingDockingPort floatingDockingPort = (FloatingDockingPort) oldPort; if (floatingDockingPort.getDockableCount() == 1) return false; } if (dockable == null || dockable.getComponent() == null || port == null) return false; if (!DockingManager.isValidDockingRegion(region)) return false; Dockable docked = DockingManager.getDockable(port.getDockedComponent()); if (docked == null) return true; // don't allow them to dock into this region if the territory there is // blocked. if (docked.getDockingProperties().isTerritoryBlocked(region) .booleanValue()) return false; // check to see if we're already docked into this region. // get the parent dockingPort. Container container = docked.getComponent().getParent(); // now get the grandparent dockingport DockingPort grandparent = DockingManager.getDockingPort(container); // if we don't share the grandparent dockingport, then we're definitely // not split in the same dockingport // across different region. in this case, it's ok to proceed with the // dock if (grandparent == null) return true; Component currentlyInRegion = grandparent.getComponent(region); // block docking if we're already the component docked within the // specified region if (currentlyInRegion == dockable.getComponent()) return false; return true; } protected boolean isFloatable(Dockable dockable, DragOperation token) { // can't float null objects if (dockable == null || dockable.getComponent() == null || token == null) return false; // can't float on a fake drag operation if (token.isPseudoDrag()) return false; // TODO: break this check out into a separate DropPolicy class. // should be any customizable criteria, not hardcoded to checking // for being outside the bounds of a window if (token.isOverWindow()) return false; return true; } protected DockingResults dropComponent(Dockable dockable, DockingPort target, String region, DragOperation token) { if (isFloatable(dockable, token)) return floatComponent(dockable, target, token); DockingResults results = new DockingResults(target, false); if (UNKNOWN_REGION.equals(region) || target == null) { return results; } Component docked = target.getDockedComponent(); Component dockableCmp = dockable.getComponent(); if (dockableCmp != null && dockableCmp == docked) { // don't allow docking the same component back into the same port return results; } // obtain a reference to the content pane that holds the target // DockingPort. // MUST happen before undock(), in case the undock() operation removes // the // target DockingPort from the container tree. Container contentPane = SwingUtility.getContentPane((Component) target); Point contentPaneLocation = token == null ? null : token .getCurrentMouse(contentPane); // undock the current Dockable instance from it's current parent // container undock(dockable); // when the original parent reevaluates its container tree after // undocking, it checks to see how // many immediate child components it has. split layouts and tabbed // interfaces may be managed by // intermediate wrapper components. When undock() is called, the docking // port // may decide that some of its intermedite wrapper components are no // longer needed, and it may get // rid of them. this isn't a hard rule, but it's possible for any given // DockingPort implementation. // In this case, the target we had resolved earlier may have been // removed from the component tree // and may no longer be valid. to be safe, we'll resolve the target // docking port again and see if // it has changed. if so, we'll adopt the resolved port as our new // target. if (contentPaneLocation != null && contentPane != null) { results.dropTarget = DockingUtility.findDockingPort(contentPane, contentPaneLocation); target = results.dropTarget; } results.success = target.dock(dockableCmp, region); SwingUtility.revalidate((Component) target); return results; } /** * Undocks the specified {@code Dockable} from it's parent * {@code DockingPort}. If {@code dockable} is {@code null} or is not * currently docked within a {@code DockingPort}, then this method returns * {@code false}. * * @param dockable * the {@code Dockable} to be undocked. * @return {@code true} if the undocking operation was successful, * {@code false} otherwise. * @see #dock(Dockable, DockingPort, String) */ public boolean undock(Dockable dockable) { if (dockable == null) return false; Component dragSrc = dockable.getComponent(); Container parent = dragSrc.getParent(); RootWindow rootWin = RootWindow.getRootContainer(parent); // if there's no parent container, then we really don't have anything // from which to to // undock this component, now do we? if (parent == null) return false; boolean success = false; DockingPort dockingPort = DockingUtility.getParentDockingPort(dragSrc); // notify that we are about to undock Map dragContext = DragManager.getDragContext(dockable); DockingEvent dockingEvent = new DockingEvent(dockable, dockingPort, dockingPort, DockingEvent.UNDOCKING_STARTED, dragContext); EventManager.dispatch(dockingEvent); // if(dockingEvent.isConsumed()) // return false; if (dockingPort != null) { // if 'dragSrc' is currently docked, then undock it instead of using // a // simple remove(). this will allow the DockingPort to do any of its // own // cleanup operations associated with component removal. success = dockingPort.undock(dragSrc); } else { // otherwise, just remove the component parent.remove(dragSrc); success = true; } if (rootWin != null) { SwingUtility.revalidate(rootWin.getContentPane()); SwingUtility.repaint(rootWin.getContentPane()); } if (success) { dockingEvent = new DockingEvent(dockable, dockingPort, dockingPort, DockingEvent.UNDOCKING_COMPLETE, dragContext); // notify the docking port and dockable Object[] evtTargets = { dockingPort, dockable }; EventManager.dispatch(dockingEvent, evtTargets); } return success; } protected DockingResults floatComponent(Dockable dockable, DockingPort target, DragOperation token) { // otherwise, setup a new DockingFrame and retarget to the CENTER region DockingResults results = new DockingResults(target, false); // determine the bounds of the new frame Point screenLoc = token.getCurrentMouse(true); SwingUtility.add(screenLoc, token.getMouseOffset()); Rectangle screenBounds = dockable.getComponent().getBounds(); screenBounds.setLocation(screenLoc); // create the frame FloatManager mgr = DockingManager.getFloatManager(); DockingFrame frame = mgr.floatDockable(dockable, dockable .getComponent(), screenBounds); // grab a reference to the frame's dockingPort for posterity results.dropTarget = frame.getDockingPort(); results.success = true; return results; } protected static class DockingResults { public DockingResults(DockingPort port, boolean status) { dropTarget = port; success = status; } public DockingPort dropTarget; public boolean success; } /** * Returns a new {@code DefaultDockingPort} with characteristics similar to * the specified base {@code DockingPort}. If the base {@code DockingPort} * is a {@code DefaultDockingPort}, then the returned {@code DockingPort} * will share the base {@code DockingPort's} border manager and tabbed * drag-source flag. The returned {@code DockingPort's} {@code isRoot()} * method will return {@code false}. * * @param base * the {@code DockingPort} off of which to base the returned * {@code DockingPort} * @return a new {@code DefaultDockingPort} with characteristics similar to * the specified base {@code DockingPort}. * @see DefaultDockingPort#getBorderManager() * @see DefaultDockingPort#setBorderManager(BorderManager) * @see DefaultDockingPort#isTabsAsDragSource() * @see DefaultDockingPort#setTabsAsDragSource(boolean) * @see DefaultDockingPort#setRoot(boolean) */ public DockingPort createDockingPort(DockingPort base) { DockingPort port = createDockingPortImpl(base); if (port instanceof DefaultDockingPort && base instanceof DefaultDockingPort) { DefaultDockingPort newPort = (DefaultDockingPort) port; DefaultDockingPort ddp = (DefaultDockingPort) base; newPort.setBorderManager(ddp.getBorderManager()); newPort.setTabsAsDragSource(ddp.isTabsAsDragSource()); newPort.setRoot(false); } return port; } protected DockingPort createDockingPortImpl(DockingPort base) { return new DefaultDockingPort(); } /** * Returns a new {@code DockingSplitPane} based on the specified * {@code DockingPort}. and region. Creation of the * {@code DockingSplitPane} is deferred to an internal protected method to * allow for overriding by subclasses. A client property is set on the * returned split pane with the key DockingConstants.REGION to indicate the * creation region of the split pane for non-{@code DockingSplitPanes} * returned by overriding subclasses. *

* This method determines the "elder" component of the split pane by * checking whether the new creation region is in the TOP or LEFT * (NORTH_REGION or WEST_REGION). If the creation region, representing where * the new {@code Dockable} will be docked, is not in the top or * left, then the elder {@code Component} in the split pane must be. This * information is used to initialize the resize weight of the split pane, * setting resize weight to {@code 1} if the elder is in the top or left of * the split pane and {@code 0} if not. This gives the elder * {@code Component} in the resulting split pane priority in the layout with * resizing the split pane. *

* If the creation region is {@code NORTH_REGION} or {@code SOUTH_REGION}, * the returned split pane is initialized with a {@code VERTICAL_SPLIT} * orientation; otherwise a {@code HORIZONTAL_SPLIT} orientation is used. *

* Before returning, the border is removed from the split pane, its divider * size is set to 3, and if possible the border is removed from the split * pane divider. This is to avoid an excessive compound border effect for * embedded {@code Components} within the split pane that may have their own * borders. * * @param base * the {@code DockingPort} off of which the returned * {@code JSplitPane} will be based. * @param region * the region within the base {@code DockingPort} used to * determine the orientation of the returned {@code JSplitPane}. * @return a new {@code DockingSplitPane} based on the specified * {@code DockingPort}. and region. * @see DockingSplitPane#DockingSplitPane(DockingPort, String) * @see #createSplitPaneImpl(DockingPort, String) * @see JSplitPane#setResizeWeight(double) */ public JSplitPane createSplitPane(DockingPort base, String region, float percent) { JSplitPane split = createSplitPaneImpl(base, region); split.setVisible(false); // mark the creation region on the split pane SwingUtility.putClientProperty(split, DockingConstants.REGION, region); double resizeWeight; if (defaultResizeWeight == -1) { // the creation region represents the "new" region, not the elder // region. // so if the creation region is NOT in the top left, then the elder // region is. boolean elderInTopLeft = !DockingUtility.isRegionTopLeft(region); resizeWeight = elderInTopLeft ? 1 : 0; } else { resizeWeight = defaultResizeWeight; } split.setResizeWeight(resizeWeight); if (constantPercent && split instanceof DockingSplitPane) { ((DockingSplitPane) split).setConstantPercent(true); } // determine the orientation int orientation = JSplitPane.HORIZONTAL_SPLIT; if (NORTH_REGION.equals(region) || SOUTH_REGION.equals(region)) orientation = JSplitPane.VERTICAL_SPLIT; split.setOrientation(orientation); // remove the border from the split pane split.setBorder(null); // set the divider size for a more reasonable, less bulky look split.setDividerSize(3); split.setOneTouchExpandable(false); //zw // check the UI. If we can't work with the UI any further, then // exit here. if (!(split.getUI() instanceof BasicSplitPaneUI)) return split; // grab the divider from the UI and remove the border from it final BasicSplitPaneDivider divider = ((BasicSplitPaneUI) split.getUI()) .getDivider(); if (divider != null) { divider.setBorder(null); divider.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) { // TODO should be not override, but placed logic here ((JSplitPane) divider.getParent()) .resetToPreferredSizes(); } } }); } if (percent != -1) { split.setDividerLocation(percent); } split.setVisible(true); return split; } /** * Returns a new {@code DockingSplitPane} based on the specified * {@code DockingPort}. and region. Creation of the * {@code DockingSplitPane} is deferred to an internal protected method to * allow for overriding by subclasses. A client property is set on the * returned split pane with the key DockingConstants.REGION to indicate the * creation region of the split pane for non-{@code DockingSplitPanes} * returned by overriding subclasses. *

* This method determines the "elder" component of the split pane by * checking whether the new creation region is in the TOP or LEFT * (NORTH_REGION or WEST_REGION). If the creation region, representing where * the new {@code Dockable} will be docked, is not in the top or * left, then the elder {@code Component} in the split pane must be. This * information is used to initialize the resize weight of the split pane, * setting resize weight to {@code 1} if the elder is in the top or left of * the split pane and {@code 0} if not. This gives the elder * {@code Component} in the resulting split pane priority in the layout with * resizing the split pane. *

* If the creation region is {@code NORTH_REGION} or {@code SOUTH_REGION}, * the returned split pane is initialized with a {@code VERTICAL_SPLIT} * orientation; otherwise a {@code HORIZONTAL_SPLIT} orientation is used. *

* Before returning, the border is removed from the split pane, its divider * size is set to 3, and if possible the border is removed from the split * pane divider. This is to avoid an excessive compound border effect for * embedded {@code Components} within the split pane that may have their own * borders. * * @param base * the {@code DockingPort} off of which the returned * {@code JSplitPane} will be based. * @param region * the region within the base {@code DockingPort} used to * determine the orientation of the returned {@code JSplitPane}. * @return a new {@code DockingSplitPane} based on the specified * {@code DockingPort}. and region. * @see DockingSplitPane#DockingSplitPane(DockingPort, String) * @see #createSplitPaneImpl(DockingPort, String) * @see JSplitPane#setResizeWeight(double) */ public JSplitPane createSplitPane(DockingPort base, String region) { return createSplitPane(base, region, -1f); } protected JSplitPane createSplitPaneImpl(DockingPort base, String region) { return new DockingSplitPane(base, region); } /** * Returns the initial divider location to be used by the specified * {@code JSplitPane} when it is embedded within the specified * {@code DockingPort}. It is assumed that the {@code JSplitPane} parameter * is embedded within the specified {@code DockingPort}, is validated, * visible, and its dimensions are non-zero. *

* This method gets the "size" of the specified {@code DockingPort} based on * the orientation of the split pane (width for horizontal split, * height for vertical split) minus the {@code DockingPort's} * insets. It then dispatches to * {@code getDividerProportion(DockingPort port, JSplitPane splitPane)} to * determine the preferred proportion of the split pane divider. The * returned value for this method is the product of the {@code DockingPort} * size and the split proportion. *

* If either {@code port} or {@code splitPane} parameters are {@code null}, * then this method returns {@code 0}. * * @param port * the {@code DockingPort} that contains the specified * {@code JSplitPane}. * @param splitPane * the {@code JSplitPane} whose initial divider location is to be * determined. * @return the desired divider location of the supplied {@code JSplitPane}. * @see DockingStrategy#getInitialDividerLocation(DockingPort, JSplitPane) * @see #getDividerProportion(DockingPort, JSplitPane) */ public int getInitialDividerLocation(DockingPort port, JSplitPane splitPane) { if (port == null || splitPane == null) return 0; Container dockingPort = (Container) port; Insets in = dockingPort.getInsets(); boolean vert = splitPane.getOrientation() == JSplitPane.VERTICAL_SPLIT; int inset = vert ? in.top + in.bottom : in.left + in.right; // get the dimensions of the DockingPort, minus the insets int portSize = vert ? dockingPort.getHeight() : dockingPort.getWidth(); portSize -= inset; // get the divider proportion for the split pane and multiply by the // port size double proportion = getDividerProportion(port, splitPane); if (proportion < 0 || proportion > 1) proportion = 0.5d; return (int) (portSize * proportion); } /** * Returns the desired divider proportion of the specified * {@code JSplitPane} after rendering. This method assumes that the * {@code JSplitPane} parameter is, or will be embedded within the specified * {@code DockingPort}. This method does not assume that the * {@code JSplitPane} has been validated and that it's current dimensions * are non-zero. *

* If either {@code port} or {@code splitPane} parameters are {@code null}, * then this method returns the default value of * {@code RegionChecker.DEFAULT_SIBLING_SIZE}. Otherwise the "elder" * component within the {@code JSplitPane} is determined to see if it is * contained within a sub-{@code DockingPort}. If the "elder" * {@code Component} cannot be determined, or it is not contained within a * sub-{@code DockingPort}, then the default value of * {@code RegionChecker.DEFAULT_SIBLING_SIZE} is returned. *

* If the "elder" {@code Component} is successfully resolved inside a sub-{@code DockingPort}, * then a check is done on the sub-port for the client property * {@code DefaultDockingStrategy.PREFERRED_PROPORTION}. If this value is * found, then the primitive float version of it is returned. *

* Failing these checks, the {@code Dockable} is resolved for the "elder" * {@code Component} in the specified {@code JSplitPane} via * {@code DockingManager.getDockable(Component comp)}. If no * {@code Dockable} can be found, then * {@code RegionChecker.DEFAULT_SIBLING_SIZE} is returned. *

* Otherwise, the {@code DockingPortPropertySet} is retrieved from the * specified {@code DockingPort} and its {@code getRegionChecker()} method * is called. {@code getSiblingSize(Component c, String region)} is invoked * on the returned {@code RegionChecker} passing the "elder" * {@code Component} in the split pane and the creation region resolved for * the specified {@code JSplitPane}. This resolves the preferred sibling * size for the elder {@code Dockable} component. If the elder * {@code Component} is in the top/left of the split pane, then * {@code 1F-prefSize} is returned. Otherwise, the preferred sibling size is * returned. * * @param port * the {@code DockingPort} that contains, or will contain the * specified {@code JSplitPane}. * @param splitPane * the {@code JSplitPane} whose initial divider location is to be * determined. * @return the desired divider proportion of the supplied {@code JSplitPane}. * @see RegionChecker#DEFAULT_SIBLING_SIZE * @see #PREFERRED_PROPORTION * @see DockingManager#getDockable(Component) * @see RegionChecker#getSiblingSize(Component, String) */ public double getDividerProportion(DockingPort port, JSplitPane splitPane) { if (port == null || splitPane == null) return DockingManager.getDefaultSiblingSize(); Component elder = getElderComponent(splitPane); if (elder == null) return DockingManager.getDefaultSiblingSize(); Float prefProp = getPreferredProportion(splitPane, elder); if (prefProp != null) return prefProp.doubleValue(); if (elder instanceof DockingSplitPane) { elder = ((DockingSplitPane) elder).getElderComponent(); } Dockable dockable = DockingManager.getDockable(elder); if (dockable != null) { // DockingSplitPane splitter = (DockingSplitPane)splitPane; RegionChecker rc = port.getDockingProperties().getRegionChecker(); float prefSize = rc.getSiblingSize(dockable.getComponent(), getCreationRegion(splitPane)); return isElderTopLeft(splitPane) ? 1f - prefSize : prefSize; // return prefSize; } return DockingManager.getDefaultSiblingSize(); } protected String getCreationRegion(JSplitPane splitPane) { if (splitPane instanceof DockingSplitPane) return ((DockingSplitPane) splitPane).getRegion(); return (String) SwingUtility.getClientProperty(splitPane, DockingConstants.REGION); } protected boolean isElderTopLeft(JSplitPane splitPane) { if (splitPane instanceof DockingSplitPane) return ((DockingSplitPane) splitPane).isElderTopLeft(); String region = getCreationRegion(splitPane); // creation region represents the "new" region, not the "elder" region. // so if the "new" region is NOT the topLeft, then the "elder" is. return !DockingUtility.isRegionTopLeft(region); } protected Float getPreferredProportion(JSplitPane splitPane, Component controller) { // 'controller' is inside a dockingPort. re-reference to the parent // dockingPort. Container controllerPort = controller.getParent(); return getPreferredProportion(controllerPort); } protected Component getElderComponent(JSplitPane splitPane) { if (splitPane instanceof DockingSplitPane) return ((DockingSplitPane) splitPane).getElderComponent(); boolean inTopLeft = isElderTopLeft(splitPane); Component comp = inTopLeft ? splitPane.getLeftComponent() : splitPane .getRightComponent(); if (comp instanceof DockingPort) comp = ((DockingPort) comp).getDockedComponent(); return comp; } protected static Float getPreferredProportion(Component c) { return c == null ? null : (Float) SwingUtility.getClientProperty(c, PREFERRED_PROPORTION); } public static void setDefaultResizeWeight(double rw) { defaultResizeWeight = rw; } public static void keepConstantPercentage(boolean cstPercent) { constantPercent = cstPercent; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/defaults/DefaultRegionChecker.java0000644000175000017500000005273012177715062031351 0ustar sylvestresylvestre/* * Created on Mar 11, 2005 */ package org.flexdock.docking.defaults; import java.awt.Component; import java.awt.Point; import java.awt.Polygon; import java.awt.Rectangle; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.RegionChecker; /** * @author Christopher Butler */ public class DefaultRegionChecker implements RegionChecker, DockingConstants { /** * Returns the docking region of the supplied {@code Component} that * contains the coordinates of the specified {@code Point}. If either * {@code comp} or {@code point} is {@code null}, then * {@code UNKNOWN_REGION} is returned. If the specified {@code Component} * bounds do not contain the supplied {@code Point}, then * {@code UNKNOWN_REGION} is returned. *

* This implementation assumes that {@code comp} is a {@code Component} * embedded within a {@code DockingPort}. If {@code comp} is itself a * {@code DockingPort}, then {@code CENTER_REGION} is returned. Otherwise, * the returned region is based upon a section of the bounds of the * specified {@code Component} relative to the containing * {@code DockingPort}. *

* This method divides the specified {@code Component's} bounds into four * {@code Rectangles} determined by {@code getNorthRegion(Component c)}, * {@code getSouthRegion(Component c)}, {@code getEastRegion(Component c)}, * and {@code getWestRegion(Component c)}, respectively. Each * {@code Rectangle} is then checked to see if it contains the specified * {@code Point}. The order of precedence is NORTH, SOUTH, EAST, and then * WEST. If the specified {@code Point} is contained by the * {@code Component} bounds but none of the sub-{@code Rectangles}, then * {@code CENTER_REGION} is returned. *

* For NORTH and SOUTH {@code Rectangles}, the distance is checked between * the top/bottom and left or right edge of the regional bounds. If the * horizontal distance to the regional edge is smaller than the vertical * distance, then EAST or WEST takes precendence of NORTH or SOUTH. This * allows for proper determination between "northeast", "northwest", * "southeast", and "southwest" cases. * * @param comp * the {@code Component} whose region is to be examined. * @param point * the coordinates whose region is to be determined. * @return the docking region containing the specified {@code Point}. * @see RegionChecker#getRegion(Component, Point) * @see #getNorthRegion(Component) * @see #getSouthRegion(Component) * @see #getEastRegion(Component) * @see #getWestRegion(Component) */ public String getRegion(Component comp, Point point) { if (comp == null || point == null) return UNKNOWN_REGION; // make sure the point is actually inside of the target dockingport Rectangle targetArea = comp.getBounds(); // if our target component is the dockingport itself, then getBounds() // would // have returned a target area relative to the dockingport's parent. // reset // relative to the dockingport. if (comp instanceof DockingPort) targetArea.setLocation(0, 0); if (!targetArea.contains(point)) return UNKNOWN_REGION; // if our target component is the dockingport, then the dockingport is // currently empty and all points within it are in the CENTER if (comp instanceof DockingPort) return CENTER_REGION; // start with the north region Rectangle north = getNorthRegion(comp); int rightX = north.x + north.width; if (north.contains(point)) { // check NORTH_WEST Rectangle west = getWestRegion(comp); if (west.contains(point)) { Polygon westPoly = new Polygon(); westPoly.addPoint(0, 0); westPoly.addPoint(0, north.height); westPoly.addPoint(west.width, north.height); return westPoly.contains(point) ? WEST_REGION : NORTH_REGION; } // check NORTH_EAST Rectangle east = getEastRegion(comp); if (east.contains(point)) { Polygon eastPoly = new Polygon(); eastPoly.addPoint(rightX, 0); eastPoly.addPoint(rightX, north.height); eastPoly.addPoint(east.x, north.height); return eastPoly.contains(point) ? EAST_REGION : NORTH_REGION; } return NORTH_REGION; } // check with the south region Rectangle south = getSouthRegion(comp); int bottomY = south.y + south.height; if (south.contains(point)) { // check SOUTH_WEST Rectangle west = getWestRegion(comp); if (west.contains(point)) { Polygon westPoly = new Polygon(); westPoly.addPoint(0, south.y); westPoly.addPoint(west.width, south.y); westPoly.addPoint(0, bottomY); return westPoly.contains(point) ? WEST_REGION : SOUTH_REGION; } // check SOUTH_EAST Rectangle east = getEastRegion(comp); if (east.contains(point)) { Polygon eastPoly = new Polygon(); eastPoly.addPoint(east.y, south.y); eastPoly.addPoint(rightX, south.y); eastPoly.addPoint(rightX, bottomY); return eastPoly.contains(point) ? EAST_REGION : SOUTH_REGION; } return SOUTH_REGION; } // Now check EAST and WEST. We've already checked NORTH and SOUTH, so we // don't have to // check for NE, SE, NW, and SW anymore. Rectangle east = getEastRegion(comp); if (east.contains(point)) return EAST_REGION; Rectangle west = getWestRegion(comp); if (west.contains(point)) return WEST_REGION; // not in any of the outer regions, so return CENTER. return CENTER_REGION; } /** * Returns the rectangular bounds within the specified component that * represent it's {@code DockingConstants.NORTH_REGION}. This method * dispatches to {@code getRegionBounds(Component c, String region)}, * passing an argument of {@code DockingConstants.NORTH_REGION} for the * region parameter. If the specified {@code Component} is {@code null}, * then a {@code null} reference is returned. * * @param c * the {@code Component} whose north region is to be returned. * @return the bounds containing the north region of the specified * {@code Component}. * @see RegionChecker#getNorthRegion(Component) * @see #getRegionBounds(Component, String) */ public Rectangle getNorthRegion(Component c) { return getRegionBounds(c, NORTH_REGION); } /** * Returns the rectangular bounds within the specified component that * represent it's {@code DockingConstants.SOUTH_REGION}. This method * dispatches to {@code getRegionBounds(Component c, String region)}, * passing an argument of {@code DockingConstants.SOUTH_REGION} for the * region parameter. If the specified {@code Component} is {@code null}, * then a {@code null} reference is returned. * * @param c * the {@code Component} whose south region is to be returned. * @return the bounds containing the north region of the specified * {@code Component}. * @see RegionChecker#getSouthRegion(Component) * @see #getRegionBounds(Component, String) */ public Rectangle getSouthRegion(Component c) { return getRegionBounds(c, SOUTH_REGION); } /** * Returns the rectangular bounds within the specified component that * represent it's {@code DockingConstants.EAST_REGION}. This method * dispatches to {@code getRegionBounds(Component c, String region)}, * passing an argument of {@code DockingConstants.EAST_REGION} for the * region parameter. If the specified {@code Component} is {@code null}, * then a {@code null} reference is returned. * * @param c * the {@code Component} whose east region is to be returned. * @return the bounds containing the north region of the specified * {@code Component}. * @see RegionChecker#getEastRegion(Component) * @see #getRegionBounds(Component, String) */ public Rectangle getEastRegion(Component c) { return getRegionBounds(c, EAST_REGION); } /** * Returns the rectangular bounds within the specified component that * represent it's {@code DockingConstants.WEST_REGION}. This method * dispatches to {@code getRegionBounds(Component c, String region)}, * passing an argument of {@code DockingConstants.WEST_REGION} for the * region parameter. If the specified {@code Component} is {@code null}, * then a {@code null} reference is returned. * * @param c * the {@code Component} whose west region is to be returned. * @return the bounds containing the north region of the specified * {@code Component}. * @see RegionChecker#getWestRegion(Component) * @see #getRegionBounds(Component, String) */ public Rectangle getWestRegion(Component c) { return getRegionBounds(c, WEST_REGION); } /** * Returns the bounding {@code Rectangle} within the specified component * that represents the specified region. If {@code c} or {@code region} are * null, then this method returns a {@code null} reference. *

* This method dispatches to * {@code getRegionSize(Component c, String region)} to determine the * proportional size of the specified {@code Component} dedicated to the * specified region. It then multiplies this value by the relevant * {@code Component} dimension ({@code width} for east/west, * {@code height} for north/south) and returns a {@code Rectangle} with * the resulting dimension, spanning the {@code Component} edge for the * specified region. * * @param c * the {@code Component} whose region bounds are to be returned. * @param region * the specified region that is to be examined. * @return the bounds containing the supplied region of the specified * {@code Component}. * @see RegionChecker#getRegionBounds(Component, String) * @see #getRegionSize(Component, String) */ public Rectangle getRegionBounds(Component c, String region) { if (c != null && region != null) { float size = getRegionSize(c, region); return calculateRegionalBounds(c, region, size); } return null; } /** * Returns the bounding {@code Rectangle} within the specified component * that represents the desired area to be allotted for sibling * {@code Components} in the specified region. If {@code c} or * {@code region} are null, then this method returns a {@code null} * reference. *

* This method dispatches to * {@code getSiblingSize(Component c, String region)} to determine the * proportional size of the specified {@code Component} dedicated to * siblings in the specified region. It then multiplies this value by the * relevant {@code Component} dimension ({@code width} for east/west, * {@code height} for north/south) and returns a {@code Rectangle} with * the resulting dimension, spanning the {@code Component} edge for the * specified region. * * @param c * the {@code Component} whose sibling bounds are to be returned. * @param region * the specified region that is to be examined. * @return the bounds representing the allotted sibling area for the * supplied region of the specified {@code Component}. * @see RegionChecker#getSiblingBounds(Component, String) * @see #getSiblingSize(Component, String) */ public Rectangle getSiblingBounds(Component c, String region) { if (c != null && region != null) { float size = getSiblingSize(c, region); return calculateRegionalBounds(c, region, size); } return null; } protected Rectangle calculateRegionalBounds(Component c, String region, float size) { if (c == null || region == null) return null; Rectangle bounds = c.getBounds(); if (NORTH_REGION.equals(region) || SOUTH_REGION.equals(region)) { int h = (int) ((float) bounds.height * size); int y = NORTH_REGION.equals(region) ? 0 : bounds.height - h; return new Rectangle(0, y, bounds.width, h); } if (WEST_REGION.equals(region) || EAST_REGION.equals(region)) { int w = (int) ((float) bounds.width * size); int x = WEST_REGION.equals(region) ? 0 : bounds.width - w; return new Rectangle(x, 0, w, bounds.height); } return null; } /** * Returns a percentage (0.0F through 1.0F) representing the amount of space * allotted for the specified region within the specified {@code Component}. *

* This method resolves the {@code Dockable} associated with the specified * {@code Component} and dispatches to * {@code getRegionPreference(Dockable d, String region)}. * {@code getRegionPreference(Dockable d, String region)} attempts to invoke * {@code getDockingProperties()} on the {@code Dockable} to resolve a * {@code DockablePropertySet} instance and return from its * {@code getRegionInset(String region)} method. *

* If the specified {@code Component} is {@code null}, no {@code Dockable} * can be resolved, or no value is specified in the {@code Dockable's} * associated {@code DockingProps} instance, then the default value of * {@code RegionChecker.DEFAULT_REGION_SIZE} is returned. * * @param c * the {@code Component} whose region is to be examined. * @param region * the specified region that is to be examined. * @return the percentage of the specified {@code Component} allotted for * the specified region. * @see RegionChecker#getRegionSize(Component, String) * @see DockingManager#getDockable(Component) * @see #getRegionPreference(Dockable, String) * @see Dockable#getDockingProperties() */ public float getRegionSize(Component c, String region) { Dockable d = DockingManager.getDockable(c); return getRegionPreference(d, region); } /** * Returns a percentage (0.0F through 1.0F) representing the amount of space * allotted for sibling {@code Component} docked to the specified region * within the specified {@code Component}. *

* This method resolves the {@code Dockable} associated with the specified * {@code Component} and dispatches to * {@code getSiblingPreference(Dockable d, String region)}. * {@code getSiblingPreference(Dockable d, String region)} attempts to * invoke {@code getDockingProperties()} on the {@code Dockable} to resolve * a {@code DockablePropertySet} instance and return from its * {@code getSiblingSize(String region)} method. *

* If the specified {@code Component} is {@code null}, no {@code Dockable} * can be resolved, or no value is specified in the {@code Dockable's} * associated {@code DockingProps} instance, then the default value of * {@code RegionChecker.DEFAULT_SIBLING_SIZE} is returned. * * @param c * the {@code Component} whose sibling size is to be examined. * @param region * the specified region that is to be examined. * @return the percentage of the specified {@code Component} allotted for * the siblings within the specified region. * @see DockingManager#getDockable(Component) * @see #getSiblingPreference(Dockable, String) * @see Dockable#getDockingProperties() */ public float getSiblingSize(Component c, String region) { Dockable d = DockingManager.getDockable(c); return getSiblingPreference(d, region); } protected static float getDockingInset(Float value, float defaultVal, float max, float min) { float f = value == null ? -1 : value.floatValue(); if (f == -1) f = defaultVal; return checkBounds(f, max, min); } protected static float checkBounds(float val, float max, float min) { val = Math.min(val, max); return Math.max(val, min); } /** * Returns {@code size} if it is between the values * {@code RegionChecker.MIN_REGION_SIZE} and * {@code RegionChecker.MAX_REGION_SIZE}. If {@code size} is less than * {@code RegionChecker.MIN_REGION_SIZE}, then * {@code RegionChecker.MIN_REGION_SIZE} is returned. If {@code size} is * greater than {@code RegionChecker.MAX_REGION_SIZE}, then * {@code RegionChecker.MAX_REGION_SIZE} is returned. * * @return a valid {@code size} value between * {@code RegionChecker.MIN_REGION_SIZE} and * {@code RegionChecker.MAX_REGION_SIZE}, inclusive. */ public static float validateRegionSize(float size) { return checkBounds(size, MAX_REGION_SIZE, MIN_REGION_SIZE); } /** * Returns {@code size} if it is between the values * {@code RegionChecker.MIN_SIBILNG_SIZE} and * {@code RegionChecker.MAX_SIBILNG_SIZE}. If {@code size} is less than * {@code RegionChecker.MIN_SIBILNG_SIZE}, then * {@code RegionChecker.MIN_SIBILNG_SIZE} is returned. If {@code size} is * greater than {@code RegionChecker.MAX_SIBILNG_SIZE}, then * {@code RegionChecker.MAX_SIBILNG_SIZE} is returned. * * @return a valid {@code size} value between * {@code RegionChecker.MIN_SIBILNG_SIZE} and * {@code RegionChecker.MAX_SIBILNG_SIZE}, inclusive. */ public static float validateSiblingSize(float size) { return checkBounds(size, MAX_SIBILNG_SIZE, MIN_SIBILNG_SIZE); } /** * Returns a percentage (0.0F through 1.0F) representing the amount of space * allotted for the specified region within the specified {@code Dockable}. *

* This method calls {@code getDockingProperties()} on the {@code Dockable} * to resolve a {@code DockablePropertySet} instance. It then invokes * {@code getRegionInset(String region)} on the {@code DockablePropertySet} * to retrieve the preferred region size. If the {@code Dockable} is * {@code null} or no region preference can be found, then the default value * of {@code RegionChecker.DEFAULT_REGION_SIZE} is returned. Otherwise, the * retrieved region preference is passed through * {@code validateRegionSize(float size)} and returned. * * @param d * the {@code Dockable} whose region is to be checked * @param region * the region of the specified {@code Dockable} to be checked * @return a percentage (0.0F through 1.0F) representing the amount of space * allotted for the specified region within the specified * {@code Dockable}. * @see Dockable#getDockingProperties() * @see RegionChecker#DEFAULT_REGION_SIZE * @see #validateRegionSize(float) */ public static float getRegionPreference(Dockable d, String region) { Float inset = d == null ? null : d.getDockingProperties() .getRegionInset(region); return getDockingInset(inset, DEFAULT_REGION_SIZE, MAX_REGION_SIZE, MIN_REGION_SIZE); } /** * Returns a percentage (0.0F through 1.0F) representing the amount of space * allotted for sibling {@code Components} docked to the specified region * within the specified {@code Dockable}. *

* This method calls {@code getDockingProperties()} on the {@code Dockable} * to resolve a {@code DockablePropertySet} instance. It then invokes * {@code getSiblingSize(String region)} on the {@code DockablePropertySet} * to retrieve the preferred sibling size. If the {@code Dockable} is * {@code null} or no sibling preference can be found, then the default * value of {@code RegionChecker.DEFAULT_SIBLING_SIZE} is returned. * Otherwise, the retrieved region preference is passed through * {@code validateSiblingSize(float size)} and returned. * * @param d * the {@code Dockable} whose sibling size is to be checked * @param region * the region of the specified {@code Dockable} to be checked * @return a percentage (0.0F through 1.0F) representing the amount of space * allotted for sibling {@code Components} docked to the specified * region within the specified {@code Dockable}. * @see Dockable#getDockingProperties() * @see RegionChecker#DEFAULT_SIBLING_SIZE * @see #validateSiblingSize(float) */ public static float getSiblingPreference(Dockable d, String region) { Float size = d == null ? null : d.getDockingProperties() .getSiblingSize(region); return getDockingInset(size, DockingManager.getDefaultSiblingSize(), MAX_SIBILNG_SIZE, MIN_SIBILNG_SIZE); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/defaults/DockableComponentWrapper.java0000644000175000017500000005140112177715062032256 0ustar sylvestresylvestre/* * Copyright (c) 2004 Christopher M Butler * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.flexdock.docking.defaults; import java.awt.Component; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; import java.util.List; import java.util.Set; import javax.swing.Icon; import javax.swing.JComponent; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.DockingStub; import org.flexdock.docking.adapter.DockingAdapter; import org.flexdock.docking.event.DockingEvent; import org.flexdock.docking.event.DockingListener; import org.flexdock.docking.props.DockablePropertySet; import org.flexdock.docking.props.PropertyManager; import org.flexdock.util.SwingUtility; import org.flexdock.util.Utilities; /** * This class models a {@code Dockable} implementation for wrapping a * {@code Component}. It is essentially the simplest means to turning a generic * {@code Component} into a {@code Dockable} instance. Compound * {@code Dockables} may have separate child components that are responsible for * drag initiation, whereas another component is the actual drag source. This is * shown in the manner that a {@code JInternalFrame} would be a draggable * component, while the frame's title pane is the actual drag initiator. *

* The class, conversely, deals with the simple case, where a * {@code Component} itself must be docking-enabled. * {@code DockableComponentWrapper} wraps a {@code Component} and implements the * {@code Dockable} interface. Since the {@code Component} itself is being * docking-enabled, it serves as both the drag source and drag initiator. Thus, * {@code getComponent()} will return a reference to {@code 'this'} and * {@code getDragSources()} return a {@code List} containing the same * self-reference {@code Component}. *

* This class may be used by application code to enable docking capabilities on * a given {@code Component}. However, it is recommended that * {@code DockingManager.registerDockable(Component evtSrc, String desc)} be * used as a more automated, less invasive means of enabling docking on a * component. * {@code DockingManager.registerDockable(Component evtSrc, String desc)} will * automatically create a {@code DockableComponentWrapper} instance and register * the required drag listeners. * * @author Chris Butler */ public class DockableComponentWrapper implements Dockable { private Component dragSrc; private String persistentId; private ArrayList dockingListeners; private ArrayList dragListeners; private Hashtable clientProperties; private HashSet frameDragSources; /** * Creates a {@code DockableComponentWrapper} instance using the specified * source component, persistent ID, and docking description. This method is * used to create {@code Dockable} instances for simple {@code Components} * where the drag source and drag initiator are the same {@code Component}. *

* If {@code src} or {@code id} are {@code null}, then this method returns * a {@code null} reference. *

* {@code src} will be the {@code Component} returned by invoking * {@code getComponent()} on the resulting {@code Dockable} and will be * included in the {@code List} returned by {@code getDragSources()}. * {@code id} will be the value returned by invoking * {@code getPersistentId()} on the resulting {@code Dockable}. * {@code desc} may be used by the {@code Dockable} for descriptive purposes * (such as tab-text in a tabbed layout). It is not recommended to supply a * {@code null} value for {@code desc}, but doing so is not illegal. * * @param src * the source component * @param id * the persistent ID for the Dockable instance * @param desc * the docking description * @return a new {@code DockableComponentWrapper} instance * @see Dockable#getComponent() * @see Dockable#getDragSources() * @see Dockable#getPersistentId() * @see DockingManager#registerDockable(Component, String) */ public static DockableComponentWrapper create(Component src, String id, String desc) { if (src == null || id == null) return null; return new DockableComponentWrapper(src, id, desc); } public static DockableComponentWrapper create(DockingStub stub) { if (!(stub instanceof Component)) return null; return create((Component) stub, stub.getPersistentId(), stub .getTabText()); } public static DockableComponentWrapper create(DockingAdapter adapter) { if (adapter == null) return null; Component comp = adapter.getComponent(); String id = adapter.getPersistentId(); String tabText = adapter.getTabText(); DockableComponentWrapper dockable = create(comp, id, tabText); List dragSources = adapter.getDragSources(); Set frameDragSources = adapter.getFrameDragSources(); Icon icon = adapter.getDockbarIcon(); if (dragSources != null) { dockable.getDragSources().clear(); dockable.getDragSources().addAll(dragSources); } if (frameDragSources != null) { dockable.getFrameDragSources().clear(); dockable.getFrameDragSources().addAll(frameDragSources); } if (icon != null) dockable.getDockingProperties().setDockbarIcon(icon); return dockable; } /** * @param src * @param id * @param desc * @param resizable */ private DockableComponentWrapper(Component src, String id, String desc) { dragSrc = src; getDockingProperties().setDockableDesc(desc); persistentId = id; dockingListeners = new ArrayList(0); dragListeners = new ArrayList(1); // initialize the drag sources lists initDragListeners(); } private void initDragListeners() { // by default, use the wrapped source component as the drag source // and assume there is no frame drag source defined Component draggable = dragSrc; Component frameDragger = null; // if the wrapped source component is a DockingStub, then // we'll be able to pull some extra data from it if (dragSrc instanceof DockingStub) { DockingStub stub = (DockingStub) dragSrc; Component c = stub.getDragSource(); // if the stub defines a specific drag source, then // replace wrapped source component with the specified // drag source if (c != null) draggable = c; // if the stub defines a specified frame drag source, then // use it frameDragger = stub.getFrameDragSource(); } // add the "docking" drag source to the list if (draggable != null) dragListeners.add(draggable); // add the floating frame drag source to the list if (frameDragger != null) getFrameDragSources().add(frameDragger); } private Hashtable getInternalClientProperties() { if (clientProperties == null) clientProperties = new Hashtable(2); return clientProperties; } /** * Returns the {@code Component} used to create this * {@code DockableComponentWrapper} instance. * * @return the {@code Component} used to create this * {@code DockableComponentWrapper} instance. * @see Dockable#getComponent() * @see #create(Component, String, String) */ public Component getComponent() { return dragSrc; } /** * Returns a {@code List} of {@code Components} used to initiate * drag-to-dock operation. By default, the returned {@code List} contains * the {@code Component} returned by {@code getComponent()}. * * @return a {@code List} of {@code Components} used to initiate * drag-to-dock operation. * @see Dockable#getDragSources() * @see #getComponent() * @see #create(Component, String, String) */ public List getDragSources() { return dragListeners; } /** * Returns the persistent ID of this {@code DockableComponentWrapper} * instance provided when this object was instantiated. * * @return the persistent ID of this {@code DockableComponentWrapper} * @see Dockable#getPersistentId() * @see #create(Component, String, String) */ public String getPersistentId() { return persistentId; } /** * Returns a {@code HashSet} of {@code Components} used as frame drag * sources when this {@code Dockable} is floating in a non-decorated * external dialog. The {@code HashSet} returned by this method is initially * empty. Because it is mutable, however, new {@code Components} may be * added to it. * * @return a {@code HashSet} of {@code Components} used as frame drag * sources when this {@code Dockable} is floating in a non-decorated * external dialog. * @see Dockable#getFrameDragSources() */ public Set getFrameDragSources() { if (frameDragSources == null) frameDragSources = new HashSet(); return frameDragSources; } /** * Adds a {@code DockingListener} to observe docking events for this * {@code Dockable}. {@code null} arguments are ignored. * * @param listener * the {@code DockingListener} to add to this {@code Dockable}. * @see #getDockingListeners() * @see #removeDockingListener(DockingListener) */ public void addDockingListener(DockingListener listener) { if (listener != null) dockingListeners.add(listener); } /** * Returns an array of all {@code DockingListeners} added to this * {@code Dockable}. If there are no listeners present for this * {@code Dockable}, then a zero-length array is returned. * * @return an array of all {@code DockingListeners} added to this * {@code Dockable}. * @see #addDockingListener(DockingListener) * @see #removeDockingListener(DockingListener) */ public DockingListener[] getDockingListeners() { return (DockingListener[]) dockingListeners .toArray(new DockingListener[0]); } /** * Removes the specified {@code DockingListener} from this {@code Dockable}. * If the specified {@code DockingListener} is {@code null}, or the * listener has not previously been added to this {@code Dockable}, then no * {@code Exception} is thrown and no action is taken. * * @param listener * the {@code DockingListener} to remove from this * {@code Dockable} * @see #addDockingListener(DockingListener) * @see #getDockingListeners() */ public void removeDockingListener(DockingListener listener) { if (listener != null) dockingListeners.remove(listener); } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#dockingCanceled(DockingEvent) */ public void dockingCanceled(DockingEvent evt) { } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#dockingComplete(DockingEvent) */ public void dockingComplete(DockingEvent evt) { } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#undockingComplete(DockingEvent) */ public void undockingComplete(DockingEvent evt) { } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#undockingStarted(DockingEvent) */ public void undockingStarted(DockingEvent evt) { } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#dragStarted(DockingEvent) */ public void dragStarted(DockingEvent evt) { } /** * No operation. Provided as a method stub to fulfull the * {@code DockingListener} interface contract. * * @param evt * the {@code DockingEvent} to respond to. * @see DockingListener#dropStarted(DockingEvent) */ public void dropStarted(DockingEvent evt) { } /** * Returns the value of the property with the specified key. Only properties * added with {@code putClientProperty} will return a non-{@code null} * value. If {@code key} is {@code null}, a {@code null} reference is * returned. *

* If the {@code Component} returned by {@code getComponent()} is an * instance of {@code JComponent}, then this method will dispatch to that * {@code JComponent's} {@code getClientProperty(Object, Object)} method. * Otherwise, this {@code DockableComponentWrapper} will provide its own * internal mapping of client properties. * * @param key * the key that is being queried * @return the value of this property or {@code null} * @see Dockable#getClientProperty(Object) * @see javax.swing.JComponent#getClientProperty(java.lang.Object) */ public Object getClientProperty(Object key) { if (key == null) return null; Component c = getComponent(); if (c instanceof JComponent) return ((JComponent) c).getClientProperty(key); return getInternalClientProperties().get(key); } /** * Adds an arbitrary key/value "client property" to this {@code Dockable}. * {@code null} values are allowed. If {@code key} is {@code null}, then no * action is taken. *

* If the {@code Component} returned by {@code getComponent()} is an * instance of {@code JComponent}, then this method will dispatch to that * {@code JComponent's} {@code putClientProperty(Object, Object)} method. * Otherwise, this {@code DockableComponentWrapper} will provide its own * internal mapping of client properties. * * @param key * the new client property key * @param value * the new client property value; if {@code null} this method * will remove the property * @see Dockable#putClientProperty(Object, Object) * @see javax.swing.JComponent#putClientProperty(java.lang.Object, * java.lang.Object) */ public void putClientProperty(Object key, Object value) { if (key == null) return; Component c = getComponent(); if (c instanceof JComponent) { SwingUtility.putClientProperty(c, key, value); } else { Utilities.put(getInternalClientProperties(), key, value); } } /** * Returns a {@code DockablePropertySet} instance associated with this * {@code Dockable}. This method returns the default implementation * supplied by the framework by invoking * {@code getDockablePropertySet(Dockable dockable)} on * {@code org.flexdock.docking.props.PropertyManager} and supplying an * argument of {@code this}. * * @return the {@code DockablePropertySet} associated with this * {@code Dockable}. This method will not return a {@code null} * reference. * @see Dockable#getDockingProperties() * @see org.flexdock.docking.props.PropertyManager#getDockablePropertySet(Dockable) */ public DockablePropertySet getDockingProperties() { return PropertyManager.getDockablePropertySet(this); } /** * Returns the {@code DockingPort} within which this {@code Dockable} is * currently docked. If not currently docked, this method will return * {@code null}. *

* This method defers processing to * {@code getDockingPort(Dockable dockable)}, passing an argument of * {@code this}. * * @return the {@code DockingPort} within which this {@code Dockable} is * currently docked. * @see Dockable#getDockingPort() * @see DockingManager#getDockingPort(Dockable) */ public DockingPort getDockingPort() { return DockingManager.getDockingPort(this); } /** * Provides the default {@code Dockable} implementation of * {@code dock(Dockable dockable)} by calling and returning * {@code DockingManager.dock(Dockable dockable, Dockable parent)}. * {@code 'this'} is passed as the {@code parent} parameter. * * @param dockable * the {@code Dockable} to dock relative to this {@code Dockable} * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see Dockable#dock(Dockable) * @see DockingManager#dock(Dockable, Dockable) */ public boolean dock(Dockable dockable) { return DockingManager.dock(dockable, this); } /** * Provides the default {@code Dockable} implementation of * {@code dock(Dockable dockable, String relativeRegion)} by calling and * returning * {@code DockingManager.dock(Dockable dockable, Dockable parent, String region)}. * {@code 'this'} is passed as the {@code parent} parameter. * * @param dockable * the {@code Dockable} to dock relative to this {@code Dockable} * @param relativeRegion * the docking region into which to dock the specified * {@code Dockable} * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see Dockable#dock(Dockable, String) * @see DockingManager#dock(Dockable, Dockable, String) */ public boolean dock(Dockable dockable, String relativeRegion) { return DockingManager.dock(dockable, this, relativeRegion); } /** * Provides the default {@code Dockable} implementation of * {@code dock(Dockable dockable, String relativeRegion, float ratio)} by * calling and returning * {@code DockingManager.dock(Dockable dockable, Dockable parent, String region, float proportion)}. * {@code 'this'} is passed as the {@code parent} parameter. * * @param dockable * the {@code Dockable} to dock relative to this {@code Dockable} * @param relativeRegion * the docking region into which to dock the specified * {@code Dockable} * @param ratio * the proportion of available space in the resulting layout to * allot to the new sibling {@code Dockable}. * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see DockingManager#dock(Dockable, Dockable, String, float) */ public boolean dock(Dockable dockable, String relativeRegion, float ratio) { return DockingManager.dock(dockable, this, relativeRegion, ratio); } public void addPropertyChangeListener(PropertyChangeListener listener) { getDockingProperties().addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { getDockingProperties().removePropertyChangeListener(listener); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/defaults/DockablePropertyChangeHandler.java0000644000175000017500000000360612177715062033207 0ustar sylvestresylvestre/* * Created on Aug 11, 2005 */ package org.flexdock.docking.defaults; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingPort; import org.flexdock.docking.activation.ActiveDockableTracker; import org.flexdock.docking.props.DockablePropertySet; import org.flexdock.docking.props.PropertyChangeListenerFactory; /** * @author Christopher Butler */ public class DockablePropertyChangeHandler implements PropertyChangeListener { public static final DockablePropertyChangeHandler DEFAULT_INSTANCE = new DockablePropertyChangeHandler(); public void propertyChange(PropertyChangeEvent evt) { Dockable dockable = evt.getSource() instanceof Dockable? (Dockable)evt.getSource(): null; if(dockable==null) return; if (evt.getPropertyName().equals(DockablePropertySet.TAB_ICON) || evt.getPropertyName().equals(DockablePropertySet.DESCRIPTION)) { if (evt.getSource() instanceof Dockable) { DockingPort dockingPort = dockable.getDockingPort(); if (dockingPort instanceof DefaultDockingPort) { ((DefaultDockingPort) dockingPort).updateTab(dockable); } } } else if (DockablePropertySet.ACTIVE.equals(evt.getPropertyName())) { handleActivationChange(evt, dockable); } } private void handleActivationChange(PropertyChangeEvent evt, Dockable dockable) { if(Boolean.TRUE==evt.getNewValue() && ActiveDockableTracker.getActiveDockable()!=dockable) { ActiveDockableTracker.requestDockableActivation(dockable.getComponent(), true); } } public static class Factory extends PropertyChangeListenerFactory { public PropertyChangeListener getListener() { return DEFAULT_INSTANCE; } } } flexdock-1.2.4/src/java/core/org/flexdock/docking/defaults/DockingSplitPane.java0000644000175000017500000003204012177715062030522 0ustar sylvestresylvestre/* */ package org.flexdock.docking.defaults; import java.awt.Component; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.AbstractAction; import javax.swing.JSplitPane; import javax.swing.plaf.basic.BasicSplitPaneUI; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.util.DockingUtility; import org.flexdock.util.SwingUtility; /** * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class DockingSplitPane extends JSplitPane implements DockingConstants { protected DockingPort dockingPort; protected String region; protected boolean dividerLocDetermined; protected boolean controllerInTopLeft; protected double initialDividerRatio = .5; protected double percent = -1; private int dividerHashCode = -1; private boolean constantPercent; /** * Creates a new {@code DockingSplitPane} for the specified * {@code DockingPort} with the understanding that the resulting * {@code DockingSplitPane} will be used for docking a {@code Dockable} into * the {@code DockingPort's} specified {@code region}. Neither {@code port} * or {@code region} may be {@code null}. {@code region} must be a valid * docking region as defined by {@code isValidDockingRegion(String region)}. * * @param port * the {@code DockingPort} for which this * {@code DockingSplitPane} is to be created. * @param region * the region within the specified {@code DockingPort} for which * this {@code DockingSplitPane} is to be created. * @throws {@code IllegalArgumentException} * if either {@code port} is {@code null} or }region} is * {@code null} or invalid. * @see DockingManager#isValidDockingRegion(String) */ public DockingSplitPane(DockingPort port, String region) { if (port == null) throw new IllegalArgumentException("'port' cannot be null."); if (!DockingManager.isValidDockingRegion(region)) throw new IllegalArgumentException("'" + region + "' is not a valid region."); this.region = region; this.dockingPort = port; // the controlling item is in the topLeft if our new item (represented // by the "region" string) is NOT in the topLeft. controllerInTopLeft = !DockingUtility.isRegionTopLeft(region); // set the proper resize weight int weight = controllerInTopLeft ? 1 : 0; setResizeWeight(weight); addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY, new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent pce) { if (constantPercent && getUI() instanceof BasicSplitPaneUI) { BasicSplitPaneUI ui = (BasicSplitPaneUI) getUI(); if (dividerHashCode != ui.getDivider().hashCode()) { dividerHashCode = ui.getDivider().hashCode(); ui.getDivider().addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { DockingSplitPane.this.percent = SwingUtility.getDividerProportion(DockingSplitPane.this); DockingSplitPane.this.setResizeWeight(percent); } }); } } } }); getActionMap().put("toggleFocus", new AbstractAction() { public void actionPerformed(ActionEvent e) { SwingUtility.toggleFocus(+1); } }); } @Override public void setBounds(int x, int y, int w, int h) { super.setBounds(x, y, w, h); if (constantPercent) { setResizeWeight(percent); super.setDividerLocation((int) (percent * getSplitSize())); } } public void setConstantPercent(boolean cstPercent) { if (cstPercent != constantPercent) { constantPercent = cstPercent; } } public void resetToPreferredSizes() { Insets i = getInsets(); if (getOrientation() == VERTICAL_SPLIT) { int h = getHeight() - i.top - i.bottom - getDividerSize(); int topH = getTopComponent().getPreferredSize().height; int bottomH = getBottomComponent().getPreferredSize().height; int extraSpace = h - topH - bottomH; // we have more space than necessary; resize to give each at least // preferred size if (extraSpace >= 0) { setDividerLocation(i.top + topH + ((int) (extraSpace * getResizeWeight() + .5))); } // TODO implement shrinking excess space to ensure that one has // preferred and nothing more } else { int w = getWidth() - i.left - i.right - getDividerSize(); int leftH = getLeftComponent().getPreferredSize().width; int rightH = getRightComponent().getPreferredSize().width; int extraSpace = w - leftH - rightH; // we have more space than necessary; resize to give each at least // preferred size if (extraSpace >= 0) { setDividerLocation(i.left + leftH + ((int) (extraSpace * getResizeWeight() + .5))); } // TODO implement shrinking excess space to ensure that one has // preferred and nothing more } } private int getSplitSize() { return getOrientation() == JSplitPane.HORIZONTAL_SPLIT ? getWidth() : getHeight(); } public void setDividerLocation(double percent) { this.percent = percent; super.setDividerLocation(percent); setResizeWeight(percent); } public double getPercent() { if (constantPercent) { return percent; } return -1; } protected boolean isDividerSizeProperlyDetermined() { if (getDividerLocation() != 0) return true; return dividerLocDetermined; } /** * Returns the 'oldest' {@code Component} to have been added to this * {@code DockingSplitPane} as a result of a docking operation. A * {@code DockingSplitPane} is created based upon the need to share space * within a {@code DockingPort} between two {@code Dockables}. This happens * when a new {@code Dockable} is introduced into an outer region of a * {@code DockingPort} that already contains a {@code Dockable}. The * {@code Dockable} that was in the {@code DockingPort} prior to splitting * the layout is the 'elder' {@code Component} and, in many circumstances, * may be used to control initial divider location and resize weight. *

* If this split pane contains {@code DockingPorts} as its child components, * then this method will return the {@code Component} determined by calling * {@code getDockedComponent()} for the {@code DockingPort} in this split * pane's elder region. *

* The elder region of this {@code DockingSplitPane} is determined using the * value returned from {@code getRegion()}, where {@code getRegion()} * indicates the docking region of the 'new' {@code Dockable} for this * {@code DockingSplitPane}. * * @return the 'oldest' {@code Component} to have been added to this * {@code DockingSplitPane} as a result of a docking operation. * @see #getRegion() * @see DockingPort#getDockedComponent() */ public Component getElderComponent() { Component c = controllerInTopLeft ? getLeftComponent() : getRightComponent(); if (c instanceof DockingPort) c = ((DockingPort) c).getDockedComponent(); return c; } /** * Returns the docking region for which this {@code DockingSplitPane} was * created. A {@code DockingSplitPane} is created based upon the need to * share space within a {@code DockingPort} between two {@code Dockables}. * This happens when a new {@code Dockable} is introduced into an outer * region of a {@code DockingPort} that already contains a {@code Dockable}. * This method returns that outer region for which this * {@code DockingSplitPane} was created and may be used to control the * orientation of the split pane. The region returned by this method will be * the same passed into the {@code DockingSplitPane} constructor on * instantiation. * * @return the docking region for which this {@code DockingSplitPane} was * created. * @see #DockingSplitPane(DockingPort, String) */ public String getRegion() { return region; } /** * Indicates whether the 'oldest' {@code Component} to have been added to * this {@code DockingSplitPane} as a result of a docking operation is in * the TOP or LEFT side of the split pane. A {@code DockingSplitPane} is * created based upon the need to share space within a {@code DockingPort} * between two {@code Dockables}. This happens when a new {@code Dockable} * is introduced into an outer region of a {@code DockingPort} that already * contains a {@code Dockable}. The {@code Dockable} that was in the * {@code DockingPort} prior to splitting the layout is the 'elder' * {@code Component} and is returned by {@code getElderComponent()}. This * method indicates whether or not that {@code Component} is in the TOP or * LEFT side of this {@code DockingSplitPane}. *

* The elder region of this {@code DockingSplitPane} is determined using the * value returned from {@code getRegion()}, where {@code getRegion()} * indicates the docking region of the 'new' {@code Dockable} for this * {@code DockingSplitPane}. * * @return {@code true} if the 'oldest' {@code Component} to have been added * to this {@code DockingSplitPane} is in the TOP or LEFT side of * the split pane; {@code false} otherwise. * @see #getElderComponent() * @see #getRegion() */ public boolean isElderTopLeft() { return controllerInTopLeft; } /** * Overridden to ensure proper divider location on initial rendering. * Sometimes, a split divider location is set as a proportion before the * split pane itself has been fully realized in the container hierarchy. * This results in a layout calculation based on a proportion of zero width * or height, rather than the desired proportion of width or height after * the split pane has been fully rendered. This method ensures that default * {@code JSplitPane} layout behavior is deferred until after the initial * dimensions of this split pane have been properly determined. * * @see java.awt.Container#doLayout() * @see JSplitPane#setDividerLocation(double) */ public void doLayout() { // if they setup the docking configuration while the application // was first starting up, then the dividerLocation was calculated before // the container tree was visible, sized, validated, etc, so it'll be // stuck at zero. in that case, redetermine the divider location now // that we have valid container bounds with which to work. if (!isDividerSizeProperlyDetermined()) { // make sure this can only run once so we don't get a StackOverflow dividerLocDetermined = true; setDividerLocation(initialDividerRatio); } // continue the layout super.doLayout(); } /** * Releases any internal references to external objects to aid garbage * collection. This method is {@code public} and may be invoked manually for * proactive memory management. Otherwise, this method is invoked by this * {@code DockingSplitPane's} {@code finalize()} method. */ public void cleanup() { dockingPort = null; } /** * Sets the initial divider ration for creating split panes. The default * value is {@code 0.5}. * * @exception IllegalArgumentException * if {@code ratio} is less than 0.0 or greater than 1.0. * @param ratio * a ratio for determining weighting between the two sides of a * split pane. */ public void setInitialDividerRatio(double ratio) { if (ratio < 0.0 || ratio > 1.0) { throw new IllegalArgumentException("ratio (" + ratio + ") must be between [0.0,1,0] inclusive"); } initialDividerRatio = ratio; } protected void finalize() throws Throwable { cleanup(); super.finalize(); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/defaults/StandardBorderManager.java0000644000175000017500000002226312177715062031523 0ustar sylvestresylvestre/* * Copyright (c) 2004 Christopher M Butler * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.flexdock.docking.defaults; import java.awt.Component; import java.awt.Graphics; import javax.swing.JComponent; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.border.Border; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; import javax.swing.plaf.basic.BasicTabbedPaneUI; import org.flexdock.docking.DockingPort; /** * This class provides a standard implementation of the {@code BorderManager} * interface. It is designed to avoid the negative visual effects caused by * nesting docked components that have individual borders. It accomplishes this * by establishing and maintaining a single border for all docked components * * This class encapsulates a {@code javax.swing.border.Border} instance, or a * {@code null} border reference, for application to a * {@code DefaultDockingPort} and its child components. If the * {@code DefaultDockingPort} has no child component, then * {@code managePortNullChild()} will apply the encapsulated border to the * {@code DefaultDockingPort} itself, rendering the visible outline of an empty * {@code DockingPort}. If the {@code DefaultDockingPort} has a generic * {@code Component} as its child, excluding a {@code JTabbedPane} or * {@code JSplitPane}, then the border for that component is set to * {@code null} and the encapsulated border is applied to the * {@code DockingPort} via {@code managePortSimpleChild()}. If the * {@code DefaultDockingPort} has a {@code JTabbedPane} as its child, then a * {@code null} border is set for the {@code JTabbedPane} and all of its child * components, and the encapsulated border is applied to the {@code DockingPort}. * This is accomplished by calling {@code managePortTabbedChild()}. Finally, * {@code managePortSplitChild()} will manage the border for a * {@code DefaultDockingPort} whose docked component is a {@code JSplitPane}. * This method removes all borders from the {@code DefaultDockingPort} and the * split pane divider and applies the encapsulated border to both left and right * child components of the {@code JSplitPane}. * * @author Christopher Butler */ public class StandardBorderManager implements BorderManager { private Border assignedBorder; /** * Creates a new {@code StandardBorderManager} with a {@code null} assigned * border. */ public StandardBorderManager() { } /** * Creates a new {@code StandardBorderManager} with the specified assigned * border. * * @param border * the currently assigned border. */ public StandardBorderManager(Border border) { setBorder(border); } /** * Returns the currently assigned border. * * @return the currently assigned border. */ public Border getBorder() { return assignedBorder; } /** * Sets the assigned border. Null values are acceptable. * * @param border * the assigned border. */ public void setBorder(Border border) { assignedBorder = border; } /** * Set the border on the supplied {@code DockingPort} to the currently * assigned border. * * @see BorderManager#managePortNullChild(DockingPort) */ public void managePortNullChild(DockingPort port) { setBorder(port, assignedBorder); } /** * Removes any border from the {@code DockingPort's} docked component and * set the border on the {@code DockingPort} itself to the currently * assigned border. * * @see BorderManager#managePortSimpleChild(DockingPort) */ public void managePortSimpleChild(DockingPort port) { if (port != null) { setBorder(port.getDockedComponent(), null); setBorder(port, assignedBorder); } } /** * Removes any border from the {@code DockingPort} itself and places the * currently assigned border on the two child components of the * {@code DockingPort's threshold; } private void openPipeline(MouseEvent evt) { DragOperation token = new DragOperation(dockable.getComponent(), dragOrigin, evt); token.setDragListener(this); // initialize listeners on the drag-source initializeListenerCaching(token); DragPipeline pipeline = new DragPipeline(); this.pipeline = pipeline; pipeline.open(token); } public void mouseMoved(MouseEvent e) { // doesn't do anything } public void mouseReleased(MouseEvent e) { if(pipeline==null || dockable.getDockingProperties().isDockingEnabled()==Boolean.FALSE) return; finishDrag(dockable, pipeline.getDragToken(), e); if(pipeline!=null) pipeline.close(); toggleDragContext(false); dragOrigin = null; pipeline = null; } protected void finishDrag(Dockable dockable, DragOperation token, MouseEvent mouseEvt) { DockingStrategy docker = DockingManager.getDockingStrategy(dockable); DockingPort currentPort = DockingUtility.getParentDockingPort(dockable); DockingPort targetPort = token.getTargetPort(); String region = token.getTargetRegion(); // remove the listeners from the drag-source and all the old ones back in restoreCachedListeners(token); // issue a DockingEvent to allow any listeners the chance to cancel the operation. DockingEvent evt = new DockingEvent(dockable, currentPort, targetPort, DockingEvent.DROP_STARTED, mouseEvt, getDragContext()); evt.setRegion(region); evt.setOverWindow(token.isOverWindow()); // EventManager.notifyDockingMonitor(dockable, evt); EventManager.dispatch(evt, dockable); // attempt to complete the docking operation if(!evt.isConsumed()) docker.dock(dockable, targetPort, region, token); } private static void initializeListenerCaching(DragOperation token) { // it's easier for us if we remove the MouseMostionListener associated with the dragSource // before dragging, so normally we'll try to do that. However, if developers really want to // keep them in there, then they can implement the Dockable interface for their dragSource and // let mouseMotionListenersBlockedWhileDragging() return false // if (!dockableImpl.mouseMotionListenersBlockedWhileDragging()) // return; Component dragSrc = token.getDragSource(); EventListener[] cachedListeners = dragSrc.getListeners(MouseMotionListener.class); token.setCachedListeners(cachedListeners); DragManager dragListener = token.getDragListener(); // remove all of the MouseMotionListeners for (int i = 0; i < cachedListeners.length; i++) { dragSrc.removeMouseMotionListener((MouseMotionListener) cachedListeners[i]); } // then, re-add the DragManager if(dragListener!=null) dragSrc.addMouseMotionListener(dragListener); } private static void restoreCachedListeners(DragOperation token) { Component dragSrc = token.getDragSource(); EventListener[] cachedListeners = token.getCachedListeners(); DragManager dragListener = token.getDragListener(); // remove the pipeline listener if(dragListener!=null) dragSrc.removeMouseMotionListener(dragListener); // now, re-add all of the original MouseMotionListeners for (int i = 0; i < cachedListeners.length; i++) dragSrc.addMouseMotionListener((MouseMotionListener) cachedListeners[i]); } private static boolean isDragCanceled(Dockable dockable, MouseEvent trigger) { DockingPort port = DockingUtility.getParentDockingPort(dockable); Map dragContext = getDragContext(dockable); DockingEvent evt = new DockingEvent(dockable, port, null, DockingEvent.DRAG_STARTED, trigger, dragContext); EventManager.dispatch(evt, dockable); return evt.isConsumed(); } public static Map getDragContext(Dockable dockable) { Object obj = dockable==null? null: dockable.getClientProperty(DRAG_CONTEXT); return obj instanceof Map? (Map)obj: null; } private void toggleDragContext(boolean add) { if(add) { if(dragContext==null) { dragContext = new HashMap(); dockable.putClientProperty(DRAG_CONTEXT, dragContext); } } else { if(dragContext!=null) { dragContext.clear(); dragContext = null; } dockable.putClientProperty(DRAG_CONTEXT, null); } } private Map getDragContext() { return getDragContext(dockable); } public static boolean isFloatingAllowed(Dockable dockable) { return FloatPolicyManager.isFloatingAllowed(dockable); } public static DragOperation getCurrentDragOperation() { synchronized(LOCK) { return currentDragOperation; } } static void setCurrentDragOperation(DragOperation operation) { synchronized(LOCK) { currentDragOperation = operation; } } } flexdock-1.2.4/src/java/core/org/flexdock/docking/drag/DragOperation.java0000644000175000017500000001255212177715062027176 0ustar sylvestresylvestrepackage org.flexdock.docking.drag; import java.awt.Component; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.util.EventListener; import javax.swing.SwingUtilities; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; public class DragOperation implements DockingConstants { public static final String DRAG_IMAGE = "DragOperation.DRAG_IMAGE"; private Component dragSource; private Component dockable; private DockingPort parentDockingPort; private Point mouseOffset; private Point currentMouse; private EventListener[] cachedListeners; private DragManager dragListener; private DockingPort targetPort; private String targetRegion; private boolean overWindow; private boolean pseudoDrag; private long started; private Dockable dockableRef; private DockingPort sourcePort; public DragOperation(Component dockable, Point dragOrigin, MouseEvent evt) { if(dockable==null) throw new NullPointerException("'dockable' parameter cannot be null."); if(evt==null) throw new NullPointerException("'evt' parameter cannot be null."); if(!(evt.getSource() instanceof Component)) throw new IllegalArgumentException("'evt.getSource()' must be an instance of java.awt.Component."); if(dragOrigin==null) dragOrigin = evt.getPoint(); init(dockable, (Component)evt.getSource(), dragOrigin, false); } public DragOperation(Component dockable, Component dragSource, Point currentMouse) { init(dockable, dragSource, currentMouse, true); } private void init(Component dockable, Component dragSource, Point currentMouse, boolean fakeDrag) { this.dockable = dockable; this.dragSource = dragSource; this.currentMouse = currentMouse; mouseOffset = calculateMouseOffset(currentMouse); pseudoDrag = fakeDrag; if(!fakeDrag) parentDockingPort = (DockingPort)SwingUtilities.getAncestorOfClass(DockingPort.class, dockable); sourcePort = DockingManager.getDockingPort(dockable); started = -1; } private Point calculateMouseOffset(Point evtPoint) { if(evtPoint==null) return null; Point dockableLoc = dockable.getLocationOnScreen(); SwingUtilities.convertPointToScreen(evtPoint, dragSource); Point offset = new Point(); offset.x = dockableLoc.x - evtPoint.x; offset.y = dockableLoc.y - evtPoint.y; return offset; } public Component getDockable() { return dockable; } public Dockable getDockableReference() { if(dockableRef==null) dockableRef = DockingManager.getDockable(dockable); return dockableRef; } public Point getMouseOffset() { return (Point)mouseOffset.clone(); } public void updateMouse(MouseEvent me) { if(me!=null && me.getSource()==dragSource) currentMouse = me.getPoint(); } public Point getCurrentMouse() { return getCurrentMouse(false); } public Point getCurrentMouse(boolean relativeToScreen) { Point p = (Point)currentMouse.clone(); if(relativeToScreen) SwingUtilities.convertPointToScreen(p, dragSource); return p; } public Rectangle getDragRect(boolean relativeToScreen) { Point p = getCurrentMouse(relativeToScreen); Point offset = getMouseOffset(); p.x += offset.x; p.y += offset.y; Rectangle r = new Rectangle(getDragSize()); r.setLocation(p); return r; } public Point getCurrentMouse(Component target) { if(target==null || !target.isVisible()) return null; return SwingUtilities.convertPoint(dragSource, currentMouse, target); } public Dimension getDragSize() { return ((Component)dockable).getSize(); } public Component getDragSource() { return dragSource; } public void setTarget(DockingPort port, String region) { targetPort = port; targetRegion = region==null? UNKNOWN_REGION: region; } public DockingPort getTargetPort() { return targetPort; } public String getTargetRegion() { return targetRegion; } public EventListener[] getCachedListeners() { return cachedListeners==null? new EventListener[0]: cachedListeners; } public void setCachedListeners(EventListener[] listeners) { cachedListeners = listeners; } public DragManager getDragListener() { return dragListener; } public void setDragListener(DragManager listener) { this.dragListener = listener; } public boolean isOverWindow() { return overWindow; } public void setOverWindow(boolean overWindow) { this.overWindow = overWindow; } public boolean isPseudoDrag() { return pseudoDrag; } public DockingPort getParentDockingPort() { return parentDockingPort; } public void start() { if(started==-1) started = System.currentTimeMillis(); } public long getStartTime() { return started; } public DockingPort getSourcePort() { return sourcePort; } }flexdock-1.2.4/src/java/core/org/flexdock/docking/drag/DragPipeline.java0000644000175000017500000002357112177715062027006 0ustar sylvestresylvestrepackage org.flexdock.docking.drag; import java.awt.Component; import java.awt.EventQueue; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashMap; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingPort; import org.flexdock.docking.defaults.DefaultDockingPort; import org.flexdock.docking.drag.effects.EffectsManager; import org.flexdock.docking.drag.effects.RubberBand; import org.flexdock.util.RootWindow; import org.flexdock.util.SwingUtility; import org.flexdock.util.Utilities; public class DragPipeline { private GlassPaneMonitor paneMonitor; private RootWindow[] windows; private HashMap rootWindowsByBounds; private DragGlasspane currentGlasspane; private DragGlasspane newGlassPane; private Rectangle[] windowBounds; private boolean heavyweightDockableSupportted; private boolean open; private DragOperation dragToken; private RubberBand rubberBand; public DragPipeline() { paneMonitor = new GlassPaneMonitor(); rubberBand = EffectsManager.getRubberBand(); } public boolean isOpen() { return open; } public void open(DragOperation token) { if(token==null) throw new NullPointerException("'token' parameter cannot be null."); if(EventQueue.isDispatchThread()) { openImpl(token); return; } final DragOperation dToken = token; try { EventQueue.invokeAndWait(new Runnable() { public void run() { openImpl(dToken); } }); } catch(Exception e) { System.err.println("Exception: " +e.getMessage()); } } private void openImpl(DragOperation operation) { // check to see if we're going to support heavyweight dockables for this operation heavyweightDockableSupportted = Boolean.getBoolean(DockingConstants.HEAVYWEIGHT_DOCKABLES); this.dragToken = operation; // turn the current drag operation on setCurrentDragOperation(operation); windows = RootWindow.getVisibleWindows(); windowBounds = new Rectangle[windows.length]; rootWindowsByBounds = new HashMap(); for(int i=0; iDockable was * originally docked to. * * @return DockingPort the old docking port */ public DockingPort getOldDockingPort() { return oldPort; } /** * Returns the new docking port the source Dockable has been * docked to. * * @return DockingPort the new docking port */ public DockingPort getNewDockingPort() { return newPort; } public boolean isConsumed() { return consumed; } public void consume() { this.consumed = true; } public AWTEvent getTrigger() { return trigger; } public void setTrigger(AWTEvent trigger) { this.trigger = trigger; } public Object getTriggerSource() { return trigger == null ? null : trigger.getSource(); } public String getRegion() { return region; } public void setRegion(String region) { if (!DockingManager.isValidDockingRegion(region)) region = UNKNOWN_REGION; this.region = region; } public boolean isOverWindow() { return overWindow; } public void setOverWindow(boolean overWindow) { this.overWindow = overWindow; } public Dockable getDockable() { return (Dockable)getSource(); } public Component getComponent() { return getDockable().getComponent(); } public Map getDragContext() { return dragContext; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/event/DockingEventHandler.java0000644000175000017500000000531412177715062030520 0ustar sylvestresylvestre/* * Created on May 18, 2005 */ package org.flexdock.docking.event; import java.util.EventListener; import java.util.Vector; import org.flexdock.docking.Dockable; import org.flexdock.event.Event; import org.flexdock.event.EventHandler; /** * @author Christopher Butler */ public class DockingEventHandler extends EventHandler { private static final String DOCKING_LISTENERS_KEY = "EventManager.DOCKING_LISTENERS_KEY"; public static DockingListener[] getDockingListeners(Dockable dockable) { Vector list = getDockingListenersList(dockable); return list==null? null: (DockingListener[])list.toArray(new DockingListener[0]); } public static void addDockingListener(Dockable dockable, DockingListener listener) { if(dockable!=null && listener!=null) { getDockingListenersList(dockable).add(listener); } } public static void removeDockingListener(Dockable dockable, DockingListener listener) { if(dockable!=null && listener!=null) { getDockingListenersList(dockable).remove(listener); } } private static Vector getDockingListenersList(Dockable dockable) { if(dockable==null) return null; Vector list = (Vector)dockable.getClientProperty(DOCKING_LISTENERS_KEY); if(list==null) { list = new Vector(); dockable.putClientProperty(DOCKING_LISTENERS_KEY, list); } return list; } public boolean acceptsEvent(Event evt) { return evt instanceof DockingEvent; } public boolean acceptsListener(EventListener listener) { return listener instanceof DockingListener; } public void handleEvent(Event evt, EventListener listener, int eventType) { DockingEvent event = (DockingEvent)evt; DockingListener consumer = (DockingListener)listener; switch(event.getEventType()) { case DockingEvent.DRAG_STARTED: consumer.dragStarted(event); break; case DockingEvent.DROP_STARTED: consumer.dropStarted(event); break; case DockingEvent.DOCKING_COMPLETE: consumer.dockingComplete(event); break; case DockingEvent.DOCKING_CANCELED: consumer.dockingCanceled(event); break; case DockingEvent.UNDOCKING_COMPLETE: consumer.undockingComplete(event); break; case DockingEvent.UNDOCKING_STARTED: consumer.undockingStarted(event); break; } } public EventListener[] getListeners(Object eventTarget) { return eventTarget instanceof DockingMonitor? ((DockingMonitor)eventTarget).getDockingListeners(): null; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/event/DockingListener.java0000644000175000017500000000371112177715062027725 0ustar sylvestresylvestre/* * Created on Mar 8, 2005 */ package org.flexdock.docking.event; import java.util.EventListener; /** * @author Kevin Duffey * @author Christopher Butler */ public interface DockingListener extends EventListener { /** * Fired when docking of a Dockable has completed. * * @param evt * the DockingEvent event which provides the * source Dockable, the old DockingPort and the new DockingPort */ void dockingComplete(DockingEvent evt); /** * Fired when docking of a Dockable is canceled during the operation. * * @param evt * the DockingEvent event which provides the * source Dockable, the old DockingPort and the new DockingPort */ void dockingCanceled(DockingEvent evt); /** * Fired when the dragging of a Dockable has begun. * * @param evt * the DockingEvent event which provides the * source Dockable, the old DockingPort and the new DockingPort */ void dragStarted(DockingEvent evt); /** * Fired when the dropping of a Dockable has begun at the release * of a drag-operation. * * @param evt * the DockingEvent event which provides the * source Dockable, the old DockingPort and the new DockingPort */ void dropStarted(DockingEvent evt); void undockingComplete(DockingEvent evt); void undockingStarted(DockingEvent evt); class Stub implements DockingListener { public void dockingCanceled(DockingEvent evt) {} public void dockingComplete(DockingEvent evt) {} public void dragStarted(DockingEvent evt) {} public void dropStarted(DockingEvent evt) {} public void undockingComplete(DockingEvent evt) {} public void undockingStarted(DockingEvent evt) {} } }flexdock-1.2.4/src/java/core/org/flexdock/docking/event/DockingMonitor.java0000644000175000017500000000046312177715062027570 0ustar sylvestresylvestre/* * Created on Mar 10, 2005 */ package org.flexdock.docking.event; /** * @author Christopher Butler */ public interface DockingMonitor { void addDockingListener(DockingListener listener); void removeDockingListener(DockingListener listener); DockingListener[] getDockingListeners(); } flexdock-1.2.4/src/java/core/org/flexdock/docking/event/TabbedDragListener.java0000644000175000017500000000344112177715062030326 0ustar sylvestresylvestre/* * Created on Apr 2, 2005 */ package org.flexdock.docking.event; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.JTabbedPane; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; import org.flexdock.docking.drag.DragManager; /** * @author Christopher Butler */ public class TabbedDragListener extends MouseAdapter implements MouseMotionListener { private DragManager dragListener; public void mouseDragged(MouseEvent me) { if(dragListener!=null) dragListener.mouseDragged(me); } public void mouseReleased(MouseEvent me) { if(dragListener!=null) dragListener.mouseReleased(me); dragListener = null; } public void mousePressed(MouseEvent me) { if(!(me.getSource() instanceof JTabbedPane)) { dragListener = null; return; } JTabbedPane pane = (JTabbedPane)me.getSource(); Point p = me.getPoint(); int tabIndex = pane.indexAtLocation(p.x, p.y); if(tabIndex==-1) { dragListener = null; return; } Dockable dockable = DockingManager.getDockable(pane.getComponentAt(tabIndex)); dragListener = DockingManager.getDragListener(dockable); if(dragListener!=null) dragListener.mousePressed(me); } public void mouseMoved(MouseEvent me) { // does nothing } // private void redispatchToDockable(MouseEvent me) { ////if(!tabsAsDragSource || dockable==null) ////return; // ////Component dragSrc = dockable.getInitiator(); ////MouseEvent evt = SwingUtilities.convertMouseEvent((Component)me.getSource(), me, dragSrc); ////dragSrc.dispatchEvent(evt); // } } flexdock-1.2.4/src/java/core/org/flexdock/docking/event/hierarchy/0000755000175000017500000000000012177715062025752 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/docking/event/hierarchy/DockingPortTracker.java0000644000175000017500000001632512177715062032363 0ustar sylvestresylvestre/* * Created on Apr 27, 2005 */ package org.flexdock.docking.event.hierarchy; import java.applet.Applet; import java.awt.Component; import java.awt.Container; import java.awt.Window; import java.awt.event.HierarchyEvent; import java.awt.event.HierarchyListener; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.WeakHashMap; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.util.RootWindow; /** * @author Christopher Butler * @author Karl Schaefer */ public class DockingPortTracker implements HierarchyListener { private static final DockingPortTracker SINGLETON = new DockingPortTracker(); private static WeakHashMap TRACKERS_BY_WINDOW = new WeakHashMap(); private static WeakHashMap DOCKING_PORTS = new WeakHashMap(); private static final Object NULL = new Object(); public static HierarchyListener getInstance() { return SINGLETON; } public static void remove(Component c) { RootWindow window = RootWindow.getRootContainer(c); if (window != null) { synchronized(TRACKERS_BY_WINDOW) { TRACKERS_BY_WINDOW.remove(window); } } } public static RootDockingPortInfo getRootDockingPortInfo(Component c) { RootWindow window = RootWindow.getRootContainer(c); return getRootDockingPortInfo(window); } public static RootDockingPortInfo getRootDockingPortInfo(RootWindow window) { if(window==null) return null; RootDockingPortInfo info = (RootDockingPortInfo)TRACKERS_BY_WINDOW.get(window); if(info==null) { synchronized(TRACKERS_BY_WINDOW) { info = new RootDockingPortInfo(window); TRACKERS_BY_WINDOW.put(window, info); } } return info; } public static DockingPort findById(String portId) { if(portId==null) return null; synchronized(TRACKERS_BY_WINDOW) { for(Iterator it=TRACKERS_BY_WINDOW.values().iterator(); it.hasNext();) { RootDockingPortInfo info = (RootDockingPortInfo)it.next(); DockingPort port = info.getPort(portId); if(port!=null) return port; } } return null; } private static RootDockingPortInfo findInfoByPort(DockingPort port) { if(port==null) return null; synchronized(TRACKERS_BY_WINDOW) { for(Iterator it=TRACKERS_BY_WINDOW.values().iterator(); it.hasNext();) { RootDockingPortInfo info = (RootDockingPortInfo)it.next(); if(info.contains(port)) return info; } } return null; } /** * Returns the {@code DockingPort} for {@code comp}. If {@code comp} is * {@code null}, then this method returns {@code null}. * * @param comp * the component for which to find the root docking port. * @return the eldest docking port for {@code comp}, or {@code null} if * {@code comp} is {@code null} or has no {@code DockingPort} * ancestor. */ public static DockingPort findByWindow(Component comp) { Component c = comp; DockingPort port = null; while (c != null) { if (c instanceof DockingPort) { port = (DockingPort) c; } c = c.getParent(); } if (port == null) { port = findByWindow(RootWindow.getRootContainer(comp)); } return port; } public static DockingPort findByWindow(RootWindow window) { RootDockingPortInfo info = getRootDockingPortInfo(window); if(info==null) return null; return info.getPort(0); } public static void updateIndex(DockingPort port) { if(port==null) return; synchronized(DOCKING_PORTS) { DOCKING_PORTS.put(port, NULL); } RootDockingPortInfo info = findInfoByPort(port); if(info!=null) { info.remove(port); info.add(port); } } private boolean isParentChange(HierarchyEvent evt) { if(evt.getID()!=HierarchyEvent.HIERARCHY_CHANGED || evt.getChangeFlags()!=HierarchyEvent.PARENT_CHANGED) return false; return true; } private boolean isRemoval(HierarchyEvent evt) { return evt.getChanged().getParent()==null; } public void hierarchyChanged(HierarchyEvent evt) { // only work with DockingPorts if(!(evt.getSource() instanceof DockingPort)) return; // we don't want to work with sub-ports DockingPort port = (DockingPort)evt.getSource(); if(!port.isRoot()) return; // only work with parent-change events if(!isParentChange(evt)) return; // root-ports are tracked by window. if we can't find a parent window, then we // can track the dockingport. Container changedParent = evt.getChangedParent(); RootWindow window = RootWindow.getRootContainer(changedParent); if(window==null) return; boolean removal = isRemoval(evt); if(removal) dockingPortRemoved(window, port); else dockingPortAdded(window, port); } public void dockingPortAdded(RootWindow window, DockingPort port) { RootDockingPortInfo info = getRootDockingPortInfo(window); if(info!=null) info.add(port); } public void dockingPortRemoved(RootWindow window, DockingPort port) { RootDockingPortInfo info = getRootDockingPortInfo(window); if(info!=null) info.remove(port); } public static Set getDockingWindows() { synchronized(TRACKERS_BY_WINDOW) { return new HashSet(TRACKERS_BY_WINDOW.keySet()); } } public static Set getDockingPorts() { Set globalSet = new HashSet(); synchronized(DOCKING_PORTS) { for(Iterator it=DOCKING_PORTS.keySet().iterator(); it.hasNext();) { Object obj = it.next(); globalSet.add(obj); } } return globalSet; } public static Set getRootDockingPorts() { HashSet rootSet = new HashSet(); Set globalSet = getDockingPorts(); for(Iterator it=globalSet.iterator(); it.hasNext();) { DockingPort port = (DockingPort)it.next(); if(port.isRoot()) rootSet.add(port); } return rootSet; } public static DockingPort getRootDockingPort(Dockable dockable) { if(dockable==null || !DockingManager.isDocked(dockable)) return null; DockingPort port = dockable.getDockingPort(); Container parent = ((Component)port).getParent(); while(!isWindowRoot(parent)) { if(parent instanceof DockingPort) port = (DockingPort)parent; parent = parent.getParent(); } return port; } private static boolean isWindowRoot(Component comp) { return comp instanceof Window || comp instanceof Applet; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/event/hierarchy/RootDockingPortInfo.java0000644000175000017500000000500112177715062032514 0ustar sylvestresylvestre/* * Created on Apr 28, 2005 */ package org.flexdock.docking.event.hierarchy; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import org.flexdock.docking.DockingPort; import org.flexdock.util.RootWindow; /** * @author Christopher Butler */ public class RootDockingPortInfo { private WeakReference windowRef; private ArrayList rootPorts; private HashMap portsById; private String mainPortId; public RootDockingPortInfo(RootWindow window) { windowRef = new WeakReference(window); rootPorts = new ArrayList(2); portsById = new HashMap(2); } public RootWindow getWindow() { return (RootWindow)windowRef.get(); } private boolean containsPortId(DockingPort port) { return port==null? false: contains(port.getPersistentId()); } public boolean contains(String portId) { return portId==null? false: portsById.containsKey(portId); } public boolean contains(DockingPort port) { return port==null? false: portsById.containsValue(port); } public synchronized void add(DockingPort port) { if(containsPortId(port)) return; portsById.put(port.getPersistentId(), port); rootPorts.add(port); } public synchronized void remove(DockingPort port) { if(port==null) return; String key = port.getPersistentId(); if(!contains(key)) { key = null; for(Iterator it=portsById.keySet().iterator(); it.hasNext();) { String tmpKey = (String)it.next(); DockingPort tmp = (DockingPort)portsById.get(tmpKey); if(tmp==port) { key = tmpKey; break; } } } if(key!=null) portsById.remove(key); rootPorts.remove(port); } public int getPortCount() { return rootPorts.size(); } public DockingPort getPort(int indx) { return indx0? getPort(0): null; } return port; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/floating/0000755000175000017500000000000012177715062024456 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/docking/floating/frames/0000755000175000017500000000000012177715062025733 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/docking/floating/frames/DockingFrame.java0000644000175000017500000001161012177715062031126 0ustar sylvestresylvestre/* * Copyright (c) 2004 Andreas Ernst * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.flexdock.docking.floating.frames; import java.applet.Applet; import java.awt.Component; import java.awt.Dialog; import java.awt.Frame; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.JDialog; import javax.swing.JRootPane; import javax.swing.SwingUtilities; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.state.FloatingGroup; import org.flexdock.util.RootWindow; /** * @author Andreas Ernst * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class DockingFrame extends JDialog implements DockingConstants { private static final BoundsMonitor BOUNDS_MONITOR = new BoundsMonitor(); private FloatingDockingPort dockingPort; private String groupName; public static DockingFrame create(Component c, String groupName) { RootWindow rootWin = RootWindow.getRootContainer(c); Component window = rootWin.getRootContainer(); if (window instanceof DockingFrame) { window = ((DockingFrame) window).getOwner(); } //Applets are actually contained in a frame if (window instanceof Applet) window = SwingUtilities.windowForComponent(window); if (window instanceof Frame) return new DockingFrame((Frame) window, groupName); if (window instanceof Dialog) return new DockingFrame((Dialog) window, groupName); return null; } // constructor public DockingFrame(Frame owner, String groupName) { super(owner); initialize(groupName); } public DockingFrame(Dialog owner, String groupName) { super(owner); initialize(groupName); } // private private void initialize(String groupName) { setUndecorated(true); getRootPane().setWindowDecorationStyle(JRootPane.NONE); // TODO I am not sure null should be passed here, // maybe we should use our IDPersistentIdProvider dockingPort = new FloatingDockingPort(this, null); setContentPane(dockingPort); this.groupName = groupName; addComponentListener(BOUNDS_MONITOR); } // override protected JRootPane createRootPane() { return new RootPane(this); } public DockingPort getDockingPort() { return dockingPort; } public void addDockable(Dockable dockable) { if (dockable == null) return; dockingPort.dock(dockable, CENTER_REGION); } public void destroy() { setVisible(false); dockingPort = null; FloatingGroup group = getGroup(); if (group != null) group.setFrame(null); dispose(); } public String getGroupName() { return groupName; } public FloatingGroup getGroup() { return DockingManager.getFloatManager().getGroup(getGroupName()); } private static class BoundsMonitor implements ComponentListener { public void componentHidden(ComponentEvent e) { // noop } public void componentMoved(ComponentEvent e) { updateBounds(e); } public void componentResized(ComponentEvent e) { updateBounds(e); } public void componentShown(ComponentEvent e) { updateBounds(e); } private void updateBounds(ComponentEvent evt) { Component c = (Component) evt.getComponent(); if (!(c instanceof DockingFrame)) return; DockingFrame frame = (DockingFrame) c; FloatingGroup group = frame.getGroup(); if (group != null) group.setBounds(frame.getBounds()); } } } flexdock-1.2.4/src/java/core/org/flexdock/docking/floating/frames/FloatingDockingPort.java0000644000175000017500000000751012177715062032510 0ustar sylvestresylvestre/* * Created on Mar 10, 2005 */ package org.flexdock.docking.floating.frames; import java.awt.Component; import java.awt.Point; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import javax.swing.JTabbedPane; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; import org.flexdock.docking.defaults.DefaultDockingPort; import org.flexdock.docking.event.DockingEvent; /** * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class FloatingDockingPort extends DefaultDockingPort { private static final Set EMPTY_SET = new HashSet(0); protected DockingFrame frame; protected FrameDragListener dragListener; public FloatingDockingPort(DockingFrame frame, String persistentId) { super(persistentId); getDockingProperties().setSingleTabsAllowed(true); setTabsAsDragSource(true); this.frame = frame; dragListener = new FrameDragListener(frame); } public String getRegion(Point p) { // only allow docking in CENTER return CENTER_REGION; } public boolean isDockingAllowed(String region, Component comp) { // only allow docking in CENTER if(!CENTER_REGION.equals(region)) return false; return super.isDockingAllowed(comp, region); } public boolean dock(Dockable dockable, String region) { // only dock to the CENTER region boolean ret = super.dock(dockable, CENTER_REGION); if(ret) { toggleListeners(dockable.getComponent(), true); } return ret; } public boolean undock(Component comp) { boolean ret = super.undock(comp); if(ret) toggleListeners(comp, false); return ret; } public void dragStarted(DockingEvent evt) { super.dragStarted(evt); Component dragSrc = (Component)evt.getTriggerSource(); Dockable dockable = (Dockable)evt.getSource(); boolean listenerEnabled = getFrameDragSources(dockable).contains(dragSrc); dragListener.setEnabled(listenerEnabled); if(listenerEnabled) { evt.consume(); } } public void undockingComplete(DockingEvent evt) { super.undockingComplete(evt); if(evt.getOldDockingPort()==this && getDockableCount()==0) { frame.destroy(); frame = null; } } protected void toggleListeners(Component comp, boolean add) { Dockable dockable = DockingManager.getDockable(comp); if(add) installListeners(dockable); else uninstallListeners(dockable); } protected void installListeners(Dockable dockable) { Set frameDraggers = getFrameDragSources(dockable); for(Iterator it=frameDraggers.iterator(); it.hasNext();) { Component frameDragSrc = (Component)it.next(); frameDragSrc.addMouseListener(dragListener); frameDragSrc.addMouseMotionListener(dragListener); } dockable.addDockingListener(this); } protected void uninstallListeners(Dockable dockable) { Set frameDraggers = getFrameDragSources(dockable); for(Iterator it=frameDraggers.iterator(); it.hasNext();) { Component frameDragSrc = (Component)it.next(); frameDragSrc.removeMouseListener(dragListener); frameDragSrc.removeMouseMotionListener(dragListener); } dockable.removeDockingListener(this); } public int getDockableCount() { Component comp = getDockedComponent(); if(!(comp instanceof JTabbedPane)) return 0; return ((JTabbedPane)comp).getTabCount(); } protected Set getFrameDragSources(Dockable dockable) { Set set = dockable==null? null: dockable.getFrameDragSources(); return set==null? EMPTY_SET: set; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/floating/frames/FrameDragListener.java0000644000175000017500000000302612177715062032135 0ustar sylvestresylvestre/* * Created on May 3, 2005 */ package org.flexdock.docking.floating.frames; import java.awt.Component; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.SwingUtilities; import org.flexdock.util.SwingUtility; /** * @author Christopher Butler */ public class FrameDragListener implements MouseListener, MouseMotionListener { private Point dragOffset; private DockingFrame frame; private boolean enabled; public FrameDragListener(DockingFrame frame) { this.frame = frame; } public void mouseMoved(MouseEvent e) { // noop } public void mousePressed(MouseEvent e) { dragOffset = e.getPoint(); Component c = (Component)e.getSource(); if(c!=frame) dragOffset = SwingUtilities.convertPoint(c, dragOffset, frame); } public void mouseDragged(MouseEvent e) { if(enabled) { Point loc = e.getPoint(); SwingUtilities.convertPointToScreen(loc, (Component)e.getSource()); SwingUtility.subtract(loc, dragOffset); frame.setLocation(loc); } } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/floating/frames/RootPane.java0000644000175000017500000002427412177715062030336 0ustar sylvestresylvestre/* Copyright (c) 2004 Andreas Ernst Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.flexdock.docking.floating.frames; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JRootPane; import javax.swing.SwingUtilities; /** * @author Andreas Ernst * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class RootPane extends JRootPane implements MouseListener, MouseMotionListener { private static int CORNER_MARGIN = 5; // instance data private int currentResizeRegion; private Rectangle mMouseLimits; private Cursor mLastCursor; private Point offset; private DockingFrame frame; // constructor RootPane(DockingFrame frame) { this.frame = frame; setBorder(new RootPaneBorder()); addMouseListener(this); addMouseMotionListener(this); offset = new Point(); } // private void ensureValidScreenBounds(Point attemptedPoint) { // 'attemptedPoint' is the current "attempted" mousepoint based off of a drag-event. // here, we check to see if the attempted mousepoint exceeds our valid minimum frame // bounds such that 'attemptedPoint' logically expresses a new frame-rect which // is smaller than the accepted minimum bounds for our frame. if 'attemptedPoint' // exceeds any of these bounds, we adjust the values to match the ceiling/floor // of the acceptable frame-rect appropriately before returning and actually resizing // the frame. // x if (attemptedPoint.x < mMouseLimits.x) attemptedPoint.x = mMouseLimits.x; else if (attemptedPoint.x > (mMouseLimits.x + mMouseLimits.width)) attemptedPoint.x = mMouseLimits.x + mMouseLimits.width; // y if (attemptedPoint.y < mMouseLimits.y) attemptedPoint.y = mMouseLimits.y; else if (attemptedPoint.y > (mMouseLimits.y + mMouseLimits.height)) attemptedPoint.y = mMouseLimits.y + mMouseLimits.height; } void computeMouseLimits(Point p) { // Called at the very start of a drag operation on the pane edges, not // repeatedly during the drag. This method computes two things: // 1) The acceptable mouse limits (Rectangle) during the drag. These have // different meanings, depending on which corner or edge is being dragged, // but generally translate into bounds that prevent us from doing things // like, for instance, dragging the SOUTH_EAST corner anywhere above the // NORTH or left of WEST frame edges (taking min-frame-size into account). // 2) The current mouse offset relative to the frame-edge about to be dragged. // Subsequent MOUSE_DRAGGED events will report the location of the mouse, // not the actual frame-edge. We will use this offset to translate from the // mouse to the frame-edge. Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); mMouseLimits = new Rectangle(0, 0, screenSize.width, screenSize.height); Rectangle currFrameRect = frame.getBounds(); // in screen-coordinates Dimension minSize = getLayout().minimumLayoutSize(getParent()); int minWidth = minSize.width; int minHeight = minSize.height; switch (currentResizeRegion) { case Cursor.NW_RESIZE_CURSOR: mMouseLimits.width = currFrameRect.x + currFrameRect.width - minWidth - mMouseLimits.x; mMouseLimits.height = currFrameRect.y + currFrameRect.height - minHeight - mMouseLimits.y; offset.setLocation(-p.x, -p.y); break; case Cursor.N_RESIZE_CURSOR: mMouseLimits.height = currFrameRect.y + currFrameRect.height - minHeight - mMouseLimits.y; offset.setLocation(0, -p.y); break; case Cursor.NE_RESIZE_CURSOR: mMouseLimits.x = currFrameRect.x + minWidth; mMouseLimits.height = currFrameRect.y + currFrameRect.height - minHeight - mMouseLimits.y; offset.setLocation(getWidth() - p.x, -p.y); break; case Cursor.E_RESIZE_CURSOR: mMouseLimits.x = currFrameRect.x + minWidth; offset.setLocation(getWidth() - p.x, 0); break; case Cursor.SE_RESIZE_CURSOR: mMouseLimits.y = currFrameRect.y + minHeight; mMouseLimits.x = currFrameRect.x + minWidth; offset.setLocation(getWidth() - p.x, getHeight() - p.y); break; case Cursor.S_RESIZE_CURSOR: mMouseLimits.y = currFrameRect.y + minHeight; offset.setLocation(0, getHeight() - p.y); break; case Cursor.SW_RESIZE_CURSOR: mMouseLimits.y = currFrameRect.y + minHeight; mMouseLimits.width = currFrameRect.x + currFrameRect.width - minWidth - mMouseLimits.x; offset.setLocation(-p.x, getHeight() - p.y); break; case Cursor.W_RESIZE_CURSOR: mMouseLimits.width = currFrameRect.x + currFrameRect.width - minWidth - mMouseLimits.x; offset.setLocation(-p.x, 0); break; } // switch } private int getCursor(Point p) { Insets insets = getInsets(); // left if (p.x <= insets.left) { if (p.y <= CORNER_MARGIN) return Cursor.NW_RESIZE_CURSOR; else if (p.y >= getHeight() - CORNER_MARGIN) return Cursor.SW_RESIZE_CURSOR; else return Cursor.W_RESIZE_CURSOR; } // if // right else if (p.x >= getWidth() - insets.right) { if (p.y <= CORNER_MARGIN) return Cursor.NE_RESIZE_CURSOR; else if (p.y >= getHeight() - CORNER_MARGIN) return Cursor.SE_RESIZE_CURSOR; else return Cursor.E_RESIZE_CURSOR; } // if // top else if (p.y <= insets.top) { if (p.x <= CORNER_MARGIN) return Cursor.NW_RESIZE_CURSOR; else if (p.x >= getWidth() - CORNER_MARGIN) return Cursor.NE_RESIZE_CURSOR; else return Cursor.N_RESIZE_CURSOR; } // if // bottom else if (p.y >= getHeight() - insets.bottom) { if (p.x <= CORNER_MARGIN) return Cursor.SW_RESIZE_CURSOR; else if (p.x >= getWidth() - CORNER_MARGIN) return Cursor.SE_RESIZE_CURSOR; else return Cursor.S_RESIZE_CURSOR; } // if else return Cursor.DEFAULT_CURSOR; } // implement MouseListener, MouseMotionListener public void mousePressed(MouseEvent e) { currentResizeRegion = getCursor(e.getPoint()); computeMouseLimits(e.getPoint()); } public void mouseDragged(MouseEvent e) { if(currentResizeRegion==0) return; Point p = (Point) e.getPoint().clone(); p.x += offset.x; p.y += offset.y; SwingUtilities.convertPointToScreen(p, this); ensureValidScreenBounds(p); Rectangle bounds = frame.getBounds(); switch (currentResizeRegion) { case Cursor.NW_RESIZE_CURSOR: frame.setBounds(p.x, p.y, bounds.width + bounds.x - p.x, bounds.height + bounds.y - p.y); break; case Cursor.N_RESIZE_CURSOR: frame.setBounds(bounds.x, p.y, bounds.width, bounds.height + bounds.y - p.y); break; case Cursor.NE_RESIZE_CURSOR: frame.setBounds(bounds.x, p.y, p.x - bounds.x, bounds.height + bounds.y - p.y); break; case Cursor.W_RESIZE_CURSOR: frame.setBounds(p.x, bounds.y, bounds.x + bounds.width - p.x, bounds.height); break; case Cursor.E_RESIZE_CURSOR: frame.setBounds(bounds.x, bounds.y, p.x - bounds.x, bounds.height); break; case Cursor.SW_RESIZE_CURSOR: frame.setBounds(p.x, bounds.y, bounds.width + bounds.x - p.x, p.y - bounds.y); break; case Cursor.S_RESIZE_CURSOR: frame.setBounds(bounds.x, bounds.y, bounds.width, p.y - bounds.y); break; case Cursor.SE_RESIZE_CURSOR: frame.setBounds(bounds.x, bounds.y, p.x - bounds.x, p.y - bounds.y); break; } // switch setCursor(Cursor.getPredefinedCursor(currentResizeRegion)); frame.validate(); } public void mouseReleased(MouseEvent e) { currentResizeRegion = 0; } public void mouseMoved(MouseEvent e) { setCursor(Cursor.getPredefinedCursor(getCursor(e.getPoint()))); } public void mouseEntered(MouseEvent e) { if (currentResizeRegion == 0) // no dragging on! mLastCursor = getCursor(); } public void mouseExited(MouseEvent e) { setCursor(mLastCursor); } // defaults public void mouseClicked(MouseEvent e) { } protected LayoutManager createRootLayout() { return new RootPaneLayout(this); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/floating/frames/RootPaneBorder.java0000644000175000017500000000567612177715062031501 0ustar sylvestresylvestre/* Copyright (c) 2004 Andreas Ernst Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.flexdock.docking.floating.frames; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Insets; import javax.swing.border.Border; /** * @author Andreas Ernst * @author Christopher Butler * */ public class RootPaneBorder implements Border { public Insets getBorderInsets(Component c) { return new Insets(3, 3, 3, 3); } // implement Border public boolean isBorderOpaque() { return false; } public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { RootPane pane = (RootPane)c; Color background = pane.getBackground(); Color darker = pane.getBackground().darker(); Color evenDarker = darker.darker(); Color brighter = pane.getBackground().brighter(); g.setColor(background); // brighter top g.drawLine(x, y, x + width, y); g.drawLine(x, y + 2, x + width, y + 2); g.setColor(brighter); g.drawLine(x + 1, y + 1, x + width - 1, y + 1); // left g.setColor(background); g.drawLine(x, y + 1, x, y + height); g.drawLine(x + 2, y + 2, x + 2, y + height); g.setColor(brighter); g.drawLine(x + 1, y + 2, x + 1, y + height); // bottom g.setColor(background); g.drawLine(x + 2, y + height - 3, x + width - 4, y + height - 3); g.setColor(darker); g.drawLine(x + 1, y + height - 2, x + width - 2, y + height - 2); g.setColor(evenDarker); g.drawLine(x, y + height - 1, x + width, y + height - 1); // right g.setColor(background); g.drawLine(x + width - 3, y + 2, x + width - 3, y + height - 4); g.setColor(darker); g.drawLine(x + width - 2, y + 1, x + width - 2, y + height - 2); g.setColor(evenDarker); g.drawLine(x + width - 1, y, x + width - 1, y + height); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/floating/frames/RootPaneLayout.java0000644000175000017500000001215512177715062031527 0ustar sylvestresylvestre/* Copyright (c) 2004 Andreas Ernst Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.flexdock.docking.floating.frames; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Insets; import java.awt.LayoutManager2; import java.awt.Rectangle; import java.io.Serializable; import javax.swing.JLayeredPane; /** * @author Andreas Ernst * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class RootPaneLayout implements LayoutManager2, Serializable { private RootPane pane; // implement RootPaneLayout(RootPane pane) { this.pane = pane; } public Dimension preferredLayoutSize(Container parent) { Insets insets = pane.getInsets(); int preferredWidth = 0; int preferredHeight = 0; // content pane Container contentPane = pane.getContentPane(); if (contentPane != null) { preferredWidth = contentPane.getPreferredSize().width; preferredHeight = contentPane.getPreferredSize().height; } // if else { preferredWidth = parent.getSize().width; preferredHeight = parent.getSize().height; } // else // title // done return new Dimension(preferredWidth + insets.left + insets.right, preferredHeight + insets.top + insets.bottom); } public Dimension minimumLayoutSize(Container parent) { Insets insets = pane.getInsets(); int minimumWidth = 0; int minimumHeight = 0; // content pane Container contentPane = pane.getContentPane(); if (contentPane != null) { minimumWidth = contentPane.getMinimumSize().width; minimumHeight = contentPane.getMinimumSize().height; } // if else { minimumWidth = parent.getSize().width; minimumHeight = parent.getSize().height; } // else // done return new Dimension(minimumWidth + insets.left + insets.right, minimumHeight + insets.top + insets.bottom); } public Dimension maximumLayoutSize(Container target) { Dimension rd, mbd; Insets i = pane.getInsets(); mbd = new Dimension(0, 0); Container contentPane = pane.getContentPane(); if (contentPane != null) { rd = contentPane.getMaximumSize(); } else { // This is silly, but should stop an overflow error rd = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE - i.top - i.bottom - mbd.height - 1); } return new Dimension(Math.min(rd.width, mbd.width) + i.left + i.right, rd.height + mbd.height + i.top + i.bottom); } // layout engine... public void layoutContainer(Container parent) { Rectangle bounds = parent.getBounds(); Insets insets = pane.getInsets(); // substract insets int w = bounds.width - insets.right - insets.left; int h = bounds.height - insets.top - insets.bottom; JLayeredPane layeredPane = pane.getLayeredPane(); if (layeredPane != null) layeredPane.setBounds(insets.left, insets.top, w, h); // x, y, w, h Component glassPane = pane.getGlassPane(); if (glassPane != null) glassPane.setBounds(insets.left, insets.top, w, h); // Note: This is laying out the children in the layeredPane, // technically, these are not our children. int contentY = 0; Container contentPane = pane.getContentPane(); if (contentPane != null) contentPane.setBounds(0, contentY, w, h - contentY); // x, y, w, h } // more... public void addLayoutComponent(String name, Component comp) { } public void removeLayoutComponent(Component comp) { } public void addLayoutComponent(Component comp, Object constraints) { } public float getLayoutAlignmentX(Container target) { return 0.0f; } public float getLayoutAlignmentY(Container target) { return 0.0f; } public void invalidateLayout(Container target) { } } flexdock-1.2.4/src/java/core/org/flexdock/docking/floating/policy/0000755000175000017500000000000012177715062025755 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/docking/floating/policy/DefaultFloatPolicy.java0000644000175000017500000000772112177715062032361 0ustar sylvestresylvestre/* * Created on May 31, 2005 */ package org.flexdock.docking.floating.policy; import java.util.Set; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingPort; import org.flexdock.docking.event.DockingEvent; import org.flexdock.docking.floating.frames.FloatingDockingPort; import org.flexdock.docking.floating.policy.FloatPolicy.NullFloatPolicy; /** * This class provides an implementation of the {@code FloatPolicy} interface to * provide default behavior for the framework. It blocks floating operations for * {@code Dockables} without any frame drag sources, for already floating * {@code Dockables} that cannot be reparented within a new dialog, or if global * floating support has been disabled. * * @author Christopher Butler */ public class DefaultFloatPolicy extends NullFloatPolicy { private static final DefaultFloatPolicy SINGLETON = new DefaultFloatPolicy(); /** * Returns a singleton instance of {@code DefaultFloatPolicy}. * * @return a singleton instance of {@code DefaultFloatPolicy}. */ public static DefaultFloatPolicy getInstance() { return SINGLETON; } /** * Checks the previous {@code DockingPort} for the specified * {@code DockingEvent} and returns {@code false} if it is in a floating * dialog and contains less than two {@code Dockables}. A floating dialog * may contain multiple {@code Dockables}, each of which may be dragged out * of the current dialog to float in their own dialog. However, if a * floating dialog only contains a single {@code Dockable}, it makes no * sense to remove the {@code Dockable} only to float it within another * dialog. This situation is caught by this method and the docking operation * is blocked. * * @param evt * the {@code DockingEvent} to be checked for drop-to-float * support * @return {@code false} if the {@code DockingEvent} is attempting to float * an already floating {@code Dockable} with no other * {@code Dockables} in its current dialog; {@code true} otherwise. * @see FloatPolicy#isFloatDropAllowed(DockingEvent) * @see DockingEvent#getOldDockingPort() * @see FloatingDockingPort#getDockableCount() * @see DockingEvent#consume() */ public boolean isFloatDropAllowed(DockingEvent evt) { DockingPort oldPort = evt.getOldDockingPort(); // if we're already floating, and we're the only dockable // in a floating dockingport, then we don't want to undock // from the port and re-float (dispose and create a new DockingFrame). if (oldPort instanceof FloatingDockingPort) { FloatingDockingPort dockingPort = (FloatingDockingPort) oldPort; if (dockingPort.getDockableCount() < 2) { evt.consume(); return false; } } return super.isFloatDropAllowed(evt); } /** * Blocks floating support (returns false) if {@code dockable} is * {@code null}, if {@code FloatPolicyManager.isGlobalFloatingEnabled()} * returns {@code false}, or if there are no entries within the {@code Set} * returned by {@code dockable.getFrameDragSources()}. Otherwise, this * method returns {@code true}. * * @param dockable * the {@code Dockable} to be checked for floating support * @return {@code false} if floating is blocked for the specified * {@code Dockable}; {@code true} otherwise. * @see Dockable#getFrameDragSources() * @see FloatPolicyManager#isGlobalFloatingEnabled() */ public boolean isFloatingAllowed(Dockable dockable) { if (dockable == null || !FloatPolicyManager.isGlobalFloatingEnabled()) return false; Set frameDragSources = dockable.getFrameDragSources(); if (frameDragSources == null || frameDragSources.size() == 0) return false; return super.isFloatingAllowed(dockable); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/floating/policy/FloatPolicy.java0000644000175000017500000000524712177715062031055 0ustar sylvestresylvestre/* * Created on May 31, 2005 */ package org.flexdock.docking.floating.policy; import org.flexdock.docking.Dockable; import org.flexdock.docking.event.DockingEvent; /** * This interface describes a set of method used to determine how floating * events should be handled. Classes implementing this interface should be * plugged into to the {@code FloatPolicyManager} to affect floating behavior of * the framework at runtime. * * @author Christopher Butler */ public interface FloatPolicy { /** * Returns {@code true} if floating should be allowed for the specified * {@code Dockable}. This method will be invoked by the * {@code FloatPolicyManager} at the beginning of a drag operation to * determine whether or not floating support will be enabled for the * {@code Dockable} as a result of the drag. If this method returns * {@code false}, floating will not be allowed for the drag operation * against the specified {@code Dockable}. * * @param dockable * the {@code Dockable} to be checked for floating support * @return {@code true} if floating should be allowed for the specified * {@code Dockable}; {@code false} otherwise. */ boolean isFloatingAllowed(Dockable dockable); /** * Indicates whether floating should be allowed for the specified * {@code DockingEvent} at the end of a drag operation. The * {@code FloatPolicyManager} will catch all attempts to float a * {@code Dockable} at the end of a drag operation and invoke this method on * all installed {@code FloatPolicies}. If any of them returns * {@code false}, the docking operation will be canceled. * * @param evt * the {@code DockingEvent} to be checked for drop-to-float * support * @return {@code true} if floating should be allowed for the specified * {@code DockingEvent}; {@code false} otherwise. */ boolean isFloatDropAllowed(DockingEvent evt); /** * Provides a default implementation of the FloatPolicy interface. * * @author Christopher Butler */ class NullFloatPolicy implements FloatPolicy { /** * Returns {@code true}. * * @return {@code true}. * @see FloatPolicy#isFloatingAllowed(Dockable) */ public boolean isFloatingAllowed(Dockable dockable) { return true; } /** * Returns {@code true}. * * @return {@code true}. * @see FloatPolicy#isFloatDropAllowed(DockingEvent) */ public boolean isFloatDropAllowed(DockingEvent evt) { return true; } } } flexdock-1.2.4/src/java/core/org/flexdock/docking/floating/policy/FloatPolicyManager.java0000644000175000017500000003064512177715062032350 0ustar sylvestresylvestre/* * Created on May 31, 2005 */ package org.flexdock.docking.floating.policy; import java.util.Iterator; import java.util.Map; import java.util.Vector; import org.flexdock.docking.Dockable; import org.flexdock.docking.drag.DragManager; import org.flexdock.docking.event.DockingEvent; import org.flexdock.docking.event.DockingListener; /** * This class provides centralized control over the framework's floating * behavior. This includes global behavior and behavior local to each individual * docking operation. *

* This class contains a method {@code isGlobalFloatingEnabled()} that indicates * whether global floating support is enabled. If global floating support is * disabled, then the setting governs all docking operations and blocks floating * in a global sense. If global floating support is enabled, then floating is * allowed or disallowed on an individual operation-by-operation basis through a * set of {@code FloatPolicy} implementations. *

* The default setting for global floating support is {@code false}. This, * however, may be controlled by the system property {@code FLOATING_ALLOWED}. * If the framework starts up with a case-sensitive {@code String} value of * {@code "true"} for this system property, then global floating support will be * turned on by default. Otherwise, global floating support may be modified via * {@code setGlobalFloatingEnabled(boolean globalFloatingEnabled)}. *

* This class provides methods {@code addPolicy(FloatPolicy policy)} and * {@code removePolicy(FloatPolicy policy)}, allowing the user to implement * custom behavior to control floating support for individual docking operations * on an event-by-event basis. By default, the {@code FloatPolicyManager} has a * single {@code FloatPolicy} installed of type {@code DefaultFloatPolicy}. * * @author Christopher Butler */ public class FloatPolicyManager extends DockingListener.Stub { private static final FloatPolicyManager SINGLETON = new FloatPolicyManager(); /** * Key constant used within the drag context {@code Map} to indicate whether * floating is allowed for a given drag operation. * * @see DragManager#getDragContext(Dockable) */ public static final String FLOATING_ALLOWED = "FloatPolicyManager.FLOATING_ALLOWED"; /** * System property key used during framework initialization to determine the * default setting for global floating support. */ public static final String GLOBAL_FLOATING_ENABLED = "global.floating.enabled"; private Vector policies; private boolean globalFloatingEnabled; /** * Returns a singleton instance of the {@code FloatPolicyManager} class. * * @return a singleton instance of the {@code FloatPolicyManager} class. */ public static FloatPolicyManager getInstance() { return SINGLETON; } private FloatPolicyManager() { policies = new Vector(); addPolicy(DefaultFloatPolicy.getInstance()); globalFloatingEnabled = Boolean.getBoolean(GLOBAL_FLOATING_ENABLED); } /** * This method catches {@code DockingEvents} per the {@code DockingListener} * interface at the start of a drag operation and initializes floating * support within the the context {@code Map} of the drag operation. This * method retrieves the {@code Dockable} for the event via its * {@code getDockable()} method. It also retrieves the drag context * {@code Map} for the {@code DockingEvent} by invoking its * {@code getDragContext()} method. This map is the same {@code Map} * returned by {@code DragManager.getDragContext(Dockable dockable)}. It * then calls {@code isPolicyFloatingSupported(Dockable dockable)} for the * {@code Dockable} and places either {@code Boolean.TRUE} or * {@code Boolean.FALSE} within the drag context {@code Map}, caching the * value for use throughout the drag operation to avoid successive * iterations through the entire installed {@code FloatPolicy} collection. * The {@code Map}-key used is {@code FLOATING_ALLOWED}. * * @param evt * the {@code DockingEvent} whose drag context is to be * initialized for floating support * @see DockingEvent#getDragContext() * @see DockingEvent#getDockable() * @see #isPolicyFloatingSupported(Dockable) * @see #FLOATING_ALLOWED */ public void dragStarted(DockingEvent evt) { Map context = evt.getDragContext(); Dockable d = evt.getDockable(); Boolean allowed = isPolicyFloatingSupported(d) ? Boolean.TRUE : Boolean.FALSE; context.put(FLOATING_ALLOWED, allowed); } /** * This method catches {@code DockingEvents} per the {@code DockingListener} * interface at the end of a drag operation and determines whether or not to * block attempts to float within the docking operation. *

* If {@code evt.isOverWindow()} returns {@code true}, then the drop * operation is over an existing window and will be interpreted as an * attempt to dock within the window, not an attempt to float into a new * dialog. In this case, this method returns immediately with no action * taken. *

* This method calls {@code isFloatingAllowed(Dockable dockable)} using the * {@code DockingEvent's} {@code Dockable}, retrieved from * {@code getDockable()}. If this method returns {@code false}, then the * {@code DockingEvent} is consumed and this method returns. *

* If {@code isFloatingAllowed(Dockable dockable)} returns {@code true}, * then the internal {@code FloatPolicy} collection is iterated through, * allowing each installed {@code FloatPolicy} to confirm the drop operation * via {@code isFloatDropAllowed(DockingEvent evt)}. If any of the * installed {@code FloatPolicies} returns {@code false} for * {@code isFloatDropAllowed(DockingEvent evt)}, then the * {@code DockingEvent} is consumed and the method exits. *

* If this method completes without the {@code DockingEvent} being consumed, * then the docking operation will proceed and attempts to float will be * allowed. * * @param evt * the {@code DockingEvent} to be examined for floating support * @see DockingEvent#isOverWindow() * @see DockingEvent#getDockable() * @see DockingEvent#consume() * @see #isFloatingAllowed(Dockable) * @see FloatPolicy#isFloatDropAllowed(DockingEvent) */ public void dropStarted(DockingEvent evt) { if (evt.isOverWindow()) return; if (!isFloatingAllowed(evt.getDockable())) { evt.consume(); return; } for (Iterator it = policies.iterator(); it.hasNext();) { FloatPolicy policy = (FloatPolicy) it.next(); if (!policy.isFloatDropAllowed(evt)) { evt.consume(); return; } } } /** * Indicates whether floating is allowed for the specified {@code Dockable}. * If {@code dockable} is {@code null}, this method returns {@code false}. *

* This method first calls * {@code DragManager.getDragContext(Dockable dockable)} to see if a drag * operation is in progress. If so, it returns the {@code boolean} value * contained within the drag context map using the key * {@code FLOATING_ALLOWED}. If no mapping exists for the specified key, * this method returns {@code false}. *

* If no drag operation is currently in progress and no drag context can be * found, this method dispatches to * {@code isPolicyFloatingSupported(Dockable dockable)}, which iterates * through all installed {@code FloatPolicies} to determine whether floating * support is allowed. * * @param dockable * the {@code Dockable} whose floating support is to be checked * @return {@code true} if floating is allowed for the specified * {@code Dockable}; {@code false} otherwise. * @see DragManager#getDragContext(Dockable) * @see #getInstance() * @see #isPolicyFloatingSupported(Dockable) * @see #FLOATING_ALLOWED */ public static boolean isFloatingAllowed(Dockable dockable) { if (dockable == null) return false; Map context = DragManager.getDragContext(dockable); if (context == null) return getInstance().isPolicyFloatingSupported(dockable); Boolean floatAllowed = (Boolean) context.get(FLOATING_ALLOWED); return floatAllowed == null ? true : floatAllowed.booleanValue(); } /** * Indicates whether floating is allowed for the specified {@code Dockable} * strictly by checking the installed {@code FloatPolicies}. If * {@code dockable} is {@code null}, this method returns {@code false} * immediately without checking through the installed {@code FloatPolicies}. *

* This method iterates through all installed {@code FloatPolicies} to * determine whether floating support is allowed. If any {@code FloatPolicy} * within the internal collection returns {@code false} from its * {@code isFloatingAllowed(Dockable dockable)} method, this method returns * {@code false}. Otherwise, this method returns {@code true}. * * @param dockable * the {@code Dockable} whose floating support is to be checked * @return {@code true} if floating is allowed for the specified * {@code Dockable}; {@code false} otherwise. * @see FloatPolicy#isFloatingAllowed(Dockable) */ public boolean isPolicyFloatingSupported(Dockable dockable) { if (dockable == null) return false; for (Iterator it = policies.iterator(); it.hasNext();) { FloatPolicy policy = (FloatPolicy) it.next(); if (!policy.isFloatingAllowed(dockable)) return false; } return true; } /** * Adds the specified {@code FloatPolicy} to the internal policy collection. * This {@code FloatPolicy} will now take part in framework determinations * as to whether floating should be supported during docking operations. If * {@code policy} is {@code null}, no action is taken. * * @param policy * the {@code FloatPolicy} to add to the system * @see #removePolicy(FloatPolicy) */ public void addPolicy(FloatPolicy policy) { if (policy != null) policies.add(policy); } /** * Removes the specified {@code FloatPolicy} from the internal policy * collection. {@code FloatPolicy} will no longer take part in framework * determinations as to whether floating should be supported during docking * operations. If {@code policy} is {@code null} or was not previously * installed, no action is taken. * * @param policy * the {@code FloatPolicy} to remove from the system * @see #addPolicy(FloatPolicy) */ public void removePolicy(FloatPolicy policy) { if (policy != null) policies.remove(policy); } /** * Returns a global setting used to control default framework floating * behavior. If this method returns {@code false}, all floating support for * the entire framework is turned off. If this method returns {@code true}, * then floating support for individual docking operations is deferred to * the installed {@code FloatPolicies}. * * @return {@code true} if global floating support is enabled; {@code false} * otherwise. * @see #setGlobalFloatingEnabled(boolean) */ public static boolean isGlobalFloatingEnabled() { return getInstance().globalFloatingEnabled; } /** * Sets the global setting used to control default framework floating * behavior. If {@code globalFloatingEnabled} is {@code false}, all * floating support for the entire framework is turned off. If * {@code globalFloatingEnabled} is {@code true}, then floating support for * individual docking operations is deferred to the installed * {@code FloatPolicies}. * * @param globalFloatingEnabled * {@code true} if global floating support is to be enabled; * {@code false} otherwise. * @see #isGlobalFloatingEnabled() */ public static void setGlobalFloatingEnabled(boolean globalFloatingEnabled) { getInstance().globalFloatingEnabled = globalFloatingEnabled; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/package.html0000644000175000017500000000126112177715062025134 0ustar sylvestresylvestre Provides the specification for the FlexDock docking framework.

Package Specification

This package contains interface definitions for the FlexDock framework. It also contains the utility class DockingManager. This class helps to load the actual docking implementations and configure those instances.

The package org.flexdock.docking.defaults contains default implementations for these interfaces. Implementors should use these classes as a reference, since a lot of time has been put into developing them.

flexdock-1.2.4/src/java/core/org/flexdock/docking/props/0000755000175000017500000000000012177715062024016 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/docking/props/BasicDockablePropertySet.java0000644000175000017500000001560612177715062031560 0ustar sylvestresylvestre/* * Created on Mar 16, 2005 */ package org.flexdock.docking.props; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.Map; import javax.swing.Icon; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.util.TypedHashtable; import org.flexdock.util.Utilities; /** * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class BasicDockablePropertySet extends TypedHashtable implements DockablePropertySet, DockingConstants { private String dockingId; private PropertyChangeSupport changeSupport; public static String getRegionInsetKey(String region) { if(NORTH_REGION.equals(region)) return REGION_SIZE_NORTH; if(SOUTH_REGION.equals(region)) return REGION_SIZE_SOUTH; if(EAST_REGION.equals(region)) return REGION_SIZE_EAST; if(WEST_REGION.equals(region)) return REGION_SIZE_WEST; return null; } public static String getSiblingSizeKey(String region) { if(NORTH_REGION.equals(region)) return SIBLING_SIZE_NORTH; if(SOUTH_REGION.equals(region)) return SIBLING_SIZE_SOUTH; if(EAST_REGION.equals(region)) return SIBLING_SIZE_EAST; if(WEST_REGION.equals(region)) return SIBLING_SIZE_WEST; return null; } public static String getTerritoryBlockedKey(String region) { if(NORTH_REGION.equals(region)) return TERRITORY_BLOCKED_NORTH; if(SOUTH_REGION.equals(region)) return TERRITORY_BLOCKED_SOUTH; if(EAST_REGION.equals(region)) return TERRITORY_BLOCKED_EAST; if(WEST_REGION.equals(region)) return TERRITORY_BLOCKED_WEST; if(CENTER_REGION.equals(region)) return TERRITORY_BLOCKED_CENTER; return null; } public BasicDockablePropertySet(Dockable dockable) { super(); init(dockable); } public BasicDockablePropertySet(int initialCapacity, Dockable dockable) { super(initialCapacity); init(dockable); } public BasicDockablePropertySet(int initialCapacity, float loadFactor, Dockable dockable) { super(initialCapacity, loadFactor); init(dockable); } public BasicDockablePropertySet(Map t, Dockable dockable) { super(t); init(dockable); } private void init(Dockable dockable) { this.dockingId = dockable==null? null: dockable.getPersistentId(); Object changeSrc = dockable==null? (Object)this: dockable; changeSupport = new PropertyChangeSupport(changeSrc); } public Icon getDockbarIcon() { return (Icon)get(DOCKBAR_ICON); } public Icon getTabIcon() { return (Icon)get(TAB_ICON); } public String getDockableDesc() { return (String)get(DESCRIPTION); } public Boolean isDockingEnabled() { return getBoolean(DOCKING_ENABLED); } public Boolean isActive() { return getBoolean(ACTIVE); } public Boolean isMouseMotionListenersBlockedWhileDragging() { return getBoolean(MOUSE_MOTION_DRAG_BLOCK); } public Float getRegionInset(String region) { String key = getRegionInsetKey(region); return key==null? null: (Float)get(key); } public Float getSiblingSize(String region) { String key = getSiblingSizeKey(region); return key==null? null: (Float)get(key); } public Boolean isTerritoryBlocked(String region) { String key = getTerritoryBlockedKey(region); return key==null? null: (Boolean)get(key); } public Float getDragThreshold() { return getFloat(DRAG_THRESHOLD); } public Float getPreviewSize() { return getFloat(PREVIEW_SIZE); } public void setDockbarIcon(Icon icon) { Icon oldValue = getDockbarIcon(); put(DOCKBAR_ICON, icon); firePropertyChange(DOCKBAR_ICON, oldValue, icon); } public void setTabIcon(Icon icon) { Icon oldValue = getTabIcon(); put(TAB_ICON, icon); firePropertyChange(TAB_ICON, oldValue, icon); } public void setDockableDesc(String dockableDesc) { String oldValue = getDockableDesc(); put(DESCRIPTION, dockableDesc); firePropertyChange(DESCRIPTION, oldValue, dockableDesc); } public void setDockingEnabled(boolean enabled) { put(DOCKING_ENABLED, enabled); } public void setActive(boolean active) { Boolean oldValue = isActive(); if(oldValue==null) oldValue = Boolean.FALSE; put(ACTIVE, active); firePropertyChange(ACTIVE, oldValue.booleanValue(), active); } public void setMouseMotionListenersBlockedWhileDragging(boolean blocked) { put(MOUSE_MOTION_DRAG_BLOCK, blocked); } public void setRegionInset(String region, float inset) { String key = getRegionInsetKey(region); if(key!=null) { Float f = new Float(inset); put(key, f); } } public void setSiblingSize(String region, float size) { String key = getSiblingSizeKey(region); if(key!=null) { Float f = new Float(size); put(key, f); } } public void setTerritoryBlocked(String region, boolean blocked) { String key = getTerritoryBlockedKey(region); if(key!=null) { Boolean bool = blocked? Boolean.TRUE: Boolean.FALSE; put(key, bool); } } public void setDragTheshold(float threshold) { threshold = Math.max(threshold, 0); put(DRAG_THRESHOLD, threshold); } public void setPreviewSize(float previewSize) { previewSize = Math.max(previewSize, 0f); previewSize = Math.min(previewSize, 1f); put(PREVIEW_SIZE, previewSize); } /** * @return Returns the dockingId. */ public String getDockingId() { return dockingId; } public void addPropertyChangeListener(PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(listener); } protected void firePropertyChange(String property, Object oldValue, Object newValue) { if(Utilities.isChanged(oldValue, newValue)) changeSupport.firePropertyChange(property, oldValue, newValue); } protected void firePropertyChange(String property, int oldValue, int newValue) { if(oldValue!=newValue) changeSupport.firePropertyChange(property, oldValue, newValue); } protected void firePropertyChange(String property, boolean oldValue, boolean newValue) { if(oldValue!=newValue) changeSupport.firePropertyChange(property, oldValue, newValue); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/props/BasicDockingPortPropertySet.java0000644000175000017500000000410312177715062032265 0ustar sylvestresylvestre/* * Created on Mar 16, 2005 */ package org.flexdock.docking.props; import java.util.Map; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.RegionChecker; import org.flexdock.util.TypedHashtable; /** * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class BasicDockingPortPropertySet extends TypedHashtable implements DockingPortPropertySet, DockingConstants { public static String getRegionInsetKey(String region) { if(NORTH_REGION.equals(region)) return REGION_SIZE_NORTH; if(SOUTH_REGION.equals(region)) return REGION_SIZE_SOUTH; if(EAST_REGION.equals(region)) return REGION_SIZE_EAST; if(WEST_REGION.equals(region)) return REGION_SIZE_WEST; return null; } public BasicDockingPortPropertySet() { super(); } public BasicDockingPortPropertySet(int initialCapacity) { super(initialCapacity); } public BasicDockingPortPropertySet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); } public BasicDockingPortPropertySet(Map t) { super(t); } public RegionChecker getRegionChecker() { return (RegionChecker)get(REGION_CHECKER); } public Boolean isSingleTabsAllowed() { return getBoolean(SINGLE_TABS); } public Integer getTabPlacement() { return getInt(TAB_PLACEMENT); } public Float getRegionInset(String region) { String key = getRegionInsetKey(region); return key==null? null: (Float)get(key); } public void setRegionChecker(RegionChecker checker) { put(REGION_CHECKER, checker); } public void setSingleTabsAllowed(boolean allowed) { put(SINGLE_TABS, allowed); } public void setTabPlacement(int placement) { put(TAB_PLACEMENT, placement); } public void setRegionInset(String region, float inset) { String key = getRegionInsetKey(region); if(key!=null) { put(key, new Float(inset)); } } } flexdock-1.2.4/src/java/core/org/flexdock/docking/props/DockablePropertySet.java0000644000175000017500000000630012177715062030605 0ustar sylvestresylvestre/* * Created on Mar 16, 2005 */ package org.flexdock.docking.props; import java.beans.PropertyChangeListener; import javax.swing.Icon; /** * @author Christopher Butler */ public interface DockablePropertySet { public static final String DESCRIPTION = "Dockable.DESCRIPTION"; public static final String DOCKING_ENABLED = "Dockable.DOCKING_ENABLED"; public static final String MOUSE_MOTION_DRAG_BLOCK = "Dockable.MOUSE_MOTION_DRAG_BLOCK"; public static final String DRAG_THRESHOLD = "Dockable.DRAG_THRESHOLD"; public static final String REGION_SIZE_NORTH = "Dockable.REGION_SIZE_NORTH"; public static final String SIBLING_SIZE_NORTH = "Dockable.SIBLING_SIZE_NORTH"; public static final String TERRITORY_BLOCKED_NORTH = "Dockable.TERRITORY_BLOCKED_NORTH"; public static final String REGION_SIZE_SOUTH = "Dockable.REGION_SIZE_SOUTH"; public static final String SIBLING_SIZE_SOUTH = "Dockable.SIBLING_SIZE_SOUTH"; public static final String TERRITORY_BLOCKED_SOUTH = "Dockable.TERRITORY_BLOCKED_SOUTH"; public static final String REGION_SIZE_EAST = "Dockable.REGION_SIZE_EAST"; public static final String SIBLING_SIZE_EAST = "Dockable.SIBLING_SIZE_EAST"; public static final String TERRITORY_BLOCKED_EAST = "Dockable.TERRITORY_BLOCKED_EAST"; public static final String REGION_SIZE_WEST = "Dockable.REGION_SIZE_WEST"; public static final String SIBLING_SIZE_WEST = "Dockable.SIBLING_SIZE_WEST"; public static final String TERRITORY_BLOCKED_WEST = "Dockable.TERRITORY_BLOCKED_WEST"; public static final String TERRITORY_BLOCKED_CENTER = "Dockable.TERRITORY_BLOCKED_CENTER"; public static final String DOCKBAR_ICON = "Dockable.DOCKBAR_ICON"; public static final String TAB_ICON = "Dockable.TAB_ICON"; public static final String PREVIEW_SIZE = "Dockable.PREVIEW_SIZE"; public static final String ACTIVE = "Dockable.ACTIVE"; public String getDockableDesc(); public Boolean isDockingEnabled(); public Boolean isMouseMotionListenersBlockedWhileDragging(); public Float getRegionInset(String region); public Float getSiblingSize(String region); public Boolean isTerritoryBlocked(String region); public Float getDragThreshold(); public Icon getDockbarIcon(); public Icon getTabIcon(); public Float getPreviewSize(); public String getDockingId(); public Boolean isActive(); public void setDockableDesc(String desc); public void setDockingEnabled(boolean enabled); public void setMouseMotionListenersBlockedWhileDragging(boolean blocked); public void setRegionInset(String region, float inset); public void setSiblingSize(String region, float size); public void setTerritoryBlocked(String region, boolean blocked); public void setDragTheshold(float threshold); public void setDockbarIcon(Icon icon); public void setTabIcon(Icon icon); public void setPreviewSize(float size); public void setActive(boolean active); public Object put(Object key, Object value); public Object remove(Object key); public void addPropertyChangeListener(PropertyChangeListener listener); public void removePropertyChangeListener(PropertyChangeListener listener); } flexdock-1.2.4/src/java/core/org/flexdock/docking/props/DockingPortPropertySet.java0000644000175000017500000000220612177715062031325 0ustar sylvestresylvestre/* * Created on Mar 16, 2005 */ package org.flexdock.docking.props; import org.flexdock.docking.RegionChecker; /** * @author Christopher Butler */ public interface DockingPortPropertySet { public static final String REGION_CHECKER = "DockingPort.REGION_CHECKER"; public static final String SINGLE_TABS = "DockingPort.SINGLE_TABS"; public static final String TAB_PLACEMENT = "DockingPort.TAB_PLACEMENT"; public static final String REGION_SIZE_NORTH = "DockingPort.REGION_SIZE_NORTH"; public static final String REGION_SIZE_SOUTH = "DockingPort.REGION_SIZE_SOUTH"; public static final String REGION_SIZE_EAST = "DockingPort.REGION_SIZE_EAST"; public static final String REGION_SIZE_WEST = "DockingPort.REGION_SIZE_WEST"; public RegionChecker getRegionChecker(); public Boolean isSingleTabsAllowed(); public Integer getTabPlacement(); public Float getRegionInset(String region); public void setRegionChecker(RegionChecker checker); public void setSingleTabsAllowed(boolean allowed); public void setTabPlacement(int placement); public void setRegionInset(String region, float inset); } flexdock-1.2.4/src/java/core/org/flexdock/docking/props/PropertyChangeListenerFactory.java0000644000175000017500000000250412177715062032652 0ustar sylvestresylvestre/* * Created on Aug 12, 2005 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package org.flexdock.docking.props; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Iterator; import java.util.Vector; /** * @author Christopher Butler */ public abstract class PropertyChangeListenerFactory { private static final Vector FACTORIES = new Vector(); public static void addFactory(PropertyChangeListenerFactory factory) { if(factory!=null) FACTORIES.add(factory); } public static void removeFactory(PropertyChangeListenerFactory factory) { if(factory!=null) FACTORIES.remove(factory); } public static PropertyChangeListener[] getListeners() { ArrayList list = new ArrayList(FACTORIES.size()); for(Iterator it=FACTORIES.iterator(); it.hasNext();) { PropertyChangeListenerFactory factory = (PropertyChangeListenerFactory)it.next(); PropertyChangeListener listener = factory.getListener(); if(listener!=null) list.add(listener); } return (PropertyChangeListener[])list.toArray(new PropertyChangeListener[list.size()]); } public abstract PropertyChangeListener getListener(); } flexdock-1.2.4/src/java/core/org/flexdock/docking/props/PropertyManager.java0000644000175000017500000001500012177715062027774 0ustar sylvestresylvestre/* * Created on Mar 16, 2005 */ package org.flexdock.docking.props; import java.awt.Component; import java.beans.PropertyChangeListener; import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.JComponent; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingPort; import org.flexdock.util.ClassMapping; import org.flexdock.util.SwingUtility; /** * @author Christopher Butler */ public class PropertyManager { public static final String DOCKABLE_PROPERTIES_KEY = DockablePropertySet.class.getName(); public static final String DOCKINGPORT_PROPERTIES_KEY = DockingPortPropertySet.class.getName(); private static final ClassMapping DOCKABLE_PROPS_MAPPING = new ClassMapping(ScopedDockablePropertySet.class, null); private static final HashMap DOCKABLE_CLIENT_PROPERTIES = new HashMap(); public static DockingPortPropertySet getDockingPortRoot() { return ScopedDockingPortPropertySet.ROOT_PROPS; } public static DockablePropertySet getDockableRoot() { return ScopedDockablePropertySet.ROOT_PROPS; } public static void setDockablePropertyType(Class dockable, Class propType) { if(dockable==null || propType==null) return; if(!Dockable.class.isAssignableFrom(dockable) || !DockablePropertySet.class.isAssignableFrom(propType)) return; DOCKABLE_PROPS_MAPPING.addClassMapping(dockable, propType); } public static DockablePropertySet getDockablePropertySet(Dockable dockable) { if(dockable==null) return null; Object obj = dockable.getClientProperty(DOCKABLE_PROPERTIES_KEY); if(!(obj instanceof DockablePropertySet)) { obj = createDockablePropertySet(dockable); linkPropertySet(dockable, (DockablePropertySet)obj); } return (DockablePropertySet)obj; } private static void linkPropertySet(Dockable dockable, DockablePropertySet propertySet) { dockable.putClientProperty(DOCKABLE_PROPERTIES_KEY, propertySet); PropertyChangeListener[] listeners = PropertyChangeListenerFactory.getListeners(); for(int i=0; i=getDepth()? null: (SplitNode)nodes.get(indx); } public Object clone() { ArrayList nodeList = null; if(nodes!=null) { nodeList = new ArrayList(nodes.size()); for(Iterator it=nodes.iterator(); it.hasNext();) { SplitNode node = (SplitNode)it.next(); nodeList.add(node.clone()); } } DockingPath path = new DockingPath(siblingId, tabbed, nodeList); path.rootPortId = rootPortId; return path; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/DockingState.java0000644000175000017500000001132112177715062027213 0ustar sylvestresylvestrepackage org.flexdock.docking.state; import java.awt.Point; import java.io.Serializable; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; /** * * @author Mateusz Szczap */ @SuppressWarnings(value = { "serial" }) public class DockingState implements Cloneable, Serializable, DockingConstants { private String m_dockableId; private String m_relativeParentId; private String m_region = UNKNOWN_REGION; private float m_splitRatio = UNINITIALIZED_RATIO; private String m_floatingGroup; //if the view is minimized we store the dockbar edge to which it is minimized private int m_minimizedConstraint = MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT; private DockingPath m_dockingPath; private int centerX = DockingConstants.UNINITIALIZED; private int centerY = DockingConstants.UNINITIALIZED; public DockingState(String dockableId) { this.m_dockableId = dockableId; } public Dockable getDockable() { return DockingManager.getDockable(m_dockableId); } public String getDockableId() { return m_dockableId; } public float getSplitRatio() { return m_splitRatio; } public void setSplitRatio(float ratio) { m_splitRatio = ratio; } public String getRegion() { return m_region; } public void setRegion(String region) { m_region = region; } public int getMinimizedConstraint() { return m_minimizedConstraint; } public String getFloatingGroup() { return m_floatingGroup; } public boolean isFloating() { return m_floatingGroup!=null; } public boolean isMinimized() { return m_minimizedConstraint!=MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT; } public boolean hasDockingPath() { return m_dockingPath!=null; } public DockingPath getPath() { return m_dockingPath; } public void setPath(DockingPath path) { m_dockingPath = path; } public void setMinimizedConstraint(int constraint) { m_minimizedConstraint = constraint; if(constraint!=MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT) { m_floatingGroup = null; } } public void setFloatingGroup(String group) { m_floatingGroup = group; if(group!=null) { m_minimizedConstraint = MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT; } } public Dockable getRelativeParent() { return DockingManager.getDockable(m_relativeParentId); } public String getRelativeParentId() { return m_relativeParentId; } public void setRelativeParent(Dockable parent) { String parentId = parent==null? null: parent.getPersistentId(); setRelativeParentId(parentId); } public void setRelativeParentId(String relativeParentId) { m_relativeParentId = relativeParentId; } public String toString() { return "DockingState[id=" + m_dockableId + "; center=[" + centerX + "%," + centerY + "%]" + "; parent=" + m_relativeParentId + "; region=" + m_region + "; ratio=" + m_splitRatio + "; float=" + m_floatingGroup + "; minimization=" + m_minimizedConstraint + "; ]"; } public int getCenterX() { return centerX; } public void setCenterX(int centerX) { this.centerX = centerX; } public int getCenterY() { return centerY; } public void setCenterY(int centerY) { this.centerY = centerY; } public void setCenter(Point p) { centerX = p==null? 0: p.x; centerY = p==null? 0: p.y; } public Point getCenterPoint() { if (this.centerX == DockingConstants.UNINITIALIZED || this.centerY == DockingConstants.UNINITIALIZED) { return null; } return new Point(this.centerX, this.centerY); } public boolean hasCenterPoint() { return (centerX != DockingConstants.UNINITIALIZED && centerY != DockingConstants.UNINITIALIZED); } public Object clone() { DockingState dockingStateClone = new DockingState(m_dockableId); dockingStateClone.m_relativeParentId = m_relativeParentId; dockingStateClone.m_region = m_region; dockingStateClone.m_splitRatio = m_splitRatio; dockingStateClone.m_floatingGroup = m_floatingGroup; dockingStateClone.m_minimizedConstraint = m_minimizedConstraint; dockingStateClone.m_dockingPath = m_dockingPath==null? null: (DockingPath)m_dockingPath.clone(); dockingStateClone.centerX = centerX; dockingStateClone.centerY = centerY; return dockingStateClone; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/FloatManager.java0000644000175000017500000000522712177715062027204 0ustar sylvestresylvestre/* * Created on May 26, 2005 */ package org.flexdock.docking.state; import java.awt.Component; import java.awt.Rectangle; import org.flexdock.docking.Dockable; import org.flexdock.docking.floating.frames.DockingFrame; /** * This interface defines the API used for floating and grouping Dockables. Classes * implementing this interface will be responsible for sending Dockables into * DockingFrames and managing the grouping of floating Dockables. *
* Sending a Dockable into a floating DockingFrame is relatively straightforward * when supplied the Dockable and a dialog owner. However, state must be maintained * for each FloatingGroup to allow the system to track which Dockables * share the same floating dialog. If a floating Dockable is closed and subsequently * restored to its previous floating state, the FloatManager must be able to determine * whether an existing dialog is already present or a new dialog must be created into which the * Dockable may be restored. FloatingGroups are used to track which * dialogs contain which Dockables. FloatManager implementations must * manage the addition to and removal of Dockables from appropriate FloatingGroups * and, in turn, use these FloatingGroups to resolve or create the necessary * DockingFrames during float-operations. * * @author Christopher Butler */ public interface FloatManager { FloatManager DEFAULT_STUB = new Stub(); FloatingGroup getGroup(String groupName); FloatingGroup getGroup(Dockable dockable); void addToGroup(Dockable dockable, String groupId); void removeFromGroup(Dockable dockable); DockingFrame floatDockable(Dockable dockable, Component frameOwner); DockingFrame floatDockable(Dockable dockable, Component frameOwner, Rectangle screenBounds); public static class Stub implements FloatManager { public void addToGroup(Dockable dockable, String groupId) { } public DockingFrame floatDockable(Dockable dockable, Component frameOwner, Rectangle screenBounds) { return null; } public DockingFrame floatDockable(Dockable dockable, Component frameOwner) { return null; } public FloatingGroup getGroup(Dockable dockable) { return null; } public FloatingGroup getGroup(String groupName) { return null; } public void removeFromGroup(Dockable dockable) { } } }flexdock-1.2.4/src/java/core/org/flexdock/docking/state/FloatingGroup.java0000644000175000017500000001743712177715062027432 0ustar sylvestresylvestre/* * Created on May 3, 2005 */ package org.flexdock.docking.state; import java.awt.Rectangle; import java.io.Serializable; import java.util.HashSet; import java.util.Iterator; import org.flexdock.docking.Dockable; import org.flexdock.docking.floating.frames.DockingFrame; import org.flexdock.util.UUID; /** * This class models a grouping of Dockables within a floating DockingFrame. * The FloatingGroup tracks the current screen bounds of the DockingFrame and * the ID for each Dockable within the group. The FloatingGroup * may be persisted to external storage and recreated across JVM sessions. This allows the * DockingFrame to be recreated and displayed with the previous screen bounds and all * of the Dockables contained within the group to be restored to their previous state * within the DockingFrame. *
* In addition to providing persistent state across application sessions, the FloatingGroup * allows for a floating Dockable to be closed and then later restored to its original * floating state within the same JVM session. The currently installed FloatManager may * use FloatingGroups to determine which visible DockingFrame into which to * restore a closed Dockable, or to create and display a new DockingFrame * to the same end on an as-needed basis. * * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class FloatingGroup implements Cloneable, Serializable { private String name; private Rectangle windowBounds; private transient DockingFrame frame; private HashSet dockables; // contains String dockableIds /** * Creates a new FloatingGroup with the specified groupName. This * group may be looked up from the currently installed FloatManager using this * groupName. groupName should be unique to this group. * * @param groupName the unique identifier for this FloatingGroup * @see FloatManager#getGroup(String) */ public FloatingGroup(String groupName) { name = groupName==null? UUID.randomUUID().toString():groupName; dockables = new HashSet(); } private FloatingGroup(String groupName, HashSet dockableSet) { name = groupName; dockables = dockableSet; } /** * Returns the cached screen bounds of the DockingFrame associated with this * FloatingGroup. If no screen bounds have been previously cached, this method * returns null. Otherwise, this method returns a clone of the cached * Rectangle so that its fields may not be directly modified. * * @return the cached screen bounds of the DockingFrame associated with this * FloatingGroup. * @see #setBounds(Rectangle) */ public Rectangle getBounds() { return windowBounds==null? null: (Rectangle)windowBounds.clone(); } /** * Sets the screen bounds representing the DockingFrame associated with this * FloatingGroup. If rect is null, then the cached * screen bounds are set to null. Otherwise, the field values are copied from the * specified Rectangle into the cached screen bounds rather than updating the * internal object reference. This is done to prevent the cached screen bounds' fields from * subsequently being modified directly. * * @param rect the new screen bounds representing the DockingFrame associated with this * FloatingGroup. * @see #getBounds() */ public void setBounds(Rectangle rect) { if(rect==null) { windowBounds = null; } else { if(windowBounds==null) windowBounds = (Rectangle)rect.clone(); else windowBounds.setBounds(rect); } } /** * Returns the name of this FloatingGroup. This value may be used as a key to lookup * this FloatingGroup from the currently installed FloatManager by * invoking its getGroup(String groupName) method. * * @return the name of this FloatingGroup. * @see #FloatingGroup(String) * @see FloatManager#getGroup(String) */ public String getName() { return name; } /** * Returns a reference to the DockingFrame associated with this FloatingGroup. * This method allows easy lookup to establish an association with a Dockable and * a DockingFrame. When attempting to find an existing DockingFrame into which * to restore a hidden Dockable, the Dockable's FloatingGroup * may be looked up by the currently installed FloatManager by calling its * getGroup(Dockable dockable) method. Once the group has been resolved, the actual * DockingFrame reference may be obtained by this method and the Dockable * may be restored to the screen. Or, this method may return null and the * DockingFrame will have to be recreated before the Dockable can be restored. * * @return a reference to the DockingFrame associated with this FloatingGroup. * @see #setFrame(DockingFrame) * @see FloatManager#getGroup(Dockable) */ public DockingFrame getFrame() { return frame; } /** * Sets a reference to the DockingFrame associated with this FloatingGroup. * This method allows help enable easy lookup to establish an association with a Dockable and * a DockingFrame. When attempting to find an existing DockingFrame into which * to restore a hidden Dockable, the Dockable's FloatingGroup * may be looked up by the currently installed FloatManager by calling its * getGroup(Dockable dockable) method. Once the group has been resolved, the actual * DockingFrame reference may be obtained by calling getFrame() and the * Dockable may be restored to the screen. Or, getFrame()may return * null and the DockingFrame will have to be recreated before the * Dockable can be restored. This method establishes the association between * FloatingGroup and DockingFrame. * * @param frame the DockingFrame to be associated with this FloatingGroup. * @see #getFrame() * @see FloatManager#getGroup(Dockable) */ public void setFrame(DockingFrame frame) { this.frame = frame; } public void addDockable(String dockableId) { dockables.add(dockableId); } public Iterator getDockableIterator() { return this.dockables.iterator(); } public void removeDockable(String dockableId) { dockables.remove(dockableId); } public int getDockableCount() { return dockables.size(); } public void destroy() { dockables.clear(); setFrame(null); setBounds(null); } public Object clone() { HashSet set = (HashSet)dockables.clone(); FloatingGroup clone = new FloatingGroup(name, set); clone.frame = frame; clone.windowBounds = (Rectangle)windowBounds.clone(); return clone; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/LayoutManager.java0000644000175000017500000000167412177715062027416 0ustar sylvestresylvestre/* * Created on May 27, 2005 */ package org.flexdock.docking.state; import java.io.IOException; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingPort; /** * @author Christopher Butler */ public interface LayoutManager { DockingState getDockingState(String dockableId); DockingState getDockingState(Dockable dockable); FloatManager getFloatManager(); LayoutNode createLayout(DockingPort port); boolean display(Dockable dockable); boolean store() throws IOException, PersistenceException; boolean store(String persistenceKey) throws IOException, PersistenceException; boolean load() throws IOException, PersistenceException; boolean load(String persistenceKey) throws IOException, PersistenceException; boolean restore(boolean loadFromStorage) throws IOException, PersistenceException; String getDefaultPersistenceKey(); void setDefaultPersistenceKey(String key); } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/LayoutNode.java0000644000175000017500000000057712177715062026732 0ustar sylvestresylvestre/* * Created on May 28, 2005 */ package org.flexdock.docking.state; import java.io.Serializable; import javax.swing.tree.MutableTreeNode; /** * @author Christopher Butler */ public interface LayoutNode extends MutableTreeNode, Cloneable, Serializable { Object getUserObject(); Object getDockingObject(); void add(MutableTreeNode child); Object clone(); } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/MinimizationManager.java0000644000175000017500000000205112177715062030576 0ustar sylvestresylvestre/* * Created on May 26, 2005 */ package org.flexdock.docking.state; import java.awt.Component; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; /** * @author Christopher Butler */ public interface MinimizationManager { MinimizationManager DEFAULT_STUB = new Stub(); int UNSPECIFIED_LAYOUT_CONSTRAINT = -1; int TOP = DockingConstants.TOP; int LEFT = DockingConstants.LEFT; int BOTTOM = DockingConstants.BOTTOM; int RIGHT = DockingConstants.RIGHT; int CENTER = DockingConstants.CENTER; boolean close(Dockable dockable); void preview(Dockable dockable, boolean locked); void setMinimized(Dockable dockable, boolean minimized, Component window, int constraint); class Stub implements MinimizationManager { public boolean close(Dockable dockable) { return false; } public void preview(Dockable dockable, boolean locked) {} public void setMinimized(Dockable dockable, boolean minimized, Component window, int edge) {} } } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/PersistenceException.java0000644000175000017500000000262412177715062031005 0ustar sylvestresylvestre/* * Copyright (c) 2005 FlexDock Development Team. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in the * Software without restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the * to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE. */ package org.flexdock.docking.state; /** * Created on 2005-07-03 * * @author
Mateusz Szczap * @version $Id: PersistenceException.java,v 1.1 2005-07-05 14:53:31 marius Exp $ */ @SuppressWarnings(value = { "serial" }) public class PersistenceException extends Exception { public PersistenceException(String message, Exception ex) { super(message, ex); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/tree/0000755000175000017500000000000012177715062024732 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/docking/state/tree/DockableNode.java0000644000175000017500000000164512177715062030115 0ustar sylvestresylvestre/* * Created on May 28, 2005 */ package org.flexdock.docking.state.tree; import javax.swing.tree.MutableTreeNode; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; /** * @author Christopher Butler */ public class DockableNode extends DockingNode { private String dockableId; public DockableNode() { } private DockableNode(String id) { dockableId = id; } public String getDockableId() { return dockableId; } public void setDockableId(String dockableId) { this.dockableId = dockableId; } public Dockable getDockable() { return DockingManager.getDockable(dockableId); } public void add(MutableTreeNode newChild) { // noop } public Object getDockingObject() { return getDockable(); } protected DockingNode shallowClone() { return new DockableNode(dockableId); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/tree/DockingNode.java0000644000175000017500000000204412177715062027761 0ustar sylvestresylvestre/* * Created on May 28, 2005 */ package org.flexdock.docking.state.tree; import java.util.Enumeration; import javax.swing.tree.DefaultMutableTreeNode; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.state.LayoutNode; /** * @author Christopher Butler */ public abstract class DockingNode extends DefaultMutableTreeNode implements LayoutNode, DockingConstants { public Object getUserObject() { Object obj = super.getUserObject(); if(obj==null) { obj = getDockingObject(); setUserObject(obj); } return obj; } public abstract Object getDockingObject(); protected abstract DockingNode shallowClone(); public Object clone() { return deepClone(); } public DockingNode deepClone() { DockingNode clone = shallowClone(); for(Enumeration en=children(); en.hasMoreElements();) { DockingNode child = (DockingNode)en.nextElement(); clone.add(child.deepClone()); } return clone; } } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/tree/DockingPortNode.java0000644000175000017500000000223512177715062030630 0ustar sylvestresylvestre/* * Created on May 28, 2005 */ package org.flexdock.docking.state.tree; import javax.swing.tree.TreeNode; import org.flexdock.docking.DockingPort; import org.flexdock.docking.DockingStrategy; /** * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class DockingPortNode extends DockingNode { public Object getDockingObject() { TreeNode parent = getParent(); if(!(parent instanceof SplitNode)) return null; TreeNode grandParent = parent.getParent(); if(!(grandParent instanceof DockingPortNode)) return null; DockingPort superPort = (DockingPort)((DockingPortNode)grandParent).getUserObject(); DockingStrategy strategy = superPort.getDockingStrategy(); return strategy.createDockingPort(superPort); } public DockingPort getDockingPort() { return (DockingPort)getUserObject(); } public boolean isSplit() { int cnt = getChildCount(); if(cnt!=1) return false; return getChildAt(0) instanceof SplitNode; } protected DockingNode shallowClone() { return new DockingPortNode(); } } flexdock-1.2.4/src/java/core/org/flexdock/docking/state/tree/SplitNode.java0000644000175000017500000000743312177715062027505 0ustar sylvestresylvestre/* * Created on Apr 28, 2005 */ package org.flexdock.docking.state.tree; import java.awt.Component; import javax.swing.JSplitPane; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingPort; import org.flexdock.docking.DockingStrategy; import org.flexdock.docking.state.LayoutNode; /** * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class SplitNode extends DockingNode implements DockingConstants { private int orientation; private int region; private float percentage; private String siblingId; private String dockingRegion; public SplitNode(int orientation, int region, float percentage, String siblingId) { this.orientation = orientation; this.region = region; this.percentage = percentage; this.siblingId = siblingId; } public int getOrientation() { return orientation; } public void setOrientation(int orientation) { this.orientation = orientation; } public float getPercentage() { return percentage; } public void setPercentage(float percentage) { this.percentage = percentage; } public int getRegion() { return region; } public void setRegion(int region) { this.region = region; } public String getSiblingId() { return siblingId; } public void setSiblingId(String siblingId) { this.siblingId = siblingId; } public String toString() { StringBuffer sb = new StringBuffer("SplitNode["); sb.append("orient=").append(getOrientationDesc()).append("; "); sb.append("region=").append(getRegionDesc()).append("; "); sb.append("percent=").append(percentage).append("%;"); sb.append("]"); return sb.toString(); } public String getRegionDesc() { switch(region) { case TOP: return "top"; case BOTTOM: return "bottom"; case RIGHT: return "right"; default: return "left"; } } public String getOrientationDesc() { return orientation==VERTICAL? "vertical": "horizontal"; } public Object clone() { return new SplitNode(orientation, region, percentage, siblingId); } public String getDockingRegion() { return dockingRegion; } public void setDockingRegion(String dockingRegion) { this.dockingRegion = dockingRegion; } public Object getDockingObject() { if(dockingRegion==null) return null; if(!(getParent() instanceof DockingPortNode)) return null; DockingPortNode superNode = (DockingPortNode)getParent(); Object userObj = superNode.getUserObject(); if(!(userObj instanceof DockingPort)) return null; DockingPort superPort = (DockingPort)userObj; DockingStrategy strategy = superPort.getDockingStrategy(); return strategy.createSplitPane(superPort, dockingRegion, percentage); } public JSplitPane getSplitPane() { return (JSplitPane)getUserObject(); } public Component getLeftComponent() { return getChildComponent(0); } public Component getRightComponent() { return getChildComponent(1); } private Component getChildComponent(int indx) { LayoutNode child = getChild(indx); return child==null? null: (Component)child.getUserObject(); } private LayoutNode getChild(int indx) { if(indx >= getChildCount()) return null; return (LayoutNode)getChildAt(indx); } protected DockingNode shallowClone() { SplitNode clone = new SplitNode(orientation, region, percentage, siblingId); clone.dockingRegion = dockingRegion; return clone; } } flexdock-1.2.4/src/java/core/org/flexdock/event/0000755000175000017500000000000012177715062022356 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/event/Event.java0000644000175000017500000000121512177715062024301 0ustar sylvestresylvestre/* * Created on May 17, 2005 */ package org.flexdock.event; import java.util.EventObject; import org.flexdock.docking.DockingConstants; /** * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class Event extends EventObject implements DockingConstants { private int eventType; /** * An event object. * * @param src * the source of the event. * @param evtType * the type of the event. */ public Event(Object src, int evtType) { super(src); eventType = evtType; } public int getEventType() { return eventType; } } flexdock-1.2.4/src/java/core/org/flexdock/event/EventHandler.java0000644000175000017500000000602112177715062025577 0ustar sylvestresylvestre/* * Created on May 17, 2005 */ package org.flexdock.event; import java.util.ArrayList; import java.util.EventListener; import java.util.Iterator; /** * @author Christopher Butler */ public abstract class EventHandler { protected ArrayList globalListeners = new ArrayList(); /** * Tests a given event to determine if this handler can handle that event. * * @param evt * the event to test. * @return {@code true} if this handler handles the event, {@code false} * otherwise. */ public abstract boolean acceptsEvent(Event evt); public abstract boolean acceptsListener(EventListener listener); public abstract void handleEvent(Event evt, EventListener listener, int eventType); public void addListener(EventListener listener) { synchronized (globalListeners) { if (listener != null) globalListeners.add(listener); } } public void removeListener(EventListener listener) { synchronized (globalListeners) { if (listener != null) globalListeners.remove(listener); } } /** * This method handles all of the events. First passing each event to * {@code handleEvent(Event, EventListener, int)} for every registered * listener in the {@link #globalListeners} list. Then, it passes the event * to each of the target listeners passed in via {@code targets}. * * @param evt * the event to process. * @param targets * the local listeners to pass the event to. */ public void handleEvent(Event evt, Object[] targets) { if (evt == null) return; int evtType = evt.getEventType(); // allow all globally registered listeners to handle the event first for (Iterator it = globalListeners.iterator(); it.hasNext();) { EventListener listener = (EventListener) it.next(); handleEvent(evt, listener, evtType); } // if there were no specified targets for the event, then we can quit // now if (targets == null) return; // for each of the targets, get their local event listeners // and dispatch the event to them for (int i = 0; i < targets.length; i++) { // get the local event listeners EventListener[] targetListeners = targets[i] == null ? null : getListeners(targets[i]); if (targetListeners == null) continue; // for each local event listener, dispatch the event for (int j = 0; j < targetListeners.length; j++) { EventListener listener = targetListeners[j]; if (listener != null && acceptsListener(listener)) { handleEvent(evt, listener, evtType); } } } } public EventListener[] getListeners(Object eventTarget) { return null; } } flexdock-1.2.4/src/java/core/org/flexdock/event/EventManager.java0000644000175000017500000000626012177715062025601 0ustar sylvestresylvestre/* * Created on May 17, 2005 */ package org.flexdock.event; import java.util.Collection; import java.util.EventListener; import java.util.Iterator; import java.util.Stack; /** * @author Christopher Butler */ public class EventManager { private static final EventManager SINGLETON = new EventManager(); private Stack handlers = new Stack(); static { addHandler(new RegistrationHandler()); } public static EventManager getInstance() { return SINGLETON; } private EventManager() { } public static void addHandler(EventHandler handler) { getInstance().addEventHandler(handler); } public static void removeHandler(EventHandler handler) { getInstance().removeEventHandler(handler); } public static void addListener(EventListener listener) { getInstance().addEventListener(listener); } public static void removeListener(EventListener listener) { getInstance().removeEventListener(listener); } public static void dispatch(Event evt) { getInstance().dispatchEvent(evt); } public static void dispatch(Event evt, Object target) { getInstance().dispatchEvent(evt, target); } public static void dispatch(Event evt, Object[] targets) { getInstance().dispatchEvent(evt, targets); } public void addEventHandler(EventHandler handler) { if(handler!=null) handlers.push(handler); } public void removeEventHandler(EventHandler handler) { if(handler!=null) handlers.remove(handler); } private EventHandler getHandler(Event evt) { for(Iterator it=handlers.iterator(); it.hasNext();) { EventHandler handler = (EventHandler)it.next(); if(handler.acceptsEvent(evt)) return handler; } return null; } private EventHandler getHandler(EventListener listener) { for(Iterator it=handlers.iterator(); it.hasNext();) { EventHandler handler = (EventHandler)it.next(); if(handler.acceptsListener(listener)) return handler; } return null; } public void addEventListener(EventListener listener) { EventHandler handler = listener==null? null: getHandler(listener); if(handler!=null) handler.addListener(listener); } public void removeEventListener(EventListener listener) { EventHandler handler = listener==null? null: getHandler(listener); if(handler!=null) handler.removeListener(listener); } public void dispatchEvent(Event evt) { dispatchEvent(evt, null); } public void dispatchEvent(Event evt, Object target) { Object[] targets = null; if(target instanceof Collection) { targets = ((Collection)target).toArray(); } else if(target!=null) { targets = new Object[] {target}; } dispatchEvent(evt, targets); } public void dispatchEvent(Event evt, Object[] targets) { EventHandler handler = evt==null? null: getHandler(evt); if(handler!=null) handler.handleEvent(evt, targets); } } flexdock-1.2.4/src/java/core/org/flexdock/event/RegistrationEvent.java0000644000175000017500000000114212177715062026673 0ustar sylvestresylvestre/* * Created on May 17, 2005 */ package org.flexdock.event; /** * @author Christopher Butler */ public class RegistrationEvent extends Event { public static final int REGISTERED = 0; public static final int UNREGISTERED = 1; private Object owner; public RegistrationEvent(Object src, Object owner, int evtType) { super(src, evtType); this.owner = owner; } public RegistrationEvent(Object src, Object owner, boolean registered) { this(src, owner, registered? REGISTERED: UNREGISTERED); } public Object getOwner() { return owner; } } flexdock-1.2.4/src/java/core/org/flexdock/event/RegistrationHandler.java0000644000175000017500000000157712177715062027203 0ustar sylvestresylvestre/* * Created on May 17, 2005 */ package org.flexdock.event; import java.util.EventListener; /** * @author Christopher Butler */ public class RegistrationHandler extends EventHandler { public boolean acceptsEvent(Event evt) { return evt instanceof RegistrationEvent; } public boolean acceptsListener(EventListener listener) { return listener instanceof RegistrationListener; } public void handleEvent(Event evt, EventListener listener, int eventType) { RegistrationEvent regEvt = (RegistrationEvent)evt; RegistrationListener regListener = (RegistrationListener)listener; switch(eventType) { case RegistrationEvent.REGISTERED: regListener.registered(regEvt); break; case RegistrationEvent.UNREGISTERED: regListener.unregistered(regEvt); break; } } } flexdock-1.2.4/src/java/core/org/flexdock/event/RegistrationListener.java0000644000175000017500000000037012177715062027401 0ustar sylvestresylvestre/* * Created on May 17, 2005 */ package org.flexdock.event; /** * @author Christopher Butler */ public interface RegistrationListener { public void registered(RegistrationEvent evt); public void unregistered(RegistrationEvent evt); } flexdock-1.2.4/src/java/core/org/flexdock/util/0000755000175000017500000000000012177715062022212 5ustar sylvestresylvestreflexdock-1.2.4/src/java/core/org/flexdock/util/ClassMapping.java0000644000175000017500000004010212177715062025433 0ustar sylvestresylvestre/* * Created on Apr 5, 2005 */ package org.flexdock.util; import java.util.WeakHashMap; /** * This class manages associations between classes and object instances. It * allows for mappings between a class and its subclasses and another associated * class, or an associated instance of a class. *

* This class is useful for "handler" type logic in which a handler class must * be mapped to the classes it is designed to handle. Consider the class * hierarchy of {@code Foo}, {@code Bar}, and {@code Baz}, where {@code Bar} * extends {@code Foo} and {@code Baz} extends {@code Bar}. * *

 * Foo.class
 *   |-Bar.class
 *       |-Baz.class
 * 
* * Each of these classes is ultimately a type of {@code Foo}. Some operation is * performed on instances of {@code Foo} and a set of handler classes are used * to handle different types of {@code Foo}. Adding a mapping between * {@code Foo.class} and {@code Handler1.class} will create an association * between {@code Foo} and all strict, non-specific subclasses of * {@code Foo} and {@code Handler1.class}. *

* This means that given any instance of {@code Foo}, calling * {@code getClassMapping(Object obj)} will return {@code Handler1.class} as the * class responsible for handling the {@code Foo} instance. This includes * {@code Bar} and {@code Baz}. All types of {@code Foo} now have a implicit * association with {@code Handler1.class} *

* However, if this method is subsequently called with arguments of * {@code Baz.class} and {@code Handler2.class}, then a specific * subclass mapping has been introduced for {@code Baz}. Associations apply to * the given class and non-specific subclasses. Thus, the * {@code Handler1.class} association remains for {@code Foo} and {@code Bar}, * but no longer for {@code Baz}. Calling {@code getClassMapping(Object obj)} * with an instance of {@code Baz} will now return {@code Handler2.class}. * *

 *  Foo.class ---------------> (maps to Handler1.class)
 *    |-Bar.class -----------> (maps to Handler1.class)
 *        |-Baz.class -------> (maps to Handler2.class)
 * 
* * Polymorphic identity within the class association uses strict * subclasses. This means that the {@code Handler1.class} mapping for * {@code Foo}, {@code Bar}, and all non-specific subclasses will hold true. * However, if {@code Foo} happens to implement the interface {@code Qwerty}, * the class mapping relationship will not hold true for all implementations of * {@code Qwerty}. Only subclasses of {@code Foo}. * *
 *  Foo.class (implements Qwerty) ----------------> (maps to Handler1.class)
 *    |-Bar.class (implements Qwerty) ------------> (maps to Handler1.class)
 *        |-Baz.class (implements Qwerty) --------> (maps to Handler2.class)
 *  Asdf.class (implements Qwerty) ---------------> (maps to nothing)
 * 
* * @author Christopher Butler */ public class ClassMapping { private WeakHashMap classes; private WeakHashMap instances; private Class defaultClass; private Object defaultInstance; /** * Creates a new {@code ClassMapping} instance with the specified default * values. All calls to {@code getClassMapping(Class key)} for this * {@code ClassMapping} in which a specific mapping cannot be found will * return the specified {@code defaultClass}. All calls to * {@code getClassInstance(Class key)} in which a specific mapping cannot be * found will return the specified {@code defaultInstance}. * * @param defaultClass * the default class used by this {@code ClassMapping} * @param defaultInstance * the default object instance used by this {@code ClassMapping} */ public ClassMapping(Class defaultClass, Object defaultInstance) { this.defaultClass = defaultClass; this.defaultInstance = defaultInstance; classes = new WeakHashMap(4); instances = new WeakHashMap(4); } /** * Adds a mapping between the {@code Class} type of the specified * {@code Object} and the specified {@code value}. This method calls * {@code getClass()} on the specified {@code Object} and dispatches to * {@code addClassMapping(Class key, Class value)}. If either {@code obj} * or {@code value} are {@code null}, then this method returns with no * action taken. The {@code value} class may later be retrieved by calling * {@code getClassMapping(Class key)} using the specified {@code key} class ({@code obj.getClass()}) * or any subclass thereof for which a specific class mapping does not * already exist. * * @param obj * the {@code Object} whose {@code Class} will be mapped to the * specified {@code value}. * @param value * the {@code Class} to be associated with the specified key * @see #addClassMapping(Object, Class) * @see #getClassMapping(Object) * @see #getClassMapping(Class) * @see #removeClassMapping(Object) * @see #removeClassMapping(Class) */ public void addClassMapping(Object obj, Class value) { Class key = obj == null ? null : obj.getClass(); addClassMapping(key, value); } /** * Adds a mapping between the key {@code Class} and the specified * {@code value}. If either {@code key} or {@code value} are {@code null}, * then this method returns with no action taken. This method creates an * association between the specified {@code key} {@code Class} and all * strict, non-specific subclasses and the specified {@code value} * {@code Class}. The {@code value} class may later be retrieved by calling * getClassMapping(Class key) using the specified {@code key} class or any * subclass thereof for which a specific class mapping does not already * exist. * * @param key * the {@code Class} to be mapped to the specified {@code value}. * @param value * the {@code Class} to be associated with the specified key * @see #addClassMapping(Class, Class, Object) * @see #getClassMapping(Class) * @see #removeClassMapping(Class) */ public void addClassMapping(Class key, Class value) { addClassMapping(key, value, null); } /** * Adds a mapping between the key {@code Class} and both the specified * {@code value} and specified object instance.. If either {@code key} or * {@code value} are {@code null}, then this method returns with no action * taken. This method creates an association between the specified * {@code key} {@code Class} and all strict, non-specific subclasses and the * specified {@code value} {@code Class}. The {@code value} class may later * be retrieved by calling {@code getClassMapping(Class key)} using the * specified {@code key} class or any subclass thereof for which a specific * class mapping does not already exist. *

* This method also creates an optional mapping between the {@code key} and * a particular object instance, defined by the {@code instance} parameter. * If {@code instance} is non-{@code null}, then a mapping is defined * between {@code key} and all strict, non-specific subclasses and the * object instance itself. The {@code instance} object may later be * retrieved by calling {@code getClassInstance(Class key)} using the * specified {@code key} class or any subclass thereof for which a specific * instance mapping does not already exist. If {@code instance} is * {@code null}, then no instance mapping is created. * * @param key * the {@code Class} to be mapped to the specified {@code value}. * @param value * the {@code Class} to be associated with the specified key * @param instance * the object instance to be associated with the specified key * @see #getClassMapping(Class) * @see #getClassInstance(Class) * @see #removeClassMapping(Class) */ public void addClassMapping(Class key, Class value, Object instance) { if (key == null || value == null) return; synchronized (classes) { classes.put(key, value); } if (instance != null) { synchronized (instances) { instances.put(key, instance); } } } /** * Removes any existing class mappings for the {@code Class} type of the * specified {@code Object}. This method calls {@code getClass()} on the * specified {@code Object} and dispatches to * {@code removeClassMapping(Class key)}. If {@code obj} is {@code null}, * then this method returns {@code null}. *

* Removing the mapping for the specified {@code Class} will also remove it * for all non-specific subclasses. This means that subclasses of the * specified {@code Class} will require specific mappings if the it is * desired for the existing mapping behavior for these classes to remain the * same. *

* If any instance mappings exist for the specified {@code Class}, they are * also removed. This means non-specific subclass instance mappings will * also be removed. * * @param obj * the {@code Object} whose {@code Class} will be removed from * the internal mapping * @return the {@code Class} whose mapping has been removed * @see #removeClassMapping(Class) * @see #addClassMapping(Object, Class) * @see #getClassMapping(Object) * @see #getClassInstance(Class) */ public Class removeClassMapping(Object obj) { Class key = obj == null ? null : obj.getClass(); return removeClassMapping(key); } /** * Removes any existing class mappings for the {@code Class} type of the * specified {@code Object}. This method calls {@code getClass()} on the * specified {@code Object} and dispatches to * {@code removeClassMapping(Class key)}. If {@code obj} is {@code null}, * then this method returns {@code null}. *

* Removing the mapping for the specified {@code Class} will also remove it * for all non-specific subclasses. This means that subclasses of the * specified {@code Class} will require specific mappings if the it is * desired for the existing mapping behavior for these classes to remain the * same. *

* If any instance mappings exist for the specified {@code Class}, they are * also removed. This means non-specific subclass instance mappings will * also be removed. * * @param key * the {@code Class} whose internal mapping will be removed * @return the {@code Class} whose mapping has been removed * @see #addClassMapping(Class, Class) * @see #addClassMapping(Class, Class, Object) * @see #getClassMapping(Object) * @see #getClassInstance(Class) */ public Class removeClassMapping(Class key) { if (key == null) return null; Class c = null; synchronized (classes) { c = (Class) classes.remove(key); } synchronized (instances) { instances.remove(key); } return c; } /** * Returns the {@code Class} associated with the {@code Class} of the * specified {@code Object}. If {@code obj} is {@code null}, this method * will return the value retrieved from {@code getDefaultMapping()}. * Otherwise, this method calls {@code obj.getClass()} and dispatches to * {@code getClassMapping(Class key)}. *

* If no mapping has been defined for the specified {@code Class}, then * it's superclass is checked, and then that classes' superclass, and so on * until {@code java.lang.Object} is reached. If a mapping is found anywhere * within the superclass hierarchy, then the mapped {@code Class} is * returned. Otherwise, the value returned by {@code getDefaultMapping()} is * returned. * * @param obj * the {@code Object} whose {@code Class's} internal mapping will * be returned * @return the {@code Class} that is mapped internally to the specified key * {@code Class} * @see #getDefaultMapping() * @see #addClassMapping(Object, Class) * @see #removeClassMapping(Object) */ public Class getClassMapping(Object obj) { Class key = obj == null ? null : obj.getClass(); return getClassMapping(key); } /** * Returns the {@code Class} associated with the specified {@code Class}. * If {@code key} is {@code null}, this method will return the value * retrieved from {@code getDefaultMapping()}. If no mapping has been * defined for the specified {@code Class}, then it's superclass is * checked, and then that classes' superclass, and so on until * {@code java.lang.Object} is reached. If a mapping is found anywhere * within the superclass hierarchy, then the mapped {@code Class} is * returned. Otherwise, the value returned by {@code getDefaultMapping()} is * returned. * * @param key * the {@code Class} whose internal mapping will be returned * @return the {@code Class} that is mapped internally to the specified * {@code key} * @see #getDefaultMapping() * @see #addClassMapping(Class, Class) * @see #removeClassMapping(Class) */ public Class getClassMapping(Class key) { if (key == null) return defaultClass; Class value = null; synchronized (classes) { for (Class c = key; c != null && value == null; c = c .getSuperclass()) { value = (Class) classes.get(c); } } return value == null ? defaultClass : value; } /** * Returns the {@code Object} instance associated with the specified * {@code Class}. If {@code key} is {@code null}, this method will return * the value retrieved from {@code getDefaultInstance()}. If no mapping has * been defined for the specified {@code Class}, then it's superclass is * checked, and then that classes' superclass, and so on until * {@code java.lang.Object} is reached. If an instance mapping is found * anywhere within the superclass hierarchy, then the mapped {@code Object} * is returned. Otherwise, the value returned by * {@code getDefaultInstance()} is returned. * * @param key * the {@code Class} whose internal mapping will be returned * @return the {@code Object} instance that is mapped internally to the * specified {@code key} * @see #getDefaultInstance() * @see #addClassMapping(Class, Class, Object) * @see #removeClassMapping(Class) */ public Object getClassInstance(Class key) { if (key == null) return defaultInstance; Object value = null; synchronized (instances) { for (Class c = key; c != null && value == null; c = c .getSuperclass()) { value = instances.get(c); } } return value == null ? defaultInstance : value; } /** * Returns the default {@code Class} used for situations in which there is * no internal class mapping. This property is read-only and is initialized * within the {@code ClassMapping} constructor. * * @return the default {@code Class} used for situations in which there is * no internal class mapping. * @see #ClassMapping(Class, Object) */ public Class getDefaultMapping() { return defaultClass; } /** * Returns the default {@code Object} used for situations in which there is * no internal instance mapping. This property is read-only and is * initialized within the {@code ClassMapping} constructor. * * @return the default {@code Object} used for situations in which there is * no internal instance mapping. * @see #ClassMapping(Class, Object) */ public Object getDefaultInstance() { return defaultInstance; } } flexdock-1.2.4/src/java/core/org/flexdock/util/DockingUtility.java0000644000175000017500000010531412177715062026023 0ustar sylvestresylvestre/* * Created on Mar 14, 2005 */ package org.flexdock.util; import java.awt.Component; import java.awt.Container; import java.awt.Point; import javax.swing.JComponent; import javax.swing.JRootPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.SwingUtilities; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.defaults.DefaultRegionChecker; import org.flexdock.docking.props.DockablePropertySet; import org.flexdock.docking.state.DockingState; import org.flexdock.docking.state.MinimizationManager; /** * @author Christopher Butler */ public class DockingUtility implements DockingConstants { private DockingUtility() { // does nothing } /** * Returns the {@code DockingPort} that contains the specified * {@code Dockable}. If the {@code Dockable} is {@code null}, then a * {@code null} reference is returned. *

* This method will only return the immediate parent {@code DockingPort} of * the specified {@code Dockable} This means that a check is performed for * the {@code Component} returned by the {@code Dockable's} * {@code getComponent()} method. The {@code DockingPort} returned by this * method will not only be an ancestor {@code Container} of this * {@code Component}, but invoking the {@code DockingPort's} * {@code isParentDockingPort(Component comp)} with the this * {@code Component} will also return {@code true}. If both of these * conditions cannot be satisfied, then this method returns a {@code null} * reference. * * @param d * the {@code Dockable} whose parent {@code DockingPort} is to be * returned. * @return the imediate parent {@code DockingPort} that contains the * specified {@code Dockable}. * @see #getParentDockingPort(Component) */ public static DockingPort getParentDockingPort(Dockable d) { return d == null ? null : getParentDockingPort(d.getComponent()); } /** * Returns the {@code DockingPort} that contains the specified * {@code Component}. If the {@code Component} is {@code null}, then a * {@code null} reference is returned. *

* This method will only return the immediate parent {@code DockingPort} of * the specified {@code Component} This means that the {@code DockingPort} * returned by this method will not only be an ancestor {@code Container} of * the specified {@code Component}, but invoking its * {@code isParentDockingPort(Component comp)} with the specified * {@code Component} will also return {@code true}. If both of these * conditions cannot be satisfied, then this method returns a {@code null} * reference. * * @param comp * the {@code Component} whose parent {@code DockingPort} is to * be returned. * @return the immediate parent {@code DockingPort} that contains the * specified {@code Component}. */ public static DockingPort getParentDockingPort(Component comp) { DockingPort port = comp == null ? null : (DockingPort) SwingUtilities .getAncestorOfClass(DockingPort.class, comp); if (port == null) return null; return port.isParentDockingPort(comp) ? port : null; } /** * Returns {@code true} if the specified {@code DockingPort} has an ancestor * {@code DockingPort}; {@code false} otherwise. If the specified * {@code DockingPort} is {@code null}, then this method returns * {@code false}. * * @param dockingPort * the {@code DockingPort} to check for an ancestor port * @return {@code true} if the specified {@code DockingPort} has an ancestor * {@code DockingPort}; {@code false} otherwise. * @see SwingUtilities#getAncestorOfClass(java.lang.Class, * java.awt.Component) */ public static boolean isSubport(DockingPort dockingPort) { return dockingPort == null ? false : SwingUtilities.getAncestorOfClass( DockingPort.class, (Component) dockingPort) != null; } /** * Returns the deepest {@code DockingPort} within the specified * {@code Container} at the specified {@code location}. If either * {@code container} or {@code location} are {@code null}, then this method * returns {@code null}. *

* This method will find the deepest {@code Component} within the specified * container that the specified {@code Point} via * {@code SwingUtilities.getDeepestComponentAt(Component parent, int x, int y)}. * If no {@code Component} is resovled, then this method returns * {@code null}. If the resolved {@code Component} is a {@code DockingPort}, * then it is returned. Otherwise, the {@code Component's} * {@code DockingPort} ancestor is resovled and returned from * {@code SwingUtilities.getAncestorOfClass(Class c, Component comp)}, * passing {@code DockingPort.class} for the ancestor class parameter. * * @param container * the {@code Container} within which to find a * {@code DockingPort}. * @param location * the point within the specified {@code Container} at which to * search for a {@code DockingPort}. * @return the deepest {@code DockingPort} within the specified * {@code Container} at the specified {@code location}. * @see SwingUtilities#getDeepestComponentAt(java.awt.Component, int, int) * @see SwingUtilities#getAncestorOfClass(java.lang.Class, * java.awt.Component) */ public static DockingPort findDockingPort(Container container, Point location) { if (container == null || location == null) return null; Component deepestComponent = SwingUtilities.getDeepestComponentAt( container, location.x, location.y); if (deepestComponent == null) return null; // we're assured here that the deepest component is both a Component and // DockingPort in // this case, so we're okay to return here. if (deepestComponent instanceof DockingPort) return (DockingPort) deepestComponent; // getAncestorOfClass() will either return a null or a Container that is // also an instance of // DockingPort. Since Container is a subclass of Component, we're fine // in returning both // cases. return (DockingPort) SwingUtilities.getAncestorOfClass( DockingPort.class, deepestComponent); } /** * Returns the specified {@code region's} cross-axis equivalent region in * accordance with the orientation used by the specified {@code JSplitPane}. * If the {@code JSplitPane} is {@code null}, or the specified * {@code region} is invalid according to * {@code DockingManager.isValidDockingRegion(String region)}, then this * method returns {@code null}. * * {@code NORTH_REGION} and {@code SOUTH_REGION} are considered "vertical" * regions, while {@code WEST_REGION} and {@code EAST_REGION} are considered * horizontal regions. If the {@code JSplitPane} orientation matches the * specified {@code region} orientation, then the original {@code region} * value is returned. For instance, if the specified {@code region} is * {@code EAST_REGION}, and the {@code JSplitPane} is of a horizontal * orientation, then there is no need to translate the {@code region} * parameter across axes since its current axis is already horizontal. In * this case, {@code EAST_REGION} would be returned by this method. *

* If the axis of the specified {@code region} does not match the * orientation of the {@code JSplitPane}, then the region is translated to * its cross-axis equivalent and returns. In this case, {@code NORTH_REGION} * will be translated to {@code WEST_REGION}, {@code SOUTH_REGION} to * {@code EAST_REGION}, {@code WEST_REGION} to {@code NORTH_REGION}, and * {@code EAST_REGION} to {@code SOUTH_REGION}. {@code CENTER_REGION} is * never altered. * * @param splitPane * the {@code JSplitPane} whose orientation is to be used as a * target axis * @param region * the docking region to translate to the target axis * @return the specified {@code region's} cross-axis equivalent region in * accordance with the orientation used by the specified * {@code JSplitPane}. * @see DockingManager#isValidDockingRegion(String) * @see JSplitPane#getOrientation() * @see #isAxisEquivalent(String, String) */ public static String translateRegionAxis(JSplitPane splitPane, String region) { if (splitPane == null || !DockingManager.isValidDockingRegion(region)) return null; boolean horizontal = splitPane.getOrientation() == JSplitPane.HORIZONTAL_SPLIT; if (horizontal) { if (NORTH_REGION.equals(region)) region = WEST_REGION; else if (SOUTH_REGION.equals(region)) region = EAST_REGION; } else { if (WEST_REGION.equals(region)) region = NORTH_REGION; else if (EAST_REGION.equals(region)) region = SOUTH_REGION; } return region; } /** * Returns the opposite docking region of the specified {@code region}. For * {@code NORTH_REGION}, this method returns {@code SOUTH_REGION}. For * {@code SOUTH_REGION}, this method returns {@code NORTH_REGION}. For * {@code EAST_REGION}, this method returns {@code WEST_REGION}. For * {@code WEST_REGION}, this method returns {@code EAST_REGION}. For * {@code CENTER_REGION} or an invalid region, as specified by * {@code DockingManager.isValidDockingRegion(String region)}, this method * return {@code CENTER_REGION}. * * @param region * the region whose opposite is to be returned. * @return the opposite docking region of the specified {@code region}. * @see DockingManager#isValidDockingRegion(String) */ public static String flipRegion(String region) { if (!DockingManager.isValidDockingRegion(region) || CENTER_REGION.equals(region)) return CENTER_REGION; if (NORTH_REGION.equals(region)) return SOUTH_REGION; if (SOUTH_REGION.equals(region)) return NORTH_REGION; if (EAST_REGION.equals(region)) return WEST_REGION; return EAST_REGION; } /** * Tests for region equivalency between the specified region parameters * across horizontal and vertical axes. If either {@code region} or * {@code otherRegion} are {@code null} or invalid according to * {@code DockingManager.isValidDockingRegion(String region)}, then this * method returns {@code false}. *

* Equivalency within the same axis means that the two specified regions are * the same value, as each region is unique within its axis. Thus, this * method returns {@code true} if {@code region.equals(otherRegion)} returns * {@code true}. This includes {@code CENTER_REGION}, which is axis * independent. *

* {@code CENTER_REGION} is not an axis equivalent to any region other than * itself since it is the only docking region that does not correspond to a * horizontal or vertical axis. If either the specified {@code region} or * {@code otherRegion} is {@code CENTER_REGION} and the other is not, then * this method returns {@code false}. *

* Equivalancy across axes follows a top-to-left and bottom-to-right * mapping. In this fashion, {@code NORTH_REGION} and {@code WEST_REGION} * are equivalent and {@code SOUTH_REGION} and {@code EAST_REGION} are * equivalent. These combination will return {@code true} for this method. * All other region combinatinos will cause this method to return * {@code false}. * * @param region * the first region to check for equivalency * @param otherRegion * the second region to check for equivalency * @return {@code true} if the two specified regions are equal or cross-axis * equivalents, {@code false} otherwise. * @see DockingManager#isValidDockingRegion(String) */ public static boolean isAxisEquivalent(String region, String otherRegion) { if (!DockingManager.isValidDockingRegion(region) || !DockingManager.isValidDockingRegion(otherRegion)) return false; if (region.equals(otherRegion)) return true; if (CENTER_REGION.equals(region)) return false; if (NORTH_REGION.equals(region)) return WEST_REGION.equals(otherRegion); if (SOUTH_REGION.equals(region)) return EAST_REGION.equals(otherRegion); if (EAST_REGION.equals(region)) return SOUTH_REGION.equals(otherRegion); if (WEST_REGION.equals(region)) return NORTH_REGION.equals(otherRegion); return false; } /** * Returns {@code true} if the specified {@code region} is equal to either * {@code NORTH_REGION} or {@code WEST_REGION}. Returns {@code false} * otherwise. * * @param region * the {@code region} to check for top or left equivalency * @return {@code true} if the specified {@code region} is equal to either * {@code NORTH_REGION} or {@code WEST_REGION}; {@code false} * otherwise. * @see DockingConstants#NORTH_REGION * @see DockingConstants#WEST_REGION */ public static boolean isRegionTopLeft(String region) { return NORTH_REGION.equals(region) || WEST_REGION.equals(region); } /** * Returns the {@code String} docking region for the specified orientation * constant. {@code LEFT} maps to {@code WEST_REGION}, {@code RIGHT} maps * to {@code EAST_REGION}, {@code TOP} maps to {@code NORTH_REGION}, * {@code BOTTOM} maps to {@code SOUTH_REGION}, and {@code CENTER} maps to * {@code CENTER_REGION}. All other integer values will cause this method * to return {@code UNKNOWN_REGION}. *

* All constants, both integer an {@code String} values, can be found on the * {@code DockingConstants} interface. * * @param regionType * the orientation constant to translate into a docking region * @return the {@code String} docking region for the specified orientation * constant. * @see DockingConstants#LEFT * @see DockingConstants#RIGHT * @see DockingConstants#TOP * @see DockingConstants#BOTTOM * @see DockingConstants#CENTER * @see DockingConstants#WEST_REGION * @see DockingConstants#EAST_REGION * @see DockingConstants#NORTH_REGION * @see DockingConstants#SOUTH_REGION * @see DockingConstants#CENTER_REGION * @see DockingConstants#UNKNOWN_REGION */ public static String getRegion(int regionType) { switch (regionType) { case LEFT: return WEST_REGION; case RIGHT: return EAST_REGION; case TOP: return NORTH_REGION; case BOTTOM: return SOUTH_REGION; case CENTER: return CENTER_REGION; default: return UNKNOWN_REGION; } } /** * Returns {@code true} if the specified {@code Dockable} is currently * minimized; {@code false} otherwise. If the {@code Dockable} is * {@code null}, then this method returns {@code false}. *

* This method retrieves the current {@code DockingState} instance * associated with the {@code Dockable} and calls it's {@code isMinimized()} * method to return. {@code DockingState} for the specified {@code Dockable} * is queried by calling {@code getDockingState(Dockable dockable)} on the * {@code DockingManager's} currently installed {@code LayoutManager}. * * @param dockable * the {@code Dockable} whose minimized state is to be returned * @return {@code true} if the specified {@code Dockable} is currently * minimized; {@code false} otherwise. * @see DockingState#isMinimized() * @see DockingManager#getLayoutManager() * @see org.flexdock.docking.state.LayoutManager#getDockingState(Dockable) */ public static boolean isMinimized(Dockable dockable) { if (dockable == null) return false; DockingState info = getDockingState(dockable); return info == null ? false : info.isMinimized(); } /** * Returns an {@code int} value representing the current minimization * constraint for the specified {@code Dockable}. If the {@code Dockable} * is {@code null}, then this method returns * {@code MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT}. *

* This method retrieves the current {@code DockingState} instance * associated with the {@code Dockable} and calls it's * {@code getMinimizedConstraint()} method to return. {@code DockingState} * for the specified {@code Dockable} is queried by calling * {@code getDockingState(Dockable dockable)} on the * {@code DockingManager's} currently installed {@code LayoutManager}. * * @param dockable * the {@code Dockable} whose minimized constraint is to be * returned * @return an {@code int} value representing the current minimization * constraint for the specified {@code Dockable} * @see MinimizationManager#UNSPECIFIED_LAYOUT_CONSTRAINT * @see DockingState#getMinimizedConstraint()() * @see DockingManager#getLayoutManager() * @see org.flexdock.docking.state.LayoutManager#getDockingState(Dockable) */ public static int getMinimizedConstraint(Dockable dockable) { int defaultConstraint = MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT; DockingState info = dockable == null ? null : getDockingState(dockable); return info == null ? defaultConstraint : info.getMinimizedConstraint(); } private static DockingState getDockingState(Dockable dockable) { return DockingManager.getLayoutManager().getDockingState(dockable); } /** * Docks the specified {@code Dockable} relative to another already-docked * {@code Dockable} in the specified region. The "parent" {@code Dockable} * must currently be docked. If not, this method will return {@code false}. * Otherwise, its parent {@code DockingPort} will be resolved and the new * {@code Dockable} will be docked into the {@code DockingPort} relative to * the "parent" {@code Dockable}. This method defers processing to * {@code dockRelative(Dockable dockable, Dockable parent, String relativeRegion, float ratio)} * passing {@code UNSPECIFIED_SIBLING_PREF} for the {@code ratio} parameter. *

* This method returns {@code false} if any of the input parameters are * {@code null} or if the specified {@code region} is invalid according to * {@code DockingManager.isValidDockingRegion(String region)}. If the * specified region is other than CENTER, then a split layout should result. * * @param dockable * the {@code Dockable} to be docked * @param parent * the {@code Dockable} used as a reference point for docking * @param relativeRegion * the docking region into which {@code dockable} will be docked * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see #dockRelative(Dockable, Dockable, String, float) * @see DockingManager#isValidDockingRegion(String) * @see Dockable#getDockingPort() * @see DockingManager#dock(Dockable, DockingPort, String) */ public static boolean dockRelative(Dockable dockable, Dockable parent, String relativeRegion) { return dockRelative(parent, dockable, relativeRegion, UNSPECIFIED_SIBLING_PREF); } /** * Docks the specified {@code Dockable} relative to another already-docked * {@code Dockable} in the specified region with the specified split * proportion. The "parent" {@code Dockable} must currently be docked. If * not, this method will return {@code false}. Otherwise, its parent * {@code DockingPort} will be resolved and the new {@code Dockable} will be * docked into the {@code DockingPort} relative to the "parent" * {@code Dockable}. If the specified region is CENTER, then the * {@code proportion} parameter is ignored. Otherwise, a split layout should * result with the proportional space specified in the {@code proportion} * parameter allotted to the {@code dockable} argument. *

* This method returns {@code false} if any of the input parameters are * {@code null} or if the specified {@code region} is invalid according to * {@code DockingManager.isValidDockingRegion(String region)}. * * @param dockable * the {@code Dockable} to be docked * @param parent * the {@code Dockable} used as a reference point for docking * @param relativeRegion * the docking region into which {@code dockable} will be docked * @param ratio * the proportional space to allot the {@code dockable} argument * if the docking operation results in a split layout. * @return {@code true} if the docking operation was successful; * {@code false} otherwise. * @see DockingManager#isValidDockingRegion(String) * @see Dockable#getDockingPort() * @see DockingManager#dock(Dockable, DockingPort, String) */ public static boolean dockRelative(Dockable dockable, Dockable parent, String relativeRegion, float ratio) { if (parent == null || dockable == null || !DockingManager.isValidDockingRegion(relativeRegion)) return false; // set the sibling preference setSiblingPreference(parent, relativeRegion, ratio); DockingPort port = parent.getDockingPort(); if (port != null) return DockingManager.dock(dockable, port, relativeRegion); return false; } private static void setSiblingPreference(Dockable src, String region, float size) { if (size == UNSPECIFIED_SIBLING_PREF || CENTER_REGION.equals(region) || !DockingManager.isValidDockingRegion(region)) return; size = DefaultRegionChecker.validateSiblingSize(size); src.getDockingProperties().setSiblingSize(region, size); } /** * Returns {@code true} if the specified {@code Dockable} is currently * docked within a floating dialog. This method returns {@code false} if the * {@code Dockable} is presently, minimized, hidden, docked within the main * application layout, or if the {@code Dockable} parameter is {@code null}. *

* This method retrieves the current {@code DockingState} instance * associated with the {@code Dockable} and calls it's {@code isFloating()} * method to return. {@code DockingState} for the specified {@code Dockable} * is queried by calling {@code getDockingState(Dockable dockable)} on the * {@code DockingManager's} currently installed {@code LayoutManager}. * * @param dockable * the {@code Dockable} whose floating state is to be returned * @return {@code true} if the specified {@code Dockable} is currently * floating; {@code false} otherwise. * @see DockingState#isFloating() * @see DockingManager#getLayoutManager() * @see org.flexdock.docking.state.LayoutManager#getDockingState(Dockable) */ public static boolean isFloating(Dockable dockable) { DockingState info = getDockingState(dockable); return info == null ? false : info.isFloating(); } /** * Returns {@code true} if the specified {@code Dockable} is currently * docked within a {@code DockingPort}. This method returns {@code false} * if the {@code Dockable} is presently floating, minimized, hidden, or if * the {@code Dockable} parameter is {@code null}. * * @param dockable * the {@code Dockable} whose embedded state is to be returned * @return {@code true} if the specified {@code Dockable} is currently * docked within a {@code DockingPort}; {@code false} otherwise. * @see DockingManager#isDocked(Dockable) * @see #isFloating(Dockable) */ public static boolean isEmbedded(Dockable dockable) { return dockable == null ? false : DockingManager.isDocked(dockable) && !isFloating(dockable); } /** * Sets the divider location of the split layout embedded within the * specified {@code DockingPort}. This method differs from both * {@code setSplitProportion(Dockable dockable, float proportion)} in that * this method resolves the split layout embedded within the * specified {@code DockingPort}, whereas the other method modifies the * split layout containing its respective {@code Dockable} * parameter. *

* The resulting divider location will be a percentage of the split layout * size based upon the {@code proportion} parameter. Valid values for * {@code proportion} range from {@code 0.0F{@code to {@code 1.0F}. For * example, a {@code proportion} of {@code 0.3F} will move the divider to * 30% of the "size" (width for horizontal split, height * for vertical split) of the split container embedded within the specified * {@code DockingPort}. If a {@code proportion} of less than {@code 0.0F} * is supplied, the value }0.0F} is used. If a {@code proportion} greater * than {@code 1.0F} is supplied, the value }1.0F} is used. *

* This method should be effective regardless of whether the split layout in * question has been fully realized and is currently visible on the screen. * This should alleviate common problems associated with setting percentages * of unrealized {@code Component} dimensions, which are initially * {@code 0x0} before the {@code Component} has been rendered to the screen. *

* If the specified {@code DockingPort} is {@code null}, then no * {@code Exception} is thrown and no action is taken. Identical behavior * occurs if the {@code DockingPort} does not contain split layout. * * @param port * the {@code DockingPort} containing the split layout is to be * resized. * @param proportion * the percentage of split layout size to which the split divider * should be set. * @see SwingUtility#setSplitDivider(JSplitPane, float) */ public static void setSplitProportion(DockingPort port, float proportion) { if (port == null) return; Component comp = port.getDockedComponent(); if (comp instanceof JSplitPane) SwingUtility.setSplitDivider((JSplitPane) comp, proportion); } /** * Sets the divider location of the split layout containing the specified * dockable {@code Component}. *

* The resulting divider location will be a percentage of the split layout * size based upon the {@code proportion} parameter. Valid values for * {@code proportion} range from {@code 0.0F{@code to {@code 1.0F}. For * example, a {@code proportion} of {@code 0.3F} will move the divider to * 30% of the "size" (width for horizontal split, height * for vertical split) of the split container that contains the specified * {@code Dockable}. If a {@code proportion} of less than {@code 0.0F} is * supplied, the value }0.0F} is used. If a {@code proportion} greater than * {@code 1.0F} is supplied, the value }1.0F} is used. *

* It is important to note that the split divider location is only a * percentage of the container size from left to right or top to bottom. A * {@code proportion} of {@code 0.3F} does not imply that {@code dockable} * itself will be allotted 30% of the available space. The split divider * will be moved to the 30% position of the split container regardless of * the region in which the specified {@code Dockable} resides (which may * possibly result in {@code dockable} being allotted 70% of the available * space). *

* This method should be effective regardless of whether the split layout in * question has been fully realized and is currently visible on the screen. * This should alleviate common problems associated with setting percentages * of unrealized {@code Component} dimensions, which are initially * {@code 0x0} before the {@code Component} has been rendered to the screen. *

* If the specified {@code Dockable} is {@code null}, then no * {@code Exception} is thrown and no action is taken. Identical behavior * occurs if the {@code Dockable} does not reside within a split layout. *

* If the {@code Dockable} resides within a tabbed layout, a check is done * to see if the tabbed layout resides within a parent split layout. If so, * the resolved split layout is resized. Otherwise no action is taken. * * @param dockable * the {@code Dockable} whose containing split layout is to be * resized. * @param proportion * the percentage of containing split layout size to which the * split divider should be set. * @see SwingUtility#setSplitDivider(JSplitPane, float) */ public static void setSplitProportion(Dockable dockable, float proportion) { if (dockable == null) return; Component comp = dockable.getComponent(); Container parent = comp.getParent(); if (parent instanceof JTabbedPane) { parent = parent.getParent(); } if (!(parent instanceof DockingPort)) return; Container grandParent = parent.getParent(); if (grandParent instanceof JSplitPane) SwingUtility.setSplitDivider((JSplitPane) grandParent, proportion); } /** * Returns the text to be used by a {@code Dockable} as a tab label within a * tabbed layout. This method retrieves the associated * {@code DockablePropertySet} by calling {@code getDockingProperties()} on * the specified {@code Dockable}. It then returns the value retrieved from * calling {@code getDockableDesc()} on the {@code DockablePropertySet} * instance. If the specified {@code Dockable} is {@code null}, then this * method returns {@code null}. * * @param dockable * the {@code Dockable} whose tab-text is to be returned * @return the text to be used by a {@code Dockable} as a tab label within a * tabbed layout. * @see Dockable#getDockingProperties() * @see DockablePropertySet#getDockableDesc() */ public static String getTabText(Dockable dockable) { DockablePropertySet props = dockable == null ? null : dockable .getDockingProperties(); return props == null ? null : props.getDockableDesc(); } /** * Returns {@code true} if the specific {@code Object} is a {@code Dockable}. * If {@code obj instanceof Dockable} is {@code true}, then this method * returns {@code true}. A {@code null} parameter will cause this method to * return {@code false}. *

* Registered {@code Dockable} components, if they are {@code JComponents}, * will also have a {@code Boolean} client property present with the key * {@code Dockable.DOCKABLE_INDICATOR}, used by dockable * {@code JComponents} that don't implement the {@code Dockable} interface * directly, but acquire docking capabilities through a separate wrapper * {@code Dockable} implementation. For these components, the * {@code instanceof} check is insufficient since the valid {@code Dockable} * is implemented by a separate class. Therefore, if the {@code instanceof} * check fails, and the supplied {@code Object} parameter is a * {@code JComponent}, a client property with the key * {@code Dockable.DOCKABLE_INDICATOR} is checked for a value of * {@code Boolean.TRUE}. If the client property is present, then this * method returns {@code true}. * * @param obj * the {@code Object} to be checked to see if it represents a * valid {@code Dockable} * @return {@code true} if the specific {@code Object} is a {@code Dockable} * @see Dockable#DOCKABLE_INDICATOR * @see Boolean#TRUE * @see javax.swing.JComponent#getClientProperty(java.lang.Object) */ public static boolean isDockable(Object obj) { if (obj == null) return false; // if the object directly implements Dockable, then we can return from // here. if (obj instanceof Dockable) return true; // if the object is a JComponent, but not a Dockable implementation, // then check its // client property indicator if (obj instanceof JComponent) { Component comp = (Component) obj; return SwingUtility.getClientProperty(comp, Dockable.DOCKABLE_INDICATOR) == Boolean.TRUE; } // they may have a heavyweight Component that does not directly // implement Dockable. // in this case, Component does not have client properties we can check. // we'll have to // check directly with the DockingManager. if (obj instanceof Component) { Component comp = (Component) obj; return DockingManager.getDockable(comp) != null; } return false; } public static Dockable getAncestorDockable(Component comp) { if (comp == null) return null; if (isDockable(comp)) return DockingManager.getDockable(comp); Container parent = comp.getParent(); while (parent != null && !(parent instanceof JRootPane)) { if (isDockable(parent)) return DockingManager.getDockable(parent); parent = parent.getParent(); } return null; } public static boolean isActive(Dockable dockable) { if (dockable == null) return false; return dockable.getDockingProperties().isActive().booleanValue(); } } flexdock-1.2.4/src/java/core/org/flexdock/util/LookAndFeelSettings.java0000644000175000017500000001140012177715062026715 0ustar sylvestresylvestre/* * Created on Jul 1, 2005 */ package org.flexdock.util; import java.awt.Insets; import java.util.Hashtable; import java.util.Properties; import javax.swing.JTabbedPane; import javax.swing.LookAndFeel; import javax.swing.UIManager; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.l2fprod.gui.plaf.skin.Skin; import com.l2fprod.gui.plaf.skin.SkinLookAndFeel; /** * @author Christopher Butler */ public class LookAndFeelSettings { public static final String TAB_PANE_BORDER_INSETS = "TabbedPane.contentBorderInsets"; public static final String DOM_RESOURCE = "org/flexdock/util/laf-defaults.xml"; public static final String TAB_EDGE_INSET_KEY = "tabEdgeInset"; private static final String PROPERTY_KEY = "property"; private static final String KEY = "key"; private static final String VALUE = "value"; private static final LookAndFeelSettings SINGLETON = new LookAndFeelSettings(); private Hashtable propertyMappings; private boolean skinLFSupport; private LookAndFeelSettings() { propertyMappings = new Hashtable(); Document document = ResourceManager.getDocument(DOM_RESOURCE); NodeList nodes = document.getDocumentElement().getChildNodes(); for(int i=0; i0) return edge.intValue(); Insets tabInsets = UIManager.getInsets(TAB_PANE_BORDER_INSETS); if(tabInsets==null) return 1; switch(tabPlacement) { case JTabbedPane.TOP: return tabInsets.top; case JTabbedPane.BOTTOM: return tabInsets.bottom; case JTabbedPane.LEFT: return tabInsets.left; case JTabbedPane.RIGHT: return tabInsets.right; default: return 1; } } public static void setTabEdgeInset(String plafKey, int inset) { if(plafKey!=null) { SINGLETON.setProperty(TAB_EDGE_INSET_KEY, plafKey, String.valueOf(inset)); } } private String getCurrentPlafName() { LookAndFeel laf = UIManager.getLookAndFeel(); if(laf==null) return null; // return a special case for SkinLF if(isSkinLFSupported()) { if(laf.getClass()==SkinLookAndFeel.class) { Skin skin = SkinLookAndFeel.getSkin(); return skin==null? null: skin.getClass().getName(); } } // return the className for the current plaf return laf.getClass().getName(); } private boolean isSkinLFInClasspath() { try { // try to load the class Class c = SkinLookAndFeel.class; // if the class loaded, then we can return true return true; } catch(Throwable t) { // if the class didn't load, then return false; return false; } } private static Integer getInteger(String string) { try { return string==null? null: new Integer(string); } catch(Exception e) { return null; } } } flexdock-1.2.4/src/java/core/org/flexdock/util/NestedComponents.java0000644000175000017500000001557612177715062026363 0ustar sylvestresylvestre/* * Created on Mar 10, 2005 */ package org.flexdock.util; import java.awt.Component; import javax.swing.JRootPane; import org.flexdock.docking.Dockable; /** * This is a utility class for small, short-lived object instances used to find * nested {@code Components}. It models a relationship between nested * {@code Components} within an AWT {@code Container} hierarchy such that, given * a starting {@code Component} from which to search, it will find two * {@code Components} nested within each other of specific class types. The * "deeper" component will be a descendent of the "parent" component. *

* For example, given a {@code JTextField} within a content frame, the * application logic may need to check to see if the text field resides within a * certain application-specific container set. Perhaps all {@code JTables} * embedded within {@code JSplitPanes} are significant within the particular * application. The * {@code find(Component searchSrc, Class childClass, Class parentClass)} method * on this class will be able to return a {@code NestedComponents} instance * indicating whether the specified text field resides within a {@code JTable} * that is embedded within a {@code JSplitPane}. *

* Although perhaps a bit contrived, this example shows a generic use for this * class. The FlexDock framework itself has a particular interest in * {@code Dockable} components that are embedded within {@code DockingPorts}, * especially during drag operations. As a {@code Dockable} is dragged over an * {@code DockingPort}, this class allows the framework to determine with a * single object instance any {@code Dockables} currently embedded within the * target {@code DockingPort}, starting with the deepest {@code Component} at * the current mouse point during the drag. *

* This classes' member fields are {@code public} and may be both accessed and * modified by external code as needed within their particular usage context. * This is by design for ease of use within the FlexDock framework. * Consequently, instances of this class should only be used for short-lived * operations. Since its member fields may be modified publicly, instances of * this class should not be cached, nor should its member values be indexed as * they are subject to arbitrary changes over the long term. * * @author Christopher Butler */ public class NestedComponents { public Component searchSrc; public Component child; public Component parent; /** * Creates and returns a new {@code NestedComponents} instance, searching * the parent {@code Container} hierarcy of the specified {@code searchSrc} * for an ancestor of type {@code childClass} and a more senior ancestor of * type {@code parentClass}. *

* If either {@code searchSrc}, {@code childClass}, or {@code parentClass} * is {@code null}, this method returns {@code null}. *

* If {@code searchSrc} is an instanceof {@code childClass}, then the * {@code child} field on the resulting {@code NestedComponents} will be * equal (==) to the {@code searchSrc} field. If {@code searchSrc} is an * instanceof {@code parentClass}, then the {@code parent} field on the * resulting {@code NestedComponents} will be equal (==) to the * {@code searchSrc} field. If an instance of {@code parentClass} is found * before {@code childClass}, this the resulting {@code NestedComponents} * instance will have a {@code null} {@code child} field. * * @param searchSrc * the {@code Component} from which to start searching for parent * {@code Containers}. * @param childClass * the {@code Class} of the desired "child" {@code Component} * @param parentClass * the {@code Class} of the desired "parent" {@code Component} * @return a new {@code NestedComponents} instance based upon the specified * parameters. */ public static NestedComponents find(Component searchSrc, Class childClass, Class parentClass) { if (searchSrc == null || childClass == null || parentClass == null) return null; NestedComponents nest = new NestedComponents(searchSrc, null, null); Component c = searchSrc; while (c != null && !(c instanceof JRootPane)) { if (nest.child == null && isInstanceOf(c, childClass)) { nest.child = c; } else if (isParentContainer(c, parentClass)) { nest.parent = c; break; } c = c.getParent(); } return nest; } private static boolean isParentContainer(Component c, Class parentClass) { if (parentClass == RootWindow.class) { return RootWindow.isValidRootContainer(c); } else return parentClass.isAssignableFrom(c.getClass()); } private static boolean isInstanceOf(Object obj, Class clazz) { if (clazz.isAssignableFrom(obj.getClass())) return true; // special case if (clazz == Dockable.class) { return DockingUtility.isDockable(obj); } return false; } private NestedComponents(Component searchSrc, Component child, Component parent) { this.searchSrc = searchSrc; this.child = child; this.parent = parent; } /** * Returns {@code true} if both {@code child} and {@code parent} fields are * non-{@code null}; {@code false} otherwise. * * @return {@code true} if both {@code child} and {@code parent} fields are * non-{@code null}; {@code false} otherwise. */ public boolean isFull() { return child != null && parent != null; } /** * Overridden to match the {@code equals()} method. * * @return a hash code value for this object. * @see #equals(Object) */ public int hashCode() { int h = searchSrc.hashCode(); h += child == null ? 0 : child.hashCode(); h += parent == null ? 0 : parent.hashCode(); return h; } /** * Returns {@code true} if the specified {@code Object} is a * {@code NestedComponents} instance and all shares all of the same field * references (==) as this {@code NestedComponents} for field * {@code searchSrc}, {@code child}, and {@code parent}. * * @param obj * the {@code Object} to test for equality * @return {@code true} if the specified {@code Object} is "equal" to this * {@code NestedComponents} instance; {@code false} otherwise. */ public boolean equals(Object obj) { if (!(obj instanceof NestedComponents)) return false; NestedComponents other = (NestedComponents) obj; return searchSrc == other.searchSrc && child == other.child && parent == other.parent; } } flexdock-1.2.4/src/java/core/org/flexdock/util/OsInfo.java0000644000175000017500000001141112177715062024250 0ustar sylvestresylvestre/* * Created on Aug 15, 2005 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package org.flexdock.util; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Properties; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /** * @author Christopher Butler */ public class OsInfo { private static final OsInfo SINGLETON = new OsInfo(); private static final String XML_RESOURCE = "org/flexdock/util/os-info.xml"; private String osArch; private List osNameList; private List osLibraryList; private List prefixOsLibraryList; public static OsInfo getInstance() { return SINGLETON; } public OsInfo() { this(null); } public OsInfo(Properties systemProps) { if(systemProps==null) systemProps = System.getProperties(); Document doc = ResourceManager.getDocument(XML_RESOURCE); osArch = getSystemArch(doc, systemProps); osNameList = Collections.unmodifiableList(getOSChain(doc, systemProps)); ArrayList libList = new ArrayList(osNameList.size()); ArrayList prefixLibList = new ArrayList(osNameList.size()); for(Iterator it=osNameList.iterator(); it.hasNext();) { String osName = (String)it.next(); libList.add(osName + "-" + osArch); } libList.addAll(osNameList); for(Iterator it=libList.iterator(); it.hasNext();) { String prefixed = "-" + it.next(); prefixLibList.add(prefixed); } osLibraryList = Collections.unmodifiableList(libList); prefixOsLibraryList = Collections.unmodifiableList(prefixLibList); } private String getSystemArch(Document doc, Properties systemProps) { String archTag = "arch"; String sysArch = format(systemProps.getProperty("os.arch")); Element archElem = findElementByName(doc, archTag, sysArch); while(isNested(archElem, archTag)) { archElem = (Element)archElem.getParentNode(); } return archElem==null? sysArch: archElem.getAttribute("name"); } private List getOSChain(Document doc, Properties systemProps) { String osTag = "os"; String osName = format(systemProps.getProperty("os.name")); Element osElem = findElementByName(doc, osTag, osName); ArrayList list = new ArrayList(); while(osElem!=null && osTag.equals(osElem.getTagName())) { list.add(osElem.getAttribute("name")); osElem = (Element)osElem.getParentNode(); } if(list.isEmpty()) list.add(osName); return list; } private Element findElementByName(Document doc, String tagName, String nameAttrib) { NodeList list = doc.getElementsByTagName(tagName); for(int i=0; inot cached via the{@code MediaTracker}. * * @param imageURL * the {@code URL} indicating where the image resource may be * found. * @param hotPoint * the X and Y of the large cursor's hot spot. The hotSpot values * must be less than the Dimension returned by * getBestCursorSize(). * @param name * a localized description of the cursor, for Java Accessibility * use. * @exception NullPointerException * if specified resource cannot be found. * @exception IndexOutOfBoundsException * if the hotSpot values are outside * @return a {@code Cursor} created from the specified resource URL */ public static Cursor createCursor(URL imageURL, Point hotPoint, String name) { Image image = createImage(imageURL); Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(image, hotPoint, name); return c; } /** * Returns a {@code Cursor} object based on the specified resource URL. * Throws a {@code NullPointerException} if specified resource cannot be * found. Dispatches to {@code createImage(String url)}, so {@code Image} * objects are not cached via the{@code MediaTracker}. * * @param url * the {@code String} describing the resource to be looked up * @param hotPoint * the X and Y of the large cursor's hot spot. The hotSpot values * must be less than the Dimension returned by * getBestCursorSize(). * @param name * a localized description of the cursor, for Java Accessibility * use. * @exception NullPointerException * if specified resource cannot be found. * @exception IndexOutOfBoundsException * if the hotSpot values are outside * @return a {@code Cursor} created from the specified resource URL */ public static Cursor createCursor(String url, Point hotPoint, String name) { Image image = createImage(url); Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(image, hotPoint, name); return c; } /** * Attempts to load the specified native {@code library}, using * {@code classpathResource} and the filesystem to implement several * fallback mechanisms in the event the library cannot be loaded. This * method should provide seamless installation and loading of native * libraries from within the classpath so that native libraries may be * packaged within the relavant library JAR, rather than requiring separate * user installation of the native libraries into the system {@code $PATH}. *

* If the specified {@code library} is {@code null}, then this method * returns with no action taken. *

* This method will first attempt to call * {@code System.loadLibrary(library)}. If this call is successful, then * the method will exit here. If an {@code UnsatisfiedLinkError} is * encountered, then this method attempts to locate a FlexDock-specific * filesystem resource for the native library, called the "FlexDock * Library". *

* The FlexDock Library will reside on the filesystem under the user's home * directory with the path ${user.home}/flexdock/${library}${native.lib.extension}. * Thus, if this method is called with an argument of {@code "foo"} for the * library, then under windows the FlexDock Library should be * C:\Documents and Settings\${user.home}\flexdock\foo.dll. Under * any type of Unix system, the FlexDock library should be * /home/${user.home}/flexdock/foo.so. *

* If the FlexDock Library exists on the filesystem, then this method will * attempt to load it by calling {@code System.load(String filename)} with * the FlexDock Library's absolute path. If this call is successful, then * the method exits here. *

* If the FlexDock Library cannot be loaded, then the specified * {@code classpathResource} is checked. If {@code classpathResource} is * {@code null}, then there is no more information available to attempt to * resolve the requested library and this method throws the last * {@code UnsatisfiedLinkError} encountered. *

* If {@code classpathResource} is non-{@code null}, then an * {@code InputStream} to the specified resource is resolved from the class * loader. The contents of the {@code InputStream} are read into a * {@code byte} array and written to disk as the FlexDock Library file. The * FlexDock Library is then loaded with a call to * {@code System.load(String filename)} with the FlexDock Library's absolute * path. If the specified {@code classpathResource} cannot be resolved by * the class loader, if any errors occur during this process of extracting * and writing to disk, or if the resulting FlexDock Library file cannot be * loaded as a native library, then this method throws an appropriate * {@code UnsatisfiedLinkError} specific to the situation that prevented the * native library from loading. *

* Note that because this method may extract resources from the classpath * and install to the filesystem as a FlexDock Library, subsequent calls to * this method across JVM sessions will find the FlexDock Library on the * filesystem and bypass the extraction process. * * @param library * the native library to load * @param classpathResource * the fallback location within the classpath from which to * extract the desired native library in the event it is not * already installed on the target system * @exception UnsatisfiedLinkError * if the library cannot be loaded */ public static void loadLibrary(String library, String classpathResource) { if (library == null) return; UnsatisfiedLinkError linkageError = null; try { System.loadLibrary(library); return; } catch (UnsatisfiedLinkError err) { // pass through here linkageError = err; } // determine a file from which we can load our library. File file = new File(System.getProperty("user.home") + "/flexdock"); file.mkdirs(); file = new File(file.getAbsolutePath() + "/" + library + LIBRARY_EXTENSION); // if the file already exists, try to load from it if (file.exists()) { try { System.load(file.getAbsolutePath()); return; } catch (UnsatisfiedLinkError err) { // pass through here linkageError = err; } } // if we can't load from the classpath, then we're stuck. // throw the last UnsatisfiedLinkError we encountered. if (classpathResource == null && linkageError != null) throw linkageError; // if the file didn't exist, or we couldn't load from it, // we'll have to pull from the classpath resource and write it // to this file. We'll then try to load from the file again. FileOutputStream fileOut = null; // get a handle to our resource in the classpath ClassLoader cl = ResourceManager.class.getClassLoader(); InputStream in = cl.getResourceAsStream(classpathResource); if (in == null) throw new UnsatisfiedLinkError( "Unable to locate classpath resource: " + classpathResource); try { // create an outputstream to our destination file fileOut = new FileOutputStream(file); byte[] tmp = new byte[1024]; // copy the contents of our resource out to the destination // file 1K at a time. 1K may seem arbitrary at first, but today // is a Tuesday, so it makes perfect sense. int bytesRead = in.read(tmp); while (bytesRead != -1) { fileOut.write(tmp, 0, bytesRead); bytesRead = in.read(tmp); } } catch (IOException giveUp) { // well, I guess we're screwed, aren't we? UnsatisfiedLinkError err = new UnsatisfiedLinkError( "Unable to extract resource to file: " + file.getAbsolutePath()); err.initCause(giveUp); throw err; } finally { close(fileOut); close(in); } // now that our classpath resource has been written to disk, load the // native // library from this file System.load(file.getAbsolutePath()); } /** * Returns a {@code Document} object based on the specified resource * {@code uri}. This method resolves a {@code URL} from the specified * {@code String} via {@code getResource(String uri)} and dispatches to * {@code getDocument(URL url)}. If the specified {@code uri} is * {@code null}, then this method returns {@code null}. * * @param uri * the {@code String} describing the resource to be looked up * @return a {@code Document} object based on the specified resource * {@code uri} * @see #getResource(String) * @see #getDocument(URL) */ public static Document getDocument(String uri) { URL resource = getResource(uri); return getDocument(resource); } /** * Returns a {@code Document} object based on the specified resource * {@code URL}. This method will open an {@code InputStream} to the * specified {@code URL} and construct a {@code Document} instance. If any * {@code Exceptions} are encountered in the process, this method returns * {@code null}. If the specified {@code URL} is {@code null}, then this * method returns {@code null}. * * @param url * the {@code URL} describing the resource to be looked up * @return a {@code Document} object based on the specified resource * {@code URL} */ public static Document getDocument(URL url) { if (url == null) return null; InputStream inStream = null; try { inStream = url.openStream(); DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); return builder.parse(inStream); } catch (Exception e) { System.err.println("Exception: " +e.getMessage()); } finally { close(inStream); } return null; } /** * Returns a {@code Properties} object based on the specified resource * {@code uri}. This method resolves a {@code URL} from the specified * {@code String} via {@code getResource(String uri)} and dispatches to * {@code getProperties(URL url, boolean failSilent)} with an argument of * {@code false} for {@code failSilent}. If the specified {@code uri} is * {@code null}, then this method will print a stack trace for the ensuing * {@code NullPointerException} and return {@code null}. * * @param uri * the {@code String} describing the resource to be looked up * @return a {@code Properties} object based on the specified resource * {@code uri}. * @see #getResource(String) * @see #getProperties(URL, boolean) */ public static Properties getProperties(String uri) { return getProperties(uri, false); } /** * Returns a {@code Properties} object based on the specified resource * {@code uri}. This method resolves a {@code URL} from the specified * {@code String} via {@code getResource(String uri)} and dispatches to * {@code getProperties(URL url, boolean failSilent)}, passing the * specified {@code failSilent} parameter. If the specified {@code uri} is * {@code null}, this method will return {@code null}. If * {@code failSilent} is {@code false}, then the ensuing * {@code NullPointerException's} stacktrace will be printed to the * {@code System.err} before returning. * * @param uri * the {@code String} describing the resource to be looked up * @param failSilent * {@code true} if no errors are to be reported to the * {@code System.err} before returning; {@code false} otherwise. * @return a {@code Properties} object based on the specified resource * {@code uri}. * @see #getResource(String) * @see #getProperties(URL, boolean) */ public static Properties getProperties(String uri, boolean failSilent) { URL url = getResource(uri); return getProperties(url, failSilent); } /** * Returns a {@code Properties} object based on the specified resource * {@code URL}. This method dispatches to * {@code getProperties(URL url, boolean failSilent)}, with an argument of * {@code false} for {@code failSilent}. If the specified {@code uri} is * {@code null}, this method will print the ensuing * {@code NullPointerException} stack tracke to the {@code System.err} and * return {@code null}. * * @param url * the {@code URL} describing the resource to be looked up * @return a {@code Properties} object based on the specified resource * {@code url}. * @see #getProperties(URL, boolean) */ public static Properties getProperties(URL url) { return getProperties(url, false); } /** * Returns a {@code Properties} object based on the specified resource * {@code url}. If the specified {@code uri} is {@code null}, this method * will return {@code null}. If any errors are encountered during the * properties-load process, this method will return {@code null}. If * {@code failSilent} is {@code false}, then the any encoutered error * stacktraces will be printed to the {@code System.err} before returning. * * @param url * the {@code URL} describing the resource to be looked up * @param failSilent * {@code true} if no errors are to be reported to the * {@code System.err} before returning; {@code false} otherwise. * @return a {@code Properties} object based on the specified resource * {@code url}. */ public static Properties getProperties(URL url, boolean failSilent) { if (failSilent && url == null) return null; InputStream in = null; try { in = url.openStream(); Properties p = new Properties(); p.load(in); return p; } catch (Exception e) { if (!failSilent) System.err.println("Exception: " +e.getMessage()); return null; } finally { close(in); } } /** * Calls {@code close()} on the specified {@code InputStream}. Any * {@code Exceptions} encountered will be printed to the {@code System.err}. * If {@code in} is {@code null}, then no {@code Exception} is thrown and * no action is taken. * * @param in * the {@code InputStream} to close * @see InputStream#close() */ public static void close(InputStream in) { try { if (in != null) in.close(); } catch (Exception e) { System.err.println("Exception: " +e.getMessage()); } } /** * Calls {@code close()} on the specified {@code OutputStream}. Any * {@code Exceptions} encountered will be printed to the {@code System.err}. * If {@code out} is {@code null}, then no {@code Exception} is thrown and * no action is taken. * * @param out * the {@code OutputStream} to close * @see OutputStream#close() */ public static void close(OutputStream out) { try { if (out != null) out.close(); } catch (Exception e) { System.err.println("Exception: " +e.getMessage()); } } /** * Calls {@code close()} on the specified {@code Socket}. Any * {@code Exceptions} encountered will be printed to the {@code System.err}. * If {@code socket} is {@code null}, then no {@code Exception} is thrown * and no action is taken. * * @param socket * the {@code Socket} to close * @see Socket#close() */ public static void close(Socket socket) { try { if (socket != null) socket.close(); } catch (Exception e) { System.err.println("Exception: " +e.getMessage()); } } } flexdock-1.2.4/src/java/core/org/flexdock/util/RootWindow.java0000644000175000017500000003232312177715062025173 0ustar sylvestresylvestre/* Copyright (c) 2004 Christopher M Butler Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.flexdock.util; import java.awt.Component; import java.awt.Container; import java.awt.Frame; import java.awt.LayoutManager; import java.awt.Point; import java.awt.Rectangle; import java.awt.Window; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.WeakHashMap; import javax.swing.JApplet; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JRootPane; import javax.swing.JWindow; import javax.swing.RootPaneContainer; import javax.swing.SwingUtilities; /** * This class provides an abstraction of root containers used in Swing. It * allows transparent use of methods common to {@code JFrame}, {@code JApplet}, * {@code JWindow}, and {@code JDialog} without making an outward distinction * between the different container types. This is accomplished by wrapping the * root component. * * @author Chris Butler */ public class RootWindow { public static final Integer DEFAULT_MAXED_LAYER = new Integer( JLayeredPane.PALETTE_LAYER.intValue() - 10); private static final Map MAP_BY_ROOT_CONTAINER = new WeakHashMap(); private LayoutManager maxedLayout; private Integer maximizationLayer; private WeakReference root; private HashMap clientProperties; private static Component getRoot(Component c) { if (c == null) return null; if (isValidRootContainer(c)) return c; Container parent = c.getParent(); while (parent != null && !isValidRootContainer(parent)) parent = parent.getParent(); return parent; } /** * Traverses the container hierarchy to locate the root container and * returns corresponding {@code RootSwingContainer}. If {@code c} is * {@code null}, a {@code null} reference is returned. * * @param c * the container whose root we wish to find * @return the enclosing {@code RootSwingcontainer} */ public static RootWindow getRootContainer(Component c) { Component root = getRoot(c); if (!isValidRootContainer(root)) return null; RootWindow container = (RootWindow) MAP_BY_ROOT_CONTAINER.get(root); if (container == null) { container = new RootWindow(root); MAP_BY_ROOT_CONTAINER.put(root, container); } if (container.getRootContainer() != root) container.setRootContainer(root); return container; } /** * Indicates whether the supplied {@code Component} is, in fact, a root * Swing container. * * @param c * the {@code Component} we wish to check */ public static boolean isValidRootContainer(Component c) { return c != null && (c instanceof JFrame || c instanceof JApplet || c instanceof JWindow || c instanceof JDialog); } public static RootWindow[] getVisibleWindows() { Frame[] frames = Frame.getFrames(); HashSet cache = new HashSet(frames.length); for (int i = 0; i < frames.length; i++) populateWindowList(new RootWindow(frames[i]), cache, true); return (RootWindow[]) cache.toArray(new RootWindow[0]); } private static void populateWindowList(RootWindow win, HashSet winCache, boolean visOnly) { if (win == null || winCache.contains(win)) return; if (visOnly && !win.getRootContainer().isVisible()) return; winCache.add(win); Window[] children = win.getOwnedWindows(); for (int i = 0; i < children.length; i++) populateWindowList(new RootWindow(children[i]), winCache, visOnly); } /** * Creates a new {@code RootSwingContainer} wrapping the specified * component. */ protected RootWindow(Component root) { setMaximizationLayer(DEFAULT_MAXED_LAYER); setRootContainer(root); clientProperties = new HashMap(); } /** * Returns the {@code contentPane} object for the wrapped component. * * @return the {@code contentPane} property */ public Container getContentPane() { Container c = null; if (getRootContainer() instanceof RootPaneContainer) { c = ((RootPaneContainer) getRootContainer()).getContentPane(); } return c; } /** * Returns the {@code glassPane} object for the wrapped component. * * @return the {@code glassPane} property */ public Component getGlassPane() { Component c = null; if (getRootContainer() instanceof RootPaneContainer) { c = ((RootPaneContainer) getRootContainer()).getGlassPane(); } return c; } /** * Returns the {@code layeredPane} object for the wrapped component. * * @return the {@code layeredPane} property */ public JLayeredPane getLayeredPane() { JLayeredPane pane = null; if (getRootContainer() instanceof RootPaneContainer) { pane = ((RootPaneContainer) getRootContainer()).getLayeredPane(); } return pane; } /** * Gets the location of the wrapped component in the form of a point * specifying the component's top-left corner in the screen's coordinate * space. * * @return An instance of {@code Point} representing the top-left corner of * the component's bounds in the coordinate space of the screen. */ public Point getLocationOnScreen() { return getRootContainer().getLocationOnScreen(); } /** * Returns the layer associated with {@code Component} maximization. * * @return an {@code Integer} indicating the maximization layer property * @deprecated dead code last used in 0.2.0 */ public Integer getMaximizationLayer() { return maximizationLayer; } /** * Returns the {@code LayoutManager} associated with {@code Component} * maximization within the {@code RootSwingContainer}. * * @return a {@code LayoutManager} indicating the maximization layout * property * @deprecated dead code last used in 0.2.0 */ public LayoutManager getMaximizedLayout() { return maxedLayout; } /** * Returns the the wrapped component. ({@code JFrame}, {@code JApplet}, * etc...) * * @return the wrapped root container */ public Component getRootContainer() { return (Component) root.get(); } /** * Returns the {@code rootPane} object for the wrapped component. * * @return the {@code rootPane} property */ public JRootPane getRootPane() { JRootPane pane = null; if (getRootContainer() instanceof RootPaneContainer) { pane = ((RootPaneContainer) getRootContainer()).getRootPane(); } return pane; } /** * Convenience method that calls {@code revalidate()} on the current content * pane if it is a {@code JComponent}. If not, no action is taken. */ public void revalidateContentPane() { Container c = getContentPane(); if (c instanceof JComponent) ((JComponent) c).revalidate(); } /** * Sets the {@code contentPane} property for the wrapped component. * * @param contentPane * the {@code contentPane} object for the wrapped component */ public void setContentPane(Container contentPane) { if (getRootContainer() instanceof RootPaneContainer) { ((RootPaneContainer) getRootContainer()).setContentPane(contentPane); } } /** * Sets the {@code glassPane} property for the wrapped component. * * @param glassPane * the {@code glassPane} object for the wrapped component */ public void setGlassPane(Component glassPane) { if (getRootContainer() instanceof RootPaneContainer) { ((RootPaneContainer) getRootContainer()).setGlassPane(glassPane); } } /** * Sets the {@code layeredPane} property for the wrapped component. * * @param layeredPane * the {@code layeredPane} object for the wrapped component */ public void setLayeredPane(JLayeredPane layeredPane) { if (getRootContainer() instanceof RootPaneContainer) { ((RootPaneContainer) getRootContainer()).setLayeredPane(layeredPane); } } /** * Return an array containing all the windows this window currently owns. * * @return all the windows currently owned by this root window. */ public Window[] getOwnedWindows() { if (getRootContainer() instanceof JFrame) return ((JFrame) getRootContainer()).getOwnedWindows(); else if (getRootContainer() instanceof JWindow) return ((JWindow) getRootContainer()).getOwnedWindows(); else if (getRootContainer() instanceof JDialog) return ((JDialog) getRootContainer()).getOwnedWindows(); else return new Window[0]; } /** * Sets the layer associated with {@code Component} maximization within the * {@code RootSwingContainer}. If {@code layer} is {@code null}, * DEFAULT_MAXED_LAYER is used instead. * * @param layer * an {@code Integer} indicating the maximization layer property * @deprecated dead code last used in 0.2.0 */ public void setMaximizationLayer(Integer layer) { if (layer == null) layer = DEFAULT_MAXED_LAYER; maximizationLayer = layer; } /** * Sets the {@code LayoutManager} associated with {@code Component} * maximization within the {@code RootSwingContainer}. * * @param mgr * the {@code LayoutManager} associated with {@code Component} * maximization within the {@code RootSwingContainer}. * @deprecated dead code last used in 0.2.0 */ public void setMaximizedLayout(LayoutManager mgr) { maxedLayout = mgr; } /** * Sets the wrapped root container. * * @param root * the new wrapped root container */ protected void setRootContainer(Component root) { this.root = new WeakReference(root); } public void updateComponentTreeUI() { SwingUtilities.updateComponentTreeUI(getRootContainer()); pack(); } public void pack() { Component root = getRootContainer(); if (root instanceof JFrame) ((JFrame) root).pack(); else if (root instanceof JWindow) ((JWindow) root).pack(); else if (root instanceof JDialog) ((JDialog) root).pack(); } public void toFront() { Component root = getRootContainer(); if (root instanceof JFrame) ((JFrame) root).toFront(); else if (root instanceof JWindow) ((JWindow) root).toFront(); else if (root instanceof JDialog) ((JDialog) root).toFront(); } public boolean isActive() { Component root = getRootContainer(); if (root instanceof JFrame) return ((JFrame) root).isActive(); else if (root instanceof JWindow) return ((JWindow) root).isActive(); else if (root instanceof JDialog) return ((JDialog) root).isActive(); return false; } public Window getOwner() { Component root = getRootContainer(); if (root instanceof JFrame) return ((JFrame) root).getOwner(); else if (root instanceof JWindow) return ((JWindow) root).getOwner(); else if (root instanceof JDialog) return ((JDialog) root).getOwner(); return null; } public Rectangle getBounds() { return getRootContainer().getBounds(); } public void putClientProperty(Object key, Object value) { if (key == null) return; if (value == null) clientProperties.remove(key); else clientProperties.put(key, value); } public Object getClientProperty(Object key) { return key == null ? null : clientProperties.get(key); } } flexdock-1.2.4/src/java/core/org/flexdock/util/SwingUtility.java0000644000175000017500000004176312177715062025543 0ustar sylvestresylvestre/* * Created on Aug 23, 2004 */ package org.flexdock.util; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.KeyboardFocusManager; import java.awt.Point; import java.awt.Polygon; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.Window; import java.awt.image.BufferedImage; import javax.swing.JComponent; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.defaults.DefaultDockingPort; import org.flexdock.docking.defaults.DockingSplitPane; import com.l2fprod.gui.plaf.skin.Skin; import com.l2fprod.gui.plaf.skin.SkinLookAndFeel; /** * @author Christopher Butler */ public class SwingUtility { public static Component toComponent(Object obj) { return obj instanceof Component? (Component)obj: null; } public static void revalidate(Component comp) { if (comp instanceof JComponent) ((JComponent) comp).revalidate(); } public static void repaint(Component comp) { if(comp instanceof JComponent) ((JComponent)comp).repaint(); } public static void drawRect(Graphics g, Rectangle r) { if(g==null || r==null) return; g.drawRect(r.x, r.y, r.width, r.height); } public static DockingPort[] getChildPorts(DockingPort port) { if(!(port instanceof DefaultDockingPort)) return new DockingPort[0]; DefaultDockingPort parent = (DefaultDockingPort)port; Component docked = parent.getDockedComponent(); if(!(docked instanceof JSplitPane)) return new DockingPort[0]; JSplitPane split = (JSplitPane)docked; DockingPort left = null; DockingPort right = null; if(split.getLeftComponent() instanceof DockingPort) left = (DockingPort)split.getLeftComponent(); if(split.getRightComponent() instanceof DockingPort) right = (DockingPort)split.getRightComponent(); if(left==null && right==null) return new DockingPort[0]; if(left==null) return new DockingPort[] {right}; if(right==null) return new DockingPort[] {left}; return new DockingPort[] {left, right}; } public static Point[] getPoints(Rectangle rect) { return getPoints(rect, null); } public static Point[] getPoints(Rectangle rect, Component convertFromScreen) { if(rect==null) return null; Rectangle r = (Rectangle)rect.clone(); Point p = r.getLocation(); if(convertFromScreen!=null) SwingUtilities.convertPointFromScreen(p, convertFromScreen); r.setLocation(p); return new Point[] { p, new Point(p.x + r.width, p.y), new Point(p.x + r.width, p.y+r.height), new Point(p.x, p.y+r.height) }; } public static final void centerOnScreen(Window window) { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension windowSize = window.getSize(); if (windowSize.height > screenSize.height) windowSize.height = screenSize.height; if (windowSize.width > screenSize.width) windowSize.width = screenSize.width; window.setLocation((screenSize.width - windowSize.width) / 2, (screenSize.height - windowSize.height) / 2); } public static void center(Window window, Component parent) { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Rectangle bounds = new Rectangle(parent.getLocationOnScreen(), parent.getSize()); int w = window.getWidth(); int h = window.getHeight(); // center according to parent int x = ((int) bounds.getCenterX()) - w / 2; int y = ((int) bounds.getCenterY()) - h / 2; // does it fit on screen? if (x < 0) x = 0; else if (x + w > screenSize.getWidth()) x = ((int) screenSize.getWidth()) - w; if (y < 0) y = 0; else if (y + h > screenSize.getHeight()) y = ((int) screenSize.getHeight()) - h; // done window.setBounds(x, y, w, h); } public static Container getContentPane(Component c) { RootWindow rootWin = RootWindow.getRootContainer((Component)c); return rootWin==null? null: rootWin.getContentPane(); } public static void setPlaf(Class lookAndFeelClass) { String className = lookAndFeelClass==null? null: lookAndFeelClass.getName(); setPlaf(className); } public static void setPlaf(String lookAndFeelClassName) { if(loadSkinLF(lookAndFeelClassName)) return; try { UIManager.setLookAndFeel(lookAndFeelClassName); } catch(Exception e) { System.err.println("Exception: " +e.getMessage()); e.printStackTrace(); } } private static boolean loadSkinLF(String themePack) { if(themePack==null || !themePack.endsWith(".zip") || !isSkinLFInstalled()) return false; try { Skin skin = SkinLookAndFeel.loadThemePack(ResourceManager.getResource(themePack)); SkinLookAndFeel.setSkin(skin); UIManager.setLookAndFeel(SkinLookAndFeel.class.getName()); return true; } catch(Exception e) { System.err.println("Exception: " +e.getMessage()); e.printStackTrace(); return false; } } public static void add(Point p1, Point p2) { if(p1!=null && p2!=null) { p1.x += p2.x; p1.y += p2.y; } } public static void subtract(Point p1, Point p2) { if(p1!=null && p2!=null) { p1.x -= p2.x; p1.y -= p2.y; } } public static void translate(Component src, Polygon poly, Component dest) { if(src==null || poly==null || dest==null) return; Rectangle srcRect = src.getBounds(); srcRect.setLocation(0, 0); Rectangle destRect = SwingUtilities.convertRectangle(src, srcRect, dest); int deltaX = destRect.x - srcRect.x; int deltaY = destRect.y - srcRect.y; int len = poly.npoints; for(int i=0; iauthor Cyril Gambis - [Mar 17, 2005] */ public static Color brighter(Color color, double factor) { int red = color.getRed(); int green = color.getGreen(); int blue = color.getBlue(); int i = (int) (1.0 / (1.0 - factor)); if (red == 0 && green == 0 && blue == 0) { return new Color(i, i, i); } if (red > 0 && red < i) { red = i; } if (green > 0 && green < i) { green = i; } if (blue > 0 && blue < i) { blue = i; } return new Color(Math.min((int) (red / factor), 255), Math.min((int) (green / factor), 255), Math.min((int) (blue / factor), 255)); } /** * @param color * @param factor * @return a new color, darker than the one passed as argument by a percentage factor * *
author Cyril Gambis - [Mar 17, 2005] */ public static Color darker(Color color, double factor) { return new Color(Math.max((int) (color.getRed() * factor), 0), Math.max((int) (color.getGreen() * factor), 0), Math.max((int) (color.getBlue() * factor), 0)); } /** * @param color * @return the grey color corresponding to the color passed as parameter * *
author Cyril Gambis - [Mar 17, 2005] */ public static Color grayScale(Color color) { int grayTone = ((color.getRed() + color.getGreen() + color.getBlue())/3); return new Color(grayTone, grayTone, grayTone); } public static BufferedImage createImage(Component comp) { if(comp==null) return null; BufferedImage image = (BufferedImage)comp.createImage(comp.getWidth(), comp.getHeight()); Graphics g = image.createGraphics(); comp.paintAll(g); return image; } public static float getDividerProportion(JSplitPane splitPane) { if(splitPane==null) return 0; int size = splitPane.getOrientation()==JSplitPane.HORIZONTAL_SPLIT? splitPane.getWidth(): splitPane.getHeight(); int divLoc = splitPane.getDividerLocation(); return size==0? 0: (float)divLoc/((float)size - splitPane.getDividerSize()); } public static Component getOtherComponent(JSplitPane split, Component current) { if(split==null || current==null) return null; Component other = split.getLeftComponent(); if(other==current) other = split.getRightComponent(); return other; } public static void putClientProperty(Component c, Object key, Object value) { if(c instanceof JComponent) { ((JComponent)c).putClientProperty(key, value); } } public static Object getClientProperty(Component c, Object key) { if(c instanceof JComponent) { return ((JComponent)c).getClientProperty(key); } return null; } public static void removeClientProperty(Component c, Object key) { if(c instanceof JComponent) { ((JComponent)c).putClientProperty(key, null); } } public static Window getActiveWindow() { KeyboardFocusManager mgr = KeyboardFocusManager.getCurrentKeyboardFocusManager(); return mgr.getActiveWindow(); } public static int getSplitPaneSize(JSplitPane splitPane) { if(splitPane==null) return 0; boolean horiz = splitPane.getOrientation()==JSplitPane.HORIZONTAL_SPLIT? true: false; return horiz? splitPane.getWidth(): splitPane.getHeight(); } /** * Moves the supplied JSplitPane divider to the specified proportion. * Valid values for proportion range from 0.0F * to 1.0F. For example, a proportion of 0.3F will move the * divider to 30% of the "size" (width for horizontal split, height for vertical split) of the * split container that contains the specified Dockable. If a proportion of less * than 0.0F is supplied, the value 0.0F is used. If a proportion * greater than 1.0F is supplied, the value 1.0F is used. *
* This method should be effective regardless of whether the split layout in question has been fully realized * and is currently visible on the screen. This should alleviate common problems associated with setting * percentages of unrealized Component dimensions, which are initially 0x0 before * the Component has been rendered to the screen. *
* If the specified JSplitPane is null, then this method returns with no action * taken. * * @param split the JSplitPane whose divider location is to be set. * @param proportion a double-precision floating point value that specifies a percentage, * from zero (top/left) to 1.0 (bottom/right) * @see #getSplitPaneSize(JSplitPane) * @see JSplitPane#setDividerLocation(double) */ public static void setSplitDivider(final JSplitPane split, float proportion) { if(split==null) return; proportion = Math.max(0f, proportion); final float percent = Math.min(1f, proportion); int size = getSplitPaneSize(split); if(split.isVisible() && size>0 && EventQueue.isDispatchThread()) { split.setDividerLocation(proportion); split.validate(); return; } EventQueue.invokeLater(new Runnable() { public void run() { setSplitDivider(split, percent); } }); } public static boolean isSkinLFInstalled() { return LookAndFeelSettings.isSkinLFSupported(); } public static void toggleFocus(int direction) { KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); Component focused = manager.getFocusOwner(); Component newFocused = getNext(focused, direction); if (newFocused != null) { SwingUtility.focus(newFocused); } } private static Component getNext(Component comp, int direction) { Component next = null; JTabbedPane tab; if (comp instanceof JTabbedPane) { tab = (JTabbedPane) comp; } else { tab = (JTabbedPane) SwingUtilities.getAncestorOfClass(JTabbedPane.class, comp); } if (tab != null) { int index = tab.getSelectedIndex(); if (direction > 0 && index < tab.getTabCount() - 1) { tab.setSelectedIndex(index + 1); next = tab; } else if (direction <= 0 && index > 0) { tab.setSelectedIndex(index - 1); next = tab; } else { DefaultDockingPort port = (DefaultDockingPort) SwingUtilities.getAncestorOfClass(DefaultDockingPort.class, tab); next = getNext(port, direction); } } else { DockingSplitPane pane = (DockingSplitPane) SwingUtilities.getAncestorOfClass(DockingSplitPane.class, comp); if (pane == null) { return getFirstComponent(comp, direction); } Component left = pane.getLeftComponent(); Component right = pane.getRightComponent(); if (SwingUtilities.isDescendingFrom(comp, left)) { if (direction > 0) { next = getFirstComponent(right, direction); } else { DefaultDockingPort port = (DefaultDockingPort) SwingUtilities.getAncestorOfClass(DefaultDockingPort.class, pane); next = getNext(port, direction); } } else { if (direction > 0) { DefaultDockingPort port = (DefaultDockingPort) SwingUtilities.getAncestorOfClass(DefaultDockingPort.class, pane); next = getNext(port, direction); } else { next = getFirstComponent(left, direction); } } } return next; } private static Component getFirstComponent(Component c, int direction) { while (c instanceof DefaultDockingPort) { c = ((DefaultDockingPort) c).getDockedComponent(); if (c instanceof DockingSplitPane) { DockingSplitPane pane = (DockingSplitPane) c; c = direction > 0 ? pane.getLeftComponent() : pane.getRightComponent(); } } return c; } } flexdock-1.2.4/src/java/core/org/flexdock/util/TypedHashtable.java0000644000175000017500000005577312177715062025777 0ustar sylvestresylvestre/* * Created on Mar 16, 2005 */ package org.flexdock.util; import java.util.Hashtable; import java.util.Map; /** * @author Christopher Butler */ @SuppressWarnings(value = { "serial" }) public class TypedHashtable extends Hashtable { /** * Constructs a new, empty TypedHashtable with a default initial capacity (11) * and load factor of 0.75. */ public TypedHashtable() { super(); } /** * Constructs a new, empty TypedHashtable with the specified initial capacity * and default load factor of 0.75. * * @param initialCapacity the initial capacity of the hashtable. * @exception IllegalArgumentException if the initial capacity is less * than zero. */ public TypedHashtable(int initialCapacity) { super(initialCapacity); } /** * Constructs a new, empty TypedHashtable with the specified initial * capacity and the specified load factor. * * @param initialCapacity the initial capacity of the hashtable. * @param loadFactor the load factor of the hashtable. * @exception IllegalArgumentException if the initial capacity is less * than zero, or if the load factor is nonpositive. */ public TypedHashtable(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); } /** * Constructs a new TypedHashtable with the same mappings as the given * Map. The hashtable is created with an initial capacity sufficient to * hold the mappings in the given Map and a default load factor of 0.75. * * @param t the map whose mappings are to be placed in this map. * @throws NullPointerException if the specified map is null. */ public TypedHashtable(Map t) { super(t); } /** * Maps the specified key to the specified boolean value in this * hashtable. Since hashtables require Object values, this method will put either * Boolean.TRUE or Boolean.FALSE in the hashtable. If key is * null then this method returns with no action taken. * * @param key the hashtable key. * @param value the boolean value to be mapped to the specified key. * @see Boolean#TRUE * @see Boolean#FALSE * @see #put(Object, Object) */ public void put(Object key, boolean value) { Boolean b = value? Boolean.TRUE: Boolean.FALSE; put(key, b); } /** * Maps the specified key to the specified byte value in this * hashtable. Since hashtables require Object values, this method will wrap the * specified byte in a java.lang.Byte before inserting. If key is * null then this method returns with no action taken. * * @param key the hashtable key. * @param value the byte value to be mapped to the specified key. * @see Byte#Byte(byte) * @see #put(Object, Object) */ public void put(Object key, byte value) { put(key, new Byte(value)); } /** * Maps the specified key to the specified short value in this * hashtable. Since hashtables require Object values, this method will wrap the * specified short in a java.lang.Short before inserting. If key is * null then this method returns with no action taken. * * @param key the hashtable key. * @param value the short value to be mapped to the specified key. * @see Short#Short(short) * @see #put(Object, Object) */ public void put(Object key, short value) { put(key, new Short(value)); } /** * Maps the specified key to the specified int value in this * hashtable. Since hashtables require Object values, this method will wrap the * specified int in a java.lang.Integer before inserting. If key is * null then this method returns with no action taken. * * @param key the hashtable key. * @param value the int value to be mapped to the specified key. * @see Integer#Integer(int) * @see #put(Object, Object) */ public void put(Object key, int value) { put(key, new Integer(value)); } /** * Maps the specified key to the specified long value in this * hashtable. Since hashtables require Object values, this method will wrap the * specified long in a java.lang.Long before inserting. If key is * null then this method returns with no action taken. * * @param key the hashtable key. * @param value the long value to be mapped to the specified key. * @see Long#Long(long) * @see #put(Object, Object) */ public void put(Object key, long value) { put(key, new Long(value)); } /** * Maps the specified key to the specified float value in this * hashtable. Since hashtables require Object values, this method will wrap the * specified float in a java.lang.Float before inserting. If key is * null then this method returns with no action taken. * * @param key the hashtable key. * @param value the float value to be mapped to the specified key. * @see Float#Float(float) * @see #put(Object, Object) */ public void put(Object key, float value) { put(key, new Float(value)); } /** * Maps the specified key to the specified double value in this * hashtable. Since hashtables require Object values, this method will wrap the * specified double in a java.lang.Double before inserting. If key is * null then this method returns with no action taken. * * @param key the hashtable key. * @param value the double value to be mapped to the specified key. * @see Double#Double(double) * @see #put(Object, Object) */ public void put(Object key, double value) { put(key, new Double(value)); } /** * Maps the specified key to the specified char value in this * hashtable. Since hashtables require Object values, this method will wrap the * specified char in a java.lang.Character before inserting. If key is * null then this method returns with no action taken. * * @param key the hashtable key. * @param value the char value to be mapped to the specified key. * @see Character#Character(char) * @see #put(Object, Object) */ public void put(Object key, char value) { put(key, new Character(value)); } /** * Maps the specified key to the specified * value in this hashtable. If the key is null, then this * method returns with no action taken. If the value is null, then * this method removes any existing mapping in the hashtable for the specified key * by calling remove(Object key). * * The value can be retrieved by calling the get(Object key) method * with a key that is equal to the original key. * * @param key the hashtable key. * @param value the value. * @see Object#equals(Object) * @see #get(Object) * @see Hashtable#remove(java.lang.Object) */ public Object put(Object key, Object value) { if(value==null) return super.remove(key); else return super.put(key, value); } /** * Returns the boolean value associated with the specified key in this hashtable. * This method attempts to cast the value in this hashtable for the specified key to * a java.lang.Boolean and invoke its booleanValue() method. * If the key does not exist in the hashtable, or it maps to a non-Boolean value, * then this method returns the specified defaultValue. * * @param key the hashtable key * @param defaultValue the value to return if a valid boolean cannot be found for the specified key * @return the boolean value associated with the specified key in this hashtable. * @see #put(Object, boolean) * @see #getBoolean(Object) * @see Boolean#booleanValue() */ public boolean get(Object key, boolean defaultValue) { Object obj = get(key); return obj instanceof Boolean? defaultValue: ((Boolean)obj).booleanValue(); } /** * Returns the byte value associated with the specified key in this hashtable. * This method attempts to cast the value in this hashtable for the specified key to * a java.lang.Byte and invoke its byteValue() method. * If the key does not exist in the hashtable, or it maps to a non-Byte value, * then this method returns the specified defaultValue. * * @param key the hashtable key * @param defaultValue the value to return if a valid byte cannot be found for the specified key * @return the byte value associated with the specified key in this hashtable. * @see #put(Object, byte) * @see #getByte(Object) * @see Byte#byteValue() */ public byte get(Object key, byte defaultValue) { Object obj = get(key); return obj instanceof Byte? defaultValue: ((Byte)obj).byteValue(); } /** * Returns the short value associated with the specified key in this hashtable. * This method attempts to cast the value in this hashtable for the specified key to * a java.lang.Short and invoke its shortValue() method. * If the key does not exist in the hashtable, or it maps to a non-Short value, * then this method returns the specified defaultValue. * * @param key the hashtable key * @param defaultValue the value to return if a valid short cannot be found for the specified key * @return the short value associated with the specified key in this hashtable. * @see #put(Object, short) * @see #getShort(Object) * @see Short#shortValue() */ public short get(Object key, short defaultValue) { Object obj = get(key); return obj instanceof Short? defaultValue: ((Short)obj).shortValue(); } /** * Returns the int value associated with the specified key in this hashtable. * This method attempts to cast the value in this hashtable for the specified key to * a java.lang.Integer and invoke its intValue() method. * If the key does not exist in the hashtable, or it maps to a non-Integer value, * then this method returns the specified defaultValue. * * @param key the hashtable key * @param defaultValue the value to return if a valid int cannot be found for the specified key * @return the int value associated with the specified key in this hashtable. * @see #put(Object, int) * @see #getInt(Object) * @see Integer#intValue() */ public int get(Object key, int defaultValue) { Object obj = get(key); return obj instanceof Integer? defaultValue: ((Integer)obj).intValue(); } /** * Returns the long value associated with the specified key in this hashtable. * This method attempts to cast the value in this hashtable for the specified key to * a java.lang.Long and invoke its longValue() method. * If the key does not exist in the hashtable, or it maps to a non-Long value, * then this method returns the specified defaultValue. * * @param key the hashtable key * @param defaultValue the value to return if a valid long cannot be found for the specified key * @return the long value associated with the specified key in this hashtable. * @see #put(Object, long) * @see #getLong(Object) * @see Long#longValue() */ public long get(Object key, long defaultValue) { Object obj = get(key); return obj instanceof Long? defaultValue: ((Long)obj).longValue(); } /** * Returns the float value associated with the specified key in this hashtable. * This method attempts to cast the value in this hashtable for the specified key to * a java.lang.Float and invoke its floatValue() method. * If the key does not exist in the hashtable, or it maps to a non-Float value, * then this method returns the specified defaultValue. * * @param key the hashtable key * @param defaultValue the value to return if a valid float cannot be found for the specified key * @return the float value associated with the specified key in this hashtable. * @see #put(Object, float) * @see #getFloat(Object) * @see Float#floatValue() */ public float get(Object key, float defaultValue) { Object obj = get(key); return obj instanceof Float? defaultValue: ((Float)obj).floatValue(); } /** * Returns the double value associated with the specified key in this hashtable. * This method attempts to cast the value in this hashtable for the specified key to * a java.lang.Double and invoke its doubleValue() method. * If the key does not exist in the hashtable, or it maps to a non-Double value, * then this method returns the specified defaultValue. * * @param key the hashtable key * @param defaultValue the value to return if a valid double cannot be found for the specified key * @return the double value associated with the specified key in this hashtable. * @see #put(Object, double) * @see #getDouble(Object) * @see Double#doubleValue() */ public double get(Object key, double defaultValue) { Object obj = get(key); return obj instanceof Double? defaultValue: ((Double)obj).doubleValue(); } /** * Returns the char value associated with the specified key in this hashtable. * This method attempts to cast the value in this hashtable for the specified key to * a java.lang.Character and invoke its charValue() method. * If the key does not exist in the hashtable, or it maps to a non-Character value, * then this method returns the specified defaultValue. * * @param key the hashtable key * @param defaultValue the value to return if a valid char cannot be found for the specified key * @return the char value associated with the specified key in this hashtable. * @see #put(Object, char) * @see #getChar(Object) * @see Character#charValue() */ public char get(Object key, char defaultValue) { Object obj = get(key); return obj instanceof Character? defaultValue: ((Character)obj).charValue(); } /** * Retrieves the value to which the specified key is mapped in this hashtable and casts to a * java.lang.String before returning. If the specified key maps to an * object type other than a String value, then this method throws a * ClassCastException. * * @param key a key in the hashtable. * @return the String value to which the key is mapped in this hashtable; * null if the key is not mapped to any value in this hashtable. * @throws NullPointerException if the key is null. * @throws ClassCastException if the returns value is not a String * @see #put(Object, Object) */ public String getString(Object key) { return (String)get(key); } /** * Retrieves the value to which the specified key is mapped in this hashtable and casts to a * java.lang.Boolean before returning. If the specified key maps to an * object type other than a Boolean value, then this method throws a * ClassCastException. * * @param key a key in the hashtable. * @return the Boolean value to which the key is mapped in this hashtable; * null if the key is not mapped to any value in this hashtable. * @throws NullPointerException if the key is null. * @throws ClassCastException if the returns value is not a Boolean * @see #put(Object, Object) */ public Boolean getBoolean(Object key) { return (Boolean)get(key); } /** * Retrieves the value to which the specified key is mapped in this hashtable and casts to a * java.lang.Byte before returning. If the specified key maps to an * object type other than a Byte value, then this method throws a * ClassCastException. * * @param key a key in the hashtable. * @return the Byte value to which the key is mapped in this hashtable; * null if the key is not mapped to any value in this hashtable. * @throws NullPointerException if the key is null. * @throws ClassCastException if the returns value is not a Byte * @see #put(Object, Object) */ public Byte getByte(Object key) { return (Byte)get(key); } /** * Retrieves the value to which the specified key is mapped in this hashtable and casts to a * java.lang.Short before returning. If the specified key maps to an * object type other than a Short value, then this method throws a * ClassCastException. * * @param key a key in the hashtable. * @return the Short value to which the key is mapped in this hashtable; * null if the key is not mapped to any value in this hashtable. * @throws NullPointerException if the key is null. * @throws ClassCastException if the returns value is not a Short * @see #put(Object, Object) */ public Short getShort(Object key) { return (Short)get(key); } /** * Retrieves the value to which the specified key is mapped in this hashtable and casts to a * java.lang.Integer before returning. If the specified key maps to an * object type other than a Integer value, then this method throws a * ClassCastException. * * @param key a key in the hashtable. * @return the Integer value to which the key is mapped in this hashtable; * null if the key is not mapped to any value in this hashtable. * @throws NullPointerException if the key is null. * @throws ClassCastException if the returns value is not a Integer * @see #put(Object, Object) */ public Integer getInt(Object key) { return (Integer)get(key); } /** * Retrieves the value to which the specified key is mapped in this hashtable and casts to a * java.lang.Long before returning. If the specified key maps to an * object type other than a Long value, then this method throws a * ClassCastException. * * @param key a key in the hashtable. * @return the Long value to which the key is mapped in this hashtable; * null if the key is not mapped to any value in this hashtable. * @throws NullPointerException if the key is null. * @throws ClassCastException if the returns value is not a Long * @see #put(Object, Object) */ public Long getLong(Object key) { return (Long)get(key); } /** * Retrieves the value to which the specified key is mapped in this hashtable and casts to a * java.lang.Float before returning. If the specified key maps to an * object type other than a Float value, then this method throws a * ClassCastException. * * @param key a key in the hashtable. * @return the Float value to which the key is mapped in this hashtable; * null if the key is not mapped to any value in this hashtable. * @throws NullPointerException if the key is null. * @throws ClassCastException if the returns value is not a Float * @see #put(Object, Object) */ public Float getFloat(Object key) { return (Float)get(key); } /** * Retrieves the value to which the specified key is mapped in this hashtable and casts to a * java.lang.Double before returning. If the specified key maps to an * object type other than a Double value, then this method throws a * ClassCastException. * * @param key a key in the hashtable. * @return the Double value to which the key is mapped in this hashtable; * null if the key is not mapped to any value in this hashtable. * @throws NullPointerException if the key is null. * @throws ClassCastException if the returns value is not a Double * @see #put(Object, Object) */ public Double getDouble(Object key) { return (Double)get(key); } /** * Retrieves the value to which the specified key is mapped in this hashtable and casts to a * java.lang.Character before returning. If the specified key maps to an * object type other than a Character value, then this method throws a * ClassCastException. * * @param key a key in the hashtable. * @return the Character value to which the key is mapped in this hashtable; * null if the key is not mapped to any value in this hashtable. * @throws NullPointerException if the key is null. * @throws ClassCastException if the returns value is not a Character * @see #put(Object, Object) */ public Character getChar(Object key) { return (Character)get(key); } } flexdock-1.2.4/src/java/core/org/flexdock/util/UUID.java0000644000175000017500000004041012177715062023622 0ustar sylvestresylvestre/* * @(#)UUID.java 1.14 04/07/12 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package org.flexdock.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; /** * * A class that represents an immutable universally unique identifier (UUID). * A UUID represents a 128-bit value. * *

There exist different variants of these global identifiers. The methods * of this class are for manipulating the Leach-Salz variant, although the * constructors allow the creation of any variant of UUID (described below). * *

The layout of a variant 2 (Leach-Salz) UUID is as follows: * * The most significant long consists of the following unsigned fields: *

 * 0xFFFFFFFF00000000 time_low
 * 0x00000000FFFF0000 time_mid
 * 0x000000000000F000 version
 * 0x0000000000000FFF time_hi
 * 
* The least significant long consists of the following unsigned fields: *
 * 0xC000000000000000 variant
 * 0x3FFF000000000000 clock_seq
 * 0x0000FFFFFFFFFFFF node
 * 
* *

The variant field contains a value which identifies the layout of * the UUID. The bit layout described above is valid only for * a UUID with a variant value of 2, which indicates the * Leach-Salz variant. * *

The version field holds a value that describes the type of this * UUID. There are four different basic types of UUIDs: time-based, * DCE security, name-based, and randomly generated UUIDs. These types * have a version value of 1, 2, 3 and 4, respectively. * *

For more information including algorithms used to create UUIDs, * see the Internet-Draft UUIDs and GUIDs * or the standards body definition at * ISO/IEC 11578:1996. * * @version 1.14, 07/12/04 * @since 1.5 */ public final class UUID implements java.io.Serializable, Comparable { /** * Explicit serialVersionUID for interoperability. */ private static final long serialVersionUID = -4856846361193249489L; /* * The most significant 64 bits of this UUID. * * @serial */ private final long mostSigBits; /* * The least significant 64 bits of this UUID. * * @serial */ private final long leastSigBits; /* * The version number associated with this UUID. Computed on demand. */ private transient int version = -1; /* * The variant number associated with this UUID. Computed on demand. */ private transient int variant = -1; /* * The timestamp associated with this UUID. Computed on demand. */ private transient volatile long timestamp = -1; /* * The clock sequence associated with this UUID. Computed on demand. */ private transient int sequence = -1; /* * The node number associated with this UUID. Computed on demand. */ private transient long node = -1; /* * The hashcode of this UUID. Computed on demand. */ private transient int hashCode = -1; /* * The random number generator used by this class to create random * based UUIDs. */ private static volatile SecureRandom numberGenerator = null; // Constructors and Factories /* * Private constructor which uses a byte array to construct the new UUID. */ private UUID(byte[] data) { long msb = 0; long lsb = 0; //assert data.length == 16; for (int i=0; i<8; i++) msb = (msb << 8) | (data[i] & 0xff); for (int i=8; i<16; i++) lsb = (lsb << 8) | (data[i] & 0xff); this.mostSigBits = msb; this.leastSigBits = lsb; } /** * Constructs a new UUID using the specified data. * mostSigBits is used for the most significant 64 bits * of the UUID and leastSigBits becomes the * least significant 64 bits of the UUID. * * @param mostSigBits * @param leastSigBits */ public UUID(long mostSigBits, long leastSigBits) { this.mostSigBits = mostSigBits; this.leastSigBits = leastSigBits; } /** * Static factory to retrieve a type 4 (pseudo randomly generated) UUID. * * The UUID is generated using a cryptographically strong * pseudo random number generator. * * @return a randomly generated UUID. */ public static UUID randomUUID() { SecureRandom ng = numberGenerator; if (ng == null) { numberGenerator = ng = new SecureRandom(); } byte[] randomBytes = new byte[16]; ng.nextBytes(randomBytes); randomBytes[6] &= 0x0f; /* clear version */ randomBytes[6] |= 0x40; /* set to version 4 */ randomBytes[8] &= 0x3f; /* clear variant */ randomBytes[8] |= 0x80; /* set to IETF variant */ UUID result = new UUID(randomBytes); return new UUID(randomBytes); } /** * Static factory to retrieve a type 3 (name based) UUID based on * the specified byte array. * * @param name a byte array to be used to construct a UUID. * @return a UUID generated from the specified array. */ public static UUID nameUUIDFromBytes(byte[] name) { MessageDigest md; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException nsae) { throw new InternalError("MD5 not supported"); } byte[] md5Bytes = md.digest(name); md5Bytes[6] &= 0x0f; /* clear version */ md5Bytes[6] |= 0x30; /* set to version 3 */ md5Bytes[8] &= 0x3f; /* clear variant */ md5Bytes[8] |= 0x80; /* set to IETF variant */ return new UUID(md5Bytes); } /** * Creates a UUID from the string standard representation as * described in the {@link #toString} method. * * @param name a string that specifies a UUID. * @return a UUID with the specified value. * @throws IllegalArgumentException if name does not conform to the * string representation as described in {@link #toString}. */ public static UUID fromString(String name) { String[] components = name.split("-"); if (components.length != 5) throw new IllegalArgumentException("Invalid UUID string: "+name); for (int i=0; i<5; i++) components[i] = "0x"+components[i]; long mostSigBits = Long.decode(components[0]).longValue(); mostSigBits <<= 16; mostSigBits |= Long.decode(components[1]).longValue(); mostSigBits <<= 16; mostSigBits |= Long.decode(components[2]).longValue(); long leastSigBits = Long.decode(components[3]).longValue(); leastSigBits <<= 48; leastSigBits |= Long.decode(components[4]).longValue(); return new UUID(mostSigBits, leastSigBits); } // Field Accessor Methods /** * Returns the least significant 64 bits of this UUID's 128 bit value. * * @return the least significant 64 bits of this UUID's 128 bit value. */ public long getLeastSignificantBits() { return leastSigBits; } /** * Returns the most significant 64 bits of this UUID's 128 bit value. * * @return the most significant 64 bits of this UUID's 128 bit value. */ public long getMostSignificantBits() { return mostSigBits; } /** * The version number associated with this UUID. The version * number describes how this UUID was generated. * * The version number has the following meaning:

*

    *
  • 1 Time-based UUID *
  • 2 DCE security UUID *
  • 3 Name-based UUID *
  • 4 Randomly generated UUID *
* * @return the version number of this UUID. */ public int version() { if (version < 0) { // Version is bits masked by 0x000000000000F000 in MS long version = (int)((mostSigBits >> 12) & 0x0f); } return version; } /** * The variant number associated with this UUID. The variant * number describes the layout of the UUID. * * The variant number has the following meaning:

*

    *
  • 0 Reserved for NCS backward compatibility *
  • 2 The Leach-Salz variant (used by this class) *
  • 6 Reserved, Microsoft Corporation backward compatibility *
  • 7 Reserved for future definition *
* * @return the variant number of this UUID. */ public int variant() { if (variant < 0) { // This field is composed of a varying number of bits if ((leastSigBits >>> 63) == 0) { variant = 0; } else if ((leastSigBits >>> 62) == 2) { variant = 2; } else { variant = (int)(leastSigBits >>> 61); } } return variant; } /** * The timestamp value associated with this UUID. * *

The 60 bit timestamp value is constructed from the time_low, * time_mid, and time_hi fields of this UUID. The resulting * timestamp is measured in 100-nanosecond units since midnight, * October 15, 1582 UTC.

* * The timestamp value is only meaningful in a time-based UUID, which * has version type 1. If this UUID is not a time-based UUID then * this method throws UnsupportedOperationException. * * @throws UnsupportedOperationException if this UUID is not a * version 1 UUID. */ public long timestamp() { if (version() != 1) { throw new UnsupportedOperationException("Not a time-based UUID"); } long result = timestamp; if (result < 0) { result = (mostSigBits & 0x0000000000000FFFL) << 48; result |= ((mostSigBits >> 16) & 0xFFFFL) << 32; result |= mostSigBits >>> 32; timestamp = result; } return result; } /** * The clock sequence value associated with this UUID. * *

The 14 bit clock sequence value is constructed from the clock * sequence field of this UUID. The clock sequence field is used to * guarantee temporal uniqueness in a time-based UUID.

* * The clockSequence value is only meaningful in a time-based UUID, which * has version type 1. If this UUID is not a time-based UUID then * this method throws UnsupportedOperationException. * * @return the clock sequence of this UUID. * @throws UnsupportedOperationException if this UUID is not a * version 1 UUID. */ public int clockSequence() { if (version() != 1) { throw new UnsupportedOperationException("Not a time-based UUID"); } if (sequence < 0) { sequence = (int)((leastSigBits & 0x3FFF000000000000L) >>> 48); } return sequence; } /** * The node value associated with this UUID. * *

The 48 bit node value is constructed from the node field of * this UUID. This field is intended to hold the IEEE 802 address * of the machine that generated this UUID to guarantee spatial * uniqueness.

* * The node value is only meaningful in a time-based UUID, which * has version type 1. If this UUID is not a time-based UUID then * this method throws UnsupportedOperationException. * * @return the node value of this UUID. * @throws UnsupportedOperationException if this UUID is not a * version 1 UUID. */ public long node() { if (version() != 1) { throw new UnsupportedOperationException("Not a time-based UUID"); } if (node < 0) { node = leastSigBits & 0x0000FFFFFFFFFFFFL; } return node; } // Object Inherited Methods /** * Returns a String object representing this * UUID. * *

The UUID string representation is as described by this BNF : *

     *  UUID                   =  "-"  "-"
     *                            "-"
     *                            "-"
     *                           
     *  time_low               = 4*
     *  time_mid               = 2*
     *  time_high_and_version  = 2*
     *  variant_and_sequence   = 2*
     *  node                   = 6*
     *  hexOctet               = 
     *  hexDigit               =
     *        "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
     *        | "a" | "b" | "c" | "d" | "e" | "f"
     *        | "A" | "B" | "C" | "D" | "E" | "F"
     * 
* * @return a string representation of this UUID. */ public String toString() { return (digits(mostSigBits >> 32, 8) + "-" + digits(mostSigBits >> 16, 4) + "-" + digits(mostSigBits, 4) + "-" + digits(leastSigBits >> 48, 4) + "-" + digits(leastSigBits, 12)); } /** Returns val represented by the specified number of hex digits. */ private static String digits(long val, int digits) { long hi = 1L << (digits * 4); return Long.toHexString(hi | (val & (hi - 1))).substring(1); } /** * Returns a hash code for this UUID. * * @return a hash code value for this UUID. */ public int hashCode() { if (hashCode == -1) { hashCode = (int)((mostSigBits >> 32) ^ mostSigBits ^ (leastSigBits >> 32) ^ leastSigBits); } return hashCode; } /** * Compares this object to the specified object. The result is * true if and only if the argument is not * null, is a UUID object, has the same variant, * and contains the same value, bit for bit, as this UUID. * * @param obj the object to compare with. * @return true if the objects are the same; * false otherwise. */ public boolean equals(Object obj) { if (!(obj instanceof UUID)) return false; if (((UUID)obj).variant() != this.variant()) return false; UUID id = (UUID)obj; return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); } // Comparison Operations /** * Compares this UUID with the specified UUID. * *

The first of two UUIDs follows the second if the most significant * field in which the UUIDs differ is greater for the first UUID. * * @param val UUID to which this UUID is to be compared. * @return -1, 0 or 1 as this UUID is less than, equal * to, or greater than val. */ public int compareTo(Object val) { UUID uuid = (UUID) val; // The ordering is intentionally set up so that the UUIDs // can simply be numerically compared as two numbers return (this.mostSigBits < uuid.mostSigBits ? -1 : (this.mostSigBits > uuid.mostSigBits ? 1 : (this.leastSigBits < uuid.leastSigBits ? -1 : (this.leastSigBits > uuid.leastSigBits ? 1 : 0)))); } /** * Reconstitute the UUID instance from a stream (that is, * deserialize it). This is necessary to set the transient fields * to their correct uninitialized value so they will be recomputed * on demand. */ private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException { in.defaultReadObject(); // Set "cached computation" fields to their initial values version = -1; variant = -1; timestamp = -1; sequence = -1; node = -1; hashCode = -1; } } flexdock-1.2.4/src/java/core/org/flexdock/util/Utilities.java0000644000175000017500000007077312177715062025046 0ustar sylvestresylvestre/* * Created on Aug 29, 2004 */ package org.flexdock.util; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; /** * @author Christopher Butler */ public class Utilities { /** * A constant representing the Java version. This constant is {@code true} * if the version is 1.4. */ public static final boolean JAVA_1_4 = isJavaVersion("1.4"); /** * A constant representing the Java version. This constant is {@code true} * if the version is 1.5. */ public static final boolean JAVA_1_5 = isJavaVersion("1.5"); /** * A String representing the flexdock version. This constant is a string. */ public static final String VERSION = "1.2.4"; private Utilities() { // does nothing } /** * Returns an {@code int} value for the specified {@code String}. This * method calls {@code Integer.parseInt(String s)} and returns the resulting * {@code int} value. If any {@code Exception} is thrown, this method * returns a value of {@code 0}. * * @param data * a {@code String} containing the {@code int} representation to * be parsed * @return the integer value represented by the argument in decimal * @see #getInt(String, int) * @see Integer#parseInt(java.lang.String) */ public static int getInt(String data) { return getInt(data, 0); } /** * Returns an {@code int} value for the specified {@code String}. This * method calls {@code Integer.parseInt(String s)} and returns the resulting * {@code int} value. If any {@code Exception} is thrown, this method * returns the value supplied by the {@code defaultValue} parameter. * * @param data * a {@code String} containing the {@code int} representation to * be parsed * @param defaultValue * the value to return if an {@code Exception} is encountered. * @return the integer value represented by the argument in decimal * @see Integer#parseInt(java.lang.String) */ public static int getInt(String data, int defaultValue) { if (data == null) return defaultValue; try { return Integer.parseInt(data); } catch (Exception e) { return defaultValue; } } /** * Returns a {@code float} value for the specified {@code String}. This * method calls {@code Float.parseFloat(String s)} and returns the resulting * {@code float} value. If any {@code Exception} is thrown by * {@code parseFloat}, this method returns the value supplied by the * {@code defaultValue} parameter. * * @param data * a {@code String} containing the {@code float} representation * to be parsed * @param defaultValue * the value to return if an {@code Exception} is encountered on * the underlying parse mechanism. * @return the floating-point value represented by the argument in decimal * @see Float#parseFloat(java.lang.String) */ public static float getFloat(String data, float defaultValue) { if (data == null) return defaultValue; try { return Float.parseFloat(data); } catch (Exception e) { return defaultValue; } } /** * Returns {@code true} if the specified {@code String} is {@code null} or * contains only whitespace. Otherwise, returns {@code false}. The * whitespace check is performed by calling {@code trim()} and checking to * see if the trimmed string {@code length()} is zero. * * @param data * the {@code String} to check for non-whitespace content * @return {@code true} if the specified {@code String} is {@code null} or * contains only whitespace, {@code false} otherwise. */ public static boolean isEmpty(String data) { return data == null ? true : data.trim().length() == 0; } /** * Returns an instance of the specified class name. If {@code className} is * {@code null}, then this method returns a {@code null} reference. *

* This method will try two different means of obtaining an instance of * {@code className}. First, it will attempt to resolve the {@code Class} * of {@code className} via {@code Class.forName(String className)}. It * will then use reflection to search for a method on the class named * {@code "getInstance()"}. If the method is found, then it is invoked and * the object instance is returned. *

* If there are any problems encountered while attempting to invoke * {@code getInstance()} on the specified class, the {@code Throwable} is * caught and this method dispatches to * {@code createInstance(String className, boolean failSilent)} with an * argument of {@code false} for {@code failSilent}. * {@code createInstance(String className, boolean failSilent)} will attempt * to invoke {@code newInstance()} on the {@code Class} for the specified * class name. If any {@code Throwable} is encountered during this process, * the value of {@code false} for {@code failSilent} will cause the stack * trace to be printed to the {@code System.err} and a {@code null} * reference will be returned. * * @param className * the fully qualified name of the desired class. * @return an instance of the specified class * @see #getInstance(String, boolean) * @see #createInstance(String, boolean) * @see Class#forName(java.lang.String) * @see Class#getMethod(java.lang.String, java.lang.Class[]) * @see Method#invoke(java.lang.Object, java.lang.Object[]) * @see Class#newInstance() */ public static Object getInstance(String className) { return getInstance(className, false); } /** * Returns an instance of the specified class name. If {@code className} is * {@code null}, then this method returns a {@code null} reference. *

* This method will try two different means of obtaining an instance of * {@code className}. First, it will attempt to resolve the {@code Class} * of {@code className} via {@code Class.forName(String className)}. It * will then use reflection to search for a method on the class named * {@code "getInstance()"}. If the method is found, then it is invoked and * the object instance is returned. *

* If there are any problems encountered while attempting to invoke * {@code getInstance()} on the specified class, the {@code Throwable} is * caught and this method dispatches to * {@code createInstance(String className, boolean failSilent)}, passing * the specified value for {@code failSilent}. * {@code createInstance(String className, boolean failSilent)} will attempt * to invoke {@code newInstance()} on the {@code Class} for the specified * class name. If any {@code Throwable} is encountered during this process, * the value of {@code failSilent} is checked to determine whether the stack * stack trace should be printed to the {@code System.err}. A {@code null} * reference will be returned if any problems are encountered. * * @param className * the fully qualified name of the desired class. * @param failSilent * {@code true} if the stack trace should not be printed * to the {@code System.err} when a {@code Throwable} is caught, * {@code false} otherwise. * @return an instance of the specified class * @see #createInstance(String, boolean) * @see Class#forName(java.lang.String) * @see Class#getMethod(java.lang.String, java.lang.Class[]) * @see Method#invoke(java.lang.Object, java.lang.Object[]) * @see Class#newInstance() */ public static Object getInstance(String className, boolean failSilent) { if (className == null) return null; try { Class c = Class.forName(className); Method m = c.getMethod("getInstance", new Class[0]); return m.invoke(null, new Object[0]); } catch (Throwable e) { return createInstance(className, failSilent); } } /** * Creates and returns an instance of the specified class name using * {@code Class.newInstance()}. If {@code className} is {@code null}, then * this method returns a {@code null} reference. This dispatches to * {@code createInstance(String className, Class superType, boolean failSilent)} * with an argument of {@code null} for {@code superType} and {@code false} * for {@code failSilent}. *

* This method will attempt to resolve the {@code Class} of * {@code className} via {@code Class.forName(String className)}. No class * assignability checkes are performed because this method uses a * {@code null} {@code superType}. *

* Once the desired class has been resolved, a new instance of it is created * and returned by invoking its {@code newInstance()} method. If there are * any problems encountered during this process, the value of {@code false} * for {@code failSilent} will ensure the stack stack trace is be printed to * the {@code System.err}. A {@code null} reference will be returned if any * problems are encountered. * * @param className * the fully qualified name of the desired class. * @return an instance of the specified class * @see #createInstance(String, Class, boolean) * @see Class#forName(java.lang.String) * @see Class#newInstance() */ public static Object createInstance(String className) { return createInstance(className, null); } /** * Creates and returns an instance of the specified class name using * {@code Class.newInstance()}. If {@code className} is {@code null}, then * this method returns a {@code null} reference. The {@code failSilent} * parameter will determine whether error stack traces should be reported to * the {@code System.err} before this method returns {@code null}. This * method dispatches to * {@code createInstance(String className, Class superType, boolean failSilent)} * with an argument of {@code null} for {@code superType}. *

* This method will attempt to resolve the {@code Class} of * {@code className} via {@code Class.forName(String className)}. No class * assignability checkes are performed because this method uses a * {@code null} {@code superType}. *

* Once the desired class has been resolved, a new instance of it is created * and returned by invoking its {@code newInstance()} method. If there are * any problems encountered during this process, the value of * {@code failSilent} is checked to determine whether the stack stack trace * should be printed to the {@code System.err}. A {@code null} reference * will be returned if any problems are encountered. * * @param className * the fully qualified name of the desired class. * @param failSilent * {@code true} if the stack trace should not be printed * to the {@code System.err} when a {@code Throwable} is caught, * {@code false} otherwise. * @return an instance of the specified class * @see #createInstance(String, Class, boolean) * @see Class#forName(java.lang.String) * @see Class#newInstance() */ public static Object createInstance(String className, boolean failSilent) { return createInstance(className, null, failSilent); } /** * Creates and returns an instance of the specified class name using * {@code Class.newInstance()}. If {@code className} is {@code null}, then * this method returns a {@code null} reference. If {@code superType} is * non-{@code null}, then this method will enforce polymorphic identity * via {@code Class.isAssignableFrom(Class cls)}. This method dispatches to * {@code createInstance(String className, Class superType, boolean failSilent)} * with an argument of {@code false} for {@code failSilent}. *

* This method will attempt to resolve the {@code Class} of * {@code className} via {@code Class.forName(String className)}. If * {@code superType} is non-{@code null}, then class identity is checked * by calling {@code superType.isAssignableFrom(c)} to ensure the resolved * class is an valid equivalent, descendent, or implementation of the * specified {@code className}. If this check fails, then a * {@code ClassCastException} is thrown and caught internally and this * method returns {@code null}. If {@code superType} is {@code null}, then * no assignability checks are performed on the resolved class. *

* Once the desired class has been resolved, a new instance of it is created * and returned by invoking its {@code newInstance()} method. If there are * any problems encountered during this process, the value of {@code false} * for {@code failSilent} will ensure the stack stack trace is be printed to * the {@code System.err}. A {@code null} reference will be returned if any * problems are encountered. * * @param className * the fully qualified name of the desired class. * @param superType * optional paramter used as a means of enforcing the inheritance * hierarchy * @return an instance of the specified class * @see #createInstance(String, Class, boolean) * @see Class#forName(java.lang.String) * @see Class#isAssignableFrom(java.lang.Class) * @see Class#newInstance() */ public static Object createInstance(String className, Class superType) { return createInstance(className, superType, false); } /** * Creates and returns an instance of the specified class name using * {@code Class.newInstance()}. If {@code className} is {@code null}, then * this method returns a {@code null} reference. If {@code superType} is * non-{@code null}, then this method will enforce polymorphic identity * via {@code Class.isAssignableFrom(Class cls)}. The {@code failSilent} * parameter will determine whether error stack traces should be reported to * the {@code System.err} before this method returns {@code null}. *

* This method will attempt to resolve the {@code Class} of * {@code className} via {@code Class.forName(String className)}. If * {@code superType} is non-{@code null}, then class identity is checked * by calling {@code superType.isAssignableFrom(c)} to ensure the resolved * class is an valid equivalent, descendent, or implementation of the * specified {@code className}. If this check fails, then a * {@code ClassCastException} is thrown and caught internally and this * method returns {@code null}. If {@code superType} is {@code null}, then * no assignability checks are performed on the resolved class. *

* Once the desired class has been resolved, a new instance of it is created * and returned by invoking its {@code newInstance()} method. If there are * any problems encountered during this process, the value of * {@code failSilent} is checked to determine whether the stack stack trace * should be printed to the {@code System.err}. A {@code null} reference * will be returned if any problems are encountered. * * @param className * the fully qualified name of the desired class. * @param superType * optional paramter used as a means of enforcing the inheritance * hierarchy * @param failSilent * {@code true} if the stack trace should not be printed * to the {@code System.err} when a {@code Throwable} is caught, * {@code false} otherwise. * @return an instance of the specified class * @see Class#forName(java.lang.String) * @see Class#isAssignableFrom(java.lang.Class) * @see Class#newInstance() */ public static Object createInstance(String className, Class superType, boolean failSilent) { if (className == null) return null; try { Class c = Class.forName(className); if (superType != null && !superType.isAssignableFrom(c)) throw new ClassCastException("'" + c.getName() + "' is not a type of " + superType + "."); return c.newInstance(); } catch (Throwable e) { if (!failSilent) System.err.println("Exception: " +e.getMessage()); return null; } } /** * Checks for equality between the two specified {@code Objects}. If both * arguments are the same {@code Object} reference using an {@code ==} * relationship, then this method returns {@code true}. Failing that check, * if either of the arguments is {@code null}, then the other must not be * and this method returns {@code false}. Finally, if both arguments are * non-{@code null} with different {@code Object} references, then this * method returns the value of {@code obj1.equals(obj2)}. *

* This method is the exact opposite of * {@code isChanged(Object oldObj, Object newObj)}. * * @param obj1 * the first {@code Object} to be checked for equality * @param obj2 * the second {@code Object} to be checked for equality * @return {@code true} if the {@code Objects} are equal, {@code false} * otherwise. * @see #isChanged(Object, Object) * @see Object#equals(java.lang.Object) */ public static boolean isEqual(Object obj1, Object obj2) { return !isChanged(obj1, obj2); } /** * Checks for inequality between the two specified {@code Objects}. If both * arguments are the same {@code Object} reference using an {@code ==} * relationship, then this method returns {@code false}. Failing that * check, if either of the arguments is {@code null}, then the other must * not be and this method returns {@code true}. Finally, if both arguments * are non-{@code null} with different {@code Object} references, then this * method returns the opposite value of {@code obj1.equals(obj2)}. *

* This method is the exact opposite of * {@code isEqual(Object obj1, Object obj2)}. * * @param oldObj * the first {@code Object} to be checked for inequality * @param newObj * the second {@code Object} to be checked for inequality * @return {@code false} if the {@code Objects} are equal, {@code true} * otherwise. * @see #isEqual(Object, Object) * @see Object#equals(java.lang.Object) */ public static boolean isChanged(Object oldObj, Object newObj) { if (oldObj == newObj) return false; if (oldObj == null || newObj == null) return true; return !oldObj.equals(newObj); } /** * Returns {@code true} if there is currently a {@code System} property with * the specified {@code key} whose value is "true". If the {@code System} * property does not exist, or the value is inequal to "true", this method * returns {@code false}. This method returns {@code false} if the * specified {@code key} parameter is {@code null}. * * @param key * the {@code System} property to test. * @return {@code true} if there is currently a {@code System} property with * the specified {@code key} whose value is "true". * @see System#getProperty(java.lang.String) * @see String#equals(java.lang.Object) * @deprecated Use {@link Boolean#getBoolean(String)}. */ public static boolean sysTrue(String key) { String value = key == null ? null : System.getProperty(key); return value == null ? false : "true".equals(value); } /** * Puts the supplied {@code value} into the specified {@code Map} using the * specified {@code key}. This is a convenience method to automate * null-checks. A {@code value} parameter of {@code null} is interpreted as * a removal from the specified {@code Map} rather than an {@code put} * operation. *

* If either {@code map} or {@code key} are {@code null} then this method * returns with no action taken. If {@code value} is {@code null}, * then this method calls {@code map.remove(key)}. Otherwise, this method * calls {@code map.put(key, value)}. * * @param map * the {@code Map} whose contents is to be modified * @param key * with which the specified value is to be associated. * @param value * value to be associated with the specified key. * @see Map#put(java.lang.Object, java.lang.Object) * @see Map#remove(java.lang.Object) */ public static void put(Map map, Object key, Object value) { if (map == null || key == null) return; if (value == null) map.remove(key); else map.put(key, value); } /** * Returns the value of the specified {@code fieldName} within the specified * {@code Object}. This is a convenience method for reflection hacks to * retrieve the value of protected, private, or package-private field * members while hiding the boilerplate reflection code within a single * utility method call. This method will return {@code true} if the * operation was successful and {@code false} if errors were encountered. *

* This method calls {@code obj.getClass()} to retrieve the {@code Class} of * the specified {@code Object}. It then retrieves the desired field by * calling the classes' {@code getDeclaredField(String name)} method, * passing the specified field name. If the field is deemed inaccessible via * it's {@code isAccessible()} method, then it is made accessible by calling * {@code setAccessible(true)}. The field value is set by invoking the * field's {@code set(Object obj, Object value)} method and passing the * original {@code Object} and {@code value} parameter as arguments. Before * returning, the field's accessibility is reset to its original state. *

* If either {@code obj} or {@code fieldName} are {@code null}, then this * method returns {@code false}. *

* It should be understood that this method will not function properly for * inaccessible fields in the presence of a {@code SecurityManager}. Nor * will it function properly for non-existent fields (if a field called * {@code fieldName} does not exist on the class). All {@code Throwables} * encountered by this method will be caught and eaten and the method will * return {@code false}. This works under the assumption that the operation * might likely fail because the method itself is, in reality, a convenience * hack. Therefore, specifics of any generated errors on the call stack are * discarded and only the final outcome ({@code true/false} of the * operation is deemed relevant. If call stack data is required within * the application for any thrown exceptions, then this method should not be * used.} * * @param obj * the object for which the represented field's value is to be * modified * @param fieldName * the name of the field to be set * @param value * the new value for the field of {@code obj} being modified * @see Object#getClass() * @see Class#getDeclaredField(java.lang.String) * @see Field#isAccessible() * @see Field#setAccessible(boolean) * @see Field#set(Object, Object) */ public static boolean setValue(Object obj, String fieldName, Object value) { if (obj == null || fieldName == null) return false; try { Class c = obj.getClass(); Field field = c.getDeclaredField(fieldName); if (field.isAccessible()) { field.set(obj, value); return true; } field.setAccessible(true); field.set(obj, value); field.setAccessible(false); return true; } catch (Throwable t) { // don't report the error. the purpse of this method is to try to // access the field, but fail silently if we can't. return false; } } /** * Returns the value of the specified {@code fieldName} within the specified * {@code Object}. This is a convenience method for reflection hacks to * retrieve the value of protected, private, or package-private field * members while hiding the boilerplate reflection code within a single * utility method call. *

* This method calls {@code obj.getClass()} to retrieve the {@code Class} of * the specified {@code Object}. It then retrieves the desired field by * calling the classes' {@code getDeclaredField(String name)} method, * passing the specified field name. If the field is deemed inaccessible via * it's {@code isAccessible()} method, then it is made accessible by calling * {@code setAccessible(true)}. The return value is retrieved by invoking * the field's {@code get(Object obj)} method and passing the original * {@code Object} parameter as an argument. Before returning, the field's * accessibility is reset to its original state. *

* If either {@code obj} or {@code fieldName} are {@code null}, then this * method returns {@code null}. *

* It should be understood that this method will not function properly for * inaccessible fields in the presence of a {@code SecurityManager}. Nor * will it function properly for non-existent fields (if a field called * {@code fieldName} does not exist on the class). All {@code Throwables} * encountered by this method will be rethrown as * {@code IllegalAccessException}. For wrapped {@code Throwables}, the * original cause can be accessed via {@code IllegalAccessException's} * {@code getCause()} method. * * @param obj * the object from which the represented field's value is to be * extracted * @param fieldName * the name of the field to be checked * @return the value of the represented field in object {@code obj}; * primitive values are wrapped in an appropriate object before * being returned * @see Object#getClass() * @see Class#getDeclaredField(java.lang.String) * @see Field#isAccessible() * @see Field#setAccessible(boolean) * @see Field#get(java.lang.Object) * @see IllegalAccessException#getCause() */ public static Object getValue(Object obj, String fieldName) throws IllegalAccessException { if (obj == null || fieldName == null) return null; try { Class c = obj.getClass(); Field field = c.getDeclaredField(fieldName); if (field.isAccessible()) { return field.get(obj); } field.setAccessible(true); Object ret = field.get(obj); field.setAccessible(false); return ret; } catch (Throwable t) { if (t instanceof IllegalAccessException) throw (IllegalAccessException) t; IllegalAccessException e = new IllegalAccessException(t .getMessage()); e.initCause(t); throw e; } } /** * Puts the current {@code Thread} to sleep for the specified timeout. This * method calls {@code Thread.sleep(long millis)}, catching any thrown * {@code InterruptedException} and printing a stack trace to the * {@code System.err}. * * @param millis * the length of time to sleep in milliseconds. * @see Thread#sleep(long) */ public static void sleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { System.err.println("Exception: " +e.getMessage()); e.printStackTrace(); } } private static boolean isJavaVersion(String version) { if (version == null) return false; return System.getProperty("java.version").startsWith(version); } } flexdock-1.2.4/src/java/demo/0000755000175000017500000000000012177715062016643 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/0000755000175000017500000000000012177715062017432 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/0000755000175000017500000000000012177715062021231 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/0000755000175000017500000000000012177715062022340 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/AllDemos.java0000644000175000017500000000725512177715062024714 0ustar sylvestresylvestrepackage org.flexdock.demos; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.Method; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingUtilities; import org.flexdock.demos.util.DemoUtility; import org.flexdock.util.SwingUtility; /** * Generic launcher for all demos. * It allows us to deliver a single entry point demo via a runnable jar or JNLP launched * app that runs all of our demonstration apps. */ public class AllDemos extends JFrame { private static final String[] DEMO_CLASS_NAMES = new String[] { "org.flexdock.demos.maximizing.MaximizationDemo", "org.flexdock.demos.perspective.PerspectivesDemo", "org.flexdock.demos.perspective.XMLPerspectivesDemo", "org.flexdock.demos.raw.adapter.AdapterDemo", "org.flexdock.demos.raw.border.BorderDemo", "org.flexdock.demos.raw.CompoundDemo", "org.flexdock.demos.raw.elegant.ElegantDemo", "org.flexdock.demos.raw.jmf.JMFDemo", "org.flexdock.demos.raw.SimpleDemo", "org.flexdock.demos.raw.SplitPaneDemo", "org.flexdock.demos.raw.TabbedPaneDemo", "org.flexdock.demos.view.ViewDemo", }; public AllDemos() { super("FlexDock Demos"); TreeMap sorted_class_names = new TreeMap(); for (int i = 0; i < DEMO_CLASS_NAMES.length; i++) { String full_class_name = DEMO_CLASS_NAMES[i]; String just_class_name = full_class_name.substring(full_class_name .lastIndexOf('.') + 1); sorted_class_names.put(just_class_name, full_class_name); } getContentPane().setLayout(new GridLayout(0, 1, 3, 3)); for (Iterator iter = sorted_class_names.entrySet().iterator(); iter .hasNext();) { Map.Entry entry = (Map.Entry) iter.next(); final String full_class_name = (String) entry.getValue(); final String just_class_name = (String) entry.getKey(); JButton button = new JButton(just_class_name); button.setToolTipText("Runs " + full_class_name); getContentPane().add(button); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { launchClass(full_class_name); } }); } pack(); } private void launchClass(String full_class_name) { Class c; try { c = Class.forName(full_class_name); Method m = c.getMethod("main", new Class[] { String[].class }); m.invoke(null, new Object[] { null }); } catch (Throwable t) { String message = "Error occurred when calling main(String[]) on class " + full_class_name; DemoUtility.showErrorDialog(this, message, t); } } public static void main(String[] args) { try { final AllDemos a = new AllDemos(); a.setDefaultCloseOperation(AllDemos.EXIT_ON_CLOSE); DemoUtility.setDemoDisableExitOnClose(); SwingUtility.centerOnScreen(a); a.setVisible(true); for (int i = 0; i < args.length; i++) { final String full_class_name = args[i]; SwingUtilities.invokeLater(new Runnable() { public void run() { a.launchClass(full_class_name); } }); } } catch (Throwable t) { t.printStackTrace(); System.exit(-1); } } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/maximizing/0000755000175000017500000000000012177715062024514 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/maximizing/DockableSimpleInternalFrame.java0000644000175000017500000000150412177715062032705 0ustar sylvestresylvestrepackage org.flexdock.demos.maximizing; import java.awt.Component; import org.flexdock.docking.DockingManager; import org.flexdock.docking.defaults.AbstractDockable; public class DockableSimpleInternalFrame extends AbstractDockable { private Component component; public DockableSimpleInternalFrame(SimpleInternalFrame sif) { this(sif, sif.getTitle()); } public DockableSimpleInternalFrame(SimpleInternalFrame sif, String id) { super(id); this.component = sif; getDragSources().add(sif.getDragHandle()); getFrameDragSources().add(sif.getDragHandle()); setTabText(sif.getTitle()); } public Component getComponent() { return component; } public void dispose() { DockingManager.unregisterDockable(this); component = null; } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/maximizing/MaximizationDemo.java0000644000175000017500000001024712177715062030641 0ustar sylvestresylvestrepackage org.flexdock.demos.maximizing; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URL; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JToolBar; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import org.flexdock.demos.util.DemoUtility; import org.flexdock.demos.view.ViewDemo; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.util.SwingUtility; import com.jgoodies.looks.plastic.PlasticXPLookAndFeel; public class MaximizationDemo { public static void main(String[] args) { try { UIManager.setLookAndFeel(new PlasticXPLookAndFeel()); } catch (UnsupportedLookAndFeelException e) { throw new RuntimeException(e); } boolean loaded = configureDocking(); JFrame frame = new JFrame("FlexPortalMaximized"); frame.setContentPane(createContentPane(loaded)); DemoUtility.setCloseOperation(frame); frame.setSize(500, 500); SwingUtility.centerOnScreen(frame); // frame.pack(); frame.setVisible(true); } private static boolean configureDocking() { DockingManager.setFloatingEnabled(false); return false; } private static JComponent createContentPane(boolean loaded) { MyDockingPort dockingPort = new MyDockingPort(); Dockable topComp = createFramePanel("Top"); DockingManager.registerDockable(topComp); DockingManager.dock(topComp, (DockingPort) dockingPort, DockingConstants.CENTER_REGION); Dockable south = createFramePanel("South"); DockingManager.registerDockable(south); DockingManager.dock(south, topComp, DockingConstants.SOUTH_REGION, 0.3f); Dockable west = createFramePanel("West"); DockingManager.registerDockable(west); DockingManager.dock(west, topComp, DockingConstants.WEST_REGION, 0.5f); Dockable l2South = createFramePanel("South of West"); DockingManager.registerDockable(l2South); DockingManager.dock(l2South, west, DockingConstants.SOUTH_REGION, 0.33f); Dockable east = createFramePanel("East"); DockingManager.registerDockable(east); DockingManager.dock(east, topComp, DockingConstants.EAST_REGION, 0.2f); return dockingPort; } private static Dockable createFramePanel(String title) { JLabel label = new JLabel("Content of " + title); JButton maxButton = createButton(createIcon("maximize.gif")); JToolBar toolbar = createPortletToolbar(maxButton); SimpleInternalFrame sif = new SimpleInternalFrame(title, toolbar, label); final Dockable dockable = new DockableSimpleInternalFrame(sif); maxButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //System.out.println("Calling DockingManager to maximize: " + dockable); DockingManager.toggleMaximized(dockable); } }); return dockable; } private static JButton createButton(Icon icon) { JButton button = new JButton(icon); button.setFocusable(false); return button; } private static JToolBar createPortletToolbar(JButton maxButton) { JToolBar toolbar = new JToolBar(); toolbar.add(maxButton); toolbar.setFloatable(false); toolbar.putClientProperty("JToolBar.isRollover", Boolean.TRUE); return toolbar; } private static Icon createIcon(String icon) { return new ImageIcon(createImageImpl(icon)); } private static Image createImageImpl(String resourceName) { URL iconURL = MaximizationDemo.class.getResource(resourceName); if (iconURL == null) { throw new RuntimeException("Could not find: " + resourceName); } return Toolkit.getDefaultToolkit().createImage(iconURL); } }flexdock-1.2.4/src/java/demo/org/flexdock/demos/maximizing/MyDockingPort.java0000644000175000017500000000251512177715062030113 0ustar sylvestresylvestrepackage org.flexdock.demos.maximizing; import javax.swing.JTabbedPane; import javax.swing.border.Border; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.defaults.DefaultDockingPort; import org.flexdock.docking.defaults.DefaultDockingStrategy; import org.flexdock.docking.defaults.StandardBorderManager; import org.flexdock.plaf.common.border.ShadowBorder; public class MyDockingPort extends DefaultDockingPort { static { initStatic(); } private static void initStatic() { DockingManager.setDockingStrategy(MyDockingPort.class, new MyDockingStrategy()); } public MyDockingPort() { this(new ShadowBorder()); } public MyDockingPort(Border portletBorder) { super(); if (portletBorder != null) { setBorderManager(new StandardBorderManager(portletBorder)); } } protected JTabbedPane createTabbedPane() { JTabbedPane tabbed = super.createTabbedPane(); tabbed.putClientProperty("jgoodies.embeddedTabs", Boolean.TRUE); return tabbed; } // *************** private static class MyDockingStrategy extends DefaultDockingStrategy { protected DockingPort createDockingPortImpl(DockingPort base) { return new MyDockingPort(); } } }flexdock-1.2.4/src/java/demo/org/flexdock/demos/maximizing/SimpleInternalFrame.java0000644000175000017500000003521412177715062031265 0ustar sylvestresylvestre/* * Copyright (c) 2003 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Source code changes (c) 2005 beck et al. projects */ package org.flexdock.demos.maximizing; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.Paint; import java.awt.event.MouseListener; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JToolBar; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.border.AbstractBorder; import com.jgoodies.looks.LookUtils; /** * A lightweight component derived from JPanel that features certain subcomponents * that make it look similar to a frame or internal frame. It shows a titlebar above * its content component. The title bar has an * optional icon on the left, a title text and an optional toolbar on the right. */ public class SimpleInternalFrame extends JPanel { private JLabel titleLabel; private GradientPanel gradientPanel; private JPanel headerPanel; private boolean isSelected; // Instance Creation **************************************************** /** * Constructs a SimpleInternalFrame with an empty title. * * @param title the initial title */ public SimpleInternalFrame() { this(null, "", null, null); } /** * Constructs a SimpleInternalFrame with the specified title. * * @param title the initial title */ public SimpleInternalFrame(String title) { this(null, title, null, null); } /** * Constructs a SimpleInternalFrame with the specified icon, and title. * * @param icon the initial icon * @param title the initial title */ public SimpleInternalFrame(Icon icon, String title) { this(icon, title, null, null); } /** * Constructs a SimpleInternalFrame with the specified title, tool bar, and content panel. * * @param title the initial title * @param bar the initial tool bar * @param content the initial content pane */ public SimpleInternalFrame(String title, JToolBar bar, JComponent content) { this(null, title, bar, content); } /** * Constructs a SimpleInternalFrame with the specified icon, title, tool bar, and content * panel. * * @param icon the initial icon * @param title the initial title * @param bar the initial tool bar * @param content the initial content pane */ public SimpleInternalFrame(Icon icon, String title, JToolBar bar, JComponent content) { super(new BorderLayout()); this.isSelected = false; this.titleLabel = new JLabel(title, icon, SwingConstants.LEADING); JPanel top = buildHeader(titleLabel, bar); add(top, BorderLayout.NORTH); if (content != null) { setContent(content); } setBorder(new ShadowBorder()); setSelected(true); updateHeader(); } // Public API *********************************************************** /** * Returns the frame's icon. * * @return the frame's icon */ public Icon getFrameIcon() { return titleLabel.getIcon(); } /** * Sets a new frame icon. * * @param newIcon the icon to be set */ public void setFrameIcon(Icon newIcon) { Icon oldIcon = getFrameIcon(); titleLabel.setIcon(newIcon); firePropertyChange("frameIcon", oldIcon, newIcon); } /** * Returns the frame's title text. * * @return String the current title text */ public String getTitle() { return titleLabel.getText(); } /** * Sets a new title text. * * @param newText the title text tp be set */ public void setTitle(String newText) { String oldText = getTitle(); titleLabel.setText(newText); firePropertyChange("title", oldText, newText); } /** * Returns the current toolbar, null if none has been set before. * * @return the current toolbar - if any */ public JToolBar getToolBar() { return headerPanel.getComponentCount() > 1 ? (JToolBar) headerPanel.getComponent(1) : null; } /** * Sets a new tool bar in the header. * * @param newToolBar the tool bar to be set in the header */ public void setToolBar(JToolBar newToolBar) { JToolBar oldToolBar = getToolBar(); if (oldToolBar == newToolBar) { return; } if (oldToolBar != null) { headerPanel.remove(oldToolBar); } if (newToolBar != null) { newToolBar.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); headerPanel.add(newToolBar, BorderLayout.EAST); } updateHeader(); firePropertyChange("toolBar", oldToolBar, newToolBar); } /** * Returns the content - null, if none has been set. * * @return the current content */ public Component getContent() { return hasContent() ? getComponent(1) : null; } /** * Sets a new panel content; replaces any existing content, if existing. * * @param newContent the panel's new content */ public void setContent(Component newContent) { Component oldContent = getContent(); if (hasContent()) { remove(oldContent); } add(newContent, BorderLayout.CENTER); firePropertyChange("content", oldContent, newContent); } /** * Answers if the panel is currently selected (or in other words active) or not. In the selected state, * the header background will be rendered differently. * * @return boolean a boolean, where true means the frame is selected (currently active) and false means it * is not */ public boolean isSelected() { return isSelected; } /** * This panel draws its title bar differently if it is selected, which may be used to indicate to the user * that this panel has the focus, or should get more attention than other simple internal frames. * * @param newValue a boolean, where true means the frame is selected (currently active) and false means it * is not */ public void setSelected(boolean newValue) { boolean oldValue = isSelected(); isSelected = newValue; updateHeader(); firePropertyChange("selected", oldValue, newValue); } public void addHeaderListener(MouseListener listener) { gradientPanel.addMouseListener(listener); } // Building ************************************************************* /** * Creates and answers the header panel, that consists of: an icon, a title label, a tool bar, and a * gradient background. * * @param label the label to paint the icon and text * @param bar the panel's tool bar * @return the panel's built header area */ private JPanel buildHeader(JLabel label, JToolBar bar) { gradientPanel = new GradientPanel(new BorderLayout(), getHeaderBackground()); label.setOpaque(false); gradientPanel.add(label, BorderLayout.WEST); gradientPanel.setBorder(BorderFactory.createEmptyBorder(3, 4, 3, 1)); headerPanel = new JPanel(new BorderLayout()); headerPanel.add(gradientPanel, BorderLayout.CENTER); setToolBar(bar); headerPanel.setBorder(new RaisedHeaderBorder()); headerPanel.setOpaque(false); return headerPanel; } /** * Updates the header. */ private void updateHeader() { gradientPanel.setBackground(getHeaderBackground()); gradientPanel.setOpaque(isSelected()); titleLabel.setForeground(getTextForeground(isSelected())); headerPanel.repaint(); Dimension minSize = new Dimension(headerPanel.getMinimumSize()); minSize.height += 3; // border setMinimumSize(minSize); } /** * Updates the UI. In addition to the superclass behavior, we need to update the header component. */ public void updateUI() { super.updateUI(); if (titleLabel != null) { updateHeader(); } } // Helper Code ********************************************************** /** * Checks and answers if the panel has a content component set. * * @return true if the panel has a content, false if it's empty */ private boolean hasContent() { return getComponentCount() > 1; } /** * Determines and answers the header's text foreground color. Tries to lookup a special color from the * L&F. In case it is absent, it uses the standard internal frame forground. * * @param selected true to lookup the active color, false for the inactive * @return the color of the foreground text */ protected Color getTextForeground(boolean selected) { Color c = UIManager.getColor(selected ? "SimpleInternalFrame.activeTitleForeground" : "SimpleInternalFrame.inactiveTitleForeground"); if (c != null) { return c; } return UIManager.getColor(selected ? "InternalFrame.activeTitleForeground" : "Label.foreground"); } /** * Determines and answers the header's background color. Tries to lookup a special color from the L&F. * In case it is absent, it uses the standard internal frame background. * * @return the color of the header's background */ protected Color getHeaderBackground() { Color c = UIManager.getColor("SimpleInternalFrame.activeTitleBackground"); if (c != null) return c; if (LookUtils.IS_LAF_WINDOWS_XP_ENABLED) c = UIManager.getColor("InternalFrame.activeTitleGradient"); return c != null ? c : UIManager.getColor("InternalFrame.activeTitleBackground"); } public Component getDragHandle() { return gradientPanel; } // Helper Classes ******************************************************* // A custom border for the raised header pseudo 3D effect. private static class RaisedHeaderBorder extends AbstractBorder { private static final Insets INSETS = new Insets(1, 1, 1, 0); public Insets getBorderInsets(Component c) { return INSETS; } public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { g.translate(x, y); g.setColor(UIManager.getColor("controlLtHighlight")); g.fillRect(0, 0, w, 1); g.fillRect(0, 1, 1, h - 1); g.setColor(UIManager.getColor("controlShadow")); g.fillRect(0, h - 1, w, 1); g.translate(-x, -y); } } // A panel with a horizontal gradient background. private static class GradientPanel extends JPanel { private GradientPanel(LayoutManager lm, Color background) { super(lm); setBackground(background); } public void paintComponent(Graphics g) { super.paintComponent(g); if (!isOpaque()) { return; } Color control = UIManager.getColor("control"); int width = getWidth(); int height = getHeight(); Graphics2D g2 = (Graphics2D) g; Paint storedPaint = g2.getPaint(); g2.setPaint(new GradientPaint(0, 0, getBackground(), width, 0, control)); g2.fillRect(0, 0, width, height); g2.setPaint(storedPaint); } } private static class ShadowBorder extends AbstractBorder { private static final Insets INSETS = new Insets(1, 1, 3, 3); public Insets getBorderInsets(Component c) { return INSETS; } public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { Color shadow = UIManager.getColor("controlShadow"); if (shadow == null) { shadow = Color.GRAY; } Color lightShadow = new Color(shadow.getRed(), shadow.getGreen(), shadow.getBlue(), 170); Color lighterShadow = new Color(shadow.getRed(), shadow.getGreen(), shadow.getBlue(), 70); g.translate(x, y); g.setColor(shadow); g.fillRect(0, 0, w - 3, 1); g.fillRect(0, 0, 1, h - 3); g.fillRect(w - 3, 1, 1, h - 3); g.fillRect(1, h - 3, w - 3, 1); // Shadow line 1 g.setColor(lightShadow); g.fillRect(w - 3, 0, 1, 1); g.fillRect(0, h - 3, 1, 1); g.fillRect(w - 2, 1, 1, h - 3); g.fillRect(1, h - 2, w - 3, 1); // Shadow line2 g.setColor(lighterShadow); g.fillRect(w - 2, 0, 1, 1); g.fillRect(0, h - 2, 1, 1); g.fillRect(w - 2, h - 2, 1, 1); g.fillRect(w - 1, 1, 1, h - 2); g.fillRect(1, h - 1, w - 2, 1); g.translate(-x, -y); } } }flexdock-1.2.4/src/java/demo/org/flexdock/demos/perspective/0000755000175000017500000000000012177715062024671 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/perspective/PerspectivesDemo.java0000644000175000017500000002315012177715062031016 0ustar sylvestresylvestrepackage org.flexdock.demos.perspective; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.io.IOException; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.border.LineBorder; import org.flexdock.demos.util.DemoUtility; import org.flexdock.docking.DockableFactory; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.state.PersistenceException; import org.flexdock.perspective.LayoutSequence; import org.flexdock.perspective.Perspective; import org.flexdock.perspective.PerspectiveFactory; import org.flexdock.perspective.PerspectiveManager; import org.flexdock.perspective.actions.OpenPerspectiveAction; import org.flexdock.perspective.persist.FilePersistenceHandler; import org.flexdock.perspective.persist.PersistenceHandler; import org.flexdock.util.ResourceManager; import org.flexdock.util.SwingUtility; import org.flexdock.view.View; import org.flexdock.view.Viewport; import org.flexdock.view.actions.DefaultDisplayAction; /** * Created on 2005-04-17 * * @author Mateusz Szczap * @version $Id: PerspectivesDemo.java,v 1.17 2005-10-09 21:09:39 eeaston Exp $ */ public class PerspectivesDemo extends JFrame implements DockingConstants { public static final String PERSPECTIVE_FILE = "PerspectiveDemo.data"; private static final String MAIN_VIEW = "main.view"; private static final String BIRD_VIEW = "bird.view"; private static final String MESSAGE_VIEW = "message.log"; private static final String PROBLEM_VIEW = "problem"; private static final String CONSOLE_VIEW = "console"; private static final String P1 = "p1"; private static final String P2 = "p2"; private static final String P3 = "p3"; public static void main(String[] args) { SwingUtility.setPlaf(UIManager.getSystemLookAndFeelClassName()); // setup the flexdock configuration configureDocking(); // create and show the GUI EventQueue.invokeLater(new Runnable() { public void run() { runGUI(); } }); } private static void runGUI() { // create out application frame PerspectivesDemo flexDockDemo = new PerspectivesDemo(); flexDockDemo.setSize(800, 600); SwingUtility.centerOnScreen(flexDockDemo); DemoUtility.setCloseOperation(flexDockDemo); // load the current layout state into the application frame DockingManager.restoreLayout(); // now show the frame flexDockDemo.setVisible(true); } public PerspectivesDemo() { super("FlexDock Demo"); setContentPane(createContentPane()); setJMenuBar(createApplicationMenuBar()); } private JPanel createContentPane() { JPanel contentPane = new JPanel(new BorderLayout()); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); //tworzymy glowny view port do dokowania Viewport viewport = new Viewport(); // Border outerBorder = BorderFactory.createEmptyBorder(0,0,5,5); // Border innerBorder = new ShadowBorder(); // viewport.setBorderManager(new StandardBorderManager(BorderFactory.createCompoundBorder(outerBorder, innerBorder))); // viewport.setBorder(new EmptyBorder(10, 10, 10, 10)); //rejestrujemy glowny view port contentPane.add(viewport, BorderLayout.CENTER); return contentPane; } private JMenuBar createApplicationMenuBar() { JMenuBar menuBar = new JMenuBar(); JMenu showViewMenu = new JMenu("Show View"); showViewMenu.add(new DefaultDisplayAction(BIRD_VIEW)); showViewMenu.add(new DefaultDisplayAction(MESSAGE_VIEW)); showViewMenu.add(new DefaultDisplayAction(PROBLEM_VIEW)); showViewMenu.add(new DefaultDisplayAction(CONSOLE_VIEW)); JMenu perspectiveMenu = new JMenu("Perspective"); //pobieramy perspektywe nr 1 perspectiveMenu.add(new OpenPerspectiveAction(P1)); perspectiveMenu.add(new OpenPerspectiveAction(P2)); perspectiveMenu.add(new OpenPerspectiveAction(P3)); menuBar.add(showViewMenu); menuBar.add(perspectiveMenu); return menuBar; } private static void configureDocking() { // setup the DockingManager to work with our application DockingManager.setDockableFactory(new ViewFactory()); DockingManager.setFloatingEnabled(true); // configure the perspective manager PerspectiveManager.setFactory(new DemoPerspectiveFactory()); PerspectiveManager.setRestoreFloatingOnLoad(true); PerspectiveManager mgr = PerspectiveManager.getInstance(); mgr.setCurrentPerspective(P3, true); // load any previously persisted layouts PersistenceHandler persister = FilePersistenceHandler.createDefault(PERSPECTIVE_FILE); PerspectiveManager.setPersistenceHandler(persister); try { DockingManager.loadLayoutModel(); } catch(IOException e) { e.printStackTrace(); } catch (PersistenceException e) { e.printStackTrace(); } // remember to store on shutdown DockingManager.setAutoPersist(true); } private static class DemoPerspectiveFactory implements PerspectiveFactory { public Perspective getPerspective(String persistentId) { if(P1.equals(persistentId)) return createPerspective1(); if(P2.equals(persistentId)) return createPerspective2(); if(P3.equals(persistentId)) return createPerspective3(); return null; } private Perspective createPerspective1() { Perspective perspective = new Perspective(P1, "Perspective1"); LayoutSequence sequence = perspective.getInitialSequence(true); sequence.add(MAIN_VIEW); sequence.add(BIRD_VIEW, MAIN_VIEW, EAST_REGION, .3f); sequence.add(MESSAGE_VIEW, MAIN_VIEW, WEST_REGION, .3f); sequence.add(PROBLEM_VIEW, MESSAGE_VIEW); sequence.add(CONSOLE_VIEW, MESSAGE_VIEW); return perspective; } private Perspective createPerspective2() { Perspective perspective = new Perspective(P2, "Perspective2"); LayoutSequence sequence = perspective.getInitialSequence(true); sequence.add(MAIN_VIEW); sequence.add(BIRD_VIEW, MAIN_VIEW, WEST_REGION, .3f); sequence.add(MESSAGE_VIEW, BIRD_VIEW, SOUTH_REGION, .5f); sequence.add(PROBLEM_VIEW, MESSAGE_VIEW); sequence.add(CONSOLE_VIEW, MESSAGE_VIEW, EAST_REGION, .5f); return perspective; } private Perspective createPerspective3() { Perspective perspective = new Perspective(P3, "Perspective3"); LayoutSequence sequence = perspective.getInitialSequence(true); sequence.add(MAIN_VIEW); return perspective; } } private static class ViewFactory extends DockableFactory.Stub { public Component getDockableComponent(String dockableId) { if(MAIN_VIEW.equals(dockableId)) return createMainView(); if(BIRD_VIEW.equals(dockableId)) return createView(BIRD_VIEW, "Bird View", "birdView001.png"); if(MESSAGE_VIEW.equals(dockableId)) return createView(MESSAGE_VIEW, "Message Log", "msgLog001.png"); if(PROBLEM_VIEW.equals(dockableId)) return createView(PROBLEM_VIEW, "Problems", "problems001.png"); if(CONSOLE_VIEW.equals(dockableId)) return createView(CONSOLE_VIEW, "Console", "console001.png"); return null; } private View createView(String id, String text, String iconName) { View view = new View(id, text); //Dodajemy akcje close to tego view view.addAction(DockingConstants.CLOSE_ACTION); view.addAction(DockingConstants.PIN_ACTION); JPanel panel = new JPanel(); panel.setBorder(new LineBorder(Color.GRAY, 1)); JTextField textField = new JTextField(text); textField.setPreferredSize(new Dimension(100, 20)); panel.add(textField); view.setContentPane(panel); Icon icon = ResourceManager.createIcon("org/flexdock/demos/view/" + iconName); view.setTabIcon(icon); return view; } private static View createMainView() { JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab("Sample1", new JTextArea("Sample1")); tabbedPane.addTab("Sample2", new JTextArea("Sample2")); tabbedPane.addTab("Sample3", new JTextArea("Sample3")); //to view nie bedzie mialo tytulu, wiec przekazujemy null View mainView = new View(MAIN_VIEW, null, null); //blokujemy mozliwosc dokowania do tego view w regionie CENTER mainView.setTerritoryBlocked(CENTER_REGION, true); //wylaczamy pasek tytulowy mainView.setTitlebar(null); //ustawiamy komponent GUI, ktory chcemy aby byl wyswietalny w tym view mainView.setContentPane(new JScrollPane(tabbedPane)); return mainView; } } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/perspective/XMLPerspectivesDemo.java0000644000175000017500000002236612177715062031407 0ustar sylvestresylvestrepackage org.flexdock.demos.perspective; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.io.File; import java.io.IOException; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.border.LineBorder; import org.flexdock.demos.util.DemoUtility; import org.flexdock.docking.DockableFactory; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.drag.effects.EffectsManager; import org.flexdock.docking.drag.preview.GhostPreview; import org.flexdock.docking.state.PersistenceException; import org.flexdock.perspective.LayoutSequence; import org.flexdock.perspective.Perspective; import org.flexdock.perspective.PerspectiveFactory; import org.flexdock.perspective.PerspectiveManager; import org.flexdock.perspective.actions.OpenPerspectiveAction; import org.flexdock.perspective.persist.FilePersistenceHandler; import org.flexdock.perspective.persist.PersistenceHandler; import org.flexdock.perspective.persist.xml.XMLPersister; import org.flexdock.util.SwingUtility; import org.flexdock.view.View; import org.flexdock.view.Viewport; import org.flexdock.view.actions.DefaultDisplayAction; /** * Created on 2005-04-17 * * @author Mateusz Szczap * @version $Id: XMLPerspectivesDemo.java,v 1.11 2005-10-09 21:09:39 eeaston Exp $ */ public class XMLPerspectivesDemo extends JFrame implements DockingConstants { public static final String PERSPECTIVE_FILE = "PerspectiveDemo.xml"; private static final String MAIN_VIEW = "main.view"; private static final String BIRD_VIEW = "bird.view"; private static final String MESSAGE_VIEW = "message.log"; private static final String PROBLEM_VIEW = "problem"; private static final String CONSOLE_VIEW = "console"; private static final String P1 = "p1"; //private static final String P2 = "p2"; //private static final String P3 = "p3"; public static void main(String[] args) { SwingUtility.setPlaf(UIManager.getSystemLookAndFeelClassName()); // setup the flexdock configuration configureDocking(); // create and show the GUI EventQueue.invokeLater(new Runnable() { public void run() { runGUI(); } }); } private static void runGUI() { // create out application frame XMLPerspectivesDemo flexDockDemo = new XMLPerspectivesDemo(); flexDockDemo.setSize(800, 600); SwingUtility.centerOnScreen(flexDockDemo); DemoUtility.setCloseOperation(flexDockDemo); // load the current layout state into the application frame DockingManager.restoreLayout(); // now show the frame flexDockDemo.setVisible(true); } public XMLPerspectivesDemo() { super("FlexDock Demo"); setContentPane(createContentPane()); setJMenuBar(createApplicationMenuBar()); } private JPanel createContentPane() { JPanel contentPane = new JPanel(new BorderLayout()); contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); //tworzymy glowny view port do dokowania Viewport viewport = new Viewport(); //rejestrujemy glowny view port contentPane.add(viewport, BorderLayout.CENTER); return contentPane; } private JMenuBar createApplicationMenuBar() { JMenuBar menuBar = new JMenuBar(); JMenu showViewMenu = new JMenu("Show View"); showViewMenu.add(new DefaultDisplayAction(BIRD_VIEW)); showViewMenu.add(new DefaultDisplayAction(MESSAGE_VIEW)); showViewMenu.add(new DefaultDisplayAction(PROBLEM_VIEW)); showViewMenu.add(new DefaultDisplayAction(CONSOLE_VIEW)); JMenu perspectiveMenu = new JMenu("Perspective"); //pobieramy perspektywe nr 1 perspectiveMenu.add(new OpenPerspectiveAction(P1)); // perspectiveMenu.add(new OpenPerspectiveAction(P2)); // perspectiveMenu.add(new OpenPerspectiveAction(P3)); menuBar.add(showViewMenu); menuBar.add(perspectiveMenu); return menuBar; } private static void configureDocking() { // setup the DockingManager to work with our application DockingManager.setDockableFactory(new ViewFactory()); DockingManager.setFloatingEnabled(true); EffectsManager.setPreview(new GhostPreview()); // configure the perspective manager PerspectiveManager.setFactory(new DemoPerspectiveFactory()); PerspectiveManager.setRestoreFloatingOnLoad(true); PerspectiveManager mgr = PerspectiveManager.getInstance(); //mgr.setCurrentPerspective(P1, true); // load any previously persisted layouts PersistenceHandler persister = new FilePersistenceHandler(new File(FilePersistenceHandler.DEFAULT_PERSPECTIVE_DIR, PERSPECTIVE_FILE), XMLPersister.newDefaultInstance()); PerspectiveManager.setPersistenceHandler(persister); try { DockingManager.loadLayoutModel(); } catch(IOException ex) { ex.printStackTrace(); } catch (PersistenceException ex) { ex.printStackTrace(); } // remember to store on shutdown DockingManager.setAutoPersist(true); } private static class DemoPerspectiveFactory implements PerspectiveFactory { public Perspective getPerspective(String persistentId) { if(P1.equals(persistentId)) return createPerspective1(); // if(P2.equals(persistentId)) // return createPerspective2(); // if(P3.equals(persistentId)) // return createPerspective3(); return null; } private Perspective createPerspective1() { Perspective perspective = new Perspective(P1, "Perspective1"); LayoutSequence sequence = perspective.getInitialSequence(true); sequence.add("main.view"); sequence.add(BIRD_VIEW, "main.view", EAST_REGION, .3f); sequence.add(MESSAGE_VIEW, "main.view", WEST_REGION, .3f); sequence.add(PROBLEM_VIEW, MESSAGE_VIEW); sequence.add(CONSOLE_VIEW, MESSAGE_VIEW); return perspective; } // private Perspective createPerspective2() { // Perspective perspective = new Perspective(P2, "Perspective2"); // LayoutSequence sequence = perspective.getInitialSequence(true); // // sequence.add("main.view"); // sequence.add(BIRD_VIEW, "main.view", WEST_REGION, .3f); // sequence.add(MESSAGE_VIEW, BIRD_VIEW, SOUTH_REGION, .5f); // sequence.add(PROBLEM_VIEW, MESSAGE_VIEW); // sequence.add(CONSOLE_VIEW, MESSAGE_VIEW, EAST_REGION, .5f); // // return perspective; // } // // private Perspective createPerspective3() { // Perspective perspective = new Perspective(P3, "Perspective3"); // LayoutSequence sequence = perspective.getInitialSequence(true); // sequence.add("main.view"); // return perspective; // } } private static class ViewFactory extends DockableFactory.Stub { public Component getDockableComponent(String dockableId) { if(MAIN_VIEW.equals(dockableId)) return createMainView(); if(BIRD_VIEW.equals(dockableId)) return createView(BIRD_VIEW, "Bird View"); if(MESSAGE_VIEW.equals(dockableId)) return createView(MESSAGE_VIEW, "Message Log"); if(PROBLEM_VIEW.equals(dockableId)) return createView(PROBLEM_VIEW, "Problems"); if(CONSOLE_VIEW.equals(dockableId)) return createView(CONSOLE_VIEW, "Console"); return null; } private View createView(String id, String text) { View view = new View(id, text); //Dodajemy akcje close to tego view view.addAction(DockingConstants.CLOSE_ACTION); view.addAction(DockingConstants.PIN_ACTION); JPanel panel = new JPanel(); panel.setBorder(new LineBorder(Color.GRAY, 1)); JTextField textField = new JTextField(text); textField.setPreferredSize(new Dimension(100, 20)); panel.add(textField); view.setContentPane(panel); return view; } private static View createMainView() { JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab("Sample1", new JTextArea("Sample1")); tabbedPane.addTab("Sample2", new JTextArea("Sample2")); tabbedPane.addTab("Sample3", new JTextArea("Sample3")); //to view nie bedzie mialo tytulu, wiec przekazujemy null View mainView = new View(MAIN_VIEW, null, null); //blokujemy mozliwosc dokowania do tego view w regionie CENTER mainView.setTerritoryBlocked(CENTER_REGION, true); //wylaczamy pasek tytulowy mainView.setTitlebar(null); //ustawiamy komponent GUI, ktory chcemy aby byl wyswietalny w tym view mainView.setContentPane(new JScrollPane(tabbedPane)); return mainView; } } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/0000755000175000017500000000000012177715062023131 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/CompoundDemo.java0000644000175000017500000000633712177715062026376 0ustar sylvestresylvestrepackage org.flexdock.demos.raw; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Insets; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.LineBorder; import org.flexdock.demos.util.DemoUtility; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.defaults.DefaultDockingPort; import org.flexdock.docking.defaults.AbstractDockable; public class CompoundDemo extends JPanel implements DockingConstants { private JLabel titlebar; private Dockable dockableImpl; public CompoundDemo(String title) { super(); titlebar = createTitlebar(" " + title); add(titlebar); setBorder(new LineBorder(Color.black)); dockableImpl = new DockableImpl(); } private JLabel createTitlebar(String title) { JLabel lbl = new JLabel(title); lbl.setForeground(Color.white); lbl.setBackground(Color.blue); lbl.setOpaque(true); return lbl; } public String getTitle() { return titlebar.getText().trim(); } public void doLayout() { Insets in = getInsets(); titlebar.setBounds(in.left, in.top, getWidth()-in.left-in.right, 25); } private Dockable getDockable() { return dockableImpl; } private class DockableImpl extends AbstractDockable { private DockableImpl() { super("dockable." + getTitle()); // the titlebar will the the 'hot' component that initiates dragging getDragSources().add(titlebar); setTabText(getTitle()); } public Component getComponent() { return CompoundDemo.this; } } private static JPanel createContentPane() { JPanel p = new JPanel(new BorderLayout(5, 5)); p.add(buildDockingPort("North"), BorderLayout.NORTH); p.add(buildDockingPort("South"), BorderLayout.SOUTH); p.add(buildDockingPort("East"), BorderLayout.EAST); p.add(buildDockingPort("West"), BorderLayout.WEST); p.add(createDockingPort(), BorderLayout.CENTER); return p; } private static DefaultDockingPort buildDockingPort(String desc) { // create the DockingPort DefaultDockingPort port = createDockingPort(); // create the Dockable panel CompoundDemo cd = new CompoundDemo(desc); DockingManager.registerDockable(cd.getDockable()); // dock the panel and return the DockingPort port.dock(cd.getDockable(), CENTER_REGION); return port; } private static DefaultDockingPort createDockingPort() { DefaultDockingPort port = new DefaultDockingPort(); port.setBackground(Color.gray); port.setPreferredSize(new Dimension(100, 100)); return port; } public static void main(String[] args) { // System.setSecurityManager(new SecurityManager()); JFrame f = new JFrame("Compound Docking Demo"); f.setContentPane(createContentPane()); f.setSize(600, 400); DemoUtility.setCloseOperation(f); f.setVisible(true); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/SimpleDemo.java0000644000175000017500000000365112177715062026037 0ustar sylvestresylvestrepackage org.flexdock.demos.raw; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import org.flexdock.demos.util.DemoUtility; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.defaults.DefaultDockingPort; public class SimpleDemo extends JFrame implements DockingConstants { public static void main(String[] args) { JFrame f = new SimpleDemo(); f.setSize(600, 400); DemoUtility.setCloseOperation(f); f.setVisible(true); } public SimpleDemo() { super("Simple Docking Demo"); setContentPane(createContentPane()); } private JPanel createContentPane() { JPanel p = new JPanel(new BorderLayout(5, 5)); p.add(buildDockingPort(Color.blue, "Blue"), BorderLayout.NORTH); p.add(buildDockingPort(Color.red, "Red"), BorderLayout.SOUTH); p.add(buildDockingPort(Color.green, "Green"), BorderLayout.EAST); p.add(buildDockingPort(Color.yellow, "Yellow"), BorderLayout.WEST); p.add(createDockingPort(), BorderLayout.CENTER); return p; } private DefaultDockingPort buildDockingPort(Color color, String desc) { // create the DockingPort DefaultDockingPort port = createDockingPort(); // create and register the Dockable panel JPanel p = new JPanel(); p.setBackground(color); p.add(new JLabel("Drag Me")); DockingManager.registerDockable(p, desc); // dock the panel and return the DockingPort port.dock(p, CENTER_REGION); return port; } private DefaultDockingPort createDockingPort() { DefaultDockingPort port = new DefaultDockingPort(); port.setBackground(Color.ORANGE); port.setPreferredSize(new Dimension(100, 100)); return port; } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/SplitPaneDemo.java0000644000175000017500000000647712177715062026516 0ustar sylvestresylvestrepackage org.flexdock.demos.raw; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Insets; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.LineBorder; import org.flexdock.demos.util.DemoUtility; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.defaults.DefaultDockingPort; import org.flexdock.docking.defaults.AbstractDockable; public class SplitPaneDemo extends JPanel implements DockingConstants { private JLabel titlebar; private Dockable dockableImpl; public SplitPaneDemo(String title) { super(); titlebar = createTitlebar(" " + title); add(titlebar); setBorder(new LineBorder(Color.black)); dockableImpl = new DockableImpl(); } private JLabel createTitlebar(String title) { JLabel lbl = new JLabel(title); lbl.setForeground(Color.white); lbl.setBackground(Color.blue); lbl.setOpaque(true); return lbl; } public String getTitle() { return titlebar.getText().trim(); } public void doLayout() { Insets in = getInsets(); titlebar.setBounds(in.left, in.top, getWidth()-in.left-in.right, 25); } private Dockable getDockable() { return dockableImpl; } private class DockableImpl extends AbstractDockable { private DockableImpl() { super("dockable." + getTitle()); // the titlebar will the the 'hot' component that initiates dragging getDragSources().add(titlebar); setTabText(getTitle()); } public Component getComponent() { return SplitPaneDemo.this; } } private static JPanel createContentPane() { JPanel p = new JPanel(new BorderLayout(5, 5)); p.add(buildDockingPort("North"), BorderLayout.NORTH); p.add(buildDockingPort("South"), BorderLayout.SOUTH); p.add(buildDockingPort("East"), BorderLayout.EAST); p.add(buildDockingPort("West"), BorderLayout.WEST); p.add(createDockingPort(), BorderLayout.CENTER); return p; } private static DefaultDockingPort buildDockingPort(String desc) { // create the DockingPort DefaultDockingPort port = createDockingPort(); // create the Dockable panel SplitPaneDemo spd = new SplitPaneDemo(desc); DockingManager.registerDockable(spd.getDockable()); // dock the panel and return the DockingPort port.dock(spd.getDockable(), CENTER_REGION); return port; } private static DefaultDockingPort createDockingPort() { DefaultDockingPort port = new DefaultDockingPort(); port.setBackground(Color.gray); port.setPreferredSize(new Dimension(100, 100)); port.getDockingProperties().setSingleTabsAllowed(true); port.setTabsAsDragSource(true); return port; } public static void main(String[] args) { DockingManager.setSingleTabsAllowed(true); JFrame f = new JFrame("Split Docking Demo"); f.setContentPane(createContentPane()); f.setSize(600, 400); DemoUtility.setCloseOperation(f); f.setVisible(true); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/TabbedPaneDemo.java0000644000175000017500000000726712177715062026602 0ustar sylvestresylvestrepackage org.flexdock.demos.raw; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Insets; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.border.LineBorder; import org.flexdock.demos.util.DemoUtility; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.defaults.DefaultDockingPort; import org.flexdock.docking.defaults.AbstractDockable; public class TabbedPaneDemo extends JPanel implements DockingConstants { private JLabel titlebar; private Dockable dockableImpl; public TabbedPaneDemo(String title) { super(); titlebar = createTitlebar(" " + title); add(titlebar); setBorder(new LineBorder(Color.black)); dockableImpl = new DockableImpl(); } private JLabel createTitlebar(String title) { JLabel lbl = new JLabel(title); lbl.setForeground(Color.white); lbl.setBackground(Color.blue); lbl.setOpaque(true); return lbl; } public String getTitle() { return titlebar.getText().trim(); } public void doLayout() { Insets in = getInsets(); titlebar.setBounds(in.left, in.top, getWidth() - in.left - in.right, 25); } private Dockable getDockable() { return dockableImpl; } private class DockableImpl extends AbstractDockable { private DockableImpl() { super("dockable." + getTitle()); // the titlebar will the the 'hot' component that initiates dragging getDragSources().add(titlebar); setTabText(getTitle()); } public Component getComponent() { return TabbedPaneDemo.this; } } private static JPanel createContentPane() { JPanel p = new JPanel(new BorderLayout(5, 5)); p.add(buildDockingPort("North"), BorderLayout.NORTH); p.add(buildDockingPort("South"), BorderLayout.SOUTH); p.add(buildDockingPort("East"), BorderLayout.EAST); p.add(buildDockingPort("West"), BorderLayout.WEST); p.add(createDockingPort("Center"), BorderLayout.CENTER); return p; } private static DefaultDockingPort buildDockingPort(String desc) { // create the DockingPort DefaultDockingPort port = createDockingPort(desc); // create the Dockable panel TabbedPaneDemo cd = new TabbedPaneDemo(desc); DockingManager.registerDockable(cd.getDockable()); // dock the panel and return the DockingPort port.dock(cd.getDockable(), CENTER_REGION); return port; } private static int getTabPosition(String desc) { if ("North".equals(desc)) return JTabbedPane.TOP; if ("South".equals(desc)) return JTabbedPane.BOTTOM; if ("East".equals(desc)) return JTabbedPane.RIGHT; if ("West".equals(desc)) return JTabbedPane.LEFT; return JTabbedPane.TOP; } private static DefaultDockingPort createDockingPort(String desc) { DefaultDockingPort port = new DefaultDockingPort(); port.setBackground(Color.gray); port.setPreferredSize(new Dimension(200, 100)); port.getDockingProperties().setTabPlacement(getTabPosition(desc)); return port; } public static void main(String[] args) { JFrame f = new JFrame("Custom Conatainers Docking Demo"); f.setContentPane(createContentPane()); f.setSize(600, 400); DemoUtility.setCloseOperation(f); f.setVisible(true); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/adapter/0000755000175000017500000000000012177715062024551 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/adapter/AdapterDemo.java0000644000175000017500000000374112177715062027606 0ustar sylvestresylvestre/* * Created on Jun 24, 2005 */ package org.flexdock.demos.raw.adapter; import java.awt.Container; import java.awt.EventQueue; import javax.swing.JFrame; import org.flexdock.demos.util.DemoUtility; import org.flexdock.demos.util.Titlepane; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.adapter.AdapterFactory; import org.flexdock.docking.defaults.DefaultDockingPort; /** * @author Christopher Butler */ public class AdapterDemo extends JFrame { private DefaultDockingPort port; public static void main(String[] args) { System.setProperty(AdapterFactory.ADAPTER_RESOURCE_KEY, "org/flexdock/demos/raw/adapter/docking-adapter.xml"); DockingManager.setFloatingEnabled(true); EventQueue.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } private static void createAndShowGui() { JFrame frame = new AdapterDemo(); frame.setSize(500, 500); DemoUtility.setCloseOperation(frame); frame.setVisible(true); } public AdapterDemo() { super("Adapter Demo"); setContentPane(createContentPane()); } private Container createContentPane() { port = new DefaultDockingPort(); Titlepane pane1 = new Titlepane("View 1"); Titlepane pane2 = new Titlepane("View 2"); Titlepane pane3 = new Titlepane("View 3"); Titlepane pane4 = new Titlepane("View 4"); Titlepane pane5 = new Titlepane("View 5"); DockingManager.dock(pane1, (DockingPort)port); DockingManager.dock(pane2, pane1, DockingConstants.NORTH_REGION, 0.3f); DockingManager.dock(pane3, pane1, DockingConstants.SOUTH_REGION); DockingManager.dock(pane4, pane1, DockingConstants.EAST_REGION, 0.3f); DockingManager.dock(pane5, pane1, DockingConstants.WEST_REGION); return port; } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/border/0000755000175000017500000000000012177715062024406 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/border/BorderDemo.java0000644000175000017500000000330512177715062027274 0ustar sylvestresylvestrepackage org.flexdock.demos.raw.border; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import org.flexdock.demos.util.DemoUtility; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.defaults.DefaultDockingPort; public class BorderDemo extends JFrame implements DockingConstants { public BorderDemo() { super("Border Docking Demo"); setContentPane(createContentPane()); } private JPanel createContentPane() { JPanel p = new JPanel(new BorderLayout(5, 5)); p.add(buildDockingPort("North"), BorderLayout.NORTH); p.add(buildDockingPort("South"), BorderLayout.SOUTH); p.add(buildDockingPort("East"), BorderLayout.EAST); p.add(buildDockingPort("West"), BorderLayout.WEST); p.add(createDockingPort(), BorderLayout.CENTER); return p; } private DefaultDockingPort buildDockingPort(String desc) { // create the DockingPort DefaultDockingPort port = createDockingPort(); // create the Dockable panel DockablePanel panel = new DockablePanel(desc); // dock the panel and return the DockingPort port.dock(panel.getDockable(), CENTER_REGION); return port; } private DefaultDockingPort createDockingPort() { DefaultDockingPort port = new DefaultDockingPort(); port.setPreferredSize(new Dimension(100, 100)); port.setBorderManager(new DemoBorderManager()); return port; } public static void main(String[] args) { JFrame f = new BorderDemo(); f.setSize(600, 400); DemoUtility.setCloseOperation(f); f.setVisible(true); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/border/DemoBorderManager.java0000644000175000017500000000743512177715062030577 0ustar sylvestresylvestrepackage org.flexdock.demos.raw.border; import java.awt.Component; import javax.swing.JComponent; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.border.Border; import javax.swing.border.TitledBorder; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; import org.flexdock.docking.DockingPort; import org.flexdock.docking.defaults.BorderManager; import org.flexdock.docking.defaults.DefaultDockingPort; public class DemoBorderManager implements BorderManager { private Border dummyBorder; DemoBorderManager() { dummyBorder = new TitledBorder(""); } public void managePortNullChild(DockingPort port) { setBorder(port, dummyBorder); } public void managePortSimpleChild(DockingPort port) { if (port == null || port.getDockedComponent() == null) return; Component docked = port.getDockedComponent(); setBorder(docked, null); setBorder(port, getDesiredBorder(docked)); } public void managePortSplitChild(DockingPort port) { if (port == null || !(port.getDockedComponent() instanceof JSplitPane)) return; // clear the borders on the split pane and divider JSplitPane split = (JSplitPane)port.getDockedComponent(); clearSplitPaneBorder(split); // determine the borders for each child component Component left = split.getLeftComponent(); Component right = split.getRightComponent(); Border leftBorder = getDesiredBorder(left); Border rightBorder = getDesiredBorder(right); // set the borders for all interested parties setBorder(port, null); setBorder(left, null); setBorder(right, null); setBorder(getDocked(left), leftBorder); setBorder(getDocked(right), rightBorder); } public void managePortTabbedChild(DockingPort port) { setBorder(port, null); if (port == null || !(port.getDockedComponent() instanceof JTabbedPane)) return; JTabbedPane tabs = (JTabbedPane) port.getDockedComponent(); int tc = tabs.getTabCount(); for (int i = 0; i < tc; i++) setBorder(tabs.getComponentAt(i), new TitledBorder(tabs.getTitleAt(i))); } private void clearSplitPaneBorder(JSplitPane split) { split.setBorder(null); if (split.getUI() instanceof BasicSplitPaneUI) { // grab the divider from the UI and remove the border from it BasicSplitPaneDivider divider = ((BasicSplitPaneUI) split.getUI()).getDivider(); if (divider != null && divider.getBorder() != null) divider.setBorder(null); } } private void setBorder(DockingPort port, Border border) { if (port instanceof JComponent) ((JComponent) port).setBorder(border); } private void setBorder(Component cmp, Border border) { if (cmp instanceof JComponent) ((JComponent) cmp).setBorder(border); } // pulls the title out of a DockablePanel to create a titled border. // returns the dummy border if a DockablePanel isn't found private Border getDesiredBorder(Component cmp) { if (cmp instanceof DefaultDockingPort) cmp = ((DefaultDockingPort) cmp).getDockedComponent(); if (cmp instanceof DockablePanel) { String title = ((DockablePanel) cmp).getDockable().getDockingProperties().getDockableDesc(); return new TitledBorder(title); } return dummyBorder; } // convenience method for drilling down into a 'potential' docking port private Component getDocked(Component c) { if (c instanceof DefaultDockingPort) return ((DefaultDockingPort) c).getDockedComponent(); return c; } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/border/DockablePanel.java0000644000175000017500000000300612177715062027734 0ustar sylvestresylvestrepackage org.flexdock.demos.raw.border; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import javax.swing.JPanel; import javax.swing.border.TitledBorder; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; import org.flexdock.docking.defaults.AbstractDockable; public class DockablePanel extends JPanel { private String title; private JPanel dragInit; private Dockable dockableImpl; public DockablePanel(String title) { super(new BorderLayout()); dragInit = new JPanel(); dragInit.setBackground(getBackground().darker()); dragInit.setPreferredSize(new Dimension(10, 10)); add(dragInit, BorderLayout.EAST); setBorder(new TitledBorder(title)); setTitle(title); dockableImpl = new DockableImpl(); DockingManager.registerDockable(dockableImpl); } private void setTitle(String title) { this.title = title; } Dockable getDockable() { return dockableImpl; } public String getTitle() { return title==null? null: title.trim(); } private class DockableImpl extends AbstractDockable { private DockableImpl() { super("dockable." + getTitle()); // the titlebar will the the 'hot' component that initiates dragging getDragSources().add(dragInit); setTabText(getTitle()); } public Component getComponent() { return DockablePanel.this; } } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/elegant/0000755000175000017500000000000012177715062024550 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/elegant/DockableImpl.java0000644000175000017500000000201012177715062027732 0ustar sylvestresylvestrepackage org.flexdock.demos.raw.elegant; import java.awt.Component; import javax.swing.JComponent; import org.flexdock.docking.DockingManager; import org.flexdock.docking.defaults.AbstractDockable; public class DockableImpl extends AbstractDockable { private ElegantPanel panel; private JComponent dragInitiator; public DockableImpl(ElegantPanel dockable, JComponent dragInit, String id) { super(id); if(dockable==null) new IllegalArgumentException( "Cannot create DockableImpl with a null DockablePanel."); if(dragInit==null) new IllegalArgumentException( "Cannot create DockableImpl with a null drag initiator."); panel = dockable; dragInitiator = dragInit; setTabText(panel.getTitle()); getDragSources().add(dragInit); getFrameDragSources().add(dockable.getTitlebar()); DockingManager.registerDockable(this); } public Component getComponent() { return panel; } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/elegant/ElegantDemo.java0000644000175000017500000001000012177715062027566 0ustar sylvestresylvestrepackage org.flexdock.demos.raw.elegant; import java.awt.Container; import javax.swing.JFrame; import org.flexdock.demos.util.DemoUtility; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.defaults.DefaultDockingPort; import org.flexdock.docking.defaults.StandardBorderManager; import org.flexdock.plaf.common.border.ShadowBorder; public class ElegantDemo extends JFrame implements DockingConstants { private ElegantPanel j2eeHierarchyView; private ElegantPanel j2eeNavView; private ElegantPanel consoleView; private ElegantPanel serversView; private ElegantPanel tasksView; private ElegantPanel searchView; private ElegantPanel synchronizeView; private ElegantPanel outlineView; private ElegantPanel editorView; private DockingPort rootDockingPort; public ElegantDemo() { super("Elegant Docking Demo"); init(); } private void init() { // create all of the dockable panels createViews(); // create the dockingPort setContentPane((Container)getRootDockingPort()); // initialize the layout initLayout(); } private DockingPort getRootDockingPort() { if(rootDockingPort==null) { DefaultDockingPort port = new DefaultDockingPort(); port.setBorderManager(new StandardBorderManager(new ShadowBorder())); rootDockingPort = port; } return rootDockingPort; } private void createViews() { j2eeHierarchyView = new ElegantPanel("J2EE Hierarchy"); j2eeNavView = new ElegantPanel("J2EE Navigator"); consoleView = new ElegantPanel("Console"); serversView = new ElegantPanel("Servers"); tasksView = new ElegantPanel("Tasks"); searchView = new ElegantPanel("Search"); synchronizeView = new ElegantPanel("Synchronize"); outlineView = new ElegantPanel("Outline"); editorView = new ElegantPanel("Editor"); } private void initLayout() { DockingManager.setDefaultPersistenceKey("ElegantDemo.xml"); try { if(!DockingManager.restoreLayout(true)) // if(true) setupDefaultLayout(); } catch(Exception e) { e.printStackTrace(); setupDefaultLayout(); } // remember to save the current layout state when the application // shuts down DockingManager.setAutoPersist(true); } private void setupDefaultLayout() { // make sure there is nothing within the root dockingport getRootDockingPort().clear(); // setup 4 quadrants // dock the editor into the root dockingport DockingManager.dock(editorView, getRootDockingPort()); // dock the hierarchy-view to the west of the editor editorView.dock(j2eeHierarchyView, WEST_REGION, 0.3f); // dock the outline to the south of the hierarchy j2eeHierarchyView.dock(outlineView, SOUTH_REGION, 0.3f); // dock the task-view to the south of the editor editorView.dock(tasksView, SOUTH_REGION, 0.3f); // tab the nav-view onto the hierarchy view j2eeHierarchyView.dock(j2eeNavView); // tab the rest of the views onto the task-view tasksView.dock(serversView); tasksView.dock(consoleView); tasksView.dock(searchView); tasksView.dock(synchronizeView); // resize the immediate splitPane child of the root dockingport // DockingManager.setSplitProportion(rootDockingPort, 0.3f); // resize the splitPane containing the hierarchy-view // DockingManager.setSplitProportion(j2eeHierarchyView, 0.75f); // resize the splitPane containing the editor // DockingManager.setSplitProportion(editorView, 0.75f); } public static void main(String[] args) { ElegantDemo demo = new ElegantDemo(); DemoUtility.setCloseOperation(demo); demo.setSize(800, 600); demo.setVisible(true); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/elegant/ElegantPanel.java0000644000175000017500000000205112177715062027750 0ustar sylvestresylvestrepackage org.flexdock.demos.raw.elegant; import javax.swing.JComponent; import org.flexdock.demos.util.DockingStubTitlepane; import org.flexdock.demos.util.GradientTitlebar; import org.flexdock.demos.util.Titlebar; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; public class ElegantPanel extends DockingStubTitlepane { private Dockable dockable; public ElegantPanel(String title) { super(title, title); DockingManager.registerDockable(this); } public void dock(ElegantPanel otherPanel) { DockingManager.dock(otherPanel, this); } public void dock(ElegantPanel otherPanel, String region) { DockingManager.dock(otherPanel, this, region); } public void dock(ElegantPanel otherPanel, String region, float ratio) { DockingManager.dock(otherPanel, this, region, ratio); } protected JComponent createContentPane() { return null; } protected Titlebar createTitlebar(String title) { return new GradientTitlebar(title); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/jmf/0000755000175000017500000000000012177715062023705 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/jmf/JMFDemo.java0000644000175000017500000000435212177715062025775 0ustar sylvestresylvestre/* * Created on Jun 24, 2005 */ package org.flexdock.demos.raw.jmf; import java.awt.Container; import java.awt.EventQueue; import javax.swing.JFrame; import org.flexdock.demos.util.DemoUtility; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.defaults.DefaultDockingPort; /** * @author Christopher Butler */ public class JMFDemo extends JFrame { private DefaultDockingPort port; public static void main(String[] args) { DockingManager.setFloatingEnabled(true); System.setProperty(DockingConstants.HEAVYWEIGHT_DOCKABLES, "true"); EventQueue.invokeLater(new Runnable() { public void run() { try { createAndShowGui(); } catch(Throwable t) { String message = "Unable to initialize JMFDemo"; DemoUtility.showErrorDialog(null, message, t); } } }); } private static void createAndShowGui() { JFrame frame = new JMFDemo(); frame.setSize(500, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DemoUtility.setCloseOperation(frame); frame.setVisible(true); } public JMFDemo() { super("Adapter Demo"); setContentPane(createContentPane()); } private Container createContentPane() { port = new DefaultDockingPort(); MediaPanel pane1 = new MediaPanel("video.1", "Video 1", "fish.mov"); MediaPanel pane2 = new MediaPanel("video.2", "Video 2", "lung02a.mov"); MediaPanel pane3 = new MediaPanel("video.3", "Video 3", "fish.mov"); MediaPanel pane4 = new MediaPanel("video.4", "Video 4", "lung02a.mov"); MediaPanel pane5 = new MediaPanel("video.5", "Video 5", "fish.mov"); DockingManager.dock(pane1, (DockingPort)port); DockingManager.dock(pane2, pane1, DockingConstants.NORTH_REGION, 0.3f); DockingManager.dock(pane3, pane1, DockingConstants.SOUTH_REGION); DockingManager.dock(pane4, pane1, DockingConstants.EAST_REGION, 0.3f); DockingManager.dock(pane5, pane1, DockingConstants.WEST_REGION); return port; } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/raw/jmf/MediaPanel.java0000644000175000017500000001150312177715062026547 0ustar sylvestresylvestre/* * Created on Jun 27, 2005 */ package org.flexdock.demos.raw.jmf; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Label; import java.awt.Panel; import java.awt.TextArea; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import javax.media.ControllerEvent; import javax.media.ControllerListener; import javax.media.EndOfMediaEvent; import javax.media.Manager; import javax.media.MediaLocator; import javax.media.Player; import javax.media.Time; import org.flexdock.docking.DockingStub; import org.flexdock.util.ResourceManager; /** * @author Christopher Butler */ public class MediaPanel extends Panel implements DockingStub { private Player player; private Label titlebar; private String dockingId; public MediaPanel(String id, String title, String mediaFileName) { dockingId = id; setLayout(new BorderLayout()); titlebar = new Label(title); titlebar.setBackground(new Color(183, 201, 217)); add(titlebar, BorderLayout.NORTH); player = createPlayer(mediaFileName); if (player != null) { Component viewscreen = player.getVisualComponent(); Component controls = player.getControlPanelComponent(); if (viewscreen != null) { add(viewscreen, BorderLayout.CENTER); } else { TextArea ta = new TextArea("No JMF video playback support for '" + mediaFileName + "'"); ta.setEditable(false); add(ta, BorderLayout.CENTER); } if (controls != null) add(controls, BorderLayout.SOUTH); } else { TextArea ta = new TextArea("No JMF decoder support for '" + mediaFileName + "'"); ta.setEditable(false); add(ta, BorderLayout.CENTER); } } private static synchronized Player createPlayer(String mediaUri) { try { URL url = replaceJarUrlWithFileUrl(ResourceManager.getResource(mediaUri), mediaUri); MediaLocator locator = new MediaLocator(url); final Player mediaPlayer = Manager.createRealizedPlayer(locator); // add a listener to put us in an infinite loop mediaPlayer.addControllerListener(new ControllerListener() { public void controllerUpdate(ControllerEvent evt) { if(evt instanceof EndOfMediaEvent) { mediaPlayer.setMediaTime(new Time(0)); mediaPlayer.start(); } } }); return mediaPlayer; } catch (Exception e) { e.printStackTrace(); return null; } } private static HashMap jarUrlToTempFileCache = new HashMap(); /** * JMF doesn't realize a player/viewer for URLs pointing to resources inside jars. * To workaround this problem, the jar resource will be written to a temp file * and the URL replaced with an url pointing to the temp file. * I'd promote this into ResourceManager, but it appears to be isolated to JMF, so it'll stay here for now. * * @param url url with jar in i * @param mediaUri name of the original resource in t * @return * @throws IOException */ private static URL replaceJarUrlWithFileUrl(URL url, String mediaUri) throws IOException { if(!url.getProtocol().equals("jar")) return url; File f; synchronized(jarUrlToTempFileCache) { f = (File)jarUrlToTempFileCache.get(url); if(f != null && f.exists() && f.isFile() && f.canRead()) return f.toURL(); f = File.createTempFile("flexdock-", mediaUri); f.deleteOnExit(); FileOutputStream fos = new FileOutputStream(f); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] b = new byte[4096]; URLConnection conn = url.openConnection(); InputStream is = conn.getInputStream(); int read; while((read=is.read(b, 0, b.length)) != -1) bos.write(b, 0, read); bos.close(); jarUrlToTempFileCache.put(url, f); } return f.toURL(); } protected void finalize() { if(player!=null) { player.stop(); player.close(); player = null; } } public Component getDragSource() { return titlebar; } public Component getFrameDragSource() { return titlebar; } public String getPersistentId() { return dockingId; } public String getTabText() { return titlebar.getText(); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/util/0000755000175000017500000000000012177715062023315 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/util/DemoUtility.java0000644000175000017500000000322512177715062026432 0ustar sylvestresylvestrepackage org.flexdock.demos.util; import java.awt.Component; import java.io.PrintWriter; import java.io.StringWriter; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class DemoUtility { public static void setDemoDisableExitOnClose() { System.setProperty("disable.system.exit", "true"); } public static void setCloseOperation(JFrame f) { if (!Boolean.getBoolean("disable.system.exit")) f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); else f.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); } /** * Opens a JOptionPane with the error message and formatted stack trace of the throwable in a scrollable text area. * * @param c * optional argument for parent component to open modal error * dialog relative to * @param error_message * short string description of failure, must be non-null * @param t * the throwable that's being reported, must be non-null */ public static void showErrorDialog(Component c, String error_message, Throwable t) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); pw.println(error_message); pw.print("Exception is: "); t.printStackTrace(pw); pw.flush(); JTextArea ta = new JTextArea(sw.toString(), 15, 60); JScrollPane sp = new JScrollPane(ta); JOptionPane.showMessageDialog(c, sp, error_message, JOptionPane.ERROR_MESSAGE); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/util/DockableTitlepane.java0000644000175000017500000000575412177715062027545 0ustar sylvestresylvestre/* * Created on Jul 7, 2005 */ package org.flexdock.demos.util; import java.awt.Component; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; import org.flexdock.docking.DockingPort; import org.flexdock.docking.event.DockingEvent; import org.flexdock.docking.event.DockingEventHandler; import org.flexdock.docking.event.DockingListener; import org.flexdock.docking.props.DockablePropertySet; import org.flexdock.docking.props.PropertyManager; /** * @author Christopher Butler */ public class DockableTitlepane extends Titlepane implements Dockable { private String dockingId; private ArrayList dragSources; private HashSet frameDragSources; public DockableTitlepane(String id, String title) { super(title); dockingId = id; // initialize the drag sources dragSources = new ArrayList(); frameDragSources = new HashSet(); // use the titlebar as a drag source dragSources.add(getTitlebar()); frameDragSources.add(getTitlebar()); } // Begin user-defined methods public Component getComponent() { return this; } public List getDragSources() { return dragSources; } public Set getFrameDragSources() { return frameDragSources; } public String getPersistentId() { return dockingId; } // End user-defined methods // Begin framework-provided methods public boolean dock(Dockable dockable, String relativeRegion, float ratio) { return DockingManager.dock(dockable, this, relativeRegion, ratio); } public boolean dock(Dockable dockable, String relativeRegion) { return DockingManager.dock(dockable, this, relativeRegion); } public boolean dock(Dockable dockable) { return DockingManager.dock(dockable, this); } public DockingPort getDockingPort() { return DockingManager.getDockingPort((Dockable)this); } public DockablePropertySet getDockingProperties() { return PropertyManager.getDockablePropertySet(this); } public void addDockingListener(DockingListener listener) { DockingEventHandler.addDockingListener(this, listener); } public DockingListener[] getDockingListeners() { return DockingEventHandler.getDockingListeners(this); } public void removeDockingListener(DockingListener listener) { DockingEventHandler.removeDockingListener(this, listener); } // End framework-provided methods // Begin event handler methods public void dockingCanceled(DockingEvent evt) { } public void dockingComplete(DockingEvent evt) { } public void dragStarted(DockingEvent evt) { } public void dropStarted(DockingEvent evt) { } public void undockingComplete(DockingEvent evt) { } public void undockingStarted(DockingEvent evt) { } // End event handler methods } flexdock-1.2.4/src/java/demo/org/flexdock/demos/util/DockingStubTitlepane.java0000644000175000017500000000126312177715062030244 0ustar sylvestresylvestre/* * Created on Jul 7, 2005 */ package org.flexdock.demos.util; import java.awt.Component; import org.flexdock.docking.DockingStub; /** * @author Christopher Butler */ public class DockingStubTitlepane extends Titlepane implements DockingStub { private String dockingId; public DockingStubTitlepane(String id, String title) { super(title); dockingId = id; } public Component getDragSource() { return getTitlebar(); } public Component getFrameDragSource() { return getTitlebar(); } public String getPersistentId() { return dockingId; } public String getTabText() { return getTitle(); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/util/GradientPainter.java0000644000175000017500000000263212177715062027243 0ustar sylvestresylvestre/* * Created on Jul 6, 2005 */ package org.flexdock.demos.util; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JComponent; /** * @author Christopher Butler */ public class GradientPainter { private Color startColor; private Color midColor; public GradientPainter(Color start, Color mid) { startColor = start; midColor = mid; } public void paintGradient(JComponent comp, Graphics g) { int h = comp.getHeight(); int w = comp.getWidth(); int mid = w/2; Color bgColor = comp.getBackground(); Color start = startColor==null? bgColor: startColor; Color middle = midColor==null? bgColor: midColor; GradientPaint firstHalf = new GradientPaint(0, 0, start, mid, 0, middle); GradientPaint secondHalf = new GradientPaint(mid, 0, middle, w, 0, bgColor); Graphics2D g2 = (Graphics2D)g; g2.setPaint(firstHalf); g2.fillRect(0, 0, mid, h); g2.setPaint(secondHalf); g2.fillRect(mid-1, 0, mid, h); } public Color getMidColor() { return midColor; } public void setMidColor(Color midColor) { this.midColor = midColor; } public Color getStartColor() { return startColor; } public void setStartColor(Color startColor) { this.startColor = startColor; } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/util/GradientTitlebar.java0000644000175000017500000000253012177715062027404 0ustar sylvestresylvestre/* * Created on Jul 6, 2005 */ package org.flexdock.demos.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; /** * @author Christopher Butler */ public class GradientTitlebar extends Titlebar { public static final Color DEFAULT_MID_COLOR = new Color(168, 203, 239); public static final Color DEFAULT_START_COLOR = new Color(10, 36, 106); private GradientPainter gradient; public GradientTitlebar() { super(); init(null, null); } public GradientTitlebar(String text) { super(text); init(null, null); } public GradientTitlebar(String text, Color start, Color mid) { super(text); init(start, mid); } private void init(Color start, Color mid) { setOpaque(false); gradient = new GradientPainter(start, mid); setStartColor(start); setMidColor(mid); setForeground(Color.WHITE); setFont(getFont().deriveFont(Font.PLAIN)); } public void setStartColor(Color color) { gradient.setStartColor(color==null? DEFAULT_START_COLOR: color); } public void setMidColor(Color color) { gradient.setMidColor(color==null? DEFAULT_MID_COLOR: color); } protected void paintComponent(Graphics g) { gradient.paintGradient(this, g); super.paintComponent(g); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/util/Titlebar.java0000644000175000017500000000210112177715062025720 0ustar sylvestresylvestre/* * Created on Jul 6, 2005 */ package org.flexdock.demos.util; import java.awt.Color; import java.awt.Graphics; import javax.swing.JLabel; import javax.swing.border.EmptyBorder; /** * @author Christopher Butler */ public class Titlebar extends JLabel { public Titlebar() { super(); init(); } public Titlebar(String text) { super(text); init(); } public Titlebar(String text, Color bgColor) { super(text); init(); setBackground(bgColor); } private void init() { setOpaque(true); setBorder(new EmptyBorder(2, 4, 2, 2)); } protected void paintBorder(Graphics g) { int w = getWidth(); int h = getHeight(); g.setColor(getBackground().brighter()); g.drawLine(0, 0, w, 0); g.drawLine(0, 0, 0, h); g.setColor(getBackground().darker()); g.drawLine(0, h, w, h); } public void setTitle(String title) { if(title==null) title = ""; title = title.trim(); setText(title); } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/util/Titlepane.java0000644000175000017500000000253712177715062026114 0ustar sylvestresylvestre/* * Created on Jun 24, 2005 */ package org.flexdock.demos.util; import java.awt.BorderLayout; import java.awt.Color; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.LineBorder; /** * @author Christopher Butler */ public class Titlepane extends JPanel { private Titlebar titlebar; private JComponent contentPane; public Titlepane(String title) { setLayout(new BorderLayout()); titlebar = createTitlebar(title); add(titlebar, BorderLayout.NORTH); setContentPane(createContentPane()); } public String getTitle() { return titlebar.getText(); } public void setTitle(String title) { titlebar.setTitle(title); } public JLabel getTitlebar() { return titlebar; } protected Titlebar createTitlebar(String title) { return new Titlebar(title, new Color(183, 201, 217)); } public void setContentPane(JComponent comp) { if(contentPane!=null) remove(contentPane); if(comp!=null) add(comp, BorderLayout.CENTER); contentPane = comp; } protected JComponent createContentPane() { JPanel pane = new JPanel(); pane.setBorder(new LineBorder(Color.DARK_GRAY)); pane.setBackground(Color.WHITE); return pane; } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/util/VSNetStartPage.java0000644000175000017500000001173112177715062026775 0ustar sylvestresylvestre/* * Created on Apr 15, 2005 */ package org.flexdock.demos.util; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.border.LineBorder; import org.flexdock.util.ResourceManager; /** * @author Christopher Butler */ public class VSNetStartPage extends JPanel { private Icon miscIcons; private Image tabsImg; private Color tabRunBG; private Color contentBG1; private Color contentBG2; private Color tableBG1; private Font labelFont; private JButton newProjButton; private JButton openProjButton; private JPanel tablePane; private JPanel contentPane; private JTabbedPane tabbedPane; public VSNetStartPage() { super(new BorderLayout(0, 0)); init(); } private void init() { initAttribs(); newProjButton = new JButton("New Project"); openProjButton = new JButton("Open Project"); tablePane = createTablePane(); contentPane = createContentPane(); contentPane.add(tablePane); contentPane.add(newProjButton); contentPane.add(openProjButton); tabbedPane = createTabbedPane(); tabbedPane.addTab("Start Page", contentPane); tabbedPane.setBorder(null); add(tabbedPane, BorderLayout.CENTER); setBorder(new LineBorder(Color.GRAY, 1)); } private void initAttribs() { miscIcons = ResourceManager.createIcon("org/flexdock/demos/view/ms_misc_icons001.png"); tabsImg = ResourceManager.createImage("org/flexdock/demos/view/ms_tabs001.png"); tabRunBG = new Color(247, 243, 233); contentBG1 = new Color(246, 246, 246); contentBG2 = new Color(102, 153, 204); tableBG1 = new Color(154, 154, 143); labelFont = new Font("Dialog", Font.BOLD, 11); } private JPanel createTablePane() { return new JPanel() { protected void paintComponent(Graphics g) { g.setColor(tableBG1); g.fillRect(0, 0, getWidth(), 20); g.setColor(VSNetStartPage.this.getBackground()); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); g.setColor(Color.BLACK); g.setFont(labelFont); g.drawString("Name", 5, 15); g.drawString("Modified", 350, 15); } }; } private JPanel createContentPane() { return new JPanel(null) { public void doLayout() { int tableH = getHeight() - 120 - 55; tableH = Math.max(tableH, 25); tablePane.setBounds(12, 120, 475, tableH); int buttonY = 120 + tableH + 18; Dimension d = newProjButton.getPreferredSize(); newProjButton.setBounds(12, buttonY, d.width, d.height); openProjButton.setBounds(24 + d.width, buttonY, openProjButton.getPreferredSize().width, d.height); } protected void paintComponent(Graphics g) { super.paintComponent(g); int w = getWidth(); Color origC = g.getColor(); Font origF = g.getFont(); g.setColor(Color.WHITE); g.fillRect(0, 0, w, getHeight()); g.setColor(contentBG1); g.fillRect(0, 0, w, 48); g.setColor(contentBG2); g.fillRect(0, 48, w, 23); g.drawImage(tabsImg, 0, 0, null, this); g.setColor(Color.BLACK); g.setFont(labelFont); g.drawString("Open an Existing Project", 12, 100); g.setFont(origF); g.setColor(origC); } }; } private JTabbedPane createTabbedPane() { return new JTabbedPane(JTabbedPane.TOP) { protected void paintComponent(Graphics g) { Color orig = g.getColor(); Rectangle tabBounds = getBoundsAt(0); int tabLowerY = tabBounds.y + tabBounds.height; g.setColor(tabRunBG); g.fillRect(0, 0, getWidth(), tabLowerY); int iconX = getWidth() - miscIcons.getIconWidth(); int iconY = (tabLowerY) / 2 - miscIcons.getIconHeight() / 2 + 1; miscIcons.paintIcon(this, g, iconX, iconY); g.setColor(orig); super.paintComponent(g); g.setColor(Color.WHITE); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); g.drawRect(1, tabLowerY - 1, getWidth() - 3, getHeight() - tabLowerY - 1); g.setColor(orig); } }; } public JButton getNewProjButton() { return newProjButton; } public JButton getOpenProjButton() { return openProjButton; } } flexdock-1.2.4/src/java/demo/org/flexdock/demos/view/0000755000175000017500000000000012177715062023312 5ustar sylvestresylvestreflexdock-1.2.4/src/java/demo/org/flexdock/demos/view/ViewDemo.java0000644000175000017500000000604712177715062025703 0ustar sylvestresylvestre/* * Created on Mar 4, 2005 */ package org.flexdock.demos.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import org.flexdock.demos.util.DemoUtility; import org.flexdock.demos.util.VSNetStartPage; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.util.SwingUtility; import org.flexdock.view.View; import org.flexdock.view.Viewport; /** * @author Christopher Butler */ public class ViewDemo extends JFrame implements DockingConstants { public static void main(String[] args) { SwingUtility.setPlaf("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); // SwingUtility.setPlaf("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); // SwingUtility.setPlaf("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); EventQueue.invokeLater(new Runnable() { public void run() { startup(); } }); } private static void startup() { // turn on floating support DockingManager.setFloatingEnabled(true); JFrame f = new ViewDemo(); f.setSize(800, 600); SwingUtility.centerOnScreen(f); DemoUtility.setCloseOperation(f); f.setVisible(true); } public ViewDemo() { super("Viewport Demo"); setContentPane(createContentPane()); } private JPanel createContentPane() { JPanel p = new JPanel(new BorderLayout(0, 0)); p.setBorder(new EmptyBorder(5, 5, 5, 5)); Viewport viewport = new Viewport(); p.add(viewport, BorderLayout.CENTER); View startPage = createStartPage(); View view1 = createView("solution.explorer", "Solution Explorer"); View view2 = createView("task.list", "Task List"); View view3 = createView("class.view", "Class View"); View view4 = createView("message.log", "Message Log"); viewport.dock(startPage); startPage.dock(view1, WEST_REGION, .3f); startPage.dock(view2, SOUTH_REGION, .3f); startPage.dock(view4, EAST_REGION, .3f); view1.dock(view3, SOUTH_REGION, .3f); return p; } private View createView(String id, String text) { View view = new View(id, text); view.addAction(CLOSE_ACTION); view.addAction(PIN_ACTION); JPanel p = new JPanel(); // p.setBackground(Color.WHITE); p.setBorder(new LineBorder(Color.GRAY, 1)); JTextField t = new JTextField(text); t.setPreferredSize(new Dimension(100, 20)); p.add(t); view.setContentPane(p); return view; } private View createStartPage() { String id = "startPage"; View view = new View(id, null, null); view.setTerritoryBlocked(CENTER_REGION, true); view.setTitlebar(null); view.setContentPane(new VSNetStartPage()); return view; } }flexdock-1.2.4/src/java/dockbar/0000755000175000017500000000000012177715062017324 5ustar sylvestresylvestreflexdock-1.2.4/src/java/dockbar/org/0000755000175000017500000000000012177715062020113 5ustar sylvestresylvestreflexdock-1.2.4/src/java/dockbar/org/flexdock/0000755000175000017500000000000012177715062021712 5ustar sylvestresylvestreflexdock-1.2.4/src/java/dockbar/org/flexdock/dockbar/0000755000175000017500000000000012177715062023317 5ustar sylvestresylvestreflexdock-1.2.4/src/java/dockbar/org/flexdock/dockbar/Dockbar.java0000644000175000017500000000662012177715062025533 0ustar sylvestresylvestre/* * Created on Apr 13, 2005 */ package org.flexdock.dockbar; import java.awt.Dimension; import java.util.ArrayList; import java.util.Iterator; import javax.swing.BoxLayout; import javax.swing.JPanel; import javax.swing.border.Border; import org.flexdock.docking.Dockable; import org.flexdock.docking.state.MinimizationManager; import org.flexdock.plaf.common.border.SlideoutBorder; /** * @author Christopher Butler */ public class Dockbar extends JPanel { protected int orientation; protected DockbarManager manager; protected ArrayList mDocks = new ArrayList(); static { // make sure DockbarLabel is initialized Class c = DockbarLabel.class; } public static int getValidOrientation(int orient) { switch (orient) { case MinimizationManager.LEFT: return MinimizationManager.LEFT; case MinimizationManager.RIGHT: return MinimizationManager.RIGHT; case MinimizationManager.BOTTOM: return MinimizationManager.BOTTOM; default: return MinimizationManager.LEFT; } } public Dockbar(DockbarManager manager, int orientation) { this.manager = manager; setBorder(new SlideoutBorder()); setOrientation(orientation); } void undock(Dockable dockable) { DockbarLabel label = getLabel(dockable); remove(label); mDocks.remove(label); getParent().validate(); repaint(); } public DockbarLabel getLabel(Dockable dockable) { if(dockable==null) return null; for (Iterator docks = mDocks.iterator(); docks.hasNext();) { DockbarLabel label = (DockbarLabel) docks.next(); if (label.getDockable() == dockable) return label; } // for return null; } public boolean contains(Dockable dockable) { return getLabel(dockable)!=null; } public void dock(Dockable dockable) { if(dockable==null) return; DockbarLabel currentLabel = getLabel(dockable); if (currentLabel!=null) { currentLabel.setActive(false); return; } DockbarLabel newLabel = new DockbarLabel(dockable.getPersistentId(), getOrientation()); add(newLabel); mDocks.add(newLabel); getParent().validate(); repaint(); } public int getOrientation() { return orientation; } private void setOrientation(int orientation) { orientation = getValidOrientation(orientation); this.orientation = orientation; Border border = getBorder(); if(border instanceof SlideoutBorder) ((SlideoutBorder)border).setOrientation(orientation); int boxConstraint = orientation==MinimizationManager.TOP || orientation==MinimizationManager.BOTTOM? BoxLayout.LINE_AXIS: BoxLayout.PAGE_AXIS; setLayout(new BoxLayout(this, boxConstraint)); } public Dimension getPreferredSize() { if(mDocks.size()==0) return new Dimension(0,0); DockbarLabel label = (DockbarLabel)getComponent(0); return label.getPreferredSize(); } void activate(String dockableId, boolean lock) { if(manager!=null) { manager.setActiveDockable(dockableId); if(lock) manager.getActivationListener().lockViewpane(); } } }flexdock-1.2.4/src/java/dockbar/org/flexdock/dockbar/DockbarLabel.java0000644000175000017500000001770012177715062026474 0ustar sylvestresylvestre/* Copyright (c) 2005 Andreas Ernst Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.flexdock.dockbar; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.SwingUtilities; import javax.swing.border.Border; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import org.flexdock.dockbar.util.TextIcon; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; import org.flexdock.docking.props.DockablePropertySet; import org.flexdock.docking.state.MinimizationManager; import org.flexdock.plaf.common.border.RoundedLineBorder; /** * @author Andreas Ernst * @author Christopher Butler */ public class DockbarLabel extends JLabel implements MouseListener { private static final Insets[] INSETS = createInsets(); private static final int[] ROTATIONS = createRotations(); // instance data private String dockingId; private boolean mSelected = false; // private boolean mDragging = false; private RoundedLineBorder mBorder; private boolean mInPaint = false; private boolean mActive = false; private int mDefaultOrientation; private static Insets[] createInsets() { Insets[] insets = new Insets[5]; insets[MinimizationManager.CENTER] = new Insets(1, 1, 1, 1); insets[MinimizationManager.LEFT] = new Insets(1, 1, 2, 1); insets[MinimizationManager.RIGHT] = new Insets(1, 1, 2, 1); insets[MinimizationManager.TOP] = new Insets(1, 1, 1, 2); insets[MinimizationManager.BOTTOM] = new Insets(1, 1, 1, 2); return insets; } private static int[] createRotations() { int[] rotations = new int[5]; rotations[MinimizationManager.CENTER] = TextIcon.ROTATE_NONE; rotations[MinimizationManager.LEFT] = TextIcon.ROTATE_LEFT; rotations[MinimizationManager.RIGHT] = TextIcon.ROTATE_RIGHT; rotations[MinimizationManager.TOP] = TextIcon.ROTATE_NONE; rotations[MinimizationManager.BOTTOM] = TextIcon.ROTATE_NONE; return rotations; } public DockbarLabel(String dockableId) { this(dockableId, DockbarManager.DEFAULT_EDGE); } public DockbarLabel(String dockableId, int defaultOrientation) { dockingId = dockableId; mDefaultOrientation = Dockbar.getValidOrientation(defaultOrientation); mBorder = new RoundedLineBorder(Color.lightGray, 3); setBorder(new CompoundBorder(new EmptyBorder(new Insets(1, 1, 1, 1)), mBorder)); addMouseListener(this); TextIcon icon = new TextIcon(this, 2, 1); setIcon(icon); updateIcon(); icon.validate(); } // stuff public Border getBorder() { return mInPaint ? null : super.getBorder(); } // override public void paintComponent(Graphics g) { mInPaint = false; paintBorder(g); mInPaint = true; super.paintComponent(g); } public void paint(Graphics g) { mInPaint = true; // updateView(); super.paint(g); // will call paintComponent, paintBorder mInPaint = false; } public void setActive(boolean active) { if (mActive != active) { mActive = active; updateBorder(); repaint(); } // if } private void updateBorder() { mBorder.setFilled(mSelected || mActive); } // protected protected void activate(boolean lock) { Dockbar dockbar = (Dockbar)SwingUtilities.getAncestorOfClass(Dockbar.class, this); if(dockbar!=null) { dockbar.activate(dockingId, lock); } } // private private void setSelected(boolean selected) { if (mSelected != selected) { mSelected = selected; updateBorder(); repaint(); } // if } protected void validateTree() { updateBorderInsets(); updateIcon(); super.validateTree(); } private void updateIcon() { Object obj = getIcon(); if(!(obj instanceof TextIcon)) return; Dockable d = getDockable(); DockablePropertySet p = d==null? null: d.getDockingProperties(); if(p==null) return; int orientation = getOrientation(); int rotation = ROTATIONS[orientation]; Icon dockIcon = p.getDockbarIcon(); if(dockIcon==null) dockIcon = p.getTabIcon(); String text = p.getDockableDesc(); TextIcon icon = (TextIcon)obj; icon.setIcon(dockIcon); icon.setText(text); icon.setRotation(rotation); } public void setIcon(Icon icon) { Icon currIcon = getIcon(); if(currIcon instanceof TextIcon) { ((TextIcon)currIcon).setIcon(icon); } else { super.setIcon(icon); } revalidate(); } public void setText(String text) { Icon currIcon = getIcon(); if(currIcon instanceof TextIcon) { ((TextIcon)currIcon).setText(text); } else { super.setText(text); } revalidate(); } private void updateBorderInsets() { Border border = super.getBorder(); border = border instanceof CompoundBorder? ((CompoundBorder)border).getOutsideBorder(): null; EmptyBorder insetBorder = border instanceof EmptyBorder? (EmptyBorder)border: null; if(insetBorder!=null) { int orientation = getOrientation(); Insets insets = INSETS[orientation]; Insets borderInsets = insetBorder.getBorderInsets(); borderInsets.top = insets.top; borderInsets.left = insets.left; borderInsets.bottom = insets.bottom; borderInsets.right = insets.right; } } public Dockable getDockable() { return DockingManager.getDockable(dockingId); } public int getOrientation() { Container cnt = getParent(); if(cnt instanceof Dockbar) return ((Dockbar)cnt).getOrientation(); return mDefaultOrientation; } public Dimension getPreferredSize() { Icon tmp = getIcon(); if(!(tmp instanceof TextIcon)) return super.getPreferredSize(); Insets insets = getInsets(); TextIcon icon = (TextIcon)tmp; int w = insets.left + icon.getIconWidth() + insets.right; int h = insets.top + icon.getIconHeight() + insets.bottom; return new Dimension(w, h); } // override MouseListener public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseClicked(MouseEvent e) { if(e.getButton() != MouseEvent.BUTTON1) return; activate(true); } public void mouseEntered(MouseEvent e) { activate(false); } public void mouseExited(MouseEvent e) { } } flexdock-1.2.4/src/java/dockbar/org/flexdock/dockbar/DockbarManager.java0000644000175000017500000004761212177715062027034 0ustar sylvestresylvestre/* * Created on Apr 14, 2005 */ package org.flexdock.dockbar; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.EventQueue; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.lang.ref.WeakReference; import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Iterator; import java.util.WeakHashMap; import javax.swing.JLayeredPane; import javax.swing.SwingUtilities; import org.flexdock.dockbar.activation.ActivationQueue; import org.flexdock.dockbar.activation.ActiveDockableHandler; import org.flexdock.dockbar.activation.Animation; import org.flexdock.dockbar.event.ActivationListener; import org.flexdock.dockbar.event.DockablePropertyChangeHandler; import org.flexdock.dockbar.event.DockbarEvent; import org.flexdock.dockbar.event.DockbarEventHandler; import org.flexdock.dockbar.event.DockbarListener; import org.flexdock.dockbar.event.DockbarTracker; import org.flexdock.dockbar.layout.DockbarLayout; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingManager; import org.flexdock.docking.floating.frames.DockingFrame; import org.flexdock.docking.props.PropertyChangeListenerFactory; import org.flexdock.docking.state.DockingPath; import org.flexdock.docking.state.DockingState; import org.flexdock.docking.state.MinimizationManager; import org.flexdock.event.EventManager; import org.flexdock.perspective.RestorationManager; import org.flexdock.util.RootWindow; import org.flexdock.util.Utilities; /** * @author Christopher Butler * @author Bobby Rosenberger * @author Mateusz Szczap */ public class DockbarManager { private static final WeakHashMap MANAGERS_BY_WINDOW = new WeakHashMap(); public static final Integer DOCKBAR_LAYER = new Integer(JLayeredPane.PALETTE_LAYER.intValue()-5); public static final int DEFAULT_EDGE = MinimizationManager.LEFT; private static String dockbarManagerClassName; private static DockbarManager currentManager; protected WeakReference windowRef; protected Dockbar leftBar; protected Dockbar rightBar; protected Dockbar bottomBar; protected ViewPane viewPane; protected DockbarLayout dockbarLayout; private ActivationListener activationListener; private HashMap dockables; private int activeEdge = MinimizationManager.UNSPECIFIED_LAYOUT_CONSTRAINT; private String activeDockableId; private boolean animating; private boolean dragging; static { Class c = DockingManager.class; EventManager.addHandler(new DockbarEventHandler()); DockbarTracker.register(); // setup to listen for Dockable property change events PropertyChangeListenerFactory.addFactory(new DockablePropertyChangeHandler.Factory()); // update behavior of active Dockable changes EventManager.addListener(new ActiveDockableHandler()); } public static DockbarManager getInstance(Component c) { RootWindow window = RootWindow.getRootContainer(c); return getInstance(window); } public static DockbarManager getInstance(RootWindow window) { if(window==null) return null; // DockingFrames should not be allowed to contain dockbars. // This may change in the future, but for now if our window is a // DockingFrame, reroute to its owner. Component root = window.getRootContainer(); if(root instanceof DockingFrame) { root = ((DockingFrame)root).getOwner(); return getInstance(root); } DockbarManager mgr = (DockbarManager)MANAGERS_BY_WINDOW.get(window); if(mgr==null) { mgr = createDockbarManager(window); synchronized(MANAGERS_BY_WINDOW) { MANAGERS_BY_WINDOW.put(window, mgr); } mgr.install(); } if(currentManager==null) currentManager = mgr; return mgr; } /** * Creates a new DockbarManager instance. In the case that a dockbarManager class name * has been set the class will be instantiated by reflection. If no classname is set a * org.flexdock.dockbar.DockbarManager will be created. * * @param window RootWindow for which the DockbarManager will be created * @return new DockbarManager instance * @see DockbarManager#setDockbarManager(String) */ private static DockbarManager createDockbarManager(RootWindow window) { if (dockbarManagerClassName == null) return new DockbarManager(window); DockbarManager mgr = null; try { Class clazz = Class.forName(dockbarManagerClassName); Constructor constructor = clazz.getConstructor(new Class[] {RootWindow.class}); mgr = (DockbarManager)constructor.newInstance(new Object[] {window}); } catch(Exception e) { throw new RuntimeException(e); } return mgr; } /** * Sets a custom DockbarManager class which will be used to create new DockbarManager * instances. * * @param className Classname of your custom DockbarManager. */ public static void setDockbarManager(String className) { dockbarManagerClassName = className; } public static DockbarManager getCurrent(Dockable dockable) { if(dockable==null) return null; synchronized(MANAGERS_BY_WINDOW) { for(Iterator it=MANAGERS_BY_WINDOW.values().iterator(); it.hasNext();) { DockbarManager mgr = (DockbarManager)it.next(); if(mgr.isOwner(dockable)) return mgr; } } return null; } public static void windowChanged(Component newWindow) { currentManager = getInstance(newWindow); } public static DockbarManager getCurrent() { return currentManager; } public static void addListener(DockbarListener listener) { EventManager.addListener(listener); } public static void activate(String dockableId, boolean locked) { Dockable dockable = DockingManager.getDockable(dockableId); activate(dockable, locked); } public static void activate(Dockable dockable, boolean locked) { if(dockable==null) return; DockbarManager mgr = getCurrent(dockable); if(mgr==null || !mgr.contains(dockable)) return; mgr.setActiveDockable(dockable); if(locked) mgr.getActivationListener().lockViewpane(); } protected DockbarManager(RootWindow window) { dockbarLayout = new DockbarLayout(this); activationListener = new ActivationListener(this); leftBar = new Dockbar(this, MinimizationManager.LEFT); rightBar = new Dockbar(this, MinimizationManager.RIGHT); bottomBar = new StatusDockbar(this, MinimizationManager.BOTTOM); viewPane = new ViewPane(this); windowRef = new WeakReference(window); dockables = new HashMap(); } public RootWindow getWindow() { return (RootWindow)windowRef.get(); } protected void install() { RootWindow window = getWindow(); if(window==null) return; JLayeredPane layerPane = window.getLayeredPane(); boolean changed = install(leftBar, layerPane); changed = install(rightBar, layerPane) || changed; changed = install(bottomBar, layerPane) || changed; changed = install(viewPane, layerPane) || changed; if(changed) { layerPane.addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent evt) { if(evt.getSource() instanceof JLayeredPane) revalidate(); } }); } revalidate(); } private boolean install(Component c, JLayeredPane layerPane) { if(c.getParent()!=layerPane) { if(c.getParent()!=null) c.getParent().remove(c); layerPane.add(c, DOCKBAR_LAYER); return true; } return false; } public Dockbar getBottomBar() { return bottomBar; } public Dockbar getLeftBar() { return leftBar; } public Dockbar getRightBar() { return rightBar; } public ViewPane getViewPane() { return viewPane; } public void revalidate() { EventQueue.invokeLater(new Runnable() { public void run() { validate(); } }); } public void validate() { toggleDockbars(); dockbarLayout.layout(); viewPane.revalidate(); } private void toggleDockbars() { leftBar.setVisible(leftBar.getComponentCount()!=0); rightBar.setVisible(rightBar.getComponentCount()!=0); bottomBar.setVisible(bottomBar.getComponentCount()!=0); } private int findDockbarEdge(Dockable dockable) { RootWindow window = RootWindow.getRootContainer(dockable.getComponent()); if(window==null) return DEFAULT_EDGE; // get the dockable component and it's containing content pane Component cmp = dockable.getComponent(); Container contentPane = window.getContentPane(); // get the bounds of the content pane and dockable, translating the dockable into the // content pane's axes Rectangle contentRect = new Rectangle(0, 0, contentPane.getWidth(), contentPane.getHeight()); Rectangle dockRect = SwingUtilities.convertRectangle(cmp.getParent(), cmp.getBounds(), contentPane); // get the center of the dockable Point dockCenter = new Point(dockRect.x + (dockRect.width/2), dockRect.y + (dockRect.height/2)); // get the center left, right, and bottom points Point leftCenter = new Point(0, contentRect.height/2); Point bottomCenter = new Point(contentRect.width/2, contentRect.height); Point rightCenter = new Point(contentRect.width, contentRect.height/2); // calculate the absolute distance from dockable center to each of the edge // center points. whichever is the shortest, that is the edge the dockable is // 'closest' to and that will be the edge we'll return double min = Math.abs(dockCenter.distance(leftCenter)); int edge = MinimizationManager.LEFT; double delta = Math.abs(dockCenter.distance(rightCenter)); if(deltaTextIcon for the specified component * with the specified label. * It sets the orientation to the provided value if it's legal for the string */ public TextIcon(Component cmp, int space, int inset) { mComponent = cmp; mText = ""; mIcon = null; mRotation = ROTATE_NONE; mIconSpace = space; mInset = inset; calcDimensions(); mComponent.addPropertyChangeListener(this); } // public public String getText() { return mText; } public void setText(String text) { if(text==null) text = ""; boolean changed = isChanged(mText, text); mText = text; if(changed) recalcDimensions(); } public void setIcon(Icon icon) { boolean changed = isChanged(mIcon, icon); mIcon = icon; if(changed) recalcDimensions(); } public void setRotation(int rotation) { rotation = getValidRotation(rotation); boolean changed = rotation!=mRotation; mRotation = rotation; if(changed) recalcDimensions(); } public static int getValidRotation(int rotation) { switch(rotation) { case ROTATE_LEFT: return ROTATE_LEFT; case ROTATE_RIGHT: return ROTATE_RIGHT; default: return ROTATE_NONE; } } private boolean isChanged(Object oldValue, Object newValue) { if(oldValue==newValue) return false; if(oldValue==null || newValue==null) return true; return !oldValue.equals(newValue); } // implement PropertyChangeListener public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (prop.equals("font")) recalcDimensions(); } // private private void recalcDimensions() { int w = getIconWidth(); int h = getIconHeight(); calcDimensions(); if (w != getIconWidth() || h != getIconHeight()) mComponent.invalidate(); } private void calcDimensions() { FontMetrics fm = mComponent.getFontMetrics(mComponent.getFont()); mCharHeight = fm.getAscent() + fm.getDescent(); mDescent = fm.getDescent(); if (mRotation == ROTATE_NONE) { mHeight = Math.max(mCharHeight, mIcon != null ? mIcon.getIconHeight() : 0); mWidth = fm.stringWidth(mText) + (mIcon != null ? (mIcon.getIconWidth() + mIconSpace) : 0); } // if else { mWidth = Math.max(mCharHeight, mIcon != null ? mIcon.getIconHeight() : 0); mHeight = fm.stringWidth(mText) + (mIcon != null ? (mIcon.getIconWidth() + mIconSpace) : 0); } // else mWidth += 2 * mInset; mHeight += 2 * mInset; } // Icon public int getIconWidth() { return mWidth; } public int getIconHeight() { return mHeight; } public void paintIcon(Component c, Graphics g, int x, int y) { Graphics2D g2d = (Graphics2D)g; g2d.setColor(c.getForeground()); g2d.setFont(c.getFont()); if (mRotation == ROTATE_NONE) { if ( mIcon != null) { x += mInset; y += mInset; int iconHeight = mIcon.getIconHeight(); mIcon.paintIcon(mComponent, g, x, y + (mHeight - 2 * mInset - iconHeight) / 2); // center vertically x += mIconSpace + mIcon.getIconWidth(); } // if Object renderingHint = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.drawString(mText, x, mHeight- mDescent - mInset); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint); } // if else if (mRotation == ROTATE_LEFT) { // Bottom up int translateX = x + mWidth - mInset; int translateY = y + mHeight - mInset; g2d.translate(translateX, translateY); g2d.rotate(-NINETY_DEGREES); if (mIcon != null) { int iconHeight = mIcon.getIconHeight(); int iconOffset = (mWidth - 2 * mInset - iconHeight) / 2; // center icon mIcon.paintIcon(mComponent, g2d, 0, -mIcon.getIconWidth() - iconOffset); } // if Object renderingHint = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.drawString(mText, mIcon != null ? mIcon.getIconHeight() + mIconSpace: 0, -mDescent); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint); g2d.rotate(NINETY_DEGREES); g2d.translate(-translateX, -translateY); } // if else if (mRotation == ROTATE_RIGHT) { // top down int translateX = x + mInset; int translateY = y + mInset; g2d.translate(translateX, translateY); g2d.rotate(NINETY_DEGREES); if ( mIcon != null) { int iconHeight = mIcon.getIconHeight(); int iconOffset = (mWidth - 2 * mInset - iconHeight) / 2; // center icon mIcon.paintIcon(mComponent, g2d, 0, -mIcon.getIconWidth() - iconOffset); } // if Object renderingHint = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.drawString(mText, mIcon != null ? mIcon.getIconHeight() + mIconSpace: 0, -mDescent); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint); g2d.rotate(-NINETY_DEGREES); g2d.translate(-translateX, -translateY); } // if } public void validate() { calcDimensions(); } }flexdock-1.2.4/src/java/drag/0000755000175000017500000000000012177715062016634 5ustar sylvestresylvestreflexdock-1.2.4/src/java/drag/org/0000755000175000017500000000000012177715062017423 5ustar sylvestresylvestreflexdock-1.2.4/src/java/drag/org/flexdock/0000755000175000017500000000000012177715062021222 5ustar sylvestresylvestreflexdock-1.2.4/src/java/drag/org/flexdock/docking/0000755000175000017500000000000012177715062022640 5ustar sylvestresylvestreflexdock-1.2.4/src/java/drag/org/flexdock/docking/drag/0000755000175000017500000000000012177715062023555 5ustar sylvestresylvestreflexdock-1.2.4/src/java/drag/org/flexdock/docking/drag/preview/0000755000175000017500000000000012177715062025236 5ustar sylvestresylvestreflexdock-1.2.4/src/java/drag/org/flexdock/docking/drag/preview/AlphaPreview.java0000644000175000017500000000654112177715062030476 0ustar sylvestresylvestre/* Copyright (c) 2004 Ismail Degani, Christopher M Butler Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.flexdock.docking.drag.preview; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Composite; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.Rectangle; import java.util.Map; import org.flexdock.docking.Dockable; import org.flexdock.docking.drag.effects.DefaultPreview; public class AlphaPreview extends DefaultPreview { public static final float DEFAULT_ALPHA = 0.5f; public static final Color DEFAULT_COLOR = Color.WHITE; public static final Color DEFAULT_BORDER = Color.BLACK; public static final AlphaPreview BLUE = new AlphaPreview(Color.BLACK, Color.BLUE.brighter().brighter().brighter().brighter(), .2f, true); public static final AlphaPreview BLACK = new AlphaPreview(Color.BLACK, Color.BLACK.brighter().brighter().brighter().brighter(), .25f, true); private float previewAlpha; private Color previewColor; private Color borderColor; private boolean immutable; public AlphaPreview() { this(DEFAULT_BORDER, DEFAULT_COLOR, DEFAULT_ALPHA, false); } public AlphaPreview(Color border, Color fill, float alpha) { this(border, fill, alpha, false); } public AlphaPreview(Color border, Color fill, float alpha, boolean immutable) { setBorderColor(border); setPreviewColor(fill); setAlpha(alpha); this.immutable = immutable; } public void setPreviewColor(Color color) { if(!immutable) previewColor = color==null? DEFAULT_COLOR: color; } public void setAlpha(float alpha) { if(!immutable) { alpha = Math.max(0, alpha); alpha = Math.min(alpha, 1f); previewAlpha = alpha; } } public void setBorderColor(Color color) { if(!immutable) borderColor = color==null? DEFAULT_BORDER: color; } public void drawPreview(Graphics2D g, Polygon p, Dockable dockable, Map dragInfo) { Rectangle rect = p.getBounds(); g.setColor(borderColor); g.draw3DRect(rect.x, rect.y, rect.width-1, rect.height-1, false); Composite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, previewAlpha); g.setComposite(composite); g.setColor(previewColor); g.fillRect(rect.x, rect.y, rect.width, rect.height); } } flexdock-1.2.4/src/java/drag/org/flexdock/docking/drag/preview/GhostPreview.java0000644000175000017500000000633712177715062030540 0ustar sylvestresylvestre/* * Created on May 5, 2005 */ package org.flexdock.docking.drag.preview; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Component; import java.awt.Composite; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.util.Map; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingPort; import org.flexdock.docking.drag.effects.DefaultPreview; import org.flexdock.util.SwingUtility; /** * @author Christopher Butler */ public class GhostPreview extends DefaultPreview { private static final String PREVIOUS_BOUNDS = "TestPreview.PREVIOUS_BOUNDS"; private static final String PREVIEW_IMG = "TestPreview.PREVIEW_IMG"; public Polygon createPreviewPolygon(Component dockable, DockingPort port, Dockable hover, String targetRegion, Component paintingTarget, Map dragInfo) { // create the standard preview polygon Polygon polygon = super.createPreviewPolygon(dockable, port, hover, targetRegion, paintingTarget, dragInfo); if(polygon==null) return null; // check to see if the current polygon bounds differ from the // last time we calculated them. Rectangle prevBounds = (Rectangle)dragInfo.get(PREVIOUS_BOUNDS); Rectangle bounds = polygon.getBounds(); // if the polygon bounds have changed, create a new BufferedImage // to represent the dockable preview. this image will be used // in drawPreview() if(!bounds.equals(prevBounds)) { // store the original dockable size Dimension origSize = dockable.getSize(); // change the dockable to match the preview size while // we generate an image off of it dockable.setSize(bounds.getSize()); BufferedImage img = SwingUtility.createImage(dockable); // store the image for use in drawPreview() dragInfo.put(PREVIEW_IMG, img); // restore the original dockable size dockable.setSize(origSize); } // store the current preview bounds so we'll know the next time we need // to regenerate the preview image dragInfo.put(PREVIOUS_BOUNDS, bounds); // return the polygon return polygon; } public void drawPreview(Graphics2D g, Polygon poly, Dockable dockable, Map dragInfo) { // grab the preview image created in createPreviewPolygon() BufferedImage image = (BufferedImage)dragInfo.get(PREVIEW_IMG); if(image==null) return; // create a solid preview outline Rectangle bounds = poly.getBounds(); g.setColor(Color.BLACK); g.drawRect(bounds.x, bounds.y, bounds.width, bounds.height); // make the graphics 50% translucent Composite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); g.setComposite(composite); // now draw the preview image g.drawImage(image, bounds.x, bounds.y, null); } protected Rectangle createTabbedPaneRect(DockingPort port, Component hover) { if(hover!=null) return hover.getBounds(); return super.createTabbedPaneRect(port, hover); } } flexdock-1.2.4/src/java/drag/org/flexdock/docking/drag/preview/XORPreview.java0000644000175000017500000000307312177715062030116 0ustar sylvestresylvestrepackage org.flexdock.docking.drag.preview; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.Stroke; import java.util.Map; import org.flexdock.docking.Dockable; import org.flexdock.docking.drag.effects.DefaultPreview; public class XORPreview extends DefaultPreview { public void drawPreview(Graphics2D g, Polygon p, Dockable dockable, Map dragInfo) { float[] pattern = { 1.0f, 1.0f }; Stroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1f, pattern, 0f); g.setStroke(stroke); g.setColor(Color.BLACK); g.setXORMode(Color.WHITE); drawPolygon(g, p, 3); } private void drawPolygon(Graphics2D g, Polygon p, int thickness) { Point center = getCenterOfGravity(p); for(int i=0; i p.xpoints[i]? step: -step; int deltaY = center.y > p.ypoints[i]? step: -step; p.xpoints[i] += deltaX; p.ypoints[i] += deltaY; } } private Point getCenterOfGravity(Polygon p) { int x = 0; int y = 0; int len = p.npoints; for(int i=0; i

 * view.add(child);
 * 
* * And the child will be added to the contentPane. The content pane will always * be non-null. Attempting to set it to null will cause the View to throw an * exception. The default content pane will not have a layout manager set. * * @see javax.swing.JFrame * @see javax.swing.JRootPane * * @author Christopher Butler * @author Karl Schaefer */ public class View extends JComponent implements Dockable, DockingConstants { protected class ViewLayout implements LayoutManager2, Serializable { /** * Returns the amount of space the layout would like to have. * * @param parent * the Container for which this layout manager is being used * @return a Dimension object containing the layout's preferred size */ public Dimension preferredLayoutSize(Container parent) { Dimension rd, tpd; Insets i = getInsets(); if (contentPane != null) { rd = contentPane.getPreferredSize(); } else { rd = parent.getSize(); } if (titlepane != null && titlepane.isVisible()) { tpd = titlepane.getPreferredSize(); } else { tpd = new Dimension(0, 0); } return new Dimension(Math.max(rd.width, tpd.width) + i.left + i.right, rd.height + tpd.height + i.top + i.bottom); } /** * Returns the minimum amount of space the layout needs. * * @param parent * the Container for which this layout manager is being used * @return a Dimension object containing the layout's minimum size */ public Dimension minimumLayoutSize(Container parent) { Dimension rd, tpd; Insets i = getInsets(); if (contentPane != null) { rd = contentPane.getMinimumSize(); } else { rd = parent.getSize(); } if (titlepane != null && titlepane.isVisible()) { tpd = titlepane.getMinimumSize(); } else { tpd = new Dimension(0, 0); } return new Dimension(Math.max(rd.width, tpd.width) + i.left + i.right, rd.height + tpd.height + i.top + i.bottom); } /** * Returns the maximum amount of space the layout can use. * * @param target * the Container for which this layout manager is being used * @return a Dimension object containing the layout's maximum size */ public Dimension maximumLayoutSize(Container target) { Dimension rd, tpd; Insets i = getInsets(); if (titlepane != null && titlepane.isVisible()) { tpd = titlepane.getMaximumSize(); } else { tpd = new Dimension(0, 0); } if (contentPane != null) { rd = contentPane.getMaximumSize(); } else { // This is silly, but should stop an overflow error rd = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE - i.top - i.bottom - tpd.height - 1); } return new Dimension(Math.min(rd.width, tpd.width) + i.left + i.right, rd.height + tpd.height + i.top + i.bottom); } /** * Instructs the layout manager to perform the layout for the specified * container. * * @param parent * the Container for which this layout manager is being used */ public void layoutContainer(Container parent) { Rectangle b = parent.getBounds(); Insets i = getInsets(); int contentY = 0; int w = b.width - i.right - i.left; int h = b.height - i.top - i.bottom; if (titlepane != null && titlepane.isVisible()) { Dimension mbd = titlepane.getPreferredSize(); titlepane.setBounds(0, 0, w, mbd.height); contentY += mbd.height; } if (contentPane != null) { contentPane.setBounds(0, contentY, w, h - contentY); } } public void addLayoutComponent(String name, Component comp) { } public void removeLayoutComponent(Component comp) { } public void addLayoutComponent(Component comp, Object constraints) { } public float getLayoutAlignmentX(Container target) { return 0.0f; } public float getLayoutAlignmentY(Container target) { return 0.0f; } public void invalidateLayout(Container target) { } } public static final String uiClassID = "Flexdock.view"; public static final String ACTION_TOGGLE_NEXT = "toggleNextView"; public static final String ACTION_TOGGLE_PREVIOUS = "togglePreviousView"; static final DockingStrategy VIEW_DOCKING_STRATEGY = createDockingStrategy(); private String persistentId; protected Titlebar titlepane; protected Container contentPane; protected boolean contentPaneCheckingEnabled; protected ArrayList dockingListeners; // protected boolean active; protected ArrayList dragSources; protected HashSet frameDragSources; private transient HashSet blockedActions; static { DockingManager.setDockingStrategy(View.class, VIEW_DOCKING_STRATEGY); PropertyManager.setDockablePropertyType(View.class, ViewProps.class); } public View(String persistentId) { this(persistentId, null); } public View(String persistentId, String title) { this(persistentId, title, null); } public View(String persistentId, String title, String tabText) { if (persistentId == null) throw new IllegalArgumentException( "The 'persistentId' parameter cannot be null."); this.persistentId = persistentId; dragSources = new ArrayList(1); frameDragSources = new HashSet(1); dockingListeners = new ArrayList(1); setContentPane(createContentPane()); setTitlebar(createTitlebar()); setLayout(createLayout()); setContentPaneCheckingEnabled(true); if (title == null) title = ""; setTitle(title); if (tabText == null) tabText = title; setTabText(tabText); addHierarchyListener(new HierarchyListener() { public void hierarchyChanged(HierarchyEvent e) { clearButtonRollovers(); } }); updateUI(); DockingManager.registerDockable((Dockable) this); getActionMap().put(ACTION_TOGGLE_NEXT, new AbstractAction() { public void actionPerformed(ActionEvent e) { SwingUtility.toggleFocus(+1); } }); getActionMap().put(ACTION_TOGGLE_PREVIOUS, new AbstractAction() { public void actionPerformed(ActionEvent e) { SwingUtility.toggleFocus(-1); } }); } private static DockingStrategy createDockingStrategy() { return new DefaultDockingStrategy() { protected DockingPort createDockingPortImpl(DockingPort base) { return new Viewport(); } }; } public static View getInstance(String viewId) { Dockable view = DockingManager.getDockable(viewId); return view instanceof View ? (View) view : null; } protected Container createContentPane() { return new JPanel(); } protected LayoutManager createLayout() { return new ViewLayout(); } protected Titlebar createTitlebar() { Titlebar t = new Titlebar(); t.setView(this); return t; } public Container getContentPane() { return contentPane; } public Titlebar getTitlebar() { return titlepane; } public DockablePropertySet getDockingProperties() { return PropertyManager.getDockablePropertySet(this); } public ViewProps getViewProperties() { return (ViewProps) getDockingProperties(); } public void addAction(Action action) { if (titlepane != null) titlepane.addAction(action); } public void addAction(String action) { if (titlepane != null) titlepane.addAction(action); } public void removeActions() { if (titlepane != null) titlepane.removeAllActions(); } public void setIcon(Icon icon) { if (titlepane != null) titlepane.setIcon(icon); } public void setIcon(String imgUri) { Icon icon = imgUri == null ? null : ResourceManager.createIcon(imgUri); setIcon(icon); } /** * Sets the content pane for this view. * * @param c * the container to use as the content pane. * @throws IllegalArgumentException * if {@code c} is {@code null} or if {@code c} is the * {@code titlepane}. * @see #titlepane * @see #getTitlePane() */ public void setContentPane(Container c) throws IllegalArgumentException { if (c == null) throw new IllegalArgumentException( "Unable to set a null content pane."); if (c == titlepane) throw new IllegalArgumentException( "Cannot use the same component as both content pane and titlebar."); if (contentPane != null) { remove(contentPane); } contentPane = c; if (contentPane != null) { boolean checkingEnabled = isContentPaneCheckingEnabled(); try { setContentPaneCheckingEnabled(false); add(contentPane); } finally { setContentPaneCheckingEnabled(checkingEnabled); } } } protected String getPreferredTitlebarUIName() { return ui instanceof ViewUI ? ((ViewUI) ui).getPreferredTitlebarUI() : null; } public void setTitlebar(Titlebar titlebar) { if (titlebar != null && titlebar == contentPane) { throw new IllegalArgumentException( "Cannot use the same component as both content pane and titlebar."); } if (titlepane != null) { remove(titlepane); titlepane.setView(null); dragSources.remove(titlepane); frameDragSources.remove(titlepane); DockingManager.removeDragListeners(titlepane); } titlepane = titlebar; if (titlepane != null) { boolean checkingEnabled = isContentPaneCheckingEnabled(); try { setContentPaneCheckingEnabled(false); add(titlepane); } finally { setContentPaneCheckingEnabled(checkingEnabled); } dragSources.add(titlepane); frameDragSources.add(titlepane); DockingManager.updateDragListeners(this); } } protected Component getTitlePane() { return titlepane; } public void setTitle(String title) { if (titlepane != null) { titlepane.setText(title); } } public void setTitle(String title, boolean alsoTabText) { setTitle(title); if (alsoTabText) { setTabText(title); } } public String getTitle() { Titlebar tbar = getTitlebar(); return tbar == null ? null : tbar.getText(); } public void updateUI() { setUI(PlafManager.getUI(this)); } public String getUIClassID() { return uiClassID; } /** * {@inheritDoc} */ protected void addImpl(Component comp, Object constraints, int index) { if (comp instanceof Titlebar) ((Titlebar) comp).setView(this); if (isContentPaneCheckingEnabled()) { getContentPane().add(comp, constraints, index); } else { super.addImpl(comp, constraints, index); } } public void remove(Component comp) { if (comp == contentPane) { super.remove(comp); } else { getContentPane().remove(comp); } } public AbstractButton getActionButton(String actionName) { Titlebar tbar = getTitlebar(); return tbar == null ? null : tbar.getActionButton(actionName); } public Component getComponent() { return this; } public List getDragSources() { return dragSources; } public Set getFrameDragSources() { return frameDragSources; } public String getPersistentId() { return persistentId; } public boolean isTerritoryBlocked(Dockable dockable, String region) { return getDockingProperties().isTerritoryBlocked(region).booleanValue(); } public void setTerritoryBlocked(String region, boolean blocked) { getDockingProperties().setTerritoryBlocked(region, blocked); } public String getTabText() { String txt = getDockingProperties().getDockableDesc(); return txt == null ? getTitle() : txt; } public void setTabText(String tabText) { getDockingProperties().setDockableDesc(tabText); } public Icon getTabIcon() { return getDockingProperties().getTabIcon(); } public void setTabIcon(Icon icon) { getDockingProperties().setTabIcon(icon); } public boolean dock(Dockable dockable) { return dock(dockable, CENTER_REGION); } public DockingPort getDockingPort() { return DockingManager.getDockingPort((Dockable) this); } public Dockable getSibling(String region) { return DefaultDockingStrategy.getSibling(this, region); } public Viewport getViewport() { DockingPort port = getDockingPort(); return port instanceof Viewport ? (Viewport) port : null; } public boolean dock(Dockable dockable, String relativeRegion) { return DockingManager.dock(dockable, this, relativeRegion); } public boolean dock(Dockable dockable, String relativeRegion, float ratio) { return DockingManager.dock(dockable, this, relativeRegion, ratio); } public void setActive(boolean b) { getViewProperties().setActive(b); } public boolean isActive() { return getViewProperties().isActive().booleanValue(); } public void setActiveStateLocked(boolean b) { getViewProperties().setActiveStateLocked(b); } public boolean isActiveStateLocked() { return getViewProperties().isActiveStateLocked().booleanValue(); } public boolean isMinimized() { return DockingUtility.isMinimized(this); } public int getMinimizedConstraint() { return DockingUtility.getMinimizedConstraint(this); } public void addDockingListener(DockingListener listener) { dockingListeners.add(listener); } public DockingListener[] getDockingListeners() { return (DockingListener[]) dockingListeners .toArray(new DockingListener[0]); } public void removeDockingListener(DockingListener listener) { dockingListeners.remove(listener); } public void dockingCanceled(DockingEvent evt) { } public void dockingComplete(DockingEvent evt) { setActionBlocked(DockingConstants.PIN_ACTION, isFloating()); if (titlepane != null) titlepane.revalidate(); } public void dragStarted(DockingEvent evt) { } public void dropStarted(DockingEvent evt) { } public void undockingComplete(DockingEvent evt) { clearButtonRollovers(); } public void undockingStarted(DockingEvent evt) { } private void clearButtonRollovers() { if (titlepane == null) return; Component[] comps = titlepane.getComponents(); for (int i = 0; i < comps.length; i++) { Button button = comps[i] instanceof Button ? (Button) comps[i] : null; if (button != null) { button.getModel().setRollover(false); } } } public void setActionBlocked(String actionName, boolean blocked) { if (actionName == null) return; Set actions = getBlockedActions(); if (blocked) actions.add(actionName); else { if (actions != null) actions.remove(actionName); } } public boolean isActionBlocked(String actionName) { return actionName == null || blockedActions == null ? false : blockedActions.contains(actionName); } private HashSet getBlockedActions() { if (blockedActions == null) blockedActions = new HashSet(1); return blockedActions; } public boolean isFloating() { return DockingUtility.isFloating(this); } protected String paramString() { return "id=" + getPersistentId() + "," + super.paramString(); } /** * @return the contentPaneCheckingEnabled */ protected boolean isContentPaneCheckingEnabled() { return contentPaneCheckingEnabled; } /** * @param contentPaneCheckingEnabled * the contentPaneCheckingEnabled to set */ protected void setContentPaneCheckingEnabled( boolean contentPaneCheckingEnabled) { this.contentPaneCheckingEnabled = contentPaneCheckingEnabled; } /** * Sets the LayoutManager. Overridden to conditionally * forward the call to the contentPane. * * @param manager * the LayoutManager * @see #setContentPaneCheckingEnabled */ public void setLayout(LayoutManager manager) { if (isContentPaneCheckingEnabled()) { getContentPane().setLayout(manager); } else { super.setLayout(manager); } } } flexdock-1.2.4/src/java/view/org/flexdock/view/ViewProps.java0000644000175000017500000000315312177715062025034 0ustar sylvestresylvestrepackage org.flexdock.view; import java.util.Map; import org.flexdock.docking.props.PropertyManager; import org.flexdock.docking.props.RootDockablePropertySet; import org.flexdock.docking.props.ScopedDockablePropertySet; /** * @author Christopher Butler */ public class ViewProps extends ScopedDockablePropertySet { public static final String ACTIVE_STATE_LOCKED = "View.ACTIVE_STATE_LOCKED"; public ViewProps(View view) { super(view); init(); } public ViewProps(int initialCapacity, View view) { super(initialCapacity, view); init(); } protected void init() { constrainRoot(ACTIVE_STATE_LOCKED, Boolean.FALSE); } protected void constrainRoot(Object key, Object value) { Map map = getRoot(); if(map instanceof RootDockablePropertySet) { ((RootDockablePropertySet)map).constrain(key, value); } } private View getView() { return View.getInstance(getDockingId()); } public Boolean isActiveStateLocked() { return (Boolean)PropertyManager.getProperty(ACTIVE_STATE_LOCKED, this); } public void setActiveStateLocked(boolean locked) { put(ACTIVE_STATE_LOCKED, locked); } public void setActive(boolean active) { View view = getView(); if(view==null) { super.setActive(active); return; } if(!view.isActiveStateLocked() && active!=isActive().booleanValue()) { super.setActive(active); if (view.getTitlebar() != null) { view.getTitlebar().repaint(); } } } } flexdock-1.2.4/src/java/view/org/flexdock/view/Viewport.java0000644000175000017500000000577512177715062024731 0ustar sylvestresylvestre/* * Created on Mar 4, 2005 */ package org.flexdock.view; import java.awt.Component; import java.util.HashSet; import java.util.Set; import javax.swing.JTabbedPane; import org.flexdock.docking.Dockable; import org.flexdock.docking.DockingConstants; import org.flexdock.docking.DockingManager; import org.flexdock.docking.activation.ActiveDockableListener; import org.flexdock.docking.defaults.DefaultDockingPort; import org.flexdock.docking.defaults.StandardBorderManager; /** * @author Christopher Butler */ public class Viewport extends DefaultDockingPort implements DockingConstants { protected HashSet blockedRegions; static { DockingManager.setDockingStrategy(Viewport.class, View.VIEW_DOCKING_STRATEGY); } public Viewport() { super(); blockedRegions = new HashSet(5); setBorderManager(new StandardBorderManager()); } public Viewport(String portId) { super(portId); blockedRegions = new HashSet(5); setBorderManager(new StandardBorderManager()); } public void setRegionBlocked(String region, boolean isBlocked) { if(isValidDockingRegion(region)) { if(isBlocked) { blockedRegions.add(region); } else { blockedRegions.remove(region); } } } public boolean isDockingAllowed(Component comp, String region) { // if we're already blocked, then no need to interrogate // the components in this dockingport boolean blocked = !super.isDockingAllowed(comp, region); if(blocked) return false; // check to see if the region itself has been blocked for some reason if(blockedRegions.contains(region)) return false; // by default, allow docking in non-CENTER regions if(!CENTER_REGION.equals(region)) return true; // allow docking in the CENTER if there's nothing already there, // or if there's no Dockable associated with the component there Dockable dockable = getCenterDockable(); if(dockable==null) return true; // otherwise, only allow docking in the CENTER if the dockable // doesn't mind return !dockable.getDockingProperties().isTerritoryBlocked(region).booleanValue(); } public boolean dock(Dockable dockable) { return dock(dockable, CENTER_REGION); } protected JTabbedPane createTabbedPane() { JTabbedPane pane = super.createTabbedPane(); pane.addChangeListener(ActiveDockableListener.getInstance()); return pane; } public Set getViewset() { // return ALL views, recursing to maximum depth return getDockableSet(-1, 0, View.class); } public Set getViewset(int depth) { // return all views, including subviews up to the specified depth return getDockableSet(depth, 0, View.class); } protected String paramString() { return "id=" + getPersistentId() + "," + super.paramString(); } } flexdock-1.2.4/src/java/view/org/flexdock/view/actions/0000755000175000017500000000000012177715062023671 5ustar sylvestresylvestreflexdock-1.2.4/src/java/view/org/flexdock/view/actions/ActionFactory.java0000644000175000017500000000060512177715062027302 0ustar sylvestresylvestrepackage org.flexdock.view.actions; public class ActionFactory { public static DefaultCloseAction createCloseAction() { return new DefaultCloseAction(); } public static DefaultDisplayAction createDisplayAction() { return new DefaultDisplayAction(); } public static DefaultPinAction createPinAction() { return new DefaultPinAction(); } } flexdock-1.2.4/src/java/view/org/flexdock/view/actions/DefaultCloseAction.java0000644000175000017500000000064612177715062030252 0ustar sylvestresylvestre/* * Created on Apr 26, 2005 */ package org.flexdock.view.actions; import java.awt.event.ActionEvent; import org.flexdock.docking.DockingManager; import org.flexdock.view.View; /** * @author Christopher Butler */ public class DefaultCloseAction extends ViewAction { public DefaultCloseAction() { } public void actionPerformed(View view, ActionEvent evt) { DockingManager.close(view); } } flexdock-1.2.4/src/java/view/org/flexdock/view/actions/DefaultDisplayAction.java0000644000175000017500000000122412177715062030603 0ustar sylvestresylvestre/* * Created on Jun 8, 2005 */ package org.flexdock.view.actions; import java.awt.event.ActionEvent; import javax.swing.Action; import org.flexdock.docking.DockingManager; import org.flexdock.view.View; /** * @author Christopher Butler */ public class DefaultDisplayAction extends ViewAction { public DefaultDisplayAction() { } public DefaultDisplayAction(String viewId) { setViewId(viewId); View view = View.getInstance(viewId); if(view!=null) putValue(Action.NAME, view.getTitle()); } public void actionPerformed(View view, ActionEvent evt) { DockingManager.display(view); } } flexdock-1.2.4/src/java/view/org/flexdock/view/actions/DefaultPinAction.java0000644000175000017500000000225612177715062027732 0ustar sylvestresylvestre/* * Created on Apr 26, 2005 */ package org.flexdock.view.actions; import java.awt.event.ActionEvent; import javax.swing.ButtonModel; import org.flexdock.docking.DockingManager; import org.flexdock.docking.state.DockingState; import org.flexdock.view.Button; import org.flexdock.view.View; import org.flexdock.view.model.ViewButtonModel; /** * @author Christopher Butler * @author Bobby Rosenberger */ public class DefaultPinAction extends ViewAction { public DefaultPinAction() { } public void actionPerformed(View view, ActionEvent evt) { boolean minimize = view.isMinimized()? false: true; DockingManager.setMinimized(view, minimize); } public void updateState(View view, DockingState info, Button button) { button.getModel().setSelected(info.isMinimized()); } public ButtonModel createButtonModel() { return new PinButtonModel(); } private static class PinButtonModel extends ViewButtonModel { public boolean isSelected() { DockingState info = getDockingState(); if(info==null) return super.isSelected(); return info.isMinimized(); } } } flexdock-1.2.4/src/java/view/org/flexdock/view/actions/ViewAction.java0000644000175000017500000000260412177715062026606 0ustar sylvestresylvestre/* * Created on Apr 26, 2005 */ package org.flexdock.view.actions; import java.awt.Component; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.ButtonModel; import javax.swing.SwingUtilities; import org.flexdock.view.View; /** * @author Christopher Butler */ public abstract class ViewAction extends AbstractAction { /** * @deprecated unused */ public static final ViewAction EMPTY_ACTION = createDefault(); protected String viewId; protected View getView(ActionEvent evt) { View view = viewId == null ? null : View.getInstance(viewId); if (view == null) { Component c = (Component) evt.getSource(); view = (View) SwingUtilities.getAncestorOfClass(View.class, c); } return view; } public void actionPerformed(ActionEvent e) { View view = getView(e); actionPerformed(view, e); } public abstract void actionPerformed(View view, ActionEvent evt); private static ViewAction createDefault() { return new ViewAction() { public void actionPerformed(View view, ActionEvent evt) { } }; } public ButtonModel createButtonModel() { return null; } public String getViewId() { return viewId; } public void setViewId(String viewId) { this.viewId = viewId; } } flexdock-1.2.4/src/java/view/org/flexdock/view/model/0000755000175000017500000000000012177715062023331 5ustar sylvestresylvestreflexdock-1.2.4/src/java/view/org/flexdock/view/model/ViewButtonModel.java0000644000175000017500000000131412177715062027262 0ustar sylvestresylvestre/* * Created on Jun 2, 2005 */ package org.flexdock.view.model; import javax.swing.JToggleButton; import org.flexdock.docking.DockingManager; import org.flexdock.docking.state.DockingState; import org.flexdock.view.View; /** * @author Christopher Butler */ public class ViewButtonModel extends JToggleButton.ToggleButtonModel { private String viewId; public String getViewId() { return viewId; } public void setViewId(String viewId) { this.viewId = viewId; } protected View getView() { return View.getInstance(getViewId()); } protected synchronized DockingState getDockingState() { return DockingManager.getDockingState(getViewId()); } } flexdock-1.2.4/src/webstart/0000755000175000017500000000000012177715062016631 5ustar sylvestresylvestreflexdock-1.2.4/src/webstart/flexdockdemo.jnlp0000644000175000017500000000164312177715062022166 0ustar sylvestresylvestre FlexDock Demo felxdock.dev.java.net FlexDock is a Swing-based Java docking framework distributed under the MIT license.