./PaxHeaders/opari2-2.0.100000644000000000000000000000013215232670236012132 xustar0030 mtime=1785426078.071262495 30 atime=1785426082.655235368 30 ctime=1785426078.071262495 opari2-2.0.10/0000775000175100001440000000000015232670236012404 5ustar00builderusersopari2-2.0.10/PaxHeaders/include0000644000000000000000000000013215232670236013420 xustar0030 mtime=1785426078.071262495 30 atime=1785426082.655235368 30 ctime=1785426078.071262495 opari2-2.0.10/include/0000775000175100001440000000000015232670236014027 5ustar00builderusersopari2-2.0.10/include/PaxHeaders/opari20000644000000000000000000000013215232670236014614 xustar0030 mtime=1785426078.123262187 30 atime=1785426082.655235368 30 ctime=1785426078.123262187 opari2-2.0.10/include/opari2/0000775000175100001440000000000015232670236015223 5ustar00builderusersopari2-2.0.10/include/opari2/PaxHeaders/pomp2_user_lib.h0000644000000000000000000000013215232670204017756 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426078.123262187 opari2-2.0.10/include/opari2/pomp2_user_lib.h0000664000175100001440000001035715232670204020316 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_USER_LIB_H #define POMP2_USER_LIB_H #include #include #ifdef __cplusplus extern "C" { #endif /** @file * * @brief This file contains the declarations of all * POMP2 functions. * */ /* Avoid warnings from Orcale Studio Compiler if nowait clauses are added * to reduction loops. Opari always inserts a barrier after such loops, so * the nowait is save.*/ #if defined( __SUNPRO_C ) #pragma error_messages (off, E_NOWAIT_REDUCTION_USE) #endif /** Handles to identify OpenMP regions. */ /** To avoid multiple typedefs of OPARI2_Region_handle*/ #ifndef __opari2_region_handle typedef void* OPARI2_Region_handle; #define __opari2_region_handle #endif typedef OPARI2_Region_handle POMP2_USER_Region_handle; /** @name Functions generated by the instrumenter */ /*@{*/ /** * Returns the number of instrumented regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. Here we return the sum of * all numRegions. * @return number of instrumented regions */ extern size_t POMP2_USER_Get_num_regions( void ); /** * Init all OPARI2-created regions.@n * The instrumentor scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. The instrumentor then * defines these functions by calling all grepped functions. */ extern void POMP2_USER_Init_regions( void ); /** * Returns the OPARI2 version. * @return version string */ extern const char* POMP2_Get_opari2_version( void ); /** Finalizes the POMP2 adapter. It is inserted at the #%pragma pomp inst end. */ extern void POMP2_Finalize( void ); /** Initializes the POMP2 adapter. It is inserted at the #%pragma pomp inst begin. */ extern void POMP2_Init( void ); /** Disables the POMP2 adapter. */ extern void POMP2_Off( void ); /** Enables the POMP2 adapter. */ extern void POMP2_On( void ); /** Called at the begin of a user defined POMP2 region. @param pomp2_handle The handle of the started region. @param ctc_string A string containing the region data. */ extern void POMP2_Begin( POMP2_USER_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called at the begin of a user defined POMP2 region. @param pomp2_handle The handle of the started region. */ extern void POMP2_End( POMP2_USER_Region_handle* pomp2_handle ); /** Registers a POMP2 region and returns a region handle. @param pomp2_handle Returns the handle for the newly registered region. @param ctc_string A string containing the region data. */ extern void POMP2_USER_Assign_handle( POMP2_USER_Region_handle* pomp2_handle, const char ctc_string[] ); #ifdef __cplusplus } #endif #endif opari2-2.0.10/include/opari2/PaxHeaders/pomp2_lib.h0000644000000000000000000000013215232670204016720 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426078.123262187 opari2-2.0.10/include/opari2/pomp2_lib.h0000664000175100001440000005363415232670204017265 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2019, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_LIB_H #define POMP2_LIB_H #ifdef _OPENMP #include #endif #include #include #ifdef __cplusplus extern "C" { #endif /** @file * * @brief This file contains the declarations of all * POMP2 functions. * */ /* Avoid warnings from Orcale Studio Compiler if nowait clauses are added * to reduction loops. Opari always inserts a barrier after such loops, so * the nowait is save.*/ #if defined( __SUNPRO_C ) #pragma error_messages (off, E_NOWAIT_REDUCTION_USE) #endif /** Handles to identify OpenMP regions. */ /** To avoid multiple typedefs of OPARI2_Region_handle*/ #ifndef __opari2_region_handle typedef void* OPARI2_Region_handle; #define __opari2_region_handle #endif typedef OPARI2_Region_handle POMP2_Region_handle; typedef int64_t POMP2_Task_handle; /** @name Functions generated by the instrumenter */ /*@{*/ /** * Returns the number of instrumented regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. Here we return the sum of * all numRegions. * @return number of instrumented regions */ extern size_t POMP2_Get_num_regions( void ); /** * Init all OPARI2-created regions.@n * The instrumentor scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. The instrumentor then * defines these functions by calling all grepped functions. */ extern void POMP2_Init_regions( void ); /** * Returns the OPARI2 version. * @return version string */ extern const char* POMP2_Get_opari2_version( void ); /*@}*/ /** Function that returns a new task handle. * @return new task handle */ extern POMP2_Task_handle POMP2_Get_new_task_handle( void ); /** Create a unique mapping between @a ctc_string and the implementation-defined @a pomp2_handle. Be aware that POMP2_Assign_handle() is called from POMP2_Init_regions() in a serial context but might get called concurrently as well. */ extern void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); #ifdef _OPENMP /** Called before an atomic statement. @param pomp2_handle The handle of the started region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after an atomic statement. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ); /** Called before a barrier. \n \e OpenMP \e 3.0: Barriers can be used as scheduling points for tasks. When entering a barrier the task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. @param pomp2_handle The handle of the started region. @param pomp2_old_task Pointer to a "taskprivate" variable where the current task id is stored. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); /** Called after a barrier. \n \e OpenMP \e 3.0: When a task exits a barrier the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the barrier. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the ended region. @param pomp2_old_task "Taskprivate" variable storing the id of the task the barrier is located in. */ extern void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Called before an implicit barrier. \e OpenMP \e 3.0: Barriers can be used as scheduling points for tasks. When entering a barrier the task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. @param pomp2_handle The handle of the started region. @param pomp2_old_task Pointer to a "taskprivate" variable where the current task id is stored. */ extern void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ); /** Called after an implicit barrier. \e OpenMP \e 3.0: When a task exits a barrier the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the barrier. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the started region. @param pomp2_old_task "Taskprivate" variable storing the id the task the implicit barrier is used in. */ extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Called before an flush. @param pomp2_handle The handle of the started region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after an flush. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a critical region. @param pomp2_handle The handle of the started region. */ extern void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of a critical region. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ); /** Called before a critical region. @param pomp2_handle The handle of the started region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a critical region. @param pomp2_handle The handle of the region. */ extern void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ); /** Called before a for loop. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a for loop. @param pomp2_handle The handle of the region. */ extern void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a master region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called at the end of a master region. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a parallel region. \e OpenMP \e 3.0: When a new parallel region is entered, each thread taking part in that region is executed as a task. These tasks are assigned a new unique task id which is stored in \e pomp2_current_task. @param pomp2_handle The handle of the region. */ extern void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of a parallel region. @param pomp2_handle The handle of the region. */ extern void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ); /** Called before a parallel region. \e OpenMP \e 3.0: The task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. In each of the threads taking part in the following parallel region a newly defined unique task id is assigned (see \ref POMP2_Parallel_begin) @param pomp2_handle The handle of the region. @param if_clause Value of the argument of an if clause (if present). @param num_threads Upper bound for number of child threads. @param pomp2_old_task The task id of the region from which the parallel region was started. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); /** Called after a parallel region. \e OpenMP \e 3.0: When a task exits a parallel region the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the region. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the region. @param pomp2_old_task The task id of the region inside of which the parallel region was executed. */ extern void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Called at the start of a section. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called at the end of a section. @param pomp2_handle The handle of the region. */ extern void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ); /** Called before a set of sections. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a set of sections. @param pomp2_handle The handle of the region. */ extern void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a single region. @param pomp2_handle The handle of the region. */ extern void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of a single region. @param pomp2_handle The handle of the region. */ extern void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ); /** Called before a single region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a single region. @param pomp2_handle The handle of the region. */ extern void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ); /** Called before a workshare region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a workshare region. @param pomp2_handle The handle of the region. */ extern void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of an ordered region. @param pomp2_handle The handle of the region. */ extern void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of an ordered region. @param pomp2_handle The handle of the region. */ extern void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ); /** Called before an ordered region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. Ignored. */ extern void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after an ordered region. @param pomp2_handle The handle of the region. */ extern void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ); /** \e OpenMP \e 3.0: When a task encounters a task construct it creates a new task. The task may be scheduled for later execution or executed immediately. In both cases the pomp-adapter assigns the id of the currently active task to \e pomp2_old_task which is defined in the instrumented user code. @param pomp2_handle The handle of the region. @param pomp2_old_task Pointer to the task id in the instrumented user code @param pomp2_if If an if clause is present on the task directive this variable holds the evaluated result of the argument of the if clause. Else it is 1. @param ctc_string The initialization string. */ extern void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); /** \e OpenMP \e 3.0: After the code region which is executed as a separate task, the task id of the creating task is restored from \e pomp2_old_task (defined in the instrumented user code) and stored in \e pomp2_current_task inside the adapter. @param pomp2_handle The region handle. @param pomp2_old_task The task id of the task inside of which the task was created. This is stored inside the instrumented user code. */ extern void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** \e OpenMP \e 3.0: Marks the beginning of the execution of a task. @param pomp2_handle The region handle. @param pomp2_task handle of task. */ extern void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); /** \e OpenMP \e 3.0: Marks the end of the execution of a task. @param pomp2_handle The region handle. */ extern void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ); /** \e OpenMP \e 3.0: When a task encounters a task construct it creates a new task. If the untied clause is specified the task is executed as an untied task. The task may be scheduled for later execution or executed immediately. In both cases the pomp-adapter assigns the id of the currently active task to \e pomp2_old_task which is defined in the instrumented user code. @param pomp2_handle The handle of the region. @param pomp2_old_task Pointer to the task id in the instrumented user code. @param pomp2_if If an if clause is present on the task directive this variable holds the evaluated result of the argument of the if clause. Else it is 1. @param ctc_string The initialization string. */ extern void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); /** \e OpenMP \e 3.0: After the code region which is executed as a separate untied task, the task id of the creating task is restored from \e pomp2_old_task (defined in the instrumented user code) and stored in \e pomp2_current_task inside the adapter. @param pomp2_handle The region handle. @param pomp2_old_task The id of the task from which the untied task was created. This is stored in the instrumented user code. */ extern void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** \e OpenMp \e 3.0: Marks the beginning of the execution of an untied task. @param pomp2_handle The region handle. @param pomp2_task Handle of this task. */ void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); /** \e OpenMP \e 3.0: Marks the end of the execution of a task. @param pomp2_handle The region handle. */ extern void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ); /** Called before a taskwait. \n \e OpenMP \e 3.0: Taskwait directives can be used as scheduling points for tasks. When entering a taskwait region the task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. @param pomp2_handle The handle of the started region. @param pomp2_old_task Pointer to a "taskprivate" variable where the current task id is stored. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); /** Called after a barrier. \n \e OpenMP \e 3.0: When a task exits a taskwait region the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the taskwait. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the ended region. @param pomp2_old_task "Taskprivate" variable storing the id of the task the barrier is located in. */ extern void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Wraps the omp_get_max_threads function. * * Needed for the instrumentation of parallel regions * where the num_threads clause is used with the return * value of the omp_get_max_threads function. This can't * be used directly because the user may have declared * it himself. Double declarations are not allowed. */ extern int POMP2_Lib_get_max_threads( void ); /** Wraps the omp_init_lock function. * @param s The OpenMP lock to initialize.*/ extern void POMP2_Init_lock( omp_lock_t* s ); /** Wraps the omp_destroy_lock function. * @param s The OpenMP lock to destroy. */ extern void POMP2_Destroy_lock( omp_lock_t* s ); /** Wraps the omp_set_lock function. * @param s The OpenMP lock to set. */ extern void POMP2_Set_lock( omp_lock_t* s ); /** Wraps the omp_unset_lock function. * @param s the OpenMP lock to unset. */ extern void POMP2_Unset_lock( omp_lock_t* s ); /** Wraps the omp_test_lock function * @param s the OpenMP lock to test for. * @return result of omp_test_lock*/ extern int POMP2_Test_lock( omp_lock_t* s ); /** Wraps the omp_init_nest_lock function. * @param s The nested OpenMP lock to initialize. */ extern void POMP2_Init_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_destroy_nest_lock function. * @param s The nested OpenMP lock to destroy. */ extern void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_set_nest_lock function * @param s The nested OpenMP lock to set.*/ extern void POMP2_Set_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_unset_nest_lock function * @param s The nested OpenMP lock to unset.*/ extern void POMP2_Unset_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_test_nest_lock function * @param s The nested OpenMP lock to test for. * @return result of omp_test_nest_lock*/ extern int POMP2_Test_nest_lock( omp_nest_lock_t* s ); #endif /* _OPENMP */ #ifdef __cplusplus } #endif #endif opari2-2.0.10/PaxHeaders/build-includes0000644000000000000000000000013215232670236014700 xustar0030 mtime=1785426078.079262448 30 atime=1785426082.655235368 30 ctime=1785426078.079262448 opari2-2.0.10/build-includes/0000775000175100001440000000000015232670236015307 5ustar00builderusersopari2-2.0.10/build-includes/PaxHeaders/frontend-only.am0000644000000000000000000000013215232670204020065 xustar0030 mtime=1785426052.167415784 30 atime=1785426052.239415357 30 ctime=1785426078.079262448 opari2-2.0.10/build-includes/frontend-only.am0000664000175100001440000000035215232670204020417 0ustar00builderusers## -*- mode: makefile -*- include ../src/opari/Makefile.inc.am include ../src/opari-lib-dummy/Makefile.inc.am include ../doc/example/openmp/Makefile.inc.am include ../doc/example/pomp/Makefile.inc.am include ../test/Makefile.inc.am opari2-2.0.10/build-includes/PaxHeaders/common.am0000644000000000000000000000013215232670204016557 xustar0030 mtime=1785426052.167415784 30 atime=1785426052.239415357 30 ctime=1785426078.075262471 opari2-2.0.10/build-includes/common.am0000664000175100001440000000173215232670204017114 0ustar00builderusers# -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen, Germany ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## Technische Universitaet Dresden, Germany ## University of Oregon, Eugene, USA ## Forschungszentrum Juelich GmbH, Germany ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## Technische Universitaet Muenchen, Germany ## ## See the COPYING file in the package base directory for details. ## ## file build-includes/common.am ## Intended to be included by the components ## build-(front|back)end/Makefile.am. Defines "common" entities ## that all build-* Makefiles rely on. include ../build-config/common/common.am ## Convenience variable for referencing public headers that will be ## installed. Use e.g. with the primary nobase_include_HEADERS PUBLIC_INC_SRC = $(SRC_ROOT)include/opari2/ opari2-2.0.10/PaxHeaders/OPEN_ISSUES0000644000000000000000000000013215232670204013624 xustar0030 mtime=1785426052.139415949 30 atime=1785426052.231415405 30 ctime=1785426078.003262898 opari2-2.0.10/OPEN_ISSUES0000664000175100001440000002465315232670204014170 0ustar00builderusers OPARI2 2.0.10 OPEN ISSUES ========================= Effective: Jul 2026 This file lists known limitations and unimplemented features of the OPARI2 component. ------------------------------------------------------------------------------ * Platform support - OPARI2 has been tested on the following platforms: + HPE/Cray EX systems with PrgEnvs cray, gnu, amd, aocc. + various Linux (Intel, AMD, ARM) clusters with GNU, Clang, Intel, NVIDIA, and AMD compilers. Note that some compilers are based on Clang. Note that Fujitsu compilers haven't been tested thoroughly, Fujitsu cross-compilers haven't been tested at all. The provided configure options (see INSTALL) may provide a good basis for building and testing the toolset on other systems. - The following platforms have not been tested recently: + Intel Xeon Phi (KNL) + IBM Blue Gene and IBM Power systems + Cray XC, XT, XE, XK + HPE/Cray EX systems with PrgEnv-intel and PrgEnv-cray-amd However the supplied build system might still work on these systems. -------------------------------------------------------------------------------- Known issues ------------ - All languages + OPARI2, per default, processes source files before the compiler preprocessor, so macros and included files are not processed. Conditionally compiled source code is also not resolved and can therefore result in erroneous instrumentation of partial OpenMP directives. These limitation can be resolved by passing preprocessed code to OPARI2 using the --preprocessed flag. + The instrumented source files generated by OPARI2 may confuse automatic dependency tracking by "make", "autotools", etc. For autotools, configure with "--disable-dependency-tracking". + Literal file-filter rules like "INCLUDE bt.f" for files that will be processed by OPARI2 do not work, as OPARI2 changes the file name (e.g., to bt.opari.f). + Some OpenMP compilers (e.g. PGI) are non-standard-conforming in the way they process OpenMP directives by not allowing macro replacement of OpenMP directive parameters. This results in error messages containing references to POMP_DLIST_##### where ##### is a five-digit number. In this case, try to use the OPARI2 option "--nodecl". This is unfortunately not a perfect workaround, as this can trigger other errors in some rare cases. + When compiling with the PGI compiler version 10.1, local variables that are defined after an OpenMP for directive share the same memory address. This breaks the OPARI2 instrumentation for task tracking. Our recommendation is to use a newer compiler version, According to our tests, later compiler versions have fixed this issues. We tested with PGI compiler version 11.7. + Sometimes instrumentation of OpenMP source files work, but the traces get enormously large because the application is using large numbers (millions) of small OpenMP synchronization operations like atomic, locks or flushes which are instrumented by default. Also, in that case, the instrumentation overhead might become excessive. In that case, you can tell OPARI2 not to instrument these directives by using the "--disable=omp[:directive|group[:inner],...]" option. Valid values for directive are: atomic, critical, flush, locks, master, ordered, single or "sync" which disables all of the above. Of course, then these directives are not measured and you should keep this in mind, when you analyze the results. Although they do not show up in the analysis report that the application might still have some performance problem because. This may especially be the case, because of too many OpenMP synchronization calls! + Instrumented Intel Xeon-Phi offload regions cause compile errors. You need to manually guard the instrumented POMP2 calls by "#ifndef __INTEL_OFFLOAD" preprocessor statements to prevent them from being compiled. The next OPARI2 release will automate this process. + Object files created by the Intel compiler with interprocedural optimization (-ipo) cannot be analyzed by nm for startup initialization of the OpenMP region handles. Workaround is to use only -ip during compilation or to use runtime initialization of the OpenMP region handles inside of the analysis tool. + The option --omp-tpd cannot be used on Fujitsu systems (K, FX10, FX100). + Parentheses used in chunksize calculations within a schedule clause, e.g., schedule(dynamic, (a)*(b)), will cause a compilation error. As a workaround, you can calculate the chuncksize into a temporary variable prior to its usage in the schedule clause. + For combined constructs (like 'omp parallel '), some clauses not yet handled by OPARI2 (such as 'simd') may be incorrectly added to the 'omp parallel' clause during the source-to-source translation. As a workaround, the combined construct can be manually split into an 'omp parallel' region and the remaining construct. - Fortran: + The !$OMP END DO and !$OMP END PARALLEL DO directives are required (and are not optional as described in the OpenMP specification) for F77 style do loops which end with a lable and continue statement. + The atomic expression controlled by a !$OMP ATOMIC directive has to be on a line all by itself in fixed form source files. + The !$OMP END ATOMIC directive must not be used if it is optional. This directive is optional except if the capture clause is used. In this case the instrumentation of atomic directives needs to be disabled via by passing --disable=omp:atomic to opari2. + The Fortran95 statement terminator (";") is not handled correctly when it is used within parallel loops. + If an #ifdef block is used at the beginning of the variable definition part, instrumentation is incorrectly inserted within the block and not compiled later when the evaluation is false. + Some Fortran compilers (e.g., Sun) don't fully support C preprocessor commands, especially the "#line" commands. In case you track a compilation error on a OPARI2 modified/instrumented file down to such a statement, try using "--nosrc" as this suppresses the generation of "#line" statements. (With the Sun Fortran compiler, using "-xpp=cpp" is a better workaround.) + The first SECTION directive inside a SECTIONS workshare directive is required (and is not optional as described in the OpenMP specification). + Fortran .f files are identified as Fortran77 files even if they contain Fortran90 code. You need to manually add the --f90 option to process these files successfully if renaming is not an option. + If you use a fixed form Fortran and override the fixed form requirement by a compiler switch you might need to add --free-form to the OPARI2 commandline to get a compilable instrumentation. Use --fix-form analogously. + OPARI2 requires that the program is included in a PROGRAM block. Using the compilation unit as implicit PROGRAM block will result in erroneous code. + Compiler specific directives starting with "!DIR$" need to be followed by a whitespace character before the directive keyword. + The clauses 'num_threads' and 'if' to the parallel directive must not reside as a sole clause on a line. + OpenMP directives that span over several lines must not contain preprocessor directives. This is a regression from OPARI2 version 1.1.4. + The default(none) clause to the parallel directive must not be used in a continuation line but on the same line as the parallel directive. + Strings within a pair of parenthesis, e.g., (..., msg="my msg"), must either appear on a single line or the closing parenthesis needs to appear on a line following the end quotation mark of the string. Otherwise, include statements might appear not at the correct place. + OPARI2 does not handle 'interface ... end interface' correctly. If the name 'interface' (case-insensitive) appears in a variable name, OPARI2 might produce non-functional code. As a workaround, rename this variable. + OPARI2 generates sources files containing COMMON statements. COMMON statements are considered to be obsolescent in Fortran 2018. Compilations using options that require Fortran 2018, like gfortran's '-std=f2018', may fail. As a workaround, omit the option. + A multi-line USE statement that contains OPARI2-relevant keywords in lines other than the first line are messed up by OPARI2 and prevent compilation of the generated code. Please keep the entire USE statement in a single line. - C/C++: + Structured blocks describing the extent of an OpenMP pragma need to be either compound statements {....}, while loops, or simple statements. In addition, for loops are supported after and . Complex statements like if-then-else or do-while need to be enclosed in a block ( {....} ). As an example: OPARI2 generates erroneous code for braceless nested for-loops with if-else in the inner for-loop's body. As a workaround, add braces around the body of the outer for-loop. + C99 6.10.9 _Pragma operators are not supported. + Codes relying on the definition of macros to select specific features from system header files, e.g., __STDC_CONSTANT_MACROS or _GNU_SOURCE, need to define these macros on the compiler command line rather than in header or source files. It is planned to address these limitations in future releases. -------------------------------------------------------------------------------- Please report bugs, wishes, and suggestions to . opari2-2.0.10/PaxHeaders/THANKS0000644000000000000000000000013215232670204012760 xustar0030 mtime=1785426052.139415949 30 atime=1785426052.231415405 30 ctime=1785426077.791264152 opari2-2.0.10/THANKS0000664000175100001440000000123015232670204013306 0ustar00builderusersOPARI2 THANKS file OPARI2 has originally been written by authors in AUTHORS file. Many people further contributed to OPARI2 by reporting problems, suggesting various improvements or submitting actual code. Here is a list of these people. Help me keep it complete and exempt of errors. Chee Wai Lee Hendryk Bockelmann Orion Poplawski Piero Lanucara Aleksandr Drozd Sally Bridgwater Xavier Le Vaillant Samuel Thibault Nikhil Jain opari2-2.0.10/PaxHeaders/README0000644000000000000000000000013215232670204012725 xustar0030 mtime=1785426052.139415949 30 atime=1785426052.231415405 30 ctime=1785426077.791264152 opari2-2.0.10/README0000664000175100001440000000070315232670204013257 0ustar00builderusersOPARI2 ------ OPARI2 is a source-to-source instrumentation tool for directive based programming models, such as OpenMP. To build OPARI2 you usually just need to do ./configure make make install Please have a look at INSTALL for further configure and build options. After make install you will find html and pdf documentation as well as usage examples under $(prefix)/share/doc/opari. Have fun! Please report bugs to . opari2-2.0.10/PaxHeaders/INSTALL0000644000000000000000000000013215232670204013076 xustar0030 mtime=1785426052.139415949 30 atime=1785426052.231415405 30 ctime=1785426077.791264152 opari2-2.0.10/INSTALL0000664000175100001440000004550315232670204013437 0ustar00builderusersFor generic installation instructions see below. Configuration of OPARI2 *********************** Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --disable-libtool-lock avoid locking (might break parallel builds) --disable-openmp do not use OpenMP --disable-option-checking ignore unrecognized --enable/--with options --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-compiler-suite=(gcc|ibm|intel|oneapi|nvhpc|pgi|clang|aocc|amdclang) The compiler suite to build this package with. Needs to be in $PATH [gcc]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: (note that the _FOR_BUILD variables take precedence, e.g. if you call OPARI2's configure from a top level configure in a cross-compile environment that defines CC as well as CC_FOR_BUILD etc.) CC_FOR_BUILD C compiler command for the frontend build CXX_FOR_BUILD C++ compiler command for the frontend build F77_FOR_BUILD Fortran 77 compiler command for the frontend build FC_FOR_BUILD Fortran compiler command for the frontend build CPPFLAGS_FOR_BUILD (Objective) C/C++ preprocessor flags for the frontend build, e.g. -I if you have headers in a nonstandard directory CFLAGS_FOR_BUILD C compiler flags for the frontend build CXXFLAGS_FOR_BUILD C++ compiler flags for the frontend build FFLAGS_FOR_BUILD Fortran 77 compiler flags for the frontend build FCFLAGS_FOR_BUILD Fortran compiler flags for the frontend build LDFLAGS_FOR_BUILD linker flags for the frontend build, e.g. -L if you have libraries in a nonstandard directory LIBS_FOR_BUILD libraries to pass to the linker for the frontend build, e.g. -l CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags FC Fortran compiler command FCFLAGS Fortran compiler flags CPP C preprocessor CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Please report bugs to . Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. opari2-2.0.10/PaxHeaders/ChangeLog0000644000000000000000000000013215232670204013617 xustar0030 mtime=1785426052.139415949 30 atime=1785426052.231415405 30 ctime=1785426077.787264176 opari2-2.0.10/ChangeLog0000664000175100001440000003507415232670204014162 0ustar00builderusers------------------- Released version 2.0.10 -------------------------- - Fix incorrect shebang in pomp2_parse_init_regions.awk when which is not available. - Fix incorrect handling of raw string literals in C++, causing OPARI2 to crash in some cases. ------------------- Released version 2.0.9 --------------------------- - Opari2 now generates valid code for Fortran 2008's 'module subroutine'. - opari2-config now supports the option '--cflags=clang', intended to be used with clang, clang++, and flang. - Additional shortcomings and potential workarounds have been documented, see file OPEN_ISSUES. ------------------- Released version 2.0.8 --------------------------- - Fixed compilation error for instrumented OpenMP directives inside 'associate' constructs with gfortran. - Prevent make distclean from erroneously removing source files. ------------------- Released version 2.0.7 --------------------------- - Include omp.h via .opari.inc if it got removed from . .opari.inc was empty if the compilation unit was lacking any OpenMP directives. Thus, calls to API functions or using OpenMP types issued warnings/errors on compilation of the modfied sources. - Handle C++14/17 numeric literals (binary integer, hexadecimal floating-point), including seperators. ------------------- Released version 2.0.6 --------------------------- - make check's test/awk_script_test.sh was reported to fail due to wrong ordering of regions provided by pomp2_parse_init_regions.awk. Fixed. - Handle C++11 multi line strings literals with arbitrary delimiter ------------------- Released version 2.0.5 --------------------------- - The number of regions reported by POMP2_Get_num_regions() was too small if OpenMP barrier, flush, or taskwait constructs were present in the code. As a consequence opari-lib-dummy crashed; Score-P handled this situation gracefully. Fixed. - When working on preprocessed Fortran files, opari2 duplicated line directives. Compiling these files triggered warnings with certain compilers. Fixed. ------------------- Released version 2.0.4 --------------------------- - Fixed some bad string accesses, thanks to Orion Poplawski. ------------------- Released version 2.0.3 --------------------------- - The instrumentation of OpenMP sections, more precisely the region variable passed to POMP2_Section_end, was potentially invalid. Invalid values were observed in case the environment variable MALLOC_PERTURB_ was set to a non-zero value. Fixed. ------------------- Released version 2.0.2 --------------------------- - Opari2 usually adds nowait and an explicit barrier after the single construct to measure the implicit barrier overhead caused by the single construct. If copyprivate is given, neither nowait nor the explicit barrier must be instrumented. Opari2 complies for C/C++. For Fortran it added nowait and the explicit barrier even if copyprivate is present. This results in a compilation error. Fixed. - When creating the 'pomp2_init_regions.c' file, ignore symbols that contain '.ITC.' but keep symbols of type 'D' (see below). These symbols are created by Intel compilers and were considered as POMP2 region when the compilation flags '-ipo' or '-O3' were used. These symbols caused linker errors during Score-P's link step. ------------------- Released version 2.0.1 --------------------------- - Ignore symbols of type 'D' (symbols in the initialized data section) when creating the 'pomp2_init_regions.c' file. These symbols caused linker errors during Score-P's link step. - The option --disable=omp is supposed to only instrument parallel regions; these are necessary for the thread management of tools building upon OPARI2. But the implicit barrier at the end of parallel regions was instrumented as well. This is fixed now. - Empty lines between continuation lines of directives (e.g., due to conditional compilation) caused OPARI2 to fail. Fixed. ------------------- Released version 2.0 ----------------------------- - Opari2 was modularized. This means, all functionality directly related to OpenMP was encapsulated, thus enabling the support of new paradigms by adding the respective classes. - Parallel loop bodies consisting of if+else were incorrectly instrumented with the "end-loop-instrumentation" inserted before the (first) else. Fixed. - Compilation of instrumented code failed if 'default(none)' was specified in the outmost parallel region and tasking and/or nesting was used. Fixed. - The use of if- or num_threads-clauses with trailing comma caused the compilation of instrumented code to fail. Fixed. - In Fortran one can expose only selected symbols of a used module, e.g., 'use omp_lib, only: '. If is one of the OpenMP lock API calls, OPARI2 would instrument it and compilation would fail. Fixed. ------------------- Released version 1.1.4 --------------------------- - For free form Fortran source files, atomic operations which are written over multiple lines are now supported. - When an asterisk occurs in a schedule clause, this asterisk is substituted in the CTC String by an @ to avoid collision with the asterisk as CTC String delimiter. opari2_ctc_parser.c transforms this back, when the CTC String is read. - Fix in handling of continuation lines in openmp directives in Fortran. - Fixed detection of function keyword in Fortran. - Fixed handling of variables named num_threads, so that they are no longer detected as a num_threads clause ------------------- Released version 1.1.3 --------------------------- - Blank lines between continuation lines that can occur during preprocessing caused OPARI2 to fail. Fixed. - Changes to support Fujitsu's K Computer and FX10/FX100 systems. - Fixed conditional jumps that depend on uninitialized values. - Fixed handling if inode numbers for very large numbers - Fixed generation of output file names for *.cuf and *.CUF files ------------------- Released version 1.1.2 --------------------------- - If num_threads-clauses or if-clauses are the only clause in a continuation line, OPARI2 instrumentation resulted in empty continuation lines, which causes compilation errors. Fixed this by removing empty continuation lines in OpenMP directives. - Install helper scripts that are not intended to be used directly in /libexec as opposed to /bin. - Support the --includedir and --bindir configure options. - Prevent creation of empty '!$omp' lines during instrumentation. These cause compilation errors at least for gfortran. - Prevent insertion of a newline after the 'copyin(pomp_tpd)' instrumentation. - OPARI2 erroneously complained about a 'missing continuation line' in Fortran codes where '!$OMP PARALLEL' directive spans several lines that use conditional compilation. - On some systems the compiled output of pomp2-parse-init-regions.awk caused undefined symbol linker failures due to an ambiguous regular expression in the AWK script. Fixed. ------------------- Released version 1.1.1 --------------------------- - if-else-statements preceded by #pragma omp parallel were instrumented erroneously. Fixed. - OpenMP regions are reported with incorrect source filenames, both in the region name (e.g., "!$omp parallel @rhs.prep.f:28" or "!$omp parallel @rhs.input.F:28" rather than "!$omp parallel @rhs.f:28") and associated attributes. Although not all compilers seem to be affected, this issue is seen with GNU, Intel and IBM XL compilers. Fixed. - Blank lines (often the result of preprocessing) which occur within Fortran directive continuation are ignored by compilers but treated by Opari2 as missing continuation line errors. Fixed. - Do not instrument an if(true) clause if the user hasn't specified one. Although the previously instrumented if(true) clauses usually do no harm, they prevent the CRAY compiler from generating parallel code. This compiler bug was reported to CRAY. - Instrumenting "parallel for" with "firstprivate(x) lastprivate(x)" caused compilation errors. Fixed. ------------------- Released version 1.1 ----------------------------- - The '--preprocess' flag was added to opari2, which indicates that a file has already been preprocessed. This helps to handle OpenMP constructs in header files or constructs dependent on preprocessor defines. Using this option requires that pomp2_lib.h is already included. Furthermore, it requires the marker ___POMP2_INCLUDE___ immediately after the included pomp2_lib.h file. - Fixed enddo detection in Fortran programs when multiple commands are placed on one line separated by a semicolon. - The '--cflags' argument from opari2-config now allows to specify a compiler '--cflags[=(gnu|intel|sun|pgi|ibm|cray)]'. Special compiler dependent options to avoid warnings caused by the instrumentation are added if a compiler is specified. - Added a ctc_string argument to the POMP2_Begin function. Note: This change breaks compatibility to previous opari2 versions. - If Intel's Language Extensions for Offload are used to offload code to a Xeon Phi coprocessor, opari2 no longer instruments OpenMP code in these regions or functions marked for execution on the coprocessor. This allows handling OpenMP code on the host, when the measurement system does not support the offload model. ------------------- Released version 1.0.7 --------------------------- - Fixed broken option --disable=atomic in Fortran and C/C++. - Improving options --free-form and --fix-form. - Note that within the context of providing the new opari2-config option '--region-initialization' introduced in 1.0.7-rc1, the script pomp2-parse-init-regions.awk was changed into an executable command. The old options '--awk-cmd', '--awk-script', and '--egrep' are still available but deprecated. - Fixed problem parsing escaped characters in C source code which caused opari2 to crash. - Provide POMP2_Init_regions functions with a unique suffix (formerly used gettimeofday was not "unique enough") to prevent duplicate definition linker failures. - Improved instrumentation for parallel regions that the default(none) clause by replacing the pomp2_ctc_XX constant variable by preprocessor defines. - Fixed bug in instrumenting comments in macros which caused "ERROR: unbalanced pragma/directive nesting for $END$ directive". - Fix instrumentation by adding opari2 options --free-form and --fix-form for cases where opari2's assumptions based on the file extension (.f fixed-form) do not hold because the user specified otherwise (e.g. by compiling with --ffree-form ). - Resurrect the hidden feature "manually prevent OpenMP directives from being instrumented" by documenting it. Parallel regions still get instrumented as this a prerequisite of measurement tools to get the internal thread handling correct. - Improved parsing of the nm output in order to generate the region initialization file in cases where the the POMP2_Init_reg routines were generated with absolute addresses (e.g. using the Open64 compiler with inter-procedural analysis). - Do not add any POMP2 statements in Fortran pure subroutines/functions as this leads to compile errors. - Simplify the generation the POMP2 init region file. Previously opari2-config had to be called in a sequence (--egrep, --egrep, --awk-cmd, --awk-script). This sequence is replaced by opari2-config --region-initialization. - Comments in macros are now ignored when processing. ------------------- Released version 1.0.6 --------------------------- - Changed opari-config option --pomp2-api-version to --interface-version to make it consistent with otf2-config and cube-config. ------------------- Released version 1.0.5 --------------------------- - Fix invalid insertion of .opari.inc in conjunction with continued 'dimension' statements. - Improved Fortran 'end do' detection. - CTC-strings grew to long for Fortran77. Size reduced. - Use inode instead of gettimeofday as unique region identifier. In very special circumstances gettimeofday resolution leads to non-unique identifiers. - CTC-strings contained wrong line-number information. - Create temporary files in the directory of the output file. - Detection of conditional compilation in free form Fortran improved. ------------------- Released version 1.0.4 --------------------------- - Provide correct region line numbers also for lazy initialization during runtime. Previously the region end line was always 0 for lazy initialization. - Improved region end line number handling in conjunction with omitted Fortran '!$omp end do' or '!$omp end parallel do' directives. - Fix invalid insertion of .opari.inc in Fortran77 codes with arbitrary continuation line characters in column 6. - Fix invalid insertion of .opari.inc in Fortran codes in conjunction with subroutine calls that distribute their arguments over several lines. ------------------- Released version 1.0.3 --------------------------- - Prevent OPARI2 from instrumenting Fortran 'abstract interfaces'. - Fix invalid insertion of .opari.inc in conjunction with Fortran 'USE' statements that contain line continuations. - Fix invalid insertion of .opari.inc in conjunction with user-defined operators containing '=' in Fortran 'USE' statements. - Fix instrumentation of .c files that produce a linker/mangling error when compiled with a C++ compiler. - Support for out-of-place a.k.a. VPATH builds. Generate .opari.inc in the directory of the output file. - Fix instrumentation bug (C++ files only) where IBM and PGI compilers expect threadprivate variables in different locations. ------------------- Released version 1.0.2 --------------------------- - Renaming of the configure related variable LD_FLAGS_FOR_BUILD to LDFLAGS_FOR_BUILD for consistency. - Renaming of the installed script pomp2_parse_init_regions.awk to pomp2-parse-init-regions.awk for consistency. - In Fortran, improved parsing of function and subroutine keywords. - In in-place builds, the [dist]clean targets accidentally removed files. - Create task events only for tasks that actually get created. - In Fortran, added `integer ( kind=4 )' to all integer variables instrumented by opari2. - In Fortran, continuation lines ending with comments were not detected as continuation lines (Ticket 77). ------------------- Released version 1.0.1 --------------------------- - In Fortran, continued format descriptors resulted in invalid include of the opari.inc file (Ticket 76). - In Fortran, rename lists resulted in premature include of the opari.inc file (Ticket 75). ------------------- Released version 1.0 ----------------------------- opari2-2.0.10/PaxHeaders/COPYING0000644000000000000000000000013215232670204013100 xustar0030 mtime=1785426052.139415949 30 atime=1785426052.231415405 30 ctime=1785426077.787264176 opari2-2.0.10/COPYING0000664000175100001440000000520315232670204013432 0ustar00builderusersThe entire code of Score-P is licensed under the BSD-style license agreement given below, except for the third-party code distributed in the 'vendor/' subdirectory. See the corresponding COPYING files in 'vendor/*' of the distribution tarball for details. ----------------------------------------------------------------------------- OPARI2 LICENSE AGREEMENT ======================== Copyright (c) 2009-2016, RWTH Aachen University, Germany Copyright (c) 2009-2013, Gesellschaft fuer numerische Simulation mbH, Braunschweig, Germany Copyright (c) 2009-2024, Technische Universitaet Dresden, Germany Copyright (c) 2009-2013, University of Oregon, Eugene, USA Copyright (c) 2009-2026, Forschungszentrum Juelich GmbH, Germany Copyright (c) 2009-2014, German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany Copyright (c) 2009-2013, Technische Universitaet Muenchen, Germany All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * 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. * Neither the names of RWTH Aachen University, Gesellschaft fuer numerische Simulation mbH Braunschweig, Technische Universitaet Dresden, University of Oregon, Eugene, Forschungszentrum Juelich GmbH, German Research School for Simulation Sciences GmbH, or the Technische Universitaet Muenchen, nor the names of their 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. opari2-2.0.10/PaxHeaders/AUTHORS0000644000000000000000000000013215232670204013115 xustar0030 mtime=1785426052.139415949 30 atime=1785426052.231415405 30 ctime=1785426077.787264176 opari2-2.0.10/AUTHORS0000664000175100001440000000113115232670204013443 0ustar00builderusersAuthors of OPARI and OPARI2, in chronological order: Bernd Mohr Brian Wylie Felix Wolf Markus Geimer Christian Feld Daniel Lorenz Dirk Schmidl Peter Philippen Jie Jiang Bert Wesarg opari2-2.0.10/PaxHeaders/aclocal.m40000644000000000000000000000013215232670207013710 xustar0030 mtime=1785426055.063398647 30 atime=1785426055.259397487 30 ctime=1785426077.767264294 opari2-2.0.10/aclocal.m40000664000175100001440000007315215232670207014252 0ustar00builderusers# generated automatically by aclocal 1.13.4 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_COND_IF -*- Autoconf -*- # Copyright (C) 2008-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_COND_IF # _AM_COND_ELSE # _AM_COND_ENDIF # -------------- # These macros are only used for tracing. m4_define([_AM_COND_IF]) m4_define([_AM_COND_ELSE]) m4_define([_AM_COND_ENDIF]) # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) # --------------------------------------- # If the shell condition COND is true, execute IF-TRUE, otherwise execute # IF-FALSE. Allow automake to learn about conditional instantiating macros # (the AC_CONFIG_FOOS). AC_DEFUN([AM_COND_IF], [m4_ifndef([_AM_COND_VALUE_$1], [m4_fatal([$0: no such condition "$1"])])dnl _AM_COND_IF([$1])dnl if test -z "$$1_TRUE"; then : m4_n([$2])[]dnl m4_ifval([$3], [_AM_COND_ELSE([$1])dnl else $3 ])dnl _AM_COND_ENDIF([$1])dnl fi[]dnl ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([build-config/common/m4/ac_common_package.m4]) m4_include([build-config/common/m4/ac_scorep_doxygen.m4]) m4_include([build-config/common/m4/ac_scorep_git_controlled.m4]) m4_include([build-config/common/m4/ac_scorep_sys_detection.m4]) m4_include([build-config/common/m4/ac_scorep_toplevel_args.m4]) m4_include([build-config/common/m4/ac_scorep_uncrustify.m4]) m4_include([build-config/common/m4/ac_scorep_version_and_revision.m4]) m4_include([build-config/common/m4/afs_compiler_backend.m4]) m4_include([build-config/common/m4/afs_maintainer_mode.m4]) m4_include([build-config/common/m4/afs_summary.m4]) m4_include([build-config/common/m4/ax_config_subdir.m4]) m4_include([build-config/m4/opari2_compiler_and_flags.m4]) opari2-2.0.10/PaxHeaders/configure.ac0000644000000000000000000000013215232670204014333 xustar0030 mtime=1785426052.179415713 30 atime=1785426052.243415334 30 ctime=1785426077.767264294 opari2-2.0.10/configure.ac0000664000175100001440000000757315232670204014701 0ustar00builderusersAC_PREREQ([2.69]) AC_INIT([OPARI2], m4_esyscmd([build-config/common/generate-package-version.sh build-config/VERSION]), [support@score-p.org], [opari2]) AFS_PACKAGE_INIT AC_SCOREP_REVISION AC_SCOREP_TOPLEVEL_ARGS ## Packages that do manual configuration or use the install program might need ## to tell configure where to find some other shell scripts by calling ## AC_CONFIG_AUX_DIR, though the default places it looks are correct for most ## cases. ## Need to be called early on configure.ac because other macros search tools ## in this directory. AC_CONFIG_AUX_DIR([build-config]) ## See also ACLOCAL_AMFLAGS in Makefile.am. AC_CONFIG_MACRO_DIRS([build-config/m4 build-config/common/m4]) ## Set the default installation prefix to /opt/opari2 instead of /usr/local AC_PREFIX_DEFAULT([/opt/opari2]) AC_SCOREP_GIT_CONTROLLED ## Call not before AC_CONFIG_MACRO_DIR AM_INIT_AUTOMAKE([foreign color-tests 1.13.4 -Wall tar-pax]) AM_SILENT_RULES([yes]) AFS_MAINTAINER_MODE AC_SCOREP_DETECT_PLATFORMS AFS_CROSSCOMPILING # don't detect and load defaults in nested configures (e.g. otf2) AS_IF([test "x$ac_scorep_platform_data_provided" = "x" || test "${ac_scorep_platform_data_provided}" = "no"], [AFS_CUSTOM_COMPILERS AS_IF([test "x${afs_custom_compilers_given}" = "xno"], [AC_SCOREP_WITH_NOCROSS_COMPILER_SUITE]) # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ $ac_scorep_compilers_backend \ $ac_scorep_compilers_frontend \ user_provided_configure_args`" AS_IF([test $? -ne 0], [AC_MSG_ERROR([cannot process provided and/or autodetected arguments. Please contact and provide the above output. Thanks.])]) ], [AC_MSG_NOTICE([platform data provided by toplevel configure.]) # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ user_provided_configure_args`" AS_IF([test $? -ne 0], [AC_MSG_ERROR([cannot process provided arguments. Please contact and provide the above output. Thanks.])]) ]) AC_SCOREP_UNCRUSTIFY AC_SCOREP_DOXYGEN AS_IF([test "x${ac_scorep_git_controlled}" = xyes], [AC_CONFIG_FILES([doc/doxygen-user.cfg:doc/doxygen-user/doxygen-user.cfg.in]) AC_CONFIG_FILES([doc/doxygen-dev.cfg:doc/doxygen-dev/doxygen-dev.cfg.in])]) ## Autoconf supports changing the names of programs when installing them. In ## order to use these transformations, configure.ac must call the macro ## AC_ARG_PROGRAM. # implicitly called by ? #AC_ARG_PROGRAM # used for EXTRA_DIST in Makefile.am AM_CONDITIONAL([CROSS_BUILD], [test "x${ac_scorep_cross_compiling}" = "xyes"]) # handle own package's subdir configures AX_CONFIG_SUBDIR([build-frontend], [${args} ac_scorep_platform=${ac_scorep_platform}]) # sed is needed for check target AC_PROG_SED # Explicitly check for absolute path of awk for pomp2_parse_init_regions.awk AC_PATH_PROG([awk_path], [${AWK}], [no], []) AS_IF([test "x${awk_path}" = "xno"], [AC_MSG_FAILURE([awk not found, but required.])]) AC_SUBST([OPARI2_AWK], [${awk_path}]) AC_CONFIG_FILES([ Makefile src/config-common.h:build-config/common/config-common.h ]) AC_CONFIG_FILES([test/c_test.sh], [chmod +x test/c_test.sh]) AC_CONFIG_FILES([test/cxx_test.sh], [chmod +x test/cxx_test.sh]) AC_CONFIG_FILES([test/f90_test.sh], [chmod +x test/f90_test.sh]) AC_CONFIG_FILES([test/f77_test.sh], [chmod +x test/f77_test.sh]) AC_CONFIG_FILES([test/awk_script_test.sh], [chmod +x test/awk_script_test.sh]) AC_CONFIG_FILES([test/awk_script_test.output:test/data/awk_script_test.out.in]) AC_CONFIG_FILES([build-frontend/pomp2-parse-init-regions.awk:src/opari-lib-dummy/pomp2_parse_init_regions.awk.in], \ [chmod +x build-frontend/pomp2-parse-init-regions.awk]) AC_OUTPUT opari2-2.0.10/PaxHeaders/configure0000644000000000000000000000013215232670207013754 xustar0030 mtime=1785426055.675395025 30 atime=1785426068.011322026 30 ctime=1785426077.747264412 opari2-2.0.10/configure0000775000175100001440000050635715232670207014331 0ustar00builderusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for OPARI2 2.0.10. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # need to catch these variables, before unsetting them later : ${AS_COLOR:=$CLICOLOR}; export AS_COLOR : ${AS_COLOR_FORCE:=$CLICOLOR_FORCE}; export AS_COLOR_FORCE as__red= as__grn= as__yel= as__blu= as__mag= as__cya= as__gry= as__std= as__color=no if test "X$AS_COLOR_FORCE" = X0; then as__color=no; elif test "X$AS_COLOR_FORCE" = X1; then as__color=yes elif { test "X$TERM" != Xdumb || test "X$AS_COLOR" = X1; } && { test -t 1; } 2>/dev/null; then as__color=yes fi if test $as__color = yes; then as__red='' as__grn='' as__yel='' as__blu='' as__mag='' as__cya='' as__gry='' as__std='' fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: support@score-p.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # ax_fn_config_subdir # ------------------- # trigger configure in ax_subdir with arguments ax_subdir_args. Adjusts # parameters by updating --cache-file, --srcdir, --prefix, and adding # --disable-option-checking as in AC_CONFIG_SUBIRS. ax_fn_config_subdir () { ax_subdir="$1" ax_subdir_args="$2" # BEGIN: slightly modified snippet from status.m4 # Remove --cache-file, --srcdir, --prefix, and # --disable-option-checking arguments so they do not pile up. # Input: ax_subdir_args; output: ax_sub_configure_args ax_sub_configure_args= ac_prev= eval "set x $ax_subdir_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ax_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ax_sub_configure_args="'$ac_arg' $ax_sub_configure_args" # Pass --silent if test "$silent" = yes; then ax_sub_configure_args="--silent $ax_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ax_sub_configure_args="--disable-option-checking $ax_sub_configure_args" ax_popdir=`pwd` ac_msg="=== configuring in $ax_subdir (`pwd`/$ax_subdir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ax_subdir"; as_fn_mkdir_p ac_builddir=. case "$ax_subdir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ax_subdir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ax_subdir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ax_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ax_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ax_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ax_subdir" >&5 $as_echo "$as_me: ${as__yel}WARNING: no configuration information is in $ax_subdir${as__std}" >&2;} ax_sub_configure= fi # The recursion is here. if test -n "$ax_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: info: running $SHELL $ax_sub_configure $ax_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: ${as__blu}info: running $SHELL $ax_sub_configure $ax_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir${as__std}" >&2;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ax_sub_configure\" $ax_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ax_sub_configure failed for $ax_subdir" "$LINENO" 5 fi cd "$ax_popdir" # END: slightly modified snippet from status.m4 } # ax_fn_config_subdir # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: ${as__red}error: $2${as__std}" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='OPARI2' PACKAGE_TARNAME='opari2' PACKAGE_VERSION='2.0.10' PACKAGE_STRING='OPARI2 2.0.10' PACKAGE_BUGREPORT='support@score-p.org' PACKAGE_URL='' ac_default_prefix=/opt/opari2 enable_option_checking=no ax_config_subdir_dir_1= ax_config_subdir_args_1= ac_subst_vars='LTLIBOBJS LIBOBJS OPARI2_AWK awk_path ax_config_subdirs CROSS_BUILD_FALSE CROSS_BUILD_TRUE ac_scorep_doxygen_distdir HAVE_DOXYGEN_LATEX_FALSE HAVE_DOXYGEN_LATEX_TRUE have_doxygen_latex have_makeindex have_pdflatex have_dot HAVE_DOXYGEN_FALSE HAVE_DOXYGEN_TRUE DOXYGEN HAVE_UNCRUSTIFY_FALSE HAVE_UNCRUSTIFY_TRUE ac_scorep_have_uncrustify has_ftn has_CC has_cc build_os build_vendor build_cpu build MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM GIT_CONTROLLED_FALSE GIT_CONTROLLED_TRUE SED LIBRARY_AGE LIBRARY_REVISION LIBRARY_CURRENT PACKAGE_SUFFIX PACKAGE_BUGFIX PACKAGE_MINOR PACKAGE_MAJOR afs_srcdir AFS_PACKAGE_NAME AFS_PACKAGE_name target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_platform_mic with_custom_compilers with_compiler_suite ' ac_precious_vars='build_alias host_alias target_alias' ac_subdirs_all='build-frontend' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: ${as__yel}WARNING: you should use --build, --host, --target${as__std}" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: ${as__yel}WARNING: invalid host type: $ac_option${as__std}" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: ${as__yel}WARNING: unrecognized options: $ac_unrecognized_opts${as__std}" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures OPARI2 2.0.10 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/opari2] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of OPARI2 2.0.10:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-maintainer-mode disable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-platform-mic Force build for Intel Xeon Phi co-processors [no]. This option is only needed for Xeon Phi co-processors, like the Knights Corner (KNC). It is not needed for self-hosted Xeon Phis, like the Knights Landing (KNL); for these chips no special treatment is required. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-custom-compilers Customize compiler settings by 1. copying the files /build-config/common/platforms/platform-*-user-provided to the directory where you run configure , 2. editing those files to your needs, and 3. running configure. Alternatively, edit the files under directly. Files in take precedence. You are entering unsupported terrain. Namaste, and good luck! --with-compiler-suite=(gcc|ibm|intel|oneapi|nvhpc|pgi|clang|aocc|amdclang) The compiler suite used to build this package. Needs to be in $PATH [gcc]. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: ${as__yel}WARNING: no configuration information is in $ac_dir${as__std}" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF OPARI2 configure 2.0.10 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by OPARI2 $as_me 2.0.10, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: ${as__yel}WARNING: cache variable $ac_var contains a newline${as__std}" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: info: loading site script $ac_site_file" >&5 $as_echo "$as_me: ${as__blu}info: loading site script $ac_site_file${as__std}" >&2;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: ${as__red}error: in \`$ac_pwd':${as__std}" >&2;} as_fn_error $? "failed to load site script $ac_site_file${as__std} ${as__red}See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: info: loading cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: loading cache $cache_file${as__std}" >&2;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: info: creating cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: creating cache $cache_file${as__std}" >&2;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu AFS_PACKAGE_name=opari2 AFS_PACKAGE_NAME=OPARI2 afs_srcdir=$srcdir { $as_echo "$as_me:${as_lineno-$LINENO}: checking Git controlled" >&5 $as_echo_n "checking Git controlled... " >&6; } ac_scorep_git_controlled="no" # test if ${afs_srcdir} is a git top-level, not any parent directory: # * if ${afs_srcdir} is a top-level, then the prefix is empty (e.g., we are git controlled) # * if ${afs_srcdir} is below a top-level, then it wont be empty (e.g., we operate in a # tarball, which was extracted below a top-level) # * if git could not find any top-level, it prints an error to stderr and stop, # we catch this error, which makes the test also fail (e.g., we operate in a # tarball which is *not* below any top-level) if test -z "$( unset $(git rev-parse --local-env-vars 2>/dev/null) && cd ${afs_srcdir} && git rev-parse --show-prefix 2>&1)"; then : ac_scorep_git_controlled="yes" $as_echo "#define SCOREP_IN_DEVELOPEMENT /**/" >>confdefs.h else $as_echo "#define SCOREP_IN_PRODUCTION /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_git_controlled" >&5 case "$ac_scorep_git_controlled" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_git_controlled${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_git_controlled${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_git_controlled${as__std}" >&6 ;; esac; } PACKAGE_MAJOR=2 PACKAGE_MINOR=0 PACKAGE_BUGFIX=10 PACKAGE_SUFFIX= LIBRARY_CURRENT=3 LIBRARY_REVISION=0 LIBRARY_AGE=0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 case "$ac_cv_path_SED" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_cv_path_SED${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_cv_path_SED${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_cv_path_SED${as__std}" >&6 ;; esac; } SED="$ac_cv_path_SED" rm -f conftest.sed # When in a working copy, write REVISION* files. The REVISION* files # are updated during each configure call and also at make # doxygen-user. # When working with a make-dist-generated tarball, the REVISION* files # are provided. component_revision="invalid" if test "x${ac_scorep_git_controlled}" = xyes && component_revision=$( unset $(git rev-parse --local-env-vars 2>/dev/null) && cd ${afs_srcdir} && git describe --long --always --dirty | ${SED} 's/.*-g//' 2>/dev/null); then : echo "$component_revision" >${afs_srcdir}/build-config/REVISION else component_revision=external fi # Warn if the REVISION files contain -dirty prefix or is external. case `cat ${afs_srcdir}/build-config/REVISION` in #( *-dirty|external|invalid) : component_revision=`cat ${afs_srcdir}/build-config/REVISION` { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: distribution does not match a single, unmodified revision, but $component_revision." >&5 $as_echo "$as_me: ${as__yel}WARNING: distribution does not match a single, unmodified revision, but $component_revision.${as__std}" >&2;} ;; #( *) : ;; esac # Quote arguments with shell meta characters. TOPLEVEL_CONFIGURE_ARGUMENTS= set -- "$progname" "$@" for ac_arg do case "$ac_arg" in #( *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\']*) : ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` # if the argument is of the form -foo=baz, quote the baz part only ac_arg=`echo "'$ac_arg'" | sed "s/^'\([-a-zA-Z0-9]*=\)/\\1'/"` ;; #( *) : ;; esac # Add the quoted argument to the list. TOPLEVEL_CONFIGURE_ARGUMENTS="$TOPLEVEL_CONFIGURE_ARGUMENTS $ac_arg" done # Remove the initial space we just introduced. TOPLEVEL_CONFIGURE_ARGUMENTS=`echo "x$TOPLEVEL_CONFIGURE_ARGUMENTS" | sed -e 's/^x *//'` echo "$TOPLEVEL_CONFIGURE_ARGUMENTS" > ./user_provided_configure_args ## Packages that do manual configuration or use the install program might need ## to tell configure where to find some other shell scripts by calling ## AC_CONFIG_AUX_DIR, though the default places it looks are correct for most ## cases. ## Need to be called early on configure.ac because other macros search tools ## in this directory. ac_aux_dir= for ac_dir in build-config "$srcdir"/build-config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-config \"$srcdir\"/build-config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ## See also ACLOCAL_AMFLAGS in Makefile.am. ## Set the default installation prefix to /opt/opari2 instead of /usr/local # afs_fn_summary DESCR VALUE INDENT WRAP-MARGIN=128 # ---------------------------------------------------------------------- # Produces a line-wrapped summary line with DESCR and VALUE, indented by # INDENT and wrapped at WRAP-MARGIN. afs_fn_summary () { _afs_summary_wrap_width=${4-128} _afs_summary_column_width=32 _afs_summary_prefix="${3-} ${1-}:" printf "%s" "${_afs_summary_prefix}" _afs_summary_padding="$(printf "%-${_afs_summary_column_width}s" "")" _afs_summary_value="$(echo "${2-}" | $SED -e 's/ */ /g' -e 's/^ //' -e 's/ $//')" if test ${#_afs_summary_prefix} -ge ${#_afs_summary_padding}; then : _afs_summary_nl=" \\$as_nl${_afs_summary_padding}" else as_fn_arith ${#_afs_summary_padding} - ${#_afs_summary_prefix} && _afs_summary_nl="$(printf "%-${as_val}s" "")" fi _afs_summary_sep="" as_fn_arith ${#_afs_summary_padding} + 1 && _afs_summary_column=$as_val while test -n "${_afs_summary_value}" do _afs_summary_entry="${_afs_summary_value%% *}" printf "%s" "${_afs_summary_nl}${_afs_summary_sep}${_afs_summary_entry}" case "${_afs_summary_value}" in (*" "*) _afs_summary_value="${_afs_summary_value#* }" ;; (*) _afs_summary_value="" ;; esac as_fn_arith ${_afs_summary_column} + ${#_afs_summary_entry} + ${#_afs_summary_sep} && _afs_summary_column=$as_val if test ${_afs_summary_column} -ge ${_afs_summary_wrap_width}; then : _afs_summary_nl=" \\$as_nl${_afs_summary_padding}" _afs_summary_sep="" as_fn_arith ${#_afs_summary_padding} + 1 && _afs_summary_column=$as_val else _afs_summary_sep=" " _afs_summary_nl="" fi done echo { _afs_summary_column_width=; unset _afs_summary_column_width;} { _afs_summary_wrap_width=; unset _afs_summary_wrap_width;} { _afs_summary_prefix=; unset _afs_summary_prefix;} { _afs_summary_padding=; unset _afs_summary_padding;} { _afs_summary_value=; unset _afs_summary_value;} { _afs_summary_nl=; unset _afs_summary_nl;} { _afs_summary_sep=; unset _afs_summary_sep;} { _afs_summary_column=; unset _afs_summary_column;} { _afs_summary_entry=; unset _afs_summary_entry;} { _afs_summary_tag=; unset _afs_summary_tag;} { _afs_summary_tag_final=; unset _afs_summary_tag_final;} } # afs_fn_summary rm -f opari2.summary LC_ALL=C find . -name 'config.summary*' -exec rm -f '{}' \; afs_fn_summary \ "OPARI2 2.0.10" \ "" \ "" \ >config.summary if test "x${ac_scorep_git_controlled}" = xyes; then GIT_CONTROLLED_TRUE= GIT_CONTROLLED_FALSE='#' else GIT_CONTROLLED_TRUE='#' GIT_CONTROLLED_FALSE= fi if test "x${verbose}" = "xyes"; then : afs_fn_summary "Git controlled" "$ac_scorep_git_controlled" " " >>config.summary fi ## Call not before AC_CONFIG_MACRO_DIR am__api_version='1.13' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 case "$INSTALL" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$INSTALL${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$INSTALL${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$INSTALL${as__std}" >&6 ;; esac; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "${as__grn}yes${as__std}" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: ${as__yel}WARNING: 'missing' script is too old or missing${as__std}" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 case "$STRIP" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$STRIP${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$STRIP${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$STRIP${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 case "$ac_ct_STRIP" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_ct_STRIP${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_ct_STRIP${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_ct_STRIP${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: ${as__yel}WARNING: using cross tools not prefixed with host triplet${as__std}" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 case "$MKDIR_P" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$MKDIR_P${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$MKDIR_P${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$MKDIR_P${as__std}" >&6 ;; esac; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 case "$AWK" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$AWK${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$AWK${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$AWK${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "${as__grn}yes${as__std}" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 case "$am_cv_make_support_nested_variables" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$am_cv_make_support_nested_variables${as__std}" >&6 ;; esac; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='opari2' VERSION='2.0.10' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a pax tar archive" >&5 $as_echo_n "checking how to create a pax tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_pax-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=posix -chf - "'"$$tardir"' am__tar_="$_am_tar --format=posix -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x pax -w "$$tardir"' am__tar_='pax -L -x pax -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H pax -L' am__tar_='find "$tardir" -print | cpio -o -H pax -L' am__untar='cpio -i -H pax -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_pax}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_pax+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_pax=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_pax" >&5 case "$am_cv_prog_tar_pax" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$am_cv_prog_tar_pax${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$am_cv_prog_tar_pax${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$am_cv_prog_tar_pax${as__std}" >&6 ;; esac; } # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 case "$am_cv_make_support_nested_variables" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$am_cv_make_support_nested_variables${as__std}" >&6 ;; esac; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "x${ac_scorep_git_controlled}" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 case "$USE_MAINTAINER_MODE" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$USE_MAINTAINER_MODE${as__std}" >&6 ;; esac; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 case "$USE_MAINTAINER_MODE" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$USE_MAINTAINER_MODE${as__std}" >&6 ;; esac; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 case "$ac_cv_build" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_cv_build${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_cv_build${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_cv_build${as__std}" >&6 ;; esac; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac # Notes about platform detection on Cray systems: # First, we check for x86-64 CPU type and an existing /opt/cray/pmi/default link. # This test should succeed for all supported Cray systems (Cray XT, XE, XK, XC). # In the second step we will classify the systems depending on their network. # Therefore, we use the link /opt/cray/pmi/default. We determine the link target # and select the network. For example, /opt/cray/pmi/default points to # /opt/cray/pmi/4.0.1-1.0000.9421.73.3.gem. 'gem' signifies the Gemini network. # As a result we can classify the following systems: # ss (SeaStar) Cray XT # gem (Gemini) Cray XE, XK # ari (Aries) Cray XC # To distinguish Cray XE and XK systems we determine whether the system uses GPU # accelerators (Cray XK) or not (Cray XE). # # Newer software stacks do not encode the network name in their files, e.g., # /opt/cray/pmi/5.0.11 # Therefore, we need a fall-back solution. We will test for several directories # including the network name. # # Even newer software stacks on Cray XC systems (Cori, Piz Daint) # don't provide the /opt/cray/pmi/default link but instead # /opt/cray/pe/pmi/default. They still provide the network via # /opt/cray/ari/modulefiles. # # Check whether --enable-platform-mic was given. if test "${enable_platform_mic+set}" = set; then : enableval=$enable_platform_mic; case ${enableval} in #( yes) : ac_scorep_platform=mic ;; #( no) : ;; #( *) : as_fn_error $? "value '$enableval' unsupported for '--enable-platform-mic'" "$LINENO" 5 ;; esac fi if test "x${ac_scorep_platform}" = "x"; then : case ${build_os} in #( linux*) : if test "x${build_cpu}" = "xia64" && test -f /etc/sgi-release; then : ac_scorep_platform="altix" elif test "x${build_cpu}" = "xpowerpc64" && test -d /bgl/BlueLight; then : ac_scorep_platform="bgl" elif test "x${build_cpu}" = "xpowerpc64" && test -d /bgsys/drivers/ppcfloor/hwi; then : ac_scorep_platform="bgq" elif test "x${build_cpu}" = "xpowerpc64" && test -d /bgsys; then : ac_scorep_platform="bgp" elif (test "x${build_cpu}" = "xx86_64" || test "x${build_cpu}" = "xaarch64") && test -d /opt/cray; then : ac_scorep_platform="craygeneric" if test -L /opt/cray/pmi/default; then : if test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q ss && echo TRUE`" = "xTRUE"; then : ac_scorep_platform="crayxt" elif test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q gem && echo TRUE`" = "xTRUE" && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x1"; then : ac_scorep_platform="crayxe" elif test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q gem && echo TRUE`" = "xTRUE" && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x0"; then : ac_scorep_platform="crayxk" elif test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q ari && echo TRUE`" = "xTRUE"; then : ac_scorep_platform="crayxc" elif test -d /opt/cray/ari/modulefiles; then : ac_scorep_platform="crayxc" elif test -d /opt/cray/gem/modulefiles && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x0"; then : ac_scorep_platform="crayxk" elif test -d /opt/cray/gem/modulefiles && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x1"; then : ac_scorep_platform="crayxe" fi elif test -L /opt/cray/pe/pmi/default; then : if test -d /opt/cray/ari/modulefiles; then : ac_scorep_platform="crayxc" fi fi if test "x${ac_scorep_platform}" = "xcraygeneric"; then : # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_has_cc+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$has_cc"; then ac_cv_prog_has_cc="$has_cc" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_has_cc="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_has_cc" && ac_cv_prog_has_cc="no" fi fi has_cc=$ac_cv_prog_has_cc if test -n "$has_cc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_cc" >&5 case "$has_cc" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$has_cc${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$has_cc${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$has_cc${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "CC", so it can be a program name with args. set dummy CC; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_has_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$has_CC"; then ac_cv_prog_has_CC="$has_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_has_CC="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_has_CC" && ac_cv_prog_has_CC="no" fi fi has_CC=$ac_cv_prog_has_CC if test -n "$has_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_CC" >&5 case "$has_CC" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$has_CC${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$has_CC${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$has_CC${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "ftn", so it can be a program name with args. set dummy ftn; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_has_ftn+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$has_ftn"; then ac_cv_prog_has_ftn="$has_ftn" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_has_ftn="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_has_ftn" && ac_cv_prog_has_ftn="no" fi fi has_ftn=$ac_cv_prog_has_ftn if test -n "$has_ftn"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_ftn" >&5 case "$has_ftn" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$has_ftn${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$has_ftn${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$has_ftn${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "${has_cc}${has_CC}${has_ftn}" != yesyesyes; then : # System seems to be a Cray, but doensn't provide # compiler wrappers cc, CC, ftn. Try 'linux' as fallback. ac_scorep_platform=linux { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Generic Cray platform, no compiler wrappers provided, assume linux. Please contact ." >&5 $as_echo "$as_me: ${as__yel}WARNING: Generic Cray platform, no compiler wrappers provided, assume linux. Please contact .${as__std}" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: info: Generic Cray platform, providing compiler wrappers, not cross-compiling." >&5 $as_echo "$as_me: ${as__blu}info: Generic Cray platform, providing compiler wrappers, not cross-compiling.${as__std}" >&2;} fi fi elif test "x${build_cpu}" = "xx86_64" && test -d /opt/FJSVtclang; then : ac_scorep_platform="k" elif test "x${build_cpu}" = "xx86_64" && test -d /opt/FJSVfxlang; then : ac_scorep_platform="fx10" elif test "x${build_cpu}" = "xx86_64" && test -d /opt/FJSVmxlang; then : ac_scorep_platform="fx100" else ac_scorep_platform=linux fi ;; #( sunos* | solaris*) : ac_scorep_platform="solaris" ;; #( darwin*) : ac_scorep_platform="mac" ;; #( aix*) : ac_scorep_platform="aix" ;; #( mingw*) : ac_scorep_platform="mingw" ;; #( *) : ac_scorep_platform="unknown" ;; esac # Keep 'checking' and 'result' close to each other in oder to not interfere with CICD platform check { $as_echo "$as_me:${as_lineno-$LINENO}: checking for platform" >&5 $as_echo_n "checking for platform... " >&6; } if test "x${ac_scorep_platform}" = "xunknown"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_platform, please contact if you encounter any problems." >&5 case "$ac_scorep_platform, please contact if you encounter any problems." in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_platform, please contact if you encounter any problems.${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_platform, please contact if you encounter any problems.${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_platform, please contact if you encounter any problems.${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_platform (auto detected)" >&5 case "$ac_scorep_platform (auto detected)" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_platform (auto detected)${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_platform (auto detected)${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_platform (auto detected)${as__std}" >&6 ;; esac; } afs_fn_summary "Platform" "$ac_scorep_platform (auto detected)" " " >>config.summary fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for platform" >&5 $as_echo_n "checking for platform... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_platform (provided)" >&5 case "$ac_scorep_platform (provided)" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_platform (provided)${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_platform (provided)${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_platform (provided)${as__std}" >&6 ;; esac; } afs_fn_summary "Platform" "$ac_scorep_platform (provided)" " " >>config.summary fi if test "x${ac_scorep_cross_compiling}" = "x"; then : case ${ac_scorep_platform} in #( altix) : ac_scorep_cross_compiling="no" ;; #( bgl) : ac_scorep_cross_compiling="yes" ;; #( bgp) : ac_scorep_cross_compiling="yes" ;; #( bgq) : ac_scorep_cross_compiling="yes" ;; #( crayxt) : ac_scorep_cross_compiling="yes" ;; #( crayxe) : ac_scorep_cross_compiling="yes" ;; #( crayxk) : ac_scorep_cross_compiling="yes" ;; #( crayxc) : ac_scorep_cross_compiling="yes" ;; #( craygeneric) : ac_scorep_cross_compiling="no" ;; #( k) : ac_scorep_cross_compiling="yes" ;; #( fx10) : ac_scorep_cross_compiling="yes" ;; #( fx100) : ac_scorep_cross_compiling="yes" ;; #( linux) : ac_scorep_cross_compiling="no" ;; #( solaris) : ac_scorep_cross_compiling="no" ;; #( mac) : ac_scorep_cross_compiling="no" ;; #( mic) : ac_scorep_cross_compiling="yes" ;; #( mingw) : ac_scorep_cross_compiling="no" ;; #( aix) : ac_scorep_cross_compiling="no" ;; #( unknown) : ac_scorep_cross_compiling="no" ;; #( *) : as_fn_error $? "provided platform '${ac_scorep_platform}' unknown." "$LINENO" 5 ;; esac afs_fn_summary "Cross compiling" "$ac_scorep_cross_compiling (auto detected)" " " >>config.summary else # honor ac_scorep_cross_compiling from the commandline if test ${ac_scorep_cross_compiling} != "yes" && \ test ${ac_scorep_cross_compiling} != "no" ; then : as_fn_error $? "invalid value '${ac_scorep_cross_compiling}' for provided 'ac_scorep_cross_compiling'" "$LINENO" 5 fi afs_fn_summary "Cross compiling" "$ac_scorep_cross_compiling (provided)" " " >>config.summary fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross compilation" >&5 $as_echo_n "checking for cross compilation... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_cross_compiling" >&5 case "$ac_scorep_cross_compiling" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_cross_compiling${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_cross_compiling${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_cross_compiling${as__std}" >&6 ;; esac; } # don't detect and load defaults in nested configures (e.g. otf2) if test "x$ac_scorep_platform_data_provided" = "x" || test "${ac_scorep_platform_data_provided}" = "no"; then : # Check whether --with-custom-compilers was given. if test "${with_custom_compilers+set}" = set; then : withval=$with_custom_compilers; afs_custom_compilers_given="yes" case ${withval} in #( "yes") : if test -f ./platform-backend-user-provided && \ test -f ./platform-frontend-user-provided && \ test -f ./platform-mpi-user-provided && \ test -f ./platform-shmem-user-provided; then : { $as_echo "$as_me:${as_lineno-$LINENO}: info: Using compiler specification from ./platform-*-user-provided files." >&5 $as_echo "$as_me: ${as__blu}info: Using compiler specification from ./platform-*-user-provided files.${as__std}" >&2;} ac_scorep_compilers_backend="./platform-backend-user-provided" ac_scorep_compilers_frontend="./platform-frontend-user-provided" ac_scorep_compilers_mpi="./platform-mpi-user-provided" ac_scorep_compilers_shmem="./platform-shmem-user-provided" else { $as_echo "$as_me:${as_lineno-$LINENO}: info: Using compiler specification from $srcdir/build-config/common/platforms/platform-*-user-provided files." >&5 $as_echo "$as_me: ${as__blu}info: Using compiler specification from $srcdir/build-config/common/platforms/platform-*-user-provided files.${as__std}" >&2;} ac_scorep_compilers_backend="$srcdir/build-config/common/platforms/platform-backend-user-provided" ac_scorep_compilers_frontend="$srcdir/build-config/common/platforms/platform-frontend-user-provided" ac_scorep_compilers_mpi="$srcdir/build-config/common/platforms/platform-mpi-user-provided" ac_scorep_compilers_shmem="$srcdir/build-config/common/platforms/platform-shmem-user-provided" fi ;; #( *) : as_fn_error $? "'${withval}' not supported by --with-custom-compilers." "$LINENO" 5 ;; esac else afs_custom_compilers_given="no" fi if test "x${afs_custom_compilers_given}" = "xno"; then : ac_scorep_compilers_frontend="platform-frontend-${ac_scorep_platform}" ac_scorep_compilers_backend="platform-backend-${ac_scorep_platform}" if test "x${ac_scorep_compiler_suite_called}" != "x"; then # We need m4 quoting magic here ... as_fn_error $? "cannot use AC_SCOREP_WITH_COMPILER_SUITE and AC_SCOREP_WITH_NOCROSS_COMPILER_SUITE in one configure.ac." "$LINENO" 5 else ac_scorep_compiler_suite_called="yes" fi # Check whether --with-compiler-suite was given. if test "${with_compiler_suite+set}" = set; then : withval=$with_compiler_suite; case $withval in #( gcc|ibm|intel|oneapi|nvhpc|pgi|clang|aocc|amdclang) : ac_scorep_compilers_frontend="compiler-nocross-$withval" ;; #( "no") : as_fn_error $? "option --without-compiler-suite makes no sense." "$LINENO" 5 ;; #( *) : as_fn_error $? "compiler suite \"${withval}\" not supported by --with-compiler-suite." "$LINENO" 5 ;; esac fi if test -f "$srcdir/build-config/platforms/${ac_scorep_compilers_frontend}"; then : ac_scorep_compilers_frontend="$srcdir/build-config/platforms/${ac_scorep_compilers_frontend}" else ac_scorep_compilers_frontend="$srcdir/build-config/common/platforms/${ac_scorep_compilers_frontend}" fi if test -f "$srcdir/build-config/platforms/${ac_scorep_compilers_backend}"; then : ac_scorep_compilers_backend="$srcdir/build-config/platforms/${ac_scorep_compilers_backend}" else ac_scorep_compilers_backend="$srcdir/build-config/common/platforms/${ac_scorep_compilers_backend}" fi fi # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ $ac_scorep_compilers_backend \ $ac_scorep_compilers_frontend \ user_provided_configure_args`" if test $? -ne 0; then : as_fn_error $? "cannot process provided and/or autodetected arguments. Please contact and provide the above output. Thanks." "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: info: platform data provided by toplevel configure." >&5 $as_echo "$as_me: ${as__blu}info: platform data provided by toplevel configure.${as__std}" >&2;} # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ user_provided_configure_args`" if test $? -ne 0; then : as_fn_error $? "cannot process provided arguments. Please contact and provide the above output. Thanks." "$LINENO" 5 fi fi # Extract the first word of "uncrustify", so it can be a program name with args. set dummy uncrustify; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_scorep_have_uncrustify+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_scorep_have_uncrustify"; then ac_cv_prog_ac_scorep_have_uncrustify="$ac_scorep_have_uncrustify" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_scorep_have_uncrustify="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ac_scorep_have_uncrustify" && ac_cv_prog_ac_scorep_have_uncrustify="no" fi fi ac_scorep_have_uncrustify=$ac_cv_prog_ac_scorep_have_uncrustify if test -n "$ac_scorep_have_uncrustify"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_have_uncrustify" >&5 case "$ac_scorep_have_uncrustify" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_have_uncrustify${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_have_uncrustify${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_have_uncrustify${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${ac_scorep_have_uncrustify}" = "xyes"; then HAVE_UNCRUSTIFY_TRUE= HAVE_UNCRUSTIFY_FALSE='#' else HAVE_UNCRUSTIFY_TRUE='#' HAVE_UNCRUSTIFY_FALSE= fi #if test -z "$have_svnversion"; then # AC_CHECK_PROG([have_svnversion], [svnversion], [yes], [no],,) #fi # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DOXYGEN+:} false; then : $as_echo_n "(cached) " >&6 else case $DOXYGEN in [\\/]* | ?:[\\/]*) ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi DOXYGEN=$ac_cv_path_DOXYGEN if test -n "$DOXYGEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5 case "$DOXYGEN" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$DOXYGEN${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$DOXYGEN${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$DOXYGEN${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${DOXYGEN}" != "x"; then HAVE_DOXYGEN_TRUE= HAVE_DOXYGEN_FALSE='#' else HAVE_DOXYGEN_TRUE='#' HAVE_DOXYGEN_FALSE= fi have_doxygen_latex="no" if test -z "$HAVE_DOXYGEN_TRUE"; then : # Extract the first word of "dot", so it can be a program name with args. set dummy dot; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_have_dot+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$have_dot"; then ac_cv_prog_have_dot="$have_dot" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_dot="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_have_dot" && ac_cv_prog_have_dot="no" fi fi have_dot=$ac_cv_prog_have_dot if test -n "$have_dot"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_dot" >&5 case "$have_dot" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$have_dot${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$have_dot${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$have_dot${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "pdflatex", so it can be a program name with args. set dummy pdflatex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_have_pdflatex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$have_pdflatex"; then ac_cv_prog_have_pdflatex="$have_pdflatex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_pdflatex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_have_pdflatex" && ac_cv_prog_have_pdflatex="no" fi fi have_pdflatex=$ac_cv_prog_have_pdflatex if test -n "$have_pdflatex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_pdflatex" >&5 case "$have_pdflatex" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$have_pdflatex${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$have_pdflatex${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$have_pdflatex${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "makeindex", so it can be a program name with args. set dummy makeindex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_have_makeindex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$have_makeindex"; then ac_cv_prog_have_makeindex="$have_makeindex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_makeindex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_have_makeindex" && ac_cv_prog_have_makeindex="no" fi fi have_makeindex=$ac_cv_prog_have_makeindex if test -n "$have_makeindex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_makeindex" >&5 case "$have_makeindex" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$have_makeindex${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$have_makeindex${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$have_makeindex${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${have_pdflatex}" = xyes && test "x${have_makeindex}" = xyes; then have_doxygen_latex="yes" fi fi if test "x${have_doxygen_latex}" = xyes; then HAVE_DOXYGEN_LATEX_TRUE= HAVE_DOXYGEN_LATEX_FALSE='#' else HAVE_DOXYGEN_LATEX_TRUE='#' HAVE_DOXYGEN_LATEX_FALSE= fi # ac_scorep_doxygen_distdir may be passed in from upper level configure # will end up in 'USER_DOC_DIR = $(top_distdir)$(ac_scorep_doxygen_distdir)/doc' if test ! -n "$ac_scorep_doxygen_distdir"; then ac_scorep_doxygen_distdir="" fi if test "x${ac_scorep_git_controlled}" = xyes; then : ac_config_files="$ac_config_files doc/doxygen-user.cfg:doc/doxygen-user/doxygen-user.cfg.in" ac_config_files="$ac_config_files doc/doxygen-dev.cfg:doc/doxygen-dev/doxygen-dev.cfg.in" fi ## Autoconf supports changing the names of programs when installing them. In ## order to use these transformations, configure.ac must call the macro ## AC_ARG_PROGRAM. # implicitly called by ? #AC_ARG_PROGRAM # used for EXTRA_DIST in Makefile.am if test "x${ac_scorep_cross_compiling}" = "xyes"; then CROSS_BUILD_TRUE= CROSS_BUILD_FALSE='#' else CROSS_BUILD_TRUE='#' CROSS_BUILD_FALSE= fi # handle own package's subdir configures ax_config_subdir_dir_1="build-frontend" ax_config_subdir_args_1="${args} ac_scorep_platform=${ac_scorep_platform}" ax_config_subdirs="${ax_config_subdirs} build-frontend" # sed is needed for check target { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 case "$ac_cv_path_SED" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_cv_path_SED${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_cv_path_SED${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_cv_path_SED${as__std}" >&6 ;; esac; } SED="$ac_cv_path_SED" rm -f conftest.sed # Explicitly check for absolute path of awk for pomp2_parse_init_regions.awk # Extract the first word of "${AWK}", so it can be a program name with args. set dummy ${AWK}; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_awk_path+:} false; then : $as_echo_n "(cached) " >&6 else case $awk_path in [\\/]* | ?:[\\/]*) ac_cv_path_awk_path="$awk_path" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_awk_path="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_awk_path" && ac_cv_path_awk_path="no" ;; esac fi awk_path=$ac_cv_path_awk_path if test -n "$awk_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $awk_path" >&5 case "$awk_path" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$awk_path${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$awk_path${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$awk_path${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${awk_path}" = "xno"; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: ${as__red}error: in \`$ac_pwd':${as__std}" >&2;} as_fn_error $? "awk not found, but required.${as__std} ${as__red}See \`config.log' for more details" "$LINENO" 5; } fi OPARI2_AWK=${awk_path} ac_config_files="$ac_config_files Makefile src/config-common.h:build-config/common/config-common.h" ac_config_files="$ac_config_files test/c_test.sh" ac_config_files="$ac_config_files test/cxx_test.sh" ac_config_files="$ac_config_files test/f90_test.sh" ac_config_files="$ac_config_files test/f77_test.sh" ac_config_files="$ac_config_files test/awk_script_test.sh" ac_config_files="$ac_config_files test/awk_script_test.output:test/data/awk_script_test.out.in" ac_config_files="$ac_config_files build-frontend/pomp2-parse-init-regions.awk:src/opari-lib-dummy/pomp2_parse_init_regions.awk.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: ${as__yel}WARNING: cache variable $ac_var contains a newline${as__std}" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: info: updating cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: updating cache $cache_file${as__std}" >&2;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: info: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: not updating unwritable cache $cache_file${as__std}" >&2;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${GIT_CONTROLLED_TRUE}" && test -z "${GIT_CONTROLLED_FALSE}"; then as_fn_error $? "conditional \"GIT_CONTROLLED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 case "done" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}done${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}done${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}done${as__std}" >&6 ;; esac; } if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_UNCRUSTIFY_TRUE}" && test -z "${HAVE_UNCRUSTIFY_FALSE}"; then as_fn_error $? "conditional \"HAVE_UNCRUSTIFY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DOXYGEN_TRUE}" && test -z "${HAVE_DOXYGEN_FALSE}"; then as_fn_error $? "conditional \"HAVE_DOXYGEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DOXYGEN_LATEX_TRUE}" && test -z "${HAVE_DOXYGEN_LATEX_FALSE}"; then as_fn_error $? "conditional \"HAVE_DOXYGEN_LATEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CROSS_BUILD_TRUE}" && test -z "${CROSS_BUILD_FALSE}"; then as_fn_error $? "conditional \"CROSS_BUILD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: info: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: ${as__blu}info: creating $CONFIG_STATUS${as__std}" >&2;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # need to catch these variables, before unsetting them later : ${AS_COLOR:=$CLICOLOR}; export AS_COLOR : ${AS_COLOR_FORCE:=$CLICOLOR_FORCE}; export AS_COLOR_FORCE as__red= as__grn= as__yel= as__blu= as__mag= as__cya= as__gry= as__std= as__color=no if test "X$AS_COLOR_FORCE" = X0; then as__color=no; elif test "X$AS_COLOR_FORCE" = X1; then as__color=yes elif { test "X$TERM" != Xdumb || test "X$AS_COLOR" = X1; } && { test -t 1; } 2>/dev/null; then as__color=yes fi if test $as__color = yes; then as__red='' as__grn='' as__yel='' as__blu='' as__mag='' as__cya='' as__gry='' as__std='' fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: ${as__red}error: $2${as__std}" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by OPARI2 $as_me 2.0.10, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ OPARI2 config.status 2.0.10 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "doc/doxygen-user.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen-user.cfg:doc/doxygen-user/doxygen-user.cfg.in" ;; "doc/doxygen-dev.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen-dev.cfg:doc/doxygen-dev/doxygen-dev.cfg.in" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/config-common.h") CONFIG_FILES="$CONFIG_FILES src/config-common.h:build-config/common/config-common.h" ;; "test/c_test.sh") CONFIG_FILES="$CONFIG_FILES test/c_test.sh" ;; "test/cxx_test.sh") CONFIG_FILES="$CONFIG_FILES test/cxx_test.sh" ;; "test/f90_test.sh") CONFIG_FILES="$CONFIG_FILES test/f90_test.sh" ;; "test/f77_test.sh") CONFIG_FILES="$CONFIG_FILES test/f77_test.sh" ;; "test/awk_script_test.sh") CONFIG_FILES="$CONFIG_FILES test/awk_script_test.sh" ;; "test/awk_script_test.output") CONFIG_FILES="$CONFIG_FILES test/awk_script_test.output:test/data/awk_script_test.out.in" ;; "build-frontend/pomp2-parse-init-regions.awk") CONFIG_FILES="$CONFIG_FILES build-frontend/pomp2-parse-init-regions.awk:src/opari-lib-dummy/pomp2_parse_init_regions.awk.in" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: info: creating $ac_file" >&5 $as_echo "$as_me: ${as__blu}info: creating $ac_file${as__std}" >&2;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: ${as__yel}WARNING: $ac_file_inputs seems to ignore the --datarootdir setting${as__std}" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: ${as__yel}WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined${as__std}" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac case $ac_file$ac_mode in "test/c_test.sh":F) chmod +x test/c_test.sh ;; "test/cxx_test.sh":F) chmod +x test/cxx_test.sh ;; "test/f90_test.sh":F) chmod +x test/f90_test.sh ;; "test/f77_test.sh":F) chmod +x test/f77_test.sh ;; "test/awk_script_test.sh":F) chmod +x test/awk_script_test.sh ;; "build-frontend/pomp2-parse-init-regions.awk":F) \ chmod +x build-frontend/pomp2-parse-init-regions.awk ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # Execute subdir configures defined via AX_CONFIG_SUBDIR. # # Do not complain if ax_config_subdir_dir is missing, so a configure # script can configure whichever parts of a large source tree are # present. if test "x${no_recursion}" != xyes && test "x${ax_config_subdir_dir_1}" != x && test -d "${srcdir}/${ax_config_subdir_dir_1}"; then : ax_fn_config_subdir "${ax_config_subdir_dir_1}" "${ax_config_subdir_args_1}" fi # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: ${as__yel}WARNING: unrecognized options: $ac_unrecognized_opts${as__std}" >&2;} fi opari2-2.0.10/PaxHeaders/Makefile.am0000644000000000000000000000013215232670204014101 xustar0030 mtime=1785426052.139415949 30 atime=1785426052.231415405 30 ctime=1785426077.747264412 opari2-2.0.10/Makefile.am0000664000175100001440000001501715232670204014437 0ustar00builderusers## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen, Germany ## ## Copyright (c) 2009-2011, ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## ## Copyright (c) 2009-2011, 2019-2020, ## Technische Universitaet Dresden, Germany ## ## Copyright (c) 2009-2011, ## University of Oregon, Eugene, USA ## ## Copyright (c) 2009-2011, 2014-2015, 2017, ## Forschungszentrum Juelich GmbH, Germany ## ## Copyright (c) 2009-2011, ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Muenchen, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## ## file Makefile.am ## The SUBDIRS variable holds a list of subdirectories automake (recursivly) ## must build. SUBDIRS = $(subdirs) $(ax_config_subdirs) ## Options passed to aclocal to specify local macro directories. Although ## ACLOCAL_AMFLAGS should be replaced by AC_CONFIG_MACRO_DIRS, aclocal-1.13.4 ## doesn't honor the paths provided to AC_CONFIG_MACRO_DIRS. See ## https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21352 ACLOCAL_AMFLAGS = -I build-config/m4 -I build-config/common/m4 include build-config/common/Makefile.inc.am include doc/Makefile.inc.am include build-config/common/platforms.am ## Still, sometimes there are files that must be distributed, but which are not ## covered in the automatic rules. These files should be listed in the ## EXTRA_DIST variable. You can mention files from subdirectories in EXTRA_DIST. ## ## You can also mention a directory in EXTRA_DIST. In this case the entire ## directory will be recursively copied into the distribution. Please note that ## this will also copy everything in the directory, including CVS/RCS version ## control files. We recommend against using this feature. EXTRA_DIST += $(srcdir)/src/config.h \ $(srcdir)/src/config-custom.h \ $(srcdir)/test/replacePaths_c.awk \ $(srcdir)/test/replacePaths_f77.awk \ $(srcdir)/test/replacePaths_f90.awk \ $(srcdir)/doc/example/openmp/example.c \ $(srcdir)/doc/example/openmp/example.f90 \ $(srcdir)/doc/example/pomp/example.c \ $(srcdir)/doc/example/pomp/example.f90 \ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in \ $(srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in \ $(srcdir)/test/data \ $(srcdir)/THANKS \ $(srcdir)/OPEN_ISSUES if ! CROSS_BUILD EXTRA_DIST += $(srcdir)/build-frontend/configure.ac \ $(srcdir)/build-frontend/aclocal.m4 \ $(srcdir)/build-frontend/Makefile.am \ $(srcdir)/build-frontend/Makefile.in \ $(srcdir)/build-frontend/configure \ $(srcdir)/src/config-frontend.h.in endif doc_DATA = $(srcdir)/OPEN_ISSUES \ $(srcdir)/ChangeLog CLEANFILES += doc/doxygen-user/main.dox .PHONY: doc/doxygen-user/main.dox if GIT_CONTROLLED doc/doxygen-user/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ doc/doxygen-user/main_user_usage.dox \ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ doc/doxygen-user/main_user_linking.dox \ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ > doc/doxygen-user/main.dox ## The developer documentation is compiled of the user documentation ## and additional information for developers doc/doxygen-dev/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox $(AM_V_GEN)$(MKDIR_P) doc/doxygen-dev && \ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ $(srcdir)/doc/doxygen-dev/main_dev.dox.in \ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ doc/doxygen-user/main_user_usage.dox \ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ doc/doxygen-user/main_user_linking.dox \ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ $(srcdir)/doc/doxygen-dev/main_dev_parser.dox.in \ $(srcdir)/doc/doxygen-dev/main_dev_new-paradigm.dox.in \ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ > doc/doxygen-dev/main.dox doc/doxygen-user/main_user_usage.dox: $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ cat $(srcdir)/doc/doxygen-user/main_user_usage.dox.in \ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ $(srcdir)/doc/doxygen-user/main_user_usage-end.dox.in \ > doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox: $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ ( \ cat $(srcdir)/doc/doxygen-user/main_user_linking.dox.in \ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in; \ echo "\endverbatim"; \ ) > doc/doxygen-user/main_user_linking.dox else doc/doxygen-user/main.dox: # touch doc/doxygen-user/main.dox doc/doxygen-dev/main.dox: # touch doc/doxygen-dev/main.dox endif doxygen-dev: doc/doxygen-dev/main.dox $(MKDIR_P) doxygen-dev-doc/opari2/tags $(DOXYGEN) doc/doxygen-dev.cfg dist-hook: doc/doxygen-user/main.dox doxygen-user-generate $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2_usage.h $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2-config_usage.h clean-local: doxygen-user-clean rm -rf test/tmp uninstall-hook: doxygen-uninstall common-uninstall libexec_SCRIPTS = build-frontend/pomp2-parse-init-regions.awk # non-color automake only provides $(am__tty_colors) if tests are in use TESTS = opari2-2.0.10/PaxHeaders/Makefile.in0000644000000000000000000000013215232670210014107 xustar0030 mtime=1785426056.363390954 30 atime=1785426077.479265998 30 ctime=1785426077.743264435 opari2-2.0.10/Makefile.in0000664000175100001440000021173615232670210014453 0ustar00builderusers# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ############################################################################### # Create platform entries for EXTRA_DIST using e.g.: # cd build-config/common/platforms # for i in *; do echo " \$(srcdir)/build-config/common/platforms/$i \\"; done VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } DIST_COMMON = $(srcdir)/build-config/common/Makefile.inc.am \ $(srcdir)/doc/Makefile.inc.am \ $(srcdir)/build-config/common/platforms.am \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(top_srcdir)/doc/doxygen-user/doxygen-user.cfg.in \ $(top_srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in \ $(top_srcdir)/build-config/common/config-common.h \ $(top_srcdir)/test/c_test.sh.in \ $(top_srcdir)/test/cxx_test.sh.in \ $(top_srcdir)/test/f90_test.sh.in \ $(top_srcdir)/test/f77_test.sh.in \ $(top_srcdir)/test/awk_script_test.sh.in \ $(top_srcdir)/test/data/awk_script_test.out.in \ $(top_srcdir)/src/opari-lib-dummy/pomp2_parse_init_regions.awk.in \ $(top_srcdir)/build-config/test-driver AUTHORS COPYING \ ChangeLog INSTALL README THANKS build-config/config.guess \ build-config/config.sub build-config/install-sh \ build-config/missing $(top_srcdir)/build-config/config.guess \ $(top_srcdir)/build-config/config.sub \ $(top_srcdir)/build-config/install-sh \ $(top_srcdir)/build-config/missing @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@am__append_1 = beautify-recursive @GIT_CONTROLLED_TRUE@am__append_2 = doc/doxygen-project-number.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@am__append_3 = doc/doxygen-user-html.cfg doc/doxygen-user-at-make-time.cfg doxygen.err @CROSS_BUILD_FALSE@am__append_4 = $(srcdir)/build-frontend/configure.ac \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/aclocal.m4 \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/Makefile.am \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/Makefile.in \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/configure \ @CROSS_BUILD_FALSE@ $(srcdir)/src/config-frontend.h.in TESTS = subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/build-config/common/m4/ac_common_package.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_doxygen.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_git_controlled.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_sys_detection.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_toplevel_args.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_uncrustify.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_version_and_revision.m4 \ $(top_srcdir)/build-config/common/m4/afs_compiler_backend.m4 \ $(top_srcdir)/build-config/common/m4/afs_maintainer_mode.m4 \ $(top_srcdir)/build-config/common/m4/afs_summary.m4 \ $(top_srcdir)/build-config/common/m4/ax_config_subdir.m4 \ $(top_srcdir)/build-config/m4/opari2_compiler_and_flags.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = doc/doxygen-user.cfg doc/doxygen-dev.cfg \ src/config-common.h test/c_test.sh test/cxx_test.sh \ test/f90_test.sh test/f77_test.sh test/awk_script_test.sh \ test/awk_script_test.output \ build-frontend/pomp2-parse-init-regions.awk CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(docdir)" SCRIPTS = $(libexec_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @$(am__tty_colors); echo " GEN $${mgn}$@$$std"; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(doc_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope check recheck distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = .test am__test_logs1 = $(TESTS:=.log) TEST_LOGS = $(am__test_logs1:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-config/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AFS_PACKAGE_NAME = @AFS_PACKAGE_NAME@ AFS_PACKAGE_name = @AFS_PACKAGE_name@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DOXYGEN = @DOXYGEN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OPARI2_AWK = @OPARI2_AWK@ PACKAGE = @PACKAGE@ PACKAGE_BUGFIX = @PACKAGE_BUGFIX@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_MAJOR = @PACKAGE_MAJOR@ PACKAGE_MINOR = @PACKAGE_MINOR@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_SUFFIX = @PACKAGE_SUFFIX@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_scorep_doxygen_distdir = @ac_scorep_doxygen_distdir@ ac_scorep_have_uncrustify = @ac_scorep_have_uncrustify@ afs_srcdir = @afs_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ awk_path = @awk_path@ ax_config_subdirs = @ax_config_subdirs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ has_CC = @has_CC@ has_cc = @has_cc@ has_ftn = @has_ftn@ have_dot = @have_dot@ have_doxygen_latex = @have_doxygen_latex@ have_makeindex = @have_makeindex@ have_pdflatex = @have_pdflatex@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = $(subdirs) $(ax_config_subdirs) ACLOCAL_AMFLAGS = -I build-config/m4 -I build-config/common/m4 # Testing framework EXTRA_DIST = $(srcdir)/build-config/common/generate-config-backend-for-frontend.sh \ $(srcdir)/build-config/common/generate-library-version.sh \ $(srcdir)/build-config/common/generate-package-version.sh \ $(srcdir)/build-config/common/library_data.hpp \ $(srcdir)/common/utils/test/cutest/CuTest.c \ $(srcdir)/common/utils/test/cutest/CuTest.h \ $(srcdir)/common/utils/test/cutest/license.txt \ $(srcdir)/common/utils/test/cutest/README.txt \ $(srcdir)/build-config/common/process_arguments.awk \ $(srcdir)/build-config/common/platforms/compiler-frontend-gcc \ $(srcdir)/build-config/common/platforms/compiler-frontend-ibm \ $(srcdir)/build-config/common/platforms/compiler-frontend-intel \ $(srcdir)/build-config/common/platforms/compiler-frontend-oneapi \ $(srcdir)/build-config/common/platforms/compiler-frontend-pgi \ $(srcdir)/build-config/common/platforms/compiler-frontend-nvhpc \ $(srcdir)/build-config/common/platforms/compiler-frontend-clang \ $(srcdir)/build-config/common/platforms/compiler-frontend-aocc \ $(srcdir)/build-config/common/platforms/compiler-frontend-amdclang \ $(srcdir)/build-config/common/platforms/compiler-frontend-cray \ $(srcdir)/build-config/common/platforms/compiler-mpi-bullxmpi \ $(srcdir)/build-config/common/platforms/compiler-mpi-hp \ $(srcdir)/build-config/common/platforms/compiler-mpi-ibmpoe \ $(srcdir)/build-config/common/platforms/compiler-mpi-intel \ $(srcdir)/build-config/common/platforms/compiler-mpi-intel2 \ $(srcdir)/build-config/common/platforms/compiler-mpi-intel3 \ $(srcdir)/build-config/common/platforms/compiler-mpi-intelpoe \ $(srcdir)/build-config/common/platforms/compiler-mpi-lam \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpibull2 \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich2 \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich3 \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich4 \ $(srcdir)/build-config/common/platforms/compiler-mpi-openmpi \ $(srcdir)/build-config/common/platforms/compiler-mpi-openmpi3 \ $(srcdir)/build-config/common/platforms/compiler-mpi-platform \ $(srcdir)/build-config/common/platforms/compiler-mpi-scali \ $(srcdir)/build-config/common/platforms/compiler-mpi-sgimpt \ $(srcdir)/build-config/common/platforms/compiler-mpi-sgimptwrapper \ $(srcdir)/build-config/common/platforms/compiler-mpi-spectrum \ $(srcdir)/build-config/common/platforms/compiler-mpi-sun \ $(srcdir)/build-config/common/platforms/compiler-mpi-cray \ $(srcdir)/build-config/common/platforms/compiler-mpi-without \ $(srcdir)/build-config/common/platforms/compiler-shmem-openmpi \ $(srcdir)/build-config/common/platforms/compiler-shmem-openmpi3 \ $(srcdir)/build-config/common/platforms/compiler-shmem-openshmem \ $(srcdir)/build-config/common/platforms/compiler-shmem-sgimpt \ $(srcdir)/build-config/common/platforms/compiler-shmem-sgimptwrapper \ $(srcdir)/build-config/common/platforms/compiler-shmem-spectrum \ $(srcdir)/build-config/common/platforms/compiler-shmem-cray \ $(srcdir)/build-config/common/platforms/compiler-shmem-without \ $(srcdir)/build-config/common/platforms/compiler-nocross-gcc \ $(srcdir)/build-config/common/platforms/compiler-nocross-ibm \ $(srcdir)/build-config/common/platforms/compiler-nocross-intel \ $(srcdir)/build-config/common/platforms/compiler-nocross-oneapi \ $(srcdir)/build-config/common/platforms/compiler-nocross-pgi \ $(srcdir)/build-config/common/platforms/compiler-nocross-nvhpc \ $(srcdir)/build-config/common/platforms/compiler-nocross-clang \ $(srcdir)/build-config/common/platforms/compiler-nocross-aocc \ $(srcdir)/build-config/common/platforms/compiler-nocross-amdclang \ $(srcdir)/build-config/common/platforms/compiler-nocross-cray \ $(srcdir)/build-config/common/platforms/platform-backend-altix \ $(srcdir)/build-config/common/platforms/platform-backend-bgl \ $(srcdir)/build-config/common/platforms/platform-backend-bgp \ $(srcdir)/build-config/common/platforms/platform-backend-bgq \ $(srcdir)/build-config/common/platforms/platform-backend-crayxt \ $(srcdir)/build-config/common/platforms/platform-backend-crayxe \ $(srcdir)/build-config/common/platforms/platform-backend-crayxk \ $(srcdir)/build-config/common/platforms/platform-backend-crayxc \ $(srcdir)/build-config/common/platforms/platform-backend-craygeneric \ $(srcdir)/build-config/common/platforms/platform-backend-aix \ $(srcdir)/build-config/common/platforms/platform-backend-linux \ $(srcdir)/build-config/common/platforms/platform-backend-mac \ $(srcdir)/build-config/common/platforms/platform-backend-mic \ $(srcdir)/build-config/common/platforms/platform-backend-mingw \ $(srcdir)/build-config/common/platforms/platform-backend-solaris \ $(srcdir)/build-config/common/platforms/platform-backend-k \ $(srcdir)/build-config/common/platforms/platform-backend-fx10 \ $(srcdir)/build-config/common/platforms/platform-backend-fx100 \ $(srcdir)/build-config/common/platforms/platform-backend-user-provided \ $(srcdir)/build-config/common/platforms/platform-frontend-altix \ $(srcdir)/build-config/common/platforms/platform-frontend-bgl \ $(srcdir)/build-config/common/platforms/platform-frontend-bgp \ $(srcdir)/build-config/common/platforms/platform-frontend-bgq \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxt \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxe \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxk \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxc \ $(srcdir)/build-config/common/platforms/platform-frontend-craygeneric \ $(srcdir)/build-config/common/platforms/platform-frontend-aix \ $(srcdir)/build-config/common/platforms/platform-frontend-linux \ $(srcdir)/build-config/common/platforms/platform-frontend-mac \ $(srcdir)/build-config/common/platforms/platform-frontend-mic \ $(srcdir)/build-config/common/platforms/platform-frontend-mingw \ $(srcdir)/build-config/common/platforms/platform-frontend-solaris \ $(srcdir)/build-config/common/platforms/platform-frontend-k \ $(srcdir)/build-config/common/platforms/platform-frontend-fx10 \ $(srcdir)/build-config/common/platforms/platform-frontend-fx100 \ $(srcdir)/build-config/common/platforms/platform-frontend-user-provided \ $(srcdir)/build-config/common/platforms/platform-mpi-altix \ $(srcdir)/build-config/common/platforms/platform-mpi-bgl \ $(srcdir)/build-config/common/platforms/platform-mpi-bgp \ $(srcdir)/build-config/common/platforms/platform-mpi-bgq \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxt \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxe \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxk \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxc \ $(srcdir)/build-config/common/platforms/platform-mpi-craygeneric \ $(srcdir)/build-config/common/platforms/platform-mpi-aix \ $(srcdir)/build-config/common/platforms/platform-mpi-linux \ $(srcdir)/build-config/common/platforms/platform-mpi-mac \ $(srcdir)/build-config/common/platforms/platform-mpi-mic \ $(srcdir)/build-config/common/platforms/platform-mpi-solaris \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxk \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxe \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxt \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxc \ $(srcdir)/build-config/common/platforms/platform-shmem-craygeneric \ $(srcdir)/build-config/common/platforms/platform-shmem-user-provided \ $(srcdir)/build-config/common/platforms/platform-mpi-k \ $(srcdir)/build-config/common/platforms/platform-mpi-fx10 \ $(srcdir)/build-config/common/platforms/platform-mpi-fx100 \ $(srcdir)/build-config/common/platforms/platform-mpi-user-provided \ $(srcdir)/src/config.h $(srcdir)/src/config-custom.h \ $(srcdir)/test/replacePaths_c.awk \ $(srcdir)/test/replacePaths_f77.awk \ $(srcdir)/test/replacePaths_f90.awk \ $(srcdir)/doc/example/openmp/example.c \ $(srcdir)/doc/example/openmp/example.f90 \ $(srcdir)/doc/example/pomp/example.c \ $(srcdir)/doc/example/pomp/example.f90 \ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in \ $(srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in \ $(srcdir)/test/data $(srcdir)/THANKS $(srcdir)/OPEN_ISSUES \ $(am__append_4) BUILT_SOURCES = CLEANFILES = $(am__append_2) $(am__append_3) \ $(builddir)/user_provided_configure_args \ $(builddir)/mpi_compiler_suite \ $(builddir)/mpi_compiler_suite_to_source \ doc/doxygen-user/main.dox DISTCLEANFILES = $(builddir)/config.summary \ $(builddir)/@PACKAGE@.summary CONFIG_STATUS_DEPENDENCIES = $(srcdir)/build-config/VERSION CONFIGURE_DEPENDENCIES = $(srcdir)/build-config/VERSION SCOREP_RECURSIVE_TARGETS = $(am__append_1) check-build-recursive DOC_SRC_DIR = $(srcdir)/doc @GIT_CONTROLLED_TRUE@USER_DOC_DIR = $(top_distdir)$(ac_scorep_doxygen_distdir)/doc @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@OPARI2_V_DOXYGEN = $(opari2__v_DOXYGEN_@AM_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DOXYGEN_ = $(opari2__v_DOXYGEN_@AM_DEFAULT_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DOXYGEN_0 = @$(am__tty_colors); echo " DOXYGEN $${blu}$@$$std"; @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DOXYGEN_1 = @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@OPARI2_V_DEVNULL = $(opari2__v_DEVNULL_@AM_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DEVNULL_ = $(opari2__v_DEVNULL_@AM_DEFAULT_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DEVNULL_0 = >/dev/null 2>&1 @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DEVNULL_1 = @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@OPARI2_V_pdflatex = $(opari2__v_pdflatex_@AM_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@opari2__v_pdflatex_ = $(opari2__v_pdflatex_@AM_DEFAULT_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@opari2__v_pdflatex_0 = -interaction batchmode @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@opari2__v_pdflatex_1 = -interaction nonstopmode doc_DATA = $(srcdir)/OPEN_ISSUES \ $(srcdir)/ChangeLog libexec_SCRIPTS = build-frontend/pomp2-parse-init-regions.awk all: $(BUILT_SOURCES) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .log .test .trs am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/build-config/common/Makefile.inc.am $(srcdir)/doc/Makefile.inc.am $(srcdir)/build-config/common/platforms.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ if $(AM_V_P); then echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; fi; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ if $(AM_V_P); then echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; fi; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ if $(AM_V_P); then echo ' $(SHELL) ./config.status'; fi; \ $(SHELL) ./config.status;; \ *) \ if $(AM_V_P); then echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; fi; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(srcdir)/build-config/common/Makefile.inc.am $(srcdir)/doc/Makefile.inc.am $(srcdir)/build-config/common/platforms.am: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(AM_V_at)$(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(AM_V_at)$(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(AM_V_at)$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): doc/doxygen-user.cfg: $(top_builddir)/config.status $(top_srcdir)/doc/doxygen-user/doxygen-user.cfg.in cd $(top_builddir) && $(SHELL) ./config.status $@ doc/doxygen-dev.cfg: $(top_builddir)/config.status $(top_srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/config-common.h: $(top_builddir)/config.status $(top_srcdir)/build-config/common/config-common.h cd $(top_builddir) && $(SHELL) ./config.status $@ test/c_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/c_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/cxx_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/cxx_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/f90_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/f90_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/f77_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/f77_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/awk_script_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/awk_script_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/awk_script_test.output: $(top_builddir)/config.status $(top_srcdir)/test/data/awk_script_test.out.in cd $(top_builddir) && $(SHELL) ./config.status $@ build-frontend/pomp2-parse-init-regions.awk: $(top_builddir)/config.status $(top_srcdir)/src/opari-lib-dummy/pomp2_parse_init_regions.awk.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-libexecSCRIPTS: $(libexec_SCRIPTS) @$(NORMAL_INSTALL) @$(am__tty_colors); \ list='$(libexec_SCRIPTS)'; test -n "$(libexecdir)" || list=; \ if test -n "$$list"; then \ if $(AM_V_P); then echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ else echo " MKDIR $${mgn}$(DESTDIR)$(libexecdir)$$std"; fi; \ $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { for p in $$files; do \ $(am__strip_dir) \ if $(AM_V_P); then echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ else echo " INSTALL $${grn}$(DESTDIR)$(libexecdir)$$dir/$$f$$std"; fi; \ $(INSTALL_SCRIPT) $$p "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ done; } \ ; done uninstall-libexecSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(libexec_SCRIPTS)'; test -n "$(libexecdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(libexecdir)'; $(am__uninstall_files_from_dir) install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @$(am__tty_colors); \ list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ if $(AM_V_P); then echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ else echo " MKDIR $${mgn}$(DESTDIR)$(docdir)$$std"; fi; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ $(am__strip_dir) \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if $(AM_V_P); then echo " $(INSTALL_DATA) $$d$$p '$(DESTDIR)$(docdir)'"; \ else echo " INSTALL $${blu}$(DESTDIR)$(docdir)/$$f$$std"; fi; \ $(INSTALL_DATA) $$d$$p "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ if $(AM_V_P); then echo "Making $$target in $$subdir"; fi; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) $(AM_V_at)$(am__remove_distdir) $(AM_V_at)test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ if $(AM_V_P); then \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ fi; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -$(AM_V_at)test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz"; \ else echo " DIST $${grn}$(distdir).tar.gz$$std"; fi; \ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(AM_V_at)$(am__post_remove_distdir) dist-bzip2: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2"; \ else echo " DIST $${grn}$(distdir).tar.bz2$$std"; fi; \ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(AM_V_at)$(am__post_remove_distdir) dist-lzip: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz"; \ else echo " DIST $${grn}$(distdir).tar.lz$$std"; fi; \ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(AM_V_at)$(am__post_remove_distdir) dist-xz: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz"; \ else echo " DIST $${grn}$(distdir).tar.xz$$std"; fi; \ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(AM_V_at)$(am__post_remove_distdir) dist-tarZ: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z"; \ else echo " DIST $${grn}$(distdir).tar.Z$$std"; fi; \ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(AM_V_at)$(am__post_remove_distdir) dist-shar: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz"; \ else echo " DIST $${grn}$(distdir).shar.gz$$std"; fi; \ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(AM_V_at)$(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip @$(am__tty_colors); \ if $(AM_V_P); then echo "zip -rq $(distdir).zip '$(distdir)'"; \ else echo " DIST $${grn}$(distdir).zip$$std"; fi; \ zip -rq $(distdir).zip $(distdir) $(AM_V_at)$(am__post_remove_distdir) dist dist-all: $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir=':' $(AM_V_at)$(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(AM_V_at)$(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(AM_V_at)if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-docDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libexecSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-docDATA uninstall-libexecSCRIPTS @$(NORMAL_INSTALL) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip uninstall-am .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-TESTS check-am clean clean-cscope \ clean-generic clean-local cscope cscopelist-am ctags ctags-am \ dist dist-all dist-bzip2 dist-gzip dist-hook dist-lzip \ dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-generic distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-docDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libexecSCRIPTS install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-docDATA uninstall-hook \ uninstall-libexecSCRIPTS common-uninstall: rm -rf $(DESTDIR)$(datadir)/@PACKAGE@ ############################################################################### @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@beautify-sp: @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@ @$(am__cd) $(srcdir) && ./common/beautifier/beautify @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@beautify: beautify-recursive @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@beautify-clean: ############################################################################### ############################################################################### check-build-sp: $(BUILT_SOURCES) all-am $(check_PROGRAMS) $(check_LTLIBRARIES) check-build: check-build-recursive ############################################################################### $(SCOREP_RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-sp"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-sp" || exit 1; \ fi; test -z "$$fail" ############################################################################### @GIT_CONTROLLED_TRUE@append-to-citation-cff: @GIT_CONTROLLED_TRUE@ @echo "commit: $$(cat $(distdir)/build-config/REVISION)" >> $(distdir)/CITATION.cff @GIT_CONTROLLED_TRUE@ @echo "date-released: $$(date +%Y-%m-%d)" >> $(distdir)/CITATION.cff @GIT_CONTROLLED_TRUE@ @echo "version: $$($(srcdir)/build-config/common/generate-package-version.sh $(distdir)/build-config/VERSION)" >> $(distdir)/CITATION.cff @GIT_CONTROLLED_FALSE@append-to-citation-cff: doxygen-uninstall: rm -rf $(DESTDIR)$(docdir) @GIT_CONTROLLED_TRUE@doxygen-user-install: @GIT_CONTROLLED_TRUE@doxygen-user-generate: doxygen-user-pdf doxygen-user-html-compress copy-revision-file-to-dist @GIT_CONTROLLED_TRUE@update-revision: @GIT_CONTROLLED_TRUE@ @$(am__tty_colors); \ @GIT_CONTROLLED_TRUE@ if $(AM_V_P); then echo "cd $(srcdir) && git describe --always --dirty > 'build-config/REVISION'"; \ @GIT_CONTROLLED_TRUE@ else echo " GEN $${mgn}$(srcdir)/build-config/REVISION$$std"; fi; \ @GIT_CONTROLLED_TRUE@ cd $(srcdir) && git describe --always --dirty > "build-config/REVISION" @GIT_CONTROLLED_TRUE@copy-revision-file-to-dist: @GIT_CONTROLLED_TRUE@ @$(MKDIR_P) "$(distdir)/build-config/" @GIT_CONTROLLED_TRUE@ @cp -p "$(srcdir)/build-config/REVISION" "$(distdir)/build-config/" @GIT_CONTROLLED_TRUE@ @case `cat "$(distdir)/build-config/REVISION"` in *-dirty) \ @GIT_CONTROLLED_TRUE@ echo >&2 "WARNING: distribution does not match a single, unmodified revision.";; \ @GIT_CONTROLLED_TRUE@ esac @GIT_CONTROLLED_TRUE@doxygen-user-html-compress: @GIT_CONTROLLED_TRUE@ $(AM_V_at)if test -d "$(USER_DOC_DIR)/html"; then \ @GIT_CONTROLLED_TRUE@ cd "$(USER_DOC_DIR)"; tar czf html.tar.gz html; rm -rf html/; \ @GIT_CONTROLLED_TRUE@ fi @GIT_CONTROLLED_TRUE@doxygen-project-number: update-revision @GIT_CONTROLLED_TRUE@ $(AM_V_at)echo "PROJECT_NUMBER = \"@PACKAGE_VERSION@ (revision `cat $(srcdir)/build-config/REVISION`)\"" > doc/doxygen-project-number.cfg @GIT_CONTROLLED_TRUE@doxygen-user-clean: @GIT_CONTROLLED_TRUE@ rm -rf $(USER_DOC_DIR)/* @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@doxygen-user: doxygen-project-number doc/doxygen-user/main.dox doc/doxygen-user.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/tags" @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)echo "OUTPUT_DIRECTORY = $(USER_DOC_DIR)" > doc/doxygen-user-at-make-time.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)echo "GENERATE_TAGFILE = $(USER_DOC_DIR)/tags/@PACKAGE@.tag" >> doc/doxygen-user-at-make-time.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)cat doc/doxygen-project-number.cfg doc/doxygen-user-at-make-time.cfg doc/doxygen-user.cfg > doc/doxygen-user-html.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/html" @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)cp $(abs_srcdir)/doc/images/* $(USER_DOC_DIR)/html @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ else echo "QUIET = YES"; fi >>doc/doxygen-user-html.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-html.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_FALSE@doxygen-user: @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_FALSE@ echo "WARNING: doxygen not available. Cannot generate documentation." >&2 @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@doxygen-user-pdf: doxygen-user @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)cat doc/doxygen-user-html.cfg > doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)echo "ENABLED_SECTIONS = LATEX" >> doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)echo "GENERATE_HTML = NO" >> doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)cp $(DOC_SRC_DIR)/license.tex $(USER_DOC_DIR)/pdf/ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ -$(AM_V_at)cp $(DOC_SRC_DIR)/images/project_logo.pdf $(USER_DOC_DIR)/pdf/ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)echo "LATEX_CMD_NAME = \"pdflatex -file-line-error $(OPARI2_V_pdflatex)\"" >>doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ else echo "QUIET = YES"; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ echo "MAKEINDEX_CMD_NAME = \"makeindex -q\""; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ fi >>doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)cd "$(USER_DOC_DIR)/pdf" && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ make $(OPARI2_V_DEVNULL) && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ mv refman.pdf ../ && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ rm -f * && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ mv ../refman.pdf @PACKAGE@.pdf @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_FALSE@doxygen-user-pdf: doxygen-user @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_FALSE@ echo "WARNING: pdflatex not available. Cannot generate doxygen pdf documentation." >&2 @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_FALSE@ if test -d "$(USER_DOC_DIR)/pdf"; then rm -rf "$(USER_DOC_DIR)/pdf"; fi @GIT_CONTROLLED_FALSE@doxygen-user-clean: @GIT_CONTROLLED_FALSE@doxygen-user-generate: @GIT_CONTROLLED_FALSE@doxygen-user-pdf: @GIT_CONTROLLED_FALSE@doxygen-user-install: @GIT_CONTROLLED_FALSE@ $(AM_V_at)if test -f "$(DOC_SRC_DIR)/html.tar.gz"; then \ @GIT_CONTROLLED_FALSE@ $(MKDIR_P) $(DESTDIR)$(docdir); \ @GIT_CONTROLLED_FALSE@ $(INSTALL_DATA) $(DOC_SRC_DIR)/html.tar.gz $(DESTDIR)$(docdir)/html.tar.gz; \ @GIT_CONTROLLED_FALSE@ cd $(DESTDIR)$(docdir); \ @GIT_CONTROLLED_FALSE@ tar xzf html.tar.gz; \ @GIT_CONTROLLED_FALSE@ rm -f html.tar.gz; \ @GIT_CONTROLLED_FALSE@ fi @GIT_CONTROLLED_FALSE@ $(AM_V_at)if test -d "$(DOC_SRC_DIR)"; then \ @GIT_CONTROLLED_FALSE@ cd $(DOC_SRC_DIR); \ @GIT_CONTROLLED_FALSE@ dirs="pdf tags"; \ @GIT_CONTROLLED_FALSE@ cd -; \ @GIT_CONTROLLED_FALSE@ for i in $$dirs; do \ @GIT_CONTROLLED_FALSE@ if test -d "$(DOC_SRC_DIR)/$$i"; then \ @GIT_CONTROLLED_FALSE@ $(MKDIR_P) $(DESTDIR)$(docdir)/$$i; \ @GIT_CONTROLLED_FALSE@ cd $(DOC_SRC_DIR)/$$i; \ @GIT_CONTROLLED_FALSE@ files=`find . -type f`; \ @GIT_CONTROLLED_FALSE@ cd -; \ @GIT_CONTROLLED_FALSE@ for j in $$files; do \ @GIT_CONTROLLED_FALSE@ $(INSTALL_DATA) $(DOC_SRC_DIR)/$$i/$$j $(DESTDIR)$(docdir)/$$i/$$j; \ @GIT_CONTROLLED_FALSE@ done; \ @GIT_CONTROLLED_FALSE@ fi; \ @GIT_CONTROLLED_FALSE@ done; \ @GIT_CONTROLLED_FALSE@ fi @GIT_CONTROLLED_FALSE@copy-revision-file-to-dist: ############################################################################### .PHONY: doc/doxygen-user/main.dox @GIT_CONTROLLED_TRUE@doc/doxygen-user/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_usage.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_linking.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ @GIT_CONTROLLED_TRUE@ > doc/doxygen-user/main.dox @GIT_CONTROLLED_TRUE@doc/doxygen-dev/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-dev && \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-dev/main_dev.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_usage.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_linking.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-dev/main_dev_parser.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-dev/main_dev_new-paradigm.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ @GIT_CONTROLLED_TRUE@ > doc/doxygen-dev/main.dox @GIT_CONTROLLED_TRUE@doc/doxygen-user/main_user_usage.dox: @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_usage.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_usage-end.dox.in \ @GIT_CONTROLLED_TRUE@ > doc/doxygen-user/main_user_usage.dox @GIT_CONTROLLED_TRUE@doc/doxygen-user/main_user_linking.dox: @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ @GIT_CONTROLLED_TRUE@ ( \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_linking.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in; \ @GIT_CONTROLLED_TRUE@ echo "\endverbatim"; \ @GIT_CONTROLLED_TRUE@ ) > doc/doxygen-user/main_user_linking.dox @GIT_CONTROLLED_FALSE@doc/doxygen-user/main.dox: # touch doc/doxygen-user/main.dox @GIT_CONTROLLED_FALSE@doc/doxygen-dev/main.dox: # touch doc/doxygen-dev/main.dox doxygen-dev: doc/doxygen-dev/main.dox $(MKDIR_P) doxygen-dev-doc/opari2/tags $(DOXYGEN) doc/doxygen-dev.cfg dist-hook: doc/doxygen-user/main.dox doxygen-user-generate $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2_usage.h $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2-config_usage.h clean-local: doxygen-user-clean rm -rf test/tmp uninstall-hook: doxygen-uninstall common-uninstall # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: opari2-2.0.10/PaxHeaders/test0000644000000000000000000000013215232670236012754 xustar0030 mtime=1785426078.115262235 30 atime=1785426082.655235368 30 ctime=1785426078.115262235 opari2-2.0.10/test/0000775000175100001440000000000015232670236013363 5ustar00builderusersopari2-2.0.10/test/PaxHeaders/jacobi_f77_test.sh.in0000644000000000000000000000013215232670204016736 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.115262235 opari2-2.0.10/test/jacobi_f77_test.sh.in0000664000175100001440000000422415232670204017272 0ustar00builderusers#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CC="@CC@" F77="@F77@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" FFLAGS="@FFLAGS@" OPENMP="@OPENMP_FFLAGS@" rm -rf $test_dir/jacobi/F77 mkdir -p $test_dir/jacobi/F77 cp -r $test_data_dir/jacobi/F77/jacobi.f $test_dir/jacobi/F77 cp -r $test_data_dir/jacobi/F77/main.f $test_dir/jacobi/F77 cd $test_dir/jacobi/F77 #make instrument $OPARI2 main.f $OPARI2 jacobi.f #make compile $F77 -I$INCDIR $OPENMP $FFLAGS -c jacobi.mod.F $F77 -I$INCDIR $OPENMP $FFLAGS -c main.mod.F #make build @NM@ jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script`> pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $F77 $OPENMP $FFLAGS pomp_init_file.o jacobi.mod.o main.mod.o $LDFLAGS -o jacobi$EXEEXT #make run OMP_NUM_THREADS=4 ./jacobi$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/F77/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F77/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F77/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F77/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.10/test/PaxHeaders/jacobi_f90_test.sh.in0000644000000000000000000000013215232670204016731 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.111262258 opari2-2.0.10/test/jacobi_f90_test.sh.in0000664000175100001440000000465515232670204017275 0ustar00builderusers#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CC="@CC@" FC="@FC@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" FCFLAGS="@FCFLAGS@" OPENMP="@OPENMP_FCFLAGS@" rm -rf $test_dir/jacobi/F mkdir -p $test_dir/jacobi/F cp -r $test_data_dir/jacobi/F/jacobi.F90 $test_dir/jacobi/F cp -r $test_data_dir/jacobi/F/main.F90 $test_dir/jacobi/F cp -r $test_data_dir/jacobi/F/VariableDef.f90 $test_dir/jacobi/F #cp @srcdir@/../src/opari-lib-dummy/pomp_lib.h $test_dir/jacobi/F/ #cp @srcdir@/../src/opari-lib-dummy/opari_omp.h $test_dir/jacobi/F/ cd $test_dir/jacobi/F #make instrument $OPARI2 main.F90 $OPARI2 jacobi.F90 $OPARI2 VariableDef.f90 #make compile $FC -I$INCDIR $OPENMP $FCFLAGS -c VariableDef.mod.F90 $FC -I$INCDIR $OPENMP $FCFLAGS -c jacobi.mod.F90 $FC -I$INCDIR $OPENMP $FCFLAGS -c main.mod.F90 #make build @NM@ jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script`> pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $FC $OPENMP $FCFLAGS pomp_init_file.o jacobi.mod.o main.mod.o VariableDef.mod.o $LDFLAGS -o jacobi$EXEEXT #make run OMP_NUM_THREADS=4 ./jacobi$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/F/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.10/test/PaxHeaders/jacobi_c++_test.sh.in0000644000000000000000000000013215232670204016703 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.111262258 opari2-2.0.10/test/jacobi_c++_test.sh.in0000664000175100001440000000455615232670204017247 0ustar00builderusers#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CXX="@CXX@" CC="@CC@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" OPENMP="@OPENMP_CXXFLAGS@" CXXFLAGS="@CXXFLAGS@" rm -rf $test_dir/jacobi/C++ mkdir -p $test_dir/jacobi/C++ mkdir -p $test_dir/jacobi/C++/opari2 cp -r $test_data_dir/jacobi/C++/jacobi.cpp $test_dir/jacobi/C++/ cp -r $test_data_dir/jacobi/C++/jacobi.h $test_dir/jacobi/C++/ cp -r $test_data_dir/jacobi/C++/main.cpp $test_dir/jacobi/C++/ cp @abs_srcdir@/../include/opari2/pomp2_lib.h $test_dir/jacobi/C++/opari2/ cd $test_dir/jacobi/C++ #make instrument $OPARI2 main.cpp $OPARI2 jacobi.cpp #make compile $CXX -I$INCDIR $OPENMP $CXXFLAGS -c main.mod.cpp $CXX -I$INCDIR $OPENMP $CXXFLAGS -c jacobi.mod.cpp #make build @NM@ jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script` > pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $CXX $OPENMP $CXXFLAGS pomp_init_file.o jacobi.mod.o main.mod.o $LDFLAGS -o jacobi.$EXEEXT #make run OMP_NUM_THREADS=4 ./jacobi.$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/C++/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C++/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C++/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C++/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.10/test/PaxHeaders/jacobi_c_test.sh.in0000644000000000000000000000013215232670204016555 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.111262258 opari2-2.0.10/test/jacobi_c_test.sh.in0000664000175100001440000000445615232670204017120 0ustar00builderusers#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CC="@CC@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" OPENMP="@OPENMP_CFLAGS@" CFLAGS="@CFLAGS@" NM="`$OPARI2_CONFIG --nm`" rm -rf $test_dir/jacobi/C mkdir -p $test_dir/jacobi/C mkdir -p $test_dir/jacobi/C/opari2 cp -r $test_data_dir/jacobi/C/jacobi.c $test_dir/jacobi/C/ cp -r $test_data_dir/jacobi/C/jacobi.h $test_dir/jacobi/C/ cp -r $test_data_dir/jacobi/C/main.c $test_dir/jacobi/C/ cp @abs_srcdir@/../include/opari2/pomp2_lib.h $test_dir/jacobi/C/opari2 cd $test_dir/jacobi/C # instrument $OPARI2 main.c $OPARI2 jacobi.c # compile $CC -I$INCDIR $OPENMP $CFLAGS -c main.mod.c $CC -I$INCDIR $OPENMP $CFLAGS -c jacobi.mod.c #build $NM jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script`> pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $CC $OPENMP $CFLAGS pomp_init_file.o jacobi.mod.o main.mod.o $LDFLAGS -o jacobi$EXEEXT #run OMP_NUM_THREADS=4 ./jacobi$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/C/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.10/test/PaxHeaders/Makefile.inc.am0000644000000000000000000000013215232670204015630 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426078.083262424 opari2-2.0.10/test/Makefile.inc.am0000664000175100001440000000243515232670204016166 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # RWTH Aachen University, Germany # # Copyright (c) 2009-2011, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # # Copyright (c) 2009-2011, # Technische Universitaet Dresden, Germany # # Copyright (c) 2009-2011, # University of Oregon, Eugene, USA # # Copyright (c) 2009-2011, 2021, # Forschungszentrum Juelich GmbH, Germany # # Copyright (c) 2009-2011, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # # Copyright (c) 2009-2011, # Technische Universitaet Muenchen, Germany # # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. ## -*- mode: makefile -*- #check_PROGRAMS += TESTS += $(SRC_ROOT)test/c_test.sh TESTS += $(SRC_ROOT)test/cxx_test.sh TESTS += $(SRC_ROOT)test/f90_test.sh TESTS += $(SRC_ROOT)test/f77_test.sh TESTS += $(SRC_ROOT)test/awk_script_test.sh if HAVE_OPENMP_SUPPORT TESTS += $(SRC_ROOT)test/jacobi_c_test.sh TESTS += $(SRC_ROOT)test/jacobi_c++_test.sh if FORTRAN_SUPPORT_ALLOCATABLE if SCOREP_HAVE_FC TESTS += $(SRC_ROOT)test/jacobi_f90_test.sh endif if SCOREP_HAVE_F77 TESTS += $(SRC_ROOT)test/jacobi_f77_test.sh endif endif endif opari2-2.0.10/test/PaxHeaders/replacePaths_f90.awk0000644000000000000000000000013215232670204016621 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426077.983263016 opari2-2.0.10/test/replacePaths_f90.awk0000775000175100001440000000503415232670204017160 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. { if(match($0,"sscl=")){ line = " " for(i = 1; i <= NF; i++){ source = $i if(match($i,"\"//&")){ # ^\"")){ # opari2 splits the ctc-string into multiple lines, for # comparison to reference data we put this into one line while(match(source, "\"//&")){ # this is nasty, by getting a new line, we have to reset # the record counter i to 1 so we don't miss the closing # bracket at the end of the last line getline i = 1 sub(" \"", "", $1) source = source $1 sub("\"//&\"", "", source) } #remove full path gsub("escl=([^/]*/)*","escl=",source) gsub("sscl=([^/]*/)*","sscl=",source) #remove old length sub("\"[0-9a-z]*","\"", source) #insert new length sub("\"", "\""length(source)-2, source) line = line " " source } else{ line = line " " $i } } print line } else if(match($0,"Init_reg")){ #remove the timestamp based region identifier gsub("Init_reg_[0-9a-z_]+","Init_reg_000",$0) print $0 } else if(match($0,"#line")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } # else if(match($0,"get_max_threads")){ #remove timestamp based function specifier # gsub("pomp_get_max_threads[0-9a-z_]*", "pomp_get_max_threads000", $0) # print $0 # } else if(match($0,"/cb")){ #remove timestamp based common block identifier gsub("cb[0-9a-z_]*", "cb000", $0) print $0 } else if(match($0,"LEN=")){ gsub("LEN=[0-9a-z]*", "LEN=999", $0) print $0 } else{ print $0 } } opari2-2.0.10/test/PaxHeaders/replacePaths_f77.awk0000644000000000000000000000013215232670204016626 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426077.983263016 opari2-2.0.10/test/replacePaths_f77.awk0000775000175100001440000000571115232670204017167 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. { if(match($0,"sscl=")){ line = " " for(i = 1; i <= NF; i++){ source = $i if(match($i,"\"//")){ # opari2 splits the ctc-string into multiple lines, for # comparison to reference data we put this into one line while(match(source, "\"//")){ # this is nasty, by getting a new line, we have to reset # the record counter i to 1 so we don't miss the closing # bracket at the end of the last line getline i = 1 sub(" \"", "", $1) source = source $1 sub("\"//&\"", "", source) } # remove full path gsub("escl=([^/]*/)*","escl=",source) gsub("sscl=([^/]*/)*","sscl=",source) # remove old length sub("\"[0-9a-z]*","\"", source) # insert new length sub("\"", "\""length(source)-2, source) line = line " " source } else{ line = line " " $i } } # now for fortran77 we split the line again while(length(line) > 66){ subline = substr(line, 1, 66) print subline"\"//" line = " &\"" substr(line, 67) } print line # splitindex = match(line,"Type=")+5 # print "splitindex=" splitindex "for " line # lineRepl = substr(line, 0, splintindex-1) "\"//\n &\"" substr(line, splitindex) # line = lineRepl # print lineRepl } else if(match($0,"Init_reg")){ #remove the timestamp based region identifier gsub("Init_reg_[0-9a-z_]+","Init_reg_000",$0) print $0 } else if(match($0,"#line")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } # else if(match($0,"get_max_threads")){ #remove timestamp based function specifier # gsub("pomp_get_max_threads[0-9a-z_]*", "pomp_get_max_threads000", $0) # print $0 # } else if(match($0,"/cb")){ #remove timestamp based common block identifier gsub("cb[0-9a-z_]*", "cb000", $0) print $0 } else if(match($0,"CHARACTER*")){ gsub("CHARACTER\\*[0-9a-z]*", "CHARACTER*999", $0) print $0 } else{ print $0 } } opari2-2.0.10/test/PaxHeaders/replacePaths_c.awk0000644000000000000000000000013215232670204016445 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426077.979263039 opari2-2.0.10/test/replacePaths_c.awk0000775000175100001440000000303515232670204017003 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. { if(match($0,"sscl=")){ line = " " for(i = 1; i <= NF; i++){ if(match($i,"^\"")){ #remove full path gsub("escl=([^/]*/)*","escl=",$i) gsub("sscl=([^/]*/)*","sscl=",$i) #remove old length sub("\"[0-9a-z]*","\"", $i) #insert new length sub("\"", "\""length($i)-1, $i) } line = line " " $i } print line } else if(match($0,"Init_reg")){ #remove the timestamp based region identifier gsub("Init_reg_[0-9a-z_]+","Init_reg_000",$0) print $0 } else if(match($0,"#line")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } else if(match($0,"#include") && match($0,"opari.inc")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } else{ print $0 } } opari2-2.0.10/test/PaxHeaders/awk_script_test.sh.in0000644000000000000000000000013215232670204017172 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.779264223 opari2-2.0.10/test/awk_script_test.sh.in0000664000175100001440000000100115232670204017514 0ustar00builderusers#!/bin/sh set -e test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data AWK_SCRIPT="@abs_builddir@/../build-frontend/pomp2-parse-init-regions.awk" $AWK_SCRIPT < $test_data_dir/awk_script_test.input > $test_dir/awk_script.out if diff $test_dir/../awk_script_test.output $test_dir/awk_script.out > /dev/null then true else echo "-------- ERROR: in awk script output --------" diff $test_dir/../awk_script_test.output $test_dir/awk_script.out cd $opari_dir exit fi opari2-2.0.10/test/PaxHeaders/f77_test.sh.in0000644000000000000000000000013215232670204015427 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426077.779264223 opari2-2.0.10/test/f77_test.sh.in0000775000175100001440000000606215232670204015770 0ustar00builderusers#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ cp $test_data_dir/test*.f $test_dir/ if [ ! -f $test_dir/replacePaths_f77.awk ]; then cp $test_data_dir/../replacePaths_f77.awk $test_dir/ fi cd $test_dir for file in test*.f do base=`basename $file .f` if [ -n "`echo $file | grep free`" ] then echo " $file ..." $opari_dir/opari2 --free-form $file || exit bases=$base elif [ -n "`echo $file | grep disable`" ] then for disable_construct in atomic critical flush locks master ordered single sync task all do echo " $file testing --disable=omp:"$disable_construct" ..." $opari_dir/opari2 --disable=omp:$disable_construct $file $base.$disable_construct.mod.F || exit mv $base.f.opari.inc $base.$disable_construct.f.opari.inc bases=$bases" "$base.$disable_construct done echo " $file testing --disable=omp ..." $opari_dir/opari2 --disable=omp $file $base.omp.mod.F || exit mv $base.f.opari.inc $base.omp.f.opari.inc bases=$bases" "$base.omp elif [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file $base.mod.F || exit bases=$bases" "$base else echo " $file ..." $opari_dir/opari2 $file || exit bases=$base fi for base in $bases do # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_f77.awk $base.mod.F > $base.mod.F.tmp` `mv $base.mod.F.tmp $base.mod.F` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_f77.awk $base.f.opari.inc > $base.f.opari.inc.tmp` `mv $base.f.opari.inc.tmp $base.f.opari.inc` if diff -u $test_data_dir/$base.f.out $base.mod.F > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.f.out $base.mod.F error="true" continue fi if diff -u $test_data_dir/$base.f.opari.inc.out $base.f.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.f.opari.inc.out $base.f.opari.inc error="true" continue fi done done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.10/test/PaxHeaders/f90_test.sh.in0000644000000000000000000000013215232670204015422 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426077.775264246 opari2-2.0.10/test/f90_test.sh.in0000775000175100001440000000434115232670204015761 0ustar00builderusers#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ cp $test_data_dir/test*.f90 $test_dir/ if [ ! -f $test_dir/replacePaths_f90.awk ]; then cp $test_data_dir/../replacePaths_f90.awk $test_dir/ fi cd $test_dir for file in test*.f90 do base=`basename $file .f90` if [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file $base.mod.F90 || exit else echo " $file ..." $opari_dir/opari2 --omp-task-untied=keep,no-warn $file || exit fi # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_f90.awk $base.mod.F90 > $base.mod.F90.tmp` `mv $base.mod.F90.tmp $base.mod.F90` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_f90.awk $base.f90.opari.inc > $base.f90.opari.inc.tmp` `mv $base.f90.opari.inc.tmp $base.f90.opari.inc` if diff -u $test_data_dir/$base.f90.out $base.mod.F90 > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.f90.out $base.mod.F90 error="true" continue fi if diff -u $test_data_dir/$base.f90.opari.inc.out $base.f90.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.f90.opari.inc.out $base.f90.opari.inc error="true" continue fi done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.10/test/PaxHeaders/cxx_test.sh.in0000644000000000000000000000013215232670204015626 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.775264246 opari2-2.0.10/test/cxx_test.sh.in0000664000175100001440000000534015232670204016162 0ustar00builderusers#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # RWTH Aachen University, Germany # # Copyright (c) 2009-2011, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # # Copyright (c) 2009-2011, # Technische Universitaet Dresden, Germany # # Copyright (c) 2009-2011, # University of Oregon, Eugene, USA # # Copyright (c) 2009-2011, 2021, # Forschungszentrum Juelich GmbH, Germany # # Copyright (c) 2009-2011, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # # Copyright (c) 2009-2011, # Technische Universitaet Muenchen, Germany # # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ #echo $test_data_dir #echo $test_dir cp $test_data_dir/test*.cpp $test_dir/ if [ ! -f $test_dir/replacePaths_c.awk ]; then cp $test_data_dir/../replacePaths_c.awk $test_dir/ fi cd $test_dir for file in `ls *.cpp | grep -v mod` do base=`basename $file .cpp` if [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file || exit elif [ -n "`echo $file | grep prep`" ] then echo " $file testing --preprocessed ..." $opari_dir/opari2 --preprocessed $file || exit elif [ -n "`echo $file | grep remove-task`" ] then echo " $file testing --omp-task=remove ..." $opari_dir/opari2 --omp-task=remove --omp-task-untied=no-warn $file || exit else echo " $file ..." $opari_dir/opari2 --omp-task-untied=keep,no-warn $file || exit fi # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_c.awk $base.mod.cpp > $base.mod.cpp.tmp` `mv $base.mod.cpp.tmp $base.mod.cpp` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_c.awk $base.cpp.opari.inc > $base.cpp.opari.inc.tmp` `mv $base.cpp.opari.inc.tmp $base.cpp.opari.inc` if diff -u $test_data_dir/$base.cpp.out $base.mod.cpp > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.cpp.out $base.mod.cpp error="true" continue fi if diff -u $test_data_dir/$base.cpp.opari.inc.out $base.cpp.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.cpp.opari.inc.out $base.cpp.opari.inc error="true" continue fi done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.10/test/PaxHeaders/c_test.sh.in0000644000000000000000000000013215232670204015246 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.775264246 opari2-2.0.10/test/c_test.sh.in0000664000175100001440000000474415232670204015611 0ustar00builderusers#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ #echo $test_data_dir #echo $test_dir cp $test_data_dir/test*.c $test_dir/ if [ ! -f $test_dir/replacePaths_c.awk ]; then cp $test_data_dir/../replacePaths_c.awk $test_dir/ fi cd $test_dir for file in `ls *.c | grep -v mod` do base=`basename $file .c` if [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file || exit elif [ -n "`echo $file | grep prep`" ] then echo " $file testing --preprocessed ..." $opari_dir/opari2 --preprocessed $file || exit elif [ -n "`echo $file | grep remove-task`" ] then echo " $file testing --omp-task=remove ..." $opari_dir/opari2 --omp-task=remove --omp-task-untied=no-warn $file || exit else echo " $file ..." $opari_dir/opari2 --omp-task-untied=keep,no-warn $file || exit fi # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_c.awk $base.mod.c > $base.mod.c.tmp` `mv $base.mod.c.tmp $base.mod.c` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_c.awk $base.c.opari.inc > $base.c.opari.inc.tmp` `mv $base.c.opari.inc.tmp $base.c.opari.inc` if diff -u $test_data_dir/$base.c.out $base.mod.c > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.c.out $base.mod.c error="true" continue fi if diff -u $test_data_dir/$base.c.opari.inc.out $base.c.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.c.opari.inc.out $base.c.opari.inc error="true" continue fi done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.10/test/PaxHeaders/data0000644000000000000000000000013215232670204013660 xustar0030 mtime=1785426052.219415476 30 atime=1785426082.655235368 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/0000775000175100001440000000000015232670204014267 5ustar00builderusersopari2-2.0.10/test/data/PaxHeaders/test9.f90.out0000644000000000000000000000013215232670204016133 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test9.f90.out0000664000175100001440000000050515232670204016465 0ustar00builderusers #line 1 "test9.f90" PROGRAM PROGRAM include 'test9.f90.opari.inc' #line 3 "test9.f90" CALL SUBROUTINE END PROGRAM SUBROUTINE SUBROUTINE include 'test9.f90.opari.inc' #line 9 "test9.f90" CHARACTER(len=32), PARAMETER :: FUNCTION = 'Check whether OPARI2 is broken' PRINT*, FUNCTION END SUBROUTINE opari2-2.0.10/test/data/PaxHeaders/test9.f90.opari.inc.out0000644000000000000000000000013215232670204020014 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test9.f90.opari.inc.out0000664000175100001440000000024715232670204020351 0ustar00builderusers integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock opari2-2.0.10/test/data/PaxHeaders/test9.f900000644000000000000000000000013215232670204015325 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test9.f900000664000175100001440000000030015232670204015650 0ustar00builderusersPROGRAM PROGRAM CALL SUBROUTINE END PROGRAM SUBROUTINE SUBROUTINE CHARACTER(len=32), PARAMETER :: FUNCTION = 'Check whether OPARI2 is broken' PRINT*, FUNCTION END SUBROUTINE opari2-2.0.10/test/data/PaxHeaders/test9.c.out0000644000000000000000000000013215232670204015757 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test9.c.out0000664000175100001440000001207615232670204016317 0ustar00builderusers#include "test9.c.opari.inc" #line 1 "test9.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * @brief Tests proper treatment of offload regions. */ __declspec( target( mic ) ) int global_1 = 5; __declspec( target( mic ) ) int bar(); __declspec( target( mic ) ) int foo() { int i = 0; #pragma omp parallel { i++; } return ++global_1; } __attribute__( ( target( mic ) ) ) int global_2 = 0; __attribute__( ( target( mic ) ) ) int f() { int i = 0; { POMP2_Atomic_enter( &opari2_region_1, opari2_ctc_1 ); #line 35 "test9.c" #pragma omp atomic global_2 += 1; POMP2_Atomic_exit( &opari2_region_1 ); } #line 37 "test9.c" } __attribute__( ( target( mic ) ) ) void g(); #pragma offload_attribute( push, target( mic ) ) void test(); #pragma offload_attribute( pop ) void test() { int i; { POMP2_Sections_enter( &opari2_region_2, opari2_ctc_2 ); #line 51 "test9.c" #pragma omp sections nowait { i++; #line 54 "test9.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 55 "test9.c" i++; POMP2_Section_end( &opari2_region_2 ); } #line 56 "test9.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 57 "test9.c" i++; POMP2_Section_end( &opari2_region_2 ); } #line 58 "test9.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_2 ); } #line 59 "test9.c" } int main( int argc, char** argv ) { int i, j, k; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_3, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_3 ); #line 67 "test9.c" #pragma omp parallel POMP2_DLIST_00003 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_3 ); { POMP2_For_enter( &opari2_region_3, opari2_ctc_3 ); #line 67 "test9.c" #pragma omp for nowait for ( i = 0; i < 10; i++ ) { j++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_3, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_3, pomp2_old_task ); } POMP2_For_exit( &opari2_region_3 ); } POMP2_Parallel_end( &opari2_region_3 ); } POMP2_Parallel_join( &opari2_region_3, pomp2_old_task ); } #line 72 "test9.c" #pragma offload target( mic ) in( global ) out( i, global ) { i = foo(); #pragma omp for for ( j = 0; j < 10; j++ ) { k ++; } } #pragma offload target( mic ) in( global ) out( i, global ) { i = bar(); } #pragma offload_attribute( push, target( mic ) ) { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_4, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_4 ); #line 90 "test9.c" #pragma omp parallel POMP2_DLIST_00004 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_4 ); #line 91 "test9.c" { i = f(); g(); test(); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_4, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_4, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_4 ); } POMP2_Parallel_join( &opari2_region_4, pomp2_old_task ); } #line 96 "test9.c" #pragma offload_attribute( pop ) { POMP2_Task_handle pomp2_old_task; POMP2_Barrier_enter( &opari2_region_5, &pomp2_old_task, opari2_ctc_5 ); #line 100 "test9.c" #pragma omp barrier POMP2_Barrier_exit( &opari2_region_5, pomp2_old_task ); } #line 101 "test9.c" printf( "Hello world!\n" ); return 0; } int bar() { { POMP2_Single_enter( &opari2_region_6, opari2_ctc_6 ); #line 109 "test9.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_6 ); #line 110 "test9.c" global_1++; POMP2_Single_end( &opari2_region_6 ); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_6, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_6, pomp2_old_task ); } POMP2_Single_exit( &opari2_region_6 ); } #line 111 "test9.c" return global_1; } void g() { #line 117 "test9.c" #pragma omp master { POMP2_Master_begin( &opari2_region_7, opari2_ctc_7 ); #line 118 "test9.c" global_2 = 0; POMP2_Master_end( &opari2_region_7 ); } #line 119 "test9.c" } opari2-2.0.10/test/data/PaxHeaders/test9.c.opari.inc.out0000644000000000000000000000013215232670204017640 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test9.c.opari.inc.out0000664000175100001440000000313415232670204020173 0ustar00builderusers#include static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "59*regionType=atomic*sscl=test9.c:35:35*escl=test9.c:36:36**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "75*regionType=sections*sscl=test9.c:51:51*escl=test9.c:58:58*numSections=2**" #define POMP2_DLIST_00003 shared(opari2_region_3) static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "64*regionType=parallelfor*sscl=test9.c:67:67*escl=test9.c:71:71**" #define POMP2_DLIST_00004 shared(opari2_region_4) static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "61*regionType=parallel*sscl=test9.c:90:90*escl=test9.c:95:95**" static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "64*regionType=barrier*sscl=test9.c:100:100*escl=test9.c:100:100**" static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "63*regionType=single*sscl=test9.c:109:109*escl=test9.c:110:110**" static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "63*regionType=master*sscl=test9.c:117:117*escl=test9.c:118:118**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); } opari2-2.0.10/test/data/PaxHeaders/test9.c0000644000000000000000000000013215232670204015151 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test9.c0000664000175100001440000000357015232670204015510 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * @brief Tests proper treatment of offload regions. */ __declspec( target( mic ) ) int global_1 = 5; __declspec( target( mic ) ) int bar(); __declspec( target( mic ) ) int foo() { int i = 0; #pragma omp parallel { i++; } return ++global_1; } __attribute__( ( target( mic ) ) ) int global_2 = 0; __attribute__( ( target( mic ) ) ) int f() { int i = 0; #pragma omp atomic global_2 += 1; } __attribute__( ( target( mic ) ) ) void g(); #pragma offload_attribute( push, target( mic ) ) void test(); #pragma offload_attribute( pop ) void test() { int i; #pragma omp sections { i++; #pragma omp section i++; #pragma omp section i++; } } int main( int argc, char** argv ) { int i, j, k; #pragma omp parallel for for ( i = 0; i < 10; i++ ) { j++; } #pragma offload target( mic ) in( global ) out( i, global ) { i = foo(); #pragma omp for for ( j = 0; j < 10; j++ ) { k ++; } } #pragma offload target( mic ) in( global ) out( i, global ) { i = bar(); } #pragma offload_attribute( push, target( mic ) ) #pragma omp parallel { i = f(); g(); test(); } #pragma offload_attribute( pop ) #pragma omp barrier printf( "Hello world!\n" ); return 0; } int bar() { #pragma omp single global_1++; return global_1; } void g() { #pragma omp master global_2 = 0; } opari2-2.0.10/test/data/PaxHeaders/test8.f90.out0000644000000000000000000000013215232670204016132 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test8.f90.out0000664000175100001440000002407615232670204016475 0ustar00builderusers #line 1 "test8.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 include 'test8.f90.opari.inc' #line 20 "test8.f90" integer i integer k integer num_threads integer, save :: j #line 25 "test8.f90" !$omp threadprivate(j) pomp2_num_threads = 4 pomp2_if = ( k.eq.0 ) call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 27 "test8.f90" !$omp parallel reduction(+:k) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 28 "test8.f90" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 30 "test8.f90" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo #line 35 "test8.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 36 "test8.f90" call POMP2_Sections_enter(opari2_region_3, & opari2_ctc_3 ) #line 37 "test8.f90" !$omp sections reduction(+:k) #line 38 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 39 "test8.f90" write(*,*) "section 1" call POMP2_Section_end(opari2_region_3) #line 40 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 41 "test8.f90" write(*,*) "section 2" call POMP2_Section_end(opari2_region_3) #line 42 "test8.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Sections_exit(opari2_region_3) #line 43 "test8.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 44 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 45 "test8.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 46 "test8.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 47 "test8.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Untied_task_create_begin(opari2_region_5, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_5 ) end if #line 47 "test8.f90" !$omp task untied if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Untied_task_begin(opari2_region_5, pomp2_new_task) end if #line 48 "test8.f90" write(*,*) "task" if (pomp2_if) then call POMP2_Untied_task_end(opari2_region_5) end if #line 49 "test8.f90" !$omp end task if (pomp2_if) then call POMP2_Untied_task_create_end(opari2_region_5, pomp2_old_task) end if #line 50 "test8.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 50 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 51 "test8.f90" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_6,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_6 ) #line 52 "test8.f90" !$omp parallel reduction(+:k) default(private) shared(i,k) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) & !$omp shared(/cb000/) & !$omp private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) call POMP2_Do_enter(opari2_region_6, & opari2_ctc_6 ) #line 52 "test8.f90" !$omp do schedule(static,chunkif) collapse(1) ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_7, & opari2_ctc_7 ) #line 54 "test8.f90" !$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test8.f90" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_7) #line 56 "test8.f90" !$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test8.f90" k = k + 1 enddo #line 59 "test8.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, pomp2_old_task) call POMP2_Do_exit(opari2_region_6) call POMP2_Parallel_end(opari2_region_6) #line 59 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_6, pomp2_old_task) #line 60 "test8.f90" pomp2_num_threads = 4 pomp2_if = ( (i+k)>5 ) call POMP2_Parallel_fork(opari2_region_8,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_8 ) #line 61 "test8.f90" !$omp parallel reduction(+:k) default(none) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) & !$omp shared(/cb000/) & !$omp private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) call POMP2_Sections_enter(opari2_region_8) #line 61 "test8.f90" !$omp sections #line 62 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_8, & opari2_ctc_8 ) #line 63 "test8.f90" write(*,*) "section 1" call POMP2_Section_end(opari2_region_8) #line 64 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_8, & opari2_ctc_8 ) #line 65 "test8.f90" write(*,*) "section 2" call POMP2_Section_end(opari2_region_8) #line 66 "test8.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_8,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, pomp2_old_task) call POMP2_Sections_exit(opari2_region_8) call POMP2_Parallel_end(opari2_region_8) #line 66 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, pomp2_old_task) #line 67 "test8.f90" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_9,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_9 ) #line 68 "test8.f90" !$omp parallel reduction(+:k) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) call POMP2_Workshare_enter(opari2_region_9, & opari2_ctc_9 ) #line 68 "test8.f90" !$omp workshare write(*,*) "workshare" #line 70 "test8.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_9,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_9) call POMP2_Parallel_end(opari2_region_9) #line 70 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, pomp2_old_task) #line 71 "test8.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_10 ) #line 72 "test8.f90" !$omp parallel shared(num_threads) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) #line 73 "test8.f90" write(*,*) num_threads call POMP2_Implicit_barrier_enter(opari2_region_10,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, pomp2_old_task) call POMP2_Parallel_end(opari2_region_10) #line 74 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, pomp2_old_task) #line 75 "test8.f90" end program test8 subroutine POMP2_Init_reg_000() include 'test8.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) end opari2-2.0.10/test/data/PaxHeaders/test8.f90.opari.inc.out0000644000000000000000000000013215232670204020013 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test8.f90.opari.inc.out0000664000175100001440000000534015232670204020347 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "104*regionType=parallel*sscl=test8.f90:27:27*escl=test8.f90:44:44*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "109*regionType=do*sscl=test8.f90:30:30*escl=test8.f90:35:35*hasCollapse=1*hasReduction=1*hasSchedule=dynamic,5**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "93*regionType=sections*sscl=test8.f90:37:37*escl=test8.f90:42:42*numSections=2*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "64*regionType=parallel*sscl=test8.f90:46:46*escl=test8.f90:50:50**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "72*regionType=task*sscl=test8.f90:47:47*escl=test8.f90:49:49*hasUntied=1**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "191*regionType=paralleldo*sscl=test8.f90:52:52*escl=test8.f90:59:59*hasCollapse=1*hasDefault=private*hasIf=1*hasNum_threads=1*hasOrdered=1*hasReduction=1*hasSchedule=static,chunkif*hasShared=1**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "63*regionType=ordered*sscl=test8.f90:54:54*escl=test8.f90:56:56**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "128*regionType=parallelsections*sscl=test8.f90:61:61*escl=test8.f90:66:66*hasDefault=none*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "113*regionType=parallelworkshare*sscl=test8.f90:68:68*escl=test8.f90:70:70*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "76*regionType=parallel*sscl=test8.f90:72:72*escl=test8.f90:74:74*hasShared=1**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test8.f900000644000000000000000000000013215232670204015324 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test8.f900000664000175100001440000000364615232670204015667 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 integer i integer k integer num_threads integer, save :: j !$omp threadprivate(j) !$omp parallel if(k.eq.0) num_threads(4) reduction(+:k) write(*,*) "parallel" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo !$omp end do !$omp sections reduction(+:k) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp end parallel !$omp parallel !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel !$omp parallel do num_threads(4) reduction(+:k) schedule(static,chunkif) collapse(1) ordered if(.true.) default(private) shared(i,k) do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered k = k + 1 enddo !$omp end parallel do !$omp parallel sections if((i+k)>5) num_threads(4) reduction(+:k) default(none) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end parallel sections !$omp parallel workshare if(.true.) num_threads(4) reduction(+:k) write(*,*) "workshare" !$omp end parallel workshare !$omp parallel shared(num_threads) write(*,*) num_threads !$omp end parallel end program test8 opari2-2.0.10/test/data/PaxHeaders/test8.f.out0000644000000000000000000000013215232670204015761 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test8.f.out0000664000175100001440000002203515232670204016315 0ustar00builderusers #line 1 "test8.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 include 'test8.f.opari.inc' #line 20 "test8.f" integer i integer k integer, save :: j #line 24 "test8.f" !$omp threadprivate(j) pomp2_num_threads = 4 pomp2_if = ( k.eq.0 ) call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test8.f" !$omp parallel reduction(+:k) !$omp& default(private) shared(i,k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) !$omp& shared(/cb000/) !$omp& private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 28 "test8.f" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 30 "test8.f" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo #line 35 "test8.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 36 "test8.f" call POMP2_Sections_enter(opari2_region_3, &opari2_ctc_3 ) #line 37 "test8.f" !$omp sections reduction(+:k) #line 38 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 39 "test8.f" write(*,*) "section 1" call POMP2_Section_end(opari2_region_3) #line 40 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 41 "test8.f" write(*,*) "section 2" call POMP2_Section_end(opari2_region_3) #line 42 "test8.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_3, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_3) #line 43 "test8.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 44 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 45 "test8.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 46 "test8.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 47 "test8.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_5, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_5 ) end if #line 47 "test8.f" !$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_5, pomp2_new_task) end if #line 48 "test8.f" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_5) end if #line 49 "test8.f" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_5, &pomp2_old_task) end if #line 50 "test8.f" call POMP2_Implicit_barrier_enter(opari2_region_4, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 50 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 51 "test8.f" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_6, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_6 ) #line 52 "test8.f" !$omp parallel reduction(+:k) !$omp+ default(none) shared(i,k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) !$omp& shared(/cb000/) !$omp& private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test8.f" !$omp do !$omp+ schedule(static,chunkif) collapse(1) ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 56 "test8.f" !$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 57 "test8.f" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_7) #line 58 "test8.f" !$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 59 "test8.f" k = k + 1 enddo #line 61 "test8.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) call POMP2_Parallel_end(opari2_region_6) #line 61 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_6, &pomp2_old_task) #line 62 "test8.f" pomp2_num_threads = 4 pomp2_if = ( (i+k)>5 ) call POMP2_Parallel_fork(opari2_region_8, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_8 ) #line 63 "test8.f" !$omp parallel reduction(+:k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) call POMP2_Sections_enter(opari2_region_8) #line 63 "test8.f" !$omp sections #line 64 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_8, &opari2_ctc_8 ) #line 65 "test8.f" write(*,*) "section 1" call POMP2_Section_end(opari2_region_8) #line 66 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_8, &opari2_ctc_8 ) #line 67 "test8.f" write(*,*) "section 2" call POMP2_Section_end(opari2_region_8) #line 68 "test8.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_8) call POMP2_Parallel_end(opari2_region_8) #line 68 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, &pomp2_old_task) #line 69 "test8.f" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_9, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_9 ) #line 70 "test8.f" !$omp parallel reduction(+:k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) call POMP2_Workshare_enter(opari2_region_9, &opari2_ctc_9 ) #line 70 "test8.f" !$omp workshare write(*,*) "workshare" #line 72 "test8.f" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_9, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, &pomp2_old_task) call POMP2_Workshare_exit(opari2_region_9) call POMP2_Parallel_end(opari2_region_9) #line 72 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, &pomp2_old_task) #line 73 "test8.f" end program test2 subroutine POMP2_Init_reg_000() include 'test8.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.10/test/data/PaxHeaders/test8.f.opari.inc.out0000644000000000000000000000013215232670204017642 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test8.f.opari.inc.out0000664000175100001440000000513615232670204020201 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"133*regionType=parallel*sscl=test8.f:26:27*escl=test8.f:44:"// &"44*hasDefault=private*hasIf=1*hasNum_threads=1*hasReduction"// &"=1*hasShared=1**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"107*regionType=do*sscl=test8.f:30:30*escl=test8.f:35:35*has"// &"Collapse=1*hasReduction=1*hasSchedule=dynamic,5**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"91*regionType=sections*sscl=test8.f:37:37*escl=test8.f:42:4"// &"2*numSections=2*hasReduction=1**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"62*regionType=parallel*sscl=test8.f:46:46*escl=test8.f:50:5"// &"0**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"70*regionType=task*sscl=test8.f:47:47*escl=test8.f:49:49*ha"// &"sUntied=1**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"186*regionType=paralleldo*sscl=test8.f:52:54*escl=test8.f:6"// &"1:61*hasCollapse=1*hasDefault=none*hasIf=1*hasNum_threads=1"// &"*hasOrdered=1*hasReduction=1*hasSchedule=static,chunkif*has"// &"Shared=1**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"61*regionType=ordered*sscl=test8.f:56:56*escl=test8.f:58:58"// &"**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"110*regionType=parallelsections*sscl=test8.f:63:63*escl=tes"// &"t8.f:68:68*hasIf=1*hasNum_threads=1*hasReduction=1**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"111*regionType=parallelworkshare*sscl=test8.f:70:70*escl=te"// &"st8.f:72:72*hasIf=1*hasNum_threads=1*hasReduction=1**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test8.f0000644000000000000000000000013215232670204015153 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test8.f0000664000175100001440000000357615232670204015520 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 integer i integer k integer, save :: j !$omp threadprivate(j) !$omp parallel if(k.eq.0) num_threads(4) reduction(+:k) !$omp& default(private) shared(i,k) write(*,*) "parallel" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo !$omp end do !$omp sections reduction(+:k) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp end parallel !$omp parallel !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel !$omp parallel do num_threads(4) reduction(+:k) !$omp+ schedule(static,chunkif) collapse(1) ordered if(.true.) !$omp+ default(none) shared(i,k) do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered k = k + 1 enddo !$omp end parallel do !$omp parallel sections if((i+k)>5) num_threads(4) reduction(+:k) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end parallel sections !$omp parallel workshare if(.true.) num_threads(4) reduction(+:k) write(*,*) "workshare" !$omp end parallel workshare end program test2 opari2-2.0.10/test/data/PaxHeaders/test8.c.out0000644000000000000000000000013215232670204015756 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test8.c.out0000664000175100001440000001754515232670204016324 0ustar00builderusers#include "test8.c.opari.inc" #line 1 "test8.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests whether specific clauses are found and inserted into the CTC string. */ #include #ifdef _OPENMP #endif int j; #line 27 "test8.c" #pragma omp threadprivate(j) int main() { int i = 5; int k = 0; { int pomp2_num_threads = 4; int pomp2_if = (int)( k==0 ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 35 "test8.c" #pragma omp parallel reduction(+:k) POMP2_DLIST_00001 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 36 "test8.c" { printf( "parallel\n" ); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 39 "test8.c" #pragma omp for reduction(+:k) schedule(dynamic, 5 ) collapse(1) nowait for ( i = 0; i < 4; ++i ) { printf( "for %d\n", i ); k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_For_exit( &opari2_region_2 ); } #line 45 "test8.c" { POMP2_Sections_enter( &opari2_region_3, opari2_ctc_3 ); #line 46 "test8.c" #pragma omp sections reduction(+:k) nowait { #line 48 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 49 "test8.c" printf( "section 1\n" ); POMP2_Section_end( &opari2_region_3 ); } #line 50 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 51 "test8.c" { printf( "section 2\n" ); } POMP2_Section_end( &opari2_region_3 ); } #line 53 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_3, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_3, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_3 ); } #line 54 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 55 "test8.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_4, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_4 ); #line 56 "test8.c" #pragma omp parallel default(private) POMP2_DLIST_00004 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_4 ); #line 57 "test8.c" { { int pomp2_if = (int)( true ); { POMP2_Task_handle pomp2_old_task; POMP2_Task_handle pomp2_new_task; if (pomp2_if) POMP2_Untied_task_create_begin( &opari2_region_5, &pomp2_new_task, &pomp2_old_task, pomp2_if, opari2_ctc_5 ); #line 58 "test8.c" #pragma omp task untied POMP2_DLIST_00005 if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) { if (pomp2_if) POMP2_Untied_task_begin( &opari2_region_5, pomp2_new_task ); #line 59 "test8.c" { printf( "task\n" ); } if (pomp2_if) POMP2_Untied_task_end( &opari2_region_5 ); } if (pomp2_if) POMP2_Untied_task_create_end( &opari2_region_5, pomp2_old_task ); } } #line 62 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_4, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_4, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_4 ); } POMP2_Parallel_join( &opari2_region_4, pomp2_old_task ); } #line 63 "test8.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_6, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_6 ); #line 64 "test8.c" #pragma omp parallel shared(num_threads) POMP2_DLIST_00006 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_6 ); #line 65 "test8.c" { printf("num_threads variable is %d\n",num_threads); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_6, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_6, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_6 ); } POMP2_Parallel_join( &opari2_region_6, pomp2_old_task ); } #line 68 "test8.c" } { int pomp2_num_threads = 4; int pomp2_if = (int)( 1 ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_7, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_7 ); #line 70 "test8.c" #pragma omp parallel reduction(+:k) default(none) POMP2_DLIST_00007 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_7 ); { POMP2_For_enter( &opari2_region_7, opari2_ctc_7 ); #line 70 "test8.c" #pragma omp for schedule(static,chunkif) collapse(1) ordered nowait for ( i = 0; i < 4; ++i ) { { POMP2_Ordered_enter( &opari2_region_8, opari2_ctc_8 ); #line 73 "test8.c" #pragma omp ordered { POMP2_Ordered_begin( &opari2_region_8 ); #line 74 "test8.c" printf( "for %d\n", i ); POMP2_Ordered_end( &opari2_region_8 ); } POMP2_Ordered_exit( &opari2_region_8 ); } #line 75 "test8.c" k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_7, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_7, pomp2_old_task ); } POMP2_For_exit( &opari2_region_7 ); } POMP2_Parallel_end( &opari2_region_7 ); } POMP2_Parallel_join( &opari2_region_7, pomp2_old_task ); } #line 78 "test8.c" { int pomp2_num_threads = 4; int pomp2_if = (int)( (i+k)>5 ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_9, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_9 ); #line 79 "test8.c" #pragma omp parallel reduction(+:k) POMP2_DLIST_00009 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_9 ); { POMP2_Sections_enter( &opari2_region_9, opari2_ctc_9 ); #line 79 "test8.c" #pragma omp sections nowait { #line 81 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_9, opari2_ctc_9 ); #line 82 "test8.c" printf( "section 1\n" ); POMP2_Section_end( &opari2_region_9 ); } #line 83 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_9, opari2_ctc_9 ); #line 84 "test8.c" { printf( "section 2\n" ); } POMP2_Section_end( &opari2_region_9 ); } #line 86 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_9, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_9, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_9 ); } POMP2_Parallel_end( &opari2_region_9 ); } POMP2_Parallel_join( &opari2_region_9, pomp2_old_task ); } #line 87 "test8.c" opari2-2.0.10/test/data/PaxHeaders/test8.c.opari.inc.out0000644000000000000000000000013215232670204017637 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test8.c.opari.inc.out0000664000175100001440000000504615232670204020176 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "101*regionType=parallel*sscl=test8.c:35:35*escl=test8.c:54:54*hasIf=1*hasNum_threads=1*hasReduction=1**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "107*regionType=for*sscl=test8.c:39:39*escl=test8.c:44:44*hasCollapse=1*hasReduction=1*hasSchedule=dynamic,5**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "90*regionType=sections*sscl=test8.c:46:46*escl=test8.c:53:53*numSections=2*hasReduction=1**" #define POMP2_DLIST_00004 shared(opari2_region_4,opari2_region_5) static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "80*regionType=parallel*sscl=test8.c:56:56*escl=test8.c:62:62*hasDefault=private**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "77*regionType=task*sscl=test8.c:58:58*escl=test8.c:61:61*hasIf=1*hasUntied=1**" #define POMP2_DLIST_00006 shared(opari2_region_6) static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "73*regionType=parallel*sscl=test8.c:64:64*escl=test8.c:67:67*hasShared=1**" #define POMP2_DLIST_00007 shared(opari2_region_7,opari2_region_8) static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "174*regionType=parallelfor*sscl=test8.c:70:70*escl=test8.c:77:77*hasCollapse=1*hasDefault=none*hasIf=1*hasNum_threads=1*hasOrdered=1*hasReduction=1*hasSchedule=static,chunkif**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "60*regionType=ordered*sscl=test8.c:73:73*escl=test8.c:74:74**" #define POMP2_DLIST_00009 shared(opari2_region_9) static OPARI2_Region_handle opari2_region_9 = NULL; #define opari2_ctc_9 "109*regionType=parallelsections*sscl=test8.c:79:79*escl=test8.c:86:86*hasIf=1*hasNum_threads=1*hasReduction=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); POMP2_Assign_handle( &opari2_region_9, opari2_ctc_9 ); } opari2-2.0.10/test/data/PaxHeaders/test8.c0000644000000000000000000000013215232670204015150 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test8.c0000664000175100001440000000365715232670204015515 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests whether specific clauses are found and inserted into the CTC string. */ #include #ifdef _OPENMP #include #endif int j; #pragma omp threadprivate(j) int main() { int i = 5; int k = 0; #pragma omp parallel if(k==0) num_threads(4) reduction(+:k) { printf( "parallel\n" ); #pragma omp for reduction(+:k) schedule(dynamic, 5 ) collapse(1) for ( i = 0; i < 4; ++i ) { printf( "for %d\n", i ); k++; } #pragma omp sections reduction(+:k) { #pragma omp section printf( "section 1\n" ); #pragma omp section { printf( "section 2\n" ); } } } #pragma omp parallel default(private) { #pragma omp task if(true) untied { printf( "task\n" ); } } #pragma omp parallel shared(num_threads) { printf("num_threads variable is %d\n",num_threads); } } #pragma omp parallel for num_threads(4) reduction(+:k) schedule(static,chunkif) collapse(1) ordered if(1) default(none) for ( i = 0; i < 4; ++i ) { #pragma omp ordered printf( "for %d\n", i ); k++; } #pragma omp parallel sections if((i+k)>5) num_threads(4) reduction(+:k) { #pragma omp section printf( "section 1\n" ); #pragma omp section { printf( "section 2\n" ); } } opari2-2.0.10/test/data/PaxHeaders/test7.f90.out0000644000000000000000000000013215232670204016131 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test7.f90.out0000664000175100001440000001066415232670204016472 0ustar00builderusers #line 1 "test7.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives. program test7 include 'test7.f90.opari.inc' #line 20 "test7.f90" call POMP2_Init() #line 21 "test7.f90" call POMP2_Off() #line 23 "test7.f90" call POMP2_Begin(opari2_region_1, opari2_ctc_1) #line 25 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_2,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_2 ) #line 26 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) #line 27 "test7.f90" i = 1 call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Parallel_end(opari2_region_2) #line 28 "test7.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, pomp2_old_task) #line 29 "test7.f90" call POMP2_End(opari2_region_1) #line 31 "test7.f90" call POMP2_On() #line 33 "test7.f90" #line 35 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 35 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) #line 36 "test7.f90" !$omp do do i = 1,2 write(*,*) i end do !$omp end do call POMP2_Parallel_end(opari2_region_3) !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 42 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 43 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) !$omp do do i = 1,2 write(*,*) i end do #line 47 "test7.f90" !$omp end do call POMP2_Parallel_end(opari2_region_4) #line 47 "test7.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 48 "test7.f90" #line 49 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_5 ) #line 50 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) #line 51 "test7.f90" i = 3 call POMP2_Implicit_barrier_enter(opari2_region_5,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, pomp2_old_task) call POMP2_Parallel_end(opari2_region_5) #line 52 "test7.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_5, pomp2_old_task) #line 53 "test7.f90" call POMP2_Finalize() #line 55 "test7.f90" end program test7 subroutine POMP2_Init_reg_000() include 'test7.f90.opari.inc' call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) end subroutine POMP2_USER_Init_reg_000() include 'test7.f90.opari.inc' call POMP2_USER_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end opari2-2.0.10/test/data/PaxHeaders/test7.f90.opari.inc.out0000644000000000000000000000013215232670204020012 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test7.f90.opari.inc.out0000664000175100001440000000254015232670204020345 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "85*regionType=userRegion*sscl=test7.f90:24:24*escl=test7.f90:30:30*userRegionName=foo**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "64*regionType=parallel*sscl=test7.f90:26:26*escl=test7.f90:28:28**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "64*regionType=parallel*sscl=test7.f90:35:35*escl=test7.f90:41:41**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "66*regionType=paralleldo*sscl=test7.f90:43:43*escl=test7.f90:47:47**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "64*regionType=parallel*sscl=test7.f90:50:50*escl=test7.f90:52:52**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test7.f900000644000000000000000000000013215232670204015323 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test7.f900000664000175100001440000000220115232670204015650 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives. program test7 !$POMP INST INIT !$POMP INST OFF !$POMP INST BEGIN(foo) !$OMP PARALLEL i = 1 !$OMP end PARALLEL !$POMP INST END(foo) !$POMP INST ON !$POMP NOINSTRUMENT !$OMP PARALLEL !$OMP DO do i = 1,2 write(*,*) i end do !$OMP END DO !$OMP END PARALLEL !$OMP PARALLEL DO do i = 1,2 write(*,*) i end do !$OMP end PARALLEL DO !$POMP INSTRUMENT !$OMP PARALLEL i = 3 !$OMP end PARALLEL !$POMP INST FINALIZE end program test7 opari2-2.0.10/test/data/PaxHeaders/test7.f.out0000644000000000000000000000013215232670204015760 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test7.f.out0000664000175100001440000001064715232670204016322 0ustar00builderusers #line 1 "test7.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives and selective instrumentation. program test7 include 'test7.f.opari.inc' #line 20 "test7.f" call POMP2_Init() #line 21 "test7.f" call POMP2_Off() #line 23 "test7.f" call POMP2_Begin(opari2_region_1, opari2_ctc_1) #line 25 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_2, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_2 ) #line 26 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) #line 27 "test7.f" i = 1 call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_2) #line 28 "test7.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, &pomp2_old_task) #line 29 "test7.f" call POMP2_End(opari2_region_1) #line 31 "test7.f" call POMP2_On() #line 33 "test7.f" #line 35 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_3 ) #line 35 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) #line 36 "test7.f" !$omp do do i = 1,2 write(*,*) i end do !$omp end do call POMP2_Parallel_end(opari2_region_3) !$omp end parallel call POMP2_Parallel_join(opari2_region_3, &pomp2_old_task) #line 42 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 43 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) !$omp do do i = 1,2 write(*,*) i end do #line 47 "test7.f" !$omp end do call POMP2_Parallel_end(opari2_region_4) #line 47 "test7.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 48 "test7.f" #line 49 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_5 ) #line 50 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) #line 51 "test7.f" i = 3 call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_5) #line 52 "test7.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_5, &pomp2_old_task) #line 53 "test7.f" call POMP2_Finalize() #line 55 "test7.f" end program test7 subroutine POMP2_Init_reg_000() include 'test7.f.opari.inc' call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) end subroutine POMP2_USER_Init_reg_000() include 'test7.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end opari2-2.0.10/test/data/PaxHeaders/test7.f.opari.inc.out0000644000000000000000000000013215232670204017641 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test7.f.opari.inc.out0000664000175100001440000000260615232670204020177 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"83*regionType=userRegion*sscl=test7.f:24:24*escl=test7.f:30"// &":30*userRegionName=foo**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"62*regionType=parallel*sscl=test7.f:26:26*escl=test7.f:28:2"// &"8**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"62*regionType=parallel*sscl=test7.f:35:35*escl=test7.f:41:4"// &"1**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"64*regionType=paralleldo*sscl=test7.f:43:43*escl=test7.f:47"// &":47**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"62*regionType=parallel*sscl=test7.f:50:50*escl=test7.f:52:5"// &"2**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test7.f0000644000000000000000000000013215232670204015152 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test7.f0000664000175100001440000000225015232670204015503 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives and selective instrumentation. program test7 C$POMP INST INIT *$POMP INST OFF !$POMP INST BEGIN(foo) !$OMP PARALLEL i = 1 !$OMP end PARALLEL CPOMP$ INST END(foo) *POMP$ INST ON !POMP$ NOINSTRUMENT !$OMP PARALLEL !$OMP DO do i = 1,2 write(*,*) i end do !$OMP END DO !$OMP END PARALLEL !$OMP PARALLEL DO do i = 1,2 write(*,*) i end do !$OMP END PARALLEL DO !$POMP INSTRUMENT !$OMP PARALLEL i = 3 !$OMP end PARALLEL !$POMP INST FINALIZE end program test7 opari2-2.0.10/test/data/PaxHeaders/test7.c.out0000644000000000000000000000013215232670204015755 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test7.c.out0000664000175100001440000001206515232670204016313 0ustar00builderusers#include "test7.c.opari.inc" #line 1 "test7.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests user instrumentation directives and selective instrumentation. */ int main() { int i; int b = 1; POMP2_Init(); #line 40 "test7.c" POMP2_Off(); #line 42 "test7.c" POMP2_Begin(&opari2_region_1, opari2_ctc_1); #line 44 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 45 "test7.c" #pragma omp parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); #line 46 "test7.c" i = 1; { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 47 "test7.c" POMP2_On(); #line 49 "test7.c" #line 51 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_3, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_3 ); #line 51 "test7.c" #pragma omp parallel POMP2_DLIST_00003 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_3 ); #line 52 "test7.c" #pragma omp for for ( i = 0; i < 2; ++i) b = b + i; POMP2_Parallel_end( &opari2_region_3 ); } POMP2_Parallel_join( &opari2_region_3, pomp2_old_task ); } #line 55 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_4, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_4 ); #line 56 "test7.c" #pragma omp parallel POMP2_DLIST_00004 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_4 ); #pragma omp for for ( i = 0; i < 2; ++i) b = b + i; POMP2_Parallel_end( &opari2_region_4 ); } POMP2_Parallel_join( &opari2_region_4, pomp2_old_task ); } #line 59 "test7.c" #line 60 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_5, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_5 ); #line 61 "test7.c" #pragma omp parallel POMP2_DLIST_00005 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_5 ); #line 62 "test7.c" i = 3; { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_5, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_5, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_5 ); } POMP2_Parallel_join( &opari2_region_5, pomp2_old_task ); } #line 63 "test7.c" if (b) { POMP2_End(&opari2_region_1); #line 66 "test7.c" return 0; } { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_6, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_6 ); #line 69 "test7.c" #pragma omp parallel POMP2_DLIST_00006 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_6 ); #line 70 "test7.c" { POMP2_Begin(&opari2_region_7, opari2_ctc_7); #line 72 "test7.c" i = 4; { POMP2_Task_handle pomp2_old_task; POMP2_Barrier_enter( &opari2_region_8, &pomp2_old_task, opari2_ctc_8 ); #line 73 "test7.c" #pragma omp barrier POMP2_Barrier_exit( &opari2_region_8, pomp2_old_task ); } #line 74 "test7.c" i = 5; POMP2_End(&opari2_region_7); #line 76 "test7.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_6, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_6, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_6 ); } POMP2_Parallel_join( &opari2_region_6, pomp2_old_task ); } #line 77 "test7.c" if (b) { POMP2_End(&opari2_region_1); #line 80 "test7.c" return 0; } POMP2_End(&opari2_region_1); #line 84 "test7.c" POMP2_Finalize(); #line 86 "test7.c" return 0; } opari2-2.0.10/test/data/PaxHeaders/test7.c.opari.inc.out0000644000000000000000000000013215232670204017636 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test7.c.opari.inc.out0000664000175100001440000000415315232670204020173 0ustar00builderusers#include #include static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "82*regionType=userRegion*sscl=test7.c:43:43*escl=test7.c:83:83*userRegionName=foo**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "61*regionType=parallel*sscl=test7.c:45:45*escl=test7.c:46:46**" #define POMP2_DLIST_00003 shared(opari2_region_3) static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "61*regionType=parallel*sscl=test7.c:51:51*escl=test7.c:54:54**" #define POMP2_DLIST_00004 shared(opari2_region_4) static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "64*regionType=parallelfor*sscl=test7.c:56:56*escl=test7.c:58:58**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "61*regionType=parallel*sscl=test7.c:61:61*escl=test7.c:62:62**" #define POMP2_DLIST_00006 shared(opari2_region_6,opari2_region_7,opari2_region_8) static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "61*regionType=parallel*sscl=test7.c:69:69*escl=test7.c:76:76**" static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "85*regionType=userRegion*sscl=test7.c:71:71*escl=test7.c:75:75*userRegionName=phase1**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "60*regionType=barrier*sscl=test7.c:73:73*escl=test7.c:73:73**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); } #ifdef __cplusplus extern "C" #endif void POMP2_USER_Init_reg_000() { POMP2_USER_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_USER_Assign_handle( &opari2_region_7, opari2_ctc_7 ); } opari2-2.0.10/test/data/PaxHeaders/test7.c0000644000000000000000000000013215232670204015147 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test7.c0000664000175100001440000000320215232670204015476 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests user instrumentation directives and selective instrumentation. */ int main() { int i; int b = 1; #pragma pomp inst init #pragma pomp inst off #pragma pomp inst begin(foo) #pragma omp parallel i = 1; #pragma pomp inst on #pragma pomp noinstrument #pragma omp parallel #pragma omp for for ( i = 0; i < 2; ++i) b = b + i; #pragma omp parallel for for ( i = 0; i < 2; ++i) b = b + i; #pragma pomp instrument #pragma omp parallel i = 3; if (b) { #pragma pomp inst altend(foo) return 0; } #pragma omp parallel { #pragma pomp inst begin(phase1) i = 4; #pragma omp barrier i = 5; #pragma pomp inst end(phase1) } if (b) { #pragma pomp inst altend(foo) return 0; } #pragma pomp inst end(foo) #pragma pomp inst finalize return 0; } opari2-2.0.10/test/data/PaxHeaders/test6.f90.out0000644000000000000000000000013215232670204016130 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test6.f90.out0000664000175100001440000000522515232670204016466 0ustar00builderusers #line 1 "test6.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 use omp_lib include 'test6.f90.opari.inc' #line 23 "test6.f90" integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call POMP2_Init_lock(lock1); call POMP2_Init_nest_lock(lock2) call POMP2_Set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call POMP2_Set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call POMP2_Unset_lock(lock1); !omp_unset_lock(lock1); call POMP2_Unset_nest_lock(lock2) !$ mod = POMP2_Test_lock(lock1) !$ mod = POMP2_Test_nest_lock(lock2) mod = POMP2_Test_lock(lock1) mod = POMP2_Test_nest_lock(lock2) call POMP2_Destroy_lock(lock1) call POMP2_Destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", "omp_init_lock(i)""", """", """""""", & "omp_init_lock(i) ",& ! ",& " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) !$C99 call omp_init_lock(i) !$DOMP call omp_init_lock(i) end program test6 opari2-2.0.10/test/data/PaxHeaders/test6.f90.opari.inc.out0000644000000000000000000000013215232670204020011 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test6.f90.opari.inc.out0000664000175100001440000000024715232670204020346 0ustar00builderusers integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock opari2-2.0.10/test/data/PaxHeaders/test6.f900000644000000000000000000000013215232670204015322 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test6.f900000664000175100001440000000505715232670204015663 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 use omp_lib integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call omp_init_lock(lock1); call omp_init_nest_lock(lock2) call omp_set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call omp_set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call omp_unset_lock(lock1); !omp_unset_lock(lock1); call omp_unset_nest_lock(lock2) !$ mod = omp_test_lock(lock1) !$ mod = omp_test_nest_lock(lock2) !P$ mod = omp_test_lock(lock1) !P$ mod = omp_test_nest_lock(lock2) call omp_destroy_lock(lock1) call omp_destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", "omp_init_lock(i)""", """", """""""", & "omp_init_lock(i) ",& ! ",& " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) !$C99 call omp_init_lock(i) !$DOMP call omp_init_lock(i) end program test6 opari2-2.0.10/test/data/PaxHeaders/test6.f.out0000644000000000000000000000013215232670204015757 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.267415192 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test6.f.out0000664000175100001440000000607115232670204016315 0ustar00builderusers #line 1 "test6.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 include 'omp_lib.h' include 'test6.f.opari.inc' #line 22 "test6.f" integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call POMP2_Init_lock(lock1); call POMP2_Init_nest_lock(lock2) call POMP2_Set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call POMP2_Set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call POMP2_Unset_lock(lock1); !omp_unset_lock(lock1); call POMP2_Unset_nest_lock(lock2) !$ mod = POMP2_Test_lock(lock1) *$ mod = POMP2_Test_nest_lock(lock2) mod = POMP2_Test_lock(lock1) mod = POMP2_Test_nest_lock(lock2) call POMP2_Destroy_lock(lock1) call POMP2_Destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) c call omp_init_lock(i) * call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", &"omp_init_lock(i)""", """", """""""","omp_init_lock(i) ", ! ",& & " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) end program test6 ! Simulation of included header file, nothing should be replaced #line 1 omp_lib.h call omp_init_lock(lock1) call omp_init_nest_lock(lock2) call omp_set_lock(lock1) call omp_set_nest_lock(lock2) call omp_unset_lock(lock1) call omp_unset_nest_lock(lock2) opari2-2.0.10/test/data/PaxHeaders/test6.f.opari.inc.out0000644000000000000000000000013215232670204017640 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test6.f.opari.inc.out0000664000175100001440000000033215232670204020170 0ustar00builderusers integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock opari2-2.0.10/test/data/PaxHeaders/test6.f0000644000000000000000000000013215232670204015151 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test6.f0000664000175100001440000000576415232670204015517 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 include 'omp_lib.h' integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call omp_init_lock(lock1); call omp_init_nest_lock(lock2) call omp_set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call omp_set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call omp_unset_lock(lock1); !omp_unset_lock(lock1); call omp_unset_nest_lock(lock2) !$ mod = omp_test_lock(lock1) *$ mod = omp_test_nest_lock(lock2) !P$ mod = omp_test_lock(lock1) cP$ mod = omp_test_nest_lock(lock2) call omp_destroy_lock(lock1) call omp_destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) c call omp_init_lock(i) * call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", &"omp_init_lock(i)""", """", """""""","omp_init_lock(i) ", ! ",& & " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) end program test6 ! Simulation of included header file, nothing should be replaced #line 1 /some/path/to/include/file/omp_lib.h call omp_init_lock(lock1) call omp_init_nest_lock(lock2) call omp_set_lock(lock1) call omp_set_nest_lock(lock2) call omp_unset_lock(lock1) call omp_unset_nest_lock(lock2) opari2-2.0.10/test/data/PaxHeaders/test6.c.out0000644000000000000000000000013215232670204015754 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test6.c.out0000664000175100001440000000600015232670204016302 0ustar00builderusers#include "test6.c.opari.inc" #line 1 "test6.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. */ int main() { omp_lock_t lock1; omp_nest_lock_t lock2; omp_sched_t sched; int mod; //************************************************** //* Should be replaced by wrapper functions * //* regardless of "distractions" * //************************************************** POMP2_Init_lock(&lock1); POMP2_Init_nest_lock(&lock2); POMP2_Set_lock(&lock1); POMP2_Set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); POMP2_Unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ POMP2_Unset_nest_lock(&lock2); POMP2_Test_lock(&lock1);/* omp_test_lock(&lock1); */ POMP2_Test_nest_lock(&lock2); POMP2_Destroy_lock(&lock1); POMP2_Destroy_nest_lock(&lock2); //************************************************** //* Not now, but planned for the future! * //************************************************** omp_set_num_threads(4); omp_set_dynamic(0); omp_set_schedule(omp_sched_static, 1); omp_set_nested(0); omp_set_max_active_levels(2); //************************************************** //* No replacement beyond this point! * //************************************************** omp_get_num_threads(); omp_get_max_threads(); omp_get_thread_num(); omp_get_num_procs(); omp_in_parallel(); omp_get_nested(); omp_get_dynamic(); omp_get_schedule(&sched, &mod); omp_get_thread_limit(); omp_get_max_active_levels(); omp_get_level(); omp_get_ancestor_thread_num(0); omp_get_team_size(0); omp_get_active_level(); omp_get_wtime(); omp_get_wtick(); // omp_init_lock(i) /* -- omp_init_lock(i) -- */ /* -- omp_init_lock(i) -- */ printf("omp_init_lock(i) \n"); // omp_init_lock(i) printf("omp_init_lock(i)\"test\"omp_init_lock(i)omp_init_lock(i)\"\"\"\n"); } /* Simulate preincluded definitions. Nothing beyond this point should be replaced */ #line 1 "omp.h" omp_init_lock(&lock1); omp_init_nest_lock(&lock2); omp_set_lock(&lock1); omp_set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); omp_unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ omp_unset_nest_lock(&lock2); omp_test_lock(&lock1);/* omp_test_lock(&lock1); */ omp_test_nest_lock(&lock2); omp_destroy_lock(&lock1); omp_destroy_nest_lock(&lock2); opari2-2.0.10/test/data/PaxHeaders/test6.c.opari.inc.out0000644000000000000000000000013215232670204017635 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test6.c.opari.inc.out0000664000175100001440000000003715232670204020167 0ustar00builderusers#include opari2-2.0.10/test/data/PaxHeaders/test6.c0000644000000000000000000000013215232670204015146 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test6.c0000664000175100001440000000576215232670204015512 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. */ #include int main() { omp_lock_t lock1; omp_nest_lock_t lock2; omp_sched_t sched; int mod; //************************************************** //* Should be replaced by wrapper functions * //* regardless of "distractions" * //************************************************** omp_init_lock(&lock1); omp_init_nest_lock(&lock2); omp_set_lock(&lock1); omp_set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); omp_unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ omp_unset_nest_lock(&lock2); omp_test_lock(&lock1);/* omp_test_lock(&lock1); */ omp_test_nest_lock(&lock2); omp_destroy_lock(&lock1); omp_destroy_nest_lock(&lock2); //************************************************** //* Not now, but planned for the future! * //************************************************** omp_set_num_threads(4); omp_set_dynamic(0); omp_set_schedule(omp_sched_static, 1); omp_set_nested(0); omp_set_max_active_levels(2); //************************************************** //* No replacement beyond this point! * //************************************************** omp_get_num_threads(); omp_get_max_threads(); omp_get_thread_num(); omp_get_num_procs(); omp_in_parallel(); omp_get_nested(); omp_get_dynamic(); omp_get_schedule(&sched, &mod); omp_get_thread_limit(); omp_get_max_active_levels(); omp_get_level(); omp_get_ancestor_thread_num(0); omp_get_team_size(0); omp_get_active_level(); omp_get_wtime(); omp_get_wtick(); // omp_init_lock(i) /* -- omp_init_lock(i) -- */ /* -- omp_init_lock(i) -- */ printf("omp_init_lock(i) \n"); // omp_init_lock(i) printf("omp_init_lock(i)\"test\"omp_init_lock(i)omp_init_lock(i)\"\"\"\n"); } /* Simulate preincluded definitions. Nothing beyond this point should be replaced */ #line 1 "/some/path/to/presumed/include/file/omp.h" omp_init_lock(&lock1); omp_init_nest_lock(&lock2); omp_set_lock(&lock1); omp_set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); omp_unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ omp_unset_nest_lock(&lock2); omp_test_lock(&lock1);/* omp_test_lock(&lock1); */ omp_test_nest_lock(&lock2); omp_destroy_lock(&lock1); omp_destroy_nest_lock(&lock2); opari2-2.0.10/test/data/PaxHeaders/test5.f90.out0000644000000000000000000000013215232670204016127 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test5.f90.out0000664000175100001440000001222015232670204016456 0ustar00builderusers #line 1 "test5.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 include 'test5.f90.opari.inc' #line 20 "test5.f90" integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t #line 25 "test5.f90" !$omp threadprivate(t) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 28 "test5.f90" !$omp parallel & !$omp & private(i,j) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) call POMP2_Do_enter(opari2_region_1, & opari2_ctc_1 ) #line 28 "test5.f90" !$omp do & !$omp & lastprivate(k) & !$omp & lastprivate & !$omp & ( & !$omp & l & !$omp & ) schedule(dynamic & !$omp & ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do #line 41 "test5.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Do_exit(opari2_region_1) call POMP2_Parallel_end(opari2_region_1) #line 41 "test5.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 42 "test5.f90" if(k .gt. 0) l = .true. pomp2_num_threads = 2 pomp2_if = ( l ) call POMP2_Parallel_fork(opari2_region_2,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_2 ) #line 44 "test5.f90" !$omp parallel default(shared) & !$omp &firstprivate(j) copyin(t) reduction(+:l) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) call POMP2_Sections_enter(opari2_region_2) #line 44 "test5.f90" !$omp sections & !$omp & lastprivate(i) #line 46 "test5.f90" !$omp section call POMP2_Section_begin(opari2_region_2, & opari2_ctc_2 ) #line 47 "test5.f90" write(*,*) "section1" call POMP2_Section_end(opari2_region_2) #line 48 "test5.f90" !$omp section call POMP2_Section_begin(opari2_region_2, & opari2_ctc_2 ) #line 49 "test5.f90" write(*,*) "section2" call POMP2_Section_end(opari2_region_2) #line 50 "test5.f90" !$omp section call POMP2_Section_begin(opari2_region_2, & opari2_ctc_2 ) #line 51 "test5.f90" write(*,*) "section3" call POMP2_Section_end(opari2_region_2) #line 52 "test5.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Sections_exit(opari2_region_2) call POMP2_Parallel_end(opari2_region_2) #line 52 "test5.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, pomp2_old_task) #line 53 "test5.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 54 "test5.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Workshare_enter(opari2_region_3, & opari2_ctc_3 ) #line 54 "test5.f90" !$omp workshare AA = BB BB = CC #line 57 "test5.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 57 "test5.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 58 "test5.f90" end program test5 subroutine POMP2_Init_reg_000() include 'test5.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) end opari2-2.0.10/test/data/PaxHeaders/test5.f90.opari.inc.out0000644000000000000000000000013215232670204020010 xustar0030 mtime=1785426052.219415476 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test5.f90.opari.inc.out0000664000175100001440000000176515232670204020353 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "86*regionType=paralleldo*sscl=test5.f90:28:36*escl=test5.f90:41:41*hasSchedule=dynamic**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "112*regionType=parallelsections*sscl=test5.f90:44:45*escl=test5.f90:52:52*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "73*regionType=parallelworkshare*sscl=test5.f90:54:54*escl=test5.f90:57:57**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test5.f900000644000000000000000000000013215232670204015321 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test5.f900000664000175100001440000000315715232670204015661 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t !$omp threadprivate(t) !$omp parallel & !parallel !$omp & do & !do !$omp & lastprivate(k) & !comment !$omp & private(i,j), & !schedule !$omp & lastprivate & !$omp & ( & !$omp & l & !comment inside argument !$omp & ), schedule(dynamic & !$omp & ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do !$omp end parallel do if(k .gt. 0) l = .true. !$omp parallel sections if(l) num_threads(2) default(shared) & !$omp &firstprivate(j) lastprivate(i) copyin(t) reduction(+:l) !$omp section write(*,*) "section1" !$omp section write(*,*) "section2" !$omp section write(*,*) "section3" !$omp end parallel sections !$omp parallel workshare AA = BB BB = CC !$omp end parallel workshare end program test5 opari2-2.0.10/test/data/PaxHeaders/test5.f.out0000644000000000000000000000013215232670204015756 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test5.f.out0000664000175100001440000001172015232670204016311 0ustar00builderusers #line 1 "test5.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 include 'test5.f.opari.inc' #line 20 "test5.f" integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t #line 25 "test5.f" !$omp threadprivate(t) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 28 "test5.f" !$omp parallel !$omp+ private(i,j) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) call POMP2_Do_enter(opari2_region_1, &opari2_ctc_1 ) #line 28 "test5.f" !$omp do !$omp+ lastprivate(k) !$omp+ lastprivate !$omp+ ( !$omp+ l !$omp+ ) schedule(dynamic !$omp+ ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do #line 41 "test5.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Do_exit(opari2_region_1) call POMP2_Parallel_end(opari2_region_1) #line 41 "test5.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 42 "test5.f" if(k .gt. 0) l = .true. pomp2_num_threads = 2 pomp2_if = ( l ) call POMP2_Parallel_fork(opari2_region_2, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_2 ) #line 44 "test5.f" !$omp parallel default(shared) !$omp+ firstprivate(j) copyin(t) reduction(+:l) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) call POMP2_Sections_enter(opari2_region_2) #line 44 "test5.f" !$omp sections !$omp+ lastprivate(i) #line 46 "test5.f" !$omp section call POMP2_Section_begin(opari2_region_2, &opari2_ctc_2 ) #line 47 "test5.f" write(*,*) "section1" call POMP2_Section_end(opari2_region_2) #line 48 "test5.f" !$omp section call POMP2_Section_begin(opari2_region_2, &opari2_ctc_2 ) #line 49 "test5.f" write(*,*) "section2" call POMP2_Section_end(opari2_region_2) #line 50 "test5.f" !$omp section call POMP2_Section_begin(opari2_region_2, &opari2_ctc_2 ) #line 51 "test5.f" write(*,*) "section3" call POMP2_Section_end(opari2_region_2) #line 52 "test5.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_2) call POMP2_Parallel_end(opari2_region_2) #line 52 "test5.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, &pomp2_old_task) #line 53 "test5.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_3 ) #line 54 "test5.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Workshare_enter(opari2_region_3, &opari2_ctc_3 ) #line 54 "test5.f" !$omp workshare AA = BB BB = CC #line 57 "test5.f" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_3, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, &pomp2_old_task) call POMP2_Workshare_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 57 "test5.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, &pomp2_old_task) #line 58 "test5.f" end program test5 subroutine POMP2_Init_reg_000() include 'test5.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) end opari2-2.0.10/test/data/PaxHeaders/test5.f.opari.inc.out0000644000000000000000000000013215232670204017637 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test5.f.opari.inc.out0000664000175100001440000000202515232670204020170 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"84*regionType=paralleldo*sscl=test5.f:28:36*escl=test5.f:41"// &":41*hasSchedule=dynamic**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"110*regionType=parallelsections*sscl=test5.f:44:45*escl=tes"// &"t5.f:52:52*hasIf=1*hasNum_threads=1*hasReduction=1**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"71*regionType=parallelworkshare*sscl=test5.f:54:54*escl=tes"// &"t5.f:57:57**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test5.f0000644000000000000000000000013215232670204015150 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test5.f0000664000175100001440000000275415232670204015512 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t !$omp threadprivate(t) !$omp parallel !$omp+ do !$omp+ lastprivate(k) !$omp+ private(i,j), !$omp+ lastprivate !$omp+ ( !$omp+ l !random comment !$omp+ ), schedule(dynamic !$omp+ ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do !$omp end parallel do if(k .gt. 0) l = .true. !$omp parallel sections if(l) num_threads(2) default(shared) !$omp+ firstprivate(j) lastprivate(i) copyin(t) reduction(+:l) !$omp section write(*,*) "section1" !$omp section write(*,*) "section2" !$omp section write(*,*) "section3" !$omp end parallel sections !$omp parallel workshare AA = BB BB = CC !$omp end parallel workshare end program test5 opari2-2.0.10/test/data/PaxHeaders/test5.c.out0000644000000000000000000000013215232670204015753 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test5.c.out0000664000175100001440000000741615232670204016315 0ustar00builderusers#include "test5.c.opari.inc" #line 1 "test5.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the splitting of combined parallel clauses. */ #include int t; #line 24 "test5.c" #pragma omp threadprivate(t) int main() { int i, j, k, l; l=0; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 30 "test5.c" #pragma omp parallel \ private(i,j) \ POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); { POMP2_For_enter( &opari2_region_1, opari2_ctc_1 ); #line 30 "test5.c" #pragma omp \ for \ lastprivate(k) \ lastprivate \ ( \ l \ ) schedule(dynamic \ ) nowait for(i=0; i<4;++i) { printf("parallel for %d\n", i); k+=i; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_For_exit( &opari2_region_1 ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 43 "test5.c" { int pomp2_num_threads = 2; int pomp2_if = (int)( k ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 44 "test5.c" #pragma omp parallel firstprivate(j) default(shared) copyin(t) reduction(+:l) POMP2_DLIST_00002 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); { POMP2_Sections_enter( &opari2_region_2, opari2_ctc_2 ); #line 44 "test5.c" #pragma omp sections lastprivate(i) nowait { #line 46 "test5.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 47 "test5.c" { printf("Section 1\n"); } POMP2_Section_end( &opari2_region_2 ); } #line 50 "test5.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 51 "test5.c" { printf("Section 2\n"); } POMP2_Section_end( &opari2_region_2 ); } #line 54 "test5.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 55 "test5.c" { printf("Section 3\n"); } POMP2_Section_end( &opari2_region_2 ); } #line 58 "test5.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_2 ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 59 "test5.c" } opari2-2.0.10/test/data/PaxHeaders/test5.c.opari.inc.out0000644000000000000000000000013215232670204017634 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test5.c.opari.inc.out0000664000175100001440000000124115232670204020164 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "84*regionType=parallelfor*sscl=test5.c:30:38*escl=test5.c:42:42*hasSchedule=dynamic**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "109*regionType=parallelsections*sscl=test5.c:44:44*escl=test5.c:58:58*hasIf=1*hasNum_threads=1*hasReduction=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.10/test/data/PaxHeaders/test5.c0000644000000000000000000000013215232670204015145 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test5.c0000664000175100001440000000277515232670204015512 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the splitting of combined parallel clauses. */ #include int t; #pragma omp threadprivate(t) int main() { int i, j, k, l; l=0; #pragma omp parallel /* parallel */ \ for /* for */ \ lastprivate(k) /* for */ \ private(i,j), /* parallel */ \ lastprivate /* for */ \ ( /* for */ \ l /* for */ \ ), schedule(dynamic /* for */ \ ) for(i=0; i<4;++i) { printf("parallel for %d\n", i); k+=i; } #pragma omp parallel sections if(k) num_threads(2) lastprivate(i) firstprivate(j) default(shared) copyin(t) reduction(+:l) { #pragma omp section { printf("Section 1\n"); } #pragma omp section { printf("Section 2\n"); } #pragma omp section { printf("Section 3\n"); } } } opari2-2.0.10/test/data/PaxHeaders/test4.remove-task.c.out0000644000000000000000000000013215232670204020206 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.remove-task.c.out0000664000175100001440000000573215232670204020547 0ustar00builderusers#include "test4.remove-task.c.opari.inc" #line 1 "test4.remove-task.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #endif int main() { int i; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 29 "test4.remove-task.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 30 "test4.remove-task.c" { printf("parallel\n"); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 32 "test4.remove-task.c" #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } POMP2_For_exit( &opari2_region_2 ); } #line 36 "test4.remove-task.c" { POMP2_Sections_enter( &opari2_region_3, opari2_ctc_3 ); #line 37 "test4.remove-task.c" #pragma omp sections nowait { #line 39 "test4.remove-task.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 40 "test4.remove-task.c" printf("section nowait 1\n"); POMP2_Section_end( &opari2_region_3 ); } #line 41 "test4.remove-task.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 42 "test4.remove-task.c" { printf("section nowait 2\n"); } POMP2_Section_end( &opari2_region_3 ); } #line 43 "test4.remove-task.c" } POMP2_Sections_exit( &opari2_region_3 ); } #line 44 "test4.remove-task.c" { POMP2_Single_enter( &opari2_region_4, opari2_ctc_4 ); #line 45 "test4.remove-task.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_4 ); #line 46 "test4.remove-task.c" { printf("single nowait\n"); } POMP2_Single_end( &opari2_region_4 ); } POMP2_Single_exit( &opari2_region_4 ); } #line 49 "test4.remove-task.c" //!!! Removed task directive due to user option "--task=remove"! #line 51 "test4.remove-task.c" { printf("task untied\n"); } #line 54 "test4.remove-task.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 55 "test4.remove-task.c" } opari2-2.0.10/test/data/PaxHeaders/test4.remove-task.c.opari.inc.out0000644000000000000000000000013215232670204022067 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.remove-task.c.opari.inc.out0000664000175100001440000000264015232670204022423 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3,opari2_region_4,opari2_region_5) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "85*regionType=parallel*sscl=test4.remove-task.c:29:29*escl=test4.remove-task.c:54:54**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "92*regionType=for*sscl=test4.remove-task.c:32:32*escl=test4.remove-task.c:35:35*hasNowait=1**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "111*regionType=sections*sscl=test4.remove-task.c:37:37*escl=test4.remove-task.c:43:43*numSections=2*hasNowait=1**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "95*regionType=single*sscl=test4.remove-task.c:45:45*escl=test4.remove-task.c:48:48*hasNowait=1**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "93*regionType=task*sscl=test4.remove-task.c:50:50*escl=test4.remove-task.c:53:53*hasUntied=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); } opari2-2.0.10/test/data/PaxHeaders/test4.remove-task.c0000644000000000000000000000013215232670204017400 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.remove-task.c0000664000175100001440000000224215232670204017732 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #include #endif int main() { int i; #pragma omp parallel { printf("parallel\n"); #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } #pragma omp sections nowait { #pragma omp section printf("section nowait 1\n"); #pragma omp section { printf("section nowait 2\n"); } } #pragma omp single nowait { printf("single nowait\n"); } #pragma omp task untied { printf("task untied\n"); } } } opari2-2.0.10/test/data/PaxHeaders/test4.f90.out0000644000000000000000000000013215232670204016126 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.f90.out0000664000175100001440000001035315232670204016462 0ustar00builderusers #line 1 "test4.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 include 'test4.f90.opari.inc' #line 20 "test4.f90" integer i real a(5,5), b(5,5), c(5,5) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 24 "test4.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 25 "test4.f90" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 26 "test4.f90" !$omp do do i=1,4 write(*,*) "do nowait",i enddo #line 30 "test4.f90" !$omp enddo nowait call POMP2_Do_exit(opari2_region_2) #line 31 "test4.f90" call POMP2_Sections_enter(opari2_region_3, & opari2_ctc_3 ) #line 32 "test4.f90" !$omp sections #line 33 "test4.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 34 "test4.f90" write(*,*) "section nowait 1" call POMP2_Section_end(opari2_region_3) #line 35 "test4.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 36 "test4.f90" write(*,*) "section nowait 2" call POMP2_Section_end(opari2_region_3) #line 37 "test4.f90" !$omp end sections nowait call POMP2_Sections_exit(opari2_region_3) #line 38 "test4.f90" call POMP2_Single_enter(opari2_region_4, & opari2_ctc_4 ) #line 39 "test4.f90" !$omp single call POMP2_Single_begin(opari2_region_4) #line 40 "test4.f90" write(*,*) "single nowait" call POMP2_Single_end(opari2_region_4) #line 41 "test4.f90" !$omp end single nowait call POMP2_Single_exit(opari2_region_4) #line 42 "test4.f90" call POMP2_Workshare_enter(opari2_region_5, & opari2_ctc_5 ) #line 43 "test4.f90" !$omp workshare a = b + c #line 45 "test4.f90" !$omp end workshare nowait call POMP2_Workshare_exit(opari2_region_5) #line 46 "test4.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Untied_task_create_begin(opari2_region_6, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_6 ) end if #line 47 "test4.f90" !$omp task untied if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Untied_task_begin(opari2_region_6, pomp2_new_task) end if #line 48 "test4.f90" write(*,*) "task" if (pomp2_if) then call POMP2_Untied_task_end(opari2_region_6) end if #line 49 "test4.f90" !$omp end task if (pomp2_if) then call POMP2_Untied_task_create_end(opari2_region_6, pomp2_old_task) end if #line 50 "test4.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 51 "test4.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 52 "test4.f90" end program test4 subroutine POMP2_Init_reg_000() include 'test4.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) end opari2-2.0.10/test/data/PaxHeaders/test4.f90.opari.inc.out0000644000000000000000000000013215232670204020007 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.f90.opari.inc.out0000664000175100001440000000305215232670204020341 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test4.f90:24:24*escl=test4.f90:51:51**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "58*regionType=do*sscl=test4.f90:26:26*escl=test4.f90:30:30**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "78*regionType=sections*sscl=test4.f90:32:32*escl=test4.f90:37:37*numSections=2**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "62*regionType=single*sscl=test4.f90:39:39*escl=test4.f90:41:41**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "65*regionType=workshare*sscl=test4.f90:43:43*escl=test4.f90:45:45**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "72*regionType=task*sscl=test4.f90:47:47*escl=test4.f90:49:49*hasUntied=1**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test4.f900000644000000000000000000000013215232670204015320 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.f900000664000175100001440000000227515232670204015660 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 integer i real a(5,5), b(5,5), c(5,5) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do nowait",i enddo !$omp enddo nowait !$omp sections !$omp section write(*,*) "section nowait 1" !$omp section write(*,*) "section nowait 2" !$omp end sections nowait !$omp single write(*,*) "single nowait" !$omp end single nowait !$omp workshare a = b + c !$omp end workshare nowait !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel end program test4 opari2-2.0.10/test/data/PaxHeaders/test4.f.out0000644000000000000000000000013215232670204015755 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.f.out0000664000175100001440000001027715232670204016316 0ustar00builderusers #line 1 "test4.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 include 'test4.f.opari.inc' #line 20 "test4.f" integer i real a(5,5), b(5,5), c(5,5) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 24 "test4.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 25 "test4.f" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 26 "test4.f" !$omp do do i=1,4 write(*,*) "do nowait",i enddo #line 30 "test4.f" !$omp enddo nowait call POMP2_Do_exit(opari2_region_2) #line 31 "test4.f" call POMP2_Sections_enter(opari2_region_3, &opari2_ctc_3 ) #line 32 "test4.f" !$omp sections #line 33 "test4.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 34 "test4.f" write(*,*) "section nowait 1" call POMP2_Section_end(opari2_region_3) #line 35 "test4.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 36 "test4.f" write(*,*) "section nowait 2" call POMP2_Section_end(opari2_region_3) #line 37 "test4.f" !$omp end sections nowait call POMP2_Sections_exit(opari2_region_3) #line 38 "test4.f" call POMP2_Single_enter(opari2_region_4, &opari2_ctc_4 ) #line 39 "test4.f" !$omp single call POMP2_Single_begin(opari2_region_4) #line 40 "test4.f" write(*,*) "single nowait" call POMP2_Single_end(opari2_region_4) #line 41 "test4.f" !$omp end single nowait call POMP2_Single_exit(opari2_region_4) #line 42 "test4.f" call POMP2_Workshare_enter(opari2_region_5, &opari2_ctc_5 ) #line 43 "test4.f" !$omp workshare a = b + c #line 45 "test4.f" !$omp end workshare nowait call POMP2_Workshare_exit(opari2_region_5) #line 46 "test4.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_6, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_6 ) end if #line 47 "test4.f" !$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_6, pomp2_new_task) end if #line 48 "test4.f" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_6) end if #line 49 "test4.f" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_6, &pomp2_old_task) end if #line 50 "test4.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 51 "test4.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 52 "test4.f" end program test4 subroutine POMP2_Init_reg_000() include 'test4.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) end opari2-2.0.10/test/data/PaxHeaders/test4.f.opari.inc.out0000644000000000000000000000013215232670204017636 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.f.opari.inc.out0000664000175100001440000000311015232670204020163 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test4.f:24:24*escl=test4.f:51:5"// &"1**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"56*regionType=do*sscl=test4.f:26:26*escl=test4.f:30:30**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"76*regionType=sections*sscl=test4.f:32:32*escl=test4.f:37:3"// &"7*numSections=2**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"60*regionType=single*sscl=test4.f:39:39*escl=test4.f:41:41*"// &"*") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"63*regionType=workshare*sscl=test4.f:43:43*escl=test4.f:45:"// &"45**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"70*regionType=task*sscl=test4.f:47:47*escl=test4.f:49:49*ha"// &"sUntied=1**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test4.f0000644000000000000000000000013215232670204015147 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.f0000664000175100001440000000233115232670204015500 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 integer i real a(5,5), b(5,5), c(5,5) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do nowait",i enddo !$omp enddo nowait !$omp sections !$omp section write(*,*) "section nowait 1" !$omp section write(*,*) "section nowait 2" !$omp end sections nowait !$omp single write(*,*) "single nowait" !$omp end single nowait !$omp workshare a = b + c !$omp end workshare nowait !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel end program test4 opari2-2.0.10/test/data/PaxHeaders/test4.c.out0000644000000000000000000000013215232670204015752 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.c.out0000664000175100001440000000634415232670204016313 0ustar00builderusers#include "test4.c.opari.inc" #line 1 "test4.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #endif int main() { int i; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 29 "test4.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 30 "test4.c" { printf("parallel\n"); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 32 "test4.c" #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } POMP2_For_exit( &opari2_region_2 ); } #line 36 "test4.c" { POMP2_Sections_enter( &opari2_region_3, opari2_ctc_3 ); #line 37 "test4.c" #pragma omp sections nowait { #line 39 "test4.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 40 "test4.c" printf("section nowait 1\n"); POMP2_Section_end( &opari2_region_3 ); } #line 41 "test4.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 42 "test4.c" { printf("section nowait 2\n"); } POMP2_Section_end( &opari2_region_3 ); } #line 43 "test4.c" } POMP2_Sections_exit( &opari2_region_3 ); } #line 44 "test4.c" { POMP2_Single_enter( &opari2_region_4, opari2_ctc_4 ); #line 45 "test4.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_4 ); #line 46 "test4.c" { printf("single nowait\n"); } POMP2_Single_end( &opari2_region_4 ); } POMP2_Single_exit( &opari2_region_4 ); } #line 49 "test4.c" { int pomp2_if = 1; { POMP2_Task_handle pomp2_old_task; POMP2_Task_handle pomp2_new_task; if (pomp2_if) POMP2_Untied_task_create_begin( &opari2_region_5, &pomp2_new_task, &pomp2_old_task, pomp2_if, opari2_ctc_5 ); #line 50 "test4.c" #pragma omp task untied POMP2_DLIST_00005 if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) { if (pomp2_if) POMP2_Untied_task_begin( &opari2_region_5, pomp2_new_task ); #line 51 "test4.c" { printf("task untied\n"); } if (pomp2_if) POMP2_Untied_task_end( &opari2_region_5 ); } if (pomp2_if) POMP2_Untied_task_create_end( &opari2_region_5, pomp2_old_task ); } } #line 54 "test4.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 55 "test4.c" } opari2-2.0.10/test/data/PaxHeaders/test4.c.opari.inc.out0000644000000000000000000000013215232670204017633 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.c.opari.inc.out0000664000175100001440000000244715232670204020174 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3,opari2_region_4,opari2_region_5) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test4.c:29:29*escl=test4.c:54:54**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "68*regionType=for*sscl=test4.c:32:32*escl=test4.c:35:35*hasNowait=1**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "87*regionType=sections*sscl=test4.c:37:37*escl=test4.c:43:43*numSections=2*hasNowait=1**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "71*regionType=single*sscl=test4.c:45:45*escl=test4.c:48:48*hasNowait=1**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "69*regionType=task*sscl=test4.c:50:50*escl=test4.c:53:53*hasUntied=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); } opari2-2.0.10/test/data/PaxHeaders/test4.c0000644000000000000000000000013215232670204015144 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test4.c0000664000175100001440000000224215232670204015476 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #include #endif int main() { int i; #pragma omp parallel { printf("parallel\n"); #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } #pragma omp sections nowait { #pragma omp section printf("section nowait 1\n"); #pragma omp section { printf("section nowait 2\n"); } } #pragma omp single nowait { printf("single nowait\n"); } #pragma omp task untied { printf("task untied\n"); } } } opari2-2.0.10/test/data/PaxHeaders/test3.f90.out0000644000000000000000000000013215232670204016125 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test3.f90.out0000664000175100001440000003511215232670204016461 0ustar00builderusers #line 1 "test3.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 include 'test3.f90.opari.inc' #line 20 "test3.f90" integer i, j, k pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 22 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 23 "test3.f90" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 23 "test3.f90" !$omp do do 12,i = 1,8 a=a+1 12 continue #line 26 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 27 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 27 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 28 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 29 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Do_enter(opari2_region_3, & opari2_ctc_3 ) #line 29 "test3.f90" !$omp do do 13,i = 1,8 a=a+1 13 continue #line 33 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Do_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 33 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 34 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 34 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 35 "test3.f90" call POMP2_Do_enter(opari2_region_5, & opari2_ctc_5 ) #line 35 "test3.f90" !$omp do do 14,i = 1,8 a=a+1 14 continue #line 38 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 39 "test3.f90" call POMP2_Atomic_enter(opari2_region_6, & opari2_ctc_6 ) #line 39 "test3.f90" !$omp atomic me = me + omp_get_thread_num() call POMP2_Atomic_exit(opari2_region_6) #line 41 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 41 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 42 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_7,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_7 ) #line 43 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_7) call POMP2_Do_enter(opari2_region_7, & opari2_ctc_7 ) #line 43 "test3.f90" !$omp do do 15,i = 1,8 15 a=a+1 #line 45 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_7,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, pomp2_old_task) call POMP2_Do_exit(opari2_region_7) call POMP2_Parallel_end(opari2_region_7) #line 45 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_7, pomp2_old_task) #line 46 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_8,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_8 ) #line 46 "test3.f90" !$omp parallel private(me,glob) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) #line 47 "test3.f90" me = omp_get_thread_num() call POMP2_Implicit_barrier_enter(opari2_region_8,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, pomp2_old_task) call POMP2_Parallel_end(opari2_region_8) #line 48 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, pomp2_old_task) #line 49 "test3.f90" ! ********************** ! * nested parallelism * ! ********************** pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_9,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_9 ) #line 54 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) #line 55 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_10 ) #line 55 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) #line 56 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_11,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_11 ) #line 56 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_11) #line 57 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_12,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_12 ) #line 57 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_12) call POMP2_Do_enter(opari2_region_12, & opari2_ctc_12 ) #line 57 "test3.f90" !$omp do do i = 1,8 a=a+1 enddo #line 61 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_12,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, pomp2_old_task) call POMP2_Do_exit(opari2_region_12) call POMP2_Parallel_end(opari2_region_12) #line 61 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_12, pomp2_old_task) #line 62 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_11,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_11, pomp2_old_task) call POMP2_Parallel_end(opari2_region_11) #line 62 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_11, pomp2_old_task) #line 63 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_10,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, pomp2_old_task) call POMP2_Parallel_end(opari2_region_10) #line 63 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, pomp2_old_task) #line 64 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_9,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, pomp2_old_task) call POMP2_Parallel_end(opari2_region_9) #line 64 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, pomp2_old_task) #line 65 "test3.f90" ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_13,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_13 ) #line 70 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_13) call POMP2_Do_enter(opari2_region_13, & opari2_ctc_13 ) #line 70 "test3.f90" !$omp do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue #line 75 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_13,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, pomp2_old_task) call POMP2_Do_exit(opari2_region_13) call POMP2_Parallel_end(opari2_region_13) #line 75 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_13, pomp2_old_task) #line 76 "test3.f90" do 17,i = 1,8 pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_14 ) #line 77 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) call POMP2_Do_enter(opari2_region_14, & opari2_ctc_14 ) #line 77 "test3.f90" !$omp do do 18, j = 1,8 a=a+1 18 continue #line 80 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_14,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, pomp2_old_task) call POMP2_Do_exit(opari2_region_14) call POMP2_Parallel_end(opari2_region_14) #line 80 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, pomp2_old_task) #line 81 "test3.f90" 17 continue pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_15,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_15 ) #line 83 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_15) call POMP2_Do_enter(opari2_region_15, & opari2_ctc_15 ) #line 83 "test3.f90" !$omp do do if (a .gt. 0) then exit endif enddo #line 89 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_15,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_15, pomp2_old_task) call POMP2_Do_exit(opari2_region_15) call POMP2_Parallel_end(opari2_region_15) #line 89 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_15, pomp2_old_task) #line 90 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_16,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_16 ) #line 90 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_16) call POMP2_Do_enter(opari2_region_16, & opari2_ctc_16 ) #line 90 "test3.f90" !$omp do loopLabel: do i = 1,8 a=a+1 end do loopLabel #line 94 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_16,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_16, pomp2_old_task) call POMP2_Do_exit(opari2_region_16) call POMP2_Parallel_end(opari2_region_16) #line 94 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_16, pomp2_old_task) #line 95 "test3.f90" end program test3 subroutine POMP2_Init_reg_000() include 'test3.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) end opari2-2.0.10/test/data/PaxHeaders/test3.f90.opari.inc.out0000644000000000000000000000013215232670204020006 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test3.f90.opari.inc.out0000664000175100001440000000714415232670204020346 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test3.f90:22:22*escl=test3.f90:27:27**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "58*regionType=do*sscl=test3.f90:23:23*escl=test3.f90:26:26**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "66*regionType=paralleldo*sscl=test3.f90:29:29*escl=test3.f90:33:33**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "64*regionType=parallel*sscl=test3.f90:34:34*escl=test3.f90:41:41**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "58*regionType=do*sscl=test3.f90:35:35*escl=test3.f90:38:38**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "62*regionType=atomic*sscl=test3.f90:39:39*escl=test3.f90:40:40**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "66*regionType=paralleldo*sscl=test3.f90:43:43*escl=test3.f90:45:45**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "64*regionType=parallel*sscl=test3.f90:46:46*escl=test3.f90:48:48**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "64*regionType=parallel*sscl=test3.f90:54:54*escl=test3.f90:64:64**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "64*regionType=parallel*sscl=test3.f90:55:55*escl=test3.f90:63:63**" INTEGER( KIND=8 ) :: opari2_region_11 CHARACTER (LEN=999), parameter :: opari2_ctc_11 =& "64*regionType=parallel*sscl=test3.f90:56:56*escl=test3.f90:62:62**" INTEGER( KIND=8 ) :: opari2_region_12 CHARACTER (LEN=999), parameter :: opari2_ctc_12 =& "66*regionType=paralleldo*sscl=test3.f90:57:57*escl=test3.f90:61:61**" INTEGER( KIND=8 ) :: opari2_region_13 CHARACTER (LEN=999), parameter :: opari2_ctc_13 =& "66*regionType=paralleldo*sscl=test3.f90:70:70*escl=test3.f90:75:75**" INTEGER( KIND=8 ) :: opari2_region_14 CHARACTER (LEN=999), parameter :: opari2_ctc_14 =& "66*regionType=paralleldo*sscl=test3.f90:77:77*escl=test3.f90:80:80**" INTEGER( KIND=8 ) :: opari2_region_15 CHARACTER (LEN=999), parameter :: opari2_ctc_15 =& "66*regionType=paralleldo*sscl=test3.f90:83:83*escl=test3.f90:89:89**" INTEGER( KIND=8 ) :: opari2_region_16 CHARACTER (LEN=999), parameter :: opari2_ctc_16 =& "66*regionType=paralleldo*sscl=test3.f90:90:90*escl=test3.f90:94:94**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10,& opari2_region_11,& opari2_region_12,& opari2_region_13,& opari2_region_14,& opari2_region_15,& opari2_region_16 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test3.f900000644000000000000000000000013215232670204015317 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test3.f900000664000175100001440000000365615232670204015663 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 integer i, j, k !$OMP parallel !$OMP do do 12,i = 1,8 a=a+1 12 continue !$OMP end parallel !$OMP parallel do do 13,i = 1,8 a=a+1 13 continue !$OMP parallel !$OMP do do 14,i = 1,8 a=a+1 14 continue !$OMP atomic me = me + omp_get_thread_num() !$OMP end parallel !$OMP parallel do do 15,i = 1,8 15 a=a+1 !$OMP parallel private(me,glob) me = omp_get_thread_num() !$OMP end parallel ! ********************** ! * nested parallelism * ! ********************** !$omp parallel !$omp parallel !$omp parallel !$omp parallel do do i = 1,8 a=a+1 enddo !$omp end parallel do !$omp end parallel !$omp end parallel !$omp end parallel ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* !$OMP parallel do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue do 17,i = 1,8 !$OMP parallel do do 18, j = 1,8 a=a+1 18 continue 17 continue !$omp parallel do do if (a .gt. 0) then exit endif enddo !$OMP parallel do loopLabel: do i = 1,8 a=a+1 end do loopLabel end program test3 opari2-2.0.10/test/data/PaxHeaders/test3.f.out0000644000000000000000000000013215232670204015754 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426078.003262898 opari2-2.0.10/test/data/test3.f.out0000664000175100001440000003274515232670204016321 0ustar00builderusers #line 1 "test3.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 include 'test3.f.opari.inc' #line 20 "test3.f" integer i, j, k real end_level, dolic pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 23 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 24 "test3.f" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 24 "test3.f" c$omp do do 12,i = 1,8 a=a+1 12 continue #line 27 "test3.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 28 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 28 "test3.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 29 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_3 ) #line 30 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Do_enter(opari2_region_3, &opari2_ctc_3 ) #line 30 "test3.f" c$omp do do 13,i = 1,8 a=a+1 13 continue #line 34 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_3, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, &pomp2_old_task) call POMP2_Do_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 34 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, &pomp2_old_task) #line 35 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 35 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 36 "test3.f" call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 36 "test3.f" c$omp do do 14,i = 1,8 a=a+1 14 continue #line 39 "test3.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 40 "test3.f" call POMP2_Atomic_enter(opari2_region_6, &opari2_ctc_6 ) #line 40 "test3.f" c$omp atomic me = me + omp_get_thread_num() call POMP2_Atomic_exit(opari2_region_6) #line 42 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_4, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 42 "test3.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 43 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_7, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_7 ) #line 44 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_7) call POMP2_Do_enter(opari2_region_7, &opari2_ctc_7 ) #line 44 "test3.f" c$omp do do 15,i = 1,8 15 a=a+1 #line 46 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Do_exit(opari2_region_7) call POMP2_Parallel_end(opari2_region_7) #line 46 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_7, &pomp2_old_task) #line 47 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_8, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_8 ) #line 47 "test3.f" c$omp parallel private(me,glob) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) #line 48 "test3.f" me = omp_get_thread_num() call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_8) #line 49 "test3.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_8, &pomp2_old_task) #line 50 "test3.f" ! ********************** ! * nested parallelism * ! ********************** pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_9, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_9 ) #line 55 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) #line 56 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_10 ) #line 56 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) #line 57 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_11, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_11 ) #line 57 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_11) #line 58 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_12, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_12 ) #line 58 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_12) call POMP2_Do_enter(opari2_region_12, &opari2_ctc_12 ) #line 58 "test3.f" !$omp do do i = 1,8 end_level = end_level + dolic/i a=a+1 end do #line 63 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_12, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, &pomp2_old_task) call POMP2_Do_exit(opari2_region_12) call POMP2_Parallel_end(opari2_region_12) #line 63 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_12, &pomp2_old_task) #line 64 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_11, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_11, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_11) #line 64 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_11, &pomp2_old_task) #line 65 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_10, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_10) #line 65 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, &pomp2_old_task) #line 66 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_9, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_9) #line 66 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, &pomp2_old_task) #line 67 "test3.f" ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_13, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_13 ) #line 71 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_13) call POMP2_Do_enter(opari2_region_13, &opari2_ctc_13 ) #line 71 "test3.f" c$omp do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue #line 76 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_13, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, &pomp2_old_task) call POMP2_Do_exit(opari2_region_13) call POMP2_Parallel_end(opari2_region_13) #line 76 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_13, &pomp2_old_task) #line 77 "test3.f" do 17,i = 1,8 pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_14 ) #line 78 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) call POMP2_Do_enter(opari2_region_14, &opari2_ctc_14 ) #line 78 "test3.f" c$omp do do 18, j = 1,8 a=a+1 18 continue #line 81 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_14, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, &pomp2_old_task) call POMP2_Do_exit(opari2_region_14) call POMP2_Parallel_end(opari2_region_14) #line 81 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, &pomp2_old_task) #line 82 "test3.f" 17 continue pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_15, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_15 ) #line 84 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_15) call POMP2_Do_enter(opari2_region_15, &opari2_ctc_15 ) #line 84 "test3.f" c$omp do do if (a .gt. 0) then exit endif enddo #line 89 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_15, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_15, &pomp2_old_task) call POMP2_Do_exit(opari2_region_15) call POMP2_Parallel_end(opari2_region_15) #line 89 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_15, &pomp2_old_task) #line 90 "test3.f" end program test3 subroutine POMP2_Init_reg_000() include 'test3.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) end opari2-2.0.10/test/data/PaxHeaders/test3.f.opari.inc.out0000644000000000000000000000013215232670204017635 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test3.f.opari.inc.out0000664000175100001440000000670115232670204020173 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test3.f:23:23*escl=test3.f:28:2"// &"8**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"56*regionType=do*sscl=test3.f:24:24*escl=test3.f:27:27**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"64*regionType=paralleldo*sscl=test3.f:30:30*escl=test3.f:34"// &":34**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"62*regionType=parallel*sscl=test3.f:35:35*escl=test3.f:42:4"// &"2**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"56*regionType=do*sscl=test3.f:36:36*escl=test3.f:39:39**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"60*regionType=atomic*sscl=test3.f:40:40*escl=test3.f:41:41*"// &"*") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"64*regionType=paralleldo*sscl=test3.f:44:44*escl=test3.f:46"// &":46**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"62*regionType=parallel*sscl=test3.f:47:47*escl=test3.f:49:4"// &"9**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"62*regionType=parallel*sscl=test3.f:55:55*escl=test3.f:66:6"// &"6**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"62*regionType=parallel*sscl=test3.f:56:56*escl=test3.f:65:6"// &"5**") INTEGER*8 opari2_region_11 CHARACTER*999 opari2_ctc_11 PARAMETER (opari2_ctc_11= &"62*regionType=parallel*sscl=test3.f:57:57*escl=test3.f:64:6"// &"4**") INTEGER*8 opari2_region_12 CHARACTER*999 opari2_ctc_12 PARAMETER (opari2_ctc_12= &"64*regionType=paralleldo*sscl=test3.f:58:58*escl=test3.f:63"// &":63**") INTEGER*8 opari2_region_13 CHARACTER*999 opari2_ctc_13 PARAMETER (opari2_ctc_13= &"64*regionType=paralleldo*sscl=test3.f:71:71*escl=test3.f:76"// &":76**") INTEGER*8 opari2_region_14 CHARACTER*999 opari2_ctc_14 PARAMETER (opari2_ctc_14= &"64*regionType=paralleldo*sscl=test3.f:78:78*escl=test3.f:81"// &":81**") INTEGER*8 opari2_region_15 CHARACTER*999 opari2_ctc_15 PARAMETER (opari2_ctc_15= &"64*regionType=paralleldo*sscl=test3.f:84:84*escl=test3.f:89"// &":89**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10, & opari2_region_11, & opari2_region_12, & opari2_region_13, & opari2_region_14, & opari2_region_15 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test3.f0000644000000000000000000000013215232670204015146 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test3.f0000664000175100001440000000371315232670204015504 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 integer i, j, k real end_level, dolic c$OMP parallel c$OMP do do 12,i = 1,8 a=a+1 12 continue c$OMP end parallel c$OMP parallel do do 13,i = 1,8 a=a+1 13 continue c$OMP parallel c$OMP do do 14,i = 1,8 a=a+1 14 continue c$OMP atomic me = me + omp_get_thread_num() c$OMP end parallel c$OMP parallel do do 15,i = 1,8 15 a=a+1 c$OMP parallel private(me,glob) me = omp_get_thread_num() c$OMP end parallel ! ********************** ! * nested parallelism * ! ********************** !$omp parallel !$omp parallel !$omp parallel !$omp parallel do do i = 1,8 end_level = end_level + dolic/i a=a+1 end do !$omp end parallel do !$omp end parallel !$omp end parallel !$omp end parallel ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* c$OMP parallel do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue do 17,i = 1,8 c$OMP parallel do do 18, j = 1,8 a=a+1 18 continue 17 continue c$omp parallel do do if (a .gt. 0) then exit endif enddo end program test3 opari2-2.0.10/test/data/PaxHeaders/test3.c.out0000644000000000000000000000013215232670204015751 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test3.c.out0000664000175100001440000002532615232670204016313 0ustar00builderusers#include "test3.c.opari.inc" #line 1 "test3.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Special tests for code blocks and nested parallel regions/loops. */ #include #ifdef _OPENMP #endif int main() { int i, j; int k = 0; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 31 "test3.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 32 "test3.c" { { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 33 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_For_exit( &opari2_region_2 ); } #line 38 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 39 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_3, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_3 ); #line 40 "test3.c" #pragma omp parallel POMP2_DLIST_00003 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_3 ); #line 41 "test3.c" { POMP2_For_enter( &opari2_region_4, opari2_ctc_4 ); #line 41 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_4, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_4, pomp2_old_task ); } POMP2_For_exit( &opari2_region_4 ); } #line 46 "test3.c" { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_3, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_3, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_3 ); } POMP2_Parallel_join( &opari2_region_3, pomp2_old_task ); } #line 46 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_5, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_5 ); #line 47 "test3.c" #pragma omp parallel POMP2_DLIST_00005 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_5 ); #line 48 "test3.c" { #line 49 "test3.c" #pragma omp master { POMP2_Master_begin( &opari2_region_6, opari2_ctc_6 ); #line 50 "test3.c" for (i=0; i<4; ++i) k++; POMP2_Master_end( &opari2_region_6 ); } #line 52 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_5, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_5, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_5 ); } POMP2_Parallel_join( &opari2_region_5, pomp2_old_task ); } #line 53 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_7, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_7 ); #line 54 "test3.c" #pragma omp parallel POMP2_DLIST_00007 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_7 ); #line 55 "test3.c" { { POMP2_Single_enter( &opari2_region_8, opari2_ctc_8 ); #line 56 "test3.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_8 ); #line 57 "test3.c" for (i=0; i<4; ++i) k++; POMP2_Single_end( &opari2_region_8 ); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_8, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_8, pomp2_old_task ); } POMP2_Single_exit( &opari2_region_8 ); } #line 58 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_7, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_7, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_7 ); } POMP2_Parallel_join( &opari2_region_7, pomp2_old_task ); } #line 59 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_9, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_9 ); #line 60 "test3.c" #pragma omp parallel POMP2_DLIST_00009 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_9 ); #line 61 "test3.c" { POMP2_Critical_enter( &opari2_region_10, opari2_ctc_10 ); #line 61 "test3.c" #pragma omp critical { POMP2_Critical_begin( &opari2_region_10 ); #line 62 "test3.c" for (i=0; i<4; ++i) k++; POMP2_Critical_end( &opari2_region_10 ); } POMP2_Critical_exit( &opari2_region_10 ); } #line 63 "test3.c" { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_9, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_9, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_9 ); } POMP2_Parallel_join( &opari2_region_9, pomp2_old_task ); } #line 63 "test3.c" // ***************************************** // * Testing of nested parallelism * // ***************************************** { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_11, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_11 ); #line 68 "test3.c" #pragma omp parallel POMP2_DLIST_00011 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_11 ); #line 69 "test3.c" { { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_12, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_12 ); #line 70 "test3.c" #pragma omp parallel POMP2_DLIST_00012 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_12 ); #line 71 "test3.c" { { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_13, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_13 ); #line 72 "test3.c" #pragma omp parallel POMP2_DLIST_00013 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_13 ); #line 73 "test3.c" { { POMP2_For_enter( &opari2_region_14, opari2_ctc_14 ); #line 74 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { printf("do %d\n", i); } POMP2_For_exit( &opari2_region_14 ); } #line 78 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_13, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_13, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_13 ); } POMP2_Parallel_join( &opari2_region_13, pomp2_old_task ); } #line 79 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_12, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_12, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_12 ); } POMP2_Parallel_join( &opari2_region_12, pomp2_old_task ); } #line 80 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_11, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_11, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_11 ); } POMP2_Parallel_join( &opari2_region_11, pomp2_old_task ); } #line 81 "test3.c" // ***************************************** // * Testing of nested for loops * // ***************************************** { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_15, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_15 ); #line 86 "test3.c" #pragma omp parallel POMP2_DLIST_00015 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_15 ); #line 87 "test3.c" { { POMP2_For_enter( &opari2_region_16, opari2_ctc_16 ); #line 88 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { printf("do %d\n", i); } } POMP2_For_exit( &opari2_region_16 ); } #line 94 "test3.c" { POMP2_For_enter( &opari2_region_17, opari2_ctc_17 ); #line 95 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { for (k=0; k<4; ++k) { printf("do %d\n", i); } } } POMP2_For_exit( &opari2_region_17 ); } #line 103 "test3.c" { POMP2_For_enter( &opari2_region_18, opari2_ctc_18 ); #line 104 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) printf("do %d\n", i); POMP2_For_exit( &opari2_region_18 ); } #line 108 "test3.c" { POMP2_For_enter( &opari2_region_19, opari2_ctc_19 ); #line 109 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) for (k=0; k<4; ++k) printf("do %d\n", i); POMP2_For_exit( &opari2_region_19 ); } #line 114 "test3.c" { POMP2_For_enter( &opari2_region_20, opari2_ctc_20 ); #line 115 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) { printf("do %d\n", i); } POMP2_For_exit( &opari2_region_20 ); } #line 120 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_15, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_15, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_15 ); } POMP2_Parallel_join( &opari2_region_15, pomp2_old_task ); } #line 121 "test3.c" } opari2-2.0.10/test/data/PaxHeaders/test3.c.opari.inc.out0000644000000000000000000000013215232670204017632 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test3.c.opari.inc.out0000664000175100001440000001150115232670204020162 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test3.c:31:31*escl=test3.c:38:38**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "56*regionType=for*sscl=test3.c:33:33*escl=test3.c:37:37**" #define POMP2_DLIST_00003 shared(opari2_region_3,opari2_region_4) static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "61*regionType=parallel*sscl=test3.c:40:40*escl=test3.c:45:45**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "56*regionType=for*sscl=test3.c:41:41*escl=test3.c:45:45**" #define POMP2_DLIST_00005 shared(opari2_region_5,opari2_region_6) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "61*regionType=parallel*sscl=test3.c:47:47*escl=test3.c:52:52**" static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "59*regionType=master*sscl=test3.c:49:49*escl=test3.c:51:51**" #define POMP2_DLIST_00007 shared(opari2_region_7,opari2_region_8) static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "61*regionType=parallel*sscl=test3.c:54:54*escl=test3.c:58:58**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "59*regionType=single*sscl=test3.c:56:56*escl=test3.c:57:57**" #define POMP2_DLIST_00009 shared(opari2_region_9,opari2_region_10) static OPARI2_Region_handle opari2_region_9 = NULL; #define opari2_ctc_9 "61*regionType=parallel*sscl=test3.c:60:60*escl=test3.c:62:62**" static OPARI2_Region_handle opari2_region_10 = NULL; #define opari2_ctc_10 "61*regionType=critical*sscl=test3.c:61:61*escl=test3.c:62:62**" #define POMP2_DLIST_00011 shared(opari2_region_11,opari2_region_12,opari2_region_13,opari2_region_14) static OPARI2_Region_handle opari2_region_11 = NULL; #define opari2_ctc_11 "61*regionType=parallel*sscl=test3.c:68:68*escl=test3.c:80:80**" #define POMP2_DLIST_00012 shared(opari2_region_12,opari2_region_13,opari2_region_14) static OPARI2_Region_handle opari2_region_12 = NULL; #define opari2_ctc_12 "61*regionType=parallel*sscl=test3.c:70:70*escl=test3.c:79:79**" #define POMP2_DLIST_00013 shared(opari2_region_13,opari2_region_14) static OPARI2_Region_handle opari2_region_13 = NULL; #define opari2_ctc_13 "61*regionType=parallel*sscl=test3.c:72:72*escl=test3.c:78:78**" static OPARI2_Region_handle opari2_region_14 = NULL; #define opari2_ctc_14 "68*regionType=for*sscl=test3.c:74:74*escl=test3.c:77:77*hasNowait=1**" #define POMP2_DLIST_00015 shared(opari2_region_15,opari2_region_16,opari2_region_17,opari2_region_18,opari2_region_19,opari2_region_20) static OPARI2_Region_handle opari2_region_15 = NULL; #define opari2_ctc_15 "63*regionType=parallel*sscl=test3.c:86:86*escl=test3.c:120:120**" static OPARI2_Region_handle opari2_region_16 = NULL; #define opari2_ctc_16 "68*regionType=for*sscl=test3.c:88:88*escl=test3.c:93:93*hasNowait=1**" static OPARI2_Region_handle opari2_region_17 = NULL; #define opari2_ctc_17 "70*regionType=for*sscl=test3.c:95:95*escl=test3.c:102:102*hasNowait=1**" static OPARI2_Region_handle opari2_region_18 = NULL; #define opari2_ctc_18 "72*regionType=for*sscl=test3.c:104:104*escl=test3.c:107:107*hasNowait=1**" static OPARI2_Region_handle opari2_region_19 = NULL; #define opari2_ctc_19 "72*regionType=for*sscl=test3.c:109:109*escl=test3.c:113:113*hasNowait=1**" static OPARI2_Region_handle opari2_region_20 = NULL; #define opari2_ctc_20 "72*regionType=for*sscl=test3.c:115:115*escl=test3.c:119:119*hasNowait=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); POMP2_Assign_handle( &opari2_region_9, opari2_ctc_9 ); POMP2_Assign_handle( &opari2_region_10, opari2_ctc_10 ); POMP2_Assign_handle( &opari2_region_11, opari2_ctc_11 ); POMP2_Assign_handle( &opari2_region_12, opari2_ctc_12 ); POMP2_Assign_handle( &opari2_region_13, opari2_ctc_13 ); POMP2_Assign_handle( &opari2_region_14, opari2_ctc_14 ); POMP2_Assign_handle( &opari2_region_15, opari2_ctc_15 ); POMP2_Assign_handle( &opari2_region_16, opari2_ctc_16 ); POMP2_Assign_handle( &opari2_region_17, opari2_ctc_17 ); POMP2_Assign_handle( &opari2_region_18, opari2_ctc_18 ); POMP2_Assign_handle( &opari2_region_19, opari2_ctc_19 ); POMP2_Assign_handle( &opari2_region_20, opari2_ctc_20 ); } opari2-2.0.10/test/data/PaxHeaders/test3.c0000644000000000000000000000013215232670204015143 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test3.c0000664000175100001440000000444115232670204015500 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Special tests for code blocks and nested parallel regions/loops. */ #include #ifdef _OPENMP #include #endif int main() { int i, j; int k = 0; #pragma omp parallel { #pragma omp for for (i=0; i<4; ++i) { k++; } } #pragma omp parallel #pragma omp for for (i=0; i<4; ++i) { k++; } #pragma omp parallel { #pragma omp master for (i=0; i<4; ++i) k++; } #pragma omp parallel { #pragma omp single for (i=0; i<4; ++i) k++; } #pragma omp parallel #pragma omp critical for (i=0; i<4; ++i) k++; // ***************************************** // * Testing of nested parallelism * // ***************************************** #pragma omp parallel { #pragma omp parallel { #pragma omp parallel { #pragma omp for nowait for (i=0; i<4; ++i) { printf("do %d\n", i); } } } } // ***************************************** // * Testing of nested for loops * // ***************************************** #pragma omp parallel { #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { printf("do %d\n", i); } } #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { for (k=0; k<4; ++k) { printf("do %d\n", i); } } } #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) printf("do %d\n", i); #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) for (k=0; k<4; ++k) printf("do %d\n", i); #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) { printf("do %d\n", i); } } } opari2-2.0.10/test/data/PaxHeaders/test2.f90.out0000644000000000000000000000013215232670204016124 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.f90.out0000664000175100001440000002174615232670204016470 0ustar00builderusers #line 1 "test2.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 include 'test2.f90.opari.inc' #line 20 "test2.f90" integer i integer k integer, save :: j #line 24 "test2.f90" !$omp threadprivate(j) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 26 "test2.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test2.f90" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 28 "test2.f90" !$omp do do i=1,4 write(*,*) "do",i enddo #line 32 "test2.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 33 "test2.f90" call POMP2_Flush_enter(opari2_region_3, & opari2_ctc_3 ) #line 34 "test2.f90" !$omp flush(k) call POMP2_Flush_exit(opari2_region_3) #line 35 "test2.f90" call POMP2_Do_enter(opari2_region_4, & opari2_ctc_4 ) #line 36 "test2.f90" !$omp do ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_5, & opari2_ctc_5 ) #line 38 "test2.f90" !$omp ordered call POMP2_Ordered_begin(opari2_region_5) #line 39 "test2.f90" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_5) #line 40 "test2.f90" !$omp end ordered call POMP2_Ordered_exit(opari2_region_5) #line 41 "test2.f90" enddo #line 42 "test2.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Do_exit(opari2_region_4) #line 43 "test2.f90" call POMP2_Barrier_enter(opari2_region_6,& pomp2_old_task, opari2_ctc_6 ) #line 44 "test2.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_6, pomp2_old_task) #line 45 "test2.f90" call POMP2_Sections_enter(opari2_region_7, & opari2_ctc_7 ) #line 46 "test2.f90" !$omp sections #line 47 "test2.f90" !$omp section call POMP2_Section_begin(opari2_region_7, & opari2_ctc_7 ) #line 48 "test2.f90" write(*,*) "section 1" call POMP2_Section_end(opari2_region_7) #line 49 "test2.f90" !$omp section call POMP2_Section_begin(opari2_region_7, & opari2_ctc_7 ) #line 50 "test2.f90" write(*,*) "section 2" call POMP2_Section_end(opari2_region_7) #line 51 "test2.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_7,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, pomp2_old_task) call POMP2_Sections_exit(opari2_region_7) #line 52 "test2.f90" #line 53 "test2.f90" !$omp master call POMP2_Master_begin(opari2_region_8, & opari2_ctc_8 ) #line 54 "test2.f90" write(*,*) "master" call POMP2_Master_end(opari2_region_8) #line 55 "test2.f90" !$omp end master call POMP2_Critical_enter(opari2_region_9, & opari2_ctc_9 ) #line 57 "test2.f90" !$omp critical call POMP2_Critical_begin(opari2_region_9) #line 58 "test2.f90" write(*,*) "critical" call POMP2_Critical_end(opari2_region_9) #line 59 "test2.f90" !$omp end critical call POMP2_Critical_exit(opari2_region_9) #line 60 "test2.f90" call POMP2_Critical_enter(opari2_region_10, & opari2_ctc_10 ) #line 61 "test2.f90" !$omp critical(foobar) call POMP2_Critical_begin(opari2_region_10) #line 62 "test2.f90" write(*,*) "critical(foobar)" call POMP2_Critical_end(opari2_region_10) #line 63 "test2.f90" !$omp end critical(foobar) call POMP2_Critical_exit(opari2_region_10) #line 64 "test2.f90" call POMP2_Atomic_enter(opari2_region_11, & opari2_ctc_11 ) #line 65 "test2.f90" !$omp atomic ! do this atomic i = i + 1 call POMP2_Atomic_exit(opari2_region_11) #line 68 "test2.f90" call POMP2_Single_enter(opari2_region_12, & opari2_ctc_12 ) #line 69 "test2.f90" !$omp single call POMP2_Single_begin(opari2_region_12) #line 70 "test2.f90" write(*,*) "single" call POMP2_Single_end(opari2_region_12) #line 71 "test2.f90" !$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_12,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, pomp2_old_task) call POMP2_Single_exit(opari2_region_12) #line 72 "test2.f90" call POMP2_Workshare_enter(opari2_region_13, & opari2_ctc_13 ) #line 73 "test2.f90" !$omp workshare a = b + c #line 75 "test2.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_13,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_13) #line 76 "test2.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 77 "test2.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 78 "test2.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_14 ) #line 79 "test2.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) #line 80 "test2.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_15, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_15 ) end if #line 80 "test2.f90" !$omp task if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_15, pomp2_new_task) end if #line 81 "test2.f90" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_15) end if #line 82 "test2.f90" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_15, pomp2_old_task) end if #line 83 "test2.f90" call POMP2_Taskwait_begin(opari2_region_16,& pomp2_old_task, opari2_ctc_16 ) #line 84 "test2.f90" !$omp taskwait call POMP2_Taskwait_end(opari2_region_16, pomp2_old_task) #line 85 "test2.f90" call POMP2_Implicit_barrier_enter(opari2_region_14,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, pomp2_old_task) call POMP2_Parallel_end(opari2_region_14) #line 85 "test2.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, pomp2_old_task) #line 86 "test2.f90" ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 subroutine POMP2_Init_reg_000() include 'test2.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) end opari2-2.0.10/test/data/PaxHeaders/test2.f90.opari.inc.out0000644000000000000000000000013215232670204020005 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.f90.opari.inc.out0000664000175100001440000000717115232670204020345 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test2.f90:26:26*escl=test2.f90:77:77**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "58*regionType=do*sscl=test2.f90:28:28*escl=test2.f90:32:32**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "61*regionType=flush*sscl=test2.f90:34:34*escl=test2.f90:34:34**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "71*regionType=do*sscl=test2.f90:36:36*escl=test2.f90:42:42*hasOrdered=1**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "63*regionType=ordered*sscl=test2.f90:38:38*escl=test2.f90:40:40**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "63*regionType=barrier*sscl=test2.f90:44:44*escl=test2.f90:44:44**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "78*regionType=sections*sscl=test2.f90:46:46*escl=test2.f90:51:51*numSections=2**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "62*regionType=master*sscl=test2.f90:53:53*escl=test2.f90:55:55**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "64*regionType=critical*sscl=test2.f90:57:57*escl=test2.f90:59:59**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "84*regionType=critical*sscl=test2.f90:61:61*escl=test2.f90:63:63*criticalName=foobar**" INTEGER( KIND=8 ) :: opari2_region_11 CHARACTER (LEN=999), parameter :: opari2_ctc_11 =& "62*regionType=atomic*sscl=test2.f90:65:65*escl=test2.f90:67:67**" INTEGER( KIND=8 ) :: opari2_region_12 CHARACTER (LEN=999), parameter :: opari2_ctc_12 =& "62*regionType=single*sscl=test2.f90:69:69*escl=test2.f90:71:71**" INTEGER( KIND=8 ) :: opari2_region_13 CHARACTER (LEN=999), parameter :: opari2_ctc_13 =& "65*regionType=workshare*sscl=test2.f90:73:73*escl=test2.f90:75:75**" INTEGER( KIND=8 ) :: opari2_region_14 CHARACTER (LEN=999), parameter :: opari2_ctc_14 =& "64*regionType=parallel*sscl=test2.f90:79:79*escl=test2.f90:85:85**" INTEGER( KIND=8 ) :: opari2_region_15 CHARACTER (LEN=999), parameter :: opari2_ctc_15 =& "60*regionType=task*sscl=test2.f90:80:80*escl=test2.f90:82:82**" INTEGER( KIND=8 ) :: opari2_region_16 CHARACTER (LEN=999), parameter :: opari2_ctc_16 =& "64*regionType=taskwait*sscl=test2.f90:84:84*escl=test2.f90:84:84**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10,& opari2_region_11,& opari2_region_12,& opari2_region_13,& opari2_region_14,& opari2_region_15,& opari2_region_16 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test2.f900000644000000000000000000000013215232670204015316 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.f900000664000175100001440000000330715232670204015653 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 integer i integer k integer, save :: j !$omp threadprivate(j) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do",i enddo !$omp end do !$omp flush(k) !$omp do ordered do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered enddo !$omp end do !$omp barrier !$omp sections !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp master write(*,*) "master" !$omp end master !$omp critical write(*,*) "critical" !$omp end critical !$omp critical(foobar) write(*,*) "critical(foobar)" !$omp end critical(foobar) !$omp atomic ! do this atomic i = i + 1 !$omp single write(*,*) "single" !$omp end single !$omp workshare a = b + c !$omp end workshare !$omp end parallel !$omp parallel !$omp task write(*,*) "task" !$omp end task !$omp taskwait !$omp end parallel ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 opari2-2.0.10/test/data/PaxHeaders/test2.f.out0000644000000000000000000000013215232670204015753 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.f.out0000664000175100001440000002175215232670204016314 0ustar00builderusers #line 1 "test2.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 include 'test2.f.opari.inc' #line 20 "test2.f" integer i integer k integer, save :: j #line 24 "test2.f" !$omp threadprivate(j) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test2.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test2.f" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 29 "test2.f" !$omp do do i=1,4 write(*,*) "do",i k = k + 1 enddo #line 34 "test2.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 35 "test2.f" call POMP2_Flush_enter(opari2_region_3, &opari2_ctc_3 ) #line 36 "test2.f" !$omp flush(k) call POMP2_Flush_exit(opari2_region_3) #line 37 "test2.f" call POMP2_Barrier_enter(opari2_region_4, &pomp2_old_task, &opari2_ctc_4 ) #line 38 "test2.f" !$omp barrier call POMP2_Barrier_exit(opari2_region_4, &pomp2_old_task) #line 39 "test2.f" call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 40 "test2.f" !$omp do ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 42 "test2.f" !$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 43 "test2.f" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_6) #line 44 "test2.f" !$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 45 "test2.f" enddo #line 46 "test2.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 47 "test2.f" call POMP2_Sections_enter(opari2_region_7, &opari2_ctc_7 ) #line 48 "test2.f" !$omp sections #line 49 "test2.f" !$omp section call POMP2_Section_begin(opari2_region_7, &opari2_ctc_7 ) #line 50 "test2.f" write(*,*) "section 1" call POMP2_Section_end(opari2_region_7) #line 51 "test2.f" !$omp section call POMP2_Section_begin(opari2_region_7, &opari2_ctc_7 ) #line 52 "test2.f" write(*,*) "section 2" call POMP2_Section_end(opari2_region_7) #line 53 "test2.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_7) #line 54 "test2.f" #line 55 "test2.f" !$omp master call POMP2_Master_begin(opari2_region_8, &opari2_ctc_8 ) #line 56 "test2.f" write(*,*) "master" call POMP2_Master_end(opari2_region_8) #line 57 "test2.f" !$omp end master call POMP2_Critical_enter(opari2_region_9, &opari2_ctc_9 ) #line 59 "test2.f" !$omp critical call POMP2_Critical_begin(opari2_region_9) #line 60 "test2.f" write(*,*) "critical" call POMP2_Critical_end(opari2_region_9) #line 61 "test2.f" !$omp end critical call POMP2_Critical_exit(opari2_region_9) #line 62 "test2.f" call POMP2_Critical_enter(opari2_region_10, &opari2_ctc_10 ) #line 63 "test2.f" !$omp critical(foobar) call POMP2_Critical_begin(opari2_region_10) #line 64 "test2.f" write(*,*) "critical(foobar)" call POMP2_Critical_end(opari2_region_10) #line 65 "test2.f" !$omp end critical(foobar) call POMP2_Critical_exit(opari2_region_10) #line 66 "test2.f" ! do this atomic call POMP2_Atomic_enter(opari2_region_11, &opari2_ctc_11 ) #line 68 "test2.f" !$omp atomic i = i + 1 call POMP2_Atomic_exit(opari2_region_11) #line 70 "test2.f" call POMP2_Single_enter(opari2_region_12, &opari2_ctc_12 ) #line 71 "test2.f" !$omp single call POMP2_Single_begin(opari2_region_12) #line 72 "test2.f" write(*,*) "single" call POMP2_Single_end(opari2_region_12) #line 73 "test2.f" !$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_12, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, &pomp2_old_task) call POMP2_Single_exit(opari2_region_12) #line 74 "test2.f" call POMP2_Workshare_enter(opari2_region_13, &opari2_ctc_13 ) #line 75 "test2.f" !$omp workshare a = b + c #line 77 "test2.f" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_13, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, &pomp2_old_task) call POMP2_Workshare_exit(opari2_region_13) #line 78 "test2.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 79 "test2.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 80 "test2.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_14 ) #line 81 "test2.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) #line 82 "test2.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_15, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_15 ) end if #line 82 "test2.f" !$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_15, pomp2_new_task) end if #line 83 "test2.f" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_15) end if #line 84 "test2.f" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_15, &pomp2_old_task) end if #line 85 "test2.f" !$omp this should be ignored by opari and the compiler call POMP2_Taskwait_begin(opari2_region_16, &pomp2_old_task, &opari2_ctc_16 ) #line 88 "test2.f" !$omp taskwait call POMP2_Taskwait_end(opari2_region_16, &pomp2_old_task) #line 89 "test2.f" call POMP2_Implicit_barrier_enter(opari2_region_14, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_14) #line 89 "test2.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, &pomp2_old_task) #line 90 "test2.f" ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 subroutine POMP2_Init_reg_000() include 'test2.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) end opari2-2.0.10/test/data/PaxHeaders/test2.f.opari.inc.out0000644000000000000000000000013215232670204017634 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.f.opari.inc.out0000664000175100001440000000727415232670204020200 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test2.f:26:26*escl=test2.f:79:7"// &"9**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"56*regionType=do*sscl=test2.f:29:29*escl=test2.f:34:34**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"59*regionType=flush*sscl=test2.f:36:36*escl=test2.f:36:36**"// &"") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"61*regionType=barrier*sscl=test2.f:38:38*escl=test2.f:38:38"// &"**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"69*regionType=do*sscl=test2.f:40:40*escl=test2.f:46:46*hasO"// &"rdered=1**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"61*regionType=ordered*sscl=test2.f:42:42*escl=test2.f:44:44"// &"**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=sections*sscl=test2.f:48:48*escl=test2.f:53:5"// &"3*numSections=2**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"60*regionType=master*sscl=test2.f:55:55*escl=test2.f:57:57*"// &"*") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"62*regionType=critical*sscl=test2.f:59:59*escl=test2.f:61:6"// &"1**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"82*regionType=critical*sscl=test2.f:63:63*escl=test2.f:65:6"// &"5*criticalName=foobar**") INTEGER*8 opari2_region_11 CHARACTER*999 opari2_ctc_11 PARAMETER (opari2_ctc_11= &"60*regionType=atomic*sscl=test2.f:68:68*escl=test2.f:69:69*"// &"*") INTEGER*8 opari2_region_12 CHARACTER*999 opari2_ctc_12 PARAMETER (opari2_ctc_12= &"60*regionType=single*sscl=test2.f:71:71*escl=test2.f:73:73*"// &"*") INTEGER*8 opari2_region_13 CHARACTER*999 opari2_ctc_13 PARAMETER (opari2_ctc_13= &"63*regionType=workshare*sscl=test2.f:75:75*escl=test2.f:77:"// &"77**") INTEGER*8 opari2_region_14 CHARACTER*999 opari2_ctc_14 PARAMETER (opari2_ctc_14= &"62*regionType=parallel*sscl=test2.f:81:81*escl=test2.f:89:8"// &"9**") INTEGER*8 opari2_region_15 CHARACTER*999 opari2_ctc_15 PARAMETER (opari2_ctc_15= &"58*regionType=task*sscl=test2.f:82:82*escl=test2.f:84:84**""// &") INTEGER*8 opari2_region_16 CHARACTER*999 opari2_ctc_16 PARAMETER (opari2_ctc_16= &"62*regionType=taskwait*sscl=test2.f:88:88*escl=test2.f:88:8"// &"8**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10, & opari2_region_11, & opari2_region_12, & opari2_region_13, & opari2_region_14, & opari2_region_15, & opari2_region_16 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test2.f0000644000000000000000000000013215232670204015145 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.f0000664000175100001440000000343715232670204015506 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 integer i integer k integer, save :: j !$omp threadprivate(j) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do",i k = k + 1 enddo !$omp end do !$omp flush(k) !$omp barrier !$omp do ordered do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered enddo !$omp end do !$omp sections !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp master write(*,*) "master" !$omp end master !$omp critical write(*,*) "critical" !$omp end critical !$omp critical(foobar) write(*,*) "critical(foobar)" !$omp end critical(foobar) ! do this atomic !$omp atomic i = i + 1 !$omp single write(*,*) "single" !$omp end single !$omp workshare a = b + c !$omp end workshare !$omp end parallel !$omp parallel !$omp task write(*,*) "task" !$omp end task !$omp this should be ignored by opari and the compiler !$omp taskwait !$omp end parallel ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 opari2-2.0.10/test/data/PaxHeaders/test2.cpp.out0000644000000000000000000000013215232670204016310 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.cpp.out0000664000175100001440000000527615232670204016654 0ustar00builderusers#include "test2.cpp.opari.inc" #line 1 "test2.cpp" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2026, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to handle C++11 raw string literals. */ #include auto simple_string = R"(Hello, world!)"; auto multi_line = R"(Line 1 Line 2 Line 3)"; auto quoted_multi_line = R"("Double quotes" 'Single quotes')"; auto windows_path = R"(C:\Program Files\Windows\System32\)"; auto control_characters = R"(\n\t\r\0)"; auto braces = R"(f(x, (y + z), foo(bar())))"; auto xml = R"(
Click to open
)"; auto json = R"({ "name": "FooBar", "age": 42, })"; auto regex = R"(^\w+\s+\d+$)"; auto prefixed_simple_string = R"x(hello)x"; auto long_prefix_multiline = R"ABCDEFGHIJKLMNO( Long delimiter. )ABCDEFGHIJKLMNO"; auto special_character_prefix = R"_MY_DELIM_( example )_MY_DELIM_"; auto special_character_prefix2 = R"<<<( Example )<<<"; auto special_character_prefix3 = R"+++(Another example.)+++"; auto empty = R"()"; auto multiline_empty = R"( )"; auto multiline_separate = R"(Hello )" R"(World)"; auto string_mixture = "prefix " R"(middle)" " suffix"; auto u8str = u8R"(Hello UTF-8)"; auto u16str = uR"(Hello UTF-16)"; auto u32str = UR"(Hello UTF-32)"; // uncrustify expects a space between LR and ", which violates the C++11 specification /* *INDENT-OFF* */ auto wide = LR"(Wide string literal)"; /* *INDENT-ON* */ auto many_quotes = R"(" \ " \" \\ """)"; auto code = R"CPP( int add(int a, int b) { #pragma omp parallel {} return a + b; } )CPP"; auto no_prefix = R"( first line second( line )"; void foo( void ) { { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 107 "test2.cpp" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 108 "test2.cpp" { } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 110 "test2.cpp" } opari2-2.0.10/test/data/PaxHeaders/test2.cpp.opari.inc.out0000644000000000000000000000013215232670204020171 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.cpp.opari.inc.out0000664000175100001440000000051715232670204020526 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "69*regionType=parallel*sscl=test2.cpp:107:107*escl=test2.cpp:109:109**" extern "C" { void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); } } opari2-2.0.10/test/data/PaxHeaders/test2.cpp0000644000000000000000000000013215232670204015502 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.cpp0000664000175100001440000000372115232670204016037 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2026, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to handle C++11 raw string literals. */ #include auto simple_string = R"(Hello, world!)"; auto multi_line = R"(Line 1 Line 2 Line 3)"; auto quoted_multi_line = R"("Double quotes" 'Single quotes')"; auto windows_path = R"(C:\Program Files\Windows\System32\)"; auto control_characters = R"(\n\t\r\0)"; auto braces = R"(f(x, (y + z), foo(bar())))"; auto xml = R"(
Click to open
)"; auto json = R"({ "name": "FooBar", "age": 42, })"; auto regex = R"(^\w+\s+\d+$)"; auto prefixed_simple_string = R"x(hello)x"; auto long_prefix_multiline = R"ABCDEFGHIJKLMNO( Long delimiter. )ABCDEFGHIJKLMNO"; auto special_character_prefix = R"_MY_DELIM_( example )_MY_DELIM_"; auto special_character_prefix2 = R"<<<( Example )<<<"; auto special_character_prefix3 = R"+++(Another example.)+++"; auto empty = R"()"; auto multiline_empty = R"( )"; auto multiline_separate = R"(Hello )" R"(World)"; auto string_mixture = "prefix " R"(middle)" " suffix"; auto u8str = u8R"(Hello UTF-8)"; auto u16str = uR"(Hello UTF-16)"; auto u32str = UR"(Hello UTF-32)"; // uncrustify expects a space between LR and ", which violates the C++11 specification /* *INDENT-OFF* */ auto wide = LR"(Wide string literal)"; /* *INDENT-ON* */ auto many_quotes = R"(" \ " \" \\ """)"; auto code = R"CPP( int add(int a, int b) { #pragma omp parallel {} return a + b; } )CPP"; auto no_prefix = R"( first line second( line )"; void foo( void ) { #pragma omp parallel { } } opari2-2.0.10/test/data/PaxHeaders/test2.c.out0000644000000000000000000000013215232670204015750 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.c.out0000664000175100001440000001603415232670204016306 0ustar00builderusers#include "test2.c.opari.inc" #line 1 "test2.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the basic instrumentation of all directives. */ #include #ifdef _OPENMP #endif int j; #line 27 "test2.c" #pragma omp threadprivate(j) int main() { int i; int k = 0; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test2.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test2.c" { printf("parallel\n"); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 37 "test2.c" #pragma omp for nowait for(i=0; i<4; ++i) { printf("for %d\n", i); k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_For_exit( &opari2_region_2 ); } #line 42 "test2.c" { POMP2_Flush_enter( &opari2_region_3, opari2_ctc_3 ); #line 43 "test2.c" #pragma omp flush(k) POMP2_Flush_exit( &opari2_region_3 ); } #line 44 "test2.c" { POMP2_Task_handle pomp2_old_task; POMP2_Barrier_enter( &opari2_region_4, &pomp2_old_task, opari2_ctc_4 ); #line 45 "test2.c" #pragma omp barrier POMP2_Barrier_exit( &opari2_region_4, pomp2_old_task ); } #line 46 "test2.c" { POMP2_For_enter( &opari2_region_5, opari2_ctc_5 ); #line 47 "test2.c" #pragma omp for ordered nowait for(i=0; i<4; ++i) { { POMP2_Ordered_enter( &opari2_region_6, opari2_ctc_6 ); #line 49 "test2.c" #pragma omp ordered { POMP2_Ordered_begin( &opari2_region_6 ); #line 50 "test2.c" { printf("for %d\n", i); } POMP2_Ordered_end( &opari2_region_6 ); } POMP2_Ordered_exit( &opari2_region_6 ); } #line 53 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_5, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_5, pomp2_old_task ); } POMP2_For_exit( &opari2_region_5 ); } #line 54 "test2.c" { POMP2_Sections_enter( &opari2_region_7, opari2_ctc_7 ); #line 55 "test2.c" #pragma omp sections nowait { #line 57 "test2.c" #pragma omp section { POMP2_Section_begin( &opari2_region_7, opari2_ctc_7 ); #line 58 "test2.c" printf("section 1\n"); POMP2_Section_end( &opari2_region_7 ); } #line 59 "test2.c" #pragma omp section { POMP2_Section_begin( &opari2_region_7, opari2_ctc_7 ); #line 60 "test2.c" { printf("section 2\n"); } POMP2_Section_end( &opari2_region_7 ); } #line 61 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_7, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_7, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_7 ); } #line 62 "test2.c" #line 63 "test2.c" #pragma omp master { POMP2_Master_begin( &opari2_region_8, opari2_ctc_8 ); #line 64 "test2.c" { printf("master\n"); } POMP2_Master_end( &opari2_region_8 ); } #line 67 "test2.c" { POMP2_Critical_enter( &opari2_region_9, opari2_ctc_9 ); #line 68 "test2.c" #pragma omp critical { POMP2_Critical_begin( &opari2_region_9 ); #line 69 "test2.c" { printf("critical\n"); } POMP2_Critical_end( &opari2_region_9 ); } POMP2_Critical_exit( &opari2_region_9 ); } #line 72 "test2.c" { POMP2_Critical_enter( &opari2_region_10, opari2_ctc_10 ); #line 73 "test2.c" #pragma omp critical(foobar) { POMP2_Critical_begin( &opari2_region_10 ); #line 74 "test2.c" { printf("critical(foobar)\n"); } POMP2_Critical_end( &opari2_region_10 ); } POMP2_Critical_exit( &opari2_region_10 ); } #line 77 "test2.c" { POMP2_Atomic_enter( &opari2_region_11, opari2_ctc_11 ); #line 78 "test2.c" #pragma omp atomic /* -------------- */ /* do this atomic */ i += 1; POMP2_Atomic_exit( &opari2_region_11 ); } #line 82 "test2.c" /* -------------- */ { POMP2_Single_enter( &opari2_region_12, opari2_ctc_12 ); #line 84 "test2.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_12 ); #line 85 "test2.c" { printf("single\n"); } POMP2_Single_end( &opari2_region_12 ); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_12, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_12, pomp2_old_task ); } POMP2_Single_exit( &opari2_region_12 ); } #line 88 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 89 "test2.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_13, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_13 ); #line 90 "test2.c" #pragma omp parallel POMP2_DLIST_00013 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_13 ); #line 91 "test2.c" { { int pomp2_if = 1; { POMP2_Task_handle pomp2_old_task; POMP2_Task_handle pomp2_new_task; if (pomp2_if) POMP2_Task_create_begin( &opari2_region_14, &pomp2_new_task, &pomp2_old_task, pomp2_if, opari2_ctc_14 ); #line 92 "test2.c" #pragma omp task POMP2_DLIST_00014 if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) { if (pomp2_if) POMP2_Task_begin( &opari2_region_14, pomp2_new_task ); #line 93 "test2.c" { printf("task\n"); } if (pomp2_if) POMP2_Task_end( &opari2_region_14 ); } if (pomp2_if) POMP2_Task_create_end( &opari2_region_14, pomp2_old_task ); } } #line 96 "test2.c" { POMP2_Task_handle pomp2_old_task; POMP2_Taskwait_begin( &opari2_region_15, &pomp2_old_task, opari2_ctc_15 ); #line 97 "test2.c" #pragma omp taskwait POMP2_Taskwait_end( &opari2_region_15, pomp2_old_task ); } #line 98 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_13, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_13, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_13 ); } POMP2_Parallel_join( &opari2_region_13, pomp2_old_task ); } #line 99 "test2.c" // #pragma omp this should be ignored by opari and the compiler // #pragma this too } opari2-2.0.10/test/data/PaxHeaders/test2.c.opari.inc.out0000644000000000000000000000013215232670204017631 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.c.opari.inc.out0000664000175100001440000000670515232670204020173 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3,opari2_region_4,opari2_region_5,opari2_region_6,opari2_region_7,opari2_region_8,opari2_region_9,opari2_region_10,opari2_region_11,opari2_region_12) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test2.c:33:33*escl=test2.c:88:88**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "56*regionType=for*sscl=test2.c:37:37*escl=test2.c:41:41**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "58*regionType=flush*sscl=test2.c:43:43*escl=test2.c:43:43**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "60*regionType=barrier*sscl=test2.c:45:45*escl=test2.c:45:45**" static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "69*regionType=for*sscl=test2.c:47:47*escl=test2.c:53:53*hasOrdered=1**" static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "60*regionType=ordered*sscl=test2.c:49:49*escl=test2.c:52:52**" static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "75*regionType=sections*sscl=test2.c:55:55*escl=test2.c:61:61*numSections=2**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "59*regionType=master*sscl=test2.c:63:63*escl=test2.c:66:66**" static OPARI2_Region_handle opari2_region_9 = NULL; #define opari2_ctc_9 "61*regionType=critical*sscl=test2.c:68:68*escl=test2.c:71:71**" static OPARI2_Region_handle opari2_region_10 = NULL; #define opari2_ctc_10 "81*regionType=critical*sscl=test2.c:73:73*escl=test2.c:76:76*criticalName=foobar**" static OPARI2_Region_handle opari2_region_11 = NULL; #define opari2_ctc_11 "59*regionType=atomic*sscl=test2.c:78:78*escl=test2.c:81:81**" static OPARI2_Region_handle opari2_region_12 = NULL; #define opari2_ctc_12 "59*regionType=single*sscl=test2.c:84:84*escl=test2.c:87:87**" #define POMP2_DLIST_00013 shared(opari2_region_13,opari2_region_14,opari2_region_15) static OPARI2_Region_handle opari2_region_13 = NULL; #define opari2_ctc_13 "61*regionType=parallel*sscl=test2.c:90:90*escl=test2.c:98:98**" #define POMP2_DLIST_00014 shared(opari2_region_14) static OPARI2_Region_handle opari2_region_14 = NULL; #define opari2_ctc_14 "57*regionType=task*sscl=test2.c:92:92*escl=test2.c:95:95**" static OPARI2_Region_handle opari2_region_15 = NULL; #define opari2_ctc_15 "61*regionType=taskwait*sscl=test2.c:97:97*escl=test2.c:97:97**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); POMP2_Assign_handle( &opari2_region_9, opari2_ctc_9 ); POMP2_Assign_handle( &opari2_region_10, opari2_ctc_10 ); POMP2_Assign_handle( &opari2_region_11, opari2_ctc_11 ); POMP2_Assign_handle( &opari2_region_12, opari2_ctc_12 ); POMP2_Assign_handle( &opari2_region_13, opari2_ctc_13 ); POMP2_Assign_handle( &opari2_region_14, opari2_ctc_14 ); POMP2_Assign_handle( &opari2_region_15, opari2_ctc_15 ); } opari2-2.0.10/test/data/PaxHeaders/test2.c0000644000000000000000000000013215232670204015142 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test2.c0000664000175100001440000000343215232670204015476 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the basic instrumentation of all directives. */ #include #ifdef _OPENMP #include #endif int j; #pragma omp threadprivate(j) int main() { int i; int k = 0; #pragma omp parallel { printf("parallel\n"); #pragma omp for for(i=0; i<4; ++i) { printf("for %d\n", i); k++; } #pragma omp flush(k) #pragma omp barrier #pragma omp for ordered for(i=0; i<4; ++i) { #pragma omp ordered { printf("for %d\n", i); } } #pragma omp sections { #pragma omp section printf("section 1\n"); #pragma omp section { printf("section 2\n"); } } #pragma omp master { printf("master\n"); } #pragma omp critical { printf("critical\n"); } #pragma omp critical(foobar) { printf("critical(foobar)\n"); } #pragma omp atomic /* -------------- */ /* do this atomic */ i += 1; /* -------------- */ #pragma omp single { printf("single\n"); } } #pragma omp parallel { #pragma omp task { printf("task\n"); } #pragma omp taskwait } // #pragma omp this should be ignored by opari and the compiler // #pragma this too } opari2-2.0.10/test/data/PaxHeaders/test1_tpd.f90.out0000644000000000000000000000013215232670204016772 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_tpd.f90.out0000664000175100001440000001033515232670204017326 0ustar00builderusers #line 1 "test1_tpd.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 !************************************************ !* The following pragmas should be instrumented * !************************************************ include 'test1_tpd.f90.opari.inc' #line 23 "test1_tpd.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 23 "test1_tpd.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_1) #line 24 "test1_tpd.f90" call POMP2_Barrier_enter(opari2_region_2,& pomp2_old_task, opari2_ctc_2 ) #line 24 "test1_tpd.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_2, pomp2_old_task) #line 25 "test1_tpd.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 25 "test1_tpd.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 26 "test1_tpd.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 27 "test1_tpd.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_3) #line 29 "test1_tpd.f90" call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Parallel_end(opari2_region_3) #line 29 "test1_tpd.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 31 "test1_tpd.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 32 "test1_tpd.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_4) #line 34 "test1_tpd.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 34 "test1_tpd.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 36 "test1_tpd.f90" !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 subroutine POMP2_Init_reg_000() include 'test1_tpd.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) end opari2-2.0.10/test/data/PaxHeaders/test1_tpd.f90.opari.inc.out0000644000000000000000000000013215232670204020653 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_tpd.f90.opari.inc.out0000664000175100001440000000237015232670204021207 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "72*regionType=parallel*sscl=test1_tpd.f90:23:23*escl=test1_tpd.f90:25:25**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "71*regionType=barrier*sscl=test1_tpd.f90:24:24*escl=test1_tpd.f90:24:24**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "72*regionType=parallel*sscl=test1_tpd.f90:27:28*escl=test1_tpd.f90:29:30**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "72*regionType=parallel*sscl=test1_tpd.f90:32:33*escl=test1_tpd.f90:34:35**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer( kind=8 ) pomp_tpd common /pomp_tpd/ pomp_tpd !$omp threadprivate(/pomp_tpd/) integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_tpd.f900000644000000000000000000000013215232670204016164 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_tpd.f900000664000175100001440000000254415232670204016523 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 !************************************************ !* The following pragmas should be instrumented * !************************************************ !$OMP PARALLEL !$OmP BaRRiEr !$omp end parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & !$OmP& parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & ! some comment !$OmP& parallel !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 opari2-2.0.10/test/data/PaxHeaders/test1_tpd.f.out0000644000000000000000000000013215232670204016621 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_tpd.f.out0000664000175100001440000001373515232670204017164 0ustar00builderusers #line 1 "test1_tpd.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_tpd.f.opari.inc' #line 24 "test1_tpd.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_tpd.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_tpd.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_tpd.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_tpd.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_tpd.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_tpd.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_tpd.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_tpd.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_tpd.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_tpd.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_tpd.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_tpd.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_tpd.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_tpd.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_tpd.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_tpd.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_tpd.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_tpd.f" END DO #line 58 "test1_tpd.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_tpd.f" call POMP2_Single_enter(opari2_region_8, &opari2_ctc_8 ) #line 59 "test1_tpd.f" c$omp single call POMP2_Single_begin(opari2_region_8) #line 60 "test1_tpd.f" N=6 call POMP2_Single_end(opari2_region_8) #line 61 "test1_tpd.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Single_exit(opari2_region_8) #line 62 "test1_tpd.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_9, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_9 ) end if #line 63 "test1_tpd.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_9, pomp2_new_task) end if #line 64 "test1_tpd.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_9) end if #line 65 "test1_tpd.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_9, &pomp2_old_task) end if #line 66 "test1_tpd.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_tpd.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_tpd.f" call POMP2_Init() #line 70 "test1_tpd.f" call POMP2_Begin(opari2_region_10, opari2_ctc_10) #line 72 "test1_tpd.f" if .false. then call POMP2_End(opari2_region_10) #line 74 "test1_tpd.f" return end call POMP2_End(opari2_region_10) #line 77 "test1_tpd.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_tpd.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_tpd.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_10, & opari2_ctc_10 ) end opari2-2.0.10/test/data/PaxHeaders/test1_tpd.f.opari.inc.out0000644000000000000000000000013215232670204020502 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_tpd.f.opari.inc.out0000664000175100001440000000511715232670204021040 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"70*regionType=parallel*sscl=test1_tpd.f:26:26*escl=test1_tp"// &"d.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"68*regionType=atomic*sscl=test1_tpd.f:28:28*escl=test1_tpd."// &"f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"70*regionType=critical*sscl=test1_tpd.f:31:31*escl=test1_tp"// &"d.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"67*regionType=flush*sscl=test1_tpd.f:35:35*escl=test1_tpd.f"// &":35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"68*regionType=master*sscl=test1_tpd.f:48:48*escl=test1_tpd."// &"f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"64*regionType=do*sscl=test1_tpd.f:52:52*escl=test1_tpd.f:58"// &":58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"69*regionType=ordered*sscl=test1_tpd.f:54:54*escl=test1_tpd"// &".f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"68*regionType=single*sscl=test1_tpd.f:59:59*escl=test1_tpd."// &"f:61:61**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"66*regionType=task*sscl=test1_tpd.f:63:63*escl=test1_tpd.f:"// &"65:65**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"99*regionType=userRegion*sscl=test1_tpd.f:71:71*escl=test1_"// &"tpd.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp_tpd common /pomp_tpd/ pomp_tpd !$omp threadprivate(/pomp_tpd/) integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_tpd.f0000644000000000000000000000013215232670204016013 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_tpd.f0000664000175100001440000000306015232670204016344 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) INTEGER I,N,L,T c$omp parallel c$omp atomic N=0 c$omp critical N=1 c$omp end critical c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) c$omp master N=2 c$omp end master c$omp do DO I=1,5 c$omp ordered N=I c$omp end ordered END DO c$omp single N=6 c$omp end single c$omp task N=7 c$omp end task c$omp end parallel c$pomp inst init c$pomp inst begin(user_region) if .false. then c$pomp inst altend(user_region) return end c$pomp inst end(user_region) END SUBROUTINE end program test1_free opari2-2.0.10/test/data/PaxHeaders/test1_tpd.c.out0000644000000000000000000000013215232670204016616 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_tpd.c.out0000664000175100001440000000663515232670204017162 0ustar00builderusers#include "test1_tpd.c.opari.inc" #line 1 "test1_tpd.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test1_tpd.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) copyin(pomp_tpd) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test1_tpd.c" {{ printf("parallel 1...\n"); }} { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 37 "test1_tpd.c" #line 36 "test1_tpd.c" //end { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 38 "test1_tpd.c" # pragma \ omp \ parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) copyin(pomp_tpd) { POMP2_Parallel_begin( &opari2_region_2 ); #line 41 "test1_tpd.c" { printf("parallel 2...\n"); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 44 "test1_tpd.c" //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.10/test/data/PaxHeaders/test1_tpd.c.opari.inc.out0000644000000000000000000000013215232670204020477 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_tpd.c.opari.inc.out0000664000175100001440000000133015232670204021026 0ustar00builderusers#include #include extern int64_t __attribute__((aligned (16))) pomp_tpd; #pragma omp threadprivate(pomp_tpd) #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "69*regionType=parallel*sscl=test1_tpd.c:33:33*escl=test1_tpd.c:36:36**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "69*regionType=parallel*sscl=test1_tpd.c:38:40*escl=test1_tpd.c:43:43**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.10/test/data/PaxHeaders/test1_tpd.c0000644000000000000000000000013215232670204016010 xustar0030 mtime=1785426052.215415499 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_tpd.c0000664000175100001440000000372215232670204016346 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #include //just testing #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ #pragma omp parallel {{ printf("parallel 1...\n"); }} //end # /*complicated*/ pragma \ omp \ /*more*/ parallel { printf("parallel 2...\n"); } //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.10/test/data/PaxHeaders/test1_free.f.out0000644000000000000000000000013215232670204016753 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_free.f.out0000664000175100001440000000202015232670204017277 0ustar00builderusers #line 1 "test1_free.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1_free IMPLICIT NONE SUBROUTINE foo(A,N) !The include should be inserted after this line. include 'test1_free.f.opari.inc' #line 25 "test1_free.f" REAL(q),POINTER :: A(:) INTEGER N IF (ASSOCIATED(A)) THEN ENDIF END SUBROUTINE SMART_ALLOCATE_REAL end program test1_free opari2-2.0.10/test/data/PaxHeaders/test1_free.f.opari.inc.out0000644000000000000000000000013215232670204020634 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_free.f.opari.inc.out0000664000175100001440000000033215232670204021164 0ustar00builderusers integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock opari2-2.0.10/test/data/PaxHeaders/test1_free.f0000644000000000000000000000013215232670204016145 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_free.f0000664000175100001440000000167115232670204016504 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1_free IMPLICIT NONE SUBROUTINE foo(A,N) !The include should be inserted after this line. REAL(q),POINTER :: A(:) INTEGER N IF (ASSOCIATED(A)) THEN ENDIF END SUBROUTINE SMART_ALLOCATE_REAL end program test1_free opari2-2.0.10/test/data/PaxHeaders/test1_disable.task.f.out0000644000000000000000000000013215232670204020376 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.task.f.out0000664000175100001440000001270015232670204020730 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_8, &opari2_ctc_8 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_8) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_8) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Single_exit(opari2_region_8) #line 62 "test1_disable.f" #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.task.f.opari.inc.out0000644000000000000000000000013215232670204022257 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.task.f.opari.inc.out0000664000175100001440000000454115232670204022615 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.sync.f.out0000644000000000000000000000013215232670204020410 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.sync.f.out0000664000175100001440000000716615232670204020754 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" #line 28 "test1_disable.f" c$omp atomic N=0 #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical #line 35 "test1_disable.f" c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 59 "test1_disable.f" #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_3, opari2_ctc_3) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_3) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_3) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_3, & opari2_ctc_3 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.sync.f.opari.inc.out0000644000000000000000000000013215232670204022271 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.sync.f.opari.inc.out0000664000175100001440000000201515232670204022621 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.single.f.out0000644000000000000000000000013215232670204020715 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.single.f.out0000664000175100001440000001314015232670204021246 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.single.f.opari.inc.out0000644000000000000000000000013215232670204022576 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.single.f.opari.inc.out0000664000175100001440000000453715232670204023141 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.region.f.out0000644000000000000000000000013215232670204020717 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.region.f.out0000664000175100001440000001351415232670204021255 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(pomp2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &pomp2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(pomp2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(pomp2_region_2, &pomp2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(pomp2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(pomp2_region_3, &pomp2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(pomp2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(pomp2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(pomp2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(pomp2_region_4, &pomp2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(pomp2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(pomp2_region_5, &pomp2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(pomp2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(pomp2_region_6, &pomp2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(pomp2_region_7, &pomp2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(pomp2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(pomp2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(pomp2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(pomp2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(pomp2_region_6, &pomp2_old_task) call POMP2_Do_exit(pomp2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(pomp2_region_8, &pomp2_ctc_8 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(pomp2_region_8) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(pomp2_region_8) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(pomp2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(pomp2_region_8, &pomp2_old_task) call POMP2_Single_exit(pomp2_region_8) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(pomp2_region_9, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &pomp2_ctc_9 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(pomp2_region_9, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(pomp2_region_9) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(pomp2_region_9, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(pomp2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(pomp2_region_1, &pomp2_old_task) call POMP2_Parallel_end(pomp2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(pomp2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" #line 71 "test1_disable.f" c$pomp inst begin(user_region) if .false. then #line 73 "test1_disable.f" c$pomp inst altend(user_region) return end #line 76 "test1_disable.f" c$pomp inst end(user_region) END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( pomp2_region_1, & pomp2_ctc_1 ) call POMP2_Assign_handle( pomp2_region_2, & pomp2_ctc_2 ) call POMP2_Assign_handle( pomp2_region_3, & pomp2_ctc_3 ) call POMP2_Assign_handle( pomp2_region_4, & pomp2_ctc_4 ) call POMP2_Assign_handle( pomp2_region_5, & pomp2_ctc_5 ) call POMP2_Assign_handle( pomp2_region_6, & pomp2_ctc_6 ) call POMP2_Assign_handle( pomp2_region_7, & pomp2_ctc_7 ) call POMP2_Assign_handle( pomp2_region_8, & pomp2_ctc_8 ) call POMP2_Assign_handle( pomp2_region_9, & pomp2_ctc_9 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.region.f.opari.inc.out0000644000000000000000000000013215232670204022600 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.region.f.opari.inc.out0000664000175100001440000000425715232670204023142 0ustar00builderusers INTEGER*8 pomp2_region_1 CHARACTER*999 pomp2_ctc_1 PARAMETER (pomp2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 pomp2_region_2 CHARACTER*999 pomp2_ctc_2 PARAMETER (pomp2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 pomp2_region_3 CHARACTER*999 pomp2_ctc_3 PARAMETER (pomp2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 pomp2_region_4 CHARACTER*999 pomp2_ctc_4 PARAMETER (pomp2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 pomp2_region_5 CHARACTER*999 pomp2_ctc_5 PARAMETER (pomp2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 pomp2_region_6 CHARACTER*999 pomp2_ctc_6 PARAMETER (pomp2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 pomp2_region_7 CHARACTER*999 pomp2_ctc_7 PARAMETER (pomp2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 pomp2_region_8 CHARACTER*999 pomp2_ctc_8 PARAMETER (pomp2_ctc_8= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 pomp2_region_9 CHARACTER*999 pomp2_ctc_9 PARAMETER (pomp2_ctc_9= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads common /cb000/ pomp2_region_1, & pomp2_region_2, & pomp2_region_3, & pomp2_region_4, & pomp2_region_5, & pomp2_region_6, & pomp2_region_7, & pomp2_region_8, & pomp2_region_9 opari2-2.0.10/test/data/PaxHeaders/test1_disable.ordered.f.out0000644000000000000000000000013215232670204021060 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.ordered.f.out0000664000175100001440000001341615232670204021417 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.ordered.f.opari.inc.out0000644000000000000000000000013215232670204022741 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.ordered.f.opari.inc.out0000664000175100001440000000453615232670204023303 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.omp.f.out0000644000000000000000000000013215232670204020227 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.omp.f.out0000664000175100001440000000611015232670204020557 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" #line 28 "test1_disable.f" c$omp atomic N=0 #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical #line 35 "test1_disable.f" c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_2, opari2_ctc_2) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_2) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_2) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_2, & opari2_ctc_2 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.omp.f.opari.inc.out0000644000000000000000000000013215232670204022110 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.omp.f.opari.inc.out0000664000175100001440000000145615232670204022450 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.master.f.out0000644000000000000000000000013215232670204020727 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.master.f.out0000664000175100001440000001361215232670204021264 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.master.f.opari.inc.out0000644000000000000000000000013215232670204022610 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.master.f.opari.inc.out0000664000175100001440000000453715232670204023153 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.locks.f.out0000644000000000000000000000013215232670204020547 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.locks.f.out0000664000175100001440000001412415232670204021103 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_8, &opari2_ctc_8 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_8) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_8) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Single_exit(opari2_region_8) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_9, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_9 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_9, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_9) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_9, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_10, opari2_ctc_10) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_10) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_10) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_10, & opari2_ctc_10 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.locks.f.opari.inc.out0000644000000000000000000000013215232670204022430 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.locks.f.opari.inc.out0000664000175100001440000000510615232670204022764 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.flush.f.out0000644000000000000000000000013215232670204020555 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.flush.f.out0000664000175100001440000001361315232670204021113 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" #line 35 "test1_disable.f" c$omp flush CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_4, &opari2_ctc_4 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_4) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.flush.f.opari.inc.out0000644000000000000000000000013215232670204022436 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.flush.f.opari.inc.out0000664000175100001440000000454015232670204022773 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.f0000644000000000000000000000013215232670204016627 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.f0000664000175100001440000000306015232670204017160 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) INTEGER I,N,L,T c$omp parallel c$omp atomic N=0 c$omp critical N=1 c$omp end critical c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) c$omp master N=2 c$omp end master c$omp do DO I=1,5 c$omp ordered N=I c$omp end ordered END DO c$omp single N=6 c$omp end single c$omp task N=7 c$omp end task c$omp end parallel c$pomp inst init c$pomp inst begin(user_region) if .false. then c$pomp inst altend(user_region) return end c$pomp inst end(user_region) END SUBROUTINE end program test1_free opari2-2.0.10/test/data/PaxHeaders/test1_disable.critical.f.out0000644000000000000000000000013215232670204021226 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.critical.f.out0000664000175100001440000001341215232670204021561 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical call POMP2_Flush_enter(opari2_region_3, &opari2_ctc_3 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_3) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_4, &opari2_ctc_4 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_4) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.critical.f.opari.inc.out0000644000000000000000000000013215232670204023107 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.critical.f.opari.inc.out0000664000175100001440000000453515232670204023450 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.atomic.f.out0000644000000000000000000000013215232670204020710 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.atomic.f.out0000664000175100001440000001361115232670204021244 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Critical_enter(opari2_region_2, &opari2_ctc_2 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_2) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_2) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_2) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_3, &opari2_ctc_3 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_3) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_4, &opari2_ctc_4 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_4) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.atomic.f.opari.inc.out0000644000000000000000000000013215232670204022571 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.atomic.f.opari.inc.out0000664000175100001440000000453715232670204023134 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_disable.all.f.out0000644000000000000000000000013215232670204020204 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.all.f.out0000664000175100001440000000463215232670204020543 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T #line 26 "test1_disable.f" c$omp parallel #line 28 "test1_disable.f" c$omp atomic N=0 #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical #line 35 "test1_disable.f" c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task #line 67 "test1_disable.f" c$omp end parallel call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_1, opari2_ctc_1) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_1) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_1) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end opari2-2.0.10/test/data/PaxHeaders/test1_disable.all.f.opari.inc.out0000644000000000000000000000013215232670204022065 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.263415216 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_disable.all.f.opari.inc.out0000664000175100001440000000111115232670204022411 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1_a.f90.out0000644000000000000000000000013215232670204016423 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_a.f90.out0000664000175100001440000000717615232670204016770 0ustar00builderusers #line 1 "test1_a.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. module functions_module interface function if0(a, & ! ) a=b b ) ! end function integer(kind=4) :: if0, a end function if0 end interface interface subroutine is1(a) integer :: a end subroutine is1 end interface contains integer(kind=4) function mf0(a, & ! ) a=b b ) ! end function ! integer functionkind THIS IS TOO EVIL FOR NOW, WILL TAKE CARE OF LATER ! functionkind = 4 include 'test1_a.f90.opari.inc' #line 38 "test1_a.f90" write (*,*) "function mf0" mf0 = 5 return end function mf0 subroutine ms0 include 'test1_a.f90.opari.inc' #line 44 "test1_a.f90" write (*,*) "subroutine ms0" end subroutine ms0 end module mmm module module1 use functions_module contains subroutine r1() include 'test1_a.f90.opari.inc' #line 53 "test1_a.f90" write (*,*) "Subroutine 1" call f1() end subroutine r1 end module module1 integer function f0() implicit & none include 'test1_a.f90.opari.inc' #line 62 "test1_a.f90" double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 include 'test1_a.f90.opari.inc' #line 69 "test1_a.f90" write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface use mmm include 'test1_a.f90.opari.inc' #line 74 "test1_a.f90" integer :: a, result write (*,*) "function f1" f1 = a return end function f1 subroutine s1(a) include 'test1_a.f90.opari.inc' #line 81 "test1_a.f90" integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() contains subroutine ss1() include 'test1_a.f90.opari.inc' #line 88 "test1_a.f90" write (*,*) "subroutine ss1" end subroutine ss1 end subroutine s1 subroutine sub_bind(a) bind(c,name='sub_bind_f') include 'test1_a.f90.opari.inc' #line 93 "test1_a.f90" integer :: a write(*,*) "subroutine sub_bind(a) bind(c,name='sub_bind_f')" end subroutine sub_bind program otest use mmm use rename_test, bar => foo include 'test1_a.f90.opari.inc' #line 100 "test1_a.f90" integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) i = mf0() call s0 call s1(4) call ms0 end program otest opari2-2.0.10/test/data/PaxHeaders/test1_a.f90.opari.inc.out0000644000000000000000000000013215232670204020304 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_a.f90.opari.inc.out0000664000175100001440000000024715232670204020641 0ustar00builderusers integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock opari2-2.0.10/test/data/PaxHeaders/test1_a.f900000644000000000000000000000013215232670204015615 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_a.f900000664000175100001440000000600415232670204016147 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. module functions_module interface function if0(a, & ! ) a=b b ) ! end function integer(kind=4) :: if0, a end function if0 end interface interface subroutine is1(a) integer :: a end subroutine is1 end interface contains integer(kind=4) function mf0(a, & ! ) a=b b ) ! end function ! integer functionkind THIS IS TOO EVIL FOR NOW, WILL TAKE CARE OF LATER ! functionkind = 4 write (*,*) "function mf0" mf0 = 5 return end function mf0 subroutine ms0 write (*,*) "subroutine ms0" end subroutine ms0 end module mmm module module1 use functions_module contains subroutine r1() write (*,*) "Subroutine 1" call f1() end subroutine r1 end module module1 integer function f0() implicit & none double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface use mmm integer :: a, result write (*,*) "function f1" f1 = a return end function f1 subroutine s1(a) integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() contains subroutine ss1() write (*,*) "subroutine ss1" end subroutine ss1 end subroutine s1 subroutine sub_bind(a) bind(c,name='sub_bind_f') integer :: a write(*,*) "subroutine sub_bind(a) bind(c,name='sub_bind_f')" end subroutine sub_bind program otest use mmm use rename_test, bar => foo integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) i = mf0() call s0 call s1(4) call ms0 end program otest opari2-2.0.10/test/data/PaxHeaders/test1_a.f.out0000644000000000000000000000013215232670204016252 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_a.f.out0000664000175100001440000000354415232670204016612 0ustar00builderusers #line 1 "test1_a.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. integer function f0() implicit &none include 'test1_a.f.opari.inc' #line 23 "test1_a.f" double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 include 'test1_a.f.opari.inc' #line 30 "test1_a.f" write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface implicit >none include 'test1_a.f.opari.inc' #line 36 "test1_a.f" integer :: a, result write (*,*) "function f1" f1 = a return end function f1 recursive subroutine s1(a) implicit $none include 'test1_a.f.opari.inc' #line 45 "test1_a.f" integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() entry ss1() write (*,*) "entry ss1" end subroutine s1 program otest include 'test1_a.f.opari.inc' #line 55 "test1_a.f" integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) call s0 call s1(4) end program otest opari2-2.0.10/test/data/PaxHeaders/test1_a.f.opari.inc.out0000644000000000000000000000013215232670204020133 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_a.f.opari.inc.out0000664000175100001440000000033215232670204020463 0ustar00builderusers integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock opari2-2.0.10/test/data/PaxHeaders/test1_a.f0000644000000000000000000000013215232670204015444 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1_a.f0000664000175100001440000000306215232670204015777 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. integer function f0() implicit &none double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface implicit >none integer :: a, result write (*,*) "function f1" f1 = a return end function f1 recursive subroutine s1(a) implicit $none integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() entry ss1() write (*,*) "entry ss1" end subroutine s1 program otest integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) call s0 call s1(4) end program otest opari2-2.0.10/test/data/PaxHeaders/test11.f90.out0000644000000000000000000000013215232670204016204 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test11.f90.out0000664000175100001440000000632215232670204016541 0ustar00builderusers #line 1 "test11.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Jie Jiang ! * ! * @brief Test worskshare directives. program test11 include 'test11.f90.opari.inc' #line 22 "test11.f90" call POMP2_Critical_enter(opari2_region_1, & opari2_ctc_1 ) #line 22 "test11.f90" !$omp critical call POMP2_Critical_begin(opari2_region_1) #line 23 "test11.f90" i = 2 call POMP2_Critical_end(opari2_region_1) #line 24 "test11.f90" !$omp end critical call POMP2_Critical_exit(opari2_region_1) #line 25 "test11.f90" call POMP2_Atomic_enter(opari2_region_2, & opari2_ctc_2 ) #line 26 "test11.f90" !$omp atomic update i = 3 call POMP2_Atomic_exit(opari2_region_2) #line 28 "test11.f90" call POMP2_Workshare_enter(opari2_region_3, & opari2_ctc_3 ) #line 29 "test11.f90" !$omp workshare i = 4 !$omp critical i = 5 !$omp end critical !$omp atomic update i = 6 #line 36 "test11.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_3) #line 37 "test11.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 38 "test11.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) call POMP2_Workshare_enter(opari2_region_4, & opari2_ctc_4 ) #line 38 "test11.f90" !$omp workshare i = 7 !$omp critical i = 8 !$omp end critical !$omp atomic update i = 9 #line 45 "test11.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_4) call POMP2_Parallel_end(opari2_region_4) #line 45 "test11.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 46 "test11.f90" end program test11 subroutine POMP2_Init_reg_000() include 'test11.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) end opari2-2.0.10/test/data/PaxHeaders/test11.f90.opari.inc.out0000644000000000000000000000013215232670204020065 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test11.f90.opari.inc.out0000664000175100001440000000220715232670204020420 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "66*regionType=critical*sscl=test11.f90:22:22*escl=test11.f90:24:24**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "64*regionType=atomic*sscl=test11.f90:26:26*escl=test11.f90:27:27**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "67*regionType=workshare*sscl=test11.f90:29:29*escl=test11.f90:36:36**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "75*regionType=parallelworkshare*sscl=test11.f90:38:38*escl=test11.f90:45:45**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test11.f900000644000000000000000000000013215232670204015376 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test11.f900000664000175100001440000000206215232670204015730 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Jie Jiang ! * ! * @brief Test worskshare directives. program test11 !$OMP critical i = 2 !$omp end critical !$OMP atomic update i = 3 !$OMP workshare i = 4 !$OMP critical i = 5 !$omp end critical !$OMP atomic update i = 6 !$OMP end workshare !$OMP PARALLEL WORKSHARE i = 7 !$OMP critical i = 8 !$omp end critical !$OMP atomic update i = 9 !$OMP END PARALLEL WORKSHARE end program test11 opari2-2.0.10/test/data/PaxHeaders/test10.f90.out0000644000000000000000000000013215232670204016203 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test10.f90.out0000664000175100001440000004042515232670204016542 0ustar00builderusers #line 1 "test10.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Bernd Mohr, Peter Philippen ! * ! * @brief Tests user instrumentation directives. program test10 include 'test10.f90.opari.inc' #line 22 "test10.f90" integer (kind=omp_lock_kind) lock call POMP2_Init() #line 25 "test10.f90" call POMP2_Off() #line 27 "test10.f90" #line 29 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 30 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 31 "test10.f90" i = 1 call POMP2_Parallel_end(opari2_region_1) !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 33 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_2,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_2 ) #line 34 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) !$omp do do 100, i = 2, 50 j++ 100 continue #line 38 "test10.f90" !$omp end do call POMP2_Parallel_end(opari2_region_2) #line 38 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, pomp2_old_task) #line 39 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 40 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) !$omp do do i = 3, 50 j++ enddo #line 44 "test10.f90" !$omp end do call POMP2_Parallel_end(opari2_region_3) #line 44 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 45 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 45 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) !$omp sections !$omp section i = 4 !$omp section i = 5 #line 50 "test10.f90" !$omp end sections call POMP2_Parallel_end(opari2_region_4) #line 50 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 51 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_5 ) #line 53 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) !$omp workshare i = 6 #line 55 "test10.f90" !$omp end workshare call POMP2_Parallel_end(opari2_region_5) #line 55 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_5, pomp2_old_task) #line 56 "test10.f90" !$omp single i = 7 !$omp end single !$omp master i = 8 !$omp end master !$omp critical i = 9 !$omp end critical !$omp critical test i = 10 !$omp end critical test !$omp workshare i = 11 !$omp end workshare !$omp workshare i = 12 !$omp end workshare nowait !$omp ordered i = 13 !$omp end ordered !$omp task i = 14 !$omp end task !$omp taskwait !$omp atomic update i = 15 !$omp sections i = 16 !$omp section i = 17 !$omp section i = 18 !$omp end sections nowait !$omp barrier !$omp flush !$omp threadprivate( i ) call omp_init_lock( lock ) call omp_destroy_lock( lock ) #line 112 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_6,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_6 ) #line 113 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) #line 114 "test10.f90" i = 1 call POMP2_Implicit_barrier_enter(opari2_region_6,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, pomp2_old_task) call POMP2_Parallel_end(opari2_region_6) #line 115 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_6, pomp2_old_task) #line 116 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_7,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_7 ) #line 117 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_7) call POMP2_Do_enter(opari2_region_7, & opari2_ctc_7 ) #line 117 "test10.f90" !$omp do do 100, i = 2, 50 j++ 100 continue #line 121 "test10.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_7,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, pomp2_old_task) call POMP2_Do_exit(opari2_region_7) call POMP2_Parallel_end(opari2_region_7) #line 121 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_7, pomp2_old_task) #line 122 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_8,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_8 ) #line 123 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) call POMP2_Do_enter(opari2_region_8, & opari2_ctc_8 ) #line 123 "test10.f90" !$omp do do i = 3, 50 j++ enddo #line 127 "test10.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_8,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, pomp2_old_task) call POMP2_Do_exit(opari2_region_8) call POMP2_Parallel_end(opari2_region_8) #line 127 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, pomp2_old_task) #line 128 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_9,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_9 ) #line 128 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) call POMP2_Sections_enter(opari2_region_9) #line 128 "test10.f90" !$omp sections #line 129 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_9, & opari2_ctc_9 ) #line 130 "test10.f90" i = 4 call POMP2_Section_end(opari2_region_9) #line 131 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_9, & opari2_ctc_9 ) #line 132 "test10.f90" i = 5 call POMP2_Section_end(opari2_region_9) #line 133 "test10.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_9,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, pomp2_old_task) call POMP2_Sections_exit(opari2_region_9) call POMP2_Parallel_end(opari2_region_9) #line 133 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, pomp2_old_task) #line 134 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_10 ) #line 136 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) call POMP2_Workshare_enter(opari2_region_10, & opari2_ctc_10 ) #line 136 "test10.f90" !$omp workshare i = 6 #line 138 "test10.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_10,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_10) call POMP2_Parallel_end(opari2_region_10) #line 138 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, pomp2_old_task) #line 139 "test10.f90" call POMP2_Single_enter(opari2_region_11, & opari2_ctc_11 ) #line 140 "test10.f90" !$omp single call POMP2_Single_begin(opari2_region_11) #line 141 "test10.f90" i = 7 call POMP2_Single_end(opari2_region_11) #line 142 "test10.f90" !$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_11,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_11, pomp2_old_task) call POMP2_Single_exit(opari2_region_11) #line 143 "test10.f90" #line 144 "test10.f90" !$omp master call POMP2_Master_begin(opari2_region_12, & opari2_ctc_12 ) #line 145 "test10.f90" i = 8 call POMP2_Master_end(opari2_region_12) #line 146 "test10.f90" !$omp end master call POMP2_Critical_enter(opari2_region_13, & opari2_ctc_13 ) #line 148 "test10.f90" !$omp critical call POMP2_Critical_begin(opari2_region_13) #line 149 "test10.f90" i = 9 call POMP2_Critical_end(opari2_region_13) #line 150 "test10.f90" !$omp end critical call POMP2_Critical_exit(opari2_region_13) #line 151 "test10.f90" call POMP2_Critical_enter(opari2_region_14, & opari2_ctc_14 ) #line 152 "test10.f90" !$omp critical test call POMP2_Critical_begin(opari2_region_14) #line 153 "test10.f90" i = 10 call POMP2_Critical_end(opari2_region_14) #line 154 "test10.f90" !$omp end critical test call POMP2_Critical_exit(opari2_region_14) #line 155 "test10.f90" call POMP2_Workshare_enter(opari2_region_15, & opari2_ctc_15 ) #line 156 "test10.f90" !$omp workshare i = 11 #line 158 "test10.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_15,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_15, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_15) #line 159 "test10.f90" call POMP2_Workshare_enter(opari2_region_16, & opari2_ctc_16 ) #line 160 "test10.f90" !$omp workshare i = 12 #line 162 "test10.f90" !$omp end workshare nowait call POMP2_Workshare_exit(opari2_region_16) #line 163 "test10.f90" call POMP2_Ordered_enter(opari2_region_17, & opari2_ctc_17 ) #line 164 "test10.f90" !$omp ordered call POMP2_Ordered_begin(opari2_region_17) #line 165 "test10.f90" i = 13 call POMP2_Ordered_end(opari2_region_17) #line 166 "test10.f90" !$omp end ordered call POMP2_Ordered_exit(opari2_region_17) #line 167 "test10.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_18, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_18 ) end if #line 168 "test10.f90" !$omp task if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_18, pomp2_new_task) end if #line 169 "test10.f90" i = 14 if (pomp2_if) then call POMP2_Task_end(opari2_region_18) end if #line 170 "test10.f90" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_18, pomp2_old_task) end if #line 171 "test10.f90" call POMP2_Taskwait_begin(opari2_region_19,& pomp2_old_task, opari2_ctc_19 ) #line 172 "test10.f90" !$omp taskwait call POMP2_Taskwait_end(opari2_region_19, pomp2_old_task) #line 173 "test10.f90" call POMP2_Atomic_enter(opari2_region_20, & opari2_ctc_20 ) #line 174 "test10.f90" !$omp atomic update i = 15 call POMP2_Atomic_exit(opari2_region_20) #line 176 "test10.f90" call POMP2_Sections_enter(opari2_region_21, & opari2_ctc_21 ) #line 177 "test10.f90" !$omp sections i = 16 #line 179 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_21, & opari2_ctc_21 ) #line 180 "test10.f90" i = 17 call POMP2_Section_end(opari2_region_21) #line 181 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_21, & opari2_ctc_21 ) #line 182 "test10.f90" i = 18 call POMP2_Section_end(opari2_region_21) #line 183 "test10.f90" !$omp end sections nowait call POMP2_Sections_exit(opari2_region_21) #line 184 "test10.f90" call POMP2_Barrier_enter(opari2_region_22,& pomp2_old_task, opari2_ctc_22 ) #line 185 "test10.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_22, pomp2_old_task) #line 186 "test10.f90" call POMP2_Flush_enter(opari2_region_23, & opari2_ctc_23 ) #line 187 "test10.f90" !$omp flush call POMP2_Flush_exit(opari2_region_23) #line 188 "test10.f90" #line 189 "test10.f90" !$omp threadprivate( i ) call POMP2_Init_lock( lock ) call POMP2_Destroy_lock( lock ) call POMP2_Finalize() #line 196 "test10.f90" end program test10 subroutine POMP2_Init_reg_000() include 'test10.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) call POMP2_Assign_handle( opari2_region_17, & opari2_ctc_17 ) call POMP2_Assign_handle( opari2_region_18, & opari2_ctc_18 ) call POMP2_Assign_handle( opari2_region_19, & opari2_ctc_19 ) call POMP2_Assign_handle( opari2_region_20, & opari2_ctc_20 ) call POMP2_Assign_handle( opari2_region_21, & opari2_ctc_21 ) call POMP2_Assign_handle( opari2_region_22, & opari2_ctc_22 ) call POMP2_Assign_handle( opari2_region_23, & opari2_ctc_23 ) end opari2-2.0.10/test/data/PaxHeaders/test10.f90.opari.inc.out0000644000000000000000000000013215232670204020064 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test10.f90.opari.inc.out0000664000175100001440000001233015232670204020415 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "66*regionType=parallel*sscl=test10.f90:30:30*escl=test10.f90:32:32**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "68*regionType=paralleldo*sscl=test10.f90:34:34*escl=test10.f90:38:38**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "68*regionType=paralleldo*sscl=test10.f90:40:40*escl=test10.f90:44:44**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "74*regionType=parallelsections*sscl=test10.f90:45:45*escl=test10.f90:50:50**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "75*regionType=parallelworkshare*sscl=test10.f90:53:53*escl=test10.f90:55:55**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "70*regionType=parallel*sscl=test10.f90:113:113*escl=test10.f90:115:115**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "72*regionType=paralleldo*sscl=test10.f90:117:117*escl=test10.f90:121:121**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "72*regionType=paralleldo*sscl=test10.f90:123:123*escl=test10.f90:127:127**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "78*regionType=parallelsections*sscl=test10.f90:128:128*escl=test10.f90:133:133**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "79*regionType=parallelworkshare*sscl=test10.f90:136:136*escl=test10.f90:138:138**" INTEGER( KIND=8 ) :: opari2_region_11 CHARACTER (LEN=999), parameter :: opari2_ctc_11 =& "68*regionType=single*sscl=test10.f90:140:140*escl=test10.f90:142:142**" INTEGER( KIND=8 ) :: opari2_region_12 CHARACTER (LEN=999), parameter :: opari2_ctc_12 =& "68*regionType=master*sscl=test10.f90:144:144*escl=test10.f90:146:146**" INTEGER( KIND=8 ) :: opari2_region_13 CHARACTER (LEN=999), parameter :: opari2_ctc_13 =& "70*regionType=critical*sscl=test10.f90:148:148*escl=test10.f90:150:150**" INTEGER( KIND=8 ) :: opari2_region_14 CHARACTER (LEN=999), parameter :: opari2_ctc_14 =& "70*regionType=critical*sscl=test10.f90:152:152*escl=test10.f90:154:154**" INTEGER( KIND=8 ) :: opari2_region_15 CHARACTER (LEN=999), parameter :: opari2_ctc_15 =& "71*regionType=workshare*sscl=test10.f90:156:156*escl=test10.f90:158:158**" INTEGER( KIND=8 ) :: opari2_region_16 CHARACTER (LEN=999), parameter :: opari2_ctc_16 =& "71*regionType=workshare*sscl=test10.f90:160:160*escl=test10.f90:162:162**" INTEGER( KIND=8 ) :: opari2_region_17 CHARACTER (LEN=999), parameter :: opari2_ctc_17 =& "69*regionType=ordered*sscl=test10.f90:164:164*escl=test10.f90:166:166**" INTEGER( KIND=8 ) :: opari2_region_18 CHARACTER (LEN=999), parameter :: opari2_ctc_18 =& "66*regionType=task*sscl=test10.f90:168:168*escl=test10.f90:170:170**" INTEGER( KIND=8 ) :: opari2_region_19 CHARACTER (LEN=999), parameter :: opari2_ctc_19 =& "70*regionType=taskwait*sscl=test10.f90:172:172*escl=test10.f90:172:172**" INTEGER( KIND=8 ) :: opari2_region_20 CHARACTER (LEN=999), parameter :: opari2_ctc_20 =& "68*regionType=atomic*sscl=test10.f90:174:174*escl=test10.f90:175:175**" INTEGER( KIND=8 ) :: opari2_region_21 CHARACTER (LEN=999), parameter :: opari2_ctc_21 =& "84*regionType=sections*sscl=test10.f90:177:177*escl=test10.f90:183:183*numSections=2**" INTEGER( KIND=8 ) :: opari2_region_22 CHARACTER (LEN=999), parameter :: opari2_ctc_22 =& "69*regionType=barrier*sscl=test10.f90:185:185*escl=test10.f90:185:185**" INTEGER( KIND=8 ) :: opari2_region_23 CHARACTER (LEN=999), parameter :: opari2_ctc_23 =& "67*regionType=flush*sscl=test10.f90:187:187*escl=test10.f90:187:187**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10,& opari2_region_11,& opari2_region_12,& opari2_region_13,& opari2_region_14,& opari2_region_15,& opari2_region_16,& opari2_region_17,& opari2_region_18,& opari2_region_19,& opari2_region_20,& opari2_region_21,& opari2_region_22,& opari2_region_23 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test10.f900000644000000000000000000000013215232670204015375 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test10.f900000664000175100001440000000567215232670204015741 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Bernd Mohr, Peter Philippen ! * ! * @brief Tests user instrumentation directives. program test10 integer (kind=omp_lock_kind) lock !$POMP INST INIT !$POMP INST OFF !$POMP NOINSTRUMENT !$OMP PARALLEL i = 1 !$OMP end PARALLEL !$OMP PARALLEL DO do 100, i = 2, 50 j++ 100 continue !$OMP END PARALLEL DO !$OMP PARALLEL DO do i = 3, 50 j++ enddo !$OMP PARALLEL SECTIONS !$OMP SECTION i = 4 !$OMP SECTION i = 5 !$OMP END PARALLEL SECTIONS !$OMP PARALLEL WORKSHARE i = 6 !$OMP END PARALLEL WORKSHARE !$OMP SINGLE i = 7 !$OMP END SINGLE !$OMP MASTER i = 8 !$OMP END MASTER !$OMP critical i = 9 !$omp end critical !$OMP critical test i = 10 !$omp end critical test !$OMP workshare i = 11 !$OMP end workshare !$OMP workshare i = 12 !$OMP end workshare nowait !$OMP ordered i = 13 !$OMP end ordered !$OMP task i = 14 !$OMP end task !$OMP taskwait !$OMP atomic update i = 15 !$OMP sections i = 16 !$omp section i = 17 !$omp section i = 18 !$omp end sections nowait !$OMP barrier !$OMP flush !$OMP threadprivate( i ) call omp_init_lock( lock ) call omp_destroy_lock( lock ) !$POMP INSTRUMENT !$OMP PARALLEL i = 1 !$OMP end PARALLEL !$OMP PARALLEL DO do 100, i = 2, 50 j++ 100 continue !$OMP END PARALLEL DO !$OMP PARALLEL DO do i = 3, 50 j++ enddo !$OMP PARALLEL SECTIONS !$OMP SECTION i = 4 !$OMP SECTION i = 5 !$OMP END PARALLEL SECTIONS !$OMP PARALLEL WORKSHARE i = 6 !$OMP END PARALLEL WORKSHARE !$OMP SINGLE i = 7 !$OMP END SINGLE !$OMP MASTER i = 8 !$OMP END MASTER !$OMP critical i = 9 !$omp end critical !$OMP critical test i = 10 !$omp end critical test !$OMP workshare i = 11 !$OMP end workshare !$OMP workshare i = 12 !$OMP end workshare nowait !$OMP ordered i = 13 !$OMP end ordered !$OMP task i = 14 !$OMP end task !$OMP taskwait !$OMP atomic update i = 15 !$OMP sections i = 16 !$omp section i = 17 !$omp section i = 18 !$omp end sections nowait !$OMP barrier !$OMP flush !$OMP threadprivate( i ) call omp_init_lock( lock ) call omp_destroy_lock( lock ) !$POMP INST FINALIZE end program test10 opari2-2.0.10/test/data/PaxHeaders/test1.prep.c.out0000644000000000000000000000013215232670204016714 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.prep.c.out0000664000175100001440000007504315232670204017257 0ustar00builderusers# 1 "test1.input.c" # 1 "/private/peterp/work/test/scorep/prep//" # 1 "" # 1 "test1.input.c" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 1 3 4 # 1 "/usr/include/stdint.h" 1 3 4 # 25 "/usr/include/stdint.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 345 "/usr/include/features.h" 3 4 # 1 "/usr/include/stdc-predef.h" 1 3 4 # 346 "/usr/include/features.h" 2 3 4 # 375 "/usr/include/features.h" 3 4 # 1 "/usr/include/sys/cdefs.h" 1 3 4 # 385 "/usr/include/sys/cdefs.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 386 "/usr/include/sys/cdefs.h" 2 3 4 # 376 "/usr/include/features.h" 2 3 4 # 399 "/usr/include/features.h" 3 4 # 1 "/usr/include/gnu/stubs.h" 1 3 4 # 10 "/usr/include/gnu/stubs.h" 3 4 # 1 "/usr/include/gnu/stubs-64.h" 1 3 4 # 11 "/usr/include/gnu/stubs.h" 2 3 4 # 400 "/usr/include/features.h" 2 3 4 # 26 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wchar.h" 1 3 4 # 22 "/usr/include/bits/wchar.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 23 "/usr/include/bits/wchar.h" 2 3 4 # 27 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/stdint.h" 2 3 4 # 36 "/usr/include/stdint.h" 3 4 typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; typedef long int int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned long int uint64_t; # 65 "/usr/include/stdint.h" 3 4 typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; typedef long int int_least64_t; typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; typedef unsigned long int uint_least64_t; # 90 "/usr/include/stdint.h" 3 4 typedef signed char int_fast8_t; typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; # 103 "/usr/include/stdint.h" 3 4 typedef unsigned char uint_fast8_t; typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; # 119 "/usr/include/stdint.h" 3 4 typedef long int intptr_t; typedef unsigned long int uintptr_t; # 134 "/usr/include/stdint.h" 3 4 typedef long int intmax_t; typedef unsigned long int uintmax_t; # 4 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 2 3 4 # 2 "test1.input.c" 2 # 1 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 1 # 29 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 1 3 4 # 34 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 3 4 typedef struct { unsigned char _x[4] __attribute__((__aligned__(4))); } omp_lock_t; typedef struct { unsigned char _x[16] __attribute__((__aligned__(8))); } omp_nest_lock_t; typedef enum omp_sched_t { omp_sched_static = 1, omp_sched_dynamic = 2, omp_sched_guided = 3, omp_sched_auto = 4 } omp_sched_t; extern "C" { extern void omp_set_num_threads (int) throw (); extern int omp_get_num_threads (void) throw (); extern int omp_get_max_threads (void) throw (); extern int omp_get_thread_num (void) throw (); extern int omp_get_num_procs (void) throw (); extern int omp_in_parallel (void) throw (); extern void omp_set_dynamic (int) throw (); extern int omp_get_dynamic (void) throw (); extern void omp_set_nested (int) throw (); extern int omp_get_nested (void) throw (); extern void omp_init_lock (omp_lock_t *) throw (); extern void omp_destroy_lock (omp_lock_t *) throw (); extern void omp_set_lock (omp_lock_t *) throw (); extern void omp_unset_lock (omp_lock_t *) throw (); extern int omp_test_lock (omp_lock_t *) throw (); extern void omp_init_nest_lock (omp_nest_lock_t *) throw (); extern void omp_destroy_nest_lock (omp_nest_lock_t *) throw (); extern void omp_set_nest_lock (omp_nest_lock_t *) throw (); extern void omp_unset_nest_lock (omp_nest_lock_t *) throw (); extern int omp_test_nest_lock (omp_nest_lock_t *) throw (); extern double omp_get_wtime (void) throw (); extern double omp_get_wtick (void) throw (); void omp_set_schedule (omp_sched_t, int) throw (); void omp_get_schedule (omp_sched_t *, int *) throw (); int omp_get_thread_limit (void) throw (); void omp_set_max_active_levels (int) throw (); int omp_get_max_active_levels (void) throw (); int omp_get_level (void) throw (); int omp_get_ancestor_thread_num (int) throw (); int omp_get_team_size (int) throw (); int omp_get_active_level (void) throw (); int omp_in_final (void) throw (); } # 30 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 150 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long int ptrdiff_t; # 213 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long unsigned int size_t; # 33 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 extern "C" { # 54 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" typedef void* POMP2_Region_handle; typedef int64_t POMP2_Task_handle; # 66 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern size_t POMP2_Get_num_regions( void ); extern void POMP2_Init_regions( void ); extern const char* POMP2_Get_opari2_version( void ); extern POMP2_Task_handle POMP2_Get_new_task_handle( void ); extern void POMP2_Finalize( void ); extern void POMP2_Init( void ); extern void POMP2_Off( void ); extern void POMP2_On( void ); extern void POMP2_Begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_End( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ); # 163 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 179 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 195 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ); # 211 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ); # 294 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ); # 318 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 336 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ); # 452 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 468 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ); # 505 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 523 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ); # 558 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 575 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 586 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern int POMP2_Lib_get_max_threads( void ); extern void POMP2_Init_lock( omp_lock_t* s ); extern void POMP2_Destroy_lock( omp_lock_t* s ); extern void POMP2_Set_lock( omp_lock_t* s ); extern void POMP2_Unset_lock( omp_lock_t* s ); extern int POMP2_Test_lock( omp_lock_t* s ); extern void POMP2_Init_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Set_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Unset_nest_lock( omp_nest_lock_t* s ); extern int POMP2_Test_nest_lock( omp_nest_lock_t* s ); } # 3 "test1.input.c" 2 #include "test1.prep.c.opari.inc" # 1 "/private/peterp/work/test/scorep/prep/test1.c" # 21 "/private/peterp/work/test/scorep/prep/test1.c" # 1 "/usr/include/stdio.h" 1 3 4 # 29 "/usr/include/stdio.h" 3 4 extern "C" { # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 34 "/usr/include/stdio.h" 2 3 4 # 1 "/usr/include/bits/types.h" 1 3 4 # 27 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/bits/types.h" 2 3 4 typedef unsigned char __u_char; typedef unsigned short int __u_short; typedef unsigned int __u_int; typedef unsigned long int __u_long; typedef signed char __int8_t; typedef unsigned char __uint8_t; typedef signed short int __int16_t; typedef unsigned short int __uint16_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; typedef signed long int __int64_t; typedef unsigned long int __uint64_t; typedef long int __quad_t; typedef unsigned long int __u_quad_t; # 130 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/typesizes.h" 1 3 4 # 131 "/usr/include/bits/types.h" 2 3 4 typedef unsigned long int __dev_t; typedef unsigned int __uid_t; typedef unsigned int __gid_t; typedef unsigned long int __ino_t; typedef unsigned long int __ino64_t; typedef unsigned int __mode_t; typedef unsigned long int __nlink_t; typedef long int __off_t; typedef long int __off64_t; typedef int __pid_t; typedef struct { int __val[2]; } __fsid_t; typedef long int __clock_t; typedef unsigned long int __rlim_t; typedef unsigned long int __rlim64_t; typedef unsigned int __id_t; typedef long int __time_t; typedef unsigned int __useconds_t; typedef long int __suseconds_t; typedef int __daddr_t; typedef int __key_t; typedef int __clockid_t; typedef void * __timer_t; typedef long int __blksize_t; typedef long int __blkcnt_t; typedef long int __blkcnt64_t; typedef unsigned long int __fsblkcnt_t; typedef unsigned long int __fsblkcnt64_t; typedef unsigned long int __fsfilcnt_t; typedef unsigned long int __fsfilcnt64_t; typedef long int __fsword_t; typedef long int __ssize_t; typedef long int __syscall_slong_t; typedef unsigned long int __syscall_ulong_t; typedef __off64_t __loff_t; typedef __quad_t *__qaddr_t; typedef char *__caddr_t; typedef long int __intptr_t; typedef unsigned int __socklen_t; # 36 "/usr/include/stdio.h" 2 3 4 # 44 "/usr/include/stdio.h" 3 4 struct _IO_FILE; typedef struct _IO_FILE FILE; # 64 "/usr/include/stdio.h" 3 4 typedef struct _IO_FILE __FILE; # 74 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/libio.h" 1 3 4 # 32 "/usr/include/libio.h" 3 4 # 1 "/usr/include/_G_config.h" 1 3 4 # 15 "/usr/include/_G_config.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 16 "/usr/include/_G_config.h" 2 3 4 # 1 "/usr/include/wchar.h" 1 3 4 # 82 "/usr/include/wchar.h" 3 4 typedef struct { int __count; union { unsigned int __wch; char __wchb[4]; } __value; } __mbstate_t; # 21 "/usr/include/_G_config.h" 2 3 4 typedef struct { __off_t __pos; __mbstate_t __state; } _G_fpos_t; typedef struct { __off64_t __pos; __mbstate_t __state; } _G_fpos64_t; # 33 "/usr/include/libio.h" 2 3 4 # 50 "/usr/include/libio.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 1 3 4 # 40 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 3 4 typedef __builtin_va_list __gnuc_va_list; # 51 "/usr/include/libio.h" 2 3 4 # 145 "/usr/include/libio.h" 3 4 struct _IO_jump_t; struct _IO_FILE; # 155 "/usr/include/libio.h" 3 4 typedef void _IO_lock_t; struct _IO_marker { struct _IO_marker *_next; struct _IO_FILE *_sbuf; int _pos; # 178 "/usr/include/libio.h" 3 4 }; enum __codecvt_result { __codecvt_ok, __codecvt_partial, __codecvt_error, __codecvt_noconv }; # 246 "/usr/include/libio.h" 3 4 struct _IO_FILE { int _flags; char* _IO_read_ptr; char* _IO_read_end; char* _IO_read_base; char* _IO_write_base; char* _IO_write_ptr; char* _IO_write_end; char* _IO_buf_base; char* _IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _flags2; __off_t _old_offset; unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; _IO_lock_t *_lock; # 294 "/usr/include/libio.h" 3 4 __off64_t _offset; # 303 "/usr/include/libio.h" 3 4 void *__pad1; void *__pad2; void *__pad3; void *__pad4; size_t __pad5; int _mode; char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; }; struct _IO_FILE_plus; extern struct _IO_FILE_plus _IO_2_1_stdin_; extern struct _IO_FILE_plus _IO_2_1_stdout_; extern struct _IO_FILE_plus _IO_2_1_stderr_; # 339 "/usr/include/libio.h" 3 4 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf, size_t __n); typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); typedef int __io_close_fn (void *__cookie); typedef __io_read_fn cookie_read_function_t; typedef __io_write_fn cookie_write_function_t; typedef __io_seek_fn cookie_seek_function_t; typedef __io_close_fn cookie_close_function_t; typedef struct { __io_read_fn *read; __io_write_fn *write; __io_seek_fn *seek; __io_close_fn *close; } _IO_cookie_io_functions_t; typedef _IO_cookie_io_functions_t cookie_io_functions_t; struct _IO_cookie_file; extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write, void *__cookie, _IO_cookie_io_functions_t __fns); extern "C" { extern int __underflow (_IO_FILE *); extern int __uflow (_IO_FILE *); extern int __overflow (_IO_FILE *, int); # 435 "/usr/include/libio.h" 3 4 extern int _IO_getc (_IO_FILE *__fp); extern int _IO_putc (int __c, _IO_FILE *__fp); extern int _IO_feof (_IO_FILE *__fp) throw (); extern int _IO_ferror (_IO_FILE *__fp) throw (); extern int _IO_peekc_locked (_IO_FILE *__fp); extern void _IO_flockfile (_IO_FILE *) throw (); extern void _IO_funlockfile (_IO_FILE *) throw (); extern int _IO_ftrylockfile (_IO_FILE *) throw (); # 465 "/usr/include/libio.h" 3 4 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, __gnuc_va_list, int *__restrict); extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, __gnuc_va_list); extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t); extern size_t _IO_sgetn (_IO_FILE *, void *, size_t); extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int); extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int); extern void _IO_free_backup_area (_IO_FILE *) throw (); # 527 "/usr/include/libio.h" 3 4 } # 75 "/usr/include/stdio.h" 2 3 4 typedef __gnuc_va_list va_list; # 90 "/usr/include/stdio.h" 3 4 typedef __off_t off_t; typedef __off64_t off64_t; typedef __ssize_t ssize_t; typedef _G_fpos_t fpos_t; typedef _G_fpos64_t fpos64_t; # 164 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/bits/stdio_lim.h" 1 3 4 # 165 "/usr/include/stdio.h" 2 3 4 extern struct _IO_FILE *stdin; extern struct _IO_FILE *stdout; extern struct _IO_FILE *stderr; extern int remove (const char *__filename) throw (); extern int rename (const char *__old, const char *__new) throw (); extern int renameat (int __oldfd, const char *__old, int __newfd, const char *__new) throw (); extern FILE *tmpfile (void) ; # 205 "/usr/include/stdio.h" 3 4 extern FILE *tmpfile64 (void) ; extern char *tmpnam (char *__s) throw () ; extern char *tmpnam_r (char *__s) throw () ; # 227 "/usr/include/stdio.h" 3 4 extern char *tempnam (const char *__dir, const char *__pfx) throw () __attribute__ ((__malloc__)) ; extern int fclose (FILE *__stream); extern int fflush (FILE *__stream); # 252 "/usr/include/stdio.h" 3 4 extern int fflush_unlocked (FILE *__stream); # 262 "/usr/include/stdio.h" 3 4 extern int fcloseall (void); extern FILE *fopen (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; # 295 "/usr/include/stdio.h" 3 4 extern FILE *fopen64 (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen64 (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; extern FILE *fdopen (int __fd, const char *__modes) throw () ; extern FILE *fopencookie (void *__restrict __magic_cookie, const char *__restrict __modes, _IO_cookie_io_functions_t __io_funcs) throw () ; extern FILE *fmemopen (void *__s, size_t __len, const char *__modes) throw () ; extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) throw () ; extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw (); extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n) throw (); extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, size_t __size) throw (); extern void setlinebuf (FILE *__stream) throw (); extern int fprintf (FILE *__restrict __stream, const char *__restrict __format, ...); extern int printf (const char *__restrict __format, ...); extern int sprintf (char *__restrict __s, const char *__restrict __format, ...) throw (); extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg); extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); extern int vsprintf (char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw (); extern int snprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 3, 4))); extern int vsnprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 3, 0))); extern int vasprintf (char **__restrict __ptr, const char *__restrict __f, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 2, 0))) ; extern int __asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 2, 0))); extern int dprintf (int __fd, const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) ; extern int scanf (const char *__restrict __format, ...) ; extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) throw (); # 463 "/usr/include/stdio.h" 3 4 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 2, 0))) ; extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 1, 0))) ; extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__scanf__, 2, 0))); # 522 "/usr/include/stdio.h" 3 4 extern int fgetc (FILE *__stream); extern int getc (FILE *__stream); extern int getchar (void); # 550 "/usr/include/stdio.h" 3 4 extern int getc_unlocked (FILE *__stream); extern int getchar_unlocked (void); # 561 "/usr/include/stdio.h" 3 4 extern int fgetc_unlocked (FILE *__stream); extern int fputc (int __c, FILE *__stream); extern int putc (int __c, FILE *__stream); extern int putchar (int __c); # 594 "/usr/include/stdio.h" 3 4 extern int fputc_unlocked (int __c, FILE *__stream); extern int putc_unlocked (int __c, FILE *__stream); extern int putchar_unlocked (int __c); extern int getw (FILE *__stream); extern int putw (int __w, FILE *__stream); extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 638 "/usr/include/stdio.h" 3 4 extern char *gets (char *__s) __attribute__ ((__deprecated__)); # 649 "/usr/include/stdio.h" 3 4 extern char *fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 665 "/usr/include/stdio.h" 3 4 extern __ssize_t __getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getline (char **__restrict __lineptr, size_t *__restrict __n, FILE *__restrict __stream) ; extern int fputs (const char *__restrict __s, FILE *__restrict __stream); extern int puts (const char *__s); extern int ungetc (int __c, FILE *__stream); extern size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s); # 726 "/usr/include/stdio.h" 3 4 extern int fputs_unlocked (const char *__restrict __s, FILE *__restrict __stream); # 737 "/usr/include/stdio.h" 3 4 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream); extern int fseek (FILE *__stream, long int __off, int __whence); extern long int ftell (FILE *__stream) ; extern void rewind (FILE *__stream); # 773 "/usr/include/stdio.h" 3 4 extern int fseeko (FILE *__stream, __off_t __off, int __whence); extern __off_t ftello (FILE *__stream) ; # 792 "/usr/include/stdio.h" 3 4 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); extern int fsetpos (FILE *__stream, const fpos_t *__pos); # 815 "/usr/include/stdio.h" 3 4 extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence); extern __off64_t ftello64 (FILE *__stream) ; extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos); extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos); extern void clearerr (FILE *__stream) throw (); extern int feof (FILE *__stream) throw () ; extern int ferror (FILE *__stream) throw () ; extern void clearerr_unlocked (FILE *__stream) throw (); extern int feof_unlocked (FILE *__stream) throw () ; extern int ferror_unlocked (FILE *__stream) throw () ; extern void perror (const char *__s); # 1 "/usr/include/bits/sys_errlist.h" 1 3 4 # 26 "/usr/include/bits/sys_errlist.h" 3 4 extern int sys_nerr; extern const char *const sys_errlist[]; extern int _sys_nerr; extern const char *const _sys_errlist[]; # 854 "/usr/include/stdio.h" 2 3 4 extern int fileno (FILE *__stream) throw () ; extern int fileno_unlocked (FILE *__stream) throw () ; # 873 "/usr/include/stdio.h" 3 4 extern FILE *popen (const char *__command, const char *__modes) ; extern int pclose (FILE *__stream); extern char *ctermid (char *__s) throw (); extern char *cuserid (char *__s); struct obstack; extern int obstack_printf (struct obstack *__restrict __obstack, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))); extern int obstack_vprintf (struct obstack *__restrict __obstack, const char *__restrict __format, __gnuc_va_list __args) throw () __attribute__ ((__format__ (__printf__, 2, 0))); extern void flockfile (FILE *__stream) throw (); extern int ftrylockfile (FILE *__stream) throw () ; extern void funlockfile (FILE *__stream) throw (); # 943 "/usr/include/stdio.h" 3 4 } # 22 "/private/peterp/work/test/scorep/prep/test1.c" 2 int main() { printf("before...\n"); # 33 "/private/peterp/work/test/scorep/prep/test1.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test1.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test1.c" # 33 "/private/peterp/work/test/scorep/prep/test1.c" {{ printf("parallel 1...\n"); }} { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 37 "test1.c" # 39 "/private/peterp/work/test/scorep/prep/test1.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 39 "test1.c" #pragma omp parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); #line 40 "test1.c" { printf("parallel 2...\n"); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 44 "test1.c" # 76 "/private/peterp/work/test/scorep/prep/test1.c" { } # 88 "/private/peterp/work/test/scorep/prep/test1.c" { printf("#pragma omp parallel"); printf("\" and continuation in the next line #pragma omp parallel\" and especially strange escape character usage\n"); } printf("after...\n"); printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.10/test/data/PaxHeaders/test1.prep.c.opari.inc.out0000644000000000000000000000013215232670204020575 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.prep.c.opari.inc.out0000664000175100001440000000114015232670204021123 0ustar00builderusers#define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = (OPARI2_Region_handle)0; #define opari2_ctc_1 "61*regionType=parallel*sscl=test1.c:33:33*escl=test1.c:36:36**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = (OPARI2_Region_handle)0; #define opari2_ctc_2 "61*regionType=parallel*sscl=test1.c:39:39*escl=test1.c:43:43**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.10/test/data/PaxHeaders/test1.prep.c0000644000000000000000000000013215232670204016106 xustar0030 mtime=1785426052.211415524 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.prep.c0000664000175100001440000007226315232670204016452 0ustar00builderusers# 1 "test1.input.c" # 1 "/private/peterp/work/test/scorep/prep//" # 1 "" # 1 "test1.input.c" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 1 3 4 # 1 "/usr/include/stdint.h" 1 3 4 # 25 "/usr/include/stdint.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 345 "/usr/include/features.h" 3 4 # 1 "/usr/include/stdc-predef.h" 1 3 4 # 346 "/usr/include/features.h" 2 3 4 # 375 "/usr/include/features.h" 3 4 # 1 "/usr/include/sys/cdefs.h" 1 3 4 # 385 "/usr/include/sys/cdefs.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 386 "/usr/include/sys/cdefs.h" 2 3 4 # 376 "/usr/include/features.h" 2 3 4 # 399 "/usr/include/features.h" 3 4 # 1 "/usr/include/gnu/stubs.h" 1 3 4 # 10 "/usr/include/gnu/stubs.h" 3 4 # 1 "/usr/include/gnu/stubs-64.h" 1 3 4 # 11 "/usr/include/gnu/stubs.h" 2 3 4 # 400 "/usr/include/features.h" 2 3 4 # 26 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wchar.h" 1 3 4 # 22 "/usr/include/bits/wchar.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 23 "/usr/include/bits/wchar.h" 2 3 4 # 27 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/stdint.h" 2 3 4 # 36 "/usr/include/stdint.h" 3 4 typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; typedef long int int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned long int uint64_t; # 65 "/usr/include/stdint.h" 3 4 typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; typedef long int int_least64_t; typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; typedef unsigned long int uint_least64_t; # 90 "/usr/include/stdint.h" 3 4 typedef signed char int_fast8_t; typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; # 103 "/usr/include/stdint.h" 3 4 typedef unsigned char uint_fast8_t; typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; # 119 "/usr/include/stdint.h" 3 4 typedef long int intptr_t; typedef unsigned long int uintptr_t; # 134 "/usr/include/stdint.h" 3 4 typedef long int intmax_t; typedef unsigned long int uintmax_t; # 4 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 2 3 4 # 2 "test1.input.c" 2 # 1 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 1 # 29 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 1 3 4 # 34 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 3 4 typedef struct { unsigned char _x[4] __attribute__((__aligned__(4))); } omp_lock_t; typedef struct { unsigned char _x[16] __attribute__((__aligned__(8))); } omp_nest_lock_t; typedef enum omp_sched_t { omp_sched_static = 1, omp_sched_dynamic = 2, omp_sched_guided = 3, omp_sched_auto = 4 } omp_sched_t; extern "C" { extern void omp_set_num_threads (int) throw (); extern int omp_get_num_threads (void) throw (); extern int omp_get_max_threads (void) throw (); extern int omp_get_thread_num (void) throw (); extern int omp_get_num_procs (void) throw (); extern int omp_in_parallel (void) throw (); extern void omp_set_dynamic (int) throw (); extern int omp_get_dynamic (void) throw (); extern void omp_set_nested (int) throw (); extern int omp_get_nested (void) throw (); extern void omp_init_lock (omp_lock_t *) throw (); extern void omp_destroy_lock (omp_lock_t *) throw (); extern void omp_set_lock (omp_lock_t *) throw (); extern void omp_unset_lock (omp_lock_t *) throw (); extern int omp_test_lock (omp_lock_t *) throw (); extern void omp_init_nest_lock (omp_nest_lock_t *) throw (); extern void omp_destroy_nest_lock (omp_nest_lock_t *) throw (); extern void omp_set_nest_lock (omp_nest_lock_t *) throw (); extern void omp_unset_nest_lock (omp_nest_lock_t *) throw (); extern int omp_test_nest_lock (omp_nest_lock_t *) throw (); extern double omp_get_wtime (void) throw (); extern double omp_get_wtick (void) throw (); void omp_set_schedule (omp_sched_t, int) throw (); void omp_get_schedule (omp_sched_t *, int *) throw (); int omp_get_thread_limit (void) throw (); void omp_set_max_active_levels (int) throw (); int omp_get_max_active_levels (void) throw (); int omp_get_level (void) throw (); int omp_get_ancestor_thread_num (int) throw (); int omp_get_team_size (int) throw (); int omp_get_active_level (void) throw (); int omp_in_final (void) throw (); } # 30 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 150 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long int ptrdiff_t; # 213 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long unsigned int size_t; # 33 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 extern "C" { # 54 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" typedef void* POMP2_Region_handle; typedef int64_t POMP2_Task_handle; # 66 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern size_t POMP2_Get_num_regions( void ); extern void POMP2_Init_regions( void ); extern const char* POMP2_Get_opari2_version( void ); extern POMP2_Task_handle POMP2_Get_new_task_handle( void ); extern void POMP2_Finalize( void ); extern void POMP2_Init( void ); extern void POMP2_Off( void ); extern void POMP2_On( void ); extern void POMP2_Begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_End( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ); # 163 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 179 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 195 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ); # 211 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ); # 294 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ); # 318 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 336 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ); # 452 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 468 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ); # 505 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 523 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ); # 558 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 575 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 586 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern int POMP2_Lib_get_max_threads( void ); extern void POMP2_Init_lock( omp_lock_t* s ); extern void POMP2_Destroy_lock( omp_lock_t* s ); extern void POMP2_Set_lock( omp_lock_t* s ); extern void POMP2_Unset_lock( omp_lock_t* s ); extern int POMP2_Test_lock( omp_lock_t* s ); extern void POMP2_Init_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Set_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Unset_nest_lock( omp_nest_lock_t* s ); extern int POMP2_Test_nest_lock( omp_nest_lock_t* s ); } # 3 "test1.input.c" 2 ___POMP2_INCLUDE___ # 1 "/private/peterp/work/test/scorep/prep/test1.c" # 21 "/private/peterp/work/test/scorep/prep/test1.c" # 1 "/usr/include/stdio.h" 1 3 4 # 29 "/usr/include/stdio.h" 3 4 extern "C" { # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 34 "/usr/include/stdio.h" 2 3 4 # 1 "/usr/include/bits/types.h" 1 3 4 # 27 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/bits/types.h" 2 3 4 typedef unsigned char __u_char; typedef unsigned short int __u_short; typedef unsigned int __u_int; typedef unsigned long int __u_long; typedef signed char __int8_t; typedef unsigned char __uint8_t; typedef signed short int __int16_t; typedef unsigned short int __uint16_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; typedef signed long int __int64_t; typedef unsigned long int __uint64_t; typedef long int __quad_t; typedef unsigned long int __u_quad_t; # 130 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/typesizes.h" 1 3 4 # 131 "/usr/include/bits/types.h" 2 3 4 typedef unsigned long int __dev_t; typedef unsigned int __uid_t; typedef unsigned int __gid_t; typedef unsigned long int __ino_t; typedef unsigned long int __ino64_t; typedef unsigned int __mode_t; typedef unsigned long int __nlink_t; typedef long int __off_t; typedef long int __off64_t; typedef int __pid_t; typedef struct { int __val[2]; } __fsid_t; typedef long int __clock_t; typedef unsigned long int __rlim_t; typedef unsigned long int __rlim64_t; typedef unsigned int __id_t; typedef long int __time_t; typedef unsigned int __useconds_t; typedef long int __suseconds_t; typedef int __daddr_t; typedef int __key_t; typedef int __clockid_t; typedef void * __timer_t; typedef long int __blksize_t; typedef long int __blkcnt_t; typedef long int __blkcnt64_t; typedef unsigned long int __fsblkcnt_t; typedef unsigned long int __fsblkcnt64_t; typedef unsigned long int __fsfilcnt_t; typedef unsigned long int __fsfilcnt64_t; typedef long int __fsword_t; typedef long int __ssize_t; typedef long int __syscall_slong_t; typedef unsigned long int __syscall_ulong_t; typedef __off64_t __loff_t; typedef __quad_t *__qaddr_t; typedef char *__caddr_t; typedef long int __intptr_t; typedef unsigned int __socklen_t; # 36 "/usr/include/stdio.h" 2 3 4 # 44 "/usr/include/stdio.h" 3 4 struct _IO_FILE; typedef struct _IO_FILE FILE; # 64 "/usr/include/stdio.h" 3 4 typedef struct _IO_FILE __FILE; # 74 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/libio.h" 1 3 4 # 32 "/usr/include/libio.h" 3 4 # 1 "/usr/include/_G_config.h" 1 3 4 # 15 "/usr/include/_G_config.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 16 "/usr/include/_G_config.h" 2 3 4 # 1 "/usr/include/wchar.h" 1 3 4 # 82 "/usr/include/wchar.h" 3 4 typedef struct { int __count; union { unsigned int __wch; char __wchb[4]; } __value; } __mbstate_t; # 21 "/usr/include/_G_config.h" 2 3 4 typedef struct { __off_t __pos; __mbstate_t __state; } _G_fpos_t; typedef struct { __off64_t __pos; __mbstate_t __state; } _G_fpos64_t; # 33 "/usr/include/libio.h" 2 3 4 # 50 "/usr/include/libio.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 1 3 4 # 40 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 3 4 typedef __builtin_va_list __gnuc_va_list; # 51 "/usr/include/libio.h" 2 3 4 # 145 "/usr/include/libio.h" 3 4 struct _IO_jump_t; struct _IO_FILE; # 155 "/usr/include/libio.h" 3 4 typedef void _IO_lock_t; struct _IO_marker { struct _IO_marker *_next; struct _IO_FILE *_sbuf; int _pos; # 178 "/usr/include/libio.h" 3 4 }; enum __codecvt_result { __codecvt_ok, __codecvt_partial, __codecvt_error, __codecvt_noconv }; # 246 "/usr/include/libio.h" 3 4 struct _IO_FILE { int _flags; char* _IO_read_ptr; char* _IO_read_end; char* _IO_read_base; char* _IO_write_base; char* _IO_write_ptr; char* _IO_write_end; char* _IO_buf_base; char* _IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _flags2; __off_t _old_offset; unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; _IO_lock_t *_lock; # 294 "/usr/include/libio.h" 3 4 __off64_t _offset; # 303 "/usr/include/libio.h" 3 4 void *__pad1; void *__pad2; void *__pad3; void *__pad4; size_t __pad5; int _mode; char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; }; struct _IO_FILE_plus; extern struct _IO_FILE_plus _IO_2_1_stdin_; extern struct _IO_FILE_plus _IO_2_1_stdout_; extern struct _IO_FILE_plus _IO_2_1_stderr_; # 339 "/usr/include/libio.h" 3 4 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf, size_t __n); typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); typedef int __io_close_fn (void *__cookie); typedef __io_read_fn cookie_read_function_t; typedef __io_write_fn cookie_write_function_t; typedef __io_seek_fn cookie_seek_function_t; typedef __io_close_fn cookie_close_function_t; typedef struct { __io_read_fn *read; __io_write_fn *write; __io_seek_fn *seek; __io_close_fn *close; } _IO_cookie_io_functions_t; typedef _IO_cookie_io_functions_t cookie_io_functions_t; struct _IO_cookie_file; extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write, void *__cookie, _IO_cookie_io_functions_t __fns); extern "C" { extern int __underflow (_IO_FILE *); extern int __uflow (_IO_FILE *); extern int __overflow (_IO_FILE *, int); # 435 "/usr/include/libio.h" 3 4 extern int _IO_getc (_IO_FILE *__fp); extern int _IO_putc (int __c, _IO_FILE *__fp); extern int _IO_feof (_IO_FILE *__fp) throw (); extern int _IO_ferror (_IO_FILE *__fp) throw (); extern int _IO_peekc_locked (_IO_FILE *__fp); extern void _IO_flockfile (_IO_FILE *) throw (); extern void _IO_funlockfile (_IO_FILE *) throw (); extern int _IO_ftrylockfile (_IO_FILE *) throw (); # 465 "/usr/include/libio.h" 3 4 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, __gnuc_va_list, int *__restrict); extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, __gnuc_va_list); extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t); extern size_t _IO_sgetn (_IO_FILE *, void *, size_t); extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int); extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int); extern void _IO_free_backup_area (_IO_FILE *) throw (); # 527 "/usr/include/libio.h" 3 4 } # 75 "/usr/include/stdio.h" 2 3 4 typedef __gnuc_va_list va_list; # 90 "/usr/include/stdio.h" 3 4 typedef __off_t off_t; typedef __off64_t off64_t; typedef __ssize_t ssize_t; typedef _G_fpos_t fpos_t; typedef _G_fpos64_t fpos64_t; # 164 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/bits/stdio_lim.h" 1 3 4 # 165 "/usr/include/stdio.h" 2 3 4 extern struct _IO_FILE *stdin; extern struct _IO_FILE *stdout; extern struct _IO_FILE *stderr; extern int remove (const char *__filename) throw (); extern int rename (const char *__old, const char *__new) throw (); extern int renameat (int __oldfd, const char *__old, int __newfd, const char *__new) throw (); extern FILE *tmpfile (void) ; # 205 "/usr/include/stdio.h" 3 4 extern FILE *tmpfile64 (void) ; extern char *tmpnam (char *__s) throw () ; extern char *tmpnam_r (char *__s) throw () ; # 227 "/usr/include/stdio.h" 3 4 extern char *tempnam (const char *__dir, const char *__pfx) throw () __attribute__ ((__malloc__)) ; extern int fclose (FILE *__stream); extern int fflush (FILE *__stream); # 252 "/usr/include/stdio.h" 3 4 extern int fflush_unlocked (FILE *__stream); # 262 "/usr/include/stdio.h" 3 4 extern int fcloseall (void); extern FILE *fopen (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; # 295 "/usr/include/stdio.h" 3 4 extern FILE *fopen64 (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen64 (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; extern FILE *fdopen (int __fd, const char *__modes) throw () ; extern FILE *fopencookie (void *__restrict __magic_cookie, const char *__restrict __modes, _IO_cookie_io_functions_t __io_funcs) throw () ; extern FILE *fmemopen (void *__s, size_t __len, const char *__modes) throw () ; extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) throw () ; extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw (); extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n) throw (); extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, size_t __size) throw (); extern void setlinebuf (FILE *__stream) throw (); extern int fprintf (FILE *__restrict __stream, const char *__restrict __format, ...); extern int printf (const char *__restrict __format, ...); extern int sprintf (char *__restrict __s, const char *__restrict __format, ...) throw (); extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg); extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); extern int vsprintf (char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw (); extern int snprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 3, 4))); extern int vsnprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 3, 0))); extern int vasprintf (char **__restrict __ptr, const char *__restrict __f, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 2, 0))) ; extern int __asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 2, 0))); extern int dprintf (int __fd, const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) ; extern int scanf (const char *__restrict __format, ...) ; extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) throw (); # 463 "/usr/include/stdio.h" 3 4 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 2, 0))) ; extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 1, 0))) ; extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__scanf__, 2, 0))); # 522 "/usr/include/stdio.h" 3 4 extern int fgetc (FILE *__stream); extern int getc (FILE *__stream); extern int getchar (void); # 550 "/usr/include/stdio.h" 3 4 extern int getc_unlocked (FILE *__stream); extern int getchar_unlocked (void); # 561 "/usr/include/stdio.h" 3 4 extern int fgetc_unlocked (FILE *__stream); extern int fputc (int __c, FILE *__stream); extern int putc (int __c, FILE *__stream); extern int putchar (int __c); # 594 "/usr/include/stdio.h" 3 4 extern int fputc_unlocked (int __c, FILE *__stream); extern int putc_unlocked (int __c, FILE *__stream); extern int putchar_unlocked (int __c); extern int getw (FILE *__stream); extern int putw (int __w, FILE *__stream); extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 638 "/usr/include/stdio.h" 3 4 extern char *gets (char *__s) __attribute__ ((__deprecated__)); # 649 "/usr/include/stdio.h" 3 4 extern char *fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 665 "/usr/include/stdio.h" 3 4 extern __ssize_t __getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getline (char **__restrict __lineptr, size_t *__restrict __n, FILE *__restrict __stream) ; extern int fputs (const char *__restrict __s, FILE *__restrict __stream); extern int puts (const char *__s); extern int ungetc (int __c, FILE *__stream); extern size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s); # 726 "/usr/include/stdio.h" 3 4 extern int fputs_unlocked (const char *__restrict __s, FILE *__restrict __stream); # 737 "/usr/include/stdio.h" 3 4 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream); extern int fseek (FILE *__stream, long int __off, int __whence); extern long int ftell (FILE *__stream) ; extern void rewind (FILE *__stream); # 773 "/usr/include/stdio.h" 3 4 extern int fseeko (FILE *__stream, __off_t __off, int __whence); extern __off_t ftello (FILE *__stream) ; # 792 "/usr/include/stdio.h" 3 4 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); extern int fsetpos (FILE *__stream, const fpos_t *__pos); # 815 "/usr/include/stdio.h" 3 4 extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence); extern __off64_t ftello64 (FILE *__stream) ; extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos); extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos); extern void clearerr (FILE *__stream) throw (); extern int feof (FILE *__stream) throw () ; extern int ferror (FILE *__stream) throw () ; extern void clearerr_unlocked (FILE *__stream) throw (); extern int feof_unlocked (FILE *__stream) throw () ; extern int ferror_unlocked (FILE *__stream) throw () ; extern void perror (const char *__s); # 1 "/usr/include/bits/sys_errlist.h" 1 3 4 # 26 "/usr/include/bits/sys_errlist.h" 3 4 extern int sys_nerr; extern const char *const sys_errlist[]; extern int _sys_nerr; extern const char *const _sys_errlist[]; # 854 "/usr/include/stdio.h" 2 3 4 extern int fileno (FILE *__stream) throw () ; extern int fileno_unlocked (FILE *__stream) throw () ; # 873 "/usr/include/stdio.h" 3 4 extern FILE *popen (const char *__command, const char *__modes) ; extern int pclose (FILE *__stream); extern char *ctermid (char *__s) throw (); extern char *cuserid (char *__s); struct obstack; extern int obstack_printf (struct obstack *__restrict __obstack, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))); extern int obstack_vprintf (struct obstack *__restrict __obstack, const char *__restrict __format, __gnuc_va_list __args) throw () __attribute__ ((__format__ (__printf__, 2, 0))); extern void flockfile (FILE *__stream) throw (); extern int ftrylockfile (FILE *__stream) throw () ; extern void funlockfile (FILE *__stream) throw (); # 943 "/usr/include/stdio.h" 3 4 } # 22 "/private/peterp/work/test/scorep/prep/test1.c" 2 int main() { printf("before...\n"); # 33 "/private/peterp/work/test/scorep/prep/test1.c" #pragma omp parallel # 33 "/private/peterp/work/test/scorep/prep/test1.c" {{ printf("parallel 1...\n"); }} # 39 "/private/peterp/work/test/scorep/prep/test1.c" #pragma omp parallel { printf("parallel 2...\n"); } # 76 "/private/peterp/work/test/scorep/prep/test1.c" { } # 88 "/private/peterp/work/test/scorep/prep/test1.c" { printf("#pragma omp parallel"); printf("\" and continuation in the next line #pragma omp parallel\" and especially strange escape character usage\n"); } printf("after...\n"); printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.10/test/data/PaxHeaders/test1.f90.out0000644000000000000000000000013215232670204016123 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.f90.out0000664000175100001440000001064715232670204016465 0ustar00builderusers #line 1 "test1.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 implicit none include 'test1.f90.opari.inc' #line 23 "test1.f90" integer a, b !************************************************ !* The following pragmas should be instrumented * !************************************************ pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 28 "test1.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 29 "test1.f90" call POMP2_Barrier_enter(opari2_region_2,& pomp2_old_task, opari2_ctc_2 ) #line 29 "test1.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_2, pomp2_old_task) #line 30 "test1.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 30 "test1.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 31 "test1.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 32 "test1.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) #line 34 "test1.f90" call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Parallel_end(opari2_region_3) #line 34 "test1.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 36 "test1.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 37 "test1.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 39 "test1.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 39 "test1.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 41 "test1.f90" !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" !************************************** !* Test for handling lines with * !* multiple statements separated by ; * !************************************** a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; end program test1 subroutine POMP2_Init_reg_000() include 'test1.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) end opari2-2.0.10/test/data/PaxHeaders/test1.f90.opari.inc.out0000644000000000000000000000013215232670204020004 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.f90.opari.inc.out0000664000175100001440000000216615232670204020343 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test1.f90:28:28*escl=test1.f90:30:30**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "63*regionType=barrier*sscl=test1.f90:29:29*escl=test1.f90:29:29**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "64*regionType=parallel*sscl=test1.f90:32:33*escl=test1.f90:34:35**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "64*regionType=parallel*sscl=test1.f90:37:38*escl=test1.f90:39:40**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1.f900000644000000000000000000000013215232670204015315 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.f900000664000175100001440000000325115232670204015650 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 implicit none integer a, b !************************************************ !* The following pragmas should be instrumented * !************************************************ !$OMP PARALLEL !$OmP BaRRiEr !$omp end parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & !$OmP& parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & ! some comment !$OmP& parallel !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" !************************************** !* Test for handling lines with * !* multiple statements separated by ; * !************************************** a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; end program test1 opari2-2.0.10/test/data/PaxHeaders/test1.f.out0000644000000000000000000000013215232670204015752 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.f.out0000664000175100001440000001226415232670204016311 0ustar00builderusers #line 1 "test1.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 include 'test1.f.opari.inc' #line 20 "test1.f" integer a !************************************************ !* The following pragmas should be instrumented * !************************************************ pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 24 "test1.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 25 "test1.f" call POMP2_Barrier_enter(opari2_region_2, &pomp2_old_task, &opari2_ctc_2 ) #line 25 "test1.f" *$omp barrier call POMP2_Barrier_exit(opari2_region_2, &pomp2_old_task) #line 26 "test1.f" call POMP2_Barrier_enter(opari2_region_3, &pomp2_old_task, &opari2_ctc_3 ) #line 26 "test1.f" !$omp barrier call POMP2_Barrier_exit(opari2_region_3, &pomp2_old_task) #line 27 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 27 "test1.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 28 "test1.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 29 "test1.f" !$omp parallel !$omp& default(shared) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 31 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_4, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 31 "test1.f" !$omp end !$omp+ parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 33 "test1.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_5 ) #line 34 "test1.f" !$omp parallel !$omp& default(shared) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) #line 36 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_5) #line 36 "test1.f" !$omp end !$omp+ !$omp+ parallel call POMP2_Parallel_join(opari2_region_5, &pomp2_old_task) #line 39 "test1.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_6, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_6 ) #line 40 "test1.f" !$omp parallel !$omp&private(a) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) #line 42 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_6) #line 45 "test1.f" !$omp end !$omp¶llel call POMP2_Parallel_join(opari2_region_6, &pomp2_old_task) #line 47 "test1.f" !************************************** !* The following should be ignored * !************************************** c $omp no !!$omp mo c comment ! $omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 subroutine POMP2_Init_reg_000() include 'test1.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) end opari2-2.0.10/test/data/PaxHeaders/test1.f.opari.inc.out0000644000000000000000000000013215232670204017633 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.f.opari.inc.out0000664000175100001440000000310215232670204020161 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test1.f:24:24*escl=test1.f:27:2"// &"7**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"61*regionType=barrier*sscl=test1.f:25:25*escl=test1.f:25:25"// &"**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"61*regionType=barrier*sscl=test1.f:26:26*escl=test1.f:26:26"// &"**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"62*regionType=parallel*sscl=test1.f:29:30*escl=test1.f:31:3"// &"2**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"62*regionType=parallel*sscl=test1.f:34:35*escl=test1.f:36:3"// &"8**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"62*regionType=parallel*sscl=test1.f:40:41*escl=test1.f:45:4"// &"6**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.10/test/data/PaxHeaders/test1.f0000644000000000000000000000013215232670204015144 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.f0000664000175100001440000000275515232670204015507 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 integer a !************************************************ !* The following pragmas should be instrumented * !************************************************ c$OMP PARALLEL *$oMp BaRrIeR !$OmP Barrier !$omp end parallel !$OmP parallel !$OmP& default(shared) !$OmP end !$OmP+ parallel !$OmP parallel !$OmP& default(shared) !$OmP end !$OmP+ !$OmP+ parallel !$omp parallel !comment will be deleted !more comment, which will be deleted !$omp&private(a) !and some more comment... !$omp end !$omp¶llel !************************************** !* The following should be ignored * !************************************** c $omp no !!$omp mo c comment ! $omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 opari2-2.0.10/test/data/PaxHeaders/test1.cpp.out0000644000000000000000000000013215232670204016307 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.cpp.out0000664000175100001440000000666115232670204016652 0ustar00builderusers#include "test1.cpp.opari.inc" #line 1 "test1.cpp" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2021, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to handle C++14/17 numeric literals. */ int main(int argc, char** argv) { // binary integers auto bin = 0b0101010; auto binWithSep = 0b0'10'10'10; auto binWithSuffix = 0b0101010L; auto binWithSuffixAndSep = 0b0'10'10'10l; // octal integers auto oct = 07232; auto octWithSep = 07'232; auto octWithSuffix = 07232L; auto octWithSuffixAndSep = 07'232l; // decimal integers auto dec = 424242; auto decWithSep = 42'4242; auto decWithSuffix = 424242L; auto decWithSuffixAndSep = 42'4242l; // hexadecimal integers auto hex = 0x0420DEAD; auto hexWithSep = 0x04'20'DE'AD; auto hexWithSuffix = 0x0420DEADL; auto hexWithSuffixAndSep = 0x04'20'DE'ADl; // decimal floating-points auto dfp = 424242.0123; auto dfpWithSep = 42'42'42.01'23; auto dfpWithSuffix = 424242.0123F; auto dfpWithSuffixAndSep = 42'42'42.01'23f; auto dfpExp = 424242.0123e-17; auto dfpExpWithSep = 42'4242.01'23e+1'7; auto dfpExpWithSuffix = 424242.0123e17F; auto dfpExpWithSuffixAndSep = 42'4242.01'23e-1'7f; auto dfpInt = 424242.; auto dfpIntWithSep = 42'4242.; auto dfpIntWithSuffix = 424242.F; auto dfpIntWithSuffixAndSep = 42'4242.f; auto dfpIntExp = 424242.e-12; auto dfpIntExpWithSep = 42'42'42.e+1'2; auto dfpIntExpWithSuffix = 424242e+12F; auto dfpIntExpWithSuffixAndSep = 42'42'42e-1'2f; auto dfpFrac = .424242; auto dfpFracWithSep = .42'4242; auto dfpFracWithSuffix = .424242F; auto dfpFracWithSuffixAndSep = .42'4242f; auto dfpFracExp = .424242e+15; auto dfpFracExpWithSep = .42'42'42e-1'5; auto dfpFracExpWithSuffix = .424242e-15F; auto dfpFracExpWithSuffixAndSep = .42'42'42e+1'5f; // hexadecimal floating-points auto hfp = 0xdead.BEEFp10; auto hfpWithSep = 0xDE'AD.be'efp1'0; auto hfpWithSuffix = 0XDEad.BeeFp+10F; auto hfpWithSuffixAndSep = 0XdE'Ad.Be'Efp+1'0f; auto hfpInt = 0XDEAD.p-10; auto hfpIntWithSep = 0Xd'e'ad.p1'0; auto hfpIntWithSuffix = 0xdead.p10F; auto hfpIntWithSuffixAndSep = 0xd'e'Ad.p-1'0f; auto hfpFrac = 0x.beefp+10; auto hfpFracWithSep = 0x.b'e'efp1'0; auto hfpFracWithSuffix = 0X.BEEFP-10F; auto hfpFracWithSuffixAndSep = 0X.BE'E'FP1'0f; auto expr = 0x.beefp+10 + 0xdead.p10F + .42'42'42e+1'5f + .424242 + 424242.e-12 + 42'4242. + 42'4242.01'23e+1'7 + 424242.0123F + 0x04'20'DE'AD + 4 + 07'232 + 0b0'10'10'10l; return 0; } opari2-2.0.10/test/data/PaxHeaders/test1.cpp.opari.inc.out0000644000000000000000000000013215232670204020170 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.207415547 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.cpp.opari.inc.out0000664000175100001440000000000015232670204020510 0ustar00builderusersopari2-2.0.10/test/data/PaxHeaders/test1.cpp0000644000000000000000000000013215232670204015501 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.cpp0000664000175100001440000000657615232670204016051 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2021, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to handle C++14/17 numeric literals. */ int main(int argc, char** argv) { // binary integers auto bin = 0b0101010; auto binWithSep = 0b0'10'10'10; auto binWithSuffix = 0b0101010L; auto binWithSuffixAndSep = 0b0'10'10'10l; // octal integers auto oct = 07232; auto octWithSep = 07'232; auto octWithSuffix = 07232L; auto octWithSuffixAndSep = 07'232l; // decimal integers auto dec = 424242; auto decWithSep = 42'4242; auto decWithSuffix = 424242L; auto decWithSuffixAndSep = 42'4242l; // hexadecimal integers auto hex = 0x0420DEAD; auto hexWithSep = 0x04'20'DE'AD; auto hexWithSuffix = 0x0420DEADL; auto hexWithSuffixAndSep = 0x04'20'DE'ADl; // decimal floating-points auto dfp = 424242.0123; auto dfpWithSep = 42'42'42.01'23; auto dfpWithSuffix = 424242.0123F; auto dfpWithSuffixAndSep = 42'42'42.01'23f; auto dfpExp = 424242.0123e-17; auto dfpExpWithSep = 42'4242.01'23e+1'7; auto dfpExpWithSuffix = 424242.0123e17F; auto dfpExpWithSuffixAndSep = 42'4242.01'23e-1'7f; auto dfpInt = 424242.; auto dfpIntWithSep = 42'4242.; auto dfpIntWithSuffix = 424242.F; auto dfpIntWithSuffixAndSep = 42'4242.f; auto dfpIntExp = 424242.e-12; auto dfpIntExpWithSep = 42'42'42.e+1'2; auto dfpIntExpWithSuffix = 424242e+12F; auto dfpIntExpWithSuffixAndSep = 42'42'42e-1'2f; auto dfpFrac = .424242; auto dfpFracWithSep = .42'4242; auto dfpFracWithSuffix = .424242F; auto dfpFracWithSuffixAndSep = .42'4242f; auto dfpFracExp = .424242e+15; auto dfpFracExpWithSep = .42'42'42e-1'5; auto dfpFracExpWithSuffix = .424242e-15F; auto dfpFracExpWithSuffixAndSep = .42'42'42e+1'5f; // hexadecimal floating-points auto hfp = 0xdead.BEEFp10; auto hfpWithSep = 0xDE'AD.be'efp1'0; auto hfpWithSuffix = 0XDEad.BeeFp+10F; auto hfpWithSuffixAndSep = 0XdE'Ad.Be'Efp+1'0f; auto hfpInt = 0XDEAD.p-10; auto hfpIntWithSep = 0Xd'e'ad.p1'0; auto hfpIntWithSuffix = 0xdead.p10F; auto hfpIntWithSuffixAndSep = 0xd'e'Ad.p-1'0f; auto hfpFrac = 0x.beefp+10; auto hfpFracWithSep = 0x.b'e'efp1'0; auto hfpFracWithSuffix = 0X.BEEFP-10F; auto hfpFracWithSuffixAndSep = 0X.BE'E'FP1'0f; auto expr = 0x.beefp+10 + 0xdead.p10F + .42'42'42e+1'5f + .424242 + 424242.e-12 + 42'4242. + 42'4242.01'23e+1'7 + 424242.0123F + 0x04'20'DE'AD + 4 + 07'232 + 0b0'10'10'10l; return 0; } opari2-2.0.10/test/data/PaxHeaders/test1.c.out0000644000000000000000000000013215232670204015747 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.c.out0000664000175100001440000001033615232670204016304 0ustar00builderusers#include "test1.c.opari.inc" #line 1 "test1.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test1.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test1.c" {{ printf("parallel 1...\n"); }} { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 37 "test1.c" #line 36 "test1.c" //end { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 38 "test1.c" # pragma \ omp \ parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); #line 41 "test1.c" { printf("parallel 2...\n"); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 44 "test1.c" //************************************************* //* The treatment of else blocks doesn't work yet * //************************************************* /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* { */ /* printf("parallel 3 thread 0 ...\n"); */ /* } */ /* else */ /* { */ /* printf("parallel 3 other threads ...\n"); */ /* } */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* printf("parallel 4 thread 0 ...\n"); */ /* else */ /* printf("parallel 4 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 5 thread 0 ...\n"); */ /* else printf("parallel 5 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 6 thread 0 ...\n"); else printf("parallel 6 other threads ...\n"); */ //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.10/test/data/PaxHeaders/test1.c.opari.inc.out0000644000000000000000000000013215232670204017630 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.c.opari.inc.out0000664000175100001440000000113115232670204020156 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test1.c:33:33*escl=test1.c:36:36**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "61*regionType=parallel*sscl=test1.c:38:40*escl=test1.c:43:43**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.10/test/data/PaxHeaders/test1.c0000644000000000000000000000013215232670204015141 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/test1.c0000664000175100001440000000553115232670204015477 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #include //just testing #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ #pragma omp parallel {{ printf("parallel 1...\n"); }} //end # /*complicated*/ pragma \ omp \ /*more*/ parallel { printf("parallel 2...\n"); } //************************************************* //* The treatment of else blocks doesn't work yet * //************************************************* /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* { */ /* printf("parallel 3 thread 0 ...\n"); */ /* } */ /* else */ /* { */ /* printf("parallel 3 other threads ...\n"); */ /* } */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* printf("parallel 4 thread 0 ...\n"); */ /* else */ /* printf("parallel 4 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 5 thread 0 ...\n"); */ /* else printf("parallel 5 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 6 thread 0 ...\n"); else printf("parallel 6 other threads ...\n"); */ //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.10/test/data/PaxHeaders/jacobi0000644000000000000000000000013215232670204015107 xustar0030 mtime=1785426052.207415547 30 atime=1785426082.655235368 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/0000775000175100001440000000000015232670204015516 5ustar00builderusersopari2-2.0.10/test/data/jacobi/PaxHeaders/F770000644000000000000000000000013215232670204015452 xustar0030 mtime=1785426052.207415547 30 atime=1785426082.655235368 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F77/0000775000175100001440000000000015232670204016061 5ustar00builderusersopari2-2.0.10/test/data/jacobi/F77/PaxHeaders/main.f0000644000000000000000000000013215232670204016622 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F77/main.f0000664000175100001440000000776415232670204017172 0ustar00builderusers program main ************************************************************ * program to solve a finite difference * discretization of Helmholtz equation : * (d2/dx2)u + (d2/dy2)u - alpha u = f * using Jacobi iterative method. * * Modified: Sanjiv Shah, Kuck and Associates, Inc. (KAI), 1998 * Author: Joseph Robicheaux, Kuck and Associates, Inc. (KAI), 1998 * * Directives are used in this code to achieve paralleism. * All do loops are parallized with default 'static' scheduling. * * Input : n - grid dimension in x direction * m - grid dimension in y direction * alpha - Helmholtz constant (always greater than 0.0) * tol - error tolerance for iterative solver * relax - Successice over relaxation parameter * mits - Maximum iterations for iterative solver * * On output * : u(n,m) - Dependent variable (solutions) * : f(n,m) - Right hand side function ************************************************************* implicit none integer n,m,mits double precision tol,relax,alpha common /idat/ n,m,mits common /fdat/tol,alpha,relax * * Fix input for test cases * n=200 m=200 alpha=0.8 relax=1 tol=1e-10 mits=5 * * Calls a driver routine * call driver stop end subroutine driver ( ) ************************************************************* * Subroutine driver () * This is where the arrays are allocated and initialzed. * * Working varaibles/arrays * dx - grid spacing in x direction * dy - grid spacing in y direction ************************************************************* implicit none double precision omp_get_wtime integer n,m,mits double precision tol,relax,alpha double precision r0 double precision c0 common /idat/ n,m,mits common /fdat/tol,alpha,relax double precision u(n,m),f(n,m),dx,dy * Initialize data call initialize (n,m,alpha,dx,dy,u,f) * Solve Helmholtz equation r0 = omp_get_wtime() call jacobi (n,m,dx,dy,alpha,relax,u,f,tol,mits) r0 = omp_get_wtime() - r0 write (*,'(a,f12.6)') ' elapsed time usage ', r0 write (*,'(a,f12.6)') ' MFlop/s ', & 1d-6*mits*(m-2d0)*(n-2d0)*13d0 / r0 * Check error between exact solution call error_check (n,m,alpha,dx,dy,u,f) return end subroutine initialize (n,m,alpha,dx,dy,u,f) ****************************************************** * Initializes data * Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) * ****************************************************** implicit none integer n,m double precision u(n,m),f(n,m),dx,dy,alpha integer i,j, xx,yy double precision PI parameter (PI=3.1415926) dx = 2.0 / (n-1) dy = 2.0 / (m-1) * Initilize initial condition and RHS C$omp parallel do private(i,j) do j = 1,m do i = 1,n xx = -1.0 + dx * dble(i-1) ! -1 < x < 1 yy = -1.0 + dy * dble(j-1) ! -1 < y < 1 u(i,j) = 0.0 f(i,j) = -alpha *(1.0-xx*xx)*(1.0-yy*yy) & - 2.0*(1.0-xx*xx)-2.0*(1.0-yy*yy) enddo enddo C$omp end parallel do * return end subroutine error_check (n,m,alpha,dx,dy,u,f) implicit none ************************************************************ * Checks error between numerical and exact solution * ************************************************************ integer n,m double precision u(n,m),f(n,m),dx,dy,alpha integer i,j double precision xx,yy,temp,error dx = 2.0 / (n-1) dy = 2.0 / (m-1) error = 0.0 do j = 1,m do i = 1,n xx = -1.0d0 + dx * dble(i-1) yy = -1.0d0 + dy * dble(j-1) temp = u(i,j) - (1.0-xx*xx)*(1.0-yy*yy) error = error + temp*temp enddo enddo error = sqrt(error)/dble(n*m) print *, 'Solution Error : ',error return end opari2-2.0.10/test/data/jacobi/F77/PaxHeaders/jacobi_test_3.out0000644000000000000000000000013215232670204020770 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F77/jacobi_test_3.out0000664000175100001440000000330615232670204021324 0ustar00builderusers 3: begin parallel 3: enter for 3: enter implicit barrier of paralleldo 3: exit implicit barrier of paralleldo 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.10/test/data/jacobi/F77/PaxHeaders/jacobi_test_2.out0000644000000000000000000000013215232670204020767 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F77/jacobi_test_2.out0000664000175100001440000000330615232670204021323 0ustar00builderusers 2: begin parallel 2: enter for 2: enter implicit barrier of paralleldo 2: exit implicit barrier of paralleldo 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.10/test/data/jacobi/F77/PaxHeaders/jacobi_test_1.out0000644000000000000000000000013215232670204020766 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F77/jacobi_test_1.out0000664000175100001440000000330615232670204021322 0ustar00builderusers 1: begin parallel 1: enter for 1: enter implicit barrier of paralleldo 1: exit implicit barrier of paralleldo 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.10/test/data/jacobi/F77/PaxHeaders/jacobi_test_0.out0000644000000000000000000000013215232670204020765 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F77/jacobi_test_0.out0000664000175100001440000000371615232670204021326 0ustar00builderusers 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of paralleldo 0: exit implicit barrier of paralleldo 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.10/test/data/jacobi/F77/PaxHeaders/jacobi.f0000644000000000000000000000013215232670204017125 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F77/jacobi.f0000664000175100001440000000447215232670204017466 0ustar00builderusers subroutine jacobi (n,m,dx,dy,alpha,omega,u,f,tol,maxit) ****************************************************************** * Subroutine HelmholtzJ * Solves poisson equation on rectangular grid assuming : * (1) Uniform discretization in each direction, and * (2) Dirichlect boundary conditions * * Jacobi method is used in this routine * * Input : n,m Number of grid points in the X/Y directions * dx,dy Grid spacing in the X/Y directions * alpha Helmholtz eqn. coefficient * omega Relaxation factor * f(n,m) Right hand side function * u(n,m) Dependent variable/Solution * tol Tolerance for iterative solver * maxit Maximum number of iterations * * Output : u(n,m) - Solution ***************************************************************** implicit none integer n,m,maxit double precision dx,dy,f(n,m),u(n,m),alpha, tol,omega * * Local variables * integer i,j,k,k_local double precision error,resid,rsum,ax,ay,b double precision error_local, uold(n,m) real ta,tb,tc,td,te,ta1,ta2,tb1,tb2,tc1,tc2,td1,td2 real te1,te2 * * Initialize coefficients ax = 1.0/(dx*dx) ! X-direction coef ay = 1.0/(dy*dy) ! Y-direction coef b = -2.0/(dx*dx)-2.0/(dy*dy) - alpha ! Central coeff error = 10.0 * tol k = 1 do while (k.le.maxit .and. error.gt. tol) error = 0.0 * Copy new solution into old C$omp parallel private(j,i) C$omp do do j=1,m do i=1,n uold(i,j) = u(i,j) enddo enddo C$omp end do * Compute stencil, residual, & update C$omp do reduction(+:error) do j = 2,m-1 do i = 2,n-1 * Evaluate residual resid = (ax*(uold(i-1,j) + uold(i+1,j)) & + ay*(uold(i,j-1) + uold(i,j+1)) & + b * uold(i,j) - f(i,j))/b * Update solution u(i,j) = uold(i,j) - omega * resid * Accumulate residual error error = error + resid*resid end do enddo C$omp end do C$omp end parallel * Error check k = k + 1 error = sqrt(error)/dble(n*m) * enddo ! End iteration loop * print *, 'Total Number of Iterations ', k print *, 'Residual ', error return end opari2-2.0.10/test/data/jacobi/PaxHeaders/F0000644000000000000000000000013215232670204015274 xustar0030 mtime=1785426052.207415547 30 atime=1785426082.655235368 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F/0000775000175100001440000000000015232670204015703 5ustar00builderusersopari2-2.0.10/test/data/jacobi/F/PaxHeaders/main.F900000644000000000000000000000013215232670204016555 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F/main.F900000664000175100001440000001707615232670204017122 0ustar00builderusersprogram MAIN !*********************************************************************** ! program to solve a finite difference * ! discretization of Helmholtz equation : * ! (d2/dx2)u + (d2/dy2)u - alpha u = f * ! using Jacobi iterative method. * ! * ! Modified: Abdelali Malih, Aachen University (RWTH), 2007 * ! Modified: Sanjiv Shah, Kuck and Associates, Inc. (KAI), 1998 * ! Author : Joseph Robicheaux, Kuck and Associates, Inc. (KAI), 1998 * ! * ! Directives are used in this code to achieve paralleism. * ! All do loops are parallized with default 'static' scheduling. * ! * ! Input : n - grid dimension in x direction * ! m - grid dimension in y direction * ! alpha - Helmholtz constant (always greater than 0.0) * ! tol - error tolerance for iterative solver * ! relax - Successice over relaxation parameter * ! mits - Maximum iterations for iterative solver * ! * ! On output * ! : u(n,m) - Dependent variable (solutions) * ! : f(n,m) - Right hand side function * !*********************************************************************** use VariableDef use JacobiMod #ifdef _OPENMP use omp_lib #endif implicit none double precision get_wtime TYPE(JacobiData) :: myData ! sets default values or reads from stdin ! * inits MPI and OpenMP if needed ! * distribute MPI data, calculate MPI bounds ! */ call Init(mydata) if ( allocated(myData%afU) .and. allocated(myData%afF) ) then ! /* matrix init */ call InitializeMatrix(myData) ! /* starting timer */ mydata%fTimeStart = get_wtime() ! /* running calculations */ call Jacobi(myData) ! /* stopping timer */ mydata%fTimeStop = get_wtime() ! /* error checking */ call CheckError(myData) ! /* print result summary */ call PrintResults(myData) else write (*,*) " Memory allocation failed ...\n" end if ! /* cleanup */ call Finish(myData) end program MAIN subroutine Init (myData) use VariableDef use omp_lib implicit none type(JacobiData), intent(inout) :: myData character(len=8) :: env = ' ' integer :: ITERATIONS = 5 integer :: iErr, i call get_environment_variable("ITERATIONS", env) if (len_trim(env) > 0) then read(env,*,iostat=iErr) i if ((iErr == 0) .and. (i > 0)) then ITERATIONS=i else print*, "Ignoring ITERATIONS=", env endif endif #ifdef _OPENMP write (6,*) 'Jacobi', omp_get_max_threads(), 'OpenMP-', _OPENMP, ' thread(s)' #else write (6,*) 'Jacobi (serial)' #endif !/* default medium */ myData%iCols = 2000 myData%iRows = 2000 myData%fAlpha = 0.8 myData%fRelax = 1.0 myData%fTolerance = 1e-10 myData%iIterMax = ITERATIONS write (*,327) "-> matrix size: ", myData%iCols, myData%iRows write (*,329) "-> alpha: " , myData%fAlpha write (*,329) "-> relax: ", myData%fRelax write (*,329) "-> tolerance: ", myData%fTolerance write (*,328) "-> iterations: ", myData%iIterMax flush(6) 327 format (A22, I10, ' x ', I10) 328 format (A22, I10) 329 format (A22, F10.6) ! /* MPI values, set to defaults to avoid data inconsistency */ myData%iMyRank = 0 myData%iNumProcs = 1 myData%iRowFirst = 0 myData%iRowLast = myData%iRows - 1 ! /* memory allocation for serial & omp */ allocate(myData%afU (0 : myData%iCols -1, 0 : myData%iRows -1)) allocate(myData%afF (0 : myData%iCols -1, 0 : myData%iRows -1)) ! /* calculate dx and dy */ myData%fDx = 2.0d0 / DBLE(myData%iCols - 1) myData%fDy = 2.0d0 / DBLE(myData%iRows - 1) myData%iIterCount = 0 end subroutine Init subroutine InitializeMatrix (myData) !********************************************************************* ! Initializes data * ! Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) * ! * !********************************************************************* use VariableDef implicit none type(JacobiData), intent(inout) :: myData !.. Local Scalars .. integer :: i, j, xx, yy !.. Intrinsic Functions .. intrinsic DBLE ! Initilize initial condition and RHS !$omp parallel do private (j, i, xx, yy) do j = myData%iRowFirst, myData%iRowLast do i = 0, myData%iCols -1 xx = INT(-1.0 + myData%fDx*DBLE(i)) ! -1 < x < 1 yy = INT(-1.0 + myData%fDy*DBLE(j)) ! -1 < y < 1 myData%afU(i, j) = 0.0d0 myData%afF(i, j) = - myData%fAlpha * (1.0d0 - DBLE(xx*xx)) & * (1.0d0 - DBLE(yy*yy)) - 2.0d0 * (1.0d0 - DBLE(xx*xx)) & - 2.0d0 * (1.0d0 - DBLE(yy*yy)) end do end do !$omp end parallel do end subroutine InitializeMatrix subroutine Finish(myData) use VariableDef implicit none integer :: iErr type(JacobiData), intent(inout) :: myData deallocate (myData%afU) deallocate (myData%afF) end subroutine Finish subroutine PrintResults(myData) use VariableDef implicit none type(JacobiData), intent(inout) :: myData if (myData%iMyRank == 0) then write (*,328) " Number of iterations : ", myData%iIterCount write (*,329) " Residual : ", myData%fResidual write (*,329) " Solution Error : ", myData%fError write (*,330) " Elapsed Time : ", & myData%fTimeStop - myData%fTimeStart write (*,330) " MFlops/s : ", & 0.000013 * DBLE (myData%iIterCount) & * DBLE((myData%iCols - 2) * (myData%iRows - 2)) & / (myData%fTimeStop - myData%fTimeStart) flush(6) 328 format (A, I8) 329 format (A, F15.12) 330 format (A, F15.6) end if end subroutine PrintResults subroutine CheckError(myData) use VariableDef implicit none type(JacobiData), intent(inout) :: myData !.. Local Scalars .. integer :: i, j, iErr double precision :: error, temp, xx, yy !.. Intrinsic Functions .. intrinsic DBLE, SQRT ! ... Executable Statements ... error = 0.0d0 do j = myData%iRowFirst, myData%iRowLast do i = 0, myData%iCols -1 xx = -1.0d0 + myData%fDx * DBLE(i) yy = -1.0d0 + myData%fDy * DBLE(j) temp = myData%afU(i, j) - (1.0d0-xx*xx)*(1.0d0-yy*yy) error = error + temp*temp end do end do myData%fError = sqrt(error) / DBLE(myData%iCols * myData%iRows) end subroutine CheckError double precision function get_wtime() #ifdef _OPENMP use omp_lib get_wtime = omp_get_wtime() #else real, dimension(2) :: tarray get_wtime = dtime(tarray) #endif return end function get_wtime opari2-2.0.10/test/data/jacobi/F/PaxHeaders/jacobi_test_3.out0000644000000000000000000000013215232670204020612 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F/jacobi_test_3.out0000664000175100001440000000330615232670204021146 0ustar00builderusers 3: begin parallel 3: enter for 3: enter implicit barrier of paralleldo 3: exit implicit barrier of paralleldo 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.10/test/data/jacobi/F/PaxHeaders/jacobi_test_2.out0000644000000000000000000000013215232670204020611 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F/jacobi_test_2.out0000664000175100001440000000330615232670204021145 0ustar00builderusers 2: begin parallel 2: enter for 2: enter implicit barrier of paralleldo 2: exit implicit barrier of paralleldo 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.10/test/data/jacobi/F/PaxHeaders/jacobi_test_1.out0000644000000000000000000000013215232670204020610 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F/jacobi_test_1.out0000664000175100001440000000330615232670204021144 0ustar00builderusers 1: begin parallel 1: enter for 1: enter implicit barrier of paralleldo 1: exit implicit barrier of paralleldo 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.10/test/data/jacobi/F/PaxHeaders/jacobi_test_0.out0000644000000000000000000000013215232670204020607 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F/jacobi_test_0.out0000664000175100001440000000371615232670204021150 0ustar00builderusers 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of paralleldo 0: exit implicit barrier of paralleldo 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.10/test/data/jacobi/F/PaxHeaders/jacobi.F900000644000000000000000000000013215232670204017060 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F/jacobi.F900000664000175100001440000001004715232670204017414 0ustar00builderusersmodule JacobiMod use VariableDef implicit none contains subroutine Jacobi(myData) implicit none !******************************************************************** ! Subroutine HelmholtzJ * ! Solves poisson equation on rectangular grid assuming : * ! (1) Uniform discretization in each direction, and * ! (2) Dirichlect boundary conditions * ! Jacobi method is used in this routine * ! * ! Input : n,m Number of grid points in the X/Y directions * ! dx,dy Grid spacing in the X/Y directions * ! alpha Helmholtz eqn. coefficient * ! omega Relaxation factor * ! myData%afF(n,m) Right hand side function * ! myData%afU(n,m) Dependent variable/Solution * ! tol Tolerance for iterative solver * ! maxit Maximum number of iterations * ! * ! Output : myData%afU(n,m) - Solution * !******************************************************************** !.. Formal Arguments .. type(JacobiData), intent(inout) :: myData !.. Local Scalars .. integer :: i, j, iErr double precision :: ax, ay, b, residual, fLRes, tmpResd !.. Local Arrays .. double precision, allocatable :: uold(:,:) !.. Intrinsic Functions .. intrinsic DBLE, SQRT allocate(uold (0 : myData%iCols -1, 0 : myData%iRows -1)) ! ... Executable Statements ... ! Initialize coefficients if (allocated(uold)) then ax = 1.0d0 / (myData%fDx * myData%fDx) ! X-direction coef ay = 1.0d0 / (myData%fDx * myData%fDx) ! Y-direction coef b = -2.0d0 * (ax + ay) - myData%fAlpha ! Central coeff residual = 10.0d0 * myData%fTolerance do while (myData%iIterCount < myData%iIterMax .and. residual > myData%fTolerance) residual = 0.0d0 ! Copy new solution into old, including the boundary. !$omp parallel private(fLRes, tmpResd, i) !$omp do do j = myData%iRowFirst, myData%iRowLast do i = 0, myData%iCols - 1 uold(i, j) = myData%afU(i, j) end do end do !$omp end do !$omp do reduction(+:residual) ! Compute stencil, residual, & update. ! Update excludes the boundary. do j = myData%iRowFirst + 1, myData%iRowLast - 1 do i = 1, myData%iCols - 2 ! Evaluate residual fLRes = (ax * (uold(i-1, j) + uold(i+1, j)) & + ay * (uold(i, j-1) + uold(i, j+1)) & + b * uold(i, j) - myData%afF(i, j)) / b ! Update solution myData%afU(i, j) = uold(i, j) - myData%fRelax * fLRes ! Accumulate residual error residual = residual + fLRes * fLRes end do end do !$omp end do !$omp end parallel ! Error check myData%iIterCount = myData%iIterCount + 1 residual = SQRT(residual) / DBLE(myData%iCols * myData%iRows) ! End iteration loop end do myData%fResidual = residual deallocate(uold) else write (*,*) 'Error: cant allocate memory' call Finish(myData) stop end if end subroutine Jacobi end module JacobiMod opari2-2.0.10/test/data/jacobi/F/PaxHeaders/VariableDef.f900000644000000000000000000000013215232670204020035 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/F/VariableDef.f900000664000175100001440000000215015232670204020365 0ustar00builderusersmodule VariableDef implicit none TYPE JacobiData integer :: iRows integer :: iCols integer :: iRowFirst integer :: iRowLast integer :: iIterMax double precision :: fAlpha double precision :: fRelax double precision :: fTolerance ! /* calculated dx & dy */ double precision :: fDx double precision :: fDy ! /* pointers to the allocated memory */ double precision, allocatable :: afU(:,:) double precision, allocatable :: afF(:,:) ! /* start and end timestamps */ double precision :: fTimeStart double precision :: fTimeStop ! /* calculated residual (output jacobi) */ double precision :: fResidual ! /* effective interation count (output jacobi) */ integer :: iIterCount ! /* calculated error (output error_check) */ double precision :: fError ! /* MPI-Variables */ integer :: iMyRank !/* current process rank (number) */ integer :: iNumProcs !/* how many processes */ END TYPE JacobiData end module VariableDef opari2-2.0.10/test/data/jacobi/PaxHeaders/C0000644000000000000000000000013215232670204015271 xustar0030 mtime=1785426052.207415547 30 atime=1785426082.655235368 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C/0000775000175100001440000000000015232670204015700 5ustar00builderusersopari2-2.0.10/test/data/jacobi/C/PaxHeaders/main.c0000644000000000000000000000013215232670204016436 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C/main.c0000664000175100001440000001346315232670204016777 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #include #include #include #include #ifdef _OPENMP #include #else #include #endif #include "jacobi.h" #define U( j, i ) data->afU[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] #define F( j, i ) data->afF[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] /* * setting values, init mpi, omp etc */ void Init( struct JacobiData* data, int* argc, char** argv ) { int i; int block_lengths[ 8 ]; int ITERATIONS = 5; char* env = getenv( "ITERATIONS" ); if ( env ) { int iterations = atoi( env ); if ( iterations > 0 ) { ITERATIONS = iterations; } else { printf( "Ignoring invalid ITERATIONS=%s!\n", env ); } } #ifdef _OPENMP printf( "Jacobi %d OpenMP-%u thread(s)\n", omp_get_max_threads(), _OPENMP ); #else printf( "Jacobi (serial)\n" ); #endif /* default medium */ data->iCols = 2000; data->iRows = 2000; data->fAlpha = 0.8; data->fRelax = 1.0; data->fTolerance = 1e-10; data->iIterMax = ITERATIONS; printf( "\n-> matrix size: %dx%d" "\n-> alpha: %f" "\n-> relax: %f" "\n-> tolerance: %f" "\n-> iterations: %d \n\n", data->iCols, data->iRows, data->fAlpha, data->fRelax, data->fTolerance, data->iIterMax ); /* MPI values, set to defaults to avoid data inconsistency */ data->iMyRank = 0; data->iNumProcs = 1; data->iRowFirst = 0; data->iRowLast = data->iRows - 1; /* memory allocation for serial & omp */ data->afU = ( double* )malloc( data->iRows * data->iCols * sizeof( double ) ); data->afF = ( double* )malloc( data->iRows * data->iCols * sizeof( double ) ); /* calculate dx and dy */ data->fDx = 2.0 / ( data->iCols - 1 ); data->fDy = 2.0 / ( data->iRows - 1 ); data->iIterCount = 0; return; } /* * final cleanup routines */ void Finish( struct JacobiData* data ) { free( data->afU ); free( data->afF ); return; } /* * print result summary */ void PrintResults( const struct JacobiData* data ) { if ( data->iMyRank == 0 ) { printf( " Number of iterations : %d\n", data->iIterCount ); printf( " Residual : %le\n", data->fResidual ); printf( " Solution Error : %1.12lf\n", data->fError ); printf( " Elapsed Time : %5.7lf\n", data->fTimeStop - data->fTimeStart ); printf( " MFlops : %6.6lf\n", 0.000013 * data->iIterCount * ( data->iCols - 2 ) * ( data->iRows - 2 ) / ( data->fTimeStop - data->fTimeStart ) ); } return; } /* * Initializes matrix * Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) */ void InitializeMatrix( struct JacobiData* data ) { int i, j, xx, yy, xx2, yy2; /* Initialize initial condition and RHS */ #pragma omp parallel for private(i, j, xx, yy, xx2, yy2) for ( j = data->iRowFirst; j <= data->iRowLast; j++ ) { for ( i = 0; i < data->iCols; i++ ) { xx = ( int )( -1.0 + data->fDx * i ); yy = ( int )( -1.0 + data->fDy * j ); xx2 = xx * xx; yy2 = yy * yy; U( j, i ) = 0.0; F( j, i ) = -data->fAlpha * ( 1.0 - xx2 ) * ( 1.0 - yy2 ) + 2.0 * ( -2.0 + xx2 + yy2 ); } } } /* * Checks error between numerical and exact solution */ void CheckError( struct JacobiData* data ) { double error = 0.0; int i, j; double xx, yy, temp; for ( j = data->iRowFirst; j <= data->iRowLast; j++ ) { if ( ( data->iMyRank != 0 && j == data->iRowFirst ) || ( data->iMyRank != data->iNumProcs - 1 && j == data->iRowLast ) ) { continue; } for ( i = 0; i < data->iCols; i++ ) { xx = -1.0 + data->fDx * i; yy = -1.0 + data->fDy * j; temp = U( j, i ) - ( 1.0 - xx * xx ) * ( 1.0 - yy * yy ); error += temp * temp; } } data->fError = sqrt( error ) / ( data->iCols * data->iRows ); return; } double get_wtime() { #ifdef _OPENMP return omp_get_wtime(); #else struct timeval tp; gettimeofday( &tp, 0 ); return tp.tv_sec + ( tp.tv_usec * 1.0e-6 ); #endif } int main( int argc, char** argv ) { int retVal = 0; /* return value */ struct JacobiData myData; /* sets default values or reads from stdin * inits MPI and OpenMP if needed * distribute MPI data, calculate MPI bounds */ Init( &myData, &argc, argv ); if ( myData.afU && myData.afF ) { /* matrix init */ InitializeMatrix( &myData ); /* starting timer */ myData.fTimeStart = get_wtime(); /* running calculations */ Jacobi( &myData ); /* stopping timer */ myData.fTimeStop = get_wtime(); /* error checking */ CheckError( &myData ); /* print result summary */ PrintResults( &myData ); } else { printf( " Memory allocation failed ...\n" ); retVal = -1; } /* cleanup */ Finish( &myData ); return retVal; } opari2-2.0.10/test/data/jacobi/C/PaxHeaders/jacobi_test_3.out0000644000000000000000000000013215232670204020607 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C/jacobi_test_3.out0000664000175100001440000000333415232670204021144 0ustar00builderusers 3: begin parallel 3: enter for 3: enter implicit barrier of parallelfor 3: exit implicit barrier of parallelfor 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.10/test/data/jacobi/C/PaxHeaders/jacobi_test_2.out0000644000000000000000000000013215232670204020606 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C/jacobi_test_2.out0000664000175100001440000000333415232670204021143 0ustar00builderusers 2: begin parallel 2: enter for 2: enter implicit barrier of parallelfor 2: exit implicit barrier of parallelfor 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.10/test/data/jacobi/C/PaxHeaders/jacobi_test_1.out0000644000000000000000000000013215232670204020605 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C/jacobi_test_1.out0000664000175100001440000000333415232670204021142 0ustar00builderusers 1: begin parallel 1: enter for 1: enter implicit barrier of parallelfor 1: exit implicit barrier of parallelfor 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.10/test/data/jacobi/C/PaxHeaders/jacobi_test_0.out0000644000000000000000000000013215232670204020604 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C/jacobi_test_0.out0000664000175100001440000000374415232670204021146 0ustar00builderusers 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of parallelfor 0: exit implicit barrier of parallelfor 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.10/test/data/jacobi/C/PaxHeaders/jacobi.h0000644000000000000000000000013215232670204016746 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C/jacobi.h0000664000175100001440000000167015232670204017304 0ustar00builderusers#ifndef _JACOBI_H #define _JACOBI_H struct JacobiData { /* input data */ int iRows; int iCols; int iRowFirst; int iRowLast; int iIterMax; double fAlpha; double fRelax; double fTolerance; /* calculated dx & dy */ double fDx; double fDy; /* pointers to the allocated memory */ double* afU; double* afF; /* start and end timestamps */ double fTimeStart; double fTimeStop; /* calculated residual (output jacobi) */ double fResidual; /* effective interation count (output jacobi) */ int iIterCount; /* calculated error (output error_check) */ double fError; /* MPI-Variables */ int iMyRank; /* current process rank (number) */ int iNumProcs; /* how many processes */ }; /* jacobi calculation routine */ void Jacobi( struct JacobiData* data ); /* final cleanup routines */ void Finish( struct JacobiData* data ); #endif opari2-2.0.10/test/data/jacobi/C/PaxHeaders/jacobi.c0000644000000000000000000000013215232670204016741 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C/jacobi.c0000664000175100001440000000660115232670204017276 0ustar00builderusers/* ****************************************************************** * Subroutine HelmholtzJ * Solves poisson equation on rectangular grid assuming : * (1) Uniform discretization in each direction, and * (2) Dirichlect boundary conditions * * Jacobi method is used in this routine * * Input : n,m Number of grid points in the X/Y directions * dx,dy Grid spacing in the X/Y directions * alpha Helmholtz eqn. coefficient * omega Relaxation factor * f(n,m) Right hand side function * u(n,m) Dependent variable/Solution * tolerance Tolerance for iterative solver * maxit Maximum number of iterations * * Output : u(n,m) - Solution ***************************************************************** */ #include #include #include #include "jacobi.h" #define U( j, i ) afU[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] #define F( j, i ) afF[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] #define UOLD( j, i ) uold[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] void Jacobi( struct JacobiData* data ) { /*use local pointers for performance reasons*/ double* afU, * afF; int i, j; double fLRes; double ax, ay, b, residual, tmpResd; double* uold = ( double* )malloc( data->iCols * data->iRows * sizeof( double ) ); afU = data->afU; afF = data->afF; if ( uold ) { ax = 1.0 / ( data->fDx * data->fDx ); /* X-direction coef */ ay = 1.0 / ( data->fDy * data->fDy ); /* Y_direction coef */ b = -2.0 * ( ax + ay ) - data->fAlpha; /* Central coeff */ residual = 10.0 * data->fTolerance; while ( data->iIterCount < data->iIterMax && residual > data->fTolerance ) { residual = 0.0; /* Copy new solution into old, including the boundary. */ #pragma omp parallel { #pragma omp for private(j, i) for ( j = data->iRowFirst; j <= data->iRowLast; j++ ) { for ( i = 0; i < data->iCols; i++ ) { UOLD( j, i ) = U( j, i ); } } /* Compute stencil, residual and update. * Update excludes the boundary. */ #pragma omp for private(j, i, fLRes) reduction(+:residual) for ( j = data->iRowFirst + 1; j <= data->iRowLast - 1; j++ ) { for ( i = 1; i < data->iCols - 1; i++ ) { fLRes = ( ax * ( UOLD( j, i - 1 ) + UOLD( j, i + 1 ) ) + ay * ( UOLD( j - 1, i ) + UOLD( j + 1, i ) ) + b * UOLD( j, i ) - F( j, i ) ) / b; /* update solution */ U( j, i ) = UOLD( j, i ) - data->fRelax * fLRes; /* accumulate residual error */ residual += fLRes * fLRes; } } } /* end omp parallel */ /* error check */ ( data->iIterCount )++; residual = sqrt( residual ) / ( data->iCols * data->iRows ); } /* while */ data->fResidual = residual; free( uold ); } else { fprintf( stderr, "Error: cant allocate memory\n" ); Finish( data ); exit( 1 ); } } opari2-2.0.10/test/data/jacobi/PaxHeaders/C++0000644000000000000000000000013215232670204015417 xustar0030 mtime=1785426052.207415547 30 atime=1785426082.655235368 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C++/0000775000175100001440000000000015232670204016026 5ustar00builderusersopari2-2.0.10/test/data/jacobi/C++/PaxHeaders/main.cpp0000644000000000000000000000013215232670204017124 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C++/main.cpp0000664000175100001440000001266715232670204017472 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #include #include #include #include #include #ifdef _OPENMP #include #else #include #endif #include "jacobi.h" #define U( j, i ) data.afU[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] #define F( j, i ) data.afF[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] using namespace std; // setting values, init mpi, omp etc void Init( JacobiData &data, int & argc, char** argv ) { int ITERATIONS = 5; char* env = getenv( "ITERATIONS" ); if ( env ) { int iterations = atoi( env ); if ( iterations > 0 ) { ITERATIONS = iterations; } else { printf( "Ignoring invalid ITERATIONS=%s!\n", env ); } } #ifdef _OPENMP printf( "Jacobi %d OpenMP-%u thread(s)\n", omp_get_max_threads(), _OPENMP ); #else printf( "Jacobi (serial)\n" ); #endif // default medium data.iCols = 2000; data.iRows = 2000; data.fAlpha = 0.8; data.fRelax = 1.0; data.fTolerance = 1e-10; data.iIterMax = ITERATIONS; cout << "\n-> matrix size: " << data.iCols << "x" << data.iRows << "\n-> alpha: " << data.fAlpha << "\n-> relax: " << data.fRelax << "\n-> tolerance: " << data.fTolerance << "\n-> iterations: " << data.iIterMax << endl << endl; // MPI values, set to defaults to avoid data inconsistency data.iMyRank = 0; data.iNumProcs = 1; data.iRowFirst = 0; data.iRowLast = data.iRows - 1; // memory allocation for serial & omp data.afU = new double[ data.iRows * data.iCols ]; data.afF = new double[ data.iRows * data.iCols ]; // calculate dx and dy data.fDx = 2.0 / ( data.iCols - 1 ); data.fDy = 2.0 / ( data.iRows - 1 ); data.iIterCount = 0; return; } // final cleanup routines void Finish( JacobiData &data ) { delete[] data.afU; delete[] data.afF; return; } // print result summary void PrintResults( const JacobiData &data ) { if ( data.iMyRank == 0 ) { cout << " Number of iterations : " << data.iIterCount << endl; cout << " Residual : " << data.fResidual << endl; cout << " Solution Error : " << data.fError << endl; cout << " Elapsed Time : " << data.fTimeStop - data.fTimeStart << endl; cout << " MFlops : " << 0.000013 * data.iIterCount * ( data.iCols - 2 ) * ( data.iRows - 2 ) / ( data.fTimeStop - data.fTimeStart ) << endl; } return; } // Initializes matrix // Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) void InitializeMatrix( JacobiData &data ) { /* Initilize initial condition and RHS */ #pragma omp parallel for for ( int j = data.iRowFirst; j <= data.iRowLast; j++ ) { for ( int i = 0; i < data.iCols; i++ ) { int xx = ( int )( -1.0 + data.fDx * i ); int yy = ( int )( -1.0 + data.fDy * j ); int xx2 = xx * xx; int yy2 = yy * yy; U( j, i ) = 0.0; F( j, i ) = -data.fAlpha * ( 1.0 - xx2 ) * ( 1.0 - yy2 ) + 2.0 * ( -2.0 + xx2 + yy2 ); } } } // Checks error between numerical and exact solution void CheckError( JacobiData &data ) { double error = 0.0; for ( int j = data.iRowFirst; j <= data.iRowLast; j++ ) { if ( ( data.iMyRank != 0 && j == data.iRowFirst ) || ( data.iMyRank != data.iNumProcs - 1 && j == data.iRowLast ) ) { continue; } for ( int i = 0; i < data.iCols; i++ ) { double xx = -1.0 + data.fDx * i; double yy = -1.0 + data.fDy * j; double temp = U( j, i ) - ( 1.0 - xx * xx ) * ( 1.0 - yy * yy ); error += temp * temp; } } data.fError = sqrt( error ) / ( data.iCols * data.iRows ); } double get_wtime() { #ifdef _OPENMP return omp_get_wtime(); #else struct timeval tp; gettimeofday( &tp, 0 ); return tp.tv_sec + ( tp.tv_usec * 1.0e-6 ); #endif } int main( int argc, char** argv ) { int retVal = 0; // return value JacobiData myData; // sets default values or reads from stdin // inits MPI and OpenMP if needed // distribute MPI data, calculate MPI bounds Init( myData, argc, argv ); if ( myData.afU && myData.afF ) { // matrix init InitializeMatrix( myData ); // starting timer myData.fTimeStart = get_wtime(); // running calculations Jacobi( myData ); // stopping timer myData.fTimeStop = get_wtime(); // error checking CheckError( myData ); // print result summary PrintResults( myData ); } else { cout << " Memory allocation failed ...\n"; retVal = -1; } // cleanup Finish( myData ); return retVal; } opari2-2.0.10/test/data/jacobi/C++/PaxHeaders/jacobi_test_3.out0000644000000000000000000000013215232670204020735 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C++/jacobi_test_3.out0000664000175100001440000000333415232670204021272 0ustar00builderusers 3: begin parallel 3: enter for 3: enter implicit barrier of parallelfor 3: exit implicit barrier of parallelfor 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.10/test/data/jacobi/C++/PaxHeaders/jacobi_test_2.out0000644000000000000000000000013215232670204020734 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C++/jacobi_test_2.out0000664000175100001440000000333415232670204021271 0ustar00builderusers 2: begin parallel 2: enter for 2: enter implicit barrier of parallelfor 2: exit implicit barrier of parallelfor 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.10/test/data/jacobi/C++/PaxHeaders/jacobi_test_1.out0000644000000000000000000000013215232670204020733 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C++/jacobi_test_1.out0000664000175100001440000000333415232670204021270 0ustar00builderusers 1: begin parallel 1: enter for 1: enter implicit barrier of parallelfor 1: exit implicit barrier of parallelfor 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.10/test/data/jacobi/C++/PaxHeaders/jacobi_test_0.out0000644000000000000000000000013215232670204020732 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C++/jacobi_test_0.out0000664000175100001440000000374415232670204021274 0ustar00builderusers 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of parallelfor 0: exit implicit barrier of parallelfor 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.10/test/data/jacobi/C++/PaxHeaders/jacobi.h0000644000000000000000000000013215232670204017074 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.999262921 opari2-2.0.10/test/data/jacobi/C++/jacobi.h0000664000175100001440000000161615232670204017432 0ustar00builderusers#ifndef _JACOBI_H #define _JACOBI_H struct JacobiData { // input data int iRows; int iCols; int iRowFirst; int iRowLast; int iIterMax; double fAlpha; double fRelax; double fTolerance; // calculated dx & dy double fDx; double fDy; // pointers to the allocated memory double* afU; double* afF; // start and end timestamps double fTimeStart; double fTimeStop; // calculated residual (output jacobi) double fResidual; // effective interation count (output jacobi) int iIterCount; // calculated error (output error_check) double fError; // MPI-Variables int iMyRank; // current process rank (number) int iNumProcs; // how many processes }; // jacobi calculation routine void Jacobi( JacobiData &data ); // final cleanup routines void Finish( JacobiData &data ); #endif opari2-2.0.10/test/data/jacobi/C++/PaxHeaders/jacobi.cpp0000644000000000000000000000013215232670204017427 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.995262945 opari2-2.0.10/test/data/jacobi/C++/jacobi.cpp0000664000175100001440000000644015232670204017765 0ustar00builderusers/* ****************************************************************** * Subroutine HelmholtzJ * Solves poisson equation on rectangular grid assuming : * (1) Uniform discretization in each direction, and * (2) Dirichlect boundary conditions * * Jacobi method is used in this routine * * Input : n,m Number of grid points in the X/Y directions * dx,dy Grid spacing in the X/Y directions * alpha Helmholtz eqn. coefficient * omega Relaxation factor * f(n,m) Right hand side function * u(n,m) Dependent variable/Solution * tolerance Tolerance for iterative solver * maxit Maximum number of iterations * * Output : u(n,m) - Solution ***************************************************************** */ #include #include #include #include "jacobi.h" using namespace std; #define U( j, i ) afU[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] #define F( j, i ) afF[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] #define UOLD( j, i ) uold[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] void Jacobi( JacobiData& data ) { /*use local pointers for performance reasons*/ double* afU, * afF; afU = data.afU; afF = data.afF; double* uold = new double[ data.iCols * data.iRows ]; if ( uold ) { double ax = 1.0 / ( data.fDx * data.fDx ); /* X-direction coef */ double ay = 1.0 / ( data.fDy * data.fDy ); /* Y_direction coef */ double b = -2.0 * ( ax + ay ) - data.fAlpha; /* Central coeff */ double residual = 10.0 * data.fTolerance; while ( data.iIterCount < data.iIterMax&& residual > data.fTolerance ) { residual = 0.0; /* Copy new solution into old, excluding the boundary. */ #pragma omp parallel { #pragma omp for for ( int j = data.iRowFirst; j <= data.iRowLast; j++ ) { for ( int i = 0; i < data.iCols; i++ ) { UOLD( j, i ) = U( j, i ); } } double fLRes; /* Compute stencil, residual and update. * Update excludes the boundary */ #pragma omp for reduction(+:residual) for ( int j = data.iRowFirst + 1; j <= data.iRowLast - 1; j++ ) { for ( int i = 1; i < data.iCols - 1; i++ ) { fLRes = ( ax * ( UOLD( j, i - 1 ) + UOLD( j, i + 1 ) ) + ay * ( UOLD( j - 1, i ) + UOLD( j + 1, i ) ) + b * UOLD( j, i ) - F( j, i ) ) / b; /* update solution */ U( j, i ) = UOLD( j, i ) - data.fRelax * fLRes; /* accumulate residual error */ residual += fLRes * fLRes; } } } /* end omp parallel */ /* error check */ data.iIterCount++; residual = sqrt( residual ) / ( data.iCols * data.iRows ); } /* while */ data.fResidual = residual; delete[] uold; } else { cerr << "Error: cant allocate memory\n"; Finish( data ); exit( 1 ); } } opari2-2.0.10/test/data/PaxHeaders/awk_script_test.input0000644000000000000000000000013215232670204020223 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.995262945 opari2-2.0.10/test/data/awk_script_test.input0000664000175100001440000000036115232670204020555 0ustar00builderusers0000000000000357 t _GLOBAL__sub_I_POMP2_Init_reg_kkbk2e7u08rek_1 0000000000000000 T POMP2_Init_reg_kkbk2e7u08rek_1 0000000000000357 t _GLOBAL__sub_I_POMP2_USER_Init_reg_kkbk2e7uxxrek_2 0000000000000000 T POMP2_USER_Init_reg_kkbk2e7uxxrek_2 opari2-2.0.10/test/data/PaxHeaders/awk_script_test.out.in0000644000000000000000000000013215232670204020300 xustar0030 mtime=1785426052.207415547 30 atime=1785426052.259415239 30 ctime=1785426077.995262945 opari2-2.0.10/test/data/awk_script_test.out.in0000664000175100001440000000067215232670204020637 0ustar00builderusers #ifdef __cplusplus extern "C" { #endif #include extern void POMP2_Init_reg_kkbk2e7u08rek_1(); extern void POMP2_USER_Init_reg_kkbk2e7uxxrek_2(); void POMP2_Init_regions() { POMP2_Init_reg_kkbk2e7u08rek_1(); } size_t POMP2_Get_num_regions() { return 1; } void POMP2_USER_Init_regions() { POMP2_USER_Init_reg_kkbk2e7uxxrek_2(); } size_t POMP2_USER_Get_num_regions() { return 2; } #ifdef __cplusplus } #endif opari2-2.0.10/PaxHeaders/src0000644000000000000000000000013215232670236012564 xustar0030 mtime=1785426078.071262495 30 atime=1785426082.655235368 30 ctime=1785426078.071262495 opari2-2.0.10/src/0000775000175100001440000000000015232670236013173 5ustar00builderusersopari2-2.0.10/src/PaxHeaders/opari0000644000000000000000000000013215232670236013676 xustar0030 mtime=1785426078.195261761 30 atime=1785426082.655235368 30 ctime=1785426078.195261761 opari2-2.0.10/src/opari/0000775000175100001440000000000015232670236014305 5ustar00builderusersopari2-2.0.10/src/opari/PaxHeaders/opari2_config.h0000644000000000000000000000013215232670204016640 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.195261761 opari2-2.0.10/src/opari/opari2_config.h0000664000175100001440000000570315232670204017177 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_config.h * * @brief */ #include #include class OPARI_Config { /* ****************************************** Implemented public methods */ public: /** Constructor */ OPARI_Config( void ); /** Destructor */ virtual ~ OPARI_Config( void ); /** Reads the configuration data from a file. To handle the read data you need to implement the AddLibDir() AddIncDir() AddLib() and SetCompilerFlags() methods. @param arg0 The first argument to the toll call. Should contain the tool name. Needed to find the executable path. @returns SCOREP_SUCCESS if the file was successfully parsed. */ void readConfigFile( std::string arg0 ); /** Changes from the install path to the build path. */ void setBuildCheck( void ); /* **************************************** Protected implmented methods */ private: /** This function gives a (key, value) pair found in a configuration file and not processed by one of the former functions. @param key The key @param value The value */ virtual void set_value( std::string key, std::string value ); /** Extracts parameter from configuration file It expects lines of the format key=value. Furthermore it truncates line at the scrpit comment character '#'. @param line input line from the config file @returns SCOREP_SUCCESS if the line was successfully parsed. Else it returns an error code. */ void read_parameter( std::string line ); /* *************************************************** Public members */ public: /**nm command*/ std::string m_nm; /** awk command*/ std::string m_awk; /** egrep command*/ std::string m_egrep; /** version information*/ std::string m_version; /** pomp2 api version information*/ std::string m_pomp2_api_version; /** awk script to use */ std::string m_script; /** include path for installed headers */ std::string m_cflags; }; opari2-2.0.10/src/opari/PaxHeaders/opari2_config.cc0000644000000000000000000000013215232670204016776 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.195261761 opari2-2.0.10/src/opari/opari2_config.cc0000664000175100001440000002600415232670204017332 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, 2019, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2025, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ /** @internal * * @file opari2_config.cc * * @brief Implementation of the OPARI2 config tool. * */ #include #include #include #include #include #include "opari2_config.h" #if HAVE( READLINK ) #include #endif #define ACTION_NM 1 #define ACTION_AWK 2 #define ACTION_SCRIPT 3 #define ACTION_EGREP 4 #define ACTION_VERSION 5 #define ACTION_NM2AWK 6 #define ACTION_CFLAGS 7 #define ACTION_POMP2_API_VERSION 8 #define ACTION_CFLAGS_GNU 9 #define ACTION_CFLAGS_INTEL 10 #define ACTION_CFLAGS_CLANG 11 void opari2_print_help( char** argv ) { std::string usage = #include "opari2-config_usage.h" ; std::cout << "\n\n" << usage << std::endl; } int main( int argc, char** argv ) { int i; int action = 0; char* config_file = NULL; int n_obj_files = 0; char** obj_files = NULL; OPARI_Config app; bool fortran = false; /* parsing the command line */ for ( i = 1; i < argc; i++ ) { if ( strcmp( argv[ i ], "--help" ) == 0 || strcmp( argv[ i ], "-h" ) == 0 ) { opari2_print_help( argv ); return EXIT_SUCCESS; } else if ( strcmp( argv[ i ], "--nm" ) == 0 ) { action = ACTION_NM; } else if ( strcmp( argv[ i ], "--awk-cmd" ) == 0 ) { action = ACTION_AWK; } else if ( strcmp( argv[ i ], "--awk-script" ) == 0 ) { action = ACTION_SCRIPT; } else if ( strcmp( argv[ i ], "--region-initialization" ) == 0 ) { action = ACTION_SCRIPT; } else if ( strcmp( argv[ i ], "--egrep" ) == 0 ) { action = ACTION_EGREP; } else if ( strcmp( argv[ i ], "--cflags=gnu" ) == 0 ) { action = ACTION_CFLAGS_GNU; } else if ( strcmp( argv[ i ], "--cflags=intel" ) == 0 ) { action = ACTION_CFLAGS_INTEL; } else if ( strcmp( argv[ i ], "--cflags=clang" ) == 0 ) { action = ACTION_CFLAGS_CLANG; } else if ( ( strcmp( argv[ i ], "--cflags" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=sun" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=pgi" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=ibm" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=cray" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=fujitsu" ) == 0 ) ) { action = ACTION_CFLAGS; } else if ( strcmp( argv[ i ], "--create-pomp2-regions" ) == 0 ) { int j = 0; n_obj_files = argc - i - 1; if ( n_obj_files > 0 ) { obj_files = new char*[ n_obj_files ]; while ( ++i < argc ) { obj_files[ j++ ] = argv[ i ]; } action = ACTION_NM2AWK; } else { std::cerr << "\nERROR: Object files missing. Abort.\n" << std::endl; return EXIT_FAILURE; } } else if ( strcmp( argv[ i ], "--version" ) == 0 ) { action = ACTION_VERSION; } else if ( strcmp( argv[ i ], "--interface-version" ) == 0 ) { action = ACTION_POMP2_API_VERSION; } else if ( strcmp( argv[ i ], "--revision" ) == 0 ) { std::cout << SCOREP_COMPONENT_REVISION << std::endl; exit( EXIT_SUCCESS ); } else if ( strcmp( argv[ i ], "--opari2-revision" ) == 0 || strcmp( argv[ i ], "--common-revision" ) == 0 ) { std::cerr << "[OPARI2] warning: " << argv[ i ] << " is deprecated" << std::endl; std::cout << SCOREP_COMPONENT_REVISION << std::endl; exit( EXIT_SUCCESS ); } else if ( strncmp( argv[ i ], "--config", 8 ) == 0 ) { // Expect the config file name after an equal sign if ( ( argv[ i ][ 8 ] == '=' ) && ( argv[ i ][ 9 ] != '\0' ) ) { config_file = &argv[ i ][ 9 ]; } else { std::cerr << "\nConfig file name missing. Abort.\n" << std::endl; return EXIT_FAILURE; } } else if ( strcmp( argv[ i ], "--build-check" ) == 0 ) { app.setBuildCheck(); } else if ( strcmp( argv[ i ], "--fortran" ) == 0 ) { fortran = true; } else { std::cerr << "\nUnknown option " << argv[ i ] << ". Abort.\n" << std::endl; std::cerr << "Print " << argv[ 0 ] << " --help to get a list of options" << std::endl; return EXIT_FAILURE; } } /* read data in case a config file was specified */ if ( config_file != NULL ) { app.readConfigFile( config_file ); } switch ( action ) { case ACTION_NM: std::cout << app.m_nm; std::cout.flush(); break; case ACTION_AWK: std::cout << app.m_awk; std::cout.flush(); break; case ACTION_SCRIPT: std::cout << app.m_script; std::cout.flush(); break; case ACTION_EGREP: std::cout << app.m_egrep; std::cout.flush(); break; case ACTION_CFLAGS: std::cout << app.m_cflags; std::cout.flush(); break; case ACTION_CFLAGS_GNU: if ( fortran ) { std::cout << app.m_cflags << " -Wno-unused"; } else { std::cout << app.m_cflags; } std::cout.flush(); break; case ACTION_CFLAGS_INTEL: if ( fortran ) { std::cout << app.m_cflags << " -warn nounused"; } else { std::cout << app.m_cflags; } std::cout.flush(); break; case ACTION_CFLAGS_CLANG: if ( fortran ) { std::cout << app.m_cflags; // As of 2025-03, just '-Werror' is supported. } else { std::cout << app.m_cflags << " -Wno-unused-command-line-argument"; } std::cout.flush(); break; case ACTION_NM2AWK: std::cout << app.m_nm << " "; for ( int i = 0; i < n_obj_files; i++ ) { std::cout << obj_files[ i ] << " "; } std::cout << " | " << app.m_script; break; case ACTION_VERSION: std::cout << app.m_version << "\n"; std::cout.flush(); break; case ACTION_POMP2_API_VERSION: std::cout << app.m_pomp2_api_version << "\n"; std::cout.flush(); break; default: opari2_print_help( argv ); } return EXIT_SUCCESS; } OPARI_Config::OPARI_Config( void ) { m_nm = NM; m_awk = AWK; m_egrep = EGREP; m_version = VERSION; m_pomp2_api_version = POMP2_API_VERSION; m_script = SCRIPT; m_cflags = CFLAGS; } OPARI_Config::~OPARI_Config( void ) { } void OPARI_Config::setBuildCheck( void ) { #if !HAVE( READLINK ) std::cerr << "Option --build-check not supported without readlink support." << std::endl; exit( EXIT_FAILURE ); #endif /* !HAVE(READLINK) */ const unsigned bufsize = 8192; char buffer[ bufsize ]; memset( buffer, 0, bufsize ); ssize_t result = readlink( "/proc/self/exe", buffer, bufsize ); if ( result >= bufsize || result == -1 ) { std::cerr << "Could not determine executable path. Option --build-check not supported." << std::endl; exit( EXIT_FAILURE ); } std::string opari2_config_exe = std::string( buffer ); std::size_t found = opari2_config_exe.rfind( "opari2-config" ); std::string opari2_config_build_path = opari2_config_exe.substr( 0, found ); m_script = opari2_config_build_path + "pomp2-parse-init-regions.awk"; m_cflags = "-I" + opari2_config_build_path + "../include"; } void OPARI_Config::readConfigFile( std::string config_file ) { std::ifstream inFile; inFile.open( config_file.c_str(), std::ios_base::in ); if ( !( inFile.good() ) ) { std::cerr << "Cannot open config file: " << config_file << std::endl; abort(); } while ( inFile.good() ) { char line[ 512 ] = { "" }; inFile.getline( line, 512 ); read_parameter( line ); } } void OPARI_Config::set_value( std::string key, std::string value ) { if ( key == "EGREP" ) { m_egrep = value; } else if ( key == "VERSION" ) { m_version = value; } else if ( key == "POMP2_API_VERSION" ) { m_pomp2_api_version = value; } else if ( key == "NM" ) { m_nm = value; } else if ( key == "AWK" ) { m_awk = value; } else if ( key == "OPARI_SCRIPT" ) { m_script = value; } else if ( key == "CFLAGS" ) { m_cflags = value; } /* Ignore unknown entries */ } void OPARI_Config::read_parameter( std::string line ) { /* check for comments */ size_t pos = line.find( "#" ); if ( pos == 0 ) { return; // Whole line commented out } if ( pos != std::string::npos ) { // Truncate line at comment line = line.substr( pos, line.length() - pos - 1 ); } // Ignore empty lines if ( line == "" ) { return; } /* separate value and key */ pos = line.find( "=" ); if ( pos == std::string::npos ) { std::cerr << "Error while parsing config file: Missing separator '='." << std::endl; abort(); } std::string key = line.substr( 0, pos ); std::string value = line.substr( pos + 2, line.length() - pos - 3 ); /* process parameter */ set_value( key, value ); } opari2-2.0.10/src/opari/PaxHeaders/opari2_directive.h0000644000000000000000000000013215232670204017351 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.167261927 opari2-2.0.10/src/opari/opari2_directive.h0000664000175100001440000004406515232670204017714 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive.h * * @brief Abstract base class of all directives. */ #ifndef OPARI2_DIRECTIVE_H #define OPARI2_DIRECTIVE_H #include using std::string; #include using std::vector; #include using std::set; #include using std::stringstream; #include using std::ostream; #include using std::pair; using std::make_pair; #include "opari2.h" /** * @brief Abstract base class to store and manipulate directive * related data */ class OPARI2_Directive { public: OPARI2_Directive( const string& fname, const int ln, vector& lines, vector& directive_prefix ); virtual ~ OPARI2_Directive( void ) { } public: /********************************************************** * * * INTERFACE FOR DERIVED CLASSES * * * **********************************************************/ /********************************************************** * The following functions MUST be implemented by derived * * classes * **********************************************************/ /** * @brief Each paradigm must provide this method * * Each paradigm must keep a separate count of regions encountered * of this type. See the example for derived classes for a * standard implementation. */ virtual void IncrementRegionCounter( void ) = 0; /** * @brief Generate region descriptors * * The function generate_descr_common() is provided to take care * of the generic descriptor information. See * OPARI2_DirectiveTemplate::GenerateDescr() for a standard * implementation. */ virtual void GenerateDescr( ostream& os ) = 0; /********************************************************** * These functions may be implemented. * * Default implementations are provided below. * **********************************************************/ public: /** * @brief Find the name of the directive */ virtual void FindName( void ) { find_name_common(); }; private: /** * @brief Identifies clauses and their arguments */ virtual void identify_clauses( void ) { }; /********************************************************** * * * BASE CLASS MEMBERS AND METHODS * * * **********************************************************/ private: /** * @brief Generates the part of the ctc-string which contains the * paradigm specific information. * * The function generate_ctc_string_common() is provided to take * care of the generic source code region information. */ virtual string generate_ctc_string( OPARI2_Format_t form ) { return generate_ctc_string_common( form ); }; public: /** * @brief Writes Directive for ending a loop */ virtual OPARI2_Directive* EndLoopDirective( const int lineno ) { return NULL; }; /** * @brief Returns true for directives ending a loop region */ virtual bool EndsLoopDirective( void ) { return false; }; /******************************************************************* * Furthermore there are some static functions implemented in the * * derived classes, which are necessary or might be useful (and * * should be named the same), when deriving a class for a new * * paradigm. * *******************************************************************/ /** * static OPARI2_ErrorCode * ProcessOption( string option ); * * static uint32_t * String2Group( const string name ); * * static void * GenerateHeader( ostream& os ); * * static void * FinalizeDescrs( ostream& os ); * * static void * GenerateInitHandleCalls( ostream& os, * const string incfile = "" ); */ protected: /** Name of currently processed file. This is not constant for one source file, as other files may have been included and the source code information is written correctly into the line directives */ string m_filename; OPARI2_ParadigmType_t m_type; /** directive name */ string m_name; /** A vector of pairs, consisting of clauses and their arguments */ OPARI2_StrStr_map_t m_clauses; /* Global ID of instrumented region */ int m_id; /** line numbers of the first and last line of the beginning and the end of the directive region in the sourcce file */ int m_begin_first_line; int m_begin_last_line; int m_end_first_line; int m_end_last_line; /* Specifies whether there is an outer region */ bool m_outer_reg; /* The Compile Time Context (CTC) string, its length and the variable it is stored in, in the instrumented file */ string m_ctc_string; int m_ctc_string_len; string m_ctc_string_variable; /** set of relevant region descriptors */ set m_descrs; /** the index of the currently parsed line within the directive statements */ unsigned int m_pline; /** position index within the currently parsed line */ string::size_type m_ppos; /** all lines */ vector m_lines; /** all original lines */ vector m_orig_lines; /** A series of tokens that identify a pragma/directive */ vector m_directive_prefix; /** In Fortran a common block is inserted in the output file with * all region ids, the values are collected here and printed at * the end*/ static vector s_common_block; /** In Fortran directives are usually ended with an "!$par end * loop" directive. In case of directives that refer to a * directly following loop, the end of the loop also ends the * code region for the directive. The end directive is inserted * by OPARI2, if m_needs_end_loop_directive is true.*/ bool m_needs_end_loop_directive; /* The necessary directive for explicitly ending a loop * region. */ string m_end_loop_directive; /** directive of enclosing directive */ OPARI2_Directive* m_enclosing; /** Static variables. This is information which is constant for the processed file and frequently accessed in the directives */ /** pointer to outer directive */ static OPARI2_Directive* s_outer; /** Region counter for all region types */ static int s_num_all_regions; /** Language the input file is written in */ static OPARI2_Language_t s_lang; /** Type of format (currently only needed for Fortran, distinguishes between fixed-form and free-form Fortran */ static OPARI2_Format_t s_format; /** Specifies whether the source code information via #line directives is to be inserted */ static bool s_keep_src_info; /** Specifies whether the file was already preprocessed */ static bool s_preprocessed_file; /** A unique id that is needed to distinguish the initialization routines of the different compile units of the target application. It should not be placed here as it is strictly speaking not part of the necessary information of a directive, but it is used and needed here in the GenerateInitHandleCalls... functions. */ static string s_inode_compiletime_id; public: /** @brief Return 'type', for dynamic_cast */ OPARI2_ParadigmType_t GetParadigmType( void ); /** @brief Return the directive name */ string& GetName( void ); /** @brief Returns whether a clause is present */ bool HasClause( const string& clause ); /** @brief Returns the argument of a clause */ string GetClauseArg( const string& clause ); /** @brief Deletes comments in directive lines */ void DelInlineComments( void ); /** @brief Returns the filename of the file the directive belongs to */ string& GetFilename( void ); /* Return beginning line number of directive */ int& GetLineno( void ); /** @brief Update line information after the parser reaches the end of this directive region */ void SetEndLineno( const int endline_begin, const int endline_end ); /** @brief Prints the #line directive to update the source code information */ void ResetSourceInfo( ostream& os ); /** @brief Enter region */ void EnterRegion( bool new_outer = false, bool save_on_vec = true ); /** @brief Initialize region information. */ void InitRegion( bool outer = false ); /** @brief Initialize region information. */ void InitRegion( OPARI2_Directive* parent, bool outer = false ); /** @brief Exit region */ int ExitRegion( bool end_outer = false ); /** @brief Inserts the id of a region nested inside another region */ void InsertDescr( int descr ); /** @brief Check if the directive has accociated descriptors */ bool DescrsEmpty(); /** @brief Returns the id of the directive region */ int GetID( void ) { return m_id; }; /** @brief Returns the ctc-string */ string GetCTCStringVariable( void ) { return m_ctc_string_variable; }; /** @brief Sets all necessary static information */ static void SetOptions( OPARI2_Language_t lang, OPARI2_Format_t form, bool keep_src, bool preprocessed, const string id ); /** @brief Returns the file specific identifier to distinguish different compilation units */ static string GetInodeCompiletimeID( void ) { return s_inode_compiletime_id; } /** * @brief Generate a function to initialize all region handles. */ static void GenerateInitHandleCalls( ostream& os, const string incfile, const string paradigm_prefix, const stringstream& init_handle_calls, const int num_regions ); /** @brief Fortran specific finalization of descriptors */ static void FinalizeFortranDescrs( ostream& os ); void FinishRegion( void ); /** @brief Returns value of m_needs_end_loop_directive.*/ bool NeedsEndLoopDirective( void ); /** @brief Sets value of m_needs_end_loop_directive.*/ void NeedsEndLoopDirective( bool val ); /** @brief Prints directive to stream and updates source information */ void PrintDirective( ostream& os, const string& adds = "" ); /** @brief Prints directive without updating source information */ void PrintPlainDirective( ostream& os, const string& adds = "" ); protected: /** * @brief Generates the part of the ctc-string which contains the * generic region information */ string generate_ctc_string_common( OPARI2_Format_t form, string specific_part = "" ); /** * @brief Generate the generic part of the region descriptors */ void generate_descr_common( ostream& os ); /** * @brief Generic part of identifying a directive name */ void find_name_common( void ); /** * @brief Removes all unnecessary commas */ void remove_commas( void ); /** * @brief Returns the arguments of a clause. */ string find_arguments( unsigned& line, string::size_type& pos, bool remove, string clause ); /** * @brief Removes empty lines */ bool remove_empty_line( unsigned& line ); /** * @brief Check if 'word' can be found in directive 'm_lines'. * * If true, save the line number within 'm_lines' in 'line' and * offset within the line in 'pos'. * * @return true if 'word' is found in m_lines. * false otherwise. */ bool find_word( const string word, unsigned& line, string::size_type& pos ); /** * @brief Find the next word in directive lines, starting from * 'm_pline' and 'm_ppos'. */ string find_next_word( void ); /** * @brief Takes care of moving arguments of clauses for split * directives to the newly created inner directive. * * When combined directives are split the clauses are either kept * at the outer directive or moved to the inner directive. This * function takes care of moving all arguments of clauses * belonging to the inner directive. */ void fix_clause_arg( vector& outer, vector& inner, unsigned& line, string::size_type& pos ); /** * @brief Remove empty lines in directive 'lines'. */ void remove_empties( void ); public: /** * @brief Split combined parallel and worksharing constructs. * * They are split into two separate pragmas to allow the insertion of * POMP function calles between the parallel and the worksharing * construct. The clauses need to be matched to the directive they * belong to. this is a template function as it needs to return the * right derived type of OPARI2_Directive*. */ template T* SplitCombinedT( OPARI2_StrStr_pairs_t& outer_inner, OPARI2_StrBool_pairs_t& inner_clauses ) { remove_commas(); vector inner_lines; string sentinel = m_directive_prefix[ 0 ]; string::size_type slen = sentinel.length(); // make empty copy with continuation characters if ( s_lang & L_C_OR_CXX ) { for ( unsigned i = 0; i < m_lines.size(); ++i ) { inner_lines.push_back( string( m_lines[ i ].size(), ' ' ) ); if ( i != m_lines.size() ) { inner_lines[ i ][ inner_lines[ i ].size() - 1 ] = '\\'; } } } else if ( s_lang & L_FORTRAN ) { for ( unsigned i = 0; i < m_lines.size(); ++i ) { inner_lines.push_back( string( m_lines[ i ].size(), ' ' ) ); string::size_type s = m_lines[ i ].find( sentinel ); // & continuation characters string::size_type com = m_lines[ i ].find( "!", s + slen ); if ( com != string::npos ) { --com; } string::size_type amp2 = m_lines[ i ].find_last_not_of( " \t", com ); if ( m_lines[ i ][ amp2 ] == '&' ) { inner_lines[ i ][ amp2 ] = '&'; } string::size_type amp1 = m_lines[ i ].find_first_not_of( " \t", s + slen ); if ( m_lines[ i ][ amp1 ] == '&' || m_lines[ i ][ amp1 ] == '+' ) { inner_lines[ i ][ amp1 ] = m_lines[ i ][ amp1 ]; } } } // copy sentinel/directive_prefix unsigned line = 0; string::size_type pos = 0; for ( vector::iterator it = m_directive_prefix.begin(); it != m_directive_prefix.end(); ++it ) { for ( size_t i = 0; i < m_lines.size(); ++i ) { pos = m_lines[ i ].find( *it ); if ( pos != string::npos ) { inner_lines[ i ].replace( pos, ( *it ).length(), *it ); } } } // fix pragma name for ( OPARI2_StrStr_pairs_t::iterator it = outer_inner.begin(); it != outer_inner.end(); ++it ) { line = pos = 0; if ( find_word( ( *it ).first, line, pos ) ) { string name = ( *it ).second; string blanks( name.length(), ' ' ); if ( find_word( name, line, pos ) ) { m_lines[ line ].replace( pos, name.length(), blanks ); inner_lines[ line ].replace( pos, name.length(), name ); } } } // fix pragma clauses for ( OPARI2_StrBool_pairs_t::iterator it = inner_clauses.begin(); it != inner_clauses.end(); ++it ) { string name = ( *it ).first; bool has_args = ( *it ).second; string blanks( name.length(), ' ' ); line = pos = 0; while ( find_word( name, line, pos ) ) { m_lines[ line ].replace( pos, name.length(), blanks ); inner_lines[ line ].replace( pos, name.length(), name ); pos += name.length(); if ( has_args ) { fix_clause_arg( m_lines, inner_lines, line, pos ); } } } T* inner = new T( m_filename, m_begin_first_line, inner_lines, m_directive_prefix ); // final cleanup remove_empties(); inner->remove_empties(); return inner; } bool active; }; #endif //OPARI2_DIRECTIVE_H opari2-2.0.10/src/opari/PaxHeaders/opari2_directive.cc0000644000000000000000000000013215232670204017507 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.167261927 opari2-2.0.10/src/opari/opari2_directive.cc0000664000175100001440000007355315232670204020056 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014, 2019, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_directive.cc * * @brief Methods of abstract base classs 'OPARI2_Directive'. * */ #include #include #include #include using std::cerr; #include using std::transform; using std::remove_if; #include "common.h" #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_manager.h" OPARI2_Directive::OPARI2_Directive( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : m_filename( fname ), m_begin_first_line( ln ), m_lines( lines ), m_directive_prefix( directive_prefix ) { m_pline = 0; m_ppos = 0; DelInlineComments(); for ( vector::iterator dp = directive_prefix.begin(); dp != directive_prefix.end(); ++dp ) { string token = find_next_word(); if ( token != *dp ) { std::cerr << "ERROR: Directive token mismatch!\n"; cleanup_and_exit(); } } m_orig_lines = lines; m_name.clear(); m_needs_end_loop_directive = false; } OPARI2_ParadigmType_t OPARI2_Directive::GetParadigmType( void ) { return m_type; } string& OPARI2_Directive::GetName( void ) { if ( m_name.empty() ) { FindName(); } if ( m_name == "" ) { m_name = "$END$"; } return m_name; } /** @brief Returns whether a clause is present */ bool OPARI2_Directive::HasClause( const string& clause ) { return m_clauses.find( clause ) != m_clauses.end(); } /** @brief Returns the argument of a clause */ string OPARI2_Directive::GetClauseArg( const string& clause ) { if ( m_clauses.find( clause ) != m_clauses.end() ) { return m_clauses[ clause ]; } else { return ""; } } void OPARI2_Directive::DelInlineComments( void ) { if ( s_lang & L_FORTRAN ) { for ( vector::iterator l = m_lines.begin(); l != m_lines.end(); ++l ) { // find first ! int c = ( *l ).find( "!" ); for ( unsigned i = c + 1; i < ( *l ).size(); ++i ) { // zero out string constants and free form comments if ( ( *l )[ i ] == '!' ) { /* -- zero out partial line F90 comments -- */ for (; i < ( *l ).size(); ++i ) { ( *l )[ i ] = ' '; } break; } } } } } string& OPARI2_Directive::GetFilename( void ) { return m_filename; } int& OPARI2_Directive::GetLineno( void ) { return m_begin_first_line; } void OPARI2_Directive::SetEndLineno( const int endline_begin, const int endline_end ) { m_end_first_line = endline_begin; m_end_last_line = endline_end; } void OPARI2_Directive::ResetSourceInfo( ostream& os ) { if ( m_name == "$END$" ) { os << "#line " << m_begin_first_line + 1 << " \"" << m_filename << "\"" << "\n"; } else { os << "#line " << m_begin_first_line + m_lines.size() << " \"" << m_filename << "\"" << "\n"; } } void OPARI2_Directive::EnterRegion( bool new_outer, bool save_on_vec ) { /** initialize region information */ InitRegion( new_outer ); if ( save_on_vec ) { SaveForInit( this ); } DirectiveStackPush( this ); } void OPARI2_Directive::InitRegion( bool outer ) { m_id = ++s_num_all_regions; this->IncrementRegionCounter(); /** by default, region name is the same as directive name */ m_begin_last_line = m_begin_first_line + m_lines.size() - 1; m_end_first_line = m_begin_first_line; m_end_last_line = m_begin_first_line + m_lines.size() - 1; m_outer_reg = outer; // to keep track of nested directives m_enclosing = s_outer; if ( m_outer_reg ) { s_outer = this; } if ( s_outer ) { s_outer->InsertDescr( m_id ); } DirectiveStackInsertDescr( m_id ); stringstream stream; stream << string_id_prefix << m_id; m_ctc_string_variable = stream.str(); } void OPARI2_Directive::InitRegion( OPARI2_Directive* parent, bool outer ) { --s_num_all_regions; InitRegion( outer ); m_id = parent->GetID(); } int OPARI2_Directive::ExitRegion( bool end_outer ) { OPARI2_Directive* d_top = DirectiveStackTop( this ); assert( d_top != NULL ); string& name_top = d_top->GetName(); /** * For FORTRAN, some directive block ends with "end directive_name" */ #if defined( __GNUC__ ) && ( __GNUC__ < 3 ) if ( m_name[ 0 ] != '$' && m_name.substr( 3 ) != name_top ) { #else if ( m_name[ 0 ] != '$' && m_name.compare( 3, string::npos, name_top ) != 0 ) { #endif cerr << m_filename << ":" << d_top->GetLineno() << ": ERROR: missing end" << name_top << " directive for " << name_top << " directive\n"; cerr << m_filename << ":" << m_begin_first_line << ": ERROR: non-matching " << m_name << " directive\n"; cleanup_and_exit(); } /** Set end line information of the corresponding region */ if ( m_lines.size() ) { d_top->SetEndLineno( m_begin_first_line, m_begin_first_line + m_lines.size() - 1 ); } else { // C/C++ $END$ pragma d_top->SetEndLineno( m_begin_first_line, m_begin_first_line ); } if ( end_outer ) { d_top->FinishRegion(); } int region_id = d_top->GetID(); DirectiveStackPop(); return region_id; } void OPARI2_Directive::InsertDescr( int descr ) { m_descrs.insert( descr ); } bool OPARI2_Directive::DescrsEmpty() { return m_descrs.empty(); } void OPARI2_Directive::FinishRegion( void ) { if ( m_outer_reg ) { s_outer = m_enclosing; } } bool OPARI2_Directive::NeedsEndLoopDirective( void ) { return m_needs_end_loop_directive; } void OPARI2_Directive::NeedsEndLoopDirective( bool val ) { m_needs_end_loop_directive = val; } void OPARI2_Directive::PrintDirective( ostream& os, const string& adds ) { if ( m_lines.size() && s_keep_src_info && !InstrumentationDisabled( D_USER ) ) { // print original source location information reset pragma os << "#line " << m_begin_first_line << " \"" << m_filename << "\"" << "\n"; } PrintPlainDirective( os, adds ); } void OPARI2_Directive::PrintPlainDirective( ostream& os, const string& adds ) { // print pragma text if ( m_lines.size() ) { for ( unsigned i = 0; i < m_lines.size() - 1; ++i ) { os << m_lines[ i ] << "\n"; } os << m_lines.back() << adds << "\n"; } } /* *INDENT-OFF* */ /** * The generated code might look like this (OpenMP example): * * @code #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); ... ... } * @endcode * * or in Fortran: * * @code subroutine POMP2_Init_reg_000() include 'test7.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) ... ... end * @endcode * * This generated function needs to be called from * POMP2_Init_regions. There will be one of these for each compile * unit. */ /* *INDENT-ON* */ void OPARI2_Directive::GenerateInitHandleCalls( ostream& os, const string incfile, const string paradigm_prefix, const stringstream& init_handle_calls, const int num_regions ) { if ( num_regions > 0 ) { if ( s_lang & L_FORTRAN ) { if ( init_handle_calls.rdbuf()->in_avail() != 0 ) { //add a Function to initialize the handles at the end of the file os << "\n subroutine " << paradigm_prefix << "_Init_reg_" << s_inode_compiletime_id << "_" << num_regions << "()\n" << " include \'" << incfile << "\'\n" << init_handle_calls.str() << " end\n"; } } else if ( s_lang & L_C_OR_CXX ) { if ( s_lang & L_C ) { os << "\n#ifdef __cplusplus\nextern \"C\"\n#endif"; } else if ( s_lang & L_CXX ) { os << "extern \"C\"\n{"; } os << "\nvoid " << paradigm_prefix << "_Init_reg_" << s_inode_compiletime_id << "_" << num_regions << "()\n{\n" << init_handle_calls.str(); if ( s_lang & L_C ) { os << "}\n"; } else if ( s_lang & L_CXX ) { os << "}\n}\n"; } } } } void OPARI2_Directive::FinalizeFortranDescrs( ostream& os ) { if ( !s_common_block.empty() ) { vector::iterator it = s_common_block.begin(); os << " common /" << "cb" << s_inode_compiletime_id << "/ " << region_id_prefix << *it++; for (; it < s_common_block.end(); it++ ) { if ( s_format == F_FIX ) { os << ",\n & " << region_id_prefix << *it; } else { os << ",&\n " << region_id_prefix << *it; } } os << std::endl; } } void OPARI2_Directive::find_name_common( void ) { if ( m_lines.empty() ) { // automatically generated END pragma for C/C++ m_name = "$END$"; return; } if ( !m_name.empty() ) { return; } m_name = find_next_word(); } string OPARI2_Directive::generate_ctc_string_common( OPARI2_Format_t form, string specific_part ) { stringstream stream1, stream2; stream1 << "*regionType=" << m_name << "*" << "sscl=" << m_filename << ":" << m_begin_first_line << ":" << m_begin_last_line << "*" << "escl=" << m_filename << ":" << m_end_first_line << ":" << m_end_last_line << "*" << specific_part << "*"; stream2 << "\"" << stream1.str().length() + 2 << stream1.str() << "\""; m_ctc_string_len = stream2.str().length(); string ctc_string = stream2.str(); if ( form == F_FIX ) { for ( unsigned int i = 58; i < ctc_string.size() - 1; i += 68 ) { ctc_string.insert( i, "\"//\n &\"" ); } } else if ( form == F_FREE ) { for ( unsigned int i = 58; i < ctc_string.size() - 1; i += 68 ) { ctc_string.insert( i, "\"//&\n \"" ); } } return ctc_string; } /* *INDENT-OFF* */ /** * This function writes the definitions of the region handle and the * CTC-string for the region referred to by this directive object. * * Fortran 90 example: * @code INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=268), parameter :: opari2_ctc_1 =& "265*regionType=parallel*sscl=/some/path/to/source.f90:26"// ":26*escl=/some/path/to/source.f90:43:43*has_if=1*has_num"// "_threads=4*has_reduction=1**" * @endcode * * C/C++ example: * @code static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "261*regionType=parallel*sscl=/some/path/to/source.c:35:35*escl=/some/path/to/source.c:54:54*has_if=1*has_num_threads=4*has_reduction=1**" * @endcode */ /* *INDENT-ON* */ void OPARI2_Directive::generate_descr_common( ostream& os ) { string ctc_string = generate_ctc_string( s_format ); if ( s_lang & L_F77 ) { os << " INTEGER*8 " << region_id_prefix << m_id << "\n"; os << " CHARACTER*" << m_ctc_string_len << " " << m_ctc_string_variable << "\n"; if ( s_format == F_FIX ) { os << " PARAMETER (" << m_ctc_string_variable << "=\n"; os << " &" << ctc_string << ")\n\n"; } else { os << " PARAMETER (" << m_ctc_string_variable << "=&\n"; os << " " << ctc_string << ")\n\n"; } s_common_block.push_back( m_id ); } else if ( s_lang & L_F90 ) { os << " INTEGER( KIND=8 ) :: " << region_id_prefix << m_id << "\n\n"; if ( s_format == F_FREE ) { os << " CHARACTER (LEN=" << m_ctc_string_len << "), parameter :: "; os << m_ctc_string_variable << " =&\n " << ctc_string << "\n\n"; } else { os << " CHARACTER (LEN=" << m_ctc_string_len << "), parameter :: "; os << m_ctc_string_variable << " =\n &" << ctc_string << "\n\n"; } s_common_block.push_back( m_id ); } else if ( s_lang & L_C_OR_CXX ) { os << "static " << "OPARI2_Region_handle " << region_id_prefix << m_id; if ( s_preprocessed_file ) { os << " = (OPARI2_Region_handle)0;\n"; } else { os << " = NULL;\n"; } os << "#define " << m_ctc_string_variable << " " << ctc_string << "\n"; } } void OPARI2_Directive::remove_commas( void ) { int bracket_counter = 0; for ( unsigned int line = 0; line < m_lines.size(); line++ ) { for ( unsigned int c = 0; c < m_lines[ line ].length(); c++ ) { if ( m_lines[ line ][ c ] == '(' ) { bracket_counter++; } if ( m_lines[ line ][ c ] == ')' ) { bracket_counter--; } if ( bracket_counter == 0 && m_lines[ line ][ c ] == ',' ) { m_lines[ line ][ c ] = ' '; } } } return; } /** @brief Returns the arguments of a clause. */ string OPARI2_Directive::find_arguments( unsigned& line, string::size_type& pos, bool remove, string clause ) { string arguments; int bracket_counter = 0; if ( remove ) { m_lines[ line ].replace( pos, clause.length(), string( clause.length(), ' ' ) ); } pos += clause.length(); pos = m_lines[ line ].find_first_not_of( " \t", pos ); if ( ( pos != string::npos ) && ( m_lines[ line ][ pos ] == '(' ) ) { bracket_counter++; if ( remove ) { m_lines[ line ][ pos ] = ' '; } pos++; } bool contComm = false; // Continuation line or comment found while ( bracket_counter > 0 ) { if ( m_lines[ line ][ pos ] == '(' ) { bracket_counter++; } if ( ( s_lang & L_C_OR_CXX && m_lines[ line ][ pos ] == '\\' ) || ( s_lang & L_FORTRAN && m_lines[ line ][ pos ] == '&' ) ) { pos = m_lines[ line ].length(); } else { if ( s_lang & L_FORTRAN && m_lines[ line ][ pos ] == '!' ) { contComm = true; } else { arguments.append( 1, m_lines[ line ][ pos ] ); if ( remove ) { m_lines[ line ][ pos ] = ' '; } pos++; } } if ( pos >= m_lines[ line ].length() || contComm ) { if ( s_lang & L_FORTRAN && !remove_empty_line( line ) ) { line++; } contComm = false; if ( line >= m_lines.size() ) { std::cerr << m_filename << ":" << m_begin_first_line << ": ERROR: Missing ) for " << clause << " clause \n" << std::endl; cleanup_and_exit(); } else if ( s_lang & L_FORTRAN ) { pos = m_lines[ line ].find_first_of( "!*cC" ) + 6; pos = m_lines[ line ].find_first_not_of( " \t", pos ); if ( m_lines[ line ][ pos ] == '&' ) { pos++; } } else if ( s_lang & L_C_OR_CXX ) { pos = 0; } } if ( m_lines[ line ][ pos ] == ')' ) { bracket_counter--; } } //remove last bracket if necessary if ( remove && pos != string::npos ) { m_lines[ line ][ pos ] = ' '; //remove comma after the removed clause if needed while ( m_lines[ line ][ pos ] == ' ' ) { pos++; } if ( m_lines[ line ][ pos ] == ',' ) { m_lines[ line ][ pos ] = ' '; } } size_t p; p = arguments.find( ' ' ); while ( p != string::npos ) { arguments.erase( p, 1 ); p = arguments.find( ' ' ); } return arguments; } /** remove empty continued lines inside of pragma*/ bool OPARI2_Directive::remove_empty_line( unsigned& line ) { string lline = m_lines[ line ]; lline.erase( remove_if( lline.begin(), lline.end(), isspace ), lline.end() ); transform( lline.begin(), lline.end(), lline.begin(), tolower ); if ( lline.compare( m_directive_prefix[ 0 ] ) == 0 ) { if ( m_lines.size() == ( line + 1 ) ) { m_lines[ line - 1 ][ m_lines[ line - 1 ].find_last_of( "&" ) ] = ' '; } m_lines.erase( m_lines.begin() + line ); return true; } return false; } bool OPARI2_Directive::find_word( const string word, unsigned& line, string::size_type& pos ) { if ( s_lang & L_C_OR_CXX ) { for ( unsigned i = line; i < m_lines.size(); ++i ) { string::size_type w = m_lines[ i ].find( word ); while ( w != string::npos ) { char a; char b; //word may start at position 0 of a continuation line if ( w == 0 ) { b = ' '; } else { b = m_lines[ i ][ w - 1 ]; } if ( m_lines[ i ].length() > w + word.length() ) { a = m_lines[ i ][ w + word.length() ]; } else { a = ' '; } if ( ( b == ' ' || b == '\t' || b == '/' || b == ')' || b == ',' || b == '#' ) && ( a == ' ' || a == '\t' || a == '/' || a == '(' || a == ',' ) ) { line = i; pos = w; return true; } else { w++; if ( w != string::npos ) { w = m_lines[ i ].find( word, w ); } } } pos = 0; } } else if ( s_lang & L_FORTRAN ) { for ( unsigned i = line; i < m_lines.size(); ++i ) { string::size_type s = ( pos == 0 ) ? m_lines[ i ].find( m_directive_prefix[ 0 ] ) + m_directive_prefix[ 0 ].length() : pos; string::size_type w = m_lines[ i ].find( word, s ); string::size_type c = m_lines[ i ].find( '!', s ); // if word found and found before comment while ( w != string::npos && ( c == string::npos || ( c != string::npos && w < c ) ) ) { char b = m_lines[ i ][ w - 1 ]; char a; if ( m_lines[ i ].length() > w + word.length() ) { a = m_lines[ i ][ w + word.length() ]; } else { a = ' '; } if ( ( b == ' ' || b == '\t' || b == '!' || b == ')' || b == ',' ) && ( a == ' ' || a == '\t' || a == '!' || a == '(' || a == ',' || a == '&' ) ) { line = i; pos = w; return true; } else { w++; if ( w != string::npos ) { w = m_lines[ i ].find( word, w ); } } } pos = 0; } } return false; } string OPARI2_Directive::find_next_word( void ) { if ( s_lang & L_C_OR_CXX ) { while ( m_pline < m_lines.size() ) { string::size_type wbeg = m_lines[ m_pline ].find_first_not_of( " \t", m_ppos ); if ( wbeg == string::npos || m_lines[ m_pline ][ wbeg ] == '\\' ) { ++m_pline; if ( m_pline < m_lines.size() ) { m_ppos = 0; } else { return ""; } } else if ( m_lines[ m_pline ][ wbeg ] == '(' || m_lines[ m_pline ][ wbeg ] == ')' || m_lines[ m_pline ][ wbeg ] == '#' ) { m_ppos = wbeg + 1; return string( 1, m_lines[ m_pline ][ wbeg ] ); } else { m_ppos = m_lines[ m_pline ].find_first_of( " \t()", wbeg ); return m_lines[ m_pline ].substr( wbeg, m_ppos == string::npos ? m_ppos : m_ppos - wbeg ); } } } else if ( s_lang & L_FORTRAN ) { string sentinel = m_directive_prefix[ 0 ]; while ( m_pline < m_lines.size() ) { string::size_type wbeg = m_lines[ m_pline ].find_first_not_of( " \t", m_ppos ); if ( wbeg == string::npos || m_lines[ m_pline ][ wbeg ] == '&' ) { ++m_pline; if ( m_pline < m_lines.size() ) { m_ppos = m_lines[ m_pline ].find( sentinel ) + sentinel.length(); m_ppos = m_lines[ m_pline ].find_first_not_of( " \t", m_ppos ); if ( m_lines[ m_pline ][ m_ppos ] == '&' || m_lines[ m_pline ][ m_ppos ] == '+' ) { ++m_ppos; } } else { return ""; } } else if ( m_lines[ m_pline ][ wbeg ] == '(' || m_lines[ m_pline ][ wbeg ] == ')' ) { m_ppos = wbeg + 1; return string( 1, m_lines[ m_pline ][ wbeg ] ); } else { m_ppos = m_lines[ m_pline ].find_first_of( " \t()&", wbeg ); return m_lines[ m_pline ].substr( wbeg, m_ppos == string::npos ? m_ppos : m_ppos - wbeg ); } } } return ""; } void OPARI2_Directive::fix_clause_arg( vector& outer, vector& inner, unsigned& line, string::size_type& pos ) { char* optr = &( outer[ line ][ pos ] ); char* iptr = &( inner[ line ][ pos ] ); string sentinel = m_directive_prefix[ 0 ]; string::size_type slen = sentinel.length(); while ( *optr != ')' ) { while ( ( ( s_lang & L_C_OR_CXX ) && *optr == '\\' ) || ( ( ( s_lang & L_FORTRAN ) && ( *optr == '!' || *optr == '&' ) ) || pos >= outer[ line ].size() ) ) { // skip to next line ++line; if ( line >= outer.size() ) { return; } if ( s_lang & L_FORTRAN ) { pos = outer[ line ].find( sentinel ) + slen; pos = outer[ line ].find_first_not_of( " \t", pos ); if ( outer[ line ][ pos ] == '&' ) { ++pos; } } else if ( s_lang & L_C_OR_CXX ) { pos = 0; } optr = &( outer[ line ][ pos ] ); iptr = &( inner[ line ][ pos ] ); } *iptr = *optr; *optr = ' '; ++iptr; ++optr; ++pos; } *iptr = ')'; *optr = ' '; } /** * @brief Remove empty lines in directive 'lines'. */ void OPARI2_Directive::remove_empties( void ) { if ( s_lang & L_C_OR_CXX ) { vector::iterator it = m_lines.begin(); while ( it != m_lines.end() ) { string::size_type l = it->find_first_not_of( " \t&" ); if ( l == string::npos || ( *it )[ l ] == '\\' ) { it = m_lines.erase( it ); } else { ++it; } } // make sure last line is not a continued line int lastline = m_lines.size() - 1; string::size_type lastpos = m_lines[ lastline ].size() - 1; if ( m_lines[ lastline ][ lastpos ] == '\\' ) { m_lines[ lastline ][ lastpos ] = ' '; } } else if ( s_lang & L_FORTRAN ) { // remove lines without content string sentinel = m_directive_prefix[ 0 ]; vector::iterator it = m_lines.begin(); while ( it != m_lines.end() ) { string::size_type pos = it->find( sentinel ) + sentinel.length(); if ( ( *it )[ pos ] == '&' || ( *it )[ pos ] == '+' ) { ++pos; } pos = it->find_first_not_of( " \t&", pos ); if ( pos == string::npos || ( *it )[ pos ] == '!' ) { it = m_lines.erase( it ); } else { ++it; } } // make sure 1st line is not a continuation line string::size_type pos = m_lines[ 0 ].find( sentinel ); if ( pos == 0 ) { m_lines[ 0 ][ sentinel.length() ] = ' '; } else { string::size_type l = m_lines[ 0 ].find_first_not_of( " \t", pos + sentinel.length() ); if ( m_lines[ 0 ][ l ] == '&' || m_lines[ 0 ][ l ] == '+' ) { m_lines[ 0 ][ l ] = ' '; } } // make sure last line is not a continued line int lastline = m_lines.size() - 1; pos = m_lines[ lastline ].find( sentinel ) + sentinel.length(); pos = m_lines[ lastline ].find( '!', pos ); if ( pos != string::npos ) { --pos; } string::size_type amp = m_lines[ lastline ].find_last_not_of( " \t", pos ); if ( m_lines[ lastline ][ amp ] == '&' ) { m_lines[ lastline ][ amp ] = ' '; } } } /** Initialize static variables */ void OPARI2_Directive::SetOptions( OPARI2_Language_t lang, OPARI2_Format_t form, bool keep_src, bool preprocessed, const string id ) { s_lang = lang; s_format = form; s_keep_src_info = keep_src; s_preprocessed_file = preprocessed; s_inode_compiletime_id = id; } /** * Where/when are they modified? */ vector OPARI2_Directive:: s_common_block; OPARI2_Directive* OPARI2_Directive::s_outer = NULL; int OPARI2_Directive:: s_num_all_regions = 0; string OPARI2_Directive:: s_inode_compiletime_id; OPARI2_Language_t OPARI2_Directive::s_lang = L_NA; OPARI2_Format_t OPARI2_Directive:: s_format = F_NA; bool OPARI2_Directive:: s_keep_src_info = false; bool OPARI2_Directive:: s_preprocessed_file = false; opari2-2.0.10/src/opari/PaxHeaders/opari2_directive_entry.h0000644000000000000000000000013215232670204020572 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.167261927 opari2-2.0.10/src/opari/opari2_directive_entry.h0000664000175100001440000000325715232670204021133 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry.h * * @brief Macro definitions for the creation of the table holding all * supported directives */ #ifndef OPARI2_DIRECTIVE_ENTRY_H #define OPARI2_DIRECTIVE_ENTRY_H /** * @brief MACRO definition for the creation of a directive table entry * with a corresponding end-directive. */ #define OPARI2_CREATE_TABLE_ENTRY( type, name, loop, disable_with_paradigm, version, group, paradigm ) \ { type, #name, "end" #name, #version, group, true, true, true, loop, false, disable_with_paradigm, h_ ## paradigm ## _ ## name, h_end_ ## paradigm ## _ ## name } /** * @brief MACRO definition for the creation of a directive table entry * without a corresponding end-directive. */ #define OPARI2_CREATE_TABLE_ENTRY_NOEND( type, name, loop, version, group, paradigm ) \ { type, #name, "", #version, group, true, true, false, loop, false, true, h_ ## paradigm ## _ ## name, NULL } /** * @brief MACRO definition for the creation of a directive table entry * for a directive that applies only to the next statement. */ #define OPARI2_CREATE_TABLE_ENTRY_SINGLE_STATEMENT( type, name, loop, disable_with_paradigm, version, group, paradigm ) \ { type, #name, "", #version, group, true, true, true, loop, true, disable_with_paradigm, h_ ## paradigm ## _ ## name, h_end_ ## paradigm ## _ ## name } #endif opari2-2.0.10/src/opari/PaxHeaders/opari2_directive_definition.h0000644000000000000000000000013115232670204021560 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 29 ctime=1785426078.16326195 opari2-2.0.10/src/opari/opari2_directive_definition.h0000664000175100001440000000561115232670204022116 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_definition.h * * @brief This file defines data structures to represent directive and runtime API. */ #ifndef OPARI2_DIRECTIVE_DEFINITION_H #define OPARI2_DIRECTIVE_DEFINITION_H #include #include using std::ostream; #include using std::string; #include "opari2.h" #include "opari2_directive.h" typedef void ( * DirectiveHandler )( OPARI2_Directive*, ostream& ); /** * @brief Structure definition for a paradigm directive. */ typedef struct { OPARI2_ParadigmType_t type; /**< paradigm the directive belongs to. */ const string name; /**< directive name. */ const string end_name; /**< directive closing name, if any. */ const string version; /**< version of standard/specification. */ uint64_t group; /**< group the directive belongs to */ bool active; /**< directive enabled? */ bool inner_active; /**< inner begin/end instrumentation enabled? */ bool require_end; /**< need end handling? */ bool loop_block; /**< Directive must be followed by a loop */ bool single_statement; /**< Directive only applies to the next statement */ bool disable_with_paradigm; /**< Specfies whether this directive gets instrumented, even when the paradigm is disabled, e.g. omp parallel */ DirectiveHandler do_enter_transformation; /**< handler for region enter instrumentation */ DirectiveHandler do_exit_transformation; /**< handler for region exit instrumentation */ } OPARI2_DirectiveDefinition; /** * @brief Structure definition for a paradigm runtime API. */ typedef struct { OPARI2_ParadigmType_t type; /**< paradigm the API belongs to */ const string name; /**< API name */ const string version; /**< version of standard/specification */ uint64_t group; /**< group the API belongs to */ bool active; /**< API enabled? */ const string wrapper; /**< name of the wrapper funtion */ const string header_file_c; /***< name of the include file of the API */ const string header_file_f; /***< name of the include file of the API */ } OPARI2_RuntimeAPIDefinition; #endif // OPARI2_DIRECTIVE_DEFINITION_H opari2-2.0.10/src/opari/PaxHeaders/opari2_directive_manager.h0000644000000000000000000000013015232670204021041 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.255415263 29 ctime=1785426078.16326195 opari2-2.0.10/src/opari/opari2_directive_manager.h0000664000175100001440000001263015232670204021377 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_manager.h * * @brief Interface declaration of 'DirectiveManager' */ #ifndef OPARI2_DIRECTIVE_MANAGER_H #define OPARI2_DIRECTIVE_MANAGER_H #include using std::vector; #include using std::map; #include using std::stack; #include using std::string; #include #include "opari2_directive.h" /* Map entry. Matches string to enum */ typedef struct { /** string representation*/ string mString; /** matching region type*/ int mEnum; } OPARI2_MapString2ParadigmNameType; /** @brief Disables the instrumentation of whole paradigms or specific * directives. * * Check if the combination of directive/paradigm is supported by * looking up the directive_table. * * @param paradigm name of the paradigm. * @param directive name of the directive. * * @return true ONLY if the combination of paradigm and directive * is found in the diretive_table. * false otherwise. */ bool DisableParadigmDirectiveOrGroup( const string& paradigm, const string& directiveOrGroup, bool inner ); /** * @brief Different levels for full or partial disabling if * instrumentation. * * Bitfield for disabling specific types of instrumentation. E.g. for * OpenMP, when POMP directives are used to disable instrumentation * (D_USER) it must still be activated for the parallel regions so a * measurement system can manage events for different threads in a * threadsafe manner. For the case that code is put on a device where * there is no measurement system, even this instrumentation must be * disabled, thus the level D_FULL. */ typedef enum { D_NONE = 0x00000000, D_USER = 0x00000001, D_FULL = 0xFFFFFFFF } OPARI2_Disable_level_t; /** @brief Disables instrumentation for a specified level */ void DisableInstrumentation( OPARI2_Disable_level_t l ); /** @brief Re-enables instrumentation for a specified level */ void EnableInstrumentation( OPARI2_Disable_level_t l ); /** @brief Checks whether instrumentation for a specified level is * disabled. * * This function checks whether instrumentation for the requested * level or a superior level is disabled. * * @param l specific level to check for * * @return true if current disable level is D_NONE * or l is in the group of current level */ bool InstrumentationDisabled( OPARI2_Disable_level_t l = D_NONE ); bool IsValidSentinel( const string& lowline, string::size_type p, string& sentinel ); /** * @brief Check the validality of a given paradigm and directive. * * Check if the combination of directive/paradigm is supported by * looking up the directive_table. * * @param paradigm name of the paradigm. * @param directive name of the directive. * * @return true ONLY if the combination of paradigm and directive * is found in the directive_table. * false otherwise. */ bool IsValidDirective( const string& paradigm, string& directive ); /** * @brief Check if a directive's active flag is true. * * @param type type of the paradigm. * @param directive name of the directive. * * @return the active member of the to @a directive corresponding * directive_table entry. Return false if no directive_table entry * could be found. */ bool DirectiveActive( OPARI2_ParadigmType_t type, const std::string& directive ); OPARI2_Directive* NewDirective( vector& lines, vector& directive_prefix, OPARI2_Language_t lang, const string& file, const int lineno ); void SetLoopDirective( OPARI2_Directive* d ); OPARI2_Directive* GetLoopDirective( void ); void ProcessDirective( OPARI2_Directive* d, ostream& os, bool* require_end = NULL, bool* is_for = NULL ); bool IsSupportedAPIHeaderFile( const string& include_file, OPARI2_Language_t lang ); /** * @brief Replace a runtime API in the line with its wrapper API if enabled. */ void ReplaceRuntimeAPI( string& lowline, string& line, const string& file, OPARI2_Language_t lang ); void SaveForInit( OPARI2_Directive* d ); void DirectiveStackPush( OPARI2_Directive* d ); OPARI2_Directive* DirectiveStackTop( OPARI2_Directive* d = NULL ); void DirectiveStackPop( OPARI2_Directive* d = NULL ); void PrintDirectiveStackTop( void ); void DirectiveStackInsertDescr( int ); /** * @brief Generate the final *.opari.inc file. * * Need revision if multiple kinds of paradigms are used in the source * fle. Current implementation considers OpenMP and POMP ONLY! * */ void Finalize( OPARI2_Option_t& options ); void SaveSingleLineDirective( OPARI2_Directive* d ); void HandleSingleLineDirective( const int lineno, ostream& os ); #endif // OPARI2_DIRECTIVE_MANAGER_H opari2-2.0.10/src/opari/PaxHeaders/opari2_directive_manager.cc0000644000000000000000000000013015232670204021177 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.255415263 29 ctime=1785426078.16326195 opari2-2.0.10/src/opari/opari2_directive_manager.cc0000664000175100001440000006644315232670204021550 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_manager.cc * * @brief This file contains APIs to disable, process directive * and runtime entries in a separate namespace. */ #include #include using std::cerr; #include using std::string; #include using std::vector; #include using std::map; #include using std::stack; #include #include using std::toupper; #include "opari2.h" #include "opari2_directive_definition.h" #include "opari2_directive_manager.h" #include "openmp/opari2_omp_handler.h" #include "openmp/opari2_directive_openmp.h" #include "openmp/opari2_directive_entry_openmp.h" #include "pomp/opari2_pomp_handler.h" #include "pomp/opari2_directive_pomp.h" #include "pomp/opari2_directive_entry_pomp.h" #include "offload/opari2_offload_handler.h" #include "offload/opari2_directive_offload.h" #include "offload/opari2_directive_entry_offload.h" static const OPARI2_MapString2ParadigmNameType paradigm_identifiers[] = { OPARI2_OPENMP_SENTINELS, OPARI2_POMP2_USER_SENTINELS, OPARI2_OFFLOAD_SENTINELS }; /** * @brief Array holding all definitions for all supported directives * of all supported paradigms. */ OPARI2_DirectiveDefinition directive_table[] = { OPARI2_OPENMP_DIRECTIVE_ENTRIES, OPARI2_POMP_DIRECTIVE_ENTRIES, //OPARI2_OPENACC_DIRECTIVE_ENTRIES, //OPARI2_TMSE_DIRECTIVE_ENTRIES, OPARI2_OFFLOAD_DIRECTIVE_ENTRIES }; /** * @brief Array holding all definitions for all supported API * functions of all supported paradigms. */ OPARI2_RuntimeAPIDefinition api_table[] = { OPARI2_OPENMP_API_ENTRIES //OPARI2_OPENACC_API_ENTRIES }; OPARI2_Directive* saved_single_line_directive = NULL; /** * @brief Convert paradigm string to ParadigmType. */ OPARI2_ParadigmType_t string_to_paradigm_type( const string& str ) { int n = sizeof( paradigm_identifiers ) / sizeof( OPARI2_MapString2ParadigmNameType ); for ( int i = 0; i < n; i++ ) { if ( str.compare( paradigm_identifiers[ i ].mString ) == 0 ) // if( str == paradigm_identifiers[ i ].mString ) { return ( OPARI2_ParadigmType_t )paradigm_identifiers[ i ].mEnum; } } return OPARI2_PT_NONE; } string paradigm_type_to_string( OPARI2_ParadigmType_t type ) { string str; switch ( type ) { case OPARI2_PT_OMP: str = "OpenMP"; break; case OPARI2_PT_POMP: str = "POMP"; break; case OPARI2_PT_OPENACC: str = "OpenACC"; break; case OPARI2_PT_OFFLOAD: str = "Offload"; break; case OPARI2_PT_TMSE: str = "TMSE"; break; default: str = "Unknown paradigm type"; break; } return str; } /** * @brief Convert group name to group number (uint64_t). * * In case of the same group names in different paradigm, * ParadigmType is used jointly to get a correct group number. * * @param [in] type paradigm type * @param [in] str group name in string * * @return G_NONE: conversion failed * others: OK */ uint64_t string_to_group( OPARI2_ParadigmType_t type, const string& str ) { switch ( type ) { case OPARI2_PT_OMP: return OPARI2_DirectiveOpenmp::String2Group( str ); case OPARI2_PT_POMP: return OPARI2_DirectivePomp::String2Group( str ); case OPARI2_PT_OFFLOAD: return OPARI2_DirectiveOffload::String2Group( str ); case OPARI2_PT_TMSE: default: return G_OMP_NONE; } } vector tmp_directives; vector directive_vec; vector directive_stack; /** * Keep track of the paradigm used in the source file. * Can be 'OR'ed with multiple paradigm types */ uint32_t instrumented_paradigm_type = 0; bool pomp2_header_included = false; bool DisableParadigmDirectiveOrGroup( const string& paradigm, const string& directiveOrGroup, bool inner ) { OPARI2_ParadigmType_t type = string_to_paradigm_type( paradigm ); if ( type == OPARI2_PT_NONE ) { cerr << "Unknown paradigm " << paradigm << std::endl; return false; } bool disableWholeParadigm = directiveOrGroup.compare( "" ) == 0; OPARI2_ParadigmType par_type = string_to_paradigm_type( paradigm ); uint64_t group = string_to_group( par_type, directiveOrGroup ); if ( !disableWholeParadigm && group == 0 && !IsValidDirective( paradigm, ( string& )directiveOrGroup ) ) { cerr << "Unknown group or directive: " << directiveOrGroup << std::endl; return false; } int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == directive_table[ i ].type && ( ( disableWholeParadigm && directive_table[ i ].disable_with_paradigm ) || directiveOrGroup.compare( directive_table[ i ].name ) == 0 || directive_table[ i ].group & group ) ) { // printf( "Disabling directive: %s:%s inner:%d\n", paradigm.c_str(), directive_table[ i ].name.c_str(), inner ); if ( inner ) { directive_table[ i ].inner_active = false; } else { directive_table[ i ].active = false; } } } size = sizeof( api_table ) / sizeof( OPARI2_RuntimeAPIDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == api_table[ i ].type && ( disableWholeParadigm || api_table[ i ].group & group ) ) { api_table[ i ].active = false; } } return true; } typedef pair OPARI2_Disable_level_cur_max_t; static stack disable_levels( std::deque( 1, OPARI2_Disable_level_cur_max_t( D_NONE, D_NONE ) ) ); void DisableInstrumentation( OPARI2_Disable_level_t l ) { OPARI2_Disable_level_cur_max_t level; level.first = l; level.second = ( OPARI2_Disable_level_t )( l | disable_levels.top().second ); disable_levels.push( level ); } void EnableInstrumentation( OPARI2_Disable_level_t l ) { disable_levels.pop(); if ( disable_levels.empty() ) { cerr << "Invalid nesting of regions, disabling certain instrumentation. " << "Check usage of pomp noinstrument/instrument directives." << std::endl; cleanup_and_exit(); } } bool InstrumentationDisabled( OPARI2_Disable_level_t l ) { /* This works for now (only one group and one sublevel */ return disable_levels.top().second != D_NONE && l <= disable_levels.top().second; /* If more fields are added it might be changed to something like the expression below */ // return ( disable_levels.top().second != D_NONE && // ( ( l < disable_levels.top().second && l | disable_levels.top().second ) || // ( l == disable_levels.top().second ) ) ); } bool IsValidSentinel( const string& lowline, string::size_type p, string& sentinel ) { int n = sizeof( paradigm_identifiers ) / sizeof( OPARI2_MapString2ParadigmNameType ); for ( int i = 0; i < n; i++ ) { if ( lowline.find( paradigm_identifiers[ i ].mString ) == p ) { sentinel = paradigm_identifiers[ i ].mString; return true; } } return false; } bool IsValidDirective( const string& paradigm, string& directive ) { OPARI2_ParadigmType_t type = string_to_paradigm_type( paradigm ); int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( ( type == directive_table[ i ].type ) && ( directive.compare( directive_table[ i ].name ) == 0 ) ) { return true; } } return false; } /** * @brief Check if a given paradigm/directive is enabled. * * @param type name of the paradigm type. * @param directive name of the directive. * * @return true if the given directive is found in the "directive_table" and enabled. false otherwise. */ bool directive_enabled( OPARI2_ParadigmType_t type, string& directive ) { int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == directive_table[ i ].type && ( directive.compare( directive_table[ i ].name ) == 0 || directive.compare( directive_table[ i ].end_name ) == 0 ) ) { // We know the directive. // It might be disabled, indicated by the active flag. // The active flag is evaluated in ProcessDirective() and // HandleSingleLineDirective(); if inactive, the directive is printed // preceded by a #line directive. IMO (CF) the #line directive makes // no sense but if it is omitted, make check fails. Therefore just // return true instead of directive_table[ i ].active. return true; } } // We don't know the directive. return false; } OPARI2_DirectiveDefinition* get_directive_table_entry( OPARI2_ParadigmType_t type, const std::string& directive ) { int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == directive_table[ i ].type && directive.compare( directive_table[ i ].name ) == 0 ) { return ( OPARI2_DirectiveDefinition* )( &( directive_table[ i ] ) ); } } return NULL; } /** * @brief Given a OPARI2_Directive object, get the matching entry in * the directive_table. * * The entry is matching if both the type and name are the same as the * object. */ OPARI2_DirectiveDefinition* get_directive_table_entry( OPARI2_Directive* d ) { return get_directive_table_entry( d->GetParadigmType(), d->GetName() ); } bool DirectiveActive( OPARI2_ParadigmType_t type, const std::string& directive ) { OPARI2_DirectiveDefinition* d = get_directive_table_entry( type, directive ); if ( d ) { return d->active; } return false; } OPARI2_Directive* NewDirective( vector& lines, vector& directive_prefix, OPARI2_Language_t lang, const string& file, const int lineno ) { OPARI2_ParadigmType_t type = OPARI2_PT_NONE; OPARI2_Directive* new_directive = NULL; string sentinel; if ( directive_prefix.size() ) { sentinel = directive_prefix[ directive_prefix.size() - 1 ]; type = string_to_paradigm_type( sentinel ); } else if ( lang & L_C_OR_CXX ) { /* If the directive_prefix is not provided, this is an * automatically generated end region directive */ type = DirectiveStackTop()->GetParadigmType(); } else { cerr << "ERROR: Undefined directive type!\n"; cleanup_and_exit(); } OPARI2_DirectiveDefinition* d_def; switch ( type ) { case OPARI2_PT_OMP: new_directive = new OPARI2_DirectiveOpenmp( file, lineno, lines, directive_prefix ); /* Needed for Fortran end do loop detection */ d_def = get_directive_table_entry( new_directive ); if ( d_def ) { new_directive->NeedsEndLoopDirective( d_def->loop_block ); } break; case OPARI2_PT_POMP: new_directive = new OPARI2_DirectivePomp( file, lineno, lines, directive_prefix ); break; case OPARI2_PT_OFFLOAD: new_directive = new OPARI2_DirectiveOffload( file, lineno, lines, directive_prefix ); break; /*no directives supported so far for openacc and tmse*/ case OPARI2_PT_NONE: case OPARI2_PT_OPENACC: case OPARI2_PT_TMSE: break; } if ( new_directive ) { if ( directive_enabled( type, new_directive->GetName() ) || new_directive->GetName() == "$END$" ) { tmp_directives.push_back( new_directive ); return new_directive; } delete new_directive; } return NULL; } void ProcessDirective( OPARI2_Directive* d, ostream& os, bool* require_end, bool* is_for ) { OPARI2_DirectiveDefinition* d_def = NULL; string name = d->GetName(); //std::cout << "Processing " << name << std::endl; if ( name == "$END$" || // end of a directive (block) in C/C++ ( name.find( "end" ) != string::npos && // end of a directive (block) in Fortran name != "instaltend" && name != "instend" ) ) // except for POMP directive "inst altend/end" { // get the directive object at the top of the stack OPARI2_Directive* d_top = DirectiveStackTop( d ); if ( d->GetParadigmType() != d_top->GetParadigmType() ) { cerr << "\nWrong directive type for 'END' processing!\n"; } d_def = get_directive_table_entry( d_top ); if ( d_def ) { d->active = d_def->active; } else { d->active = true; } if ( d_def && d_def->active ) // enabled { if ( d_def->do_exit_transformation ) { d_def->do_exit_transformation( d, os ); } } else //disabled { if ( d_top->GetName() == "parallelfor" || d_top->GetName() == "paralleldo" || d_top->GetName() == "parallelsections" ) { d_def->do_exit_transformation( d, os ); } else { //simply output lines without any modification d->PrintDirective( os ); } // maintain the directive stack if ( d_def->require_end ) { DirectiveStackPop(); } } } else // beginning of a directive (block) { d_def = get_directive_table_entry( d ); if ( d_def ) { d->active = d_def->active; } else { d->active = true; } if ( d_def && d_def->active ) { instrumented_paradigm_type |= d_def->type; //std::cout << "Doing enter transformation" << std::endl; d_def->do_enter_transformation( d, os ); if ( require_end ) { *require_end = d_def->require_end; } if ( is_for ) { *is_for = ( name == "for" || name == "parallelfor" ); } } else // the directive is disabled { if ( d_def == NULL ) { // Unsupported directives should be ignored silently! // cerr << "Unsupported / invalid directive keyword \"" << d->GetName() << "\"\n"; } else { if ( require_end ) { *require_end = d_def->require_end; } /* * If the directive is disabled, always set 'is_for' to false */ if ( is_for ) { *is_for = false; } /** Even if the directive is disabled and not * instrumented, The directive, if requires "END", * should still be pushed onto the stack, so the * "END" directive can find the corresponding * end. */ if ( d_def->require_end ) { DirectiveStackPush( d ); } if ( d_def->single_statement ) { SaveSingleLineDirective( d ); } /** Directives that might be implicitly ended by the * end of a do loop*/ d->NeedsEndLoopDirective( d_def->loop_block ); } if ( name == "parallelfor" || name == "paralleldo" || name == "parallelsections" ) { instrumented_paradigm_type |= d_def->type; d_def->do_enter_transformation( d, os ); } else { // if disabled, simply output lines, without any modification d->PrintDirective( os ); } } } return; } /** @brief Check whether the current line is an omp function declaration */ bool is_runtime_decl( const string& file, const string& header_file ) { // If it is in the header file, its a declaration string::size_type pos = file.length() - header_file.length() - 1; return file == header_file || ( file[ pos ] == '/' && file.substr( pos + 1 ) == header_file ); } /** Replaces a runtime call with the wrapper function. This function is currently used only by the Fortran parser */ void ReplaceRuntimeAPI( string& lowline, string& line, const string& file, OPARI2_Language_t lang ) { size_t i = 0; size_t pos = 0; if ( InstrumentationDisabled() ) { return; } //Functions my not be replaced in a line like: use omp_lib, only: omp_init_lock if ( lowline.find( ":", lowline.find( "only", lowline.find( "omp_lib", lowline.find( "use" ) ) ) ) != string::npos ) { return; } for ( i = 0; i < sizeof( api_table ) / sizeof( OPARI2_RuntimeAPIDefinition ); i++ ) { pos = 0; if ( api_table[ i ].active && !( lang & L_FORTRAN && is_runtime_decl( file, api_table[ i ].header_file_f ) ) && !( lang & L_C_OR_CXX && is_runtime_decl( file, api_table[ i ].header_file_c ) ) ) { while ( ( pos = lowline.find( api_table[ i ].name, pos ) ) != string::npos ) { /** * when "omp_test_lock" and "omp_test_nest_lock" functions are defined, * they may not be replaced. */ if ( ( !api_table[ i ].name.find( "test" ) ) || !( lowline.find( "logical" ) < pos ) ) { instrumented_paradigm_type |= api_table[ i ].type; line.replace( pos, 3, "POMP2" ); //Keep other letters unchanged, except for line[ pos + 6 ] line[ pos + 6 ] = std::toupper( line[ pos + 6 ] ); } pos += api_table[ i ].name.length(); } } } } set header_files_f; set header_files_c; bool IsSupportedAPIHeaderFile( const string& include_file, OPARI2_Language_t lang ) { if ( header_files_f.empty() || header_files_c.empty() ) { for ( unsigned long i = 0; i < sizeof( api_table ) / sizeof( OPARI2_RuntimeAPIDefinition ); i++ ) { header_files_f.insert( api_table[ i ].header_file_f ); header_files_c.insert( api_table[ i ].header_file_c ); } } string file; set::iterator it, itb, ite; if ( lang & L_FORTRAN ) { itb = header_files_f.begin(); ite = header_files_f.end(); if ( ( *( include_file.begin() ) == '\"' && *( include_file.end() - 1 ) == '\"' ) || ( *( include_file.begin() ) == '\'' && *( include_file.end() - 1 ) == '\'' ) ) { file = include_file.substr( 1, include_file.length() - 2 ); } } else if ( lang & L_C_OR_CXX ) { itb = header_files_c.begin(); ite = header_files_c.end(); if ( ( *( include_file.begin() ) == '\"' && *( include_file.end() - 1 ) == '\"' ) || ( *( include_file.begin() ) == '<' && *( include_file.end() - 1 ) == '>' ) ) { file = include_file.substr( 1, include_file.length() - 2 ); } } if ( file.empty() ) { return false; } for ( it = itb; it != ite; ++it ) { if ( *it == file ) { if ( file == "omp.h" || file == "omp_lib.h" ) { // If we remove the api include, we must generate a // header to include it again via .opari.inc. instrumented_paradigm_type |= OPARI2_PT_OMP; } return true; } } return false; } void SaveForInit( OPARI2_Directive* d ) { if ( !tmp_directives.empty() ) { vector::iterator it = tmp_directives.begin(); while ( it != tmp_directives.end() ) { if ( *it == d ) { it = tmp_directives.erase( it ); break; } else { ++it; } } } directive_vec.push_back( d ); } void DirectiveStackPush( OPARI2_Directive* d ) { directive_stack.push_back( d ); } OPARI2_Directive* DirectiveStackTop( OPARI2_Directive* d ) { if ( directive_stack.empty() ) { if ( d ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":" << "ERROR: unbalanced pragma/directive nesting for " << d->GetName() << " directive \n"; } else { cerr << "ERROR: unbalanced pragma/directive nesting!\n"; } cleanup_and_exit(); } else { return directive_stack.back(); } return NULL; } void DirectiveStackPop( OPARI2_Directive* d ) { OPARI2_Directive* d_top = DirectiveStackTop( d ); if ( !tmp_directives.empty() ) { vector::iterator it = tmp_directives.begin(); while ( it != tmp_directives.end() ) { if ( *it == d_top ) { /* This is the only reference left to this directive, so perform cleanup */ tmp_directives.erase( it ); directive_stack.pop_back(); delete d_top; return; } else { ++it; } } } directive_stack.pop_back(); } void PrintDirectiveStackTop( void ) { if ( directive_stack.empty() ) { cerr << "Error: Directive stack empty \n"; cleanup_and_exit(); } else { OPARI2_Directive* d = directive_stack.back(); if ( d ) { cerr << " near \"" << paradigm_type_to_string( d->GetParadigmType() ) << ": " << d->GetName() << "\" construct at " << d->GetFilename() << ":" << d->GetLineno() << std::endl; } } } void DirectiveStackInsertDescr( int id ) { for ( vector::iterator it = directive_stack.begin(); it != directive_stack.end(); ++it ) { if ( !( ( *it )->DescrsEmpty() ) ) { ( *it )->InsertDescr( id ); } } } void Finalize( OPARI2_Option_t& options ) { // check region stack if ( !directive_stack.empty() ) { cerr << "ERROR: unbalanced pragma/directive nesting\n"; while ( !directive_stack.empty() ) { PrintDirectiveStackTop(); DirectiveStackPop(); } cleanup_and_exit(); } // generate opari include file ofstream incs( options.incfile.c_str() ); if ( !incs ) { cerr << "ERROR: cannot open opari include file " << options.incfile << "\n"; exit( 1 ); } if ( options.lang & L_C_OR_CXX ) { /** In order to please the PGI compiler, the order of the header * generation between OpenMP and user instrumentation must not * be switched. Take care to test additions in that respect. * * The error that was encountered was that the * threadprivate(pomp_tpd) that is added for the * --thread=omp:pomp_tpd option caused: * "PGCC-S-0155-pomp_tpd_ is not threadprivate * (.../jacobi/cxx/main.cpp: 167) PGCC/x86 Linux 14.1-0: * compilation completed with severe errors" */ if ( instrumented_paradigm_type & OPARI2_PT_POMP ) { OPARI2_DirectivePomp::GenerateHeader( incs ); } if ( instrumented_paradigm_type & OPARI2_PT_OMP ) { OPARI2_DirectiveOpenmp::GenerateHeader( incs ); } } if ( directive_vec.size() ) { for ( vector::iterator it = directive_vec.begin(); it != directive_vec.end(); ++it ) { if ( ( *it )->GetName() != "offload" && ( *it )->GetName() != "declspec" ) { ( *it )->GenerateDescr( incs ); } } } if ( options.lang & L_FORTRAN ) { OPARI2_Directive::FinalizeFortranDescrs( incs ); OPARI2_DirectiveOpenmp::GenerateInitHandleCalls( options.os, options.incfile_nopath ); OPARI2_DirectiveOpenmp::FinalizeDescrs( incs ); OPARI2_DirectivePomp::GenerateInitHandleCalls( options.os, options.incfile_nopath ); } else if ( options.lang & L_C_OR_CXX ) { OPARI2_DirectiveOpenmp::GenerateInitHandleCalls( incs ); OPARI2_DirectivePomp::GenerateInitHandleCalls( incs ); } /*cleanup tmp_directives and directive_vec vectors*/ for ( vector::iterator it = tmp_directives.begin(); it != tmp_directives.end(); it++ ) { delete *it; } for ( vector::iterator it = directive_vec.begin(); it != directive_vec.end(); it++ ) { delete *it; } } void SaveSingleLineDirective( OPARI2_Directive* d ) { saved_single_line_directive = d; } void HandleSingleLineDirective( const int lineno, ostream& os ) { if ( saved_single_line_directive ) { OPARI2_DirectiveDefinition* d_def = get_directive_table_entry( saved_single_line_directive ); if ( d_def->active ) { /** @TODO This is currently the only case, nonetheless it should be generalized */ extra_openmp_atomic_handler( saved_single_line_directive, lineno, os ); } else { DirectiveStackPop(); saved_single_line_directive = NULL; } } } opari2-2.0.10/src/opari/PaxHeaders/opari2_parser_f.cc0000644000000000000000000000013115232670204017331 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.255415263 30 ctime=1785426078.159261974 opari2-2.0.10/src/opari/opari2_parser_f.cc0000664000175100001440000011527015232670204017672 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2014, 2016, 2025, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_parser_f.cc * * @brief All functions to parse fortran files are collected here. */ #include #include using std::tolower; using std::toupper; #include using std::string; #include using std::getline; #include using std::transform; using std::sort; using std::min; #include using std::strlen; using std::remove_if; #include "config.h" #include "opari2_parser_f.h" #include "opari2_directive_manager.h" struct fo_tolower { int operator()( int x ) const { return std::tolower( x ); } }; OPARI2_FortranParser::OPARI2_FortranParser( OPARI2_Option_t& options ) : m_options( options ), m_os( options.os ), m_is( options.is ) { m_line = ""; m_lowline = ""; m_unprocessed_line = ""; m_lineno = 0; //m_loop_directives = NULL; m_need_pragma = false; m_in_string = 0; m_normal_line = false; m_in_header = false; m_continuation = false; m_sentinel = ""; m_offload_pragma = false; m_offload_attribute = ""; m_current_offload_function = ""; m_offload_subroutine = false; m_offload_function = false; m_waitfor_loopstart = false; m_waitfor_loopend = false; m_lineno_loopend = 0; m_curr_file = m_options.infile; if ( m_options.keep_src_info ) { /** The preprocessor of the Sun Studio compiler breaks if the * first line is a preprocessor directive, so we insert a * blank line at the beginning */ m_os << std::endl; m_os << "#line 1 \"" << m_options.infile << "\"" << "\n"; } } /**@brief Check if the line belongs to the header of a subroutine or function. * After lines in the header, we can insert our variable definitions.*/ bool OPARI2_FortranParser::is_sub_unit_header( void ) { string sline; string lline; string keyword; bool result; static bool continuation = false; static int openbrackets = 0; static bool inProgram = false; static bool inModule = false; static bool inInterface = false; static bool inContains = false; size_t pos; pos = m_lowline.find_first_not_of( " \t" ); /*string is empty*/ if ( pos == string::npos ) { pos = 0; sline.clear(); } else { sline = m_lowline.substr( pos ); } lline = sline; sline.erase( remove_if( sline.begin(), sline.end(), isspace ), sline.end() ); //Set number of open brackets to 0 if new unit begins, since we might have missed //closing brackets on continuation lines. if ( ( ( sline.find( "program" ) == 0 ) && lline.find( "program" ) != string::npos ) || ( ( sline.find( "module" ) == 0 ) && !inProgram && lline.find( "module" ) != string::npos ) || ( ( sline.find( "interface" ) == 0 ) && inModule && lline.find( "interface" ) != string::npos ) || ( ( sline.find( "abstractinterface" ) == 0 ) && inModule ) || ( ( sline.find( "contains" ) != string::npos ) && inModule && lline.find( "contains" ) != string::npos ) || ( sline.find( "subroutine" ) == 0 && lline.find( "subroutine" ) != string::npos ) || ( ( sline.find( "function" ) == 0 && lline.find( "function" ) != string::npos ) && !m_in_header && ( ( sline.find( "=" ) >= sline.find( "!" ) ) || ( sline.find( "=" ) >= sline.find( "kind" ) ) ) ) ) { openbrackets = 0; } //Check if we are in Fortran77 and have a character in column 6 if ( ( m_options.form & F_FIX ) && m_lowline.length() >= 6 && m_lowline[ 5 ] != ' ' && m_lowline.find( "\t" ) > 6 ) { continuation = true; } //Check if we enter a program block inProgram = inProgram || ( sline.find( "program" ) == 0 ); //Check if we enter a module block inModule = !inProgram && ( inModule || ( sline.find( "module" ) == 0 ) && sline.find( "subroutine" ) == string::npos ); //Check if we enter an interface block inInterface = inModule && ( inInterface || ( sline.find( "interface" ) == 0 ) || ( sline.find( "abstractinterface" ) == 0 ) ); //Check if we enter a contains block inContains = inModule && ( inContains || ( sline.find( "contains" ) != string::npos ) ); //search for words indicating, that we did not reach a point where //we can insert variable definitions, these keywords are: //program, function, result, subroutine, save, implicit, parameter, //and use bool func = ( ( lline.find( "function" ) != string::npos ) && !( lline.find( "function" ) > lline.find( "pure" ) ) && !( lline.find( "function" ) > lline.find( "elemental" ) ) && !( lline.length() >= ( lline.find( "function" ) + 8 ) && ( isalnum( lline[ lline.find( "function" ) + 8 ] ) || ( lline[ lline.find( "function" ) + 8 ] == '_' ) ) ) && !( ( lline.find( "function" ) != 0 ) && ( isalnum( lline[ lline.find( "function" ) - 1 ] ) || ( lline[ lline.find( "function" ) - 1 ] == '_' ) ) ) && ( isalpha( sline[ sline.find( "function" ) + 8 ] ) || sline[ sline.find( "function" ) + 8 ] == '&' ) ); bool sub = ( ( lline.find( "subroutine" ) != string::npos ) && !( lline.find( "subroutine" ) > lline.find( "pure" ) ) && !( lline.find( "subroutine" ) > lline.find( "elemental" ) ) && !( lline.length() >= ( lline.find( "subroutine" ) + 10 ) && ( isalnum( lline[ lline.find( "subroutine" ) + 10 ] ) || ( lline[ lline.find( "subroutine" ) + 10 ] == '_' ) ) ) && !( ( lline.find( "subroutine" ) != 0 ) && ( isalnum( lline[ lline.find( "subroutine" ) - 1 ] ) || ( lline[ lline.find( "subroutine" ) - 1 ] == '_' ) ) ) && ( isalpha( sline[ sline.find( "subroutine" ) + 10 ] ) || sline[ sline.find( "subroutine" ) + 10 ] == '&' ) ); bool key = ( ( sline.find( "save" ) == 0 && m_in_header ) || ( sline.find( "result" ) == 0 && m_in_header ) || ( sline.find( "implicit" ) == 0 && m_in_header ) || ( sline.find( "use" ) == 0 && m_in_header ) || ( sline.find( "include" ) == 0 && m_in_header ) ); bool noend = ( sline.find( "endfunction" ) == string::npos && sline.find( "endsubroutine" ) == string::npos && sline.find( "endmodule" ) == string::npos && sline.find( "endprogram" ) == string::npos ); size_t pos_e = sline.find( "=" ); bool validequal = ( pos_e >= sline.find( "!" ) || pos_e > sline.find( "kind" ) || pos_e > sline.find( "only:" ) || pos_e == ( sline.find( ">" ) - 1 ) || pos_e > sline.find( "bind(" ) ); bool misc = ( ( sline.find( "#" ) == 0 && m_in_header ) || ( sline.find( "&" ) == 0 && m_in_header ) || ( sline.empty() && m_in_header ) || ( sline.find( "parameter" ) == 0 && m_in_header ) || ( sline.find( "dimension" ) == 0 && m_in_header ) || ( openbrackets != 0 && m_in_header ) || ( continuation && m_in_header ) ); /* Debug output */ /*std::cout << std::endl << lline << std::endl; std::cout << "continuation= " << continuation << std::endl; std::cout << "m_in_header= " << m_in_header << std::endl; std::cout << "func= " << func << std::endl; std::cout << "sub= " << sub << std::endl; std::cout << "key= " << key << std::endl; std::cout << "validequal= " << validequal << std::endl; std::cout << "misc= " << misc << std::endl; std::cout << "openbrackets= " << openbrackets << std::endl; std::cout << "inModule= " << inModule << std::endl; std::cout << "inInterface= " << inInterface << std::endl; std::cout << "inContains= " << inContains << std::endl; std::cout << "noend= " << noend << std::endl;*/ if ( ( ( sline.find( "program" ) == 0 || func || sub || key ) && noend && validequal ) || misc ) { result = !inModule || ( !inInterface && inContains ); } else { result = false; } //Check if we leave a program block inProgram = inProgram && sline.find( "endprogram" ) == string::npos; //Check if we leave a module block inModule = inModule && sline.find( "endmodule" ) == string::npos; //Check if we leave an interface block inInterface = inInterface && sline.find( "endinterface" ) == string::npos; //Check if we leave an contains block inContains = inContains && sline.find( "endmodule" ) == string::npos; if ( sline.length() && sline[ sline.length() - 1 ] == '&' ) { continuation = true; } else { continuation = false; } /*count open brackets, to see if a functionheader is split across different lines*/ for ( string::size_type i = 0; i < m_lowline.length(); i++ ) { bool in_string = false; if ( m_lowline[ i ] == '(' ) { openbrackets++; } if ( m_lowline[ i ] == ')' ) { openbrackets--; } if ( ( m_lowline[ i ] == '\'' || m_lowline[ i ] == '"' ) && in_string ) { in_string = false; } else { in_string = true; } /*rest of line is a comment*/ if ( m_lowline[ i ] == '!' && !in_string ) { break; } } return result; } bool OPARI2_FortranParser::is_empty_line( void ) { return m_lowline.find_first_not_of( " \t" ) == string::npos; } /**@brief check if this line is a comment line*/ bool OPARI2_FortranParser::is_comment_line( void ) { if ( m_options.form & F_FIX ) { if ( m_lowline[ 0 ] == '!' || m_lowline[ 0 ] == '*' || m_lowline[ 0 ] == 'c' ) { // fixed form comment if ( m_lowline[ 1 ] == '$' && m_lowline.find_first_not_of( " \t0123456789", 2 ) > 5 ) { // Conditional Compilation for fixed form m_lowline[ 0 ] = ' '; m_lowline[ 1 ] = ' '; return false; } else if ( m_lowline[ 1 ] == 'p' && m_lowline[ 2 ] == '$' && m_lowline.find_first_not_of( " \t0123456789", 3 ) > 5 ) { /** POMP Conditional Compilation for fixed form. This * allows code to be only active after processing * with OPARI2 by using the !P$ sentinel to start a * comment */ m_lowline[ 0 ] = m_line[ 0 ] = ' '; m_lowline[ 1 ] = m_line[ 1 ] = ' '; m_lowline[ 2 ] = m_line[ 2 ] = ' '; return false; } else { return true; } } } // free form comment size_t first_char = m_lowline.find_first_not_of( " \t" ); if ( ( first_char != string::npos ) && ( m_lowline[ first_char ] == '!' ) ) { if ( m_lowline[ first_char + 1 ] == '$' && ( m_lowline[ first_char + 2 ] == ' ' || m_lowline[ first_char + 2 ] == '\t' ) ) { // Conditional Compilation for free form m_lowline[ first_char ] = ' '; m_lowline[ first_char + 1 ] = ' '; return false; } else if ( m_lowline[ first_char + 1 ] == 'p' && m_lowline[ first_char + 2 ] == '$' && ( m_lowline[ first_char + 3 ] == ' ' || m_lowline[ first_char + 3 ] == '\t' ) ) { /** POMP Conditional Compilation for fixed form. This * allows code to be only active after processing with * OPARI2 by using the !P$ sentinel to start a * comment */ m_lowline[ first_char ] = m_line[ first_char ] = ' '; m_lowline[ first_char + 1 ] = m_line[ first_char + 1 ] = ' '; m_lowline[ first_char + 2 ] = m_line[ first_char + 2 ] = ' '; return false; } else { return true; } } return false; } /**@brief check if this line starts a do loop*/ bool OPARI2_FortranParser::is_loop_start( string& label ) { string::size_type poslab = string::npos; label = ""; if ( !( m_line.size() ) ) { return false; } // is there a 'do ' string::size_type pstart = m_lowline.find( "do" ); if ( pstart == string::npos || ( m_lowline[ pstart + 2 ] != '\0' && m_lowline[ pstart + 2 ] != ' ' && m_lowline[ pstart + 2 ] != '\t' ) ) { return false; } string::size_type pos = m_lowline.find_first_not_of( " \t" ); // cerr << "pos: " << pos << std::endl; if ( pos != pstart ) { // there is a DO_construct_name, i.e, this is a named do-loop poslab = m_lowline.find_first_of( ":", pos ); if ( poslab == string::npos ) { return false; } label = m_line.substr( pos, poslab - pos ); // skip white space pos = m_lowline.find_first_not_of( " \t", poslab + 1 ); } //check again, if pos now start of do, otherwise not a correct do statement pstart = m_lowline.find( "do", pos ); if ( pstart != pos || ( m_lowline[ pstart + 2 ] != '\0' && m_lowline[ pstart + 2 ] != ' ' && m_lowline[ pstart + 2 ] != '\t' ) ) { return false; } pos = m_lowline.find_first_not_of( " \t", pos + 2 ); // cerr << "pos2: " << pos << std::endl; if ( pos != string::npos && isdigit( m_lowline[ pos ] ) ) { // there is a stmtlabel poslab = pos; pos = m_lowline.find_first_not_of( "0123456789", pos ); // cerr << "2pos: " << pos << ", poslab: " << poslab << std::endl; label = m_line.substr( poslab, pos - poslab ); } // cerr << label << "\n\n"; return true; } /**@brief check if this line is the end of a do loop*/ bool OPARI2_FortranParser::is_loop_end( void ) { string toplabel = m_loop_stack.top().label; string label; if ( !( m_line.size() ) ) { return false; } string::size_type pos = m_lowline.find_first_not_of( " \t" ); // is it a nonblock DO loop? string::size_type poslab = toplabel.find_first_not_of( "0123456789" ); if ( ( toplabel.size() > 0 ) && ( poslab == string::npos ) ) { // search for nonblock Do loop poslab = pos; pos = m_lowline.find_first_not_of( "0123456789", pos ); // is there a label in this line? if ( poslab == pos ) { return false; } label = m_line.substr( poslab, pos - poslab ); // is it the label of the top loop if ( toplabel == label ) { return true; } else { return false; } } else { // search for block Do loop pos = m_lowline.find( "end", pos ); if ( pos == string::npos || ( pos != m_lowline.find_first_not_of( " \t0123456789" ) ) ) { return false; } // pos = m_lowline.find( "do", pos + 3 ); pos = m_lowline.find_first_not_of( " \t", pos + 3 ); if ( pos == string::npos || ( m_lowline.find( "do", pos ) > pos ) ) { return false; } pos = m_lowline.find( "do", pos ); if ( pos == string::npos || ( m_lowline.find( "=", pos ) < m_lowline.find( "!", pos ) ) ) { return false; } // search for label if ( toplabel.size() ) { // skip white space poslab = m_lowline.find_first_not_of( " \t", pos + 2 ); pos = m_lowline.find_first_of( " \t", poslab ); if ( poslab == pos ) { return false; } label = m_line.substr( poslab, pos - poslab ); // is it the label of the top loop if ( toplabel == label ) { return true; } else { return false; } } else { return true; // end do without label } } } void OPARI2_FortranParser::test_and_insert_enddo( void ) { if ( !m_loop_directives.empty() && m_waitfor_loopend ) { m_waitfor_loopend = false; if ( m_loop_directives.top()->NeedsEndLoopDirective() ) { OPARI2_Directive* d_new = m_loop_directives.top()->EndLoopDirective( m_lineno_loopend ); ProcessDirective( d_new, m_os ); m_loop_directives.pop(); delete d_new; } } } /** @brief Delete comments and strings before the lines are parsed * to avoid finding keywords in comments or strings.*/ void OPARI2_FortranParser::del_strings_and_comments( void ) { // zero out string constants and free form comments for ( string::size_type i = 0; i < m_lowline.size(); ++i ) { if ( m_in_string ) { // inside string if ( m_lowline[ i ] == m_in_string ) { m_lowline[ i ] = '@'; ++i; if ( i >= m_lowline.size() ) { // eol: no double string delimiter -> string ends m_in_string = 0; break; } if ( m_lowline[ i ] != m_in_string ) { // no double string delimiter -> string ends m_in_string = 0; continue; } } m_lowline[ i ] = '@'; } else if ( m_lowline[ i ] == '!' ) { /* -- zero out partial line F90 comments -- */ for (; i < m_lowline.size(); ++i ) { m_lowline[ i ] = ' '; } break; } else if ( m_lowline[ i ] == '\'' || m_lowline[ i ] == '\"' ) { m_in_string = m_lowline[ i ]; m_lowline[ i ] = '@'; } } } bool OPARI2_FortranParser::is_directive( void ) { m_sentinel = ""; string::size_type pos = string::npos; if ( m_options.form == F_FIX ) { if ( m_lowline.size() && ( m_lowline[ 0 ] == '!' || m_lowline[ 0 ] == 'c' || m_lowline[ 0 ] == '*' ) ) { pos = 0; } } else if ( m_options.form == F_FREE ) { string::size_type pstart = m_lowline.find_first_not_of( " \t" ); if ( pstart != string::npos && m_lowline.size() > pstart + 1 && m_lowline[ pstart ] == '!' ) { pos = pstart; } } if ( pos == string::npos ) { return false; } return IsValidSentinel( m_lowline, pos, m_sentinel ); } bool OPARI2_FortranParser::get_next_line( void ) { if ( getline( m_is, m_line ) ) { /* workaround for bogus getline implementations */ while ( m_line.size() == 1 && m_line[ 0 ] == '\0' ) { get_next_line(); } /* remove extra \r from Windows source files */ if ( m_line.size() && *( m_line.end() - 1 ) == '\r' ) { m_line.erase( m_line.end() - 1 ); } ++m_lineno; m_lowline = m_line; transform( m_line.begin(), m_line.end(), m_lowline.begin(), fo_tolower() ); /*check for Fortran continuation lines*/ if ( m_options.form == F_FREE ) { m_continuation = m_next_is_continuation; string::size_type amp = m_line.find_last_not_of( " \t" ); if ( amp != string::npos && m_line[ amp ] == '&' ) { m_continuation = true; } else { m_continuation = false; } } return true; } return false; } void OPARI2_FortranParser::handle_line_directive( const string::size_type lstart ) { /* line directive */ string::size_type loc = m_line.find_first_not_of( " \t", lstart + 1 ); if ( loc != string::npos && isdigit( m_line[ loc ] ) ) { string::size_type nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", lstart + 1 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); filename = m_line.substr( nrstart, nrend - nrstart ); if ( nrstart != 0 ) { if ( filename[ 0 ] == '/' ) { /*absolute path*/ m_curr_file = filename; } else { /*relative path*/ string path( m_options.infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_curr_file = path + "/" + filename; } } m_os << m_line << std::endl; } else if ( m_line.substr( lstart + 1, 5 ) == "line " && isdigit( m_line[ m_line.find_first_not_of( " \t", lstart + 5 ) ] ) ) { int nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", lstart + 5 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); if ( nrstart != 0 ) { filename = m_line.substr( nrstart, nrend - nrstart ); if ( filename[ 0 ] == '/' ) { /*absolute path*/ m_curr_file = filename; } else { /*relative path*/ string path( m_options.infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_curr_file = path + "/" + filename; } } m_os << m_line << std::endl; } else { /*keep other C/C++ preprocessor directives like #if and #endif*/ m_os << m_line << std::endl; } } void OPARI2_FortranParser::handle_directive( void ) { if ( m_in_header == true ) { m_in_header = false; if ( !InstrumentationDisabled( D_FULL ) ) { m_os << " include \'" << m_options.incfile_nopath << "\'" << std::endl; } if ( m_options.keep_src_info ) { m_os << "#line " << m_lineno << " \"" << m_curr_file << "\"" << "\n"; } } vector lines; lines.push_back( m_lowline ); bool found_continuation_line; string prev_sentinel = m_sentinel; unsigned ignored_lines = 0; do { found_continuation_line = false; if ( m_options.form == F_FREE ) { string::size_type com = m_lowline.find( m_sentinel ) + m_sentinel.length(); com = m_lowline.find( "!", com ); if ( com != string::npos ) { --com; } string::size_type amp = m_lowline.find_last_not_of( " \t", com ); if ( m_lowline[ amp ] == '&' ) { found_continuation_line = true; } else { /** There is no continuation line, so jump out * of while loop */ break; } } if ( get_next_line() ) { m_unprocessed_line = true; ignored_lines++; prev_sentinel = m_sentinel; if ( is_directive() ) { if ( m_options.form == F_FIX ) { string::size_type p = m_lowline.find( m_sentinel ) + m_sentinel.length(); if ( ( m_sentinel == prev_sentinel && ( m_lowline[ p ] != ' ' && m_lowline[ p ] != '\t' && m_lowline[ p ] != '0' ) ) ) { found_continuation_line = true; } } if ( found_continuation_line ) { m_unprocessed_line = false; ignored_lines--; lines.push_back( m_lowline ); } } else if ( is_comment_line() ) { found_continuation_line = true; m_sentinel = prev_sentinel; } else if ( found_continuation_line && !is_empty_line() ) { cerr << m_curr_file << ":" << m_lineno - 1 << ": ERROR: missing continuation line\n"; cleanup_and_exit(); } } else { break; } } while ( found_continuation_line ); vector directive_prefix( 1, prev_sentinel ); OPARI2_Directive* d_new = NewDirective( lines, directive_prefix, m_options.lang, m_curr_file, m_lineno - lines.size() - ignored_lines + 1 ); if ( d_new ) { m_waitfor_loopstart = d_new->NeedsEndLoopDirective(); if ( !d_new->EndsLoopDirective() ) { test_and_insert_enddo(); } ProcessDirective( d_new, m_os ); if ( d_new->NeedsEndLoopDirective() ) { m_loop_directives.push( d_new ); } else if ( d_new->EndsLoopDirective() ) { m_loop_directives.pop(); m_waitfor_loopend = false; } d_new = NULL; m_need_pragma = false; } else { // Print orig code if directive is ignored. for ( vector::const_iterator line = lines.begin(); line != lines.end(); ++line ) { m_os << *line << std::endl; } } } bool OPARI2_FortranParser::is_free_offload_directive() { string::size_type lstart = string::npos; return m_lowline.size() && ( ( lstart = m_lowline.find_first_not_of( " \t" ) ) != string::npos ) && ( lstart == m_lowline.find( "!dir$" ) ) && ( m_lowline.find( "offload" ) != string::npos ); } void OPARI2_FortranParser::handle_free_offload_directive() { string::size_type pstart = 0; if ( ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 5 ) ) != string::npos ) && ( ( m_lowline.find( "offload", pstart ) == pstart ) || ( m_lowline.find( "omp", pstart ) == pstart && ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 3 ) ) != string::npos ) && m_lowline.find( "offload", pstart ) == pstart ) ) ) { if ( ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 7 ) ) != string::npos ) && m_lowline.find( "begin", pstart ) == pstart ) { /*begin of an offload regions*/ m_os << m_line << std::endl; DisableInstrumentation( D_FULL ); } else { /*next pragma must be offloaded*/ m_os << m_line << std::endl; m_offload_pragma = true; } } else if ( m_lowline.find( "end", pstart ) == pstart && ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 3 ) ) != string::npos ) && m_lowline.find( "offload", pstart ) == pstart ) { /*end of an offload regions*/ m_os << m_line << std::endl; EnableInstrumentation( D_FULL ); } else if ( m_lowline.find( "attributes", pstart ) == pstart && ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 10 ) ) != string::npos ) && m_lowline.find( "offload", pstart ) == pstart ) { string::size_type nstart = m_lowline.find( "::", pstart ); nstart = m_lowline.find_first_not_of( " \t", nstart + 2 ); string::size_type nend = m_lowline.find_first_of( " \t\n\0", nstart ); m_offload_attribute = m_lowline.substr( nstart, nend - nstart ); m_os << m_line << std::endl; } else { /*print lines with !dir$ where no offload is present and continue*/ m_os << m_line << std::endl; } } void OPARI2_FortranParser::handle_offloaded_functions( void ) { string::size_type pos_function = m_lowline.find( "function" ); string::size_type pos_subroutine = m_lowline.find( "subroutine" ); string::size_type pos_end = m_lowline.find( "end" ); string::size_type pos_offload_attribute = m_lowline.find( m_offload_attribute ); string::size_type pos_offload_function = m_lowline.find( m_current_offload_function ); if ( ( ( pos_function < pos_offload_attribute || pos_subroutine < pos_offload_attribute ) && pos_offload_attribute != string::npos ) && !( pos_end < pos_function || pos_end < pos_subroutine ) ) { /* begin of offload function or subroutine */ DisableInstrumentation( D_FULL ); m_current_offload_function = m_offload_attribute; m_offload_attribute = ""; m_offload_function = true; } else if ( ( ( ( pos_function < pos_offload_function || m_offload_function ) && pos_end < pos_function ) || ( ( pos_subroutine < pos_offload_function || m_offload_subroutine ) && pos_end < pos_subroutine ) ) && pos_offload_function != string::npos ) { /*end of offload function*/ EnableInstrumentation( D_FULL ); m_offload_function = false; m_current_offload_function = ""; } } void OPARI2_FortranParser::handle_normal_line() { bool isComment = is_comment_line(); if ( m_need_pragma && !isComment && m_lowline.find_first_not_of( " \t" ) != string::npos ) { cerr << m_curr_file << ":" << m_lineno - 1 << ": ERROR: missing continuation line\n"; cleanup_and_exit(); } else if ( !m_loop_directives.empty() && !isComment && m_lowline.find_first_not_of( " \t" ) != string::npos ) { test_and_insert_enddo(); } if ( isComment ) { m_os << m_line << '\n'; } else if ( ( m_line.size() == 0 || m_lowline.find_first_not_of( " \t" ) == string::npos ) && m_lineno != 0 ) { // empty line m_os << m_line << '\n'; ++m_lineno_loopend; } else { // really normal line /*if no pragma follows the offload, a function is offloaded and * the next pragma must be processed normally*/ m_offload_pragma = false; del_strings_and_comments(); /* split line at ; */ string complete_line( m_line ); string complete_m_lowline( m_lowline ); size_t position = 0; while ( position != string::npos ) { if ( position == 0 ) { m_line = complete_line.substr( position, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position ); m_lowline = complete_m_lowline.substr( position, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position ); } else { m_line = complete_line.substr( position + 1, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position - 1 ); m_lowline = complete_m_lowline.substr( position + 1, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position - 1 ); } position = complete_m_lowline.find( ";", position + 1 ); if ( is_sub_unit_header() ) { m_in_header = true; } else if ( m_in_header == true ) { m_in_header = false; if ( !InstrumentationDisabled( D_FULL ) ) { m_os << " include \'" << m_options.incfile_nopath << "\'" << std::endl; } if ( m_options.keep_src_info ) { m_os << "#line " << m_lineno << " \"" << m_curr_file << "\"" << "\n"; } } // replace rumtime API call in this line if possible ReplaceRuntimeAPI( m_lowline, m_line, m_curr_file, L_FORTRAN ); if ( m_lineno != 0 ) { if ( position == string::npos ) { m_os << m_line << '\n'; } else { m_os << m_line << ';'; } } /* * instrumentation of the end of regions which are * implicitly ended after a single line of code */ if ( !m_continuation ) { HandleSingleLineDirective( m_lineno, m_os ); } else { } // search for loop start statement string label; if ( is_loop_start( label ) ) { LoopDescriptionT loop; loop.is_directive_loop = m_waitfor_loopstart; loop.label = label; m_loop_stack.push( loop ); } // search for loop end statement else if ( ( !m_loop_stack.empty() ) && is_loop_end() ) { LoopDescriptionT top_loop = m_loop_stack.top(); m_waitfor_loopend = top_loop.is_directive_loop; m_loop_stack.pop(); if ( !m_loop_stack.empty() ) { top_loop = m_loop_stack.top(); } else { top_loop.is_directive_loop = false; top_loop.label = ""; } // more than one loop ending on same statement (only numerical labels) while ( ( top_loop.label.find_first_of( "0123456789" ) != string::npos ) && ( is_loop_end() ) ) { m_waitfor_loopend = top_loop.is_directive_loop; m_loop_stack.pop(); if ( !m_loop_stack.empty() ) { top_loop = m_loop_stack.top(); } else { top_loop.is_directive_loop = false; top_loop.label = ""; } } m_lineno_loopend = m_lineno; } else { // normal line } m_waitfor_loopstart = false; } } } /** @brief This function processes fortran files and searches for a * place to insert variables, pragmas/directives and the begin * and end of do loops which are needed to ensure correct * instrumentation of parallel do constructs.*/ void OPARI2_FortranParser::process() { while ( m_unprocessed_line || get_next_line() ) { m_normal_line = false; m_unprocessed_line = false; if ( !( m_offload_attribute.empty() && m_current_offload_function.empty() ) ) { handle_offloaded_functions(); } string::size_type lstart = m_line.find_first_not_of( " \t" ); if ( m_in_string && !is_comment_line() ) { del_strings_and_comments(); ReplaceRuntimeAPI( m_lowline, m_line, m_curr_file, L_FORTRAN ); m_os << m_line << '\n'; } else if ( lstart != string::npos && m_line[ lstart ] == '#' ) { handle_line_directive( lstart ); } else if ( is_directive() ) { handle_directive(); } else if ( is_free_offload_directive() ) { handle_free_offload_directive(); } else { handle_normal_line(); } } } opari2-2.0.10/src/opari/PaxHeaders/opari2_parser_f.h0000644000000000000000000000013115232670204017173 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.255415263 30 ctime=1785426078.159261974 opari2-2.0.10/src/opari/opari2_parser_f.h0000664000175100001440000000711415232670204017531 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_parser_f.h * * @brief */ #ifndef OPARI2_PROCESS_F_H #define OPARI2_PROCESS_F_H #include using std::cerr; using std::ostream; using std::istream; #include using std::vector; #include using std::stack; #include "opari2.h" #include "opari2_directive_manager.h" #include "opari2_directive.h" /** @brief information about loops*/ typedef struct { /** loop belongs to preceeding directive */ bool is_directive_loop; /** loop label */ string label; } LoopDescriptionT; class OPARI2_FortranParser { public: OPARI2_FortranParser( OPARI2_Option_t& options ); ~OPARI2_FortranParser() { }; /** @brief This function processes fortran files and searches for a * place to insert variables, OpenMP pragmas and the begin and * end of do loops which are needed to ensure correct * instrumentation of parallel do constructs.*/ void process( void ); private: string m_line; string m_lowline; bool m_unprocessed_line; int m_lineno; string m_curr_file; std::stack m_loop_directives; bool m_need_pragma; char m_in_string; bool m_normal_line; bool m_in_header; bool m_continuation; bool m_next_is_continuation; string m_sentinel; bool m_offload_pragma; string m_offload_attribute; string m_current_offload_function; bool m_offload_subroutine; bool m_offload_function; // for endloop instrumentation stack m_loop_stack; // Line_type m_type_of_last_line; bool m_waitfor_loopstart; bool m_waitfor_loopend; int m_lineno_loopend; OPARI2_Option_t& m_options; ofstream& m_os; ifstream& m_is; /**@brief Check if the line belongs to the header of a subroutine or function. * After lines in the header, we can insert our variable definitions.*/ bool is_sub_unit_header( void ); /**@brief check if this line is empty*/ bool is_empty_line( void ); /**@brief check if this line is a comment line*/ bool is_comment_line( void ); /**@brief check if this line is a continuation line*/ bool is_continuation_line( void ); /**@brief check if this line starts a do loop*/ bool is_loop_start( string& label ); /**@brief check if this line is the end of a do loop*/ bool is_loop_end( void ); void test_and_insert_enddo( void ); /** @brief Delete comments and strings before the lines are parsed * to avoid finding keywords in comments or strings.*/ void del_strings_and_comments( void ); bool is_directive( void ); bool get_next_line( void ); void handle_line_directive( const string::size_type lstart ); void handle_directive( void ); bool is_free_offload_directive( void ); void handle_free_offload_directive(); void handle_offloaded_functions( void ); void handle_normal_line(); }; #endif // __PROCESS_F_H opari2-2.0.10/src/opari/PaxHeaders/opari2_parser_c.cc0000644000000000000000000000013115232670204017326 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.255415263 30 ctime=1785426078.155261998 opari2-2.0.10/src/opari/opari2_parser_c.cc0000664000175100001440000006235015232670204017667 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2016, 2020, 2026, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_parser_c.cc * * @brief This file contains all functions to parse and process C or C++ files. */ #include #include using std::istream; using std::cerr; #include using std::stack; #include using std::vector; #include using std::map; #include using std::string; #include using std::getline; #include using std::isalnum; using std::isalpha; #include #include #include "opari2.h" #include "opari2_parser_c.h" #include "openmp/opari2_directive_openmp.h" #include "pomp/opari2_directive_pomp.h" #include "offload/opari2_directive_offload.h" #include "opari2_directive_manager.h" OPARI2_CParser::OPARI2_CParser( OPARI2_Option_t& options ) : m_options( options ), m_os( options.os ), m_is( options.is ) { m_current_file = options.infile; m_infile = options.infile; m_next_end.push( -1 ); } string OPARI2_CParser::find_next_word( unsigned& pline, string::size_type& ppos ) { unsigned size = m_pre_stmt.size(); while ( pline < size ) { string::size_type wbeg = m_pre_stmt[ pline ].find_first_not_of( " \t", ppos ); if ( m_pre_stmt[ pline ][ wbeg ] == '\\' || wbeg == string::npos ) { ++pline; if ( pline < size ) { ppos = 0; } else { return ""; } } else { ppos = m_pre_stmt[ pline ].find_first_of( " \t()", wbeg ); return m_pre_stmt[ pline ].substr( wbeg, ppos == string::npos ? ppos : ppos - wbeg ); } } return ""; } /** @brief Check whether the current line is an extern function declaration */ bool OPARI2_CParser::is_extern_decl( void ) { // If it starts with 'extern' it is an declaration int nrstart = m_line.find_first_not_of( " \t" ); int nrend = m_line.find_first_of( " \t", nrstart + 1 ); if ( nrend > nrstart && m_line.substr( nrstart, nrend ) == "extern" ) { return true; } return false; } /** * @brief Instrument pragma directives. * * Preprocessor lines are passed to this function and checked, whether they are * pragmas. */ bool OPARI2_CParser::process_prestmt( int ln, string::size_type ppos ) { unsigned s = m_pre_stmt.size(); bool in_comment = false; vector orig_stmt; /* "remove" comments */ for ( unsigned i = 0; i < s; ++i ) { string::size_type pos = 0; string& line = m_pre_stmt[ i ]; string orig_line( line ); orig_stmt.push_back( orig_line ); while ( pos < line.size() ) { if ( in_comment ) { /* look for comment end */ if ( line[ pos ] == '*' && line[ pos + 1 ] == '/' ) { line[ pos++ ] = ' '; in_comment = false; } line[ pos++ ] = ' '; } else if ( line[ pos ] == '/' ) { pos++; if ( line[ pos ] == '/' ) { // c++ comments / line[ pos - 1 ] = ' '; line[ pos++ ] = ' '; while ( pos < line.size() ) { line[ pos++ ] = ' '; } } else if ( line[ pos ] == '*' ) { // c comment start line[ pos - 1 ] = ' '; line[ pos++ ] = ' '; in_comment = true; } } else { pos++; } } } vector directive_prefix( 1, "#" ); unsigned pline = 0; string first = find_next_word( pline, ppos ); if ( first == "pragma" ) { directive_prefix.push_back( first ); string paradigm_identifier = find_next_word( pline, ppos ); directive_prefix.push_back( paradigm_identifier ); OPARI2_Directive* d = NewDirective( m_pre_stmt, directive_prefix, m_options.lang, m_current_file, m_lineno - m_pre_stmt.size() + 1 ); if ( d ) { ProcessDirective( d, m_os, &m_require_end, &m_is_for ); return true; } } else if ( first == "include" ) { // include (for supported runtime API) -> remove it string word = find_next_word( pline, ppos ); if ( IsSupportedAPIHeaderFile( word, m_options.lang ) ) { s = 0; } } for ( unsigned i = 0; i < s; ++i ) { m_os << orig_stmt[ i ] << "\n"; } orig_stmt.clear(); return false; } bool OPARI2_CParser::handle_closed_block() { bool newline_printed = false; size_t next_char = m_line.find_first_not_of( " \t", m_pos ); /* The treatment of else blocks doesn't work yet, but it should go * somewhere here */ if ( ( m_next_end.top() == m_level && ( next_char != string::npos && m_line.substr( next_char, 4 ) != "else" ) ) || next_char == string::npos ) { bool more_chars = ( m_pos < m_line.size() ); if ( !m_block_closed ) { m_os << '\n'; newline_printed = true; } // while because block can actually close more than one pragma while ( m_next_end.top() == m_level ) { OPARI2_Directive* d_top = DirectiveStackTop( NULL ); if ( d_top ) { vector directive_prefix; int l = m_lineno; if ( m_block_closed ) { l--; } OPARI2_Directive* d = NewDirective( m_end_stmt, directive_prefix, m_options.lang, m_current_file, l ); if ( d ) { ProcessDirective( d, m_os ); } else { cerr << "Error when handling end of directive:" << d_top->GetName() << "\n"; } } m_next_end.pop(); } if ( more_chars && !m_block_closed ) { if ( next_char != string::npos ) { m_os << "#line " << m_lineno << " \"" << m_current_file << "\"" << "\n"; } for ( unsigned i = 0; i < m_pos; ++i ) { m_os << ' '; } } } return newline_printed; } void OPARI2_CParser::handle_preprocessor_directive( void ) { if ( ( isdigit( m_line[ m_line.find_first_not_of( " \t", m_lstart + 1 ) ] ) ) ) { /** * which compiler supports the line directive in this form? */ int nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", m_lstart + 1 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); // -1 because the next line has the number specified in this directive m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); filename = m_line.substr( nrstart, nrend - nrstart ); if ( nrstart != 0 ) { if ( filename[ 0 ] == '/' ) { /*absolute path*/ m_current_file = filename; } else { /*relative path*/ string path( m_infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_current_file = path + "/" + filename; } } m_os << m_line << std::endl; } else if ( m_line.compare( m_lstart + 1, 5, "line " ) == 0 && isdigit( m_line[ m_line.find_first_not_of( " \t", m_lstart + 5 ) ] ) ) { int nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", m_lstart + 5 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); // -1 because the next line has the number specified in this directive m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); if ( nrstart != 0 ) { filename = m_line.substr( nrstart, nrend - nrstart ); if ( filename[ 0 ] == '/' ) { /* absolute path */ m_current_file = filename; } else { /* relative path */ string path( m_infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_current_file = path + "/" + filename; } } m_os << m_line << std::endl; } else { /* * other preprocessor directive */ m_pre_stmt.push_back( m_line ); if ( m_line[ m_line.size() - 1 ] == '\\' ) // escaped Backslash { m_pre_cont_line = true; } else { if ( process_prestmt( m_lineno, m_lstart + 1 ) ) { if ( m_require_end ) { m_next_end.push( m_level ); m_num_semi = m_is_for ? 3 : 1; } else { m_num_semi = 0; } } m_pre_stmt.clear(); } } } void OPARI2_CParser::handle_preprocessor_continuation_line( void ) { m_pre_stmt.push_back( m_line ); /* check for multiline comments in preprocessor directives */ if ( !m_in_comment && m_line.find( "/*" ) != string::npos && !( m_line.find( "*/" ) != string::npos && m_line.find( "/*" ) < m_line.find( "*/" ) ) ) { m_in_comment = true; } else if ( m_in_comment && m_line.find( "*/" ) != string::npos ) { m_in_comment = false; } if ( m_line[ m_line.size() - 1 ] != '\\' && !m_in_comment ) { m_pre_cont_line = false; if ( process_prestmt( m_lineno - m_pre_stmt.size() + 1, m_lstart + 1 ) ) { if ( m_require_end ) { m_next_end.push( m_level ); m_num_semi = m_is_for ? 3 : 1; } else { m_num_semi = 0; } } m_pre_stmt.clear(); } } void OPARI2_CParser::handle_regular_line() { bool newline_printed = false; while ( m_pos < m_line.size() ) { newline_printed = false; if ( m_in_raw_string ) { // raw string literals can span multiple lines // if we have not finished handling a raw string from a prior line, continue here handle_raw_string_literal(); } else if ( m_in_comment ) { // look for comment end if ( m_line[ m_pos ] == '*' && m_line[ m_pos + 1 ] == '/' ) { m_os << "*/"; m_in_comment = false; m_pos += 2; } else { m_os << m_line[ m_pos++ ]; } } else if ( m_line[ m_pos ] == '/' ) { m_pos++; if ( m_line[ m_pos ] == '/' ) { // c++ comments m_pos++; m_os << "//"; while ( m_pos < m_line.size() ) { m_os << m_line[ m_pos++ ]; } } else if ( m_line[ m_pos ] == '*' ) { // c comment start m_pos++; m_os << "/*"; m_in_comment = true; } else { m_os << '/'; } } // raw string literals always start with R"( else if ( !m_in_string && m_line[ m_pos ] == 'R' && m_pos + 1 < m_line.size() && m_line[ m_pos + 1 ] == '\"' && m_line.find_first_of( '(', m_pos + 1 ) != std::string::npos ) { m_os << "R\""; m_pos += 2; handle_raw_string_literal(); } else if ( m_in_string || m_line[ m_pos ] == '\"' ) { // character string constant if ( m_in_string ) { m_in_string = false; m_pos--; // to make sure current character gets reprocessed } else { m_os << "\""; } m_pos++; while ( m_pos < m_line.size() && m_line[ m_pos ] != '\"' ) { if ( m_line[ m_pos ] == '\\' ) { m_os << '\\'; m_pos++; if ( m_line[ m_pos ] == '\0' ) { m_in_string = true; break; } else if ( m_line[ m_pos ] == '\\' ) { if ( m_line[ m_pos + 1 ] == '\0' ) { m_os << '\\'; m_in_string = true; break; } } } m_os << m_line[ m_pos ]; m_pos++; } if ( !m_in_string ) { m_os << '\"'; } m_pos++; } else if ( m_line[ m_pos ] == '\'' ) { // character constant m_os << "\'"; do { m_pos++; if ( m_line[ m_pos ] == '\\' ) { m_os << '\\'; m_pos++; if ( m_line[ m_pos ] == '\'' ) { m_os << '\''; m_pos++; } } m_os << m_line[ m_pos ]; } while ( m_line[ m_pos ] != '\'' ); m_pos++; } else if ( ( m_options.lang & L_CXX ) && isdigit( m_line[ m_pos ] ) ) { // numeric literal, optional sign already processed handle_numeric_literal(); } else if ( isalpha( m_line[ m_pos ] ) || m_line[ m_pos ] == '_' ) { // identifier string::size_type startpos = m_pos; while ( m_pos < m_line.size() && ( isalnum( m_line[ m_pos ] ) || m_line[ m_pos ] == '_' ) ) { m_pos++; } string ident( m_line, startpos, m_pos - startpos ); /* Replace if valid runtime function */ ReplaceRuntimeAPI( ident, ident, m_current_file, L_C_OR_CXX ); m_os << ident; if ( ident == "for" && m_num_semi == 1 ) { m_num_semi = 3; } } else if ( m_line[ m_pos ] == '{' ) { // block open m_os << m_line[ m_pos++ ]; m_level++; m_num_semi = 0; } else if ( m_line[ m_pos ] == '}' ) { // block close m_os << m_line[ m_pos++ ]; m_level--; size_t next_char = m_line.find_first_not_of( " \t", m_pos ); if ( next_char != string::npos ) { newline_printed = handle_closed_block(); } else { m_block_closed = true; } } else if ( m_line[ m_pos ] == ';' ) { // statement end m_os << m_line[ m_pos++ ]; m_num_semi--; if ( m_num_semi == 0 ) { //newline_printed = handle_closed_block(); m_block_closed = true; } } else { m_os << m_line[ m_pos++ ]; } } if ( !newline_printed ) { m_os << '\n'; } } void OPARI2_CParser::handle_numeric_literal( void ) { const bool is_zero_prefixed = ( m_line[ m_pos ] == '0' ); m_os << m_line[ m_pos++ ]; if ( m_pos == m_line.size() ) { // EOL => single digit, we're done return; } bool is_hex = false; bool is_dec = false; if ( is_zero_prefixed && ( ( m_line[ m_pos ] == 'b' ) || ( m_line[ m_pos ] == 'B' ) ) ) { m_os << m_line[ m_pos++ ]; handle_binary_literal(); } else if ( is_zero_prefixed && ( ( m_line[ m_pos ] == 'x' ) || ( m_line[ m_pos ] == 'X' ) ) ) { is_hex = true; m_os << m_line[ m_pos++ ]; handle_hexadecimal_literal(); } else if ( isdigit( m_line[ m_pos ] ) ) { // We don't distinguish octal/decimal here, as it might be the // integer part of a floating-point literal is_dec = true; handle_decimal_literal(); } // Optional fractional part of floating-point literal if ( ( m_pos < m_line.size() ) && ( m_line[ m_pos ] == '.' ) ) { if ( is_dec ) { m_os << m_line[ m_pos++ ]; handle_decimal_literal(); } else if ( is_hex ) { m_os << m_line[ m_pos++ ]; handle_hexadecimal_literal(); } } // Exponent of floating-point literal if ( ( m_pos < m_line.size() ) && ( ( is_dec && ( ( m_line[ m_pos ] == 'e' ) || ( m_line[ m_pos ] == 'E' ) ) ) || ( is_hex && ( ( m_line[ m_pos ] == 'p' ) || ( m_line[ m_pos ] == 'P' ) ) ) ) ) { m_os << m_line[ m_pos++ ]; if ( ( m_pos < m_line.size() ) && ( ( m_line[ m_pos ] == '+' ) || ( m_line[ m_pos ] == '-' ) ) ) { m_os << m_line[ m_pos++ ]; } handle_decimal_literal(); } } void OPARI2_CParser::handle_binary_literal( void ) { while ( ( m_pos < m_line.size() ) && ( ( m_line[ m_pos ] == '0' ) || ( m_line[ m_pos ] == '1' ) || ( m_line[ m_pos ] == '\'' ) ) ) { m_os << m_line[ m_pos++ ]; } } void OPARI2_CParser::handle_decimal_literal( void ) { while ( ( m_pos < m_line.size() ) && ( isdigit( m_line[ m_pos ] ) || ( m_line[ m_pos ] == '\'' ) ) ) { m_os << m_line[ m_pos++ ]; } } void OPARI2_CParser::handle_hexadecimal_literal( void ) { while ( ( m_pos < m_line.size() ) && ( isxdigit( m_line[ m_pos ] ) || ( m_line[ m_pos ] == '\'' ) ) ) { m_os << m_line[ m_pos++ ]; } } void OPARI2_CParser::handle_raw_string_literal( void ) { if ( !m_in_raw_string ) { // collect the prefix of the raw string literal // it always has to appear on the same line, line breaks are disallowed // we also do not need to care about escaped characters, as \ is disallowed as well size_t end_prefix_pos = m_line.find_first_of( '(', m_pos ); m_raw_string_prefix = m_line.substr( m_pos, end_prefix_pos - m_pos ); m_raw_string_suffix = ")" + m_raw_string_prefix + "\""; m_in_raw_string = true; } // if we do not find the end of the raw string literal, just print the remaining line as is // we will try again for the next line const size_t end_pos = m_line.find( m_raw_string_suffix ); if ( end_pos == string::npos ) { m_os << m_line.substr( m_pos ); m_pos = m_line.size(); return; } // end of raw string literal found. print the remainder and exit raw string mode m_os << m_line.substr( m_pos, end_pos + m_raw_string_suffix.size() - m_pos ); m_pos = end_pos + m_raw_string_suffix.size(); m_in_raw_string = false; m_raw_string_prefix.clear(); m_raw_string_suffix.clear(); } bool OPARI2_CParser::get_next_line( void ) { bool success = ( bool )getline( m_is, m_line ); ++m_lineno; m_pos = 0; //std::cout << m_lineno << ": " << m_line << std::endl; if ( success ) { /* workaround for bogus getline implementations */ while ( m_line.size() == 1 && m_line[ 0 ] == '\0' ) { success = ( bool )getline( m_is, m_line ); ++m_lineno; } /* remove extra \r from Windows source files */ if ( m_line.size() && *( m_line.end() - 1 ) == '\r' ) { m_line.erase( m_line.end() - 1 ); } } return success; } /** Parse source file line by line, search for directives and the * related code blocks. Comments and strings are removed to avoid * finding keywords in comments. */ void OPARI2_CParser::process( void ) { while ( get_next_line() ) { string::size_type ls; if ( m_block_closed && !( ( ( m_line.size() - m_line.find_first_not_of( " \t" ) ) > 3 ) && ( m_line.find_first_not_of( " \t" ) != string::npos ) && m_line.substr( m_line.find_first_not_of( " \t" ), 4 ) == "else" ) ) { handle_closed_block(); m_block_closed = false; } /* start offload region if __declspec is found and continue to * parse the rest of the line as usual without the __declspec */ if ( !m_in_comment && !m_in_raw_string && ( ( ls = m_line.find_first_not_of( " \t" ) ) != string::npos ) && m_line.substr( ls, 10 ) == "__declspec" ) { m_pre_stmt.push_back( m_line ); vector directive_prefix( 1, "__declspec" ); OPARI2_Directive* d = NewDirective( m_pre_stmt, directive_prefix, m_options.lang, m_current_file, m_lineno ); assert( d ); ProcessDirective( d, m_os ); m_pre_stmt.clear(); m_next_end.push( m_level ); int cl_brackets = 0; string::size_type pos = 0; while ( cl_brackets < 2 && pos < m_line.size() ) { if ( m_line[ pos ] == ')' ) { cl_brackets++; } m_os << m_line[ pos ]; m_line[ pos ] = ' '; pos++; } m_os << "\n"; } if ( m_pre_cont_line ) { handle_preprocessor_continuation_line(); } else if ( !m_in_comment && !m_in_raw_string && m_options.preprocessed_file && ( m_line == "___POMP2_INCLUDE___" || m_line == "___POMP2_INCLUDE___ " ) ) // Studio compiler appends a blank during preprocessing { m_os << "#include \"" << m_options.incfile << "\"" << "\n"; } else if ( !m_in_comment && !m_in_raw_string && ( ( m_lstart = m_line.find_first_not_of( " \t" ) ) != string::npos ) && m_line[ m_lstart ] == '#' ) { handle_preprocessor_directive(); } else { handle_regular_line(); } } if ( m_block_closed ) { handle_closed_block(); m_block_closed = false; } // check end position stack if ( m_next_end.top() != -1 ) { cerr << "ERROR: could not determine end of OpenMP construct (braces mismatch?)\n"; PrintDirectiveStackTop(); cleanup_and_exit(); } } opari2-2.0.10/src/opari/PaxHeaders/opari2_parser_c.h0000644000000000000000000000013115232670204017170 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.255415263 30 ctime=1785426078.155261998 opari2-2.0.10/src/opari/opari2_parser_c.h0000664000175100001440000000476215232670204017534 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014, 2021, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_parser_c.h * * @brief */ #ifndef OPARI2_PARSER_C_H #define OPARI2_PARSER_C_H class OPARI2_CParser { public: OPARI2_CParser( OPARI2_Option_t& options ); ~OPARI2_CParser() { }; private: string m_line; string::size_type m_pos = 0; bool m_in_comment = false; bool m_in_string = false; bool m_in_raw_string = false; bool m_pre_cont_line = false; bool m_require_end = true; bool m_is_for = false; bool m_block_closed = false; int m_lineno = 0; int m_level = 0; int m_num_semi = 0; string::size_type m_lstart = string::npos; string m_raw_string_prefix; string m_raw_string_suffix; vector m_pre_stmt; vector m_end_stmt; stack m_next_end; string m_current_file; string m_infile; OPARI2_Option_t& m_options; ofstream& m_os; ifstream& m_is; string find_next_word( unsigned& pline, string::size_type& ppos ); /** @brief Check whether the current line is an extern function declaration */ bool is_extern_decl( void ); /** * @brief Instrument pragma directives. * * Preprocessor lines are passed to this function and checked, whether they are * pragmas. */ bool process_prestmt( int ln, string::size_type ppos ); bool handle_closed_block(); void handle_preprocessor_directive( void ); void handle_preprocessor_continuation_line( void ); void handle_regular_line(); void handle_numeric_literal(); void handle_binary_literal(); void handle_decimal_literal(); void handle_hexadecimal_literal(); void handle_raw_string_literal(); bool get_next_line( void ); public: /** @brief Instrument directives / runtime APIs in C/C++ source file. */ void process( void ); }; #endif //__PROCESS_C_H opari2-2.0.10/src/opari/PaxHeaders/opari2.h0000644000000000000000000000013215232670204015313 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.155261998 opari2-2.0.10/src/opari/opari2.h0000664000175100001440000001144515232670204015652 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2.h * * @brief This file contains some definitions that are used * throughout OAPRI2 */ #ifndef OPARI2_H #define OPARI2_H #include using std::string; #include using std::ifstream; using std::ofstream; #include #include using std::map; #include using std::vector; #include using std::pair; /** * @brief Convenience type definition */ typedef map OPARI2_StrStr_map_t; /** * @brief Convenience type definition */ typedef map > OPARI2_StrVStr_map_t; /** * @brief Convenience type definition */ typedef vector > OPARI2_StrBool_pairs_t; /** * @brief Convenience type definition */ typedef vector > OPARI2_StrStr_pairs_t; /** * @brief Bitfield for supported languages and dialects. */ typedef enum { L_NA = 0x00, L_F77 = 0x01, L_F90 = 0x02, L_FORTRAN = 0x03, L_C = 0x04, L_CXX = 0x08, L_C_OR_CXX = 0x0C } OPARI2_Language_t; /** * @brief Fortran specific differentiation between free-form and * fixed-form Fortran format. */ typedef enum { F_NA = 0x00, F_FIX = 0x01, F_FREE = 0x02 } OPARI2_Format_t; /** * @brief All necessary information to process a file. */ typedef struct { /** Language of the input file */ OPARI2_Language_t lang; /** Fortran format of the input file */ OPARI2_Format_t form; /** Specifies whether the source code information should be kept up-to-date with line directives*/ bool keep_src_info; /** Specifies whether the input file was already partially preprocessed */ bool preprocessed_file; /** Name of the input file */ string infile; /** Name of the output file */ string outfile; /** Name of the generated include file (without path) */ string incfile_nopath; /** Name of the generated include file (including path) */ string incfile; /** Input file stream object */ ifstream is; /** Output file stream object */ ofstream os; } OPARI2_Option_t; /** * @brief Definition of directive group. */ typedef enum OPARI2_ParadigmType { /** Unknown paradigm */ OPARI2_PT_NONE = 0, /** OpenMP */ OPARI2_PT_OMP, /** POMP user instrumentation */ OPARI2_PT_POMP, /** OpenACC */ OPARI2_PT_OPENACC, /** Intel offload model */ OPARI2_PT_OFFLOAD, /** Transactional memory / speculative execution */ OPARI2_PT_TMSE } OPARI2_ParadigmType_t; /** * @brief Definition of error codes. */ typedef enum OPARI2_ErrorCode { OPARI2_NO_ERROR = 0, /** No message was printed when the error occurred */ OPARI2_ERROR_NO_MESSAGE, /** A message was printed directly when the error occurred */ OPARI2_ERROR_WITH_MESSAGE } OPARI2_ErrorCode; /** * @brief Definition of null group * * Currently the max number of groups for each paradigm is 32. * This limitation can be removed if using macro definion instead of enum. * Note a group is identified by both the group number and the paradigm type. */ #define G_NONE 0x00000000 //extern OPARI2_Option_t opt; /** * @brief This function can be called anywhere upon an error. * * When this function is called, the output file is deleted and the * program is exited. */ void cleanup_and_exit( void ); #endif opari2-2.0.10/src/opari/PaxHeaders/opari2.cc0000644000000000000000000000013215232670204015451 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.151262021 opari2-2.0.10/src/opari/opari2.cc0000664000175100001440000005302415232670204016007 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2015, 2025, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2.cc * * @brief This File containes the opari main function. It is used to * handle input arguments and open input and output * files. Afterwards the C or Fortran parsers are used, * depending on the file type or provided arguments. */ #include #include using std::ifstream; using std::ofstream; #include using std::stringstream; #include using std::cout; using std::cerr; #include using std::sprintf; using std::remove; #include using std::string; using std::strcmp; using std::strrchr; using std::strncpy; using std::strcat; using std::strlen; #include using std::exit; #include #include #include #include #include #include #include "opari2.h" #include "opari2_directive_manager.h" #include "openmp/opari2_directive_openmp.h" #include "opari2_parser_c.h" #include "opari2_parser_f.h" #define DEPRECATED_ON /* cmd line options */ OPARI2_Option_t opt; void print_usage_information( char* prog, std::ostream& output ) { std::string usage = #include "opari2_usage.h" ; output << prog << "\n\n" << usage << std::endl; } void cleanup_and_exit( void ) { if ( !opt.outfile.empty() ) { remove( opt.outfile.c_str() ); } exit( 1 ); } void print_deprecated_msg( const string old_form, const string new_form ) { #ifdef DEPRECATED_ON cerr << "Warning: Option \"" << old_form << "\" is deprecated.\n\ Please use \"" << new_form << "\" for future compatibility.\n"; #endif } /** * @brief Disable directive entry in the directive_table. * * Currently supported option: * --disable=xx,xx,... * Here xx can possibly be an openmp/pomp directive name, openmp/pomp * group name, or a paradigm type name. * * Not supported anymore: * -disable xx,xx,... * * Current --help output (27.03.2014): * [--disable=paradigm[:directive|group[:inner],...][+paradigm...] * [OPTIONAL] Disable the instrumentation of whole paradigms, or * specific directives or groups of directives of a paradigm. * Furthermore it gives the possibility to suppress the insertion of * instrumentation functions inside code regions, i.e. only the * surrounding instrumentation is inserted. * */ bool set_disabled( const string& constructs ) { typedef std::pair dir_and_inner_t; char* str = strdup( constructs.c_str() ); std::vector paradigms; char* paradigm = strtok( str, "+" ); while ( paradigm != NULL ) { paradigms.push_back( paradigm ); paradigm = strtok( NULL, "+" ); } for ( vector::iterator it = paradigms.begin(); it != paradigms.end(); ++it ) { paradigm = strtok( *it, ",:" ); dir_and_inner_t directive; std::vector directives; directive.first = strtok( NULL, "," ); directive.second = false; while ( directive.first != NULL ) { directives.push_back( directive ); directive.second = false; directive.first = strtok( NULL, "," ); } for ( vector::iterator it = directives.begin(); it != directives.end(); ++it ) { if ( strchr( it->first, ':' ) ) { it->first = strtok( it->first, ":" ); char* inner = strtok( NULL, ":" ); if ( strcmp( inner, "inner" ) == 0 ) { it->second = true; } else { cerr << "Error, unknown identifier " << inner << std::endl; free( str ); return false; } } } if ( directives.empty() ) { if ( !DisableParadigmDirectiveOrGroup( paradigm, "", false ) ) { free( str ); return false; } } else { for ( vector::iterator it = directives.begin(); it != directives.end(); ++it ) { if ( !DisableParadigmDirectiveOrGroup( paradigm, it->first, it->second ) ) { free( str ); return false; } } } } free( str ); return true; } /** * @brief Parse and handle cmd line options. * * First hanlde global options, * then handle paradigm-specific options. */ void process_cmd_line( int argc, char* argv[] ) { int a = 1; OPARI2_ErrorCode err_flag = OPARI2_NO_ERROR; const char* ptr = NULL; opt.lang = L_NA; opt.form = F_NA; opt.keep_src_info = true; opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); /* parse global options */ while ( a < argc && argv[ a ][ 0 ] == '-' ) { if ( strncmp( argv[ a ], "--omp", 5 ) == 0 ) { err_flag = OPARI2_DirectiveOpenmp::ProcessOption( argv[ a ] ); if ( err_flag ) { cerr << "ERROR: unknown option " << argv[ a ] << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else if ( strcmp( argv[ a ], "--f77" ) == 0 ) { opt.lang = L_F77; } else if ( strcmp( argv[ a ], "--f90" ) == 0 ) { opt.lang = L_F90; } else if ( strcmp( argv[ a ], "--c++" ) == 0 ) { opt.lang = L_CXX; } else if ( strcmp( argv[ a ], "--c" ) == 0 ) { opt.lang = L_C; } else if ( strcmp( argv[ a ], "--free-form" ) == 0 ) { opt.form = F_FREE; } else if ( strcmp( argv[ a ], "--fix-form" ) == 0 ) { opt.form = F_FIX; } else if ( strcmp( argv[ a ], "--version" ) == 0 ) { std::cout << "opari2 version " << PACKAGE_VERSION << std::endl; } else if ( strcmp( argv[ a ], "--help" ) == 0 ) { print_usage_information( argv[ 0 ], std::cout ); exit( 0 ); } else if ( strcmp( argv[ a ], "--nosrc" ) == 0 ) { opt.keep_src_info = false; } else if ( strcmp( argv[ a ], "--preprocessed" ) == 0 ) { opt.preprocessed_file = true; } /* handle "--disable=" */ else if ( strncmp( argv[ a ], "--disable", 9 ) == 0 ) { ptr = strchr( argv[ a ], '=' ); if ( ptr ) { ptr++; if ( !set_disabled( ptr ) ) { err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else { err_flag = OPARI2_ERROR_WITH_MESSAGE; cerr << "ERROR: missing value for option --disable\n"; } } /* handle deprecated options */ else if ( strcmp( argv[ a ], "--tpd" ) == 0 ) { print_deprecated_msg( "--tpd", "--omp-tpd" ); omp_opt->copytpd = true; #if HAVE( PLATFORM_K ) || HAVE( PLATFORM_FX10 ) || HAVE( PLATFORM_FX100 ) cerr << "WARNING: option --tpd not supported on Fujitsu systems.\n"; #endif } else if ( strncmp( argv[ a ], "--tpd-mangling=", 15 ) == 0 ) { print_deprecated_msg( "--tpd-mangling=", "--omp-tpd-mangling=" ); char* tpd_arg = strchr( argv[ a ], '=' ); if ( tpd_arg != NULL ) { tpd_arg++; if ( strcmp( tpd_arg, "gnu" ) == 0 || strcmp( tpd_arg, "sun" ) == 0 || strcmp( tpd_arg, "intel" ) == 0 || strcmp( tpd_arg, "pgi" ) == 0 || strcmp( tpd_arg, "cray" ) == 0 ) { omp_opt->pomp_tpd = "pomp_tpd_"; omp_opt->tpd_in_extern_block = false; } else if ( strcmp( tpd_arg, "ibm" ) == 0 ) { omp_opt->pomp_tpd = "pomp_tpd"; omp_opt->tpd_in_extern_block = true; } else { cerr << "ERROR: unknown option for --tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else { cerr << "ERROR: missing value for option --tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else if ( strncmp( argv[ a ], "--task=", 7 ) == 0 ) { print_deprecated_msg( "--task=", "--omp-task=" ); char* token = strtok( argv[ a ], "=" ); token = strtok( NULL, "," ); while ( token != NULL ) { if ( strcmp( token, "abort" ) == 0 ) { omp_opt->task_abort = true; } else if ( strcmp( token, "warn" ) == 0 ) { omp_opt->task_warn = true; } else if ( strcmp( token, "remove" ) == 0 ) { omp_opt->task_remove = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --task\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } token = strtok( NULL, "," ); } } else if ( strncmp( argv[ a ], "--untied=", 9 ) == 0 ) { print_deprecated_msg( "--untied=", "--omp-task-untied=" ); char* token = strtok( argv[ a ], "=" ); token = strtok( NULL, "," ); do { if ( strcmp( token, "abort" ) == 0 ) { omp_opt->untied_abort = true; } else if ( strcmp( token, "no-warn" ) == 0 ) { omp_opt->untied_nowarn = true; } else if ( strcmp( token, "keep" ) == 0 ) { omp_opt->untied_keep = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --untied\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } token = strtok( NULL, "," ); } while ( token != NULL ); } else if ( strcmp( argv[ a ], "-disable" ) == 0 ) { cerr << "ERROR: -disable not supported by this version of OPARI2. " << "Please use --disable=paradigm[:directive|group[:inner],...][+paradigm...]. " << "Use opari2 --help or refer to the documentation for more details." << std::endl; err_flag = OPARI2_ERROR_WITH_MESSAGE; } else if ( strcmp( argv[ a ], "-f77" ) == 0 ) { print_deprecated_msg( "-f77", "--f77" ); opt.lang = L_F77; } else if ( strcmp( argv[ a ], "-f90" ) == 0 ) { print_deprecated_msg( "-f90", "--f90" ); opt.lang = L_F90; } else if ( strcmp( argv[ a ], "-c++" ) == 0 ) { print_deprecated_msg( "-c++", "--c++" ); opt.lang = L_CXX; } else if ( strcmp( argv[ a ], "-c" ) == 0 ) { print_deprecated_msg( "-c", "--c" ); opt.lang = L_C; } else if ( strcmp( argv[ a ], "-nosrc" ) == 0 ) { print_deprecated_msg( "-nosrc", "--nosrc" ); opt.keep_src_info = false; } else if ( strcmp( argv[ a ], "-rcfile" ) == 0 ) { cerr << "WARNING: Option \"-rcfile\" is deprecated and ignored.\n"; } else if ( strcmp( argv[ a ], "-table" ) == 0 ) { cerr << "WARNING: Option \"-table\" is deprecated and ignored.\n"; } /* End of deprecated options */ ++a; } /* parse file arguments, prepare input/output stream if specified */ switch ( argc - a ) { case 2: if ( strcmp( argv[ a + 1 ], "-" ) == 0 ) { opt.os.std::ostream::rdbuf( cout.rdbuf() ); } else { opt.os.open( argv[ a + 1 ] ); if ( !opt.os ) { cerr << "ERROR: cannot open output file " << argv[ a + 1 ] << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } opt.outfile = string( argv[ a + 1 ] ); } /*NOBREAK*/ case 1: if ( *argv[ a ] != '/' ) { int pathlength = 10; char* tmp_inf = new char[ pathlength ]; while ( !getcwd( tmp_inf, pathlength ) ) { pathlength += 10; delete[] tmp_inf; tmp_inf = new char[ pathlength ]; } pathlength += strlen( argv[ a ] ) + 1; delete[] tmp_inf; tmp_inf = new char[ pathlength ]; if ( !getcwd( tmp_inf, pathlength ) ) { cerr << "ERROR: cannot determine path of input file " << tmp_inf << "\n"; exit( -1 ); } tmp_inf = strcat( tmp_inf, "/" ); tmp_inf = strcat( tmp_inf, argv[ a ] ); opt.infile = string( tmp_inf ); delete[] tmp_inf; } else { opt.infile = string( argv[ a ] ); } opt.is.open( opt.infile.c_str() ); if ( !opt.is ) { cerr << "ERROR: cannot open input file " << opt.infile << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } break; default: err_flag = OPARI2_ERROR_NO_MESSAGE; break; } /* determine language and format by filename if not specified */ if ( !err_flag && !opt.infile.empty() && opt.lang == L_NA ) { size_t pos = opt.infile.find_last_of( '.' ); if ( pos < opt.infile.length() + 1 && opt.infile[ pos + 1 ] ) { switch ( opt.infile[ pos + 1 ] ) { case 'f': case 'F': opt.lang = opt.infile[ pos + 2 ] == '9' ? L_F90 : L_F77; break; case 'c': /*Files *.CUF and *.cuf are CUDA Fortran files*/ if ( opt.infile[ pos + 2 ] == 'u' && opt.infile[ pos + 3 ] == 'f' ) { opt.lang = L_F90; break; } case 'C': if ( opt.infile[ pos + 2 ] == 'U' && opt.infile[ pos + 3 ] == 'F' ) { opt.lang = L_F90; break; } opt.lang = opt.infile[ pos + 2 ] ? L_CXX : L_C; break; } } } if ( !err_flag && opt.infile.empty() && opt.lang == L_NA ) { cerr << "ERROR: cannot determine input file language\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } /* if no format is specified, default is free format for f90 and fix form for f77 */ if ( ( opt.form == F_NA ) && ( opt.lang & L_FORTRAN ) ) { if ( opt.lang & L_F77 ) { opt.form = F_FIX; } else { opt.form = F_FREE; } } /* generate output file name if necessary */ if ( !err_flag && opt.outfile.empty() ) { size_t pos = opt.infile.find_last_of( '.' ); if ( pos != string::npos ) { opt.outfile = opt.infile; opt.outfile.replace( pos, 1, ".mod." ); if ( opt.keep_src_info && ( opt.lang & L_FORTRAN ) ) { if ( opt.outfile.find( "cuf", pos ) == pos + 5 || opt.outfile.find( "CUF", pos ) == pos + 5 ) { opt.outfile[ pos + 5 ] = 'C'; opt.outfile[ pos + 6 ] = 'U'; opt.outfile[ pos + 7 ] = 'F'; } else { opt.outfile[ pos + 5 ] = 'F'; } } opt.os.open( opt.outfile.c_str() ); if ( !opt.os ) { cerr << "ERROR: cannot open output file " << opt.outfile << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } // opt.os << "\n"; } else { cerr << "ERROR: cannot generate output file name\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } /* print usage and die on error */ if ( err_flag ) { if ( err_flag == OPARI2_ERROR_NO_MESSAGE ) { print_usage_information( argv[ 0 ], std::cerr ); } exit( 1 ); } return; } void misc_init() { struct stat status; timeval compiletime; //long long int id[ 3 ]; uint64_t id[ 3 ]; stringstream id_str; int rest = 0; /* query inode number of the infile and timestamp as unique attribute */ int retval = stat( opt.infile.c_str(), &status ); // initialize inod_compiletime_id assert( retval == 0 ); gettimeofday( &compiletime, NULL ); //id[ 0 ] = ( long long int )status.st_ino; id[ 0 ] = static_cast< uint64_t > ( status.st_ino ); id[ 1 ] = static_cast< uint64_t > ( compiletime.tv_sec ); id[ 2 ] = static_cast< uint64_t > ( compiletime.tv_usec ); for ( int i = 0; i < 3; i++ ) { while ( id[ i ] > 36 || ( i > 1 && id[ i ] > 0 ) ) { rest = id[ i ] % 36; id[ i ] -= rest; id[ i ] /= 36; if ( rest < 10 ) { id_str << ( char )( rest + 48 ); } else { id_str << ( char )( rest + 87 ); } } if ( i < 2 ) { id[ i + 1 ] += id[ i ]; } } // generate opari2 include file name // only need base filename without path for include statement // in Fortran files and if an output file without dir is used size_t sep_in = opt.infile.find_last_of( '/' ); opt.incfile_nopath = string( opt.infile.substr( sep_in + 1 ) + ".opari.inc" ); size_t sep_out = opt.outfile.find_last_of( '/' ); if ( sep_out == string::npos ) { opt.incfile = ""; } else { opt.incfile = opt.outfile.substr( 0, sep_out + 1 ); } opt.incfile += opt.incfile_nopath; OPARI2_Directive::SetOptions( opt.lang, opt.form, opt.keep_src_info, opt.preprocessed_file, id_str.str() ); return; } /** * @brief Main function. * * Initialize directive and API table, handle command line options, * open files and call appropriate process function. */ int main( int argc, char* argv[] ) { process_cmd_line( argc, argv ); misc_init(); /* instrument source file */ if ( opt.lang & L_FORTRAN ) { /* in Fortran no Underscore is needed */ OPARI2_DirectiveOpenmp::SetOptPomptpd( "pomp_tpd" ); OPARI2_FortranParser parser( opt ); parser.process(); } else { if ( !opt.preprocessed_file ) { // const char* basename = strrchr( opt.incfile, '/' ); // basename = basename ? ( basename + 1 ) : opt.incfile; opt.os << "#include \"" << opt.incfile_nopath << "\"" << "\n"; if ( opt.keep_src_info ) { opt.os << "#line 1 \"" << opt.infile << "\"" << "\n"; } } OPARI2_CParser parser( opt ); parser.process(); } /* generate *.opari.inc ( by directive_manager ) */ Finalize( opt ); return 0; } opari2-2.0.10/src/opari/PaxHeaders/common.h0000644000000000000000000000013215232670204015407 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.151262021 opari2-2.0.10/src/opari/common.h0000664000175100001440000000353215232670204015744 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file common.h * @brief Functions to handle parallel regions. Including the creation * and initialization of region handles. */ #ifndef COMMON_H #define COMMON_H #include const std::string region_id_prefix( "opari2_region_" ); const std::string string_id_prefix( "opari2_ctc_" ); #endif /* COMMON_H */ opari2-2.0.10/src/opari/PaxHeaders/opari2_config_tool_frontend.h.in0000644000000000000000000000013115232670204022200 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 29 ctime=1785426078.11926221 opari2-2.0.10/src/opari/opari2_config_tool_frontend.h.in0000664000175100001440000000135115232670204022533 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2018, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_config_tool_frontend.h.in * * @brief */ /* @configure_input@ */ #define NM "@NM@" #define AWK "@AWK@" #define SCRIPT "@LIBEXECDIR@/pomp2-parse-init-regions.awk" #define EGREP "@EGREP@" #define VERSION "@PACKAGE_VERSION@" #define POMP2_API_VERSION "@LIBRARY_INTERFACE_VERSION@" #define CFLAGS "-I@INCLUDEDIR@" opari2-2.0.10/src/opari/PaxHeaders/Makefile.inc.am0000644000000000000000000000013215232670204016552 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.079262448 opari2-2.0.10/src/opari/Makefile.inc.am0000664000175100001440000000643415232670204017113 0ustar00builderusers## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2013, 2014 ## Forschungszentrum Juelich GmbH, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## ## ## @internal ## ## @file Makefile.inc.am ## ## @brief ## ## -*- mode: makefile -*- bin_PROGRAMS += opari2 opari2-config opari2_SOURCES = \ $(SRC_ROOT)src/opari/common.h \ $(SRC_ROOT)src/opari/opari2.cc \ $(SRC_ROOT)src/opari/opari2.h \ $(SRC_ROOT)src/opari/opari2_parser_c.h \ $(SRC_ROOT)src/opari/opari2_parser_c.cc \ $(SRC_ROOT)src/opari/opari2_parser_f.h \ $(SRC_ROOT)src/opari/opari2_parser_f.cc \ $(SRC_ROOT)src/opari/opari2_directive_manager.cc \ $(SRC_ROOT)src/opari/opari2_directive_manager.h \ $(SRC_ROOT)src/opari/opari2_directive_definition.h \ $(SRC_ROOT)src/opari/opari2_directive_entry.h \ $(SRC_ROOT)src/opari/opari2_directive.cc \ $(SRC_ROOT)src/opari/opari2_directive.h \ $(SRC_ROOT)src/opari/openmp/opari2_directive_entry_openmp.h \ $(SRC_ROOT)src/opari/openmp/opari2_directive_openmp.h \ $(SRC_ROOT)src/opari/openmp/opari2_directive_openmp.cc \ $(SRC_ROOT)src/opari/openmp/opari2_omp_handler.h \ $(SRC_ROOT)src/opari/openmp/opari2_omp_handler.cc \ $(SRC_ROOT)src/opari/pomp/opari2_directive_entry_pomp.h \ $(SRC_ROOT)src/opari/pomp/opari2_directive_pomp.h \ $(SRC_ROOT)src/opari/pomp/opari2_directive_pomp.cc \ $(SRC_ROOT)src/opari/pomp/opari2_pomp_handler.h \ $(SRC_ROOT)src/opari/pomp/opari2_pomp_handler.cc \ $(SRC_ROOT)src/opari/offload/opari2_directive_entry_offload.h \ $(SRC_ROOT)src/opari/offload/opari2_directive_offload.h \ $(SRC_ROOT)src/opari/offload/opari2_directive_offload.cc \ $(SRC_ROOT)src/opari/offload/opari2_offload_handler.cc \ $(SRC_ROOT)src/opari/offload/opari2_offload_handler.h \ opari2_usage.h opari2_CPPFLAGS = $(AM_CPPFLAGS) -DPACKAGE_VERSION="\"@PACKAGE_VERSION@\"" -I$(INC_ROOT)src/opari opari2includedir = $(includedir)/opari2 opari2include_HEADERS = $(PUBLIC_INC_SRC)pomp2_lib.h opari2include_HEADERS += $(PUBLIC_INC_SRC)pomp2_user_lib.h opari2_config_SOURCES = $(SRC_ROOT)src/opari/opari2_config.cc \ $(SRC_ROOT)src/opari/opari2_config.h \ opari2-config_usage.h BUILT_SOURCES += opari2_usage.h opari2-config_usage.h opari2_usage.h: $(INC_ROOT)doc/doxygen-user/opari2_usage.dox.in $(AM_V_GEN)$(AWK) '{print "\"" $$0 "\\n\""}' $(INC_ROOT)doc/doxygen-user/opari2_usage.dox.in > opari2_usage.h opari2-config_usage.h: $(INC_ROOT)doc/doxygen-user/opari2-config_usage.dox.in $(AM_V_GEN)$(AWK) '{print "\"" $$0 "\\n\""}' $(INC_ROOT)doc/doxygen-user/opari2-config_usage.dox.in > opari2-config_usage.h CLEANFILES += opari2_usage.h opari2-config_usage.h opari2-2.0.10/src/opari/PaxHeaders/pomp0000644000000000000000000000013215232670236014651 xustar0030 mtime=1785426078.183261832 30 atime=1785426082.655235368 30 ctime=1785426078.183261832 opari2-2.0.10/src/opari/pomp/0000775000175100001440000000000015232670236015260 5ustar00builderusersopari2-2.0.10/src/opari/pomp/PaxHeaders/opari2_pomp_handler.cc0000644000000000000000000000013115232670204021153 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.259415239 30 ctime=1785426078.183261832 opari2-2.0.10/src/opari/pomp/opari2_pomp_handler.cc0000664000175100001440000001421715232670204021513 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_pomp_handler.cc * * @brief This file contains all handler funtions to instrument and print POMP directives. */ #include #include using std::ostream; using std::cerr; #include "common.h" #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_pomp.h" #include "opari2_directive_manager.h" extern OPARI2_Option_t opt; OPARI2_DirectivePomp* cast2pomp( OPARI2_Directive* d_base ) { OPARI2_DirectivePomp* d = dynamic_cast( d_base ); if ( d == NULL ) { cerr << "INTERNAL ERROR: OPARI2_DirectivePomp* expected. Please contact user support.\n"; cleanup_and_exit(); } return d; } void h_pomp_inst( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); string& name = d->GetName(); char c1 = toupper( name.substr( 4 )[ 0 ] ); if ( opt.lang & L_FORTRAN ) { os << " call POMP2_" << c1 << name.substr( 5 ) << "()\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_" << c1 << name.substr( 5 ) << "();\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst init". */ void h_pomp_instinit( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp inst finalize". */ void h_pomp_instfinalize( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp inst on". */ void h_pomp_inston( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp inst off". */ void h_pomp_instoff( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp instrument" . */ void h_pomp_instrument( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); EnableInstrumentation( D_USER ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp noinstrument" . */ void h_pomp_noinstrument( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); DisableInstrumentation( D_USER ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst begin" . */ void h_pomp_instbegin( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); d->EnterRegion(); int id = d->GetID(); d->SetName( "userRegion" ); d->FindUserRegionName(); if ( opt.lang & L_FORTRAN ) { os << " call POMP2_Begin(" << region_id_prefix << id; os << ", " << d->GetCTCStringVariable() << ")\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_Begin(&" << region_id_prefix << id; os << ", " << d->GetCTCStringVariable() << ");\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst altend" . */ void h_pomp_instaltend( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); OPARI2_DirectivePomp* d_top = cast2pomp( DirectiveStackTop( d ) ); d->FindUserRegionName(); string& subname = d->GetUserRegionName(); string& subname_top = d_top->GetUserRegionName(); if ( subname != subname_top ) { string& filename = d->GetFilename(); cerr << filename << ":" << d_top->GetLineno() << ": ERROR: missing inst end(" << subname_top << ") pragma/directive\n"; cerr << filename << ":" << d->GetLineno() << ": ERROR: non-matching inst end(" << subname << ") pragma/directive\n"; cleanup_and_exit(); } if ( opt.lang & L_FORTRAN ) { os << " call POMP2_End(" << region_id_prefix << d_top->GetID() << ")\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_End(&" << region_id_prefix << d_top->GetID() << ");\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst end" . */ void h_pomp_instend( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); // change the directive/region name explicity. //d->SetRegionName( "endregion" ); d->SetName( "enduserRegion" ); d->FindUserRegionName(); OPARI2_DirectivePomp* d_top = cast2pomp( DirectiveStackTop( d ) ); string& subname = d->GetUserRegionName(); string& subname_top = d_top->GetUserRegionName(); int id = d->ExitRegion( false ); if ( subname != subname_top ) { string& filename = d->GetFilename(); cerr << filename << ":" << d_top->GetLineno() << ": ERROR: missing inst end(" << subname_top << ") pragma/directive\n"; cerr << filename << ":" << d->GetLineno() << ": ERROR: non-matching inst end(" << subname << ") pragma/directive\n"; cleanup_and_exit(); } if ( opt.lang & L_FORTRAN ) { os << " call POMP2_End(" << region_id_prefix << id << ")\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_End(&" << region_id_prefix << id << ");\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } opari2-2.0.10/src/opari/pomp/PaxHeaders/opari2_pomp_handler.h0000644000000000000000000000013115232670204021015 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.259415239 30 ctime=1785426078.183261832 opari2-2.0.10/src/opari/pomp/opari2_pomp_handler.h0000664000175100001440000000270415232670204021353 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_pomp_handler.h * * @brief */ #ifndef OPARI2_POMP_HANDLER_H #define OPARI2_POMP_HANDLER_H #include using std::ostream; void h_pomp_inst( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instinit( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instfinalize( OPARI2_Directive* ptr, ostream& os ); void h_pomp_inston( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instoff( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instrument( OPARI2_Directive* ptr, ostream& os ); void h_pomp_noinstrument( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instbegin( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instaltend( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instend( OPARI2_Directive* ptr, ostream& os ); void h_end_pomp_instbegin( OPARI2_Directive* ptr, ostream& os ); #endif opari2-2.0.10/src/opari/pomp/PaxHeaders/opari2_directive_pomp.cc0000644000000000000000000000013115232670204021514 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.259415239 30 ctime=1785426078.179261856 opari2-2.0.10/src/opari/pomp/opari2_directive_pomp.cc0000664000175100001440000000761715232670204022062 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_pomp.cc * * @brief Methods of POMP base class. */ #include #include using std::string; #include using std::ostream; #include #include "common.h" #include "opari2_directive_pomp.h" #include "opari2_directive_entry_pomp.h" /** This seems overkill in this case, but it should be consistent with the other paradigms*/ typedef struct { uint32_t mEnum; const string mGroupName; } OPARI2_POMPGroupStringMapEntry; OPARI2_POMPGroupStringMapEntry pompGroupStringMap[] = { { G_POMP_REGION, "userRegion" }, { G_POMP_ALL, "pomp" }, }; uint32_t OPARI2_DirectivePomp::String2Group( const string name ) { size_t n = sizeof( pompGroupStringMap ) / sizeof( OPARI2_POMPGroupStringMapEntry ); for ( size_t i = 0; i < n; ++i ) { if ( pompGroupStringMap[ i ].mGroupName.compare( name ) == 0 ) { return pompGroupStringMap[ i ].mEnum; } } return 0; } void OPARI2_DirectivePomp::IncrementRegionCounter( void ) { ++s_num_regions; } /** * @brief Generate CTC string for POMP region. */ string OPARI2_DirectivePomp::generate_ctc_string( OPARI2_Format_t form ) { stringstream s; if ( m_name == "userRegion" ) { s << "userRegionName=" << m_user_region_name << "*"; } return generate_ctc_string_common( form, s.str() ); } void OPARI2_DirectivePomp::GenerateHeader( ostream& os ) { if ( s_lang & L_C_OR_CXX ) { if ( !s_preprocessed_file ) { os << "#include \n\n"; } } } void OPARI2_DirectivePomp::GenerateDescr( ostream& os ) { OPARI2_Directive::generate_descr_common( os ); if ( s_lang & L_FORTRAN ) { s_init_handle_calls << " call " << s_paradigm_prefix << "_Assign_handle( " << region_id_prefix << m_id << ","; if ( s_format == F_FIX ) { s_init_handle_calls << "\n & "; } else { s_init_handle_calls << " &\n "; } s_init_handle_calls << m_ctc_string_variable << " )\n"; } else if ( s_lang & L_C_OR_CXX ) { s_init_handle_calls << " " << s_paradigm_prefix << "_Assign_handle( " << "&" << region_id_prefix << m_id << ", " << m_ctc_string_variable << " );\n"; } } /** * @brief Generate a function to allow initialization of all region handles for Fortran. * * These functions need to be called from POMP2_Init_regions. */ void OPARI2_DirectivePomp::GenerateInitHandleCalls( ostream& os, const string incfile ) { OPARI2_Directive::GenerateInitHandleCalls( os, incfile, s_paradigm_prefix, s_init_handle_calls, s_num_regions ); return; } void OPARI2_DirectivePomp::FindName( void ) { find_name_common(); if ( m_name == "inst" ) { m_name += find_next_word(); } } void OPARI2_DirectivePomp::SetName( string name_str ) { m_name = name_str; } void OPARI2_DirectivePomp::FindUserRegionName( void ) { string user_region_name = find_next_word(); if ( user_region_name == "(" ) { m_user_region_name = find_next_word(); } } string& OPARI2_DirectivePomp::GetUserRegionName( void ) { return m_user_region_name; } stringstream OPARI2_DirectivePomp::s_init_handle_calls; int OPARI2_DirectivePomp:: s_num_regions = 0; string OPARI2_DirectivePomp:: s_paradigm_prefix = "POMP2_USER"; opari2-2.0.10/src/opari/pomp/PaxHeaders/opari2_directive_pomp.h0000644000000000000000000000013115232670204021356 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.259415239 30 ctime=1785426078.179261856 opari2-2.0.10/src/opari/pomp/opari2_directive_pomp.h0000664000175100001440000000427115232670204021715 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_pomp.h * * @brief Class definitions for POMP directives. */ #ifndef OPARI2_DIRECTIVE_POMP_H #define OPARI2_DIRECTIVE_POMP_H #include using std::string; #include using std::ostream; #include using std::vector; #include "opari2.h" #include "opari2_directive.h" /** @brief Base Class to store and manipulate POMP directive and related data. */ class OPARI2_DirectivePomp : public OPARI2_Directive { public: OPARI2_DirectivePomp( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : OPARI2_Directive( fname, ln, lines, directive_prefix ) { m_type = OPARI2_PT_POMP; } virtual ~ OPARI2_DirectivePomp( void ) { } /** Increment region counter */ void IncrementRegionCounter( void ); void GenerateDescr( ostream& os ); /** @brief Generate first lines of "include" directives. */ static void GenerateHeader( ostream& os ); /** generate call POMP2_Init_reg_XXX function to initialize * all handles, in the Fortran case */ static void GenerateInitHandleCalls( ostream& os, const string incfile = "" ); virtual void FindName( void ); /** @brief Change the default directive name. */ void SetName( string name_str ); void FindUserRegionName( void ); string& GetUserRegionName( void ); /** Parse string and return POMP group id */ static uint32_t String2Group( const string name ); private: string m_user_region_name; virtual string generate_ctc_string( OPARI2_Format_t form ); static stringstream s_init_handle_calls; static string s_paradigm_prefix; static int s_num_regions; }; #endif opari2-2.0.10/src/opari/pomp/PaxHeaders/opari2_directive_entry_pomp.h0000644000000000000000000000013115232670204022577 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.259415239 30 ctime=1785426078.179261856 opari2-2.0.10/src/opari/pomp/opari2_directive_entry_pomp.h0000664000175100001440000000454715232670204023144 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry_pomp.h * * @brief Define POMP directive entries. */ #ifndef OPARI2_DIRECTIVE_ENTRY_POMP_H #define OPARI2_DIRECTIVE_ENTRY_POMP_H #include "opari2.h" #include "opari2_directive_entry.h" /** * @brief Definition of OpenAcc directive/runtime API group. * More directive group definition can be added before G_OMP_ALL. */ enum OPARI2_PompGroup { G_POMP_NONE = 0x00000000, G_POMP_REGION = 0x00000001, G_POMP_DEFAULT = 0x00010000, G_POMP_ALL = 0xFFFFFFFF }; #define OPARI2_POMP2_USER_SENTINELS \ { "!$pomp", OPARI2_PT_POMP }, \ { "c$pomp", OPARI2_PT_POMP }, \ { "*$pomp", OPARI2_PT_POMP }, \ { "!pomp$", OPARI2_PT_POMP }, \ { "!pomp$", OPARI2_PT_POMP }, \ { "cpomp$", OPARI2_PT_POMP }, \ { "*pomp$", OPARI2_PT_POMP }, \ { "pomp", OPARI2_PT_POMP } #define OPARI2_CREATE_POMP_TABLE_ENTRY( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY( OPARI2_PT_POMP, name, false, true, version, group, pomp ) #define OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY_NOEND( OPARI2_PT_POMP, name, false, version, group, pomp ) /** * TODO: * Set the correct version / group number for POMP directives */ #define OPARI2_POMP_DIRECTIVE_ENTRIES \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instinit, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instfinalize, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( inston, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instoff, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instrument, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( noinstrument, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instbegin, 1.1, G_POMP_REGION ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instaltend, 1.1, G_POMP_REGION ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instend, 1.1, G_POMP_REGION ) #endif // OPARI2_DIRECTIVE_ENTRY_POMP_H opari2-2.0.10/src/opari/PaxHeaders/openmp0000644000000000000000000000013015232670236015172 xustar0029 mtime=1785426078.17526188 30 atime=1785426082.655235368 29 ctime=1785426078.17526188 opari2-2.0.10/src/opari/openmp/0000775000175100001440000000000015232670236015603 5ustar00builderusersopari2-2.0.10/src/opari/openmp/PaxHeaders/opari2_omp_handler.cc0000644000000000000000000000013015232670204021315 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.259415239 29 ctime=1785426078.17526188 opari2-2.0.10/src/opari/openmp/opari2_omp_handler.cc0000664000175100001440000015247315232670204021665 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2016-2017, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_omp_handler.cc * * @brief This file contains all handler funtions to instrument and print * OpenMP pragmas. * * @todo A lot of functionality here might be generalized into a * separate writer class. This is planned for the future. */ #include #include using std::vector; #include using std::map; #include using std::stack; #include using std::cerr; #include using std::ifstream; using std::ofstream; #include using std::string; using std::getline; #include using std::exit; #include using std::strcmp; #include using std::toupper; #include using std::ostream; #include #include "common.h" #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_openmp.h" #include "opari2_directive_manager.h" extern OPARI2_Option_t opt; namespace { bool in_workshare = false; void generate_num_threads( ostream& os, OPARI2_DirectiveOpenmp* d ) { string num_threads = d->GetClauseArg( "num_threads" ); if ( opt.lang & L_FORTRAN ) { if ( num_threads.length() ) { os << " pomp2_num_threads = " << num_threads << "\n"; } else { os << " pomp2_num_threads = pomp2_lib_get_max_threads()\n"; } } else { if ( num_threads.length() ) { os << " int pomp2_num_threads = " << num_threads << ";\n"; } else { os << " int pomp2_num_threads = omp_get_max_threads();\n"; } } } void generate_if( ostream& os, OPARI2_DirectiveOpenmp* d ) { string if_clause = d->GetClauseArg( "if" ); if ( opt.lang & L_FORTRAN ) { if ( if_clause.length() ) { os << " pomp2_if = ( " << if_clause << " )\n"; } else { os << " pomp2_if = .true.\n"; } } else { if ( if_clause.length() ) { os << " int pomp2_if = (int)( " << if_clause << " );\n"; } else { os << " int pomp2_if = 1;\n"; } } } void generate_call( const char* event, const char* type, int id, ostream& os, OPARI2_DirectiveOpenmp* d ) { char c1 = toupper( type[ 0 ] ); string ctc_string; if ( opt.lang & L_FORTRAN ) { if ( strcmp( type, "task" ) == 0 || strcmp( type, "untied_task" ) == 0 ) { os << " if (pomp2_if) then\n"; } os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( strstr( type, "task" ) != NULL && strcmp( type, "taskwait" ) != 0 && strcmp( event, "begin" ) == 0 ) { os << ", pomp2_new_task"; } if ( d != NULL ) { if ( opt.form == F_FIX ) { os << ",\n &" << d->GetCTCStringVariable() << " "; } else { os << ", &\n " << d->GetCTCStringVariable() << " "; } } os << ")\n"; if ( strcmp( type, "task" ) == 0 || strcmp( type, "untied_task" ) == 0 ) { os << " end if\n"; } } else { if ( strcmp( event, "begin" ) == 0 || strcmp( event, "fork" ) == 0 || strcmp( event, "enter" ) == 0 ) { os << "{ "; } if ( strcmp( type, "task" ) == 0 || strcmp( type, "untied_task" ) == 0 ) { os << "if (pomp2_if)"; } os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "( &" << region_id_prefix << id; if ( strstr( type, "task" ) != NULL && strcmp( type, "taskwait" ) != 0 && strcmp( event, "begin" ) == 0 ) { os << ", pomp2_new_task"; } if ( d != NULL ) { os << ", " << d->GetCTCStringVariable() << " "; } os << " );"; if ( strcmp( event, "end" ) == 0 ) { os << " }"; } os << "\n"; if ( strcmp( event, "join" ) == 0 || strcmp( event, "exit" ) == 0 ) { os << " }\n"; } } } void generate_call_save_task_id( const char* event, const char* type, int id, ostream& os, OPARI2_DirectiveOpenmp* d ) { char c1 = toupper( type[ 0 ] ); string ctc_string; if ( opt.lang & L_FORTRAN ) { if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " if (pomp2_if) then\n"; } os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( ( strcmp( type, "task_create" ) == 0 ) || ( strcmp( type, "untied_task_create" ) == 0 ) ) { if ( opt.form == F_FIX ) { os << ",\n &pomp2_new_task"; } else { os << ", pomp2_new_task"; } } if ( opt.form == F_FIX ) { os << ",\n &pomp2_old_task"; } else { os << ",&\n pomp2_old_task"; } if ( d != NULL ) { if ( opt.form == F_FIX ) { if ( d->GetName() == "task" ) { os << ",\n &pomp2_if"; } os << ",\n &" << d->GetCTCStringVariable() << " "; } else { if ( d->GetName() == "task" ) { os << ", pomp2_if"; } os << ", " << d->GetCTCStringVariable() << " "; } } os << ")\n"; if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " end if\n"; } } else { os << "{ POMP2_Task_handle pomp2_old_task;\n"; if ( ( strcmp( type, "task_create" ) == 0 ) || ( strcmp( type, "untied_task_create" ) == 0 ) ) { os << " POMP2_Task_handle pomp2_new_task;\n"; } if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << "if (pomp2_if)"; } os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "( &" << region_id_prefix << id; if ( ( strcmp( type, "task_create" ) == 0 ) || ( strcmp( type, "untied_task_create" ) == 0 ) ) { os << ", &pomp2_new_task"; } os << ", &pomp2_old_task"; if ( d != NULL ) { if ( d->GetName() == "task" ) { os << ", pomp2_if"; } os << ", " << d->GetCTCStringVariable() << " "; } os << " );\n"; } } void generate_call_restore_task_id( const char* event, const char* type, int id, ostream& os ) { char c1 = toupper( type[ 0 ] ); string ctc_string; if ( opt.lang & L_FORTRAN ) { if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " if (pomp2_if) then\n"; } os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( opt.form == F_FIX ) { os << ",\n &pomp2_old_task)\n"; } else { os << ", pomp2_old_task)\n"; } if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " end if\n"; } } else { if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << "if (pomp2_if)"; } os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "( &" << region_id_prefix << id; os << ", pomp2_old_task ); }\n"; } } /** @brief Instrument an OpenMP Fork. * * The pomp2_num_threads variable is * used to pass the number of requested threads for the * parallel region to the POMP library. It is either the * result of omp_get_max_threads() or of the num_threads() * clause, if present. */ void generate_fork_call( const char* event, const char* type, int id, ostream& os, OPARI2_DirectiveOpenmp* d ) { char c1 = toupper( type[ 0 ] ); if ( opt.lang & L_C_OR_CXX ) { os << "{\n"; } generate_num_threads( os, d ); generate_if( os, d ); if ( opt.lang & L_FORTRAN ) { os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( opt.form == F_FIX ) { os << ",\n &pomp2_if, pomp2_num_threads, pomp2_old_task"; if ( d != NULL ) { os << ",\n &" << d->GetCTCStringVariable() << " "; } } else { os << ",&\n pomp2_if, pomp2_num_threads, pomp2_old_task"; if ( d != NULL ) { os << ", &\n " << d->GetCTCStringVariable() << " "; } } os << ")\n"; } else { os << " POMP2_Task_handle pomp2_old_task;\n"; os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "(&" << region_id_prefix << id << ", pomp2_if, pomp2_num_threads, " << "&pomp2_old_task"; if ( d != NULL ) { os << ", " << d->GetCTCStringVariable() << " "; } os << ");\n"; } } /** @brief Generate the OpenMP pragma/directive. */ void generate_directive( const char* p, int lineno, const char* filename, ostream& os ) { if ( lineno && opt.keep_src_info ) { // print original source location information reset pragma os << "#line " << lineno << " \"" << filename << "\"" << "\n"; } if ( opt.lang & L_FORTRAN ) { os << "!$omp " << p << "\n"; } else { os << "#pragma omp " << p << "\n"; } } void generate_barrier( int n, ostream& os, const char* filename ) { generate_call_save_task_id( "enter", "implicit_barrier", n, os, NULL ); generate_directive( "barrier", 0, filename, os ); generate_call_restore_task_id( "exit", "implicit_barrier", n, os ); } } //end-of-namespace OPARI2_DirectiveOpenmp* cast2omp( OPARI2_Directive* d_base ) { OPARI2_DirectiveOpenmp* d = dynamic_cast( d_base ); if ( d == NULL ) { cerr << "INTERNAL ERROR: OPARI2_DirectiveOpenmp* expected. Please contact user support.\n"; cleanup_and_exit(); } return d; } /** * @brief Print the directive's lines, together with additional * statements to support OpenMP task. */ void print_directive_parallel( OPARI2_DirectiveOpenmp* d, ostream& os ) { opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); stringstream adds; if ( opt.lang & L_FORTRAN ) { if ( opt.form == F_FIX ) // fix source form { adds << "\n!$omp& firstprivate(pomp2_old_task) private(pomp2_new_task)\n!$omp&"; if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads)"; if ( omp_opt->copytpd ) { adds << " copyin(" << omp_opt->pomp_tpd << ")"; } if ( d->ChangedDefault() ) { adds << "\n!$omp& shared(/" << "cb" << d->GetInodeCompiletimeID() << "/)\n" << "!$omp& private(pomp2_if,pomp2_num_threads)"; } } else // free source form { adds << " &\n !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) &\n"; adds << " !$omp"; if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads)"; if ( omp_opt->copytpd ) { adds << " copyin(" << omp_opt->pomp_tpd << ")"; } if ( d->ChangedDefault() ) { adds << " &\n !$omp shared(/" << "cb" << d->GetInodeCompiletimeID() << "/)" << " &\n !$omp private(pomp2_if,pomp2_num_threads)"; } } } else //C/C++ { adds << " firstprivate(pomp2_old_task)"; if ( omp_opt->copytpd ) { if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads) copyin(" << omp_opt->pomp_tpd << ")"; } else { if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads)"; } } /* Parallel directives must always be instrumented to enable * a measurement system to do its memory management in a * threadsafe manner. Therefore the line directive must be * inserted even if instrumentation is turned off. */ if ( opt.keep_src_info && !InstrumentationDisabled( D_FULL ) ) { // print original source location information reset pragma os << "#line " << d->GetLineno() << " \"" << d->GetFilename() << "\"" << "\n"; } d->PrintPlainDirective( os, adds.str() ); } void enter_handler_notransform( OPARI2_DirectiveOpenmp* d, ostream& os ) { DirectiveStackPush( d ); d->PrintPlainDirective( os ); } void exit_handler_notransform( OPARI2_DirectiveOpenmp* d ) { DirectiveStackPop(); } /** * @brief OpenMP pragma transformation functions. * * These functions are called by directive manager ONLY if the directive is enabled. */ /** * Note: parallel directive MUST ignore "pomp noinstrument" * to ensure the measurement library is thread-safe. */ void h_omp_parallel( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_parallel( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); if ( !InstrumentationDisabled( D_USER ) && DirectiveActive( OPARI2_PT_OMP, "barrier" ) ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "end", "parallel", id, os, NULL ); d->PrintDirective( os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info && !InstrumentationDisabled( D_FULL ) ) { d->ResetSourceInfo( os ); } } } void h_omp_for( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); if ( !d->HasClause( "nowait" ) ) { d->AddNowait(); } generate_call( "enter", "for", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_end_omp_for( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( false ); if ( d_top->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "for", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_do( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "do", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_end_omp_do( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); } else { d->AddNowait(); d->PrintDirective( os ); generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "do", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_sections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); if ( !d->HasClause( "nowait" ) ) { d->AddNowait(); } generate_call( "enter", "sections", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_omp_section_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); //Init region using the parent directive's region ID! d->InitRegion( d_top ); DirectiveStackPush( d ); int num_sections = d_top->GetNumSections(); if ( num_sections ) { d->PrintPlainDirective( os ); } else { d->PrintDirective( os ); } generate_call( "begin", "section", d_top->GetID(), os, d_top ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } num_sections += 1; d_top->SetNumSections( num_sections ); } } void h_end_omp_section_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); generate_call( "end", "section", d_top->GetID(), os, NULL ); DirectiveStackPop(); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_section( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_C_OR_CXX ) { h_end_omp_section_c( d_base, os ); } } void h_end_omp_sections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( false ); if ( d_top->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "sections", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_sections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "sections", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_omp_sections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_sections_f( d_base, os ); } else { h_omp_sections_c( d_base, os ); } } void h_omp_section_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int num_sections = d_top->GetNumSections(); if ( num_sections ) { // close last section if necessary generate_call( "end", "section", d_top->GetID(), os, NULL ); } d->PrintDirective( os ); generate_call( "begin", "section", d_top->GetID(), os, d_top ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } d_top->SetNumSections( ++num_sections ); } } void h_omp_section( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_section_f( d_base, os ); } else { h_omp_section_c( d_base, os ); } } void h_end_omp_sections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "section", id, os, NULL ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); } else { d->AddNowait(); d->PrintDirective( os ); generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "sections", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_sections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_sections_f( d_base, os ); } else { h_end_omp_sections_c( d_base, os ); } } void h_omp_single_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); if ( !d->HasClause( "nowait" ) && !d->HasClause( "copyprivate" ) ) { d->AddNowait(); } int id = d->GetID(); generate_call( "enter", "single", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_single_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( false ); generate_call( "end", "single", id, os, NULL ); if ( d_top->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_single_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); int id = d->GetID(); generate_call( "enter", "single", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_single( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_single_f( d_base, os ); } else { h_omp_single_c( d_base, os ); } } void h_end_omp_single_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "single", id, os, NULL ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); } else { if ( !d->HasClause( "copyprivate" ) ) { d->AddNowait(); } d->PrintDirective( os ); if ( d->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } } generate_call( "exit", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_single( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_single_f( d_base, os ); } else { h_end_omp_single_c( d_base, os ); } } void h_omp_master( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); d->PrintDirective( os ); generate_call( "begin", "master", d->GetID(), os, d ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_master_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "master", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_master_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "master", id, os, NULL ); d->PrintDirective( os ); } } void h_end_omp_master( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_master_f( d_base, os ); } else { h_end_omp_master_c( d_base, os ); } } void h_omp_critical( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); /** 'critical' should NOT be instrumented if inside 'workshare' construct */ if ( InstrumentationDisabled( D_USER ) || in_workshare ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); int id = d->GetID(); generate_call( "enter", "critical", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "critical", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_critical( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); if ( InstrumentationDisabled( D_USER ) || in_workshare ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); string& name = d->GetName(); string& subname = d->GetUserName(); string& subname_top = d_top->GetUserName(); if ( name[ 0 ] != '$' ) { if ( subname != subname_top ) { cerr << d->GetFilename() << ":" << d_top->GetLineno() << ": ERROR: missing end critical(" << subname << ") directive\n"; cerr << d->GetFilename() << ":" << d->GetLineno() << ": ERROR: non-matching end critical(" << subname << ") directive\n"; cleanup_and_exit(); } } generate_call( "end", "critical", id, os, NULL ); d->PrintDirective( os ); generate_call( "exit", "critical", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_parallelfor( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); OPARI2_DirectiveOpenmp* for_directive = d->SplitCombined(); if ( InstrumentationDisabled( D_USER ) || !( d->active ) ) { generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); } else { for_directive->AddNowait(); generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); generate_call( "enter", "for", id, os, d ); } for_directive->PrintDirective( os ); // #omp for nowait delete for_directive; } } void h_end_omp_parallelfor( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_barrier( id, os, d->GetFilename().c_str() ); generate_call( "exit", "for", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_paralleldo( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); generate_fork_call( "fork", "parallel", id, os, d ); OPARI2_DirectiveOpenmp* do_directive = d->SplitCombined(); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_call( "enter", "do", id, os, d ); } do_directive->PrintDirective( os ); // #omp do delete do_directive; } } void h_end_omp_paralleldo( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); string& filename = d->GetFilename(); int lineno = d->GetLineno(); if ( InstrumentationDisabled( D_USER ) || !( d->active ) ) { generate_directive( "end do", lineno, filename.c_str(), os ); } else { generate_directive( "end do nowait", lineno, filename.c_str(), os ); generate_barrier( id, os, filename.c_str() ); generate_call( "exit", "do", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_directive( "end parallel", lineno, filename.c_str(), os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_parallelsections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); OPARI2_DirectiveOpenmp* d_section = d->SplitCombined(); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { d_section->AddNowait(); } generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_call( "enter", "sections", id, os, d ); } d_section->PrintDirective( os ); // #omp sections delete d_section; } } void h_omp_parallelsections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); OPARI2_DirectiveOpenmp* sec_directive = d->SplitCombined(); generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); // #omp parallel generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_call( "enter", "sections", id, os, NULL ); } sec_directive->PrintDirective( os ); // #omp sections delete sec_directive; } } void h_omp_parallelsections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_parallelsections_f( d_base, os ); } else { h_omp_parallelsections_c( d_base, os ); } } void h_end_omp_parallelsections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_barrier( id, os, d->GetFilename().c_str() ); generate_call( "exit", "sections", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_parallelsections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); int lineno = d->GetLineno(); string& filename = d->GetFilename(); if ( InstrumentationDisabled( D_USER ) || !( d->active ) ) { generate_directive( "end sections", lineno, filename.c_str(), os ); // generate_barrier( id, os, filename.c_str() ); } else { generate_call( "end", "section", id, os, NULL ); generate_directive( "end sections nowait", lineno, filename.c_str(), os ); generate_barrier( id, os, filename.c_str() ); generate_call( "exit", "sections", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_directive( "end parallel", lineno, filename.c_str(), os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_parallelsections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_parallelsections_f( d_base, os ); } else { h_end_omp_parallelsections_c( d_base, os ); } } void h_omp_barrier( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { /** initialize region information */ d->InitRegion(); SaveForInit( d ); int id = d->GetID(); generate_call_save_task_id( "enter", "barrier", id, os, d ); d->PrintDirective( os ); generate_call_restore_task_id( "exit", "barrier", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_flush( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { d->InitRegion(); SaveForInit( d ); int id = d->GetID(); generate_call( "enter", "flush", id, os, d ); d->PrintDirective( os ); generate_call( "exit", "flush", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_atomic( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); SaveSingleLineDirective( d ); /** * 'atomic' directive should NOT be instrumented if inside a 'workshare' region. */ if ( InstrumentationDisabled( D_USER ) || in_workshare ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "atomic", d->GetID(), os, d ); d->PrintDirective( os ); } } /** * Special handler for the end of 'atomic' region in Fortran. */ void extra_openmp_atomic_handler( OPARI2_Directive* d_base, const int lineno, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( d && ( InstrumentationDisabled( D_USER ) || in_workshare ) ) { exit_handler_notransform( d ); SaveSingleLineDirective( NULL ); } else { if ( d ) { d->SetEndLineno( lineno, lineno ); generate_call( "exit", "atomic", d->GetID(), os, NULL ); DirectiveStackPop(); if ( opt.keep_src_info ) { os << "#line " << ( lineno + 1 ) << " \"" << opt.infile << "\"" << "\n"; } SaveSingleLineDirective( NULL ); } } } void h_end_omp_atomic( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) || in_workshare ) { exit_handler_notransform( d ); SaveSingleLineDirective( NULL ); } else { int id = d->ExitRegion( false ); generate_call( "exit", "atomic", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } SaveSingleLineDirective( NULL ); } } void h_omp_workshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); in_workshare = true; if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "workshare", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_end_omp_workshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); in_workshare = false; if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); generate_call( "exit", "workshare", id, os, NULL ); } else { d->AddNowait(); d->PrintDirective( os ); generate_barrier( id, os, d->GetFilename().c_str() ); generate_call( "exit", "workshare", id, os, NULL ); } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_parallelworkshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); generate_fork_call( "fork", "parallel", id, os, d ); OPARI2_DirectiveOpenmp* ws_directive = d->SplitCombined(); print_directive_parallel( d, os ); // #omp parallel generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) ) { generate_call( "enter", "workshare", id, os, d ); } ws_directive->PrintDirective( os ); // #omp workshare in_workshare = true; delete ws_directive; } } /*2.0*/ void h_end_omp_parallelworkshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); in_workshare = false; if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); int lineno = d->GetLineno(); string& filename = d->GetFilename(); if ( InstrumentationDisabled( D_USER ) ) { generate_directive( "end workshare", lineno, filename.c_str(), os ); //generate_barrier( id, os, filename.c_str() ); } else { generate_directive( "end workshare nowait", lineno, filename.c_str(), os ); generate_barrier( id, os, filename.c_str() ); generate_call( "exit", "workshare", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_directive( "end parallel", lineno, filename.c_str(), os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } /*2.5*/ void h_omp_ordered( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); int id = d->GetID(); generate_call( "enter", "ordered", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "ordered", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } /*2.5*/ void h_end_omp_ordered( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "ordered", id, os, NULL ); d->PrintDirective( os ); generate_call( "exit", "ordered", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } /*3.0*/ void h_omp_task( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); const char* inner_call, * outer_call; opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); int id = d->GetID(); if ( !InstrumentationDisabled( D_FULL ) ) { d->AddDescr( id ); } outer_call = "task_create"; inner_call = "task"; if ( omp_opt->task_abort ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "ERROR: Tasks are not allowed with this configuration." << std::endl; cleanup_and_exit(); } if ( omp_opt->task_warn ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "WARNING: Tasks may not be supported by the measurement system." << std::endl; } if ( d->HasClause( "untied" ) ) { if ( omp_opt->untied_abort ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "ERROR: Untied tasks are not allowed with this configuration." << std::endl; cleanup_and_exit(); } if ( !omp_opt->untied_nowarn && !omp_opt->untied_keep ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "WARNING: untied tasks may not be supported by the measurement system.\n" << " All untied tasks are now made tied.\n" << " Please consider using --omp-task-untied=abort|keep|no-warn" << std::endl; } if ( omp_opt->untied_keep ) { outer_call = "untied_task_create"; inner_call = "untied_task"; } } if ( !omp_opt->task_remove ) { if ( ( opt.lang & L_C_OR_CXX ) ) { os << "{\n"; } generate_if( os, d ); generate_call_save_task_id( "begin", outer_call, id, os, d ); stringstream adds; if ( opt.lang & L_FORTRAN ) { if ( opt.form == F_FIX ) // Fix source form { adds << "\n!$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if)"; if ( d->ChangedDefault() ) { adds << "\n!$omp& shared(/" << "cb" << d->GetInodeCompiletimeID() << "/) "; } } else // Free source form { adds << " if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if)"; if ( d->ChangedDefault() ) { adds << "&\n !$omp shared(/" << "cb" << d->GetInodeCompiletimeID() << "/)"; } } } else { adds << " if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if)"; } d->PrintDirective( os, adds.str() ); generate_call( "begin", inner_call, id, os, NULL ); } else { os << "//!!! Removed task directive due to user option \"--task=remove\"!" << std::endl; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_task( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( true ); const char* inner_call, * outer_call; opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); if ( d_top->HasClause( "untied" ) && omp_opt->untied_keep ) { outer_call = "untied_task_create"; inner_call = "untied_task"; } else { outer_call = "task_create"; inner_call = "task"; } if ( !omp_opt->task_remove ) { generate_call( "end", inner_call, id, os, NULL ); d->PrintDirective( os ); generate_call_restore_task_id( "end", outer_call, id, os ); if ( ( opt.lang & L_C_OR_CXX ) ) { os << "}\n"; } } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_taskwait( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { d->InitRegion(); SaveForInit( d ); int id = d->GetID(); generate_call_save_task_id( "begin", "taskwait", id, os, d ); d->PrintDirective( os ); generate_call_restore_task_id( "end", "taskwait", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_threadprivate( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); d->PrintDirective( os ); } opari2-2.0.10/src/opari/openmp/PaxHeaders/opari2_omp_handler.h0000644000000000000000000000013015232670204021157 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.259415239 29 ctime=1785426078.17526188 opari2-2.0.10/src/opari/openmp/opari2_omp_handler.h0000664000175100001440000001167115232670204021521 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_omp_handler.h * * @brief */ #ifndef OPARI2_OMP_HANDLER_H #define OPARI2_OMP_HANDLER_H #include using std::ostream; void h_omp_parallel( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallel( OPARI2_Directive* d, ostream& os ); void h_omp_for( OPARI2_Directive* d, ostream& os ); void h_end_omp_for( OPARI2_Directive* d, ostream& os ); void h_omp_do( OPARI2_Directive* d, ostream& os ); void h_end_omp_do( OPARI2_Directive* d, ostream& os ); void h_omp_sections( OPARI2_Directive* d, ostream& os ); void h_omp_section( OPARI2_Directive* d, ostream& os ); void h_end_omp_section( OPARI2_Directive* d, ostream& os ); void h_end_omp_sections( OPARI2_Directive* d, ostream& os ); void h_omp_single( OPARI2_Directive* d, ostream& os ); void h_end_omp_single( OPARI2_Directive* d, ostream& os ); void h_omp_master( OPARI2_Directive* d, ostream& os ); void h_end_omp_master( OPARI2_Directive* d, ostream& os ); void h_omp_critical( OPARI2_Directive* d, ostream& os ); void h_end_omp_critical( OPARI2_Directive* d, ostream& os ); void h_omp_parallelfor( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallelfor( OPARI2_Directive* d, ostream& os ); void h_omp_paralleldo( OPARI2_Directive* d, ostream& os ); void h_end_omp_paralleldo( OPARI2_Directive* d, ostream& os ); void h_omp_parallelsections( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallelsections( OPARI2_Directive* d, ostream& os ); void h_omp_barrier( OPARI2_Directive* d, ostream& os ); void h_omp_flush( OPARI2_Directive* d, ostream& os ); void h_omp_atomic( OPARI2_Directive* d, ostream& os ); void h_end_omp_atomic( OPARI2_Directive* d, ostream& os ); void h_omp_workshare( OPARI2_Directive* d, ostream& os ); void h_end_omp_workshare( OPARI2_Directive* d, ostream& os ); void h_omp_parallelworkshare( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallelworkshare( OPARI2_Directive* d, ostream& os ); void h_omp_ordered( OPARI2_Directive* d, ostream& os ); void h_end_omp_ordered( OPARI2_Directive* d, ostream& os ); void h_omp_task( OPARI2_Directive* d, ostream& os ); void h_end_omp_task( OPARI2_Directive* d, ostream& os ); void h_omp_taskwait( OPARI2_Directive* d, ostream& os ); void h_omp_threadprivate( OPARI2_Directive* d, ostream& os ); void extra_openmp_atomic_handler( OPARI2_Directive* d, const int lineno, ostream& os ); void finalize_handler( ostream& os ); #endif opari2-2.0.10/src/opari/openmp/PaxHeaders/opari2_directive_openmp.cc0000644000000000000000000000013115232670204022362 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.255415263 30 ctime=1785426078.171261903 opari2-2.0.10/src/opari/openmp/opari2_directive_openmp.cc0000664000175100001440000006744115232670204022731 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014, 2017, 2023, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_directive_openmp.cc * * @brief Methods of Openmp abstract base class, * useed to process OpenMP pragmas in C/C++ and Fortran program. */ #include #include using std::cerr; #include using std::string; #include #include "common.h" #include "opari2_directive_openmp.h" #include "opari2_directive_entry_openmp.h" #include "opari2_directive_manager.h" #define MAKE_STR( x ) MAKE_STR_( x ) #define MAKE_STR_( x ) #x typedef struct { uint32_t mEnum; const string mGroupName; } OPARI2_OpenMPGroupStringMapEntry; OPARI2_OpenMPGroupStringMapEntry ompGroupStringMap[] = { { G_OMP_ATOMIC, "atomic" }, { G_OMP_CRITICAL, "critical" }, { G_OMP_MASTER, "master" }, { G_OMP_SINGLE, "single" }, { G_OMP_LOCKS, "locks" }, { G_OMP_FLUSH, "flush" }, { G_OMP_TASK, "tasks" }, { G_OMP_SYNC, "sync" }, { G_OMP_OMP, "omp" }, { G_OMP_ALL, "all" }, }; /** * @brief Handle Openmp specific command line options ONLY in the form of "--omp-xx=xxx" */ OPARI2_ErrorCode OPARI2_DirectiveOpenmp::ProcessOption( string option ) { OPARI2_ErrorCode err_flag = OPARI2_NO_ERROR; if ( option != "" ) { /* handle new openmp-specific options */ if ( option == "--omp-nodecl" ) { s_omp_opt.add_shared_decl = false; } else if ( option == "--omp-tpd" ) { s_omp_opt.copytpd = true; } else if ( option.find( "--omp-tpd-mangling=" ) != string::npos ) { size_t p1 = option.find( "=" ); string tpd_arg = option.substr( p1 + 1 ); if ( tpd_arg != "" ) { if ( tpd_arg == "gnu" || tpd_arg == "sun" || tpd_arg == "intel" || tpd_arg == "pgi" || tpd_arg == "cray" ) { s_omp_opt.pomp_tpd = "pomp_tpd_"; s_omp_opt.tpd_in_extern_block = false; } else if ( tpd_arg == "ibm" ) { s_omp_opt.pomp_tpd = "pomp_tpd"; s_omp_opt.tpd_in_extern_block = true; } else { cerr << "ERROR: unknown option for --omp-tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else { cerr << "ERROR: missing value for option --omp-tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else if ( option.find( "--omp-task=" ) != string::npos ) { size_t p1 = option.find( "=" ) + 1; size_t p2 = option.find( ",", p1 ); size_t len = p2 == string::npos ? p2 : p2 - p1; string token = option.substr( 11, len ); do { if ( token == "abort" ) { s_omp_opt.task_abort = true; } else if ( token == "warn" ) { s_omp_opt.task_warn = true; } else if ( token == "remove" ) { s_omp_opt.task_remove = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --omp-task\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } p2 = option.find( ",", p1 + 1 ); if ( p2 == string::npos ) { break; } len = p2 - p1; p1 = p2 + 1; p2 = option.find( ",", len ); token = option.substr( p1, p2 ); } while ( true ); } else if ( option.find( "--omp-task-untied=" ) != string::npos ) { size_t p1 = option.find( "=" ) + 1; size_t p2 = option.find( ",", p1 ); size_t len = p2 == string::npos ? p2 : p2 - p1; string token = option.substr( 18, len ); do { if ( token == "abort" ) { s_omp_opt.untied_abort = true; } else if ( token == "no-warn" ) { s_omp_opt.untied_nowarn = true; } else if ( token == "keep" ) { s_omp_opt.untied_keep = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --omp-task-untied\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; break; } p2 = option.find( ",", p1 + 1 ); if ( p2 == string::npos ) { break; } len = p2 - p1; p1 = p2 + 1; p2 = option.find( ",", len ); token = option.substr( p1, p2 ); } while ( true ); } else { err_flag = OPARI2_ERROR_NO_MESSAGE; } } return err_flag; } opari2_omp_option* OPARI2_DirectiveOpenmp::GetOpenmpOpt( void ) { return &s_omp_opt; } void OPARI2_DirectiveOpenmp::IncrementRegionCounter( void ) { ++s_num_regions; } uint32_t OPARI2_DirectiveOpenmp::String2Group( const string name ) { size_t n = sizeof( ompGroupStringMap ) / sizeof( OPARI2_OpenMPGroupStringMapEntry ); for ( size_t i = 0; i < n; ++i ) { if ( ompGroupStringMap[ i ].mGroupName.compare( name ) == 0 ) { return ompGroupStringMap[ i ].mEnum; } } return 0; } /* * @breif Set class variable "omp_pomp_tpd". * * This static method is intended to be called by main() * when handling a FORTRAN source file. */ void OPARI2_DirectiveOpenmp::SetOptPomptpd( string str ) { s_omp_opt.pomp_tpd = str; return; } /** * @brief Find and store the directive name. */ void OPARI2_DirectiveOpenmp::FindName( void ) { find_name_common(); if ( m_name == "parallel" || m_name == "endparallel" ) { string w = find_next_word(); if ( w == "do" || w == "sections" || w == "for" || w == "workshare" /*2.0*/ ) { m_name += w; } } else if ( m_name == "end" ) { string w = find_next_word(); m_name += w; if ( w == "parallel" ) { w = find_next_word(); if ( w == "do" || w == "sections" || w == "for" || w == "workshare" /*2.0*/ ) { m_name += w; } } } if ( m_name == "critical" || m_name == "endcritical" ) { string cname = find_next_word(); if ( cname == "(" ) { m_user_name = find_next_word(); } } identify_clauses(); } void OPARI2_DirectiveOpenmp::identify_clauses( void ) { for ( vector::iterator it = s_directive_clauses[ m_name ].begin(); it != s_directive_clauses[ m_name ].end(); ++it ) { unsigned line = 0; string::size_type pos = 0; if ( find_word( *it, line, pos ) ) { bool remove = ( *it == "if" || *it == "num_threads" || ( *it == "untied" && !s_omp_opt.untied_keep ) ); m_clauses[ *it ] = find_arguments( line, pos, remove, *it ); } } } string OPARI2_DirectiveOpenmp::generate_ctc_string( OPARI2_Format_t form ) { stringstream s; s.clear(); if ( m_name == "critical" ) { if ( !m_user_name.empty() ) { s << "criticalName=" << m_user_name << "*"; } } else if ( m_name == "sections" ) { s << "numSections=" << m_num_sections << "*"; } for ( OPARI2_StrStr_map_t::iterator it = m_clauses.begin(); it != m_clauses.end(); ++it ) { /** Clauses not to appear on CTC-string */ if ( ( *it ).first != "private" && ( *it ).first != "lastprivate" && ( *it ).first != "firstprivate" && ( *it ).first != "copyin" && ( ( *it ).first != "default" || ChangedDefault() ) ) { string name = ( *it ).first; name[ 0 ] = toupper( name[ 0 ] ); s << "has" << name << "="; /** Clauses for which the argument is put on the CTC-string */ if ( ( *it ).first == "schedule" || ( *it ).first == "default" ) { /*replace * with @ in the CTC String to distinguish it from the CTC String delimited '*' */ while ( ( *it ).second.find( '*' ) != string::npos ) { ( *it ).second.replace( ( *it ).second.find( '*' ), 1, "@" ); } s << ( *it ).second << "*"; } else { s << "1" << "*"; } } } return generate_ctc_string_common( form, s.str() ); } /** * @brief Is the default data sharing changed by default(none) or default(private) clause? */ bool OPARI2_DirectiveOpenmp::ChangedDefault( void ) { if ( m_clauses.find( "default" ) == m_clauses.end() ) { return false; } else { return m_clauses[ "default" ] == "none" || m_clauses[ "default" ] == "private"; } } void OPARI2_DirectiveOpenmp::FindUserName( void ) { string cname = find_next_word(); if ( cname == "(" ) { m_user_name = find_next_word(); } } string& OPARI2_DirectiveOpenmp::GetUserName( void ) { return m_user_name; } void OPARI2_DirectiveOpenmp::SetNumSections( int n ) { m_num_sections = n; } int OPARI2_DirectiveOpenmp::GetNumSections( void ) { return m_num_sections; } bool OPARI2_DirectiveOpenmp::IsNowaitAdded( void ) { return m_nowait_added; } void OPARI2_DirectiveOpenmp::GenerateDescr( ostream& os ) { if ( s_lang & L_FORTRAN ) { s_init_handle_calls << " call " << s_paradigm_prefix << "_Assign_handle( " << region_id_prefix << m_id << ","; if ( s_format == F_FIX ) { s_init_handle_calls << "\n & "; } else { s_init_handle_calls << " &\n "; } s_init_handle_calls << m_ctc_string_variable << " )\n"; } else if ( s_lang & L_C_OR_CXX ) { if ( !m_descrs.empty() ) { stringstream ids; ids << m_id; os << "#define POMP2_DLIST_" << string( 5 - ids.str().length(), '0' ) << ids.str() << " shared("; for ( set::const_iterator it = m_descrs.begin(); it != m_descrs.end(); ++it ) { if ( it != m_descrs.begin() ) { os << ","; } os << region_id_prefix << *it; } os << ")\n"; } s_init_handle_calls << " " << s_paradigm_prefix << "_Assign_handle( " << "&" << region_id_prefix << m_id << ", " << m_ctc_string_variable << " );\n"; } OPARI2_Directive::generate_descr_common( os ); } void OPARI2_DirectiveOpenmp::GenerateHeader( ostream& os ) { if ( s_lang & L_C ) { if ( !s_preprocessed_file ) { os << "#include \n\n"; } if ( s_omp_opt.copytpd ) { if ( !s_preprocessed_file ) { os << "#include \n"; } os << "extern int64_t " << MAKE_STR( FORTRAN_ALIGNED ) " " << s_omp_opt.pomp_tpd << ";\n"; os << "#pragma omp threadprivate(" << s_omp_opt.pomp_tpd << ")\n"; } } else if ( s_lang & L_CXX ) { if ( !s_preprocessed_file ) { os << "#include \n\n"; } if ( s_omp_opt.copytpd ) { if ( !s_preprocessed_file ) { os << "#include \n"; } os << "extern \"C\" \n{\n"; os << "extern int64_t " << MAKE_STR( FORTRAN_ALIGNED ) " " << s_omp_opt.pomp_tpd << ";\n"; if ( !s_omp_opt.tpd_in_extern_block ) { os << "}\n"; } os << "#pragma omp threadprivate(" << s_omp_opt.pomp_tpd << ")\n"; if ( s_omp_opt.tpd_in_extern_block ) { os << "}\n"; } } } } /** * @brief Generate a function to allow initialization of all region handles for Fortran. * * These functions need to be called from POMP2_Init_regions. */ void OPARI2_DirectiveOpenmp::GenerateInitHandleCalls( ostream& os, const string incfile ) { OPARI2_Directive::GenerateInitHandleCalls( os, incfile, s_paradigm_prefix, s_init_handle_calls, s_num_regions ); return; } /** @brief add a nowait to a pragma */ void OPARI2_DirectiveOpenmp::AddNowait( void ) { if ( s_lang & L_FORTRAN ) { int lastline = m_lines.size() - 1; string::size_type s = m_lines[ lastline ].find( m_directive_prefix[ 0 ] ) + m_directive_prefix[ 0 ].length(); // insert on last line on last position before comment string::size_type c = m_lines[ lastline ].find( '!', s ); if ( c == string::npos ) { m_lines[ lastline ].append( " nowait" ); } else { m_lines[ lastline ].insert( c, " nowait" ); } m_nowait_added = true; } else if ( s_lang & L_C_OR_CXX ) { int lastline = m_lines.size() - 1; m_lines[ lastline ].append( " nowait" ); m_nowait_added = true; } } /** @brief add region descriptors to shared variable list*/ void OPARI2_DirectiveOpenmp::AddDescr( int id ) { if ( s_lang & L_C_OR_CXX ) { std::ostringstream os; if ( s_omp_opt.add_shared_decl ) { std::stringstream ids; ids << id; os << " POMP2_DLIST_" << string( 5 - ids.str().length(), '0' ) << ids.str(); } else { // not 100% right but best we can do if compiler doesn't allow // macro replacement on pragma statements os << " shared(" << region_id_prefix << id << ")"; } int lastline = m_lines.size() - 1; m_lines[ lastline ].append( os.str() ); } } /** * @brief Split combined parallel and worksharing constructs in two * seperate pragmas to allow the insertion of POMP function * calles between the parallel and the worksharing construct. * clauses need to be matched to the corresponding pragma */ OPARI2_DirectiveOpenmp* OPARI2_DirectiveOpenmp::SplitCombined( void ) { return SplitCombinedT( s_outer_inner, s_inner_clauses ); } void OPARI2_DirectiveOpenmp::FinalizeDescrs( ostream& os ) { if ( s_lang & L_FORTRAN ) { if ( s_lang & L_F77 ) { os << "\n integer*4 pomp2_lib_get_max_threads"; os << "\n external pomp2_lib_get_max_threads"; os << "\n logical pomp2_test_lock"; os << "\n external pomp2_test_lock"; os << "\n integer*4 pomp2_test_nest_lock"; os << "\n external pomp2_test_nest_lock\n"; } else if ( s_lang & L_F90 ) { os << "\n integer ( kind=4 ), external :: pomp2_lib_get_max_threads"; os << "\n logical, external :: pomp2_test_lock"; os << "\n integer ( kind=4 ), external :: pomp2_test_nest_lock\n"; } if ( !s_common_block.empty() ) { if ( s_omp_opt.copytpd ) { if ( s_lang & L_F77 ) { os << " integer*8 pomp_tpd\n"; } else { os << " integer( kind=8 ) pomp_tpd\n"; } os << " common /pomp_tpd/ pomp_tpd\n"; os << "!$omp threadprivate(/pomp_tpd/)\n"; } if ( s_lang & L_F77 ) { os << " integer*8 pomp2_old_task, pomp2_new_task\n"; os << " logical pomp2_if\n"; os << " integer*4 pomp2_num_threads\n"; } else { os << " integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task\n"; os << " logical :: pomp2_if\n"; os << " integer ( kind=4 ) :: pomp2_num_threads\n"; } } } } /** Writes Directive for ending a loop */ OPARI2_Directive* OPARI2_DirectiveOpenmp::EndLoopDirective( const int lineno ) { if ( s_lang & L_FORTRAN ) { FindName(); string pragma = ""; for ( string::size_type c = 0; c < m_indent; c++ ) { pragma += " "; } pragma += m_directive_prefix[ 0 ]; if ( m_name == "do" ) { pragma += " end do"; } else if ( m_name == "paralleldo" ) { pragma += " end parallel do"; } vector lines; lines.push_back( pragma ); return new OPARI2_DirectiveOpenmp( m_filename, lineno, lines, m_directive_prefix ); } return NULL; } /** Returns true for enddo and endparalleldo directives */ bool OPARI2_DirectiveOpenmp::EndsLoopDirective( void ) { if ( s_lang & L_FORTRAN ) { if ( m_name.empty() ) { FindName(); } if ( m_name == "enddo" || m_name == "endparalleldo" ) { return true; } } return false; } /* Initialize class static variables */ #ifndef FORTRAN_MANGLED #define FORTRAN_MANGLED( str ) str #endif #define OPARI2_STR_( str ) #str #define OPARI2_STR( str ) OPARI2_STR_( str ) /** * @brief Creates pairs of directive keywords that can be combined * and are split by OPARI2. * * This function is called during initialiazation of static * variables, so the language is not yet set in s_lang. */ static OPARI2_StrVStr_map_t make_directive_clauses( void ) { OPARI2_StrVStr_map_t dc; vector clauses; clauses.push_back( "if" ); clauses.push_back( "num_threads" ); clauses.push_back( "default" ); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "shared" ); clauses.push_back( "copyin" ); clauses.push_back( "reduction" ); clauses.push_back( "proc_bind" ); dc[ "parallel" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "lastprivate" ); clauses.push_back( "reduction" ); clauses.push_back( "schedule" ); clauses.push_back( "collapse" ); clauses.push_back( "ordered" ); clauses.push_back( "nowait" ); dc[ "for" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "astprivate" ); clauses.push_back( "reduction" ); clauses.push_back( "schedule" ); clauses.push_back( "collapse" ); clauses.push_back( "ordered" ); dc[ "do" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "lastprivate" ); clauses.push_back( "reduction" ); clauses.push_back( "nowait" ); dc[ "sections" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "copyprivate" ); clauses.push_back( "nowait" ); dc[ "single" ] = clauses; clauses.clear(); clauses.push_back( "nowait" ); clauses.push_back( "copyprivate" ); dc[ "end single" ] = clauses; dc[ "endsingle" ] = clauses; clauses.clear(); clauses.push_back( "nowait" ); dc[ "end do" ] = clauses; dc[ "enddo" ] = clauses; dc[ "end sections" ] = clauses; dc[ "endsections" ] = clauses; dc[ "end workshare" ] = clauses; dc[ "endworkshare" ] = clauses; /** Commented out are the ones that are new with the OpenMP 4.0 specification */ clauses.clear(); clauses.push_back( "if" ); //clauses.push_back( "final" ); clauses.push_back( "untied" ); clauses.push_back( "default" ); //clauses.push_back( "mergeable" ); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "shared" ); //clauses.push_back( "depend" ); dc[ "task" ] = clauses; dc[ "parallelfor" ] = dc[ "parallel" ]; dc[ "parallelfor" ].insert( dc[ "parallelfor" ].end(), dc[ "for" ].begin(), dc[ "for" ].end() ); dc[ "paralleldo" ] = dc[ "parallel" ]; dc[ "paralleldo" ].insert( dc[ "paralleldo" ].end(), dc[ "do" ].begin(), dc[ "do" ].end() ); dc[ "parallelsections" ] = dc[ "parallel" ]; dc[ "parallelsections" ].insert( dc[ "parallelsections" ].end(), dc[ "sections" ].begin(), dc[ "sections" ].end() ); dc[ "parallelworkshare" ] = dc[ "parallel" ]; dc[ "parallelworkshare" ].insert( dc[ "parallelworkshare" ].end(), dc[ "workshare" ].begin(), dc[ "workshare" ].end() ); /** Doing the work anyway and usintg the OpenMP 4.0 specification, I went ahead and added these clauses too */ // clauses.clear(); // clauses.push_back( "safelen" ); // clauses.push_back( "linear" ); // clauses.push_back( "aligned" ); // clauses.push_back( "private" ); // clauses.push_back( "lastprivate" ); // clauses.push_back( "reduction" ); // clauses.push_back( "collapse" ); // dc[ "simd" ] = clauses; // clauses.clear(); // clauses.push_back( "simdlen" ); // clauses.push_back( "linear" ); // clauses.push_back( "aligned" ); // clauses.push_back( "uniform" ); // clauses.push_back( "inbranch" ); // clauses.push_back( "notinbranch" ); // dc[ "declare simd" ] = clauses; // clauses.clear(); // clauses.push_back( "device" ); // clauses.push_back( "map" ); // clauses.push_back( "if" ); // dc[ "target data" ] = clauses; // clauses.clear(); // clauses.push_back( "device" ); // clauses.push_back( "map" ); // clauses.push_back( "if" ); // dc[ "target" ] = clauses; // clauses.clear(); // clauses.push_back( "to" ); // clauses.push_back( "from" ); // clauses.push_back( "device" ); // clauses.push_back( "if" ); // dc[ "target update" ] = clauses; // clauses.clear(); // clauses.push_back( "num_teams" ); // clauses.push_back( "thread_limit" ); // clauses.push_back( "default" ); // clauses.push_back( "private" ); // clauses.push_back( "firstprivate" ); // clauses.push_back( "shared" ); // clauses.push_back( "reduction" ); // dc[ "teams" ] = clauses; // clauses.clear(); // clauses.push_back( "private" ); // clauses.push_back( "firstprivate" ); // clauses.push_back( "collapse" ); // clauses.push_back( "dist_schedule" ); // dc[ "distribute" ] = clauses; // clauses.clear(); // clauses.push_back( "parallel" ); // clauses.push_back( "sections" ); // clauses.push_back( "for" ); // clauses.push_back( "do" ); // clauses.push_back( "taskgroup" ); // clauses.push_back( "if " ); // dc[ "cancel" ] = clauses; // clauses.clear(); // clauses.push_back( "parallel" ); // clauses.push_back( "sections" ); // clauses.push_back( "for" ); // clauses.push_back( "do" ); // clauses.push_back( "taskgroup" ); // dc[ "cancellation point" ] = clauses; return dc; } OPARI2_StrVStr_map_t OPARI2_DirectiveOpenmp::s_directive_clauses = make_directive_clauses(); /** * @brief Creates pairs of directive keywords that can be combined * and are split by OPARI2. * * This function is called during initialiazation of static * variables, so the language is not yet set in s_lang. */ static OPARI2_StrStr_pairs_t make_outer_inner( void ) { OPARI2_StrStr_pairs_t oi; oi.push_back( make_pair( string( "parallel" ), string( "sections" ) ) ); /* These are Fortran specific */ oi.push_back( make_pair( string( "parallel" ), string( "do" ) ) ); oi.push_back( make_pair( string( "parallel" ), string( "workshare" ) ) ); /* This one is C/C++ specific */ oi.push_back( make_pair( string( "parallel" ), string( "for" ) ) ); return oi; } OPARI2_StrStr_pairs_t OPARI2_DirectiveOpenmp:: s_outer_inner = make_outer_inner(); /** * @brief Specifies the clauses that belong to the "inner" directive * of a combined directive. */ static OPARI2_StrBool_pairs_t make_inner_clauses( void ) { OPARI2_StrBool_pairs_t ic; ic.push_back( make_pair( string( "ordered" ), false ) ); /* Comment out due to ticket #939 in Score-P (silc) The same treatment does not work for lastprivate, although this does not currently work. (Philippen) TODO: fix */ // ic.push_back( make_pair( string( "firstprivate" ), true ) ); ic.push_back( make_pair( string( "lastprivate" ), true ) ); ic.push_back( make_pair( string( "schedule" ), true ) ); ic.push_back( make_pair( string( "collapse" ), true ) ); return ic; } OPARI2_StrBool_pairs_t OPARI2_DirectiveOpenmp::s_inner_clauses = make_inner_clauses(); #define POMP_TPD_MANGLED FORTRAN_MANGLED( pomp_tpd ) opari2_omp_option OPARI2_DirectiveOpenmp::s_omp_opt = { true, false, false, false, false, false, false, false, false, OPARI2_STR( POMP_TPD_MANGLED ) }; stringstream OPARI2_DirectiveOpenmp:: s_init_handle_calls; int OPARI2_DirectiveOpenmp:: s_num_regions = 0; const string OPARI2_DirectiveOpenmp:: s_paradigm_prefix = "POMP2"; opari2-2.0.10/src/opari/openmp/PaxHeaders/opari2_directive_openmp.h0000644000000000000000000000013115232670204022224 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.259415239 30 ctime=1785426078.171261903 opari2-2.0.10/src/opari/openmp/opari2_directive_openmp.h0000664000175100001440000001250415232670204022561 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_openmp.h * * @brief Class definitions for Openmp directives in C/C++ and Fortran. */ #ifndef OPARI2_DIRECTIVE_OPENMP_H #define OPARI2_DIRECTIVE_OPENMP_H #include using std::string; #include using std::vector; #include using std::ostream; #include "opari2.h" #include "opari2_directive.h" /** @brief Anonymous namespace including structure definition for OpenMP specific cmd line options. */ /** @brief Structure for OpenMP specific cmd line options. */ typedef struct { bool add_shared_decl; bool copytpd; bool task_abort; bool task_warn; bool task_remove; bool untied_abort; bool untied_keep; bool untied_nowarn; bool tpd_in_extern_block; string pomp_tpd; } opari2_omp_option; /** @brief Base Class to store and manipulate OpenMP directive related data. */ class OPARI2_DirectiveOpenmp : public OPARI2_Directive { public: /**@brief Constructor. */ OPARI2_DirectiveOpenmp( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : OPARI2_Directive( fname, ln, lines, directive_prefix ) { m_type = OPARI2_PT_OMP; m_nowait_added = false; m_has_untied = false; m_has_ordered = false; m_num_sections = 0; if ( lines.empty() ) { m_indent = 0; } else { m_indent = lines[ 0 ].find_first_not_of( " \t" ); m_indent = m_indent == string::npos ? 0 : m_indent; } } /** @brief Destructor. */ virtual ~ OPARI2_DirectiveOpenmp( void ) { } /** Increment region counter */ virtual void IncrementRegionCounter( void ); /** * @brief Parse OpenMP-specific command-line option and store it * in 's_omp_opt'. */ static OPARI2_ErrorCode ProcessOption( string option ); /** @brief Set value for 'opt.omp_pomp_tpd'. */ static void SetOptPomptpd( string str ); /** return 's_openmp_opt' */ static opari2_omp_option* GetOpenmpOpt( void ); /** Parse string and return OpenMP group id */ static uint32_t String2Group( const string name ); virtual void FindName( void ); /** is the default data sharing changed, * i.e. is default(none) or default(private) present? */ bool ChangedDefault( void ); /** returns value in brackets, if present, "" otherwise*/ void FindUserName( void ); string& GetUserName( void ); void SetNumSections( int n ); int GetNumSections( void ); string& GetReduction( void ); /** split compined constructs in two seperate statement */ virtual OPARI2_DirectiveOpenmp* SplitCombined( void ); /** add OpenMP descriptors at the right place */ virtual void AddDescr( int n ); virtual void GenerateDescr( ostream& os ); static void FinalizeDescrs( ostream& os ); /** Generate header of the include file */ static void GenerateHeader( ostream& os ); /** generate call POMP2_Init_reg_XXX function to initialize * all handles, in the Fortran case */ static void GenerateInitHandleCalls( ostream& os, const string incfile = "" ); /** add a nowait to a directive*/ virtual void AddNowait( void ); bool IsNowaitAdded( void ); /** Returns a directive for ending the loop region */ virtual OPARI2_Directive* EndLoopDirective( const int lineno ); /** Returns true for enddo and endparalleldo directives */ virtual bool EndsLoopDirective( void ); private: /** * @brief Identifies clauses and their arguments */ virtual void identify_clauses( void ); private: string m_arg_num_threads; /**< argument of the 'num_threads' clause */ string m_arg_if; /**< argument of the 'if' clause */ string m_arg_reduction; /**< argument of the 'reduction' clause */ string m_arg_schedule; /**< argument of the 'schedule' clause */ string m_arg_collapse; /**< argument of the 'collapse' clause */ string m_user_name; /**< name of named critical sections */ bool m_has_untied; /**< true if has 'untied' clause */ bool m_has_ordered; /**< true if hase 'ordered' clause */ int m_num_sections; /**< number of sections */ string::size_type m_indent; bool m_nowait_added; virtual string generate_ctc_string( OPARI2_Format_t form ); /** Static members */ static opari2_omp_option s_omp_opt; /**< OMP-specific cmd-line options */ static stringstream s_init_handle_calls; static int s_num_regions; static const string s_paradigm_prefix; static OPARI2_StrVStr_map_t s_directive_clauses; static OPARI2_StrStr_pairs_t s_outer_inner; static OPARI2_StrBool_pairs_t s_inner_clauses; }; #endif opari2-2.0.10/src/opari/openmp/PaxHeaders/opari2_directive_entry_openmp.h0000644000000000000000000000013115232670204023445 xustar0029 mtime=1785426052.20341557 30 atime=1785426052.255415263 30 ctime=1785426078.171261903 opari2-2.0.10/src/opari/openmp/opari2_directive_entry_openmp.h0000664000175100001440000001227515232670204024007 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry_openmp.h * * @brief Define Openmp directive and runtime API entries. */ #ifndef OPARI2_DIRECTIVE_ENTRY_OPENMP_H #define OPARI2_DIRECTIVE_ENTRY_OPENMP_H #include "opari2.h" #include "opari2_directive_entry.h" /** * @brief Definition of Openmp directive/runtime API group. * More directive group definition can be added before G_OMP_ALL. */ enum OPARI2_OmpGroup { /** invalid group */ G_OMP_NONE = 0x00000000, G_OMP_ATOMIC = 0x00000001, G_OMP_CRITICAL = 0x00000002, G_OMP_MASTER = 0x00000004, G_OMP_SINGLE = 0x00000008, G_OMP_LOCKS = 0x00000010, G_OMP_FLUSH = 0x00000020, G_OMP_TASK = 0x00000040, G_OMP_ORDERED = 0x00000080, G_OMP_SYNC = 0x000000FF, G_OMP_DEFAULT = 0x00001000, G_OMP_OMP = 0x0000FFFF, G_OMP_REGION = 0x00010000, G_OMP_ALL = 0xFFFFFFFF }; #define OPARI2_OPENMP_SENTINELS \ { "!$omp", OPARI2_PT_OMP }, \ { "c$omp", OPARI2_PT_OMP }, \ { "*$omp", OPARI2_PT_OMP }, \ { "omp", OPARI2_PT_OMP }, \ { "openmp", OPARI2_PT_OMP } #define OPARI2_CREATE_OPENMP_TABLE_ENTRY( name, loop, disable_with_paradigm, version, group ) \ OPARI2_CREATE_TABLE_ENTRY( OPARI2_PT_OMP, name, loop, disable_with_paradigm, version, group, omp ) #define OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( name, loop, version, group ) \ OPARI2_CREATE_TABLE_ENTRY_NOEND( OPARI2_PT_OMP, name, loop, version, group, omp ) #define OPARI2_CREATE_OPENMP_TABLE_ENTRY_SINGLE_STATEMENT( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY_SINGLE_STATEMENT( OPARI2_PT_OMP, name, false, true, version, group, omp ) /* *INDENT-OFF* */ #define OPARI2_OPENMP_DIRECTIVE_ENTRIES \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallel, false, false, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( for, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( do, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( sections, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( section, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( single, false, true, 3.0, G_OMP_SINGLE ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( master, false, true, 3.0, G_OMP_MASTER ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( critical, false, true, 3.0, G_OMP_CRITICAL ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallelfor, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( paralleldo, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallelsections, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( workshare, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallelworkshare, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( ordered, false, true, 3.0, G_OMP_ORDERED ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( task, false, true, 3.0, G_OMP_TASK ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_SINGLE_STATEMENT( atomic, 3.0, G_OMP_ATOMIC ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( barrier, false, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( flush, false, 3.0, G_OMP_FLUSH ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( taskwait, false, 3.0, G_OMP_TASK ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( threadprivate, false, 3.0, G_OMP_DEFAULT ) /* *INDENT-ON* */ #define OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( name, version, group, wrapper ) \ { OPARI2_PT_OMP, #name, #version, group, true, #wrapper, "omp.h", "omp_lib.h" } #define OPARI2_OPENMP_API_ENTRIES \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_init_lock, 3.0, G_OMP_LOCKS, POMP2_Init_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_destroy_lock, 3.0, G_OMP_LOCKS, POMP2_Destroy_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_set_lock, 3.0, G_OMP_LOCKS, POMP2_Set_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_unset_lock, 3.0, G_OMP_LOCKS, POMP2_Unset_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_test_lock, 3.0, G_OMP_LOCKS, POMP2_Test_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_init_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Init_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_destroy_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Destroy_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_set_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Set_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_unset_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Unset_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_test_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Test_nest_lock ) #endif opari2-2.0.10/src/opari/PaxHeaders/offload0000644000000000000000000000013215232670236015310 xustar0030 mtime=1785426078.191261785 30 atime=1785426082.655235368 30 ctime=1785426078.191261785 opari2-2.0.10/src/opari/offload/0000775000175100001440000000000015232670236015717 5ustar00builderusersopari2-2.0.10/src/opari/offload/PaxHeaders/opari2_offload_handler.h0000644000000000000000000000013215232670204022114 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.191261785 opari2-2.0.10/src/opari/offload/opari2_offload_handler.h0000664000175100001440000000164115232670204022450 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_offload_handler.h * * @brief */ #ifndef OPARI2_OFFLOAD_HANDLER_H #define OPARI2_OFFLOAD_HANDLER_H #include using std::ostream; #include "opari2.h" #include "opari2_directive.h" void h_offload_target( OPARI2_Directive* d, ostream& os ); void h_end_offload_target( OPARI2_Directive* d, ostream& os ); void h_offload_declspec( OPARI2_Directive* d, ostream& os ); void h_end_offload_declspec( OPARI2_Directive* d, ostream& os ); #endif opari2-2.0.10/src/opari/offload/PaxHeaders/opari2_offload_handler.cc0000644000000000000000000000013215232670204022252 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.187261809 opari2-2.0.10/src/opari/offload/opari2_offload_handler.cc0000664000175100001440000000242615232670204022610 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_offload_handler.cc * * @brief Handler functions for Intel OFFLOAD directives. */ #include #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_manager.h" void h_offload_target( OPARI2_Directive* d, ostream& os ) { DirectiveStackPush( d ); d->PrintPlainDirective( os ); DisableInstrumentation( D_FULL ); } void h_end_offload_target( OPARI2_Directive* d, ostream& os ) { DirectiveStackPop(); EnableInstrumentation( D_FULL ); } void h_offload_declspec( OPARI2_Directive* d, ostream& os ) { DisableInstrumentation( D_FULL ); // Only go to the directive stack, not the vector DirectiveStackPush( d ); } void h_end_offload_declspec( OPARI2_Directive* d, ostream& os ) { EnableInstrumentation( D_FULL ); // maintain stack DirectiveStackPop(); } opari2-2.0.10/src/opari/offload/PaxHeaders/opari2_directive_offload.cc0000644000000000000000000000013215232670204022613 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.187261809 opari2-2.0.10/src/opari/offload/opari2_directive_offload.cc0000664000175100001440000000272415232670204023152 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_offload.cc * * @brief Methods of base class for OFFLOAD directives. */ #include #include using std::string; #include using std::ostream; #include #include "common.h" #include "opari2_directive_offload.h" #include "opari2_directive_entry_offload.h" uint32_t OPARI2_DirectiveOffload::String2Group( const string name ) { return 0; } void OPARI2_DirectiveOffload::IncrementRegionCounter( void ) { ++s_num_regions; } void OPARI2_DirectiveOffload::GenerateDescr( ostream& os ) { if ( s_lang & L_C_OR_CXX ) { OPARI2_Directive::generate_descr_common( os ); s_init_handle_calls << " " << s_paradigm_prefix << "_assign_handle( " << "&" << region_id_prefix << m_id << ", " << m_ctc_string_variable << " );\n"; } } void OPARI2_DirectiveOffload::SetName( string name_str ) { m_name = name_str; } int OPARI2_DirectiveOffload:: s_num_regions = 0; stringstream OPARI2_DirectiveOffload::s_init_handle_calls; string OPARI2_DirectiveOffload:: s_paradigm_prefix = "POFLD"; opari2-2.0.10/src/opari/offload/PaxHeaders/opari2_directive_offload.h0000644000000000000000000000013215232670204022455 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.187261809 opari2-2.0.10/src/opari/offload/opari2_directive_offload.h0000664000175100001440000000357015232670204023014 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_offload.h * * @brief Base class for Intel OFFLOAD directives */ #ifndef OPARI2_DIRECTIVE_OFFLOAD_H #define OPARI2_DIRECTIVE_OFFLOAD_H #include using std::string; #include using std::ostream; #include using std::vector; #include "opari2.h" #include "opari2_directive.h" /** @brief Base Class to store and manipulate Intel offload directive and related data. */ class OPARI2_DirectiveOffload : public OPARI2_Directive { public: OPARI2_DirectiveOffload( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : OPARI2_Directive( fname, ln, lines, directive_prefix ) { m_type = OPARI2_PT_OFFLOAD; if ( directive_prefix.size() ) { string sentinel = directive_prefix[ directive_prefix.size() - 1 ]; if ( sentinel == "__declspec" ) { SetName( "declspec" ); } } } virtual ~ OPARI2_DirectiveOffload( void ) { } /** Increment region counter */ void IncrementRegionCounter( void ); void SetName( string name_str ); /** Parse string and return offload group id */ static uint32_t String2Group( const string name ); virtual void GenerateDescr( ostream& os ); private: static string s_paradigm_prefix; static stringstream s_init_handle_calls; static int s_num_regions; }; #endif opari2-2.0.10/src/opari/offload/PaxHeaders/opari2_directive_entry_offload.h0000644000000000000000000000013215232670204023676 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.183261832 opari2-2.0.10/src/opari/offload/opari2_directive_entry_offload.h0000664000175100001440000000303115232670204024225 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry_offload.h * * @brief Define Intel Offload directive entries. */ #ifndef OPARI2_DIRECTIVE_ENTRY_OFFLOAD_H #define OPARI2_DIRECTIVE_ENTRY_OFFLOAD_H #include "opari2.h" #include "opari2_directive_entry.h" /** * @brief Definition of Intel Offload directive/runtime API group. * More directive group definition can be added before G_OFF_ALL. */ enum OPARI2_OffloadGroup { G_OFFLOAD_NONE = 0x00000000, G_OFFLOAD_DEFAULT = 0x00001000, G_OFFLOAD_ALL = 0xFFFFFFFF }; #define OPARI2_OFFLOAD_SENTINELS \ { "!dir$", OPARI2_PT_OFFLOAD }, \ { "cdir$", OPARI2_PT_OFFLOAD }, \ { "*dir$", OPARI2_PT_OFFLOAD }, \ { "offload", OPARI2_PT_OFFLOAD }, \ { "__declspec", OPARI2_PT_OFFLOAD } #define OPARI2_CREATE_OFFLOAD_TABLE_ENTRY( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY( OPARI2_PT_OFFLOAD, name, false, true, version, group, offload ) /* *INDENT-OFF* */ #define OPARI2_OFFLOAD_DIRECTIVE_ENTRIES \ OPARI2_CREATE_OFFLOAD_TABLE_ENTRY( target, 1.0, G_OFFLOAD_DEFAULT ),\ OPARI2_CREATE_OFFLOAD_TABLE_ENTRY( declspec, 1.0, G_OFFLOAD_DEFAULT ) /* *INDENT-ON* */ #endif opari2-2.0.10/src/PaxHeaders/config-frontend.h.in0000644000000000000000000000013215232670222016474 xustar0030 mtime=1785426066.839328961 30 atime=1785426077.287267134 30 ctime=1785426078.015262827 opari2-2.0.10/src/config-frontend.h.in0000664000175100001440000001077015232670222017033 0ustar00builderusers/* ../src/config-frontend.h.in. Generated from configure.ac by autoheader. */ /* Name of the sub-build. */ #undef AFS_PACKAGE_BUILD /* Symbol name of the sub-build in upper case. */ #undef AFS_PACKAGE_BUILD_NAME /* Symbol name of the sub-build in lower case. */ #undef AFS_PACKAGE_BUILD_name /* The package name usable as a symbol in upper case. */ #undef AFS_PACKAGE_NAME /* Relative path to the top-level source directory. */ #undef AFS_PACKAGE_SRCDIR /* The package name usable as a symbol in lower case. */ #undef AFS_PACKAGE_name /* Makes C variable alignment consistent with Fortran */ #undef FORTRAN_ALIGNED /* define if the compiler supports basic C99 syntax */ #undef HAVE_C99 /* define if the compiler supports basic C++11 syntax */ #undef HAVE_CXX11 /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Set if we are building for the AIX platform */ #undef HAVE_PLATFORM_AIX /* Set if we are building for the ALTIX platform */ #undef HAVE_PLATFORM_ALTIX /* Set if we are building for the BG/L platform */ #undef HAVE_PLATFORM_BGL /* Set if we are building for the BG/P platform */ #undef HAVE_PLATFORM_BGP /* Set if we are building for the BG/Q platform */ #undef HAVE_PLATFORM_BGQ /* Set if we are building for the Cray platform */ #undef HAVE_PLATFORM_CRAY /* Set if we are building for an otherwise unspecified Cray platform */ #undef HAVE_PLATFORM_CRAYGENERIC /* Set if we are building for the Cray XC platform */ #undef HAVE_PLATFORM_CRAYXC /* Set if we are building for the Cray XE platform */ #undef HAVE_PLATFORM_CRAYXE /* Set if we are building for the Cray XK platform */ #undef HAVE_PLATFORM_CRAYXK /* Set if we are building for the Cray XT platform */ #undef HAVE_PLATFORM_CRAYXT /* Set if we are building for the FX10 platform */ #undef HAVE_PLATFORM_FX10 /* Set if we are building for the FX100 platform */ #undef HAVE_PLATFORM_FX100 /* Set if we are building for the K platform */ #undef HAVE_PLATFORM_K /* Set if we are building for the Linux platform */ #undef HAVE_PLATFORM_LINUX /* Set if we are building for the macOS platform */ #undef HAVE_PLATFORM_MAC /* Set if we are building for the Intel MIC platform */ #undef HAVE_PLATFORM_MIC /* Set if we are building for the MinGW platform */ #undef HAVE_PLATFORM_MINGW /* Set if we are building for the Solaris platform */ #undef HAVE_PLATFORM_SOLARIS /* Can link a readlink function */ #undef HAVE_READLINK /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Revision of OPARI2 */ #undef SCOREP_COMPONENT_REVISION /* Defined if we are working from git. */ #undef SCOREP_IN_DEVELOPEMENT /* Defined if we are working from a make dist generated tarball. */ #undef SCOREP_IN_PRODUCTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if needed to make fixed-width integer constant macros available in C++ */ #undef __STDC_CONSTANT_MACROS /* Define to 1 if needed to make fixed-width integer format macros available in C++ */ #undef __STDC_FORMAT_MACROS /* Define to 1 if needed to make fixed-width integer limit macros available in C++ */ #undef __STDC_LIMIT_MACROS opari2-2.0.10/src/PaxHeaders/config-custom.h0000644000000000000000000000013215232670204015562 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426077.979263039 opari2-2.0.10/src/config-custom.h0000664000175100001440000000152715232670204016121 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #ifndef CONFIG_CUSTOM_H #define CONFIG_CUSTOM_H /** * @file config-custom.h * * @brief This file gets included by config.h (resp. config-frontend.h and * config-backend.h) and contains supplementary macros to be used with the * macros in config.h. * */ #endif /* CONFIG_CUSTOM_H */ opari2-2.0.10/src/PaxHeaders/config.h0000644000000000000000000000013215232670204014252 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426077.979263039 opari2-2.0.10/src/config.h0000664000175100001440000000236215232670204014607 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #ifndef CONFIG_H #define CONFIG_H /** * @file config.h * * @brief Provide a single config.h that hides the frontend/backend * issues from the developer * */ #if defined CROSS_BUILD #if defined FRONTEND_BUILD #include #elif defined BACKEND_BUILD #include #else #error "You cannot use config.h without defining either FRONTEND_BUILD or BACKEND_BUILD." #endif #elif defined NOCROSS_BUILD #include #else #error "You cannot use config.h without defining either CROSS_BUILD or NOCROSS_BUILD." #endif #include #include #endif /* CONFIG_H */ opari2-2.0.10/src/PaxHeaders/opari-lib-dummy0000644000000000000000000000013215232670236015573 xustar0030 mtime=1785426078.147262045 30 atime=1785426082.655235368 30 ctime=1785426078.147262045 opari2-2.0.10/src/opari-lib-dummy/0000775000175100001440000000000015232670236016202 5ustar00builderusersopari2-2.0.10/src/opari-lib-dummy/PaxHeaders/getfname.f0000644000000000000000000000013215232670204017600 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426078.147262045 opari2-2.0.10/src/opari-lib-dummy/getfname.f0000664000175100001440000000221315232670204020130 0ustar00builderusers!> !> This file is part of the Score-P software (http://www.score-p.org) !> !> Copyright (c) 2009-2011, !> RWTH Aachen University, Germany !> !> Copyright (c) 2009-2011, !> Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Dresden, Germany !> !> Copyright (c) 2009-2011, !> University of Oregon, Eugene, USA !> !> Copyright (c) 2009-2011, 2013 !> Forschungszentrum Juelich GmbH, Germany !> !> Copyright (c) 2009-2011, !> German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Muenchen, Germany !> !> This software may be modified and distributed under the terms of !> a BSD-style license. See the COPYING file in the package base !> directory for details. !> @internal !> !> @file getname.f !> !> @brief This file is needed to check the Fortran name mangling of !> the used compiler. foo_foo is called and depending on ! the mangling, this is linked against a c function ! foo_foo_, _foo_foo, ... #include #include static char* header = "/*\n" " * Fortan subroutine external name setup\n" " */\n" "\n" "#define POMP2_Finalize_U POMP2_FINALIZE\n" "#define POMP2_Init_U POMP2_INIT\n" "#define POMP2_Off_U POMP2_OFF\n" "#define POMP2_On_U POMP2_ON\n" "#define POMP2_Atomic_enter_U POMP2_ATOMIC_ENTER\n" "#define POMP2_Atomic_exit_U POMP2_ATOMIC_EXIT\n" "#define POMP2_Implicit_barrier_enter_U POMP2_IMPLICIT_BARRIER_ENTER\n" "#define POMP2_Implicit_barrier_exit_U POMP2_IMPLICIT_BARRIER_EXIT\n" "#define POMP2_Barrier_enter_U POMP2_BARRIER_ENTER\n" "#define POMP2_Barrier_exit_U POMP2_BARRIER_EXIT\n" "#define POMP2_Flush_enter_U POMP2_FLUSH_ENTER\n" "#define POMP2_Flush_exit_U POMP2_FLUSH_EXIT\n" "#define POMP2_Critical_begin_U POMP2_CRITICAL_BEGIN\n" "#define POMP2_Critical_end_U POMP2_CRITICAL_END\n" "#define POMP2_Critical_enter_U POMP2_CRITICAL_ENTER\n" "#define POMP2_Critical_exit_U POMP2_CRITICAL_EXIT\n" "#define POMP2_Do_enter_U POMP2_DO_ENTER\n" "#define POMP2_Do_exit_U POMP2_DO_EXIT\n" "#define POMP2_Master_begin_U POMP2_MASTER_BEGIN\n" "#define POMP2_Master_end_U POMP2_MASTER_END\n" "#define POMP2_Parallel_begin_U POMP2_PARALLEL_BEGIN\n" "#define POMP2_Parallel_end_U POMP2_PARALLEL_END\n" "#define POMP2_Parallel_enter_U POMP2_PARALLEL_ENTER\n" "#define POMP2_Parallel_exit_U POMP2_PARALLEL_EXIT\n" "#define POMP2_Parallel_fork_U POMP2_PARALLEL_FORK\n" "#define POMP2_Parallel_join_U POMP2_PARALLEL_JOIN\n" "#define POMP2_Section_begin_U POMP2_SECTION_BEGIN\n" "#define POMP2_Section_end_U POMP2_SECTION_END\n" "#define POMP2_Section_enter_U POMP2_SECTION_ENTER\n" "#define POMP2_Section_exit_U POMP2_SECTION_EXIT\n" "#define POMP2_Sections_enter_U POMP2_SECTIONS_ENTER\n" "#define POMP2_Sections_exit_U POMP2_SECTIONS_EXIT\n" "#define POMP2_Single_begin_U POMP2_SINGLE_BEGIN\n" "#define POMP2_Single_end_U POMP2_SINGLE_END\n" "#define POMP2_Single_enter_U POMP2_SINGLE_ENTER\n" "#define POMP2_Single_exit_U POMP2_SINGLE_EXIT\n" "#define POMP2_Ordered_begin_U POMP2_ORDERED_BEGIN\n" "#define POMP2_Ordered_end_U POMP2_ORDERED_END\n" "#define POMP2_Ordered_enter_U POMP2_ORDERED_ENTER\n" "#define POMP2_Ordered_exit_U POMP2_ORDERED_EXIT\n" "#define POMP2_Task_begin_U POMP2_TASK_BEGIN\n" "#define POMP2_Task_end_U POMP2_TASK_END\n" "#define POMP2_Task_create_begin_U POMP2_TASK_CREATE_BEGIN\n" "#define POMP2_Task_create_end_U POMP2_TASK_CREATE_END\n" "#define POMP2_Untied_task_begin_U POMP2_UNTIED_TASK_BEGIN\n" "#define POMP2_Untied_task_end_U POMP2_UNTIED_TASK_END\n" "#define POMP2_Untied_task_create_begin_U POMP2_UNTIED_TASK_CREATE_BEGIN\n" "#define POMP2_Untied_task_create_end_U POMP2_UNTIED_TASK_CREATE_END\n" "#define POMP2_Taskwait_begin_U POMP2_TASKWAIT_BEGIN\n" "#define POMP2_Taskwait_end_U POMP2_TASKWAIT_END\n" "#define POMP2_Workshare_enter_U POMP2_WORKSHARE_ENTER\n" "#define POMP2_Workshare_exit_U POMP2_WORKSHARE_EXIT\n" "#define POMP2_Begin_U POMP2_BEGIN\n" "#define POMP2_End_U POMP2_END\n" "#define POMP2_Lib_get_max_threads_U POMP2_LIB_GET_MAX_THREADS\n" "#define POMP2_Init_lock_U POMP2_INIT_LOCK\n" "#define POMP2_Destroy_lock_U POMP2_DESTROY_LOCK\n" "#define POMP2_Set_lock_U POMP2_SET_LOCK\n" "#define POMP2_Unset_lock_U POMP2_UNSET_LOCK\n" "#define POMP2_Test_lock_U POMP2_TEST_LOCK\n" "#define POMP2_Init_nest_lock_U POMP2_INIT_NEST_LOCK\n" "#define POMP2_Destroy_nest_lock_U POMP2_DESTROY_NEST_LOCK\n" "#define POMP2_Set_nest_lock_U POMP2_SET_NEST_LOCK\n" "#define POMP2_Unset_nest_lock_U POMP2_UNSET_NEST_LOCK\n" "#define POMP2_Test_nest_lock_U POMP2_TEST_NEST_LOCK\n" "#define POMP2_Assign_handle_U POMP2_ASSIGN_HANDLE\n" "#define POMP2_USER_Assign_handle_U POMP2_USER_ASSIGN_HANDLE\n" "#define omp_init_lock_U OMP_INIT_LOCK\n" "#define omp_destroy_lock_U OMP_DESTROY_LOCK\n" "#define omp_set_lock_U OMP_SET_LOCK\n" "#define omp_unset_lock_U OMP_UNSET_LOCK\n" "#define omp_test_lock_U OMP_TEST_LOCK\n" "#define omp_init_nest_lock_U OMP_INIT_NEST_LOCK\n" "#define omp_destroy_nest_lock_U OMP_DESTROY_NEST_LOCK\n" "#define omp_set_nest_lock_U OMP_SET_NEST_LOCK\n" "#define omp_unset_nest_lock_U OMP_UNSET_NEST_LOCK\n" "#define omp_test_nest_lock_U OMP_TEST_NEST_LOCK\n" "\n" "#define POMP2_Finalize_L pomp2_finalize\n" "#define POMP2_Init_L pomp2_init\n" "#define POMP2_Off_L pomp2_off\n" "#define POMP2_On_L pomp2_on\n" "#define POMP2_Atomic_enter_L pomp2_atomic_enter\n" "#define POMP2_Atomic_exit_L pomp2_atomic_exit\n" "#define POMP2_Implicit_barrier_enter_L pomp2_implicit_barrier_enter\n" "#define POMP2_Implicit_barrier_exit_L pomp2_implicit_barrier_exit\n" "#define POMP2_Barrier_enter_L pomp2_barrier_enter\n" "#define POMP2_Barrier_exit_L pomp2_barrier_exit\n" "#define POMP2_Flush_enter_L pomp2_flush_enter\n" "#define POMP2_Flush_exit_L pomp2_flush_exit\n" "#define POMP2_Critical_begin_L pomp2_critical_begin\n" "#define POMP2_Critical_end_L pomp2_critical_end\n" "#define POMP2_Critical_enter_L pomp2_critical_enter\n" "#define POMP2_Critical_exit_L pomp2_critical_exit\n" "#define POMP2_Do_enter_L pomp2_do_enter\n" "#define POMP2_Do_exit_L pomp2_do_exit\n" "#define POMP2_Master_begin_L pomp2_master_begin\n" "#define POMP2_Master_end_L pomp2_master_end\n" "#define POMP2_Parallel_begin_L pomp2_parallel_begin\n" "#define POMP2_Parallel_end_L pomp2_parallel_end\n" "#define POMP2_Parallel_enter_L pomp2_parallel_enter\n" "#define POMP2_Parallel_exit_L pomp2_parallel_exit\n" "#define POMP2_Parallel_fork_L pomp2_parallel_fork\n" "#define POMP2_Parallel_join_L pomp2_parallel_join\n" "#define POMP2_Section_begin_L pomp2_section_begin\n" "#define POMP2_Section_end_L pomp2_section_end\n" "#define POMP2_Section_enter_L pomp2_section_enter\n" "#define POMP2_Section_exit_L pomp2_section_exit\n" "#define POMP2_Sections_enter_L pomp2_sections_enter\n" "#define POMP2_Sections_exit_L pomp2_sections_exit\n" "#define POMP2_Single_begin_L pomp2_single_begin\n" "#define POMP2_Single_end_L pomp2_single_end\n" "#define POMP2_Single_enter_L pomp2_single_enter\n" "#define POMP2_Single_exit_L pomp2_single_exit\n" "#define POMP2_Ordered_begin_L pomp2_ordered_begin\n" "#define POMP2_Ordered_end_L pomp2_ordered_end\n" "#define POMP2_Ordered_enter_L pomp2_ordered_enter\n" "#define POMP2_Ordered_exit_L pomp2_ordered_exit\n" "#define POMP2_Task_begin_L pomp2_task_begin\n" "#define POMP2_Task_end_L pomp2_task_end\n" "#define POMP2_Task_create_begin_L pomp2_task_create_begin\n" "#define POMP2_Task_create_end_L pomp2_task_create_end\n" "#define POMP2_Untied_task_begin_L pomp2_untied_task_begin\n" "#define POMP2_Untied_task_end_L pomp2_untied_task_end\n" "#define POMP2_Untied_task_create_begin_L pomp2_untied_task_create_begin\n" "#define POMP2_Untied_task_create_end_L pomp2_untied_task_create_end\n" "#define POMP2_Taskwait_begin_L pomp2_taskwait_begin\n" "#define POMP2_Taskwait_end_L pomp2_taskwait_end\n" "#define POMP2_Workshare_enter_L pomp2_workshare_enter\n" "#define POMP2_Workshare_exit_L pomp2_workshare_exit\n" "#define POMP2_Begin_L pomp2_begin\n" "#define POMP2_End_L pomp2_end\n" "#define POMP2_Lib_get_max_threads_L pomp2_lib_get_max_threads\n" "#define POMP2_Init_lock_L pomp2_init_lock\n" "#define POMP2_Destroy_lock_L pomp2_destroy_lock\n" "#define POMP2_Set_lock_L pomp2_set_lock\n" "#define POMP2_Unset_lock_L pomp2_unset_lock\n" "#define POMP2_Test_lock_L pomp2_test_lock\n" "#define POMP2_Init_nest_lock_L pomp2_init_nest_lock\n" "#define POMP2_Destroy_nest_lock_L pomp2_destroy_nest_lock\n" "#define POMP2_Set_nest_lock_L pomp2_set_nest_lock\n" "#define POMP2_Unset_nest_lock_L pomp2_unset_nest_lock\n" "#define POMP2_Test_nest_lock_L pomp2_test_nest_lock\n" "#define POMP2_Assign_handle_L pomp2_assign_handle\n" "#define POMP2_USER_Assign_handle_L pomp2_user_assign_handle\n" "#define omp_init_lock_L omp_init_lock\n" "#define omp_destroy_lock_L omp_destroy_lock\n" "#define omp_set_lock_L omp_set_lock\n" "#define omp_unset_lock_L omp_unset_lock\n" "#define omp_test_lock_L omp_test_lock\n" "#define omp_init_nest_lock_L omp_init_nest_lock\n" "#define omp_destroy_nest_lock_L omp_destroy_nest_lock\n" "#define omp_set_nest_lock_L omp_set_nest_lock\n" "#define omp_unset_nest_lock_L omp_unset_nest_lock\n" "#define omp_test_nest_lock_L omp_test_nest_lock\n" "\n" "#define XSUFFIX(name) name##_\n" "#define XSUFFIX2(name) name##__\n" "#define XPREFIX(name) _##name\n" "#define XPREFIX2(name) __##name\n" "\n" "#define SUFFIX(name) XSUFFIX(name)\n" "#define SUFFIX2(name) XSUFFIX2(name)\n" "#define PREFIX(name) XPREFIX(name)\n" "#define PREFIX2(name) XPREFIX2(name)\n" "\n" "#define UPCASE(name) name##_U\n" "#define LOWCASE(name) name##_L\n" "\n"; static void generate( char* str ) { FILE* f = fopen( "pomp2_fwrapper_def.h", "w" ); if ( f == NULL ) { perror( "pomp2_fwrapper_def.h" ); exit( 1 ); } fputs( header, f ); fputs( str, f ); fputs( "\n", f ); fclose( f ); } void foo_foo() { generate( "#define FSUB(name) LOWCASE(name)" ); } void foo_foo_() { generate( "#define FSUB(name) SUFFIX(LOWCASE(name))" ); } void foo_foo__() { generate( "#define FSUB(name) SUFFIX2(LOWCASE(name))" ); } void _foo_foo() { generate( "#define FSUB(name) PREFIX(LOWCASE(name))" ); } void __foo_foo() { generate( "#define FSUB(name) PREFIX2(LOWCASE(name))" ); } void _foo_foo_() { generate( "#define FSUB(name) PREFIX(SUFFIX(LOWCASE(name)))" ); } void FOO_FOO() { generate( "#define FSUB(name) UPCASE(name)" ); } void FOO_FOO_() { generate( "#define FSUB(name) SUFFIX(UPCASE(name))" ); } void FOO_FOO__() { generate( "#define FSUB(name) SUFFIX2(UPCASE(name))" ); } void _FOO_FOO() { generate( "#define FSUB(name) PREFIX(UPCASE(name))" ); } void __FOO_FOO() { generate( "#define FSUB(name) PREFIX2(UPCASE(name))" ); } void _FOO_FOO_() { generate( "#define FSUB(name) PREFIX(SUFFIX(UPCASE(name)))" ); } opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/pomp2_fwrapper_base.h0000644000000000000000000000013215232670204021751 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.147262045 opari2-2.0.10/src/opari-lib-dummy/pomp2_fwrapper_base.h0000664000175100001440000000274215232670204022310 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. */ #include #include "pomp2_fwrapper_def.h" #ifndef POMP2_FWRAPPER_BASE_H #define POMP2_FWRAPPER_BASE_H extern void FSUB( omp_init_lock )( omp_lock_t* s ); extern void FSUB( omp_destroy_lock )( omp_lock_t* s ); extern void FSUB( omp_set_lock )( omp_lock_t* s ); extern void FSUB( omp_unset_lock )( omp_lock_t* s ); extern int FSUB( omp_test_lock )( omp_lock_t* s ); extern void FSUB( omp_init_nest_lock )( omp_nest_lock_t* s ); extern void FSUB( omp_destroy_nest_lock )( omp_nest_lock_t* s ); extern void FSUB( omp_set_nest_lock )( omp_nest_lock_t* s ); extern void FSUB( omp_unset_nest_lock )( omp_nest_lock_t* s ); extern int FSUB( omp_test_nest_lock )( omp_nest_lock_t* s ); #endif opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/pomp2_fwrapper_base.c0000644000000000000000000000013215232670204021744 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.143262069 opari2-2.0.10/src/opari-lib-dummy/pomp2_fwrapper_base.c0000664000175100001440000001062515232670204022302 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file pomp2_fwrapper_base.c * * * @brief Basic fortan wrappers calling the C versions.*/ #include #include #include #include "pomp2_fwrapper_base.h" #include #include #include "pomp2_fwrapper_def.h" extern int pomp2_tracing; /* *INDENT-OFF* */ void FSUB(POMP2_Finalize)() { POMP2_Finalize(); } void FSUB(POMP2_Init)() { POMP2_Init(); } void FSUB(POMP2_Off)() { pomp2_tracing = 0; } void FSUB(POMP2_On)() { pomp2_tracing = 1; } void FSUB(POMP2_Begin)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Begin(regionHandle, ctc_string); } void FSUB(POMP2_End)(POMP2_Region_handle* regionHandle) { POMP2_End(regionHandle); } /* *INDENT-OFF* */ /* *---------------------------------------------------------------- * Fortran Wrapper for OpenMP API ******---------------------------------------------------------------- */ /* *INDENT-OFF* */ #if defined(__ICC) || defined(__ECC) || defined(_SX) #define CALLFSUB(a) a #else #define CALLFSUB(a) FSUB(a) #endif void FSUB(POMP2_Init_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: init lock\n", omp_get_thread_num()); } CALLFSUB(omp_init_lock)(s); } void FSUB(POMP2_Destroy_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: destroy lock\n", omp_get_thread_num()); } CALLFSUB(omp_destroy_lock)(s); } void FSUB(POMP2_Set_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: set lock\n", omp_get_thread_num()); } CALLFSUB(omp_set_lock)(s); } void FSUB(POMP2_Unset_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: unset lock\n", omp_get_thread_num()); } CALLFSUB(omp_unset_lock)(s); } int FSUB(POMP2_Test_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: test lock\n", omp_get_thread_num()); } return CALLFSUB(omp_test_lock)(s); } #ifndef __osf__ void FSUB(POMP2_Init_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: init nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_init_nest_lock)(s); } void FSUB(POMP2_Destroy_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: destroy nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_destroy_nest_lock)(s); } void FSUB(POMP2_Set_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: set nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_set_nest_lock)(s); } void FSUB(POMP2_Unset_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: unset nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_unset_nest_lock)(s); } int FSUB(POMP2_Test_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: test nestlock\n", omp_get_thread_num()); } return CALLFSUB(omp_test_nest_lock)(s); } #endif opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/pomp2_fwrapper.c0000644000000000000000000000013215232670204020752 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426078.143262069 opari2-2.0.10/src/opari-lib-dummy/pomp2_fwrapper.c0000664000175100001440000002440415232670204021310 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file pomp2_fwrapper.c * * @brief This file contains fortran wrapper functions.*/ #include #include #include #include #include #include #include "pomp2_fwrapper_def.h" /* * Fortran wrappers calling the C versions */ /* *INDENT-OFF* */ void FSUB(POMP2_Atomic_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Atomic_enter(regionHandle, ctc_string); } void FSUB(POMP2_Atomic_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Atomic_exit(regionHandle ); } void FSUB(POMP2_Implicit_barrier_enter)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task) { POMP2_Implicit_barrier_enter( regionHandle, pomp2_old_task ); } void FSUB(POMP2_Implicit_barrier_exit)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task) { POMP2_Implicit_barrier_exit( regionHandle, *pomp2_old_task ); } void FSUB(POMP2_Barrier_enter)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task, char* ctc_string) { POMP2_Barrier_enter( regionHandle, pomp2_old_task, ctc_string); } void FSUB(POMP2_Barrier_exit)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ) { POMP2_Barrier_exit( regionHandle, *pomp2_old_task ); } void FSUB(POMP2_Flush_enter)(POMP2_Region_handle* regionHandle, char* ctc_string ) { POMP2_Flush_enter(regionHandle, ctc_string ); } void FSUB(POMP2_Flush_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Flush_exit(regionHandle ); } void FSUB(POMP2_Critical_begin)(POMP2_Region_handle* regionHandle ) { POMP2_Critical_begin(regionHandle ); } void FSUB(POMP2_Critical_end)(POMP2_Region_handle* regionHandle ) { POMP2_Critical_end(regionHandle ); } void FSUB(POMP2_Critical_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Critical_enter(regionHandle, ctc_string); } void FSUB(POMP2_Critical_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Critical_exit(regionHandle ); } void FSUB(POMP2_Do_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_For_enter(regionHandle, ctc_string); } void FSUB(POMP2_Do_exit)(POMP2_Region_handle* regionHandle ) { POMP2_For_exit(regionHandle ); } void FSUB(POMP2_Parallel_begin)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* newTask, char* ctc_string ){ POMP2_Parallel_begin(regionHandle); } void FSUB(POMP2_Parallel_end)(POMP2_Region_handle* regionHandle) { POMP2_Parallel_end(regionHandle); } void FSUB(POMP2_Master_begin)(POMP2_Region_handle* regionHandle, char* ctc_string ) { POMP2_Master_begin(regionHandle, ctc_string ); } void FSUB(POMP2_Master_end)(POMP2_Region_handle* regionHandle ) { POMP2_Master_end(regionHandle ); } void FSUB(POMP2_Parallel_fork)(POMP2_Region_handle* regionHandle, int* if_clause, int* num_threads, POMP2_Task_handle* pomp2_old_task, char* ctc_string) { POMP2_Parallel_fork(regionHandle, *if_clause, *num_threads, pomp2_old_task, "dummy"); } void FSUB(POMP2_Parallel_join)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ) { POMP2_Parallel_join(regionHandle, *pomp2_old_task ); } void FSUB(POMP2_Section_begin)(POMP2_Region_handle* regionHandle, char* ctc_string ) { POMP2_Section_begin(regionHandle, ctc_string ); } void FSUB(POMP2_Section_end)(POMP2_Region_handle* regionHandle ) { POMP2_Section_end(regionHandle ); } void FSUB(POMP2_Sections_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Sections_enter(regionHandle, ctc_string); } void FSUB(POMP2_Sections_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Sections_exit(regionHandle ); } void FSUB(POMP2_Single_begin)(POMP2_Region_handle* regionHandle ) { POMP2_Single_begin(regionHandle ); } void FSUB(POMP2_Single_end)(POMP2_Region_handle* regionHandle ) { POMP2_Single_end(regionHandle ); } void FSUB(POMP2_Single_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Single_enter(regionHandle, ctc_string); } void FSUB(POMP2_Ordered_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Ordered_exit(regionHandle ); } void FSUB(POMP2_Ordered_begin)(POMP2_Region_handle* regionHandle ) { POMP2_Ordered_begin(regionHandle ); } void FSUB(POMP2_Ordered_end)(POMP2_Region_handle* regionHandle ) { POMP2_Ordered_end(regionHandle ); } void FSUB(POMP2_Ordered_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Ordered_enter(regionHandle, ctc_string); } void FSUB(POMP2_Single_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Single_exit(regionHandle ); } void FSUB(POMP2_Task_create_begin)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int* pomp2_if, char* ctc_string){ POMP2_Task_create_begin(regionHandle, pomp2_new_task, pomp2_old_task, *pomp2_if, ctc_string); } void FSUB(POMP2_Task_create_end)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ){ POMP2_Task_create_end(regionHandle, *pomp2_old_task); } void FSUB(POMP2_Task_begin)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task ){ POMP2_Task_begin(regionHandle, *pomp2_new_task); } void FSUB(POMP2_Task_end)(POMP2_Region_handle* regionHandle){ POMP2_Task_end(regionHandle); } void FSUB(POMP2_Untied_task_create_begin)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int* pomp2_if, char* ctc_string){ POMP2_Task_create_begin(regionHandle, pomp2_new_task, pomp2_old_task, *pomp2_if, ctc_string); } void FSUB(POMP2_Untied_task_create_end)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ){ POMP2_Task_create_end(regionHandle, *pomp2_old_task); } void FSUB(POMP2_Untied_task_begin)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task ){ POMP2_Task_begin(regionHandle, *pomp2_new_task); } void FSUB(POMP2_Untied_task_end)(POMP2_Region_handle* regionHandle){ POMP2_Task_end(regionHandle); } void FSUB(POMP2_Taskwait_begin)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task, char* ctc_string ){ POMP2_Taskwait_begin(regionHandle, pomp2_old_task, ctc_string ); } void FSUB(POMP2_Taskwait_end)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ){ POMP2_Taskwait_end(regionHandle, *pomp2_old_task); } void FSUB(POMP2_Workshare_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Workshare_enter(regionHandle, ctc_string); } void FSUB(POMP2_Workshare_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Workshare_exit(regionHandle ); } void FSUB(POMP2_Assign_handle)(POMP2_Region_handle* regionHandle, char* ctc_string, int ctc_string_len) { char *str; str=(char*) malloc((ctc_string_len+1)*sizeof(char)); strncpy(str,ctc_string,ctc_string_len); str[ctc_string_len]='\0'; POMP2_Assign_handle(regionHandle,str); free(str); } void FSUB(POMP2_USER_Assign_handle)(POMP2_Region_handle* regionHandle, char* ctc_string, int ctc_string_len) { char *str; str=(char*) malloc((ctc_string_len+1)*sizeof(char)); strncpy(str,ctc_string,ctc_string_len); str[ctc_string_len]='\0'; POMP2_USER_Assign_handle(regionHandle,str); free(str); } /* *---------------------------------------------------------------- * Wrapper for omp_get_max_threads used in instrumentation * * In Fortran a wrapper function * pomp2_get_max_threads() is used, since it is not possible to * ensure, that omp_get_max_threads is not used in the user * program. We would need to parse much more of the Fortran * Syntax to detect these cases. The Wrapper function avoids * double definition of this function and avoids errors. * ******---------------------------------------------------------------- */ int FSUB(POMP2_Lib_get_max_threads)(void) { return omp_get_max_threads(); } opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/pomp2_user_region_info.h0000644000000000000000000000013215232670204022465 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.143262069 opari2-2.0.10/src/opari-lib-dummy/pomp2_user_region_info.h0000664000175100001440000001065215232670204023023 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_USER_REGION_INFO_H #define POMP2_USER_REGION_INFO_H /** * @file pomp2_user_region_info.h * @date Started Tue Apr 1 2014 * * @brief This file contains function declarations and structs which * handle informations on user defined regions. POMP2_USER_Region_info * is used to store these informations. It can be filled with a * ctcString by ctcString2UserRegionInfo(). * */ #include "opari2_region_info.h" #include /** * POMP2_USER_Region_type * */ typedef enum { POMP2_USER_no_type = 0, POMP2_USER_Region } POMP2_USER_Region_type; /** converts regionType into a string * @param regionType The regionType to be converted. * @return string representation of the region type*/ const char* pomp2UserRegionType2String( POMP2_USER_Region_type regionType ); /** * @brief This struct stores all information on a user defined * region, like the name or corresponding source lines. The function * ctcString2UserRegionInfo() can be used to fill this struct with data * from a ctcString. */ typedef struct { /** @name Generic source code information attributes */ /*@{*/ /** source location info. Needs to be first for the typecasting from generic OPARI2_Region_info to work. */ OPARI2_REGION_INFO /** @name Type of the OpenMP region*/ POMP2_USER_Region_type mRegionType; /*@}*/ /** @name Attributes for user region types */ /*@{*/ /** name of a user defined region*/ char* mUserRegionName; /*@}*/ } POMP2_USER_Region_info; /** CTC Tokens */ #define CTC_USER_REGION_TOKENS \ CTC_USER_Region_name #define CTC_USER_REGION_TOKEN_MAP_ENTRIES \ { "userRegionName", CTC_USER_Region_name } /** * ctcString2UserRegionInfo() fills the POMP2_USER_Region_info object with data read * from the ctcString. If the ctcString does not comply with the * specification, the program aborts with exit code 1. * * @n Rationale: ctcString2UserRegionInfo() is used during * initialization of the measurement system. If an error occurs, it is * better to abort than to struggle with undefined behaviour or @e * guessing the meaning of the broken string. * * @note Can be called from multiple threads concurrently, assuming malloc is * thread-safe. * * @note ctcString2UserRegionInfo() will assign memory to the members of @e * regionInfo. You are supposed to to release this memory by calling * freePOMP2UserRegionInfoMembers(). * * @param ctcString A string in the format * "length*key=value*[key=value]*". The length field is parsed but not * used by this implementation. Possible values for key are listed in * ctcTokenMap. The string must at least contain values for the keys * @c regionType, @c sscl and @c escl. Possible values for the key @c * regionType are listed in regionTypesMap. The format for @c sscl * resp. @c escl values is @c "filename:lineNo1:lineNo2". * * @param regionInfo must be a valid object * * @post At least the required attributes (see POMP2_USER_Region_info) are * set. * @n If @c regionType=userRegion then * POMP2_USER_Region_info::mUserRegionName has a value != 0. * */ void ctcString2UserRegionInfo( const char ctcString[], POMP2_USER_Region_info* regionInfo ); /** * Free the memory of the regionInfo members. * @param regionInfo The regioninfo to be freed. */ void freePOMP2UserRegionInfoMembers( POMP2_USER_Region_info* regionInfo ); #endif /* POMP2_USER_REGION_INFO_H */ opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/pomp2_user_region_info.c0000644000000000000000000000013215232670204022460 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.139262092 opari2-2.0.10/src/opari-lib-dummy/pomp2_user_region_info.c0000664000175100001440000001212415232670204023012 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** * @file pomp2_user_region_info.c * @date Started Tue Apr 1 2014 * * @brief * */ #include #include "opari2_ctc_parser.h" #include "opari2_ctc_token.h" #include "pomp2_user_region_info.h" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ static void checkUSERConsistency( CTCData* obj ); static void initUserRegionInfo( POMP2_USER_Region_info* obj ); bool checkCTCTokenAndAssignUserRegionInfoValues( int ctctoken, char* value, CTCData* obj ); void ctcString2UserRegionInfo( const char string[], POMP2_USER_Region_info* regionInfo ) { assert( regionInfo ); CTCData ctcData; ctcData.mRegionInfo = ( OPARI2_Region_info* )regionInfo; initUserRegionInfo( regionInfo ); OPARI2_CTC_initCTCData( &ctcData, string ); OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues ( &ctcData, checkCTCTokenAndAssignUserRegionInfoValues ); checkUSERConsistency( &ctcData ); OPARI2_CTC_freeCTCData( &ctcData ); } static void initUserRegionInfo( POMP2_USER_Region_info* obj ) { obj->mRegionType = ( POMP2_USER_Region_type )POMP2_USER_no_type; obj->mUserRegionName = 0; } static void assignUserRegionType( CTCData* obj, const char* value ); bool checkCTCTokenAndAssignUserRegionInfoValues( int ctctoken, char* value, CTCData* obj ) { POMP2_USER_Region_info* regionInfo = ( POMP2_USER_Region_info* )obj->mRegionInfo; switch ( ctctoken ) { case CTC_Region_type: assignUserRegionType( obj, value ); return true; case CTC_USER_Region_name: OPARI2_CTC_assignString( ®ionInfo->mUserRegionName, value ); return true; } return false; } /*----------------------------------------------------------------------------*/ /** @brief map with region types (really short but exactly like the other paradigms) */ static const OPARI2_CTCMapType userRegionTypesMap[] = { { "userRegion", POMP2_USER_Region } }; static void assignUserRegionType( CTCData* obj, const char* value ) { POMP2_USER_Region_info* regionInfo = ( POMP2_USER_Region_info* )obj->mRegionInfo; regionInfo->mRegionType = ( POMP2_USER_Region_type )OPARI2_CTC_string2Enum( userRegionTypesMap, OPARI2_CTC_MAP_SIZE( userRegionTypesMap ), value ); if ( regionInfo->mRegionType == POMP2_No_type ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_region_type, value ); } } const char* pomp2UserRegionType2String( POMP2_USER_Region_type regionType ) { if ( regionType ) { return OPARI2_CTC_enum2String( userRegionTypesMap, OPARI2_CTC_MAP_SIZE( userRegionTypesMap ), regionType ); } return "no valid region type"; } /*----------------------------------------------------------------------------*/ static void checkUSERConsistency( CTCData* obj ) { bool requiredAttributesFound; POMP2_USER_Region_info* regionInfo = ( POMP2_USER_Region_info* )obj->mRegionInfo; OPARI2_CTC_checkConsistency( obj ); if ( regionInfo->mRegionType == POMP2_USER_no_type ) { OPARI2_CTC_error( obj, CTC_ERROR_No_region_type, 0 ); return; } if ( regionInfo->mRegionType == POMP2_USER_Region && regionInfo->mUserRegionName == 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_User_region_name_missing, 0 ); return; } } /*----------------------------------------------------------------------------*/ void freePOMP2UserRegionInfoMembers( POMP2_USER_Region_info* regionInfo ) { OPARI2_CTC_freeAndReset( ®ionInfo->mUserRegionName ); } opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/pomp2_region_info.h0000644000000000000000000000013215232670204021427 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.139262092 opari2-2.0.10/src/opari-lib-dummy/pomp2_region_info.h0000664000175100001440000002222415232670204021763 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_REGION_INFO_H #define POMP2_REGION_INFO_H /** * @file pomp2_region_info.h * @date Started Fri Mar 20 16:30:45 2009 * * @brief This file contains function declarations and structs * which handle informations on OpenMP regions. POMP2_Region_info * is used to store these informations. It can be filled with a * ctcString by ctcString2RegionInfo(). * */ #include "opari2_region_info.h" #include /** * POMP2_Region_type * */ typedef enum /* POMP2_Region_type */ { POMP2_No_type = 0, POMP2_Atomic, POMP2_Barrier, POMP2_Critical, POMP2_Do, POMP2_Flush, POMP2_For, POMP2_Master, POMP2_Ordered, POMP2_Parallel, POMP2_Parallel_do, POMP2_Parallel_for, POMP2_Parallel_sections, POMP2_Parallel_workshare, POMP2_Sections, POMP2_Single, POMP2_Task, POMP2_Taskuntied, POMP2_Taskwait, POMP2_Workshare } POMP2_Region_type; /** converts regionType into a string * @param regionType The regionType to be converted. * @return string representation of the region type*/ const char* pomp2RegionType2String( POMP2_Region_type regionType ); /** * type to store the scheduling type of a for worksharing constuct * */ typedef enum { POMP2_No_schedule = 0, POMP2_Static, /* needs chunk size */ POMP2_Dynamic, /* needs chunk size */ POMP2_Guided, /* needs chunk size */ POMP2_Runtime, POMP2_Auto } POMP2_Schedule_type; /** converts scheduleType into a string * @param scheduleType The scheduleType to be converted. * @return string representation of the scheduleType*/ const char* pomp2ScheduleType2String( POMP2_Schedule_type scheduleType ); /** * type to store the default value data sharing * */ typedef enum { POMP2_No_defaultSharing = 0, POMP2_None, POMP2_Shared, POMP2_Private, POMP2_Firstprivate } POMP2_DefaultSharing_type; /** converts defaultSharingType into a string * @param defaultSharingType The defaultSharingType to be converted. * @return string representation of the defaultSharingType*/ const char* pomp2defaultSharingType2String( POMP2_DefaultSharing_type defaultSharingType ); /** * @brief This struct stores all information on an OpenMP region, like the * region type or corresponding source lines. The function * ctcString2RegionInfo() can be used to fill this struct with data * from a ctcString. */ typedef struct { /** @name Generic source code information attributes */ //@{ /** Source location info. Needs to be first for the typecasting * from generic OPARI2_Region_info to work. It is included by use * of the macro OPARI2_REGION_INFO to ensure typecasting when * necessary */ OPARI2_REGION_INFO //@} /** OpenMP specific fields */ //@{ /** Type of the OpenMP region*/ POMP2_Region_type mRegionType; /**true if a copyin clause is present*/ bool mHasCopyIn; /**true if a copyprivate clause is present*/ bool mHasCopyPrivate; /**true if an if clause is present*/ bool mHasIf; /**true if a firstprivate clause is present*/ bool mHasFirstPrivate; /**true if a lastprivate clause is present*/ bool mHasLastPrivate; /**true if a nowait clause is present*/ bool mHasNoWait; /**true if a numThreads clause is present*/ bool mHasNumThreads; /**true if an ordered clause is present*/ bool mHasOrdered; /**true if a reduction clause is present*/ bool mHasReduction; /**true if a shared clause is present*/ bool mHasShared; /**true if a collapse clause is present*/ bool mHasCollapse; /**true if a untied clause was present, even if the task was changed to tied during instrumentation.*/ bool mHasUntied; /** schedule type in the schedule clause*/ POMP2_Schedule_type mScheduleType; /** defaultSharing type in the defaultSharing clause*/ POMP2_DefaultSharing_type mDefaultSharingType; /** user group name*/ char* mUserGroupName; /** number of sections*/ unsigned mNumSections; /** name of a named critical region*/ char* mCriticalName; //@} } POMP2_Region_info; /** CTC Tokens */ #define CTC_OMP_TOKENS \ CTC_OMP_Has_copy_in, \ CTC_OMP_Has_copy_private, \ CTC_OMP_Has_defaultSharing, \ CTC_OMP_Has_first_private, \ CTC_OMP_Has_last_private, \ CTC_OMP_Has_no_wait, \ CTC_OMP_Has_ordered, \ CTC_OMP_Has_reduction, \ CTC_OMP_Has_schedule, \ CTC_OMP_Has_shared, \ CTC_OMP_Num_sections, \ CTC_OMP_Critical_name, \ CTC_OMP_User_group_name, \ CTC_OMP_Has_if, \ CTC_OMP_Has_collapse, \ CTC_OMP_Has_num_threads, \ CTC_OMP_Has_untied #define CTC_OPENMP_TOKEN_MAP_ENTRIES \ { "criticalName", CTC_OMP_Critical_name }, \ { "hasCollapse", CTC_OMP_Has_collapse }, \ { "hasCopyIn", CTC_OMP_Has_copy_in }, \ { "hasCopyPrivate", CTC_OMP_Has_copy_private }, \ { "hasDefault", CTC_OMP_Has_defaultSharing }, \ { "hasFirstPrivate", CTC_OMP_Has_first_private }, \ { "hasIf", CTC_OMP_Has_if }, \ { "hasLastPrivate", CTC_OMP_Has_last_private }, \ { "hasNowait", CTC_OMP_Has_no_wait }, \ { "hasNum_threads", CTC_OMP_Has_num_threads }, \ { "hasOrdered", CTC_OMP_Has_ordered }, \ { "hasReduction", CTC_OMP_Has_reduction }, \ { "hasSchedule", CTC_OMP_Has_schedule }, \ { "hasShared", CTC_OMP_Has_shared }, \ { "hasUntied", CTC_OMP_Has_untied }, \ { "numSections", CTC_OMP_Num_sections }, \ { "userGroupName", CTC_OMP_User_group_name } /** * ctcString2RegionInfo() fills the POMP2_Region_info object with data read * from the ctcString. If the ctcString does not comply with the * specification, the program aborts with exit code 1. * * @n Rationale: ctcString2RegionInfo() is used during initialization * of the measurement system. If an error occurs, it is better to * abort than to struggle with undefined behaviour or @e guessing the * meaning of the broken string. * * @note Can be called from multiple threads concurrently, assuming malloc is * thread-safe. * * @note ctcString2RegionInfo() will assign memory to the members of @e * regionInfo. You are supposed to to release this memory by calling * freePOMP2RegionInfoMembers(). * * @param ctcString A string in the format * "length*key=value*[key=value]*". The length field is parsed but not used by * this implementation. Possible values for key are listed in * ctcTokenMap. The string must at least contain values for the keys @c * regionType, @c sscl and @c escl. Possible values for the key @c regionType * are listed in regionTypesMap. The format for @c sscl resp. @c escl values * is @c "filename:lineNo1:lineNo2". * * @param regionInfo must be a valid object * * @post At least the required attributes (see POMP2_Region_info) are set. * @n All other members of @e regionInfo are set to 0 resp. false * resp. POMP2_No_schedule. * @n If @c regionType=sections than POMP2_Region_info::mNumSections * has a value > 0. * @n If @c regionType=critical than POMP2_Region_info::mCriticalName * may have a value != 0. * */ void ctcString2RegionInfo( const char ctcString[], POMP2_Region_info* regionInfo ); /** * Free the memory of the regionInfo members. * @param regionInfo The regioninfo to be freed. */ void freePOMP2RegionInfoMembers( POMP2_Region_info* regionInfo ); #endif /* POMP2_REGION_INFO_H */ opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/pomp2_region_info.c0000644000000000000000000000013215232670204021422 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.135262116 opari2-2.0.10/src/opari-lib-dummy/pomp2_region_info.c0000664000175100001440000003233615232670204021763 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** * @file pomp2_region_info.c * @date Started Fri Mar 20 16:59:41 2009 * * @brief * */ #include #include "opari2_ctc_parser.h" #include "opari2_ctc_token.h" #include "pomp2_region_info.h" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ static void checkOMPConsistency( CTCData* obj ); static void initOpenmpRegionInfo( POMP2_Region_info* obj ); bool checkCTCTokenAndAssignRegionInfoValues( int ctctoken, char* value, CTCData* obj ); void ctcString2RegionInfo( const char string[], POMP2_Region_info* regionInfo ) { assert( regionInfo ); CTCData ctcData; ctcData.mRegionInfo = ( OPARI2_Region_info* )regionInfo; initOpenmpRegionInfo( regionInfo ); OPARI2_CTC_initCTCData( &ctcData, string ); OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues ( &ctcData, checkCTCTokenAndAssignRegionInfoValues ); checkOMPConsistency( &ctcData ); OPARI2_CTC_freeCTCData( &ctcData ); } static void initOpenmpRegionInfo( POMP2_Region_info* obj ) { obj->mRegionType = POMP2_No_type; obj->mHasCollapse = false; obj->mHasCopyIn = false; obj->mHasCopyPrivate = false; obj->mHasFirstPrivate = false; obj->mHasIf = false; obj->mHasLastPrivate = false; obj->mHasNoWait = false; obj->mHasNumThreads = false; obj->mHasOrdered = false; obj->mHasReduction = false; obj->mHasUntied = false; obj->mScheduleType = POMP2_No_schedule; obj->mNumSections = 0; obj->mCriticalName = 0; obj->mUserGroupName = 0; } static void assignRegionType( CTCData* obj, const char* value ); static void assignScheduleType( CTCData* obj, char* restrict value ); static void assignDefaultSharingType( CTCData* obj, char* restrict value ); bool checkCTCTokenAndAssignRegionInfoValues( int ctctoken, char* value, CTCData* obj ) { POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; switch ( ctctoken ) { case CTC_Region_type: assignRegionType( obj, value ); return true; case CTC_OMP_Has_copy_in: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasCopyIn, value ); return true; case CTC_OMP_Has_copy_private: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasCopyPrivate, value ); return true; case CTC_OMP_Has_first_private: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasFirstPrivate, value ); return true; case CTC_OMP_Has_if: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasIf, value ); return true; case CTC_OMP_Has_last_private: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasLastPrivate, value ); return true; case CTC_OMP_Has_no_wait: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasNoWait, value ); return true; case CTC_OMP_Has_num_threads: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasNumThreads, value ); return true; case CTC_OMP_Has_ordered: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasOrdered, value ); return true; case CTC_OMP_Has_reduction: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasReduction, value ); return true; case CTC_OMP_Has_collapse: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasCollapse, value ); return true; case CTC_OMP_Has_untied: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasUntied, value ); return true; case CTC_OMP_Has_schedule: assignScheduleType( obj, value ); return true; case CTC_OMP_Has_defaultSharing: assignDefaultSharingType( obj, value ); return true; case CTC_OMP_Has_shared: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasShared, value ); return true; case CTC_OMP_Num_sections: OPARI2_CTC_assignUnsigned( obj, ®ionInfo->mNumSections, value ); return true; case CTC_OMP_Critical_name: OPARI2_CTC_assignString( ®ionInfo->mCriticalName, value ); return true; case CTC_OMP_User_group_name: OPARI2_CTC_assignString( ®ionInfo->mUserGroupName, value ); return true; } return false; } /*----------------------------------------------------------------------------*/ /** @brief map with region types*/ static const OPARI2_CTCMapType regionTypesMap[] = { { "atomic", POMP2_Atomic }, { "barrier", POMP2_Barrier }, { "critical", POMP2_Critical }, { "do", POMP2_Do }, { "flush", POMP2_Flush }, { "for", POMP2_For }, { "master", POMP2_Master }, { "ordered", POMP2_Ordered }, { "parallel", POMP2_Parallel }, { "paralleldo", POMP2_Parallel_do }, { "parallelfor", POMP2_Parallel_for }, { "parallelsections", POMP2_Parallel_sections }, { "parallelworkshare", POMP2_Parallel_workshare }, { "sections", POMP2_Sections }, { "single", POMP2_Single }, { "task", POMP2_Task }, { "taskuntied", POMP2_Taskuntied }, { "taskwait", POMP2_Taskwait }, { "workshare", POMP2_Workshare } }; static void assignRegionType( CTCData* obj, const char* value ) { POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; regionInfo->mRegionType = ( POMP2_Region_type )OPARI2_CTC_string2Enum( regionTypesMap, OPARI2_CTC_MAP_SIZE( regionTypesMap ), value ); if ( regionInfo->mRegionType == POMP2_No_type ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_region_type, value ); } } const char* pomp2RegionType2String( POMP2_Region_type regionType ) { if ( regionType ) { return OPARI2_CTC_enum2String( regionTypesMap, OPARI2_CTC_MAP_SIZE( regionTypesMap ), regionType ); } return "no valid region type"; } /*----------------------------------------------------------------------------*/ /** @brief map with schedule types*/ static const OPARI2_CTCMapType scheduleTypesMap[] = { { "auto", POMP2_Auto }, { "dynamic", POMP2_Dynamic }, { "guided", POMP2_Guided }, { "runtime", POMP2_Runtime }, { "static", POMP2_Static } }; /** @brief returns a string of the schedule type*/ const char* pomp2ScheduleType2String( POMP2_Schedule_type scheduleType ) { if ( scheduleType ) { return OPARI2_CTC_enum2String( scheduleTypesMap, OPARI2_CTC_MAP_SIZE( scheduleTypesMap ), scheduleType ); } return "no valid schedule type"; } static void assignScheduleType( CTCData* obj, char* restrict value ) { char* token = NULL; POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; token = strtok( value, "," ); if ( token ) { regionInfo->mScheduleType = ( POMP2_Schedule_type )OPARI2_CTC_string2Enum( scheduleTypesMap, OPARI2_CTC_MAP_SIZE( scheduleTypesMap ), value ); } else { regionInfo->mScheduleType = ( POMP2_Schedule_type )OPARI2_CTC_string2Enum( scheduleTypesMap, OPARI2_CTC_MAP_SIZE( scheduleTypesMap ), value ); } if ( regionInfo->mScheduleType == POMP2_No_schedule ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_schedule_type, value ); } } /*----------------------------------------------------------------------------*/ /** @brief map with defaultSharing types*/ static const OPARI2_CTCMapType defaultSharingTypesMap[] = { { "none", POMP2_None }, { "shared", POMP2_Shared }, { "private", POMP2_Private }, { "firstprivate", POMP2_Firstprivate } }; /** @brief returns a string of the defaultSharing type*/ const char* pomp2DefaultSharingType2String( POMP2_DefaultSharing_type defaultSharingType ) { if ( defaultSharingType ) { return OPARI2_CTC_enum2String( defaultSharingTypesMap, OPARI2_CTC_MAP_SIZE( defaultSharingTypesMap ), defaultSharingType ); } return "no valid defaultSharing type"; } static void assignDefaultSharingType( CTCData* obj, char* restrict value ) { char* token = NULL; POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; token = strtok( value, "," ); if ( token ) { regionInfo->mDefaultSharingType = ( POMP2_DefaultSharing_type )OPARI2_CTC_string2Enum( defaultSharingTypesMap, OPARI2_CTC_MAP_SIZE( defaultSharingTypesMap ), value ); } else { regionInfo->mDefaultSharingType = ( POMP2_DefaultSharing_type )OPARI2_CTC_string2Enum( defaultSharingTypesMap, OPARI2_CTC_MAP_SIZE( defaultSharingTypesMap ), value ); } if ( regionInfo->mDefaultSharingType == POMP2_No_defaultSharing ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_default_sharing_type, value ); } } /*----------------------------------------------------------------------------*/ static void checkOMPConsistency( CTCData* obj ) { bool requiredAttributesFound; POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; OPARI2_CTC_checkConsistency( obj ); if ( regionInfo->mRegionType == POMP2_No_type ) { OPARI2_CTC_error( obj, CTC_ERROR_No_region_type, 0 ); return; } if ( regionInfo->mRegionType == POMP2_Sections && regionInfo->mNumSections <= 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Num_sections_invalid, 0 ); return; } /* A barrier, taskwait and flush does not have an end line number, since it * is not associated to a region.*/ if ( obj->mRegionInfo->mStartLine2 > obj->mRegionInfo->mEndLine1 && regionInfo->mRegionType != POMP2_Barrier && regionInfo->mRegionType != POMP2_Taskwait && regionInfo->mRegionType != POMP2_Flush ) { OPARI2_CTC_error( obj, CTC_ERROR_Inconsistent_line_numbers, 0 ); return; } } /*----------------------------------------------------------------------------*/ void freePOMP2RegionInfoMembers( POMP2_Region_info* regionInfo ) { OPARI2_CTC_freeAndReset( ®ionInfo->mCriticalName ); OPARI2_CTC_freeAndReset( ®ionInfo->mUserGroupName ); } opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/opari2_region_info.h0000644000000000000000000000013215232670204021566 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426078.135262116 opari2-2.0.10/src/opari-lib-dummy/opari2_region_info.h0000664000175100001440000000436615232670204022131 0ustar00builderusers/**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef OPARI2_REGION_INFO_H #define OPARI2_REGION_INFO_H /** * @file opari2_region_info.h * @date Started Tue Mar 25 2014 * * @brief * */ #define OPARI2_REGION_INFO \ /** name of the corresponding source file from the opening pragma */ \ char* mStartFileName; \ /** line number of the first line from the opening pragma */ \ unsigned mStartLine1; \ /** line number of the last line from the opening pragma */ \ unsigned mStartLine2; \ /** name of the corresponding source file from the closing pragma */ \ char* mEndFileName; \ /** line number of the first line from the closing pragma */ \ unsigned mEndLine1; \ /** line number of the last line from the closing pragma */ \ unsigned mEndLine2; #define CTC_REGION_TOKENS \ CTC_End_source_code_location, \ CTC_Start_source_code_location, \ CTC_Region_type #define CTC_REGION_TOKEN_MAP_ENTRIES \ { "escl", CTC_End_source_code_location }, \ { "sscl", CTC_Start_source_code_location }, \ { "regionType", CTC_Region_type } /** * @brief This struct stores all information on OPARI2 regions */ typedef struct { OPARI2_REGION_INFO } OPARI2_Region_info; #endif /* OPARI2_REGION_INFO_H */ opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/opari2_ctc_parser.h0000644000000000000000000000013215232670204021415 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426078.135262116 opari2-2.0.10/src/opari-lib-dummy/opari2_ctc_parser.h0000664000175100001440000001032415232670204021747 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef OPARI2_CTC_PARSER_H #define OPARI2_CTC_PARSER_H /** * @file opari2_ctc_parser.h * @date Started Tue Mar 25 2014 * * @brief * */ #include #include #include "opari2_region_info.h" /** @brief CTCData */ typedef struct { /** pointer to source info */ char* mCTCStringToParse; /** memory string*/ char* mCTCStringMemory; /** error string*/ char* mCTCStringForErrorMsg; /** structured region information */ OPARI2_Region_info* mRegionInfo; } CTCData; /** @brief errors the user is responsible for, i.e. just errors in * the passed string */ typedef enum /* CTC_ERROR_Type */ { CTC_ERROR_Ended_unexpectedly, CTC_ERROR_No_region_type, CTC_ERROR_No_separator_after_length_field, CTC_ERROR_Num_sections_invalid, CTC_ERROR_SCL_broken, CTC_ERROR_SCL_line_number_error, CTC_ERROR_Unknown_token, CTC_ERROR_Unsigned_expected, CTC_ERROR_User_region_name_missing, CTC_ERROR_Wrong_clause_value, CTC_ERROR_Unknown_region_type, CTC_ERROR_No_key, CTC_ERROR_No_value, CTC_ERROR_Zero_length_key, CTC_ERROR_Zero_length_value, CTC_ERROR_Unknown_schedule_type, CTC_ERROR_Unknown_default_sharing_type, CTC_ERROR_SCL_error, CTC_ERROR_Inconsistent_line_numbers } CTC_ERROR_Type; /** @brief print error information*/ void OPARI2_CTC_error( CTCData* obj, CTC_ERROR_Type errorType, const char* info1 ); void OPARI2_CTC_initCTCData( CTCData* obj, const char string[] ); void OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues( CTCData * obj, bool ( * checkToken )( int, char*, CTCData* ) ); void OPARI2_CTC_assignUnsigned( CTCData* obj, unsigned* anUnsigned, const char* value ); void OPARI2_CTC_assignString( char** aString, const char* value ); void OPARI2_CTC_assignHasClause( CTCData* obj, bool* hasClause, const char* value ); void OPARI2_CTC_checkConsistency( CTCData* obj ); void OPARI2_CTC_freeCTCData( CTCData* obj ); void OPARI2_CTC_freeAndReset( char** freeMe ); /* Map entry. Matches string to enum */ typedef struct { /** string representation*/ char* mString; /** matching region type*/ int mEnum; } OPARI2_CTCMapType; /** @brief number of entries in regionTypesMap*/ #define OPARI2_CTC_MAP_SIZE( map ) sizeof( map ) / sizeof( OPARI2_CTCMapType ) /** @brief returns the enum associated with a string */ int OPARI2_CTC_string2Enum( const OPARI2_CTCMapType* map, const size_t n_elements, const char* string ); /** @brief returns the string associated with an enum */ const char* OPARI2_CTC_enum2String( const OPARI2_CTCMapType* map, const size_t n_elements, int e_in ); #endif /* OPARI2_CTC_PARSER_H */ opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/opari2_ctc_parser.c0000644000000000000000000000013215232670204021410 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426078.131262139 opari2-2.0.10/src/opari-lib-dummy/opari2_ctc_parser.c0000664000175100001440000003537715232670204021761 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** * @file opari2_ctc_parser.c * @date Started Tue Mar 25 2014 * * @brief * */ #include #include "opari2_ctc_parser.h" #include "opari2_ctc_token.h" #include "pomp2_region_info.h" #include "pomp2_user_region_info.h" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** @brief print error information*/ void OPARI2_CTC_error( CTCData* obj, CTC_ERROR_Type errorType, const char* info1 ) { bool abort = true; printf( "Error parsing ctc string:\n\"%s\"\n", obj->mCTCStringForErrorMsg ); switch ( errorType ) { case CTC_ERROR_Ended_unexpectedly: printf( "ctc string ended unexpectedly.\n" ); break; case CTC_ERROR_No_region_type: printf( "ctc string has no region type field or value is empty.\n" ); break; case CTC_ERROR_No_separator_after_length_field: printf( "The separator \"*\" is missing after the length field.\n" ); break; case CTC_ERROR_Num_sections_invalid: printf( "The value of numSections must be > 0.\n" ); break; case CTC_ERROR_SCL_broken: printf( "The required attributes sscl and/or escl contain invalid data " "or are missing.\n" ); break; case CTC_ERROR_SCL_line_number_error: printf( "sscl or escl field has invalid line number arguments (%s).\n", info1 ); break; case CTC_ERROR_Unknown_token: printf( "Token \"%s\" not known.\n", info1 ); abort = false; break; case CTC_ERROR_Unsigned_expected: printf( "A value >= 0 is expected, \"%s\" is not allowed.\n", info1 ); break; case CTC_ERROR_User_region_name_missing: printf( "The field or value \"userRegionName\" is missing.\n" ); break; case CTC_ERROR_Wrong_clause_value: printf( "Clause field value must be \"0\" or \"1\", " "\"%s\" is not allowed.\n", info1 ); break; case CTC_ERROR_Unknown_region_type: printf( "Region type \"%s\" not known.\n", info1 ); break; case CTC_ERROR_No_key: printf( "Could not detect key in \"%s\", \"=\" or \"*\" missing.\n", info1 ); break; case CTC_ERROR_No_value: printf( "Could not detect value in \"%s\", \"*\" missing.\n", info1 ); break; case CTC_ERROR_Zero_length_key: printf( "The character sequence \"*=\" is not allowed.\n" ); break; case CTC_ERROR_Zero_length_value: printf( "The character sequence \"=*\" is not allowed.\n" ); break; case CTC_ERROR_Unknown_schedule_type: printf( "Schedule type \"%s\" not known.\n", info1 ); break; case CTC_ERROR_Unknown_default_sharing_type: printf( "Argument of the default close \"%s\" of unknown type.\n", info1 ); break; case CTC_ERROR_Inconsistent_line_numbers: printf( "Warning: line numbers not valid. Expected startLineNo1 <= startLineNo2 <= endLineNo1 <= endLineNo2 \n" ); abort = false; case CTC_ERROR_SCL_error: printf( "Error parsing source code location, " "expecting \"filename:lineNo1:lineNo2\".\n" ); break; default: puts( "ctc internal error: unknown error type." ); } if ( abort ) { OPARI2_CTC_freeCTCData( obj ); puts( "Aborting" ); exit( 1 ); } } /*----------------------------------------------------------------------------*/ static void initRegionInfo( OPARI2_Region_info* regionInfo ); static void copyCTCStringToInternalMemory( CTCData* obj, const char* source ); void OPARI2_CTC_initCTCData( CTCData* obj, const char string[] ) { initRegionInfo( obj->mRegionInfo ); obj->mCTCStringToParse = 0; obj->mCTCStringMemory = 0; obj->mCTCStringForErrorMsg = 0; copyCTCStringToInternalMemory( obj, string ); } static void initRegionInfo( OPARI2_Region_info* regionInfo ) { regionInfo->mStartFileName = 0; regionInfo->mStartLine1 = 0; regionInfo->mStartLine2 = 0; regionInfo->mEndFileName = 0; regionInfo->mEndLine1 = 0; regionInfo->mEndLine2 = 0; } static void copyCTCStringToInternalMemory( CTCData* obj, const char* source ) { assert( obj->mCTCStringToParse == 0 ); assert( obj->mCTCStringMemory == 0 ); assert( obj->mCTCStringForErrorMsg == 0 ); const size_t nBytes = strlen( source ) * sizeof( char ) + 1; obj->mCTCStringMemory = malloc( nBytes ); obj->mCTCStringForErrorMsg = malloc( nBytes ); strcpy( obj->mCTCStringMemory, source ); strcpy( obj->mCTCStringForErrorMsg, source ); obj->mCTCStringToParse = obj->mCTCStringMemory; } void OPARI2_CTC_freeCTCData( CTCData* obj ) { OPARI2_CTC_freeAndReset( &( obj->mCTCStringMemory ) ); OPARI2_CTC_freeAndReset( &( obj->mCTCStringForErrorMsg ) ); obj->mCTCStringToParse = 0; } void OPARI2_CTC_freeAndReset( char** freeMe ) { if ( *freeMe ) { free( *freeMe ); *freeMe = 0; } } static CTCToken getCTCTokenFromString( char* token ); static void assignSourceCodeLocation( CTCData* obj, char** fileName, unsigned* line1, unsigned* line2, char* value ); static void ignoreLengthField( CTCData* obj ); /** @brief map with CTC tokens*/ static const OPARI2_CTCMapType ctcTokenMap[] = { CTC_REGION_TOKEN_MAP_ENTRIES, CTC_OPENMP_TOKEN_MAP_ENTRIES, CTC_USER_REGION_TOKEN_MAP_ENTRIES }; static bool getKeyValuePair( CTCData* obj, char** key, char** value ); void OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues( CTCData* obj, bool ( * checkToken )( int, char*, CTCData* ) ) { char* key; char* value; CTCToken token; ignoreLengthField( obj ); while ( getKeyValuePair( obj, &key, &value ) ) { token = ( CTCToken )OPARI2_CTC_string2Enum( ctcTokenMap, OPARI2_CTC_MAP_SIZE( ctcTokenMap ), key ); switch ( token ) { case CTC_Start_source_code_location: assignSourceCodeLocation( obj, &obj->mRegionInfo->mStartFileName, &obj->mRegionInfo->mStartLine1, &obj->mRegionInfo->mStartLine2, value ); break; case CTC_End_source_code_location: assignSourceCodeLocation( obj, &obj->mRegionInfo->mEndFileName, &obj->mRegionInfo->mEndLine1, &obj->mRegionInfo->mEndLine2, value ); break; default: if ( !checkToken( token, value, obj ) ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_token, key ); } } } } static void ignoreLengthField( CTCData* obj ) { /* We expect ctcString to look like "42*key=value*...**" * The length field is redundant and we don't use it in our parsing * implementation. */ while ( obj->mCTCStringToParse && isdigit( *obj->mCTCStringToParse ) ) { ++( obj->mCTCStringToParse ); } if ( !obj->mCTCStringToParse ) { OPARI2_CTC_error( obj, CTC_ERROR_Ended_unexpectedly, 0 ); } if ( *obj->mCTCStringToParse != '*' ) { OPARI2_CTC_error( obj, CTC_ERROR_No_separator_after_length_field, 0 ); } ++( obj->mCTCStringToParse ); if ( !obj->mCTCStringToParse ) { OPARI2_CTC_error( obj, CTC_ERROR_Ended_unexpectedly, 0 ); } } static bool extractNextToken( char** string, const char tokenDelimiter ); static bool getKeyValuePair( CTCData* obj, char** key, char** value ) { /* We expect ctcString to look like "key=value*...**" or "*". */ if ( *( obj->mCTCStringToParse ) == '*' ) { return false; /* end of ctc string */ } if ( *( obj->mCTCStringToParse ) == '\0' ) { return false; /* also end of ctc string. we don't force the second "*" */ } *key = obj->mCTCStringToParse; if ( !extractNextToken( &obj->mCTCStringToParse, '=' ) ) { OPARI2_CTC_error( obj, CTC_ERROR_No_key, *key ); } if ( strlen( *key ) == 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Zero_length_key, 0 ); } *value = obj->mCTCStringToParse; if ( !extractNextToken( &obj->mCTCStringToParse, '*' ) ) { OPARI2_CTC_error( obj, CTC_ERROR_No_value, *value ); } if ( strlen( *value ) == 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Zero_length_value, 0 ); } /*@ in the hasSchedule clause was a '*' originally and needs to be replaced back*/ if ( strcmp( *key, "hasSchedule" ) == 0 ) { while ( strchr( *value, '@' ) ) { ( strchr( *value, '@' ) )[ 0 ] = '*'; } } return true; } static bool extractNextToken( char** string, const char tokenDelimiter ) { *string = strchr( *string, tokenDelimiter ); if ( !( *string && **string == tokenDelimiter ) ) { return false; } **string = '\0'; /* extraction */ ++( *string ); return true; } static void assignSourceCodeLocation( CTCData* obj, char** filename, unsigned* line1, unsigned* line2, char* value ) { /* We assume that value looks like "foo.c:42:43" */ char* token = value; int line1Tmp = -1; int line2Tmp = -1; bool continueExtraction; assert( *filename == 0 ); if ( ( continueExtraction = extractNextToken( &value, ':' ) ) ) { *filename = malloc( strlen( token ) * sizeof( char ) + 1 ); strcpy( *filename, token ); } token = value; if ( continueExtraction && ( continueExtraction = extractNextToken( &value, ':' ) ) ) { line1Tmp = atoi( token ); } token = value; if ( continueExtraction && extractNextToken( &value, '\0' ) ) { line2Tmp = atoi( token ); } if ( *filename != 0 && line1Tmp > -1 && line2Tmp > -1 ) { *line1 = line1Tmp; *line2 = line2Tmp; if ( *line1 > *line2 ) { OPARI2_CTC_error( obj, CTC_ERROR_SCL_line_number_error, "line1 > line2" ); } } else { OPARI2_CTC_error( obj, CTC_ERROR_SCL_error, 0 ); } } void OPARI2_CTC_assignHasClause( CTCData* obj, bool* hasClause, const char* value ) { if ( !isdigit( *value ) ) { OPARI2_CTC_error( obj, CTC_ERROR_Wrong_clause_value, value ); } int tmp = atoi( value ); if ( tmp != 0 && tmp != 1 ) { OPARI2_CTC_error( obj, CTC_ERROR_Wrong_clause_value, value ); } *hasClause = tmp; } void OPARI2_CTC_assignUnsigned( CTCData* obj, unsigned* anUnsigned, const char* value ) { int tmp = atoi( value ); if ( tmp < 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Unsigned_expected, value ); } *anUnsigned = tmp; } void OPARI2_CTC_assignString( char** aString, const char* value ) { *aString = malloc( strlen( value ) * sizeof( char ) + 1 ); strcpy( *aString, value ); } void OPARI2_CTC_checkConsistency( CTCData* obj ) { bool requiredAttributesFound; requiredAttributesFound = ( obj->mRegionInfo->mStartFileName && obj->mRegionInfo->mEndFileName ); if ( !requiredAttributesFound ) { OPARI2_CTC_error( obj, CTC_ERROR_SCL_broken, 0 ); return; } if ( obj->mRegionInfo->mStartLine1 > obj->mRegionInfo->mStartLine2 ) { OPARI2_CTC_error( obj, CTC_ERROR_Inconsistent_line_numbers, 0 ); return; } if ( obj->mRegionInfo->mEndLine1 > obj->mRegionInfo->mEndLine2 ) { OPARI2_CTC_error( obj, CTC_ERROR_Inconsistent_line_numbers, 0 ); return; } } /*----------------------------------------------------------------------------*/ int OPARI2_CTC_string2Enum( const OPARI2_CTCMapType* map, const size_t n_elements, const char* string ) { int i; for ( i = 0; i < n_elements; ++i ) { if ( strcmp( map[ i ].mString, string ) == 0 ) { return map[ i ].mEnum; } } return 0; } /** @brief returns the string associated with an enum */ const char* OPARI2_CTC_enum2String( const OPARI2_CTCMapType* map, const size_t n_elements, int e_in ) { int i; for ( i = 0; i < n_elements; ++i ) { if ( e_in == map[ i ].mEnum ) { return map[ i ].mString; } } return "no valid region type"; } opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/opari2_ctc_token.h0000644000000000000000000000013215232670204021241 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426078.131262139 opari2-2.0.10/src/opari-lib-dummy/opari2_ctc_token.h0000664000175100001440000000243215232670204021574 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef OPARI2_CTC_TOKEN_H #define OPARI2_CTC_TOKEN_H #include "pomp2_region_info.h" #include "pomp2_user_region_info.h" /** CTC Tokens */ typedef enum { CTC_No_token = 0, CTC_REGION_TOKENS, CTC_OMP_TOKENS, CTC_USER_REGION_TOKENS } CTCToken; #endif /* OPARI2_CTC_TOKEN_H */ opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/pomp2_lib.c0000644000000000000000000000013215232670204017672 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426078.131262139 opari2-2.0.10/src/opari-lib-dummy/pomp2_lib.c0000664000175100001440000006704515232670204020240 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2014, 2016, 2023, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file pomp2_lib.c * * @brief Dummy implementation of all POMP2 Functions. These functions * only print out messages and do not measure anything.*/ #include #include #include /* *INDENT-OFF* */ #include "pomp2_region_info.h" #include "pomp2_user_region_info.h" #include #include #include #include #include /** @name Functions generated by the instrumenter */ /*@{*/ /** * Returns the number of instrumented regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. Here we return the sum of * all numRegions. */ extern size_t POMP2_Get_num_regions(void); /** * Init all OPARI2-created regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. The instrumentor then * defines this functions by calling all grepped functions. */ extern void POMP2_Init_regions(void); /** * Returns the OPARI2 version. */ extern const char* POMP2_Get_opari2_version(void); /*@}*/ /** @brief All relevant information for a region is stored here */ typedef struct { /** region type of construct */ char* rtype; /** critical or user region name */ char* name; /** sections only: number of sections */ int num_sections; /** start file name*/ char* start_file_name; /** line number 1*/ int start_line_1; /** line number 2*/ int start_line_2; /** end file name*/ char* end_file_name; /** line number 1*/ int end_line_1; /** line number 2*/ int end_line_2; /** region id*/ size_t id; } my_pomp2_region; /** Id of the currently executing task*/ POMP2_Task_handle pomp2_current_task = 0; #pragma omp threadprivate(pomp2_current_task) /** Counter of tasks used to determine task ids for newly created ta*/ POMP2_Task_handle pomp2_task_counter = 1; #pragma omp threadprivate(pomp2_task_counter) POMP2_Task_handle POMP2_Get_new_task_handle(void) { return ( ( POMP2_Task_handle )omp_get_thread_num() << 32 ) + pomp2_task_counter++; } static void free_my_pomp2_region_member( char** member ) { if ( *member ) { free( *member ); *member = 0; } } static void free_my_pomp2_region_members( my_pomp2_region* region ) { if ( region ) { free_my_pomp2_region_member( ®ion->rtype ); free_my_pomp2_region_member( ®ion->name ); free_my_pomp2_region_member( ®ion->start_file_name ); free_my_pomp2_region_member( ®ion->end_file_name ); } } static void assignString( char** destination, const char* source ) { assert( source ); *destination = malloc( strlen( source ) * sizeof( char ) + 1 ); strcpy( *destination, source ); } static void initDummyRegionFromPOMP2RegionInfo( my_pomp2_region* pomp2_region, const POMP2_Region_info* pomp2RegionInfo ) { assignString( &( pomp2_region->rtype ), pomp2RegionType2String( pomp2RegionInfo->mRegionType ) ); assignString( &pomp2_region->start_file_name, pomp2RegionInfo->mStartFileName ); pomp2_region->start_line_1 = pomp2RegionInfo->mStartLine1; pomp2_region->start_line_2 = pomp2RegionInfo->mStartLine2; assignString( &pomp2_region->end_file_name, pomp2RegionInfo->mEndFileName ); pomp2_region->end_line_1 = pomp2RegionInfo->mEndLine1; pomp2_region->end_line_2 = pomp2RegionInfo->mEndLine2; if ( pomp2RegionInfo->mRegionType == POMP2_Critical && pomp2RegionInfo->mCriticalName ) { assignString( &pomp2_region->name, pomp2RegionInfo->mCriticalName ); } pomp2_region->num_sections = pomp2RegionInfo->mNumSections; } static void initDummyRegionFromPOMP2UserRegionInfo( my_pomp2_region* pomp2_region, const POMP2_USER_Region_info* pomp2RegionInfo ) { assignString( &( pomp2_region->rtype ), pomp2UserRegionType2String( (POMP2_USER_Region_type)pomp2RegionInfo->mRegionType ) ); assignString( &pomp2_region->start_file_name, pomp2RegionInfo->mStartFileName ); pomp2_region->start_line_1 = pomp2RegionInfo->mStartLine1; pomp2_region->start_line_2 = pomp2RegionInfo->mStartLine2; assignString( &pomp2_region->end_file_name, pomp2RegionInfo->mEndFileName ); pomp2_region->end_line_1 = pomp2RegionInfo->mEndLine1; pomp2_region->end_line_2 = pomp2RegionInfo->mEndLine2; if ( pomp2RegionInfo->mRegionType == POMP2_USER_Region ) { assignString( &pomp2_region->name, pomp2RegionInfo->mUserRegionName ); } } /* * Global variables */ int pomp2_tracing = 0; my_pomp2_region* my_pomp2_regions; /* * C pomp2 function library */ void POMP2_Finalize(void) { static int pomp2_finalize_called = 0; size_t i; const size_t nRegions = POMP2_Get_num_regions(); if ( my_pomp2_regions ) { for ( i = 0; i < nRegions; ++i ) { free_my_pomp2_region_members( &my_pomp2_regions[ i ] ); } free( my_pomp2_regions ); my_pomp2_regions = 0; } if ( !pomp2_finalize_called ) { pomp2_finalize_called = 1; fprintf( stderr, " 0: finalize\n" ); } } void POMP2_Init(void) { static int pomp2_init_called = 0; if ( !pomp2_init_called ) { pomp2_init_called = 1; atexit( POMP2_Finalize ); fprintf( stderr, " 0: init\n" ); int n_pomp2_regions = POMP2_Get_num_regions() + POMP2_USER_Get_num_regions(); int n_pomp2_user_regions = POMP2_USER_Get_num_regions(); my_pomp2_regions = calloc( n_pomp2_regions + n_pomp2_user_regions, sizeof( my_pomp2_region ) ); if ( n_pomp2_regions > 0 ) { POMP2_Init_regions(); } if ( n_pomp2_regions > 0 ) { POMP2_USER_Init_regions(); } pomp2_tracing = 1; } } void POMP2_Off(void) { pomp2_tracing = 0; } void POMP2_On(void) { pomp2_tracing = 1; } void POMP2_Begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin region %s\n", omp_get_thread_num(), region->name ); } } void POMP2_End( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: end region %s\n", omp_get_thread_num(), region->name ); } } void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { static size_t count = 0; assert( count < POMP2_Get_num_regions() ); POMP2_Region_info pomp2RegionInfo; ctcString2RegionInfo( ctc_string, &pomp2RegionInfo ); initDummyRegionFromPOMP2RegionInfo( &my_pomp2_regions[ count ], &pomp2RegionInfo ); my_pomp2_regions[ count ].id = count; *pomp2_handle = &my_pomp2_regions[ count ]; freePOMP2RegionInfoMembers( &pomp2RegionInfo ); ++count; } void POMP2_USER_Assign_handle( POMP2_USER_Region_handle* pomp2_handle, const char ctc_string[] ) { static size_t count = 0; assert( count < POMP2_USER_Get_num_regions() ); POMP2_USER_Region_info pomp2RegionInfo; ctcString2UserRegionInfo( ctc_string, &pomp2RegionInfo ); initDummyRegionFromPOMP2UserRegionInfo( &my_pomp2_regions[ count ], &pomp2RegionInfo ); my_pomp2_regions[ count ].id = count; *pomp2_handle = &my_pomp2_regions[ count ]; freePOMP2UserRegionInfoMembers( &pomp2RegionInfo ); ++count; } void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter atomic\n", omp_get_thread_num() ); } } void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit atomic\n", omp_get_thread_num() ); } } void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ) { POMP2_Barrier_enter( pomp2_handle, pomp2_old_task, "" ); } extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; POMP2_Barrier_exit( pomp2_handle, pomp2_old_task ); } void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ) { *pomp2_old_task = pomp2_current_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { if ( region->rtype[ 0 ] == 'b' ) { fprintf( stderr, "%3d: enter barrier\n", omp_get_thread_num() ); } else { fprintf( stderr, "%3d: enter implicit barrier of %s\n", omp_get_thread_num(), region->rtype ); } } } void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { if ( region->rtype[ 0 ] == 'b' ) { fprintf( stderr, "%3d: exit barrier\n", omp_get_thread_num() ); } else { fprintf( stderr, "%3d: exit implicit barrier of %s\n", omp_get_thread_num(), region->rtype ); } } } void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter flush\n", omp_get_thread_num() ); } } void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit flush\n", omp_get_thread_num() ); } } void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ) { if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin critical %s\n", omp_get_thread_num(), region->rtype ); } } void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ) { if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: end critical %s\n", omp_get_thread_num(), region->name ); } } void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter critical %s\n", omp_get_thread_num(), region->name ); } } void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit critical %s\n", omp_get_thread_num(), region->name ); } } void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter for\n", omp_get_thread_num() ); } } void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit for\n", omp_get_thread_num() ); } } void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin master\n", omp_get_thread_num() ); } } void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end master\n", omp_get_thread_num() ); } } void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle) { pomp2_current_task = POMP2_Get_new_task_handle(); #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin parallel\n", omp_get_thread_num() ); } } void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end parallel\n", omp_get_thread_num() ); } } void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ) { *pomp2_old_task = pomp2_current_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: fork parallel\n", omp_get_thread_num() ); } } void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: join parallel\n", omp_get_thread_num() ); } } void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin section\n", omp_get_thread_num() ); } } void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end section\n", omp_get_thread_num() ); } } void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { my_pomp2_region* region = *pomp2_handle; fprintf( stderr, "%3d: enter sections (%d)\n", omp_get_thread_num(), region->num_sections ); } } void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit sections\n", omp_get_thread_num() ); } } void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin single\n", omp_get_thread_num() ); } } void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end single\n", omp_get_thread_num() ); } } void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter single\n", omp_get_thread_num() ); } } void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit single\n", omp_get_thread_num() ); } } void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter workshare\n", omp_get_thread_num() ); } } void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit workshare\n", omp_get_thread_num() ); } } void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin ordered\n", omp_get_thread_num() ); } } void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end ordered\n", omp_get_thread_num() ); } } void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter ordered\n", omp_get_thread_num() ); } } void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit ordered\n", omp_get_thread_num() ); } } void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[]) { *pomp2_old_task = pomp2_current_task; *pomp2_new_task = POMP2_Get_new_task_handle(); if ( pomp2_tracing ) { fprintf( stderr, "%3d: task create begin\n", omp_get_thread_num() ); } } void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: task create end\n", omp_get_thread_num() ); } } void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ) { pomp2_current_task = pomp2_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: task begin\n", omp_get_thread_num() ); } } void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: task end\n", omp_get_thread_num()); } } void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ) { *pomp2_new_task = POMP2_Get_new_task_handle(); *pomp2_old_task = pomp2_current_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: create untied task\n", omp_get_thread_num() ); fprintf( stderr, "%3d: suspend task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: created untied task\n", omp_get_thread_num() ); fprintf( stderr, "%3d: resume task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_parent_task ) { pomp2_current_task = POMP2_Get_new_task_handle(); if ( pomp2_tracing ) { fprintf( stderr, "%3d: start untied task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: end untied task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ) { *pomp2_old_task = pomp2_current_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin taskwait\n", omp_get_thread_num() ); fprintf( stderr, "%3d: suspend task: %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: end taskwait\n", omp_get_thread_num() ); fprintf( stderr, "%3d: resume task: %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } /* *---------------------------------------------------------------- * C Wrapper for OpenMP API ******---------------------------------------------------------------- */ void POMP2_Init_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: init lock\n", omp_get_thread_num() ); } omp_init_lock( s ); } void POMP2_Destroy_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: destroy lock\n", omp_get_thread_num() ); } omp_destroy_lock( s ); } void POMP2_Set_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: set lock\n", omp_get_thread_num() ); } omp_set_lock( s ); } void POMP2_Unset_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: unset lock\n", omp_get_thread_num() ); } omp_unset_lock( s ); } int POMP2_Test_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: test lock\n", omp_get_thread_num() ); } return omp_test_lock( s ); } void POMP2_Init_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: init nestlock\n", omp_get_thread_num() ); } omp_init_nest_lock( s ); } void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: destroy nestlock\n", omp_get_thread_num() ); } omp_destroy_nest_lock( s ); } void POMP2_Set_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: set nestlock\n", omp_get_thread_num() ); } omp_set_nest_lock( s ); } void POMP2_Unset_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: unset nestlock\n", omp_get_thread_num() ); } omp_unset_nest_lock( s ); } int POMP2_Test_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: test nestlock\n", omp_get_thread_num() ); } return omp_test_nest_lock( s ); } opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/Makefile.inc.am0000644000000000000000000000013215232670204020447 xustar0030 mtime=1785426052.195415618 30 atime=1785426052.255415263 30 ctime=1785426078.079262448 opari2-2.0.10/src/opari-lib-dummy/Makefile.inc.am0000664000175100001440000000624515232670204021010 0ustar00builderusers# -*- mode: makefile -*- # This file is part of the Score-P software (http://www.score-p.org) # Copyright (c) 2009-2013, # RWTH Aachen University, Germany # Copyright (c) 2009-2013, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # Copyright (c) 2009-2013, 2020, # Technische Universitaet Dresden, Germany # Copyright (c) 2009-2013, # University of Oregon, Eugene, USA # Copyright (c) 2009-2013, # Forschungszentrum Juelich GmbH, Germany # Copyright (c) 2009-2013, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # Copyright (c) 2009-2013, # Technische Universitaet Muenchen, Germany # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. if HAVE_OPENMP_SUPPORT examplelibdir = $(docdir)/example/lib examplelib_LTLIBRARIES = libpomp.la libpomp_la_SOURCES = \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_lib.c \ $(PUBLIC_INC_SRC)pomp2_lib.h \ $(PUBLIC_INC_SRC)pomp2_user_lib.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_token.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.c \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.h # Currently, the fortran wrappers get a int* parameter whereas the new # POMP_Region_handle is of type void*. Ask a fortran guru if this may cause # problems. # CFLAGS are sufficient here, CPPFLAGS would cause duplication libpomp_la_CFLAGS = $(AM_CFLAGS) $(OPENMP_CFLAGS) libpomp_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(PUBLIC_INC_DIR) libpomp_la_LDFLAGS = -static -avoid-version if SCOREP_HAVE_F77 libpomp_la_SOURCES += \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_fwrapper.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_fwrapper_base.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_fwrapper_base.h BUILT_SOURCES += pomp2_fwrapper_def.h CLEANFILES += pomp2_fwrapper_def.h pomp2_fwrapper_def.h: Makefile getfname$(EXEEXT) $(AM_V_GEN)./getfname$(EXEEXT) noinst_PROGRAMS += getfname getfname_SOURCES = \ $(SRC_ROOT)src/opari-lib-dummy/foos.c \ $(SRC_ROOT)src/opari-lib-dummy/getfname.f endif EXTRA_DIST += $(SRC_ROOT)src/opari-lib-dummy/pomp2_parse_init_regions.awk.in endif pkgdatadeveldir = $(pkgdatadir)/devel pkgdatadevel_DATA = \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_token.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.c opari2-2.0.10/src/opari-lib-dummy/PaxHeaders/pomp2_parse_init_regions.awk.in0000644000000000000000000000013215232670204023754 xustar0030 mtime=1785426052.199415595 30 atime=1785426052.255415263 30 ctime=1785426077.783264199 opari2-2.0.10/src/opari-lib-dummy/pomp2_parse_init_regions.awk.in0000664000175100001440000001157015232670204024312 0ustar00builderusers#!@OPARI2_AWK@ -f ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen University, Germany ## ## Copyright (c) 2009-2011, ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Dresden, Germany ## ## Copyright (c) 2009-2011, ## University of Oregon, Eugene, USA ## ## Copyright (c) 2009-2011, 2013, 2014, 2016-2017, 2020, ## Forschungszentrum Juelich GmbH, Germany ## ## Copyright (c) 2009-2011, ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Muenchen, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## # # pomp2_parse_init_regions.awk # # Expects the output of # $(NM) $ALL_OBJS_AND_LIBS as input. See # for a working example. # # The output is C-code that needs to be linked to your application. It # provides several functions: # # void POMP2_Init_regions(): need to be called from your POMP2 library to # initialize all instrumented POMP2 region by calling the instrumented # functions POMP2_Init_reg_*. # # size_t POMP2_Get_num_regions() returns the number of POMP2 regions found # in $ALL_OBJS_AND_LIBS. # # const char* POMP2_Get_opari2_version() returns a version string. # # Three functions returning int and specifying the library interface version: # int POMP2_Get_required_pomp2_library_version_(current|revision|age)() # # Author: Christian Roessel # function add_region( type_str, regions_arr, n_regions_int ) { for (i = 1; i <= NF; i++) { if (index($i,type_str) != 0) { separator = type_str; } else if (index($i,tolower(type_str)) != 0) { separator = tolower(type_str); } else if (index($i,toupper(type_str)) != 0) { separator = toupper(type_str); } else { continue; } # $i looks like "POMP2_Init_reg_uniqueId_n_regions" or # like "pomp2_init_reg_uniqueId_n_regions" or # like "POMP2_INIT_REG_uniqueId_n_regions" split ($i,splitResult,separator); _uniqueId_n_regions = splitResult[2]; if (!(_uniqueId_n_regions in regions_arr)) { regions_arr[_uniqueId_n_regions] = $i; split(_uniqueId_n_regions, tokens, "_"); n_regions_int += tokens[3]; } } return n_regions_int; } # The pomp OpenMP region symbols contain 'pomp2_init_reg' (case insensitive), are of # (nm) type [TDA], and are not Intel -ipo or -O3 symbols (.ITC.). / [_]*[Pp][Oo][Mm][Pp]2_[Ii][Nn][Ii][Tt]_[Rr][Ee][Gg]_[0-9a-zA-Z][0-9a-zA-Z]*_[1-9][0-9]*/ { if (tolower($0) ~ /pomp2_init_reg/ && $0 ~ / [TDA] / && $0 !~ /\.ITC\./) { n_pomp_regions = add_region("POMP2_Init_reg", pomp_regions, n_pomp_regions) } } # The pomp user region symbols contain 'pomp2_user_init_reg' (case insensitive), are of # (nm) type [TDA], and are not Intel -ipo or -O3 symbols (.ITC.). / [_]*[Pp][Oo][Mm][Pp]2_[Uu][Ss][Ee][Rr]_[Ii][Nn][Ii][Tt]_[Rr][Ee][Gg]_[0-9a-zA-Z][0-9a-zA-Z]*_[1-9][0-9]*/ { if (tolower($0) ~ /pomp2_user_init_reg/ && $0 ~ / [TDA] / && $0 !~ /\.ITC\./) { n_pomp_user_regions = add_region("POMP2_USER_Init_reg", pomp_user_regions, n_pomp_user_regions) } } END{ print tmp "\n" print "#ifdef __cplusplus" print "extern \"C\"" print "{" print "#endif" print "#include \n" # Make a regions array with all regions counter = 0 for (i in pomp_regions) { regions[counter++]=pomp_regions[i]; } for (i in pomp_user_regions) { regions[counter++]=pomp_user_regions[i]; } # cut away leading full-stops for (i in regions) { sub(/^\./, "", regions[i]); } # declare XXXXX_Init_reg_* functions extern. # loop reproducibly as make check (test/awk_script_test.sh) might # fail as it expects an order. For normal operation, order doesn't # matter. for (i = 0 ; i < counter; i++) { print "extern void " regions[i] "();"; } print_init_functions("POMP2", pomp_regions, n_pomp_regions); print_init_functions("POMP2_USER", pomp_user_regions, n_pomp_user_regions); print "#ifdef __cplusplus" print "}" print "#endif" } function print_init_functions(type_str, regions_arr, n_reg_int) { # define XXXXX_Init_regions() and call all XXXXX_Init_reg_* functions print "\nvoid " type_str "_Init_regions()" print "{" if ( n_reg_int != 0) { for (i in regions_arr) { print " " regions_arr[i] "();"; } } print "}\n" # define function XXXXX_Get_num_regions() print "size_t " type_str "_Get_num_regions()" print "{" if (n_reg_int != 0) { print " return " n_reg_int ";" } else { print " return 0;" } print "}\n" } opari2-2.0.10/PaxHeaders/doc0000644000000000000000000000013215232670242012537 xustar0030 mtime=1785426082.635235486 30 atime=1785426082.655235368 30 ctime=1785426082.635235486 opari2-2.0.10/doc/0000775000175100001440000000000015232670242013146 5ustar00builderusersopari2-2.0.10/doc/PaxHeaders/html.tar.gz0000644000000000000000000000013215232670242014707 xustar0030 mtime=1785426082.635235486 30 atime=1785426082.599235699 30 ctime=1785426082.635235486 opari2-2.0.10/doc/html.tar.gz0000664000175100001440000103447115232670242015253 0ustar00builderusers‹ì}@UÙÖÿ0EºQQàv ¡„‚4y“îNQJIQAE ±@DB¤¤D)‘PJBþû€ÎèŒÎ8¾™ùÞ÷ÿîyoäÞsÏÞ{íµWüÖÚëœcåfo'ûg88p8 ô�à æ¿#Ðèù¿ŸƒD!±88……Á48%‚ù‡éš?Ü]݈.""0’»µ…êò×Q]\ÿ ‚þÝà ZK¢“•¹Õ’ê@‘vr°ü›Ç€‹Egý1h88÷õú£1($Lþ7ÓñÍãÿøúÖ٥Ʋœo9øÈ¢¾CEc¸>×33‚S…+�?Œ¤�j*°9èg /ƒÁD`ê*Û ¼Z<÷¬y6Å4<ôVoé¶2 N±Ci‡Îm[*z00<üÜŽ2LxÈ:\Åþì§æbM«Ön¿vP|{”¼¤ xxøž«"µço…´È+ò}®³„ò|é«ê÷‹· |ß$�J:åiù„PJŒD°+1‹³‹ùªÝ¾8ÿåÈ„A<úètTágÜš>´¡Ýæá©œãÊÖ%Œ, ££Á¥àZ#qñ¥â:kª!ÚŠ}´gæUO_|âÇw+œNB+)8ÌAýtñúõŒfffÐÅÌ,,å*²Å¸ü|ñK°¶Þeò’å:û$XÕW�¡­CÒPB½5LmÒžl…¨‰å?ž¸zžšÛÛüî”î£îXÛë×KRtö â---7›™ðݰ_0<<˜ššš© 5Rh>§ÁÎͽ{0/ZpKÇýصzIû�Œ¸Ökž |xB&èaV+µ·r×yeɽܿ~¢ây.]+ðìoß¾…Á”••­]rýúõá®æm%A,S3I[<á^ÃmÛ£Ã!ª¢tS·—TT0œzjD fùvÆo^KKO×ðÿè§ L$YúL·6^ãè=¢á²ïvu¶ÖilŠck‘K]÷>]ÝUфڶ×Ç!.¨ ”ÍUVV*¯[ýà1aZ9ÁuàmUw‘Åcè•iÿM x¢¢¢:úú¥‡V­…SÎjÍÏ¡ŠúËú#³­‹aSãƒ��À$ÅT–~œ�.?1>=Ú$$ïÖànYÙV&� ×ððòß¿y ƒikk�ö?c+))Á»¾Y933s•ö˜ÆuÈÉùkóªÉÁÁtè3 hëÎ�+`GNœ (´hÑ"öÃ*ÌÌÌ[‹f�æÏNO�»ªâœÜÝCnÜ@LâÎ_¼ÈÓÐÐpê«ßØÓßñpbb¢²È:ýÑDsŽmS¾û& Ëí��P÷=}}£ï YÏÏÏo*òßbtÅd™°°0øsÆ·„M±ÖrHõ]Zšš5µNËjg\¼ÈxV¬·¾¦[·nÝ¡ìã �qqœ³c»aw7$ûœœôÒ<�e©>#Ÿ1ö¬ÈØ‘„ɧS ÀÞ=xðÀk´g•Ÿ¿y©»»{¹º˜gmmËO6`yyp‰^{ll$ÑLùÐãÇ�m•Ëê ÄÚ7oÕÕÕ•K:pà€ IÖ­GÈ—Æ£¡Æ,ã“(KÖú††v0Kyßñ­êê—uOXלÝÙT$ÉdšXZR[»Úw|`[« Ÿ»Ùy"åh¢ä¦M; ²_*iK¬9——·gæLe§¡ñö¹ö±ÉÉ2æ@øvž�.)/_ ø ±åàÁƒTêR…ä`þŒŒ£ÓÓ%·ÇE)ܹòYmí½†ŒÝ±IIRˆD‡Å�’204$:8˜‰žéö.�vqu-ááP<¦°aƒšØƒ¥’}ÁoÞ¼9Œ‡ÎîÝaŽÖ®aaaáááÙª¦ÆtêÔ)ŒÇõ„3�¶´ï64,ìÑ52b„1³²rÍ™óïÞ½{ÉÒ¥)W¯²Ã®úO{<:�c[¾|yžs'#0z––a¹ö/:ÊsÀ`±;Ö}œVõðð¨(�àN¹|y …’�”¼WR²,OPFÆ&ÀÙà‚9ØÝ§©j#£½uÛÍ™€­?$wýÖ­J ¡±ÇŽ-mxøøH�™{�ëÉòÜK šn»n ?㊵k‚qss¶]É{pƒö™»ÏžqçÚ¸|yãÌìll\\ƒÄÃÅ0í3r%·ZV}œ{f‰ßÓ;¡À¶ášåîWÆz»ôut0yplæÄb±MÞ®I}q“>”45ñ„††Â�<$`lÁZ.9{.¹¡¦Fgtðw¡Ï˜°¼nîîjÕ·¾úe|||WsrT÷íã¶ø4 AÀூQ–¹÷†…­màƒ2°KŒŒŒüW†²ð· l4„|áý¥d2Ù®%ŸSZZúêÍ›*•тˋ}NP­¬9Â~òÔ©mææÂ&Ò»_:œGJŸXü†I�×*`t”54–oÞ¼y�O­ušâÜ Ç“'Oj·ûùÉ�¿m‰fa¿ÛíóÎÎ{L} “à)COSÇΔ[\s�¬ÖÓÛ» pìÑ£bWŽ1¼|¸§&E9ªaIz›S`�ÎY½ÖlHn \–ìÁÒW¯@ ð:sŽó˜—•©Ütlª¨¨€Iæ{†GG‡&% æ™Hó�:t÷ì¶ ²îÆû÷w455‰ÈÉ DpI݃¬ÁñãK„b68œ5*ÖÔ´g¥ ìÍŠ¼å+V¤œ?o`;[—@ÊÞ,#ÃÖ×ׇ1âÍdc ë}¸¨E=/9öúfC*äáwpL�|m°OÚ$/P5‚«°÷:ë…§:.’5j€q2„Á¤ŒOcí×íëãÐã?u³q˜ÊŽ~¢¥%Ó–-[ö†mKX–ï2oe•^3Š_šm*:ŸOm�ر+D)6SYjt­Ø<øfàkƒu¤¦Û(ÍF"tõùä¹ÀGV{Õ¶½Vi1îÞbôÔòRâaÃÚÊì}WN¢Z—ÉM5¨‚Þ`�“¼ã�KÆ{9÷wÅQר˜Õgq|lÚÓ6Ö¿žùÒG®…Ê”&·àÉñÀ½€0ýÂmA�ÅÉG ¦;ô�L‘H$Šàö$gÑ2ž;Ø]õSööÎäWõŒ,|ëÖ[£Ýý”Ž'JÊpŸ³¬æ”Øüºô¡- ë0レÕå˜z×­M‡ÂçŸ0˜¾¤ð³Åæ¼™ NËØ- ÈJ˜Ó”›œÆÎ‡T�UмûºÊ·f0;­9p"Œ"È»ø±,A>@ŽuùrNw �*ç1›s‘kÅ ž$-Ûyà8G`š€E×ÝþÎÀ³{uWñÚæ>°vvæ•6Ó Üªó4jMLeÉPqå¼$¤^õ{«Ô·ê¼+ž8¨'2¦ý¼\ùµÒ ­]ÕÉÅ1ï\R& ·ŠÜ+�Xv¿Z&Žh0Oø n¦E».0ê˜ñÛê1Â~»ÆîX]g¥ã�‡që•%Ö´ß ™F†‚ÖÂÝ(~Åù3L'Ûö—ª gÔ£>¿qß䆿.W׈U«b×]0~�|‹ÂþišcXƒ|{ì¢lm´;Z%ýðõèhï¤MX„ÊJBûÈ©½5e«VA‹lvtb·bⵄÊX£”½ë/UF·Üa ?‘)0ó¡»e}T4ú˜Î;®û‘ '¯&ÄŠ‰ $ê^W}¨8Z7:*÷2Œ#¿eë:Þg”Æ¡­ëY_Þðf}öW­·fÕmëÁ…­û‹Y„²ß\å%ˆ‡1+¾XU©ž‰Æ«Ý¥†uÅÑa¹¼ÞQ— ÏÅçiÐÙcº´¯ŠgWR~ݺ‘yiZž¼ˆ0³ñõ‘Í8yqx¯¾ªêëC3§ÅÜrtÕݳg¹  ËüÀÖàÚZ—´ŒM;5ù¹'®_.] †¹vÞ”±¹gqš[—Á¤§p—\œÇ;É‹ŒuUÏ!�¶« ’ŽXŽK»ÊÉo_Zœ¿èpÜ]ZëCi‡9÷‡ ÄÚ ¨ Ø{Ü[ñvÇCÕßÇß;~=õ8=y>Vº¹Õ‡L\»vá•ÜÈõeÄÔzr¾j|þ¹º¶vرcÇ2KEô¶.t“ (üÉ3ë}ŠŠŠr3{ªVÅV(}ú1 àù6o¸'Œw¿ªê¨‹ÊùkŸ”ý¶8;³;súÊꪪխ�ÕÕÕ•ç€ÏäèèɇY0ÐRØ£D‡µµõž<'Q`st.$ÖÖêõJÃ.ã4vAÓóFx¸”Mñ.pXÀ}V¼ÿà¶Võð¡so­øæ=Wa�QA+¸¤öslØÕvg¨((7 ¾.16~!Ù•Hpe422j*ôÅäv¾ÈäuéB8yÈîBb¦×¢<�A¾õÚg"�­KMKc¡JMCìÅ*†°�?ž„¸¤M˜¾–ó›d&Yè”Q4�îç039ãݸM»k²Œq~Óƒ·¼>Îx§Êˆ]ÞÒ× EL¢×Ç:DÄßX<‰n€ Iv¶ÌøÀóÅââ|8ë.i �ÌíÛ·ÏýãK`ÔáV5" EDB‚¹4”%èÂqpeàqý&Æw#=UóL§\¹©yèåK“´Ë—·™š ._>VPÑ9¢ ÉøÎa_"l(dÍó‰�®Ê>žw�mÐnhNÊ8÷n}ý0·¨Æª¢üí†CòÞï–´LKiji�<3ßOìoÌLÙ—t'],*b!྿ô[NùHlìˆnW©SÄ'‰„†Üƹ÷ÕŠí+íííË*+ÉC¯ {Z‹çÔÇø °’#ÈŠqî3�{ó„e»Mßö½aó±}è¡„=#ž÷c%S?¹ª ­÷îå@†Ñ××—y ƒŠšZé“'¬&åî·*c„• 9Ê�Ø´©à7"‰tp|ðÅÎãÇNœ`rw‹¹²z+ßc]vÕy¼påŠÙ “¸¸xÓ‹‹akÖ¬�ˆ{xD «ëš›š Œ£/^¤­UÕà[Ñ2ïÉ  ÕOj2ZqR“ϲ«ï¾D%ºÆÞÿSâ9‰8uߨêA8·èÙ€……±•a5š¹ðdrÙ§åeþ¬¦¦Ý¿ž2U_5OoÚŠ�zË\n¬TêƒëÑ�÷Wågi×ÿá)ƒ^ ÉOy”C¶ )> )*’� ˆõëôQÖÛ´‹åÊ6/Žß÷áüHoic£‘$µn"¥WÝÕ÷MwwêÍ›’TŽÞºúú`€Œ ªºKªÐÏ7Á¶ Un­ˆE $=㿘?VAŒ¼VµôÌ #“½~EzÎT¥�£ÇzÍ» ?o¤`íwæÌ`âÓ ª.)×{3î7ܶ`º zØX…+V|ª.IuÅ \>¾³/ôI?‹þcŸ-ûÈfjMdíÕŸ«•#­Àï-¹\TĦuic®%@ OoXj_®C_¹z~¹z-m�¾{x‡¡›™ãÉæFþ†Z[>qšÒ‚‚å2@72Í ùBBB„gŸÆ!@TdSI¥RKž>]%ËÜÛÛëäâ’®/·v{ä‘C•uuw<îX—þÌ%g}ܳ©©k×ïJ<5º?Ô9 ÏgLòèÑ£ëâoT+�(ÿŠÉm±~ö.#ÿb6ni“»çT#Öa›ÏŒ;s†UMM�B¥òâf¼TTTÐi/'¦wÛ6¼<1w÷ÀbÃñ÷UÙõõ—+Û@dúâ–#®çÆ«W¯vìØaõúÐ>VëÁ‰ëGþç*§ÆVó xɃ`ØZ®ñ¡ë„9» `Ô néú©çv/óÝ3š�2F‘*;S@ å¾‰\½‚k3­ªˆ­ÒÓÓ»j÷yþÒ%(x3Î3Û¼y¥âì(ÁEV>ròä!Ü­•’by/•±{/8&ß=”qn+‰ ï%?¼íÚÍÊÈ&´´à�bk‘¿ŽžÞÁ­"[æ711qúðŽ Ôy¿A¢”.àEzzzMm­ÍðLß�¬Ë—[ù6*[[o¼wïÞÝî÷‘‡—t'ïuÖ¥uÈü±!YЂ* Zlëè ¨îrqž&jì²…²* þS‡Z/¦€ùŒíÚîôú~lÌ®]ü‰`é%ÞÎø¼{ý`‡¦fÙeýK§.oó/bÎ⿞eí{4æiSå‰7÷î1pqqÁ=›‰ ¨~œóXôzë|@|i}ýÍñK�“êûNŸ^œ6éž�� +Áp׳Õ? ø›ˆÖ°°0rÕñ�Ã##%`2ŽŸˆ‹w6Vܰ� ¬FiÏÓÔk”PÂç_uªZLÍ-Gó‘éÑQ7ȵñ\Ö)Ì͸' +'-+ËWwQ«ô~ìڑ书¥K—v8yž˜C0Å˘¿:ç¸éäéÓŽËL }8[ý'Áª´½yØ¢sD8P|ýöíÛ=×HKA›œ£~lý6‰5÷€Â†ÂoÞDû½ŒãÙâ±9àãKàu¿ÿ*c¬#a§óuîïù¾QÕÝ�`j«[çåá�‘çwpp8 ôt5GyçÁ  öÞÞÃÀ¸�€[MmàÒß©÷b¢}Ö~öÝ;—¼¼¼¶·-w:ª ý>¬Nöç}÷î]ºi%ËóÆ9•ï;UUT,>¼ë»õ°ËÉÉÁ�²™ä»©ËåÎfä“K|[aNã{7ï½®rNà‹Ôg®/ˆèW­Ýnñöåí;w–B Ãeë-ÀJìÐÐX½ÿÊE{£:¤úôd­^ph(”–r‡—©øÐtâ7”ˆôŸݲ…ß|ÿ,Ê"Fñã $Bò`ñyy{_æ9OŽ=3ïçTÖÒV~?2²*y¿å“ÄÃà×G ˜€{®S–-_¾ü*õ!W¢â~!(á–ïÞŸ~\tÍr]�f{í;*Ävá¶ö)BKŽ-w}}=m@0kp¹õÈ‘#"WêÞ�0w³iþšÒ06î¹{ïwçËF�Qhoo‡I®.ÛÄ( \da44»ƒÊF#¸eB��ŠQSèë©¢ªÚ~Â<` 8w(‹�mVx¯þ²>äʇÚÀÒA �ãÈ÷b`1QÖ}ùÜljâò®h^ãî+&�F³QÃꉣûÂ;:Hx'ˆ�a@JÚ&Z÷WÐzÍ¢„¡Àk„‹ÅBYÆãõ�…Y¼RHާªªjÏ)Q3,^œBz¨ö+‹°ß­¬dšj ;}š?<""˜ª’ &e€©€.lwr‚MõmЫ!#ñÐ!æ• >>>N®®¥é†NC¯äSùüðÀ!@±²²2”N°‹QÇÙ%'''$:šõ¢vr4°¤y·o/‚�¿mÙô1 ??ŸÔ[{¡#C*§¼þ¨_Ïô‘¸¸°,Jºº«€qÃûM^�¼!**ÚærÛkzÜ>§?¯èÅ”|ó™¨M(ǶmÛÀpXbiÓ|‹ú4ÝÚÚÙîs>@ s*lÕéüÈsl-ʺ³]U5%/‚ÑM7­9@ü 'W¬8­´¹™O-Zàð1f…>!×7°4ÿÓ 75�3‹ ð³¶nÌ2÷^C'Àò̽7Ê¦Ç çùÖ¤éùsâý#¢'±ö|�¹€¸Á%¥äå…Þx­ƒ@¯¡kœœ�Kú2®‘ÊÃ÷u›“0' è0ëèŠÏÙ)÷×]]‡;OɺKfff©Uk6í¾ dßÎÞá3j¥y›¥Áûüùs8[ºŠ���µÍô¶éÑé›^2VS£cô¸mߨPkroO|çÎ�4k벞o>Ÿ—)ï?uürZÚ?Ú@ÓµÍpø‘$Åýg6JJ^?~|ÍHža†Ñ5QåЫà cà²% ñG�Þ¸‘‡¹”‰éàÏáK2’’¤cëµH—/_ŽDTÔ74<¯½°sïŽÌ+–-#‚yTQÅ‹ ETì!EW¬\I)//W+‰Ö54P»«“-޵”u³àåå?˜x•ˆ­] hSUS»�µo¾ $d¤ øã”-Ö¹£L6;#4³uêÝè(`¡±©•0‰to³”ÔÞê3ò{�ØûìŠés†A!ÁÁpà7� ÊxÈvg><ª¬T›ùLÍÊê~´°â0˜è+£HD.@ø4[ÛMEà¹ØÙïÒ�,‘Ž„P@÷A¬ï¸]OÆnÂZµh P_.6m--*ˆŸ6¯[Ü’ï±Èbz|�cÿ@m™››[SE? íkGް�t Ëû”Á®‚`.ש] ë7éd´o_y³´t´¼ßäp¢ÁP9w·?º|¢ ”GF�5f�ÎÛ¼iÓ&�žš”}ÏœýsÝm[Ï,[¶l³¨hÊ“ºb¯‘ƒ‹Žà+Š.¥¦–F n©à�ö)ÈšÊÊAœ\\È æ%™@ 6KJ¦7Îfä’·ÙO{êè°»º»ÇºdzÇc3+¸Å#ÒÚÖ6â–®••„>Ð1aßêdÅêÑÑQrŽã�æøË×¢eÆœÇú ãÏœ1Ë®®g‚qññíª†ÄärFFD+A/^¼XâU!�w¯Õ/ëo¤ÄÇÇÃÄÓÿ4•Éø:åðäì¥ä€ªƒî€dñ]È­âæâª¢È›\m úÈ.þ¸:Æ÷ã azü…ãÞÒ¦MÀJíÑÔÔŒBœNH¸ž–&á,—±;›+æEžsê¤ÚÊ-—ö8�ï¡·¢¶  à›ÁÁÇçRSmÍt1G*ßû˜NLÓÍONN£ Zß”½Äextt JM¿|)0øâVv�eTddMŽíî‘i€VÄDDÎVôr¬^=Ü{)9¼õ–uÝö �œ'ÖÉ þdr€�n½µK!µ€sxr„\àý~»¿MÙ¡UN¡×®!¦ÆúÃ@WáûSZÝnÈ{ ZZÙØ4ZºZ®SZØØ,‡+ Eµ@8;¶=øaœ»/JfCà¡©©©íiªZϳìd•Ûo[”ml$!d] ðä‘ÄÄÈàà%#qk`W¯_OÉÕ¶ï’óe.**êhöŽB›ôë’ ßZ.u ,p[Fvѽ¯·LŽyyÜNN¾¨ušÑÔÔrÀ{US¦À£ïº;yH™ °Èä³â�![<ßn1¦ŒYA À1€X“Ê9ƒ>‚p ¬ùL­‰Ä€Á` ])\øeû¹ôÁ=:ɳÓÉ‘QQå/vëëslß¾½c»ç`s‡öîØ~àÛ¢Žj ûúY«ŸQÜ}îœX¦é.Å�“kÃïl6 ãóPÆÛEœ/.¹Ä%T½` TY{ ¡³™™š¤äª'O€ëG9~4Ó�±„0kÌýÇ8XÅÃsèÀb¦ÆM¡oÒR*•­‡8¢â$­ÂD[Îõ\¯¨h>³¿kJ}«ª-ФÆ=FÀŽŒô5l:LnŽÃe_id` º¤�,&%uîÂÖϵ,4‚ÒïжY’¬ûA°ª°­ªªKÃX•¶m[D"“G^8'‡Û½@´¶°c}÷îÖÃ×7%‹œ¾æ°s mÎÀ›ðHâ…8*qA«užõíyzRqQ™“””TYy¹º7pÖNÀ?JºW4x&šQ¿EzãÆËÎ{aw=Z t7lǺ{¹ö/ =›%K—–TU-÷S0ŸDc0ªnnèWEþÃÃNvMW>|¸©Èß7 �ñû `p1=}9›À�•@j'gÞW§œ;wÓyÑ›R/ŽMѶQT~qç¹¹¹Í ÿþý#yÌ:ffщ‰PÜ)9¿·,¡íËb›-\7í_ä6ÎÞyç `,6mJÅþÅf$òz5]›ÀB(B[w®££s0<=³¸JQ§_ÀnFFF˜ä“Y¥�ŽsÑ:*4Úz¶jÀŒ“ôûó“lÏef®ô÷÷çáå•–¾R‘å±ê‚¦_(ÔF«o˜½¶½ÿÐ1ÅÌ&¬ ¢©é53í³ ¦³gÏ¡äýy�ϼ&ÇÍÍ�(ïË¥}Fnìe‘?i(‹²®®nT2Á© dÜÂÚú0ˆ SmŸ]CåÒ®$§‰·¦ë6lP^·š8;5ÖSw‰ \–Ào±�—Sõ;{Yö‘ õ™J[½ë`Dâ_©P(ëBYøaì‡U:8bnÜ@I›0kiiA?À³²²z�𚘚®Z³fÝ[OÀÒ“8G!àyûLŸ¥-s?-$D±‘G‘¼’‰U 0'œÃ˼ELLL†¤æã�;‚½>‚)ggË@XÖµë"ù0/Û.åžÜ‡`R@ÞÇÀäÛÖ¬þÉÙÖ|»þ¾šñÌSùù²ƒƒ×l$GB¯_Gn6Î] ÜsšË¥TÙœAóÁ6/Š �OŽÇÅ-J³:>òqnjò¤ýú¬Î�®–0“<§E4 £R`×Ã÷ÏM·¶¹ô'c'§§#&ÞÉMõzU¢›˜¡¦kkþ:"ŠÅr­_¿ €ù³äÃ¶Š¤9›xx`±/ Éû´U ï/{ýàX,@ßýå¹oÎ^™öWŽ «}µ�o°ÊÚ>ß­—H0¢�ŒŒ¼>¼»PÆÉ â÷Lób!ªmßÎ851Óõðij¦Ãs�‹_uéÒ@·´¦†Ú ÉÕ �/›aþÎã'Ž+:(êP0j”G1X¼&À¬»Øþþ„ø n`ØÙqǽŸk“ŒŒ¥RÊ�´ä9u½~m°7úÞ=%�þF©Ã{ú5„6íâx~´’Q÷|ûë¬mT¼PŸe›[ʘQÄbw�L€�Œˆˆ8Æã1ØŒ‰?qbC@rbâ#!¿û Üð�N)»†“’Š‚@*çš5§54–ƒqã󈵾~ ÉÐyÇ_!ŸGg‹˜¼x<ÀÛЗ‘é™?.~~cñ�@}v–�¦P«< xMáfN¼þ‰®ìÞöìqIIR“Æ{½½ ;wì°£%µäfÞ<>½º»ØÑ�™¾o¯Ýrl çWM¯x€‘Ãîþ@Olª¯ -[r�¯Ò¼8À´@pŽW{ß¾„¼‘‹;Ö‘@WÜÉýo"øðó¤øÊëÙ³Õ{TSß�Žo€NœKÓªÎçh×7Š„—ž¤Pk€¹»ûðaÆ^Å\½3˜ò©$8‘!0üá€ÊGu_ß§)Öê¾þŠ^Ã0X ”ò<®}~ÃæÍ+¹¸¸V�ùñs„•n0J?Žë�¨îVN|ïÞ½5��ñîx=åî±ÐËKÚ•�O [›âX5µ´ø ´ãn:hé-ìpdE=z4¯):¶MÑr>‘|>Êfg#¯éBÆ4öú3Äü\—¾DºK‰~»Ò¶SLªi´—ŽUiÈQ>¶p9‰Ë#gÏV…\Î]e¿©Â]²�Uô–Ào†4«Ü™ú¬.Q¨ÓC‘î×t™´cƒÞ‘VUE¨Â>>�“dj{c ÛTt¿*x¥fY Sç‘LÎÅâc1¾M[]·}Ú9;y©LõÙû’vçôäÀEb‹D6so�ˆ(¥ê4•Iµ({¥s.rÐJ¶'öT]Ž|Ý}BL&›ÇÛ[üþc©í×ʦ V¿îâ\‹º“âNI)jsÚWyâè‘|/�ÞÕ£ ³kªö+Ú¡Ù6h¿:pçgž‰ì™ØÆÊš"A35îzgÖQ&k‹žý,Îï̳ä¼Wè‘]4ëtêêö2º�-jsi¸Û.±m÷ÄΓ§e2�‚1•Kcv;#Œ×‘Ø™ƒÛœ`¸[¯Æ^ UF ¦Úï1o† èèZæÕf¼Ú�¬-žkœÛ‘C»— s)âÂSéé¤àPF%WבãÕ'Üñ«ÏÊ{°Š‹k}ƒ7:÷¥‰‚Ç`8SLå�‹´3™¥Ö× Úºº »{ ªN·íïvæ,:‘±\ú–Ö…’^¹m.†:fgB vZdš„?½å—À()<ÀWÚøp)£ßsÎøWsý·Ä…*mõ.p|1óáîWÇ*F&�¥Ç‡ö‡ß»75Øx¦8ûúðƒcý'ËššöÌæ‰®†É¬0#�e5H¬Ys°´=p…ôÝEÁb)enËM–¦mJWÖ×å4lV6Vå<þ‚\œ¶1­Á·hjjJÏW…¶sVá�†Æ‘뤥wyš›Ÿ§$ÝÙ‚¿Îº"Ðí–e@€‚ÆÎ�ôrošL2+Î8±.]ê73Q¼AÓtܶ�°Ž‘Q¼Æsµh�ËÎ/�mðÎsß´béRª„„„Z@oxx0;³Êêº/§ÛpFæ18#À¥¬(Ë„mº±6 �óÄ™ò¼ªàl3¤™©v¥´iñ¯÷’Ø´ÚH_I•”žriɆ9+ÇtI¡Wz1�[sú­â^ß¡°1^F1”cƒÃâ­IÉë�ß¿Ù_““�V^'ç3ͬüŒMÕAWºJÕ}QÒîT“a+óröã•ã©kãB¼|Äı\Bl|>><œì0ÓM›ö†©~Œ?±;R|gtûh¯¼ân— Àm6V¶eou?¿±²éÅœAö%çÛ&yùûH•Ñ—u ìYœù‚Î[v»KJ²m|öNTbÕ¶;w$GìîÝÝűQ÷Ã!¶]A;†‹�Ò¼¼y#±iÙ⢾ågôúó”ö-öQ2Я­Ñ)ɵW`^™¸ײƒSSƒö$y7ß¶ŠpþëK‹UÍZ®”9ß-Ñ»uA/:rF߇sò–ƒ§°/ݸ�öA‹}šÙ|É8æ:—ÐGžñqÅö�羑JÛïVU®ÖçE z—¨©¹JHÔÞ¬îr�ûÜädX|I—´Ï|e^îÆ¥]åJM�††Pñ<žyLvo<·u¿²©¹õìÈÍÛË$Òß·]°$7blŸ/iùÙ„Sç­)”5 2dë@¨œëÃ8ºš­¹¹OGO/0ÉÔ³é¹{eM ­¦F'Ëç6ÏŒZ|Og.ÅëØc×ÁæcIWó;Êó¹uÚôøK/O>zМ‰õ8OEûÈYª]¤î¢E=*ÕÉŽ..tí¹ñF{à9Ç2ְűi¹×2pï<]Và�ü¯qvœ·"¦u¼¤7Ï„u½vnyŒ¢�^iãêeIr1%+G›}ÎÚŽš*o#¸ñxÒ»VÖõ™EÜÖ~ÎÎ2ímÃRïòpl¸a?ÔÖAÚXÚs(+k™ÏøÀr3©–UÎøÀì!Ë=·Ä/Îé _\ɦ„rv(ѧ¬[Ó k¯ux#Ì)/°]GˉÏ3™#ô2w¿Òá^Åš8}Âð»®-�Nßbóº¸Cà‘·œôjŽ96θî7"Øg—ÄÆªç¹t­ÒÓwM¹p!TTYáX)¼l‚>'lã}骊«,¥Ã"c‹ªB ³ÏJ:qZ<-gh]9ǘÌ6“x´~=W×PÌéE‹^Uu;á{^ÞÁmwhe•"“yUžÉ?±âš÷{U»f·e¬LJ)iUhŸAçÎ Oä¡hØÝî½M…[V3±–�ÍÔÜcߢ�™÷{…ÒpÎT {Ê Q,ôæ¤XAtUiÆ}¹×r2�3µqÏ&ŸUvÔª®ízÝÛ5J×X¸›i,2©KSuß)‰°Ïú;3Ÿí0jº{ exzh…íÌ£‡'†ØyO­Ûe> G×sí^ää6°Èݽ÷ær{{—×ö‚§¼žæ­q;t8½ÃOÊZIV-¡âýfá£7GáψÒoX“Vhjñnés¾¼²óîýXLt·¤Dàî{åË÷Ìõ›¯Þ½÷AåNM¿æ­³^SèÂæók`k8½OÊûJ]qsìè¹Å_}Í×sÝ“3…LòòR�NÃ’¶dƒxŸ-®ú#àLë~EFs?„�GIUl7·+ûX§íðû¥5h�ÐIë�½Pº•-›î¶2©±«ë1hÚÖ‡-Û¬°´*î­û•dÃ}û¢O㎭Z¥›ùª8™A\\ˆqe£ït8%g·L¡Q�ZzÍHœôž¹L.âÀVƒ‘&‚ê1³+¾ËLµL×YŠ“ëÌO_Ýbƒó2ºÈ–]~%âiŽén^µW÷¡�¯ u“LߣXïòädïùwï’Ho(¾#£×ð$‰4 «?y²È³£Li¥@SÖÆ{6c*b¡O“ƳsO0úöwšÏ]/Ísž½Ûé<ÒŸÝ>٦Ͼ\DûmN�cýÖß&�»žßö8‡�§ÉZ©îˆô;4LWW]�·1“õà˜=‘øôÂ6*…ÆÕÖœcy(RóÞ…�lGΜ‰a¬'ÚÚ.ßrç­“GîÖî'nÔì¢ðIU§Ö¾èûba�ÖAE­ö)C{‹{7ñßàþØ=kxr© ¿ÌfwÓåÒ\×™oæåQ– ‡66i$gœ…EdÍ6;£÷V¤ãýn�à Úà6ZÜGä¦:`–ƒ˜lËÙxEku Ê*ÛKŸ�Iwh=.¿JäÚsÕ‚ÇÎn]ÆÍ5\ïˆÔ1á5Ü'@Dañ+ ìÇîíº8y"¯òø±Õnê·ê»Öˆ_Ê:°£ìÈ‘#ïß_§¢²®LMB†ûœ¯§ ~ËDp¡¿'`*‹††ÁîëÒw"¤-ž(âcÂ2„ï™T4÷N2((9†v\rUlwn&Gö`Ìeý—]Ú¥%àüpbæuFÁÝ&§3ON¨™——8zÅ´Ç‚ÖX›ãçW³mL¬xÛ²ªÍ…`Èg-)1 wHÄ`í§L¶¯Êõãå]ÚT¬ÈwÇSí\� 3›í£S�0Žc»0´Ç uM9›¶mCµ ¼|ç›#ñD²2#M(ªZUŽ\´´>ÃÿìY%Å“¯ÙÁìt��y;:ÌDÄÎu¤ÛèéñÆÕÇæ-ß:ôjê:«þ•¸eUÃÆ£Ž'·¸½eºÄ‰Xõäå– ÷îg¢SÖè)Þñ V¸¢¦žWNzL¸‰'˜Jm²!.Ú¦~Ø‹'ìáRŽÃ �0‰´´ûð{ñCÀ¹�Ä9*ò�%dæÌÙ £Qù¦qgèÓM6ዤ¡Wò>||é'eÝÙiOnÅ7†edøŸŽ¸¤�²°|V¸L,.*³ŒT°²º´?MŽ¢ zp5·©]óGÓý‹ûd5®³ÆÄÕ{~URnñîýÎu|Fº­éQÞR°æ¯"º(Ùñ‚yE˜T™Ý�çV©*·N(4 £,;>t=d_¶¤MRòà¥4æœ]IgÏ_ }°ÿã²3«“�ïíN®&¿È}Ç —•ÝêØ”¶|¹œœ_^<Ÿ%ö?î yz|Ódv÷¬$’×ã$¼„±ªÊm"ãú�÷gĦÕ£v ‹ìe³Ûøt씹—$,ÒØux]ŠN0Û+$r·ŒÂV“—+œð£Ï9=D§ñ,å&ï¹×Çë¥7\bÖÕ­¿•~“²†"ÒfË5m ½W«¤yóÔ¡¸µ»ÏùvÇûfhí o-,Ýek»rO{PÑG>³rõÞ‘Þ:ü`ĵmÛà/9—ª¾ãâä2Å;;Å+&aêåE¡¬~SÝãXì^z|c…‡ø>>Ù<|­šƒˆHÛòW…›‚œœ’½WUµµ1å�JW‘Zƒ{œ"%5SY, ¬ºž" ÌmÍ»Î=S¢3~í–rýBWn·(¿Ï9y“ß}POxèèѳ-…6¤ýí§‡_¿$hz­y(“JŠ$VDBÛ»wžà2¼ÜòÔ^ØÒ¥I}[W«ƒÀ[YGg «p£PLÄa¦»Ïž­2Í¿yÌÝJ+:Yf«†æ"³íoÄÄ/n}9‘V}u¦àÍvóóÏËÐcYÍ“¯pgöùÒ¤®l0¯´¨+ÙÓ‘¿$Õ'æÜØ$ã"œ-ʘӬ¬Kú{t�8ÓÌÈÌ+W–ÎͶZ (�ÕðT=O|Ûâuö,s"Þ™ßôŽ ±j�±æ)$_Vö6ó‘;.&{"�/#:Nvtmaõ,zJÈþ¹A<*lÊÈÞDW;õêÛ—²‰·÷3^ÔBÌÝøp’¬È$ž5´®�çújg‹×;š%E”´lêwJ(ô�0+mñG}¨à ¨—o®ôjµþ˜kÂù= é3V[š¹w|x¸çYzÿj•r}LöS€ÓzžÛlUOê‹É]}˜Ôý`°)ßV¯¾jßý÷4Z—›oÙUÍÀºTº¡7ëAŽ”1û ââíÄÀ+99™¥±¾À…¥n·?xNŒmƒö¯x4\væ}÷¹2:ãPÌþ›-�»»W”¯”Üç¶YÌ}ûƒ�±ûëoÙ´´x»3ñÏ5*}Ʀ¬½“ÍUð émÍíƒ ²¦se*b§åxo˘“úBVè8¼0j}�C}Ý^voR�ÇÌÈ8ºîFš5ÇÅУŒ ‹³Åäå…“ý›ô®´µUK’öjB~Jú2Ïâ™ü*Y�Úë`¸ûŒsŽÞ8z­7[«I0‡ÄuLZ•¤gå=ÍÑ»Äâ8-©¢MÏy}3ÞkoØÚ[-†í½1n1=¾qxølÆ£ï±>Áñ¡˜ò�³OÙó0’Þš„q¹ŸØ0/>]íî¯æ¦„3XŸI­oÛ¨›³©Ö (ècþ±¬}w ŽÊ D=_1÷þã}ÉGODqÇß–RfkkâPÀ¼¢td£>üe«paA!U0ú¥ºÖã�cu>‘| L?r@gnïW\zÇ#¤3FÑAÙØXPA!À[«›Þ[�Rg}Ãâ¨:Ö—`³¢|pžswûÇL}øPRZº8::ø,Ûº·mÇŽ[OcíÛÚÚ€Tжê^;wfÈ|ÿlˆþ¥]ćñR×Wž†\k­‹Nk:¦sÅ$s!oxò“ÙàJëĹgÌ~½£â‰>:ݽ0ökRož/N¾a™á?cm+Î~0ƒ}Ý×öòvvJzúºþ#¯ïMïztP @ÿ%;^�ÀxEtŽC¬»s§GAÈŽ2 ‹K‡wÅÛßm¯jMÚ¸e˨ÈÙÌÌŒyÅŠÒ¦kd„M½DÓ‹�-w<¡Û…|Æú "AØ •bë©B¡œÏTÞ`¨ë¢±O¬lúDŒš©g€à¹äí©ÉDÅI–÷¥¯+éÌ-8fczx Cp$Øõ{J“‰ò+–rú,ç†ÍLvòÎLÙò†0¨ŠLÿ²í­›7ÑÐþJõùÒ#¢Êp÷>·©éÞØØX¨Ä|ÒOá¢æ©ƒÂûgVA%‘BÕã‡NȘ‡;¶{¾}I˜ßNŸ½|4±¢¼\g߸q#�.Ûmî¿ÔÕÕ–†©h®ˆeܲ|ûŽMëØ™Ÿ·ÜÉnʵßíi*îÆÓbš�ÏMZš¿)si¯JÙÈLú¸ûI­ë ý7žM1—§Ò¯G›{RZ“gÎP9)d7ŸòšéN¶ó?!=ðTxÿ}Ù5§ªm¶02š#Þ°Šu—@ŽÍx3ß~çI³›‘ºqÓäh×ÖºP�‚^_Þ«´ƒqË–¹e/f{ís3ö L“mÄîöK= ØgB�¶ ÁÉɉux‰÷x}Ö©mëÅŒŒ‡M€%ƒƒ§‚‚J™ºù׬)315ͱ}-¾~ýuyßq¸  `®k÷®\r%kãÓ-mwUð� ‚æîÝ'>|øp-U-æúeýKH[[[¨žå^ié©ððåÆ×HKW°²Ò°X,Tø|*{T^Þä,ˆw dáE#*š@ë“çΉßv‡êr8ÖkZlß¾=ad™µV¸kG†Ÿ3 šW…cOïÜRxS-¼þé­¾ÃÎME³.½Æ çS—aµ›#9×îþ ö •?Œå¸æòZÃmè¥OŸ…‡0au¡¿Ÿ“u¯^Ïøà ­ÅAlûÓBˆ‘a)�={×6‡å¬¤g‚£UZT×C5â»×Ú§í“^{ÄÌ›Çå7ç–éb¬Î\Ö0žs fccB÷-ó”Þ´®» ˜cem½MUué Úã©´<‡Ö¢¨W…¾äæ›Ö:FF�‹ŸMßçο{Çí­c’÷…%WgÏ‹_Œ²¿";ÃÖ�;YÞ¾5žH>d|«HÍn@c³1v5l¸UÕÎ ƒqW@µsg‚£Û45_)é(Wƒn{Z¾â2:oÄÝæÅ²ŒíÙ÷"’Í,"&¸L|=Xä‹úMd½ÍŸIÈ,µE&g™±°ÈËÏôö¯ˆÝ* —ÉÖ»œ&…SÌè?½bÚ¹C×Lº¬·n„cÃQÝþò%i ã.UÊk$„…ì8ôaV/ —½ÝÖ‚èrqÄgõ‡¾}Û,¬©¹ºY¤ªŠÓ‡­�ͽû÷™÷íãT¬}‘c;ñÔÈtƒg~~¾“§§š›ÛMüƒÏ!!=}ýöž‰€ çÏ‹¼1Bò óLMMOž:µöèÑ£#‰‰&ƒ3»ñü§Ç y?>Ø�ø°‹‚Ia®ˆäÕ¿Äc˯¦ÀjJ?ÏÚ Gß ‰‰±�+2d*h<7md¸Û¨’{ÜÜ"¾esâmOFÛêÌ�Á˜Ü¬7#iË«ªxnÛó³F îIÞÚR{á:ëåe•Å‹ç›MeWƒ(á�lâzÝ=÷ÕvÜwxÉzËÑawré®ä�ןoÞÿä†^Aø£Ò ©Í©Za Âaéu» —¥-“ÄØ¯Z"!-Í;™� &+ËçØZ¤êå…‡ÊQËÊTìZ‹ÓÓÓyä}Ðoª“etããã¹®˜† Øn‡–1uBÕ4¥alD"QñxÿÇ÷‘ŠE~ƹv%ãƒ/V­Y³dÓ¦MÃü€ B4b£ý4v-ûãäTuNݸõºcÀӖÆqÛïÆly9�!#K›æ9é�.Ÿ©~CŽžH“È}d4(øèQ[ž §´”1cж ‹=½’Z;ã@(tÛu‚8ܦ ÷¼ù„üÑQ?<{�é1‘5ápëÚ­P@^þÕ¢µ›É^ü»wÇz{qÆí~:‘Ï »/÷2†Çihhø²Ð—›J¥êèé) ©ªª‚Á z�y 4P?¶¾}¤³2Ï­wu`¸ñXÆîìŠw]SRSƒº«“ÉÃm%“³­P9·Öi,q´çiM}}Ù¾ú°­­EþrÅJ/oïöž§©pŽ)¹º’Mq&ðõkÊ|éb$Îáe`PÐâ���À9Ç¡��6EÓŠÑŠSg�ÜL]üà�š=¯ªÑ2·¡WLVo.m´s¾‘q{¼*ßá„-ŠÈƒUγ‘°;iÛ$©Aó8|9”Ù:ÝYvVvß=ÖEÂ*N¹ïòn™;×Y �íê€+xÒ]ÐZ�ƒî¹ Ü—Ud3ᣉŽ\yIIn?ÿ 3¯’$n3§âMÆc³Ťñ�ÇYÒÆ /Êù‡˜‘Ù”ë3m.¯>ô ¾<¥6yÖ‰6U]VepkN9;æÒú]¯õ|dï¬ó" VÝhõXvËh¨àFÈ;Î�ñ‘jæL®›ù^Öß½'§ÏØc .ncÝÅHjxöbž�ɃËZ!&»dR.*E�qØ÷b3KŸ§Òzz{Ä ‰¥¡Ë'ÀqôÖ^XV«éùóEï|‡ ÐsôèÑ´¬¬ ™™‘““^°Š(þÊØµj=�YüOž<Þ;þþýÀó8¹»wîã ¢¥¥Úôøà2fæ<÷Çåܼ¼êÙf…WoÜHÍËã166ÎuhÑxvÅt¨o¤a·9õõýX …¢£¯¯la!âááúêF¥¯üz¾íçÎ[©ÄhäÚ8ךE±®Õ³iÈÑ ð@ƈÅ{X}Èô�¼pôäÝ­™ù]å2Å*ÚæjãäïÝr vV<ó×{1ˆ–�Ú®lÓW�¹÷˜&©Ã`7•='q2…¯·�ÆJu‘jY\Š6V<¨\½!Ùã¤ü«›¶áá÷>ìißœöýêêÊ–AXˆÒ¶]»X¿÷ë¨lÛ¶èÊ•+#³>±‰ú¢ z¶ÕF†F’{}½¤"ÆeÎmÕ½Û£�zJÞ;›?Zçau±­Rø9Ú]]4‹=Sl<×ÈG±äf_só¤u�ŸwwÒªf‡Kº !o²÷8ƒË '—ÿîÍi呉¡ ®ý16Q»Î¬ æºï$©âz9ËÐuj”SOÏ¥©x]c¾U[;æUáàȈ7ƒyë†áw.%5W»Z’2Ò/‹½Ý#°b\ª­>N?Ëá½A…er¬ì~rñTø®Ù}ÕmYz €å\Çä§6ѯ6KK‹K¿•°mOw?}É#éeÈ�Ô-7hˆ¢9¯•cÆÏ.íß‘J4ÞÃó,`êð „u0� éðø \êÓÕk�ÝÎzð Ü ;—ªß”‡\»ÖßÌçÁ1Ü+¥ÊèükÛtS_Ê�ê½õXóYµá«*!÷w×ʺn³öðß¼Úkp¨bCéeöüŽqqÛ™”LM÷ÊÕÀªû’^¹4¢’îo)éXñÜÍ�ƒÕˆ5x:„CABàan>BB.ó]écçPLaÓÚÝYµ[XrmŸí÷kóûøaÝö¨¾T@Õºµ�rOŸnx‰iÓEÍêÌ䢓 }FØÞqõçkÎH§&‘ùe§÷uôØ6v�¢ˆpv`‘‰ËS"’³Nyß.§e¼áêºþúîêsú©ˆœˆ�Ï�°êŠ¢ÂÂ\c_«µµMr´•…î×¥¤éxuÅävtñœÒÁ éá§jû<¶Œ�3²Ý¡1uX[QþîH'·WßF5@H»ÌþÞˆ¤£nû˜î%Wìñp #Cjxw…X-s¨6ÒÒ”{,S|üfž�¡jÈÁ1µFŽ8vU]ëUd¹Šá·®CµuW. $6¾ïv�‰�9yÕ–[¼âƒÃ2›ú%L2©™šågäoÀO íùnܤͺN×(k*~fætÊÇ"¶˜;k&ì´� ÍP”@ØdTwjÛÊ ˜2R ÕÝ—Ðj™qñRrj~~n9%#ÝÆ L8¢»³Pø˜é­#Æì¨YËŽÖ:óYòìîZ,#ûg7Å-_Ê11P’’tavhÿevÊ`ü­ÄÛág[Øš1â×®…ŽÞ•’ŸßÖfé5ˆQÌw¯ÛõÑÎÛsBOãþNC§.«e ]6&•Íc¹AFS«ÎqƶŠ¿r�–‘ޱñH~ùx&øƒ€‚ïÉ¢¤i$¹gåúÑäÀEC|»ßtspðì˜8+Â�zîfË“ÅÓã/6¯ßeR~/„̳%·8÷…·ˆâìñꩱËvÏ]"=›‘À#›y—3mÚtƒ6táÝvE{éu2ªÛÚO¹¬Œ»Öoyà˜ã–Ä)ÄPš±­IˆU Ïy.ÇúðóôJ!K``±B-;¸û¥UVFY$T£5£Ü'êϸ2±^•Ú¹êaüS~Ï‹Á—»‰)G—®ä©‰ŠÛ4¤pO÷…’hY$€æ�÷q£¼£g…½Ù-iÓ„]Qy`Ði4·ìUƒ2G‹I«¤ÊŠõ@5²žQ2Xyj´,ßIUsžé¬;¯½7©€Ï•Ãõâ´ÖÒŽ%�o›Ù½†äw9¶T�^’™˜”Óò$Y/)<·ÔÛ»|àÅnófÍ›-µÂéW®P§Ç…'gÞ+S¨¦ ½5~¢*Ç 6«©ï|`Tx± Â2L�ü!¥ë¸QüêŽU÷˜Ö*´®L®ñ°õLËJ'•¾¯Nu´ºŸ'¸¯}üXuç‰õïl˜žœêgžÌôx«§§÷àÍc^¿ñçÛÂ#vò*¼Œzf.yçŽþ1sãÔF�DÓ’rÊRï�Ëýæžòöopï?½TT4nD¢nÌ®AÏp#Œ¥½($q“œ´¡¯äEO&«ïÜ6©~,î1ét†•…ZÃ$lu'éN">¶²çiò»W¾Õï›mšºY¹e¸nд�§±ÈgµwÚ�]¬prWRÂø‘ņê,'b$nŸt z¨væ9¨ CÂ*�Ä{Ä/fzUQQ¡”QXòFÆüLÙ5òí¼Û¸{ºLI‰?mW¤¥Z|&«m»ƒ8«Ù û,*§QéÐh´xôð°zDÉõ,ñö {§z96éfžÊ’Þ´vüv7üFŽø:!ùѬ ý�ÞÅì÷Ó21Á¿zÕlœalt‘æ8Ùáøà±¥§ÆL3©/"F»sÂÀÌàñ˜+gӄ㳞œöÇÛ�)+­»`×À ºhS±ñƒÚóêÓmOÍ Pįu¨™y~¥8QîAEìÚŸ~)ÆG'Ÿ<Ë>çwöl¹f²BðýûíûzS®ê¨k>"6^ѺìÙýØ·**“8‡ábÆåÕÇ]7:oò­?_(Ê1q'åR6ÿNž`v6-0®Jé¬nnú±ccYÛr× ãâ4…Ìž›��ÐYϯ¶¢±�Ö*–žMÍ/ž˜M7\·R”œëPþª4uo6 N/7ñrƒ[�EE¼”#º÷˜åjKþš\;BhHÈ2™â™ÍÇ6Lפ(w†¼1×4:2‘t°À`i—jÃIy‡àc·Äw)Ä»½;2 +ºl9{Tÿ¸]Ãë×µµOÎ=­±{žnˆ1,Œ —-MÌwIÿ€Ó¶FÛùvq^¡Ò�±¹F�ï<²hÌÔZ·.Q �XÍöæÎø`ÊÓ|¹Š×^i&ö„VהּLLPÖºÀ7ý‘ ÿaO툵ëþ J7¹€&‰&Äcoöcµeo¯ðTó¤-}Dò›áéà 67Uñã-[YvÑRûà³ì0Z³øÜcœâ»©~„Šš6mÒéÖúb3ww©eËN/*0ƒÈ~®ô¾Ã7ÊBåã<w`†§7c³|Ć–D°m¦Õ=ÕÂï!°¿åÞ@øæXÓæ»]£nÊJ<ï²÷?ݰ9óÁ}äÄBYŒU€2ºvc�Ó5¨â##¼™&Þ‡Ì6ï9ó(‘÷.ªº^±ÍÜPïa×Zñ×$®úWE¾"Ûñ]#‹ª¬vPÉ7a‹1æ–Ä q¦xö$¾¨E‹ˆ‹KOÊûaÇù/|4Ë;ɹéäU× ¹W®h¹°äy3¡ð^¼œœ†¯ä3Ô‹4˜î?Ü´‹�jj*MkૈìÕöÊ3/ò3W4W7 ?¸óòò€޼=ÛÔ<]}Š&yžhV¼¬ÉœÂ ñÔMÍ•š!)¹&Sñú™´`‰p�žND¨g²ï‰3òüí†31Û³h›®I¼¿LkÇݦ—ºýÏ>t+ÞzßuÂzݺnîÛ³“OyŸjÈ(& |5kÙ¡"sQ‹ß`HË!afSà˜_3ƒ±=ª®þ ¤¡áŒu#ÂgÅòêÑÅ+�Ã¥}xÛÃY§/—),u€0Ù9ªU•]C~§n÷†GÝÃÏKG_žàU¶„§Ì-Y9ʰah¦$ÈOÞzõ¶�'jû˹ùM²wSVïŸ[êå}ûªK×ùí—÷–F nØS$wø†evû`KÒe}ÿeÌ=³K ¶Õr-&óʆ|RÚ‡õßõ®ZüõC%sÓŠÈÎæ–;'X[ò1i\/ n<4¤Í?ÆùO Q-�v”’”ìRœSêj ±Ó1ôMñ‡7:g¼Îuú'›^ySõtõ;=N ©”‚´„³ÕwÈC—[ÖꇰK…,|öÆë†ßs±cý×Òã֪<#Ôé9p÷nSž™{ßæ}7c¨Y¯ºvk¾|)ÐgºwëHŽ­þó«¢,¨ØHÁÉ`ÂoïäÞºy6<¢uãý�FNcLâ}|,ØÂGNïrʼXÝ¿áôxÍRQ• qˆåcÞMv �Oãæ¬³øÓù×™hXÌ]˜­·²9äu·47Àv‹íò÷ä®|±QþÖd®éBó>–®$Ê]˜±Ÿÿ`ŸiwF¶ô‘„}�QQË<¼¼š,(£•—6±àÙ™ÂæXJ¯Hµ©¸-J’ÛÜ3àûÞm½þé‹êËØ•äô »pKfÞ­gå… ž´Œh¾ᨋ}¯T#709›ù±�§·W·…yn ¯—÷ÜÓztÚöÓXÓ§uu©×‘ÜyžÚ###ÁÁÁ/§üÝoó-&Ë/+åVBçJiùj†³+õ>IÊê}ù<â0GáÛ*£–«¢‚úú8±µÉ•ÕÕÚ/²úΗ1µŽ¡ÖêŠÍ˜Ÿ¢!bäô45#ZK%$t,™ä²[*‚Ù•`"Âþ!ì17£¥t36Ýl eW:Ô ù6¨Ò×-,ã|…¯åü)¶�L\ZZÓÔ ]]] •Š™Lpí~"ŽÃÝ*q‡îÙ~óøô³6Y%æ§Ð�‡Â@¸9zw±¥‘—Æ…ë%ÏìZ‹äCCqWÞ?Æ�?¾>#Zï²Ýqâ^fÑ„ph¨§ Pþ¾§‡ùî)”ež×ȹø-«•]ÕÕ¿AO®‹äA”÷‡žÉrã*%%ådBÃY½Ë{n9P²½+º’UPVÅÆF’F£yùúvöö.»[àýžç 0=1TÙØÅÑ3^»ñÛ¶og´o¾Yr÷n sgEË�h� b gì{2Np½ örré6`哨´)Âûý›öŽ% ‘¨¨©µúøuUÅíÙ»wÏŽ}ûøúŸe3YÔ]Ô?�‘Õ'Þ¶ì½j±H]]ý–Í•=×øùùåäå ®oVR©Ô•Br'_ú¢œÚ¶†²ð{´Ê û /R‹ B�Ýãá¹jõôÜ×`öÑIú¢ÁVK8°„‰i±Óì”{m]�£<Ö® ¾=Fˆ%P)EDJ**!��D"A·¾ÏN�-¾ÛÜœ°tôØ™€©^cL?ôœF º©·&¥T¾�Ç9uJÝÏO.>>º-hxv¢7x¬8‹ä"Ð ÜÜ'Œ‹s¯^�¬«ŒŒŠZt¿ºúÒõëG›šö@�¬ÛJ¥Šã^n½ ·¨m`À¯µÿUÆ®äÁü’5w[ZL� ÞÅ¢|Š>&gMAÝ'“êX8ÖhZ�ÅoùÖ·Å·á¶[ïjqqqÏ™L‡aN%fSq[àæ•VØÙÛ÷Ö_æàååÅËÊvôôÜ!÷Þk¤¥>>>þööƒþýy·o§èHìÐÔ\âpanì™9®·HLèÑ-@šR + æ>N?:… ³‘›¢wŽBu¦Æ(ä¹ >¿N]VŸ8Ðtmÿ¾Ê{÷ÏÍùÍŒT–••�5�\¶|yÇp{éãáå!ìçFÑ|QÛ_hmÀöööBY«™™™›-á»øä¼à ºju‡ST¥ÿ–jQ#÷¼ÖÈ*C,Š”‚‚Ôá§N­ 6g¹ï{¤SIØ}õ=™`«õƯ'õDËÖÊ((˜½�ê)8°˜ÉæÎRpBé-ðªP#SÑÊ ŸZD¡E=Öð"?ý˜42§c“4rÃ&Ýz@°ºê.•+Jÿ§PL?þÑcáùßvŽ$¢�«9…Js•†Îü½cüñó¿pæ·ÏGãúó¿ÿ�CNTJJd‡�–¦ˆ•æ/Bst¡8zy[RDÒxi\JJa¹œ¨Š¶²Á^UH
‰8É‘â þP¬=D¬)à"G'0H—)Ž"Žn 3{Gªˆ›•µ«¸h³ˆµ›øH¶st¥RDHÞŸu\Td^½é’;"˜¤M@âì¨"dª��«‘lí`)/›ÿîD¤Pæ¿#0âCäÜè\Dæ§t•jmiå&+‚Á:ym™çšœe~'G ?vŽ–Ž€hk{K¢ÐMèûÂê|ºÂºDÚÕÃHÐ Ê7:!ÚY[:ˆ}ó]RvT.�¡Ú/ -òË ?µƒ”t�cT{'7o¢«4ؼ®­\çµxž7 ñúµ,|‹à‚ÃW}¸Û“¨.b Hi8Pg ª‡µ+��…3Á¢ƒ& ã˾I ÉÅšJSÐv¢:héˆè¸-í‰"Û("zTK¨3uW7—yYstù¥—OÜ\þ|’™ù5ƒ>Ì_8/TÐ×'ãîDtq[Xpèµµ _Û¦…‹þD<€ã\�r%G/yª§ˆþçïb¿ü$¶YäÓ±Í4`Þ¨›7,\¶á+Åø‚5DGO6;¢«ë‚í[XG9w»/ÎÚY»º}úüdg­ Gü¤ZÖª—ô‚c˜_9-°® +©C´¤~Z9"ø4üVNà:ׯúУÚA ûµ×é‡èTj÷U_*Àr-t¤˜ìæîòG½}ž4ÙÝÅȂد½Ó¬í~CåvèÌöéã ×úeÝ~áù¯§ÔˆÀ¶yPžh8¯ Ÿ®„´í‹ßÀ¯�NÑ­>Õúזמh L¤ôº±/šÎŽöŽoæ"/æBœqøUФµ¾ìUßÊÑSbãw»pwûÓvXS¨ßèaÞ&A.éËy98¹©b_Îr»5ÕŽ"&âA´s?/œ!’ÉTWW[ª78õ *iÀ�¸Ê‹ýž¶ùÞ¶C¿Jé nù}c’�»ËŸ´�×·o6$¹;}·µ²ÑÁ’*Aõ€|Üo¸ðI°¾ÈÖ%à:â—ÜQ†<�Ø'‘ýÕŒÈþ:þüzTWw;7×Ý@}ç×Uá·²4•º½¥˜ÉÑ… ükÁšwqóbõËB:ðû ü*Ì¿Øæù/ŸDNÆÝnÁÖ~6º_›'äWæ ùíÓ·µvÁh‚V?c >Åq_õú ¤üFw6CÔ4ÃoQ³ÍÎîG æç€BU_óèÌú!³û¹H_¿ê  X÷¯tBÞþ«NTÁ È}þ15ºX¿Ý¿ú)²‹ã-ØÂŸy_௎Ýs^{D\�ih€@ª77�æéýô}e¥4ï“¥úiCü³æwÞ,�ñþ´ÙNª÷gëô ÜY˜½5ÍÂn_Î~¡Šç�‹ˆÄ0˜J#‚s¿É‘¯Œ4Ìç®çç_m˜‡£5E¬ìüÏ_Ø¥_LÌBLøu·bßj~. £|1+ˆ¬Ïr´KB~B¥�D@«l l®­¥cn ½Su—þrYÈþ~jDµûlx�@øŠ47w™‡–ææÖÀÿ˜ã­æÅo-‘ŒÇ’Ð42š G“p4�„Ã㉕ŒCPÈxYLa¡ù§ÖPci«yÛº ¡Ÿ©0ÔWÕ3×SUS×ÞõCÔ@©•ïÑD@Ѩ4 M àÐ$‰F@¢ñpOÂ’°T*÷™¦ù>¾KؼÚ|¡-Ÿ¹ø«ÊÌ'/hŽŽn�—AÉ"·Ï×ýЦ­\>Oná'Èç€PÈ›ëo~:nO´ÔèQ�As’»¥+P^‘_Ì‚=hª£¬«»ôûVW²£ UÊ Êuˆ)|ãä§Y.t ¾, �ú@|TXþ½üÏWù¿_lÜß›cú“ü Çý.ÿ‡†ÓóÿÆAÏÿÑóôü=ÿGÏÿÑóôü=ÿGÏÿ}>èù?zþ�žÿû?šÿûó´ÝOæéù?zþïŸÉÿéhké ÍUæ£ÂY0ùyÑÿ™T E“p4 ‚FÆá<œJCP‘d,•J£’ÉÂ�¤Z@±?M'âÐ$•@!’‰p G@‘±žF‘PxÄ�¢O¶¢RÜí¨?Ï‘B„#ÈX †ˆ€Ã)dŽ"áX*KÄý8) ÒeÌ¥GÁÀ44…ŠBÀi(4Š„EÞ $,žJñp8==úŸ¥Gÿ¿?¾Êÿþâ(ÿÞ1þ¬þ¨óïò¿=ÿûoôü/=ÿKÏÿÒó¿ôü/=ÿKÏÿÒó¿ôüï烞ÿ¥çéùßÿ}ùß?OÝþOÖƒÒó¿ôüï?“ÿ]ˆ!?§�ù¦ØýIbÑΚôk&O¤BiL�F“‰‚Š‚cIx�„ƒc1”_2¾ Ñ§äáæ?OZþÔóM†ž£ü's”_åÿ~1·ï’ÿâpzýçÿÐAÏÿÑóôü=ÿGÏÿÑóôü=ÿGÏÿ}>èù?zþ�žÿû7óž¹ûß?8=ÿGÏÿý3ù?²à0cäpT¾EbãÏ:Rˆx™JÀÃQx ‰BÆbx"O ‘‘$"O@þH¡ã¯ÔºR]~œ¢?*v¤Ð°x ‘ˆ%‘I$4�ŠB x'c H$Gü±bGðÍ…J�¯Äü•.-*„å]Ža($žŒ§PPp2ŠJ!R±DŽÃÒ8•ˆÂ’±?°_húš_?H×±�–�LÄÒ¨h‡Bá©’8‰Gi(šöÃl[(^Ýæê B®O æ?£ë«0šL¥ ñp8 M& É$°fMÄ“NBþ>ÅüÛ±•u?Æ‹¯FFÀQ8žŒ¥‘)T*ŽEÑhx‘†ÇÓ( žJüãÔó/ë:P~bpšŠ PhD‚D$ 0X H<ŽÁ‘‰"…ûÁÁ·[;€`×çOYþ ¨’Œ†ƒÿÉX$ ‡Áã¨A$Ñh4 æO2ï¿P Fu31ž¹ÑÕö§ÖCÆQ8CB¡($8 ( Ÿ((°5¾þó¸Û’Ò?ÕŠ¯FÇ`q8$EÃaICÀ€éÇâ�$ |!Ò~ltGB[#Í�Ct�ÏöüåµÀ¢1h8‰Š†Sd D,�ÿQ±$ Hú;kñ‡›-?5À÷ç©î`íö3rŽÌ%Á±šF¡P0H*‡¦R1p ’@Fâ¿7³o�þS Œ RQ°'8 C#¡¨4‰D¥á‘8NC“ÿ|âÚ4ÚOÌŽ#a14 \‚|š„&"p4CÂ"±ðœ·öÏHXj2…„Ã’‘,š€Ã¡(d*™@£D#’á¨{þ†„¿dØ¿A 0+’Œ$á†D¥`È ™@EÓ‡ppÄ_¡å/*ú·lœ=¹†‚ǰB‰L!¢QÀäxì�ZÝyjþŠH~ƒX% ŽQ‘ÐHž‚! Hx ÜÀŸ’2ÿ3å«;{ �¹€°~äÁñ,‡BP±x*•F "Ðx" G Sà($�ôC7ÖÌ_±€UþczÐMÄ"(X ‡¡‘ih Ž!")$€V$ÌÓóù>Ÿÿ˜" pXH<‹Àáqx<K¾‡"Qœ˜�ŒþaŠ~Et�¦?¼ë0ID¡)D ‚ŠÆ"ЀŠ1pOP�F¢ßõC¿ëç�/÷ÿÿ�­ÿùã�÷ÿAä†þíóŸP8$š¾ÿÿoôýúþ?}ÿŸ¾ÿOßÿ§ïÿÓ÷ÿéûÿôýÿÏ}ÿŸ¾ÿOßÿÿË3ükÔýoyÔçþÿï ýÕ‚¡þ¢H®�÷™æäÏ„�dŸÑ>7¢ý…FŽŸ9þŒ´êÄés'Nô’ zÉÄ—L|yòß$;G²­˜Âª ŠŽˆ"�rˆ8Ò€ç°ùâ�YŽî\7÷îb alð0ÂÚúÙð‡€¶Û'SÊÍJ õæ3™G?÷7o"d¡Ô ¥ðk˜è@¶‚RÐ4ÕF ÐR"d)ý�‹éüÿ¡jz=Ì_Øøs9¤}–CÚoå�^Mó׫i~�鎟™îø[¦ÿ_¸ÛóÏùãô™?N¿åÏÿùZ¥ÿºAÒ‹§èÅS©xê?¬jú«ë' ³èÅSÿ׋§èO¸¥”ý/+(ûï| 1½Ò�^éF¯tûw+Ýæë¿~Ý‹øGjŒþäù/`!~[ÿ…Â!éõ_ÿÆA¯ÿúoªÿ‚¶Evÿè`ô 0z½Œ^F¯û³�pz½Œ^ö¿£ì¯jñ�T„ým`ôê˜ÿsÕ1 ¸@ìéþêô<ümÝ̹/B¨ÓoˆÐB¿°áo¬Æ�e¡Àf:ž/ð ’ÄO…5_öM±vëëèâý¤ýÖ/.óüzm7ÿE³!‘š0ççnÐõ Æïêô´¦¸YÉ" œK±vu²#zËZ;”O•šŸ@ Ÿä'ü¬®Ÿ6Ä~›ü2wutw!U£øytkÀ?ÀŠù`åuþFní;=/t)âFt±Á®äòütñïògóó‹©C|ûtvw~É3„ù?Ʀ¯6¬þæü~ìw,ùÍn×·9aÅV�4þ4ÌzQÁUŸ*A?‹ï|Æý×:2‘ï0ù/ Þ·ÓÁkH쾓Tþa^ææ× ‡ªð\çá4°VÖÀJ/l@‰@#¸Ø^‘OñÖ§méo¦¨:ZØ.ù¼Uò‰Ô…AÆP^lž¸…kÁGàæý‹¡‰¿s30p¶Ôy‘Y81�+E]À8pu,‡ΪˆHKK‹}½åõq ²–î�ÿqs\êÓõëK‹¨»‰� ¤yßm®ž· `ÒŸKÓ ÷õÇ}»ožîïhê7%_nªý}Rÿ»­ºïˆü×ûrÿ–mAÿ»¶å›Û:7¯ÿ‚�ùöÑ¿el Ñ? Sþ‚əߢýÏ Ï·†ÿÂúÌgº¾gv쬿0<_nÿ»Öç?+„ý~ùíïìÐ× ´…Œêg˜¸êé‰ôãÿ—caÿ÷³ë0÷ ºüýÁúü8â7û¿оÿû¯ôýßÿ¦ý_hC@d>û \ŠˆÑç[�è»ÁôÝ`ún0}7˜¾ü¿y7øû;?Çî0}7˜¾Lß þß¶üOÙ€ùc¾Ñ×ÂWuÈ4þTÝÉç¸ñ;ã, Ùÿ�W�|›°Ÿ|ùÈ7¢ãÏ=~�Ðÿ¥§uüéã0ì?ÓfOßð§oøÿÈDþü6kûÏ·YÛÿö6k{e®“‰v»Àxß¹Íã�÷ÐÖÑT4‹¡b)H2�GPàp‘„B£pX ‹Ãb¿³éõŽ'ö*¿»cè'i!Q ЧÂq•‚ÃÂÉà#‰Œ§"¨dó´¨:P ¼õ§ ùtÿ·¨ ¢P4 ‰†À ÐHŽ RáHŠŠ#£hо¾ýÿ2¾}ÏëŸMO†#à2ŽÂ#‘D‰Å"©x8ƒ¢à0( þ{“þ�Ѿ³±–H%“ÁRÑ4M&à°<MÂ©Ž‚!Óp´áðnkZ;P?Ëj�ÝHŽÃ£0h8§!áx†ŒFƒõǡѤ¿™Õ4ƒ§Áñ$ OÅc�•B‘Id2�F�#pÿ«•ˆžO³¨"�LÃcPx‚ˆÄRÑ(4ü/²ù³¬ÆˆT ‰@¡È42C„cPh<™@% ‘`öôßÌj ‰£¦ 0ÐÝlH"�!�qx�§’ð´‚ÕD,–ÇàQ KÄÛÖ ÝÍ�Ë‹¦"”Õ;ˆ®ÊŽvvD'ן5dx8=,�ÇÒPà ™Ç¡ˆ(8ƒCü€!›'ÂÉ[Ýá'I@Òp4A!ð<Ø3 (¢à©(<‰€%ý8 :.Öÿ¬!BðH*‹!ÿ HÇ‘$Ú÷ÍÛ×tl·vquû �ãqX ‘†A’,•BFáQ(<žFÃÿˆs„¨Ó~rx0('‹ ¢€}þ‹¥Rñ4`‹PXúdž×$þ§lÀS±T`üáT ‹ÂÉ@8ð�áEaqx4º{ùGèØå¸›híö“$`hÀÏ!©od"™H#“ˆ(<ôÀåIp·7°‚Ò½®?»"è*D�"’ˆ8X <IB �(äm,R)?«¥h"”ƒ¥Â©Dè±F($híü½ÑdÂj©•â>$ý$X$ŽÀP‰T4™J†SÐ$2Ž §á48…F¤Ò¾k¬¿¦Â?͇ǩ$* �ø, z…DB‘ÐH"üÇH0tp³þið8œ†&à�‡ÆRIX<O$Ph ´[JÀ⾋¾ Ȥþ§½˜Ÿ] ‹æ‘P�¥â(d šh" ¸l ¤?â9~½ü'i@�áÈD €”ÀÀT4 (&�'!þ‘µøòæøŸ¤‚J> �#£q( MEa@‘h$†ˆ„µAýP�ÇШ…  §õaˆX8‚FÆP|BÒÀ²P€ý›�=†„'ãH PDŽ@ÀáH MÀà)ßµÿ pBÒH �Œ"àˆp ·àh* p" G$#©TÚ�§y~ÿG`6�…ƒU€ `U,•Gà‘xÀl€¨�Ä¿; @S¯HÅP‘(T8ð"‰ü]mûO˜M!àà7 d ‰§�‰Ã°4*œFÅ!��Ù?ÀáD<�ŠÂK‹@ÂÉ@âh(NëŽG#ñ”¿™Ù,CÅbq(2 Â,Xf‰zŽÁ I¸ïfþfÓ(ØyÄ�E¡bá*+‘À¿ ÁˆDêG_PÝšš‹£»Ó�i¡âÉ@¦Ð ðF£h†bpb`è‰xâ´_Ëç~”Žïr�¤`¡G:¢h$àéÈóOzCàA”D€ú#œ¡?Ùã?¬ÿùºþëŸyÈŸÔ!¿«ÿB#éÏÿøwzý×iý½æ‹^óE¯ù¢×|Ñk¾è5_ôš/zͽæ‹^óE¯ùú+�Sùë5`ôš/zÍ×ÿï5_?ûЕO7C7<»;@˜”¶p›Òïßs´p¥ÌÂU_½ôh>¹@%žÎ7þáw ÑëÏèõgôú3zý½þŒ^F¯?£×ŸÑëÏèõgôú3zý½þŒ^F¯?£×ŸÑëÏèõgôú³ÿ•õgôãö˜¯ÿûrçèãOÞÿ…D"[ÿ‡Â�Sôú¿á ×ÿý×Õÿý²S+òi“–^H/¤Ò é…€ôB@z! ½�^H/ü+æï, ü' éiÿç Ò~ö­cß�þŽ�9Ïc±/êÐ>�ù\jiGu¢g® Ð$Í Bî÷ þI#1�X qL©öDKkY`cè-"nT)cSex÷t!:m�Œ@¶€v¨D”ó¯f‘#Àý¥åûCt_xÇÙüËN€Á‚ÔR^ 9ï¢æû&9º¹9ÚÏ3`a™�ð<é 4ÿ…Ñ> öի؈VŸß³ð¯ö—_>­Ü/ïâøÀ~zIË_¡[矤[ç¯Ñý™Ö…Èìg_úòùè/ÉùLÔ—/Z˜ÐïNý(aßÝBùÞÉ÷èù˼ø.~xÀoL[á7¿ýæ¢_–ïÊ<Ð÷èÇ¿tÌçÿ¿†Ÿû’ÿG!ИßÝÿ�ÆÑóÿÿÆAÏÿÿ÷æÿéÏ §þé©z꟞ú§§þé©z꟞úÿÿ&õÿoÙz꟞úÿÿ2õïú÷dý{M#ž‹8ÊR–¦„³$ÍHýºvÓõ«YuU»½D¾¼p/“7Þ­íºž©zúªE1m\0¿G\ÈeÍ¿– Ñn Ú3$F8 \{ ßù¶,i¯ùHB„5í%§9c1œ‡™¤ ÒŒE¾ˆ3B‚„ÕEi½uäøâÔô· Sª{³0»˜Ž{ÎðÑñŸ5¿q/u´Ä|Ÿ’Íý4vû?Nò¸øÏ9Å,­èYFÑE\ôÇE\ôÇENýÙÏЋ¹è�‹þlµÒE.%úã.`Ñ1`±aÌßG¸bëÀÞ…­³yì®^±."V±ƒ3 컉î .rwż«7oß=õj?½éH;GÚ¹gýhþom%ßK-ü_HºÅÿ%.ÿû$�ãÿΉÿ³«Ø#p÷W‹ÂiªÏÜ·=p¤ #)èHAG ö&÷zŸ?EÜ‘‚ŽÜj¥#)èHÁ/Œl·ð½£S…OçϞʩ­úécøÑ‡«¢˜ “ÄnW¦ö 6™|òÆ•Qá½øÆ{ñ§?éÖ}_,Ð9+SøD‘kY–Kø>žY£:×ö Œê‹ÇðÖטþgè4X௶„¯uŽ5æÛ�¼f)†J­‰ƒ5a¢É.\·ÄИø¢%´ðíïËÜAlwuû؉„“1/3<3ƒ?�n<� ˆu·f!î(BP/yYð‚°‘ðKq åÌBÎ'LH -ºÙU_j8�¼oa¦ó‰þZ9o0‡Ò|Á{þãÕò˜.`ŠNàÍ©dK°¦Zròš-òê¥[(f —7ì—1Ô‡1 8ŸO`¨�þ±é�S¬‘÷M\LóĪ6ìgRæãêïšo®v‚@ÿ–…k“QçLêé^u Úk˜Lºä)ÈÎĤ°8ŒÁ×7ޝ÷@ÊA™LйIǜ˶ÇJÝ£UñÈÊߦh@׬ÙšL~) `a3ú§`ÒyzIÅ/çÇ:jà"`Úçd b eÙVë!2…Žž>žÃìš—–8ùÐ3±¡lùAƒ^”ß÷ÞU1º*%™>°[¢3r=–³9®°à�- ®¢øðAʹ„™SüŠÀX�…®Ï»ziShׂ,°ó¿€¯†j÷ìŸP”˜ÜæÐC�ž+Ñò`‹Of"/ ë¨Åìæ#ËÁ_1cò�Ÿ2Ôœ-±3ÌG¼wZˆe{ßý£ãÁª¡UK…Úóµ¸Ö6O˜a@-²X®¬Àú¦½¤¨�Kp9æ·hÇߘ5âuq³ð$ Þ‘yðR.ÁÃÓ:¾*Læ:y)7l¢¢µÜÏMR0ùj£úÀûã¿@{Qüà%.¹€å-öë�PøÏ÷É×¶7Áž+ ­þ5§ }õ^§E7¢/¢¢n Œ¯ª« wé¾°úåªùXÛêûÞ}ÿöùßÙ7¿…qÞû¥v^Ú^|ñîÅÏoßýtõæû6üá‘Íq~)A@à‡öR^]½ù×u¯Æ³rJ0ïõZGyo?-WrÚ^N�µ^;ôÇÓà^5§~{Qßýûó×?¾*¡ùîW† –Û¼6o¾ûëÛ²K Û@PÁ­ƒîHï�ü¸Ôú¾qÀ^)yûþõëç?ý‡•û›•ˆù3œÇ ½¸Ã|ÃéŠ Í˜ >0éVËj¾“‰±¨É9†õPäÛj¥ ò]L�ÏEô¾Ìˆž]`�]Si?øƒþ] €¥lkŸPÓݧ—wö¥<ƒÎVÚ¹·;"ÊGˆ>îõ/Ž86v L%@¹“¥Ý7PkHŒÝ.PLÊCüŸ=½!åw®ñrÙ²cÕaþË[ˆ.-oZ¶}ŒËÛ Ù8Ú½ÖŒñJNŸàPPÅ"I9÷cßW ˆb!S2‰ã($4à� ðâ¼ø ׳òÊ£Ùš§Ö¯w lœmß,ç§æ«µ‹ vJM[S­ÔhJòÑdÌå·Óé§õV‡M–¾‰è“ÍN¾-?yÐŒí‹vì�p¼âõTüŸÊD¨”Ê¢„åQ’©œÆ�ŒF¢(£‘Êî�ÿ#ðá&ÿE¡ãÿNñ8þïœø?Rs £è(@G: ÐQ€Žt £xQ`†"Áwæ\r)ùY¦9O9¡VYÛ¬ÜJC÷©¢“Çnù"rb¢ñ.Gæl¹F½ŠZ¦Ñ®Ÿ­cckÁAd¢N^<�زÓÁ$¬²]_þÙd…ÚwþóÂÿ{?·-ÃT�ŸëÎ?ÛÓ9ü‚éš9tZQÛú~]$*µVµ'ܘìùõ ÞS¾ðߺwÈëBÎfà;ìRÙ)õ÷IÂ~T¾yp”ø—N‰ÿ¦žŠÿï}:¬Ž¶ó¢0ÙäÿÃ$rüÿ)ÇÿŸÿ¿Žíº@€ ¸@€ ¸@€ ¸@€ ¸@€ ¸@ÀeÈîSü�¤ÑÓFÚÜš/*,`â[·~~žxOñ¢òCs©d“/Þó~?Îø>iù³CüŽ«PKrþ¼w¿=ˆ¢¿¡�,}uŸgƒªÇzÌ}šK{VXùDÖoÕG/5®¦E.ÿ�tQçüóƒ“\‡;�öÜÑ‹uy©¨®Ë\6{<ò®Vå \xñhynSý’QX“wt„�ÛÏêWw™Ûûo8î5ÇÝT\›á»îP>Í4¿Ï�]Àô70­â�–«£ýüŸ­ý?±ïöÿœäqñ¿sŠÿÙt@÷sq?÷sq?÷sq?÷sq?÷sq?÷»¬¸ß�€N�»ÓÏ8Û@Üг€Ú6L�ÑY@ìírôÝo�¾ühþïzÁæ7?O$ Y~×ßÍÿ‘´äÿ&�ãÿNò8þïœø¿p"z¯ôDt„Ÿ#üáç?Gø9Âo»4Gø9ÂÏ~îf_ÇÚç³ßìÛ´Ý&Ñæ&WOþ:Ÿh;€Öw¯â-–s6 ¹öÚñ` ¶Ò—Î^×WòÒ¨,ïà|�·âêß¼BPšÛŸxø½z“Ö7èÕÿ V«¬ríÉ>®¹8À÷f…¹G0°3Ϭr�þ3h"U\¡Ç¥`xË(^p¸Úäî=|\¢×ÒÒÒÒh€©rÝ„xÿ÷çŽÑ–Šh£¢Ž…†-…†[ð½3IKç�U?»‘‹ñJßvº�æ¾P´óoÆy.{µ4%Úäº1OÌe­â0lã–ºãC°MZ M6°õ^è>¡ëTºve²fI‰ˆbjîZîŒjÚÒˆtªïgµú{ ˜µÔ•€bàß]hàoI¨�Q+¦ñ²O艹æÓŠI]j»‚´(› Øæ�º¾oñÒÖJF×bÛÝ EÑät[”J@·Ð}î­À]EÄêÏÎèµèš ©kÊZð®T;Ùõ=§ögü´z-Ú%ˆA¯Emq_Ù\+0}à÷ƒÄ³EáÉ.ñ,«ÔÚÐŤ‡Ú¢A‚¬7 ã_PR�“´hâï„SWØLÒ¢XHp˜¤EaÒæ­5¡Ñf»ª€í7éI‹‚!t×ú³ì¥I‹b!á!èµ( m¡÷ïp·ø hxu½áéÐÆ,Nû-ÙÇUCâ�ff9hÕʳ^�¾éXq‹R!M¥âm=k�ÖP5]«oQ3$m­Þh€ÚÄìZu‹2"Y[Õòº5Õ±jÚ¢z¨ß­j½Jâ ®.žkoÑF´©�þѱÔuDÉFŸìÈ=éX|‹¢¡t 2­fNqS®5_W|Zô m꛵[³9¥‹¬¸Çžvº?Ž'Ka€êØp•µ»ýÄøÓeiÑp�ÇSðØ5ƒ1½6ôE#ª®©©Çµ¼ž²ô÷¥Ç‹_岬“qŒÚè×½ö‹ÜhÈT²ük|ö¯ÊĤg_=/w—Á›Ÿ°DèÊz£ÝÍј½rE©"1Ôk6îUt®:�PÝ0oJÇíÆ5>aâƒåâ<ð1A­ Ž­9-uí/Ê6¶YÒÌ»�RØ×Ëî­B èò™Íƒ•™òØF�´””nõR3-H|ÍF`ˆW˜­*b¬0Ê–Òø‘ ~ÁÆÙ¡]Î¥«±n&t‘aöRÕ“øe‚-ÅÇe¿á‡â`P&·öíúÞDðÈoÙdüwøh—ÿU±\®>JpsW‹r…Ü@[Wr½À/5kAiÚi>ï*j×ë[ÆâÆËóÛÅ|"¡ŒåÍV €¼Í¦ÒAN3zðw(¸4¤Ø¬¶ø�¼ h|a¸¬öf"ä¿Àè` í�˯á÷Eq{}S›.ób<[[cÅ¢”-(ɰÿÈ€l´þ“ÄAl¶~-§[ƒÀÖŽÞx¶4#…›n±ú ¥Œ-í×Vc-‰jQLÛúXƒÙ`S I¬‹•Unˆ§Kû¢žíü¯i¹Ž»ó¿�õ7ó¿Bâ»ü¯S<4M”J%�#êÇŠ‘( 4Í©Èxžp¥ÔçnŸ{î÷Ñó¿Ë± êhÉÿ„�‚æü'> ˆ›ÿ§x\þç9åî>hÄ3©An/¸K u©¡.5Ô¥†~©¡UöÏíba2m\ª¨KÝh¥K½”TÑ-õDê‰ôÔOÇÕ%—ÛR–ùõ Uc'ÍRݺµ»\-)»Ûç6ÖùIµ÷³w½³�th n•ƒ{ßgKΤ�ATçk~¦3 ËÓ)ËhÆ�k`!0)�0¯uP¡~råÈi©B"éw98Éc<à5à:�Œb˜àŸâÙ§Ï~WP€¡ó¾ 4S½ëpV‘×5š`Ú}Ÿ`0¿å�Ø €ãÕ)j©'·N1Ø®¡&²ºŠ¿Ø*´­>¥paŸÒjj½]ár¡gÂ�§%0¢2’+A³„ù9©Ê(!ã D¢?rÀQ ȱx�uLB'YëБé[ G¡IüƨËY ½Ñp82ËYKæGŠú�"©dœÓ4‹•ô•LrØHÜΖðKé§œj,Ú»bÆâhÆ Ó@ôgÈ@¨<¦>‰Âi”ËØ�d†Dú) aÜ¥AÑÞ•õ@t:]¤78CB ‘9 U’„"Kât…qôÍÚ3Ú÷^Ú.« Àn½ÙÁèÒz³6|v¢>Øú+fÐkFx“�0aÉ53­Ã{kâº!´æ»8iîI,xò¤i`šjÉs¯ËÞ<°Ùä¼f㺑³Òí”!}«Œý•Ia·ˆé�¦¥€êtÝ>À;˜WŸðÒtºskJçdmc“!ÌË•ž¬Çºƒu@“û¾t<œ;Jg«A6è³�H—«MaO�Ц€÷FÊ\gxóRÂÑ4Ò ì`  Ä]ĵ%B÷›&ÙjøÍR¦œõ…Vl×ÖQÐî�ÅâÃÈë© ð“§¼Ø9ÏÛ: xy8Ô˜¯‹€úTJòp¤;íg«$7}”#YZ;-úݘÞ,ë�eyݬµj´f9³Úþ¿õ ­wŸ¡†zRm:»¿ÐœÛstš=GÛùÿÇÌü7ÏÝùÿQœ[÷¿B]þÿ)—ÿ~ùÿ.õߥþ»Ô—úïRÿ]ê¿Kýo>.õߥþ»Ô—úïRÿ³©ÿŸ=ëÖÌã©EÐkyÇ ¤ï ¡³T ™¥>M#ž‹8ÊR–¦„³$ÍH=„~šlÿ{Íóï@#ºäþÎÉý±OC–òT$<ЏH²$Ë’„g”†Y”æüÜ’ƒv¤µwဴþ¾¸ ÉÚÌ”ŸFò(•±”‘$”HŸy(¹Î/ksÇ(´w¢oB_X† A§‘Œã„Š Ì%‰cŸ+BBÉX…<‰/bÚ;Ñ7•¿/,C† ~àG‚Á2F B¨�ÈÔÏ"š'�Ò ÐDí]è�Äß•Az(„¹¦ü”s•Ê4"™’9OB©Üh~þ“ ½ýÒ÷û‚2h—$‰‚q̓ˆ& åF™HR•©ä&xŸzÚ;Ñ/q¿/(÷’ˆÝÉ–‹� FÁ Ï@ZˆÉP2%aÊ*“Ã6ÁôvâÔgI™å ôFÆ“Œ‚S@SÅNÓ`Ãu”V€x´ƒÔÈÔï }a2C‰J̓\di”&9WЦ±ˆóTÒ”gñaæ2/ŠÉ©àoïÀô/lù¢˜ºšuÜÿÚ‘!è‡*K‰qæ~ÀÿXF2IýD\h"œýö”èÛò»í`è Ë �¯L¥‘ϘŒIÁQAƒuÊE¥4VáÙA{p®T·­®=Ñ$ü~šÄQâ§Ô�'”Ç24¥4M4ãì‘oï"ÿ=fdö’þž¸ òQÀiàË€Æ4e4ü¦�“4LqöcÐÞƒW¬ßô…e�§®À ã&Ë¥`à(ÁMsPu1,úY~öCÐÞ‚7Å_ÙxÕÍIï‰È õŸI!"¦â”2Î"4]šNXìy.Î_ µw@£;}wƒ;ËnË@OTY ! "Xë£Xú’)”Ä`ù”d\d`�¶vGàß0 %ón&hOH†À“Ì" >†�ÂÏC.éçÌW~®˜T‡¹è§„¿½ÿO2¿f³c²¼'(ƒNš Iû’Kðô|éÃŒóßÏsÎ) ;ÌÉ>å´wàí ë*þ}dù"¢àÞi¬(ü£|¥ÜO(Ó_ UœÔjí€ñÀ&6_v´~zb2ÿ$óU˜¥B¥±äqê§,ËU”c}'‡Q´'Å¿µˆÿûÙjÜQúû"2è´!ƈ &4à¡ `’Q®8�ña¢§!øð( ˜â"NÀèc8Õ`@9óc™Ä,) ¾·â´øDžœâk‡iZ¶­3É×ú!ÃÌó Ëiº4É™'±/àG.RH‘‡¹ý‡™ò”'*”H’ J}©ID,¥Bk3+‡ù¥ÉÂc<»>ù`·ƒ5m¶°ó�÷†A3;’‹0 ò0 Bå§Q’g±ª�1KÙÛ» wþ€a�îgˆõÄe�iMó8Ê$ÍÓˆBé2É¡1Ìí\+B/# ¢½Sp.ßÚ}1ݬ랸 "eÅ‘Œs"H £îû ã4¤Iœ©8‰˃8휧6÷vŽÜ.Ãkàøå�"�°÷Ùn|/ÃÄë3 r�Îq~\ä±YÒšÎæ¨’K=1«CæÒyc|þ‡euàÞ>Äȫ턷Á0DwýÙë®m‘¥æ;Ç^ùÞïø±Ö|žsEÔä,Ïù§ñlšRsÎÍ*à¨�–»õ=éãäý£ˆg‡d—óĵLè9¤³â#8p²·'®œ)šµ�ã!Z:ЄjÏG9OT«¤›ãéÑÂ9 Ðù%ç h-�æhRº(ˆi‡¬‘óÄ´ÌŒ9 K]àÀå¾= á<Ñ,3-ކæ­.°Dϵp~ãá�ø%}V3[~П }‚Œæçõ‹ù­fÇÕqVšWõRí³3å]¡Á¡Tbź”§ðõÁ°Ã¦ª "×Ü·sŒê»Ó‘�®-çRŒÕÿ³÷æímÉÞèüÍOÑ£¼ïXöH±’´cß«ÈKtâí±ä“ÌÍÉ£`iHˆI‚C€¶5“ùî·ªlÑI-É�ž™X"�îêêêªêêª_‡ì€½%¨Í6H˜ùMàÆ9O•SXÌ>Ú¥^4V8 I?l Òyâ>ž‚ìúÿìÏ ýÊ06Ü ÃqB ~êx‹ˆÈ&^¼:}÷öâôíËwø:�ÅËEq°_®À¦Î(‚Ç9‹ëÛ»U 8Ç=µ±¤ àoÜw.ßÿ»ä¸ÝG…[JæÛ’Éìî–ÝÂuȽ¸7`¨¯î²€�/ Èáÿ¯5ŽÛbÌ×ãÿë/ãÿšÕáÿ߯O‡ÿŸðÿW½Èî€î€î€î€îÉšî€î€î€î€î€î€î€?Õñr:u×{,lÇÅ웪zPÝyV^…Ökîh´Íòoü"�ò)Â*¶þÚ�ÌNÀõ#pùBUÈM<ôǃ×/Åm;Ža¾h–9lSë�Ò�>6èÐ3ïþÔ¹®Ÿõch�6Ý–-Û”Ç�c9þpdXæ@ÃÜØÁhly¦9ôµ¡indu3åÞ5“ E;¸é¶\Ùªà~ìб«k†áži9Ë0GÞ˜ŽMÝ m3,Ï[Ÿõ(ÚáM·åÊVpztìÑ�á�l×rì�x–=ê�a›¾6 5¤Ã×o´eÌ–“à›öÀ5°Æ¦Ý¦Á@é#è˳ }3ì�[_êQ´½£-_¶™ƒÁÀÔ°Ú@Óž7tƒ1®DÇŽL}´ªç­Ï�zm/àhË—?ðDÙ¾,†žÎ]ú¯îLþ¨Åæ œš{�ƲŽß�jó~Ë=gòý/7oà–ÜK­±ÛäÌ[K2là�ÜW‘þ#e6p2î=›ïSšá­¥Ém´ëå6N”û“þ°ü?,¼†1™E ÜIÖ_öSŸÿgYšYÎÿ³lÓèòÿnã§Ëÿ»ùäôíÙùñë×]ª_—ê×¥úu©~]ªß]¤ú­OÑÛ.õ¯KõëRýV¨ìRýþ(©~]¶Z—­Ö*ÍLzódó”²µgk‹4ΠÃÀÌÔKØÀÉJøüÆ^À«X�˜RâÒIô¥ßë�à®ÿr¹gq�؆ôUÿôzïæ|‹F^R‡Ù§ÇÀšÃC?ŒÑí8|ùâøüã‡bf„'*“Ñä—û1N´ƒ+…Îò¯=�EYsÅ�~züáÕ/d¥�Ÿáã§×4þ%ÿN –¶{‹%@ a‚�'Xb.%a} uøþ$ï1ùuê|¢ä¿ŸjFRl§I ƒR “ÐM¢hrˆ3Æ>áÂÙŸ¢º$.øÙŸÐ'ƒ™¢Þz\l#�Ó9)r¸»Xz'çл¢¼öÞq²œ-¨]ÎÂÁâ”Ü::_ͽßç—áï sf—¿;<åL}ö×òg‘û9ggF¼Âz`xŒùlg:ç¬`w3Ä�šæ8H8#ÿçýñù÷äg ö—~6–ËÙòÎ~@?¾‰™©“ŒàQL^½ýHàÙ©a Å×ñ"Š’§ÏO?ð†¸!á2!µINlð%  ¯!~_€—H:€*æý JNž@¢þCPÍgч€/9KB�:û.Àøc×°ñ Q.A„öáM¢“°Ö/^¾ûpñÝÇÓ×ϳ‡H‚ L†Gq¹ÑBû—}ìõ:ZäµÇõ>�ä ‹@å%h'à Lr_ÁXâ-¢8–òÓËSLjÆâ� ääEð �Lðß““�4ñú(=ùK ÌMü2u`'+A`€>4“~ª�N~úi};ÿ{‹–^‡k[#‹±J2¶ipýe{-ÆùþýË×ǯÎÖ6¹ÿÎE- ¶‡ää‡s?_D¸AE5q.ã5Í”šb‚rxŠyäÒüúá3À¥ø\9Ÿ©ˆ.Ä\0f*Á™ï,üRkð*E-M*Ä‘Õ�+' ucࢠh*/ŠÆ^Ö7U%ª]‘ E{¯Ÿ×·‡GE+B'¾Æ™ÍVšæRƒlÒ3ýWžöÒDçšCbO¿«£T¶ º~ú›!^Ñt5Ä—š:œˆ¾¡Ák)`'•Ò$–\*�Õâ–1z…© îUñ«Dmî5d–$ªŠB…`+M´ÅA½"(�E©ÔŠà§Ÿª—jn¦Ä¯^Í\‰×®Ñ¬©—¹I_»šÙ²­Y¢¹ærBT½’ù ä$1Ïq>¶ôûò„ôzcæÒÀs>"IXÀ†Ÿ;WQÏ“)LîÅM�÷¼Á ¿¢“y/LøMY³¼'�ƺ»„�2wm S‡ÛíøHBµÅ੼ŸP'ÆK çø8±Çô8ÁðNï4ï(Ÿæö§ëöž¸ûÄk X ‰ìŸ<$Úxlà-ö_›ýw|@ôÁ`Àþ«±ÿêì¿&û¯uЃÿÚì÷!ûïˆýwL^.`[|ÉØWÀ´ÁÞŽÑvÄy@0λ!â’ñvIX�´”ûfæÌbö€s x,üt2�|„{ä­õ°õ9]LÃÃî¸0f×dJýp9MßXD×Î$¹ÆIø"fwÅØ{àðÁÜ22X·òïåà«‹ÏÔï£ï-HÂcŸ(0³†ñAOöƒé„®ðŽ. 6k> ö;'†mQ~ŠzOW~O¾Ã³‹Éõ]¡—'BL~í¥R÷„à.™ÿWn’`i ,}ê@ªs›xª°Oèó-Eš5Ó›¢`ù25¹ç@~ˆhÈô@ýðâøù›DÒ,§blDbs2EZè—ùãâÏXN {¨÷«ˆóˆVA*ÒÐÇt>¡Ì'Æ‘Èt.:I3†¨ßã>º tÂ'DlÌÁùïpMz"´®Ü:q èITÀpr �À*„Ö°B�ྠÝpyæöw?éXĽyÊ<°ƒè!�<êâs]úëá!ûêßZx§!ÆEîðäÁC¾õŒÁ÷Àé§iT&5D‘£1<ÇÂ0.>v $9�f uÜ�°|(›ùY G ßJ éx^ˆ £螨¼h�‘ÉåCð‡;„3ÊA°AO,gËxé0=7ã¦SLA^Èœ[ÙdqÝc&›mÄQ‡_E_ «ÍC�JXñB¡‘…è ~�rÀÜ:`ÄÈÁ‚ .¤LÚãºF[ª=cöÎà TŠOräé ÏèWŒö1¢ûé°Q'/cytÀ˜#„2éÅLÁFá,)IDv$/§›ò£Ù4`36+Ÿ(�°� .V‘û¤€a-œdz)/ûÀ®¾ã=`‘™ÜGá )ŒÓ‹Dù²êåy좎>R*ÆÎ2‰ð™0ÞÈ9.u¾2/Éæp言„• ¢…ùäürðpfœ<Ì0è�„å:L‡ÇH9ôp]¥\°-Œã ZúñÈÏT`NäDãU<áK¿¹ûq=§Ü÷ÏÛú¼c,Ê5Á¤Æ¿ ’ÓMȇålVR'„GÈYäÊ9ÆÜDB~ÄQýáãL}Îaá&"fÈ$hŠVÍZÚ”c憺“FW¤ÁÈ9PĨÐûˆ›Eó¬Y…ìI£Od$—9>é[¼Qö.*hô§b: …ÖAÍä!…¨08Á…Î'õb¶B~[ÆÉ!úD`ÒfÂ!B�ö]uF�™§<󭀊̃¢™CÏV�Æ/Âe†‹o[)¦03vÓ™l…ÃôC«(ø`;’èËŒkGŒaŠü"ÞNêr0ßUD&¥ p}Á§Ùgäð:1»îâr9q¼L¼äê!BÓÃ4Pq�ó+Ô‰ô+õ–‰4H ¯ ‚^ FYk'N´—›?0Ü@vq Ñ;MäÄ� ±ã�l®ä¤e.p_åLH6mrÓ$"ÌAOœÅ%E‘Æâ°ŒÏtÍ B?[Iîyd–ä5ã˜`æ÷„~ —/PÁ9·ÀÔF˜ÑF¡3v šÁHtœM_ádׯ„&òuáÁM®Ÿí>SÌQ‘Ih©flbóÊBB eR¼\Ì™®ÉTHú¨+ø’3C…{qŸ#ë‘7Ûf£(I¦Ó}ðg#"½ªŠÏÜÖŽCÐ\RæTá. M<¾r·xX&Üfd�õ¥éº`:â9t¨PÍÒÅ!\Ì-3N1à Oø:âþ—”0²™fö1BÁÆ2ÎŒ-»ß$aV‘¹°,$ƒ^7M$9ànÂþœùGsR5ŠË|øjH SŽ�ž3ôw3òÆñÞ�‘Ÿˆ6è[Œ}˜$,w=9¡›Bì½W˜~œ¦•AGLå’âí03¦±8Éh…Þ¨tÜ(:“½Ôß:Æ}90ä êìbÓhùášòÝ‹p¢¸w ¢ËÂFÇ4ÕÅ lèW<Ô‹ùa!‘)kõ×ÿóoÎÐÿÀ³h,FP3íŽ�£LÚÁ±Ç)q€^á(JÌ�äuO §8*âÖת< dz!l Ò“É,ð8� C<ìe%c"ú(:,¬Œôä—æ-0ƒÃ��²Š‚ü#ݰïYÀnvv½zÇ�ezn„ç¯A©¼>¾ÚÀ¬2îaŸy÷ÃKæ>§ö¯¤ Žw.r[=4q¾ÚeÌTu”;h <Ö+ìk>2�(°¸Šp®?G“Ïéàø±svÄŸ.×g5õ ÎúábPRé=¡3ެ]˜�þ:J_Òâ]E_“é3Ù mlEL&½BÐ8·�Ée&¤2T)ɽœ$£û†‘ÉlmåÞN“#å¡_^ÇõÐIáá³5k„ivæâƒz|‹ÖV²„Ù\ZÁÍEi~yúé‚2.ˆ3v`Ðæ†ÁLå™h:ArÊr{ŒŒgéSÅ`só«â â`Ü§âøŒe²Î¢TšDtñ{¹Nø‘ |Œx[".½ÅI8 “œ°ŠRqÐ�l^V¬ÙT°}þ\‹´ºæ÷ÓI÷¶ \šK‘ž¯ÀÇ=Ë–qÁ‘¿æÉó¹ƒ \?~Íò`îÐógçÌHÎòEЫ^D<^· Ы…AƒoSù ßT³œ¨°,™ É(ÌCx”¥hÓzè¥A ¹1Ȧ˜1‘ͳ¿ÀÄ„&  ¾›å4>(/ÿ³XS.{ˆ9žX¥°:­a/©�>7cù¼1ë±)g‚–;Cæ+5Ùâ]³@{¥�'®Å~E¹Éªï*OUó^ŽÈ;ŠÓð'Ûk±«9S¿Fæ’Ë(#?Æ�ñR„ÔÑĬõ€ý&ƒúlf3O“”<Í^ÞÓd]•Ý3ŒÅg_ò柞}|‰_ö³€XfÞ0û Ix†³‰å™üÞ­Wpý¸s+ fÐIòx²AîTž•—³Îñt7Í{¨"!_R��ºÓüs  h°“ á¬a’¾s6€c²/îO„ׂ‘3¶¹}ÈO/;rf¹Bd*ˆ@ c„g ªrü§=)iŒؽdaYUÐsP<>`Ÿ%ªáËžãoÈíNæ3_K7?“áþsØœ=Hzù8R9Ì#‡üz(:‰¹·‹ú€}œ*ê/˜Ëm>coEÆXz?÷wÃI˜\�p1Å@–@!7y„B¤¾‰S¦-]¡p…›…Âò„7èUm=@?šïLrYÓpN1Ì6Ö…¨8,¹Ìœó„‘´¦ë ?9^×}U±Wuÿbô ;àB~ŸÚ<÷Y·ñÕüýûÃ�?zÍ¥ qüöìT|Ì�HøÖ EïäD>”j´ƒô#w¥ò•¹ÆéfcÖK�|Än,×#².”ƒ1“cØ.=¿øéÝûo/ÎÞ}üpòâ©5ìõX>;‰tRigFä 5à Å!wz8rõ Æ„Ê�±&�¬½;{y¤§ÿ©ïôÉùbi›Â͉qºC[e£ÇÊîA,ØÉ¬'LRý‚0ý+LL}�Báðtƒóü^{ùɧ2[Ž�Ä8qÏacq˜<—N©™´¿ÜiÈM ¦ô`fÏ:öÖ²±îEÂÉÞ“ì;‹@1lÍÓg0HÅ#(KÏ}î);6žñ�_1¨›F|WÒC°’ô3nb‰Kô´'ÂÂ>I£aÌ›±­WO(†4º€ÎÓg árj0zÄr.ÓðO¦IIí‰<`#_8ÿ½È7“.1'ü´Da9¾YhXlfølÕùq˯Gn%G8GÀ«L»-D›x¦a‹VµzÒxT¾³^ï,ÛÉcSܱ4�šé+/(³Ü.å #Í|)0O–FÖ«°P3y·�SSÜù ß4wÖOYº\!~ßc†�Y ÉGn%x-^)¥¹Ç¾ØZ±·˜‰¹À“›‹Bh,^µÁiŠ,Šh™ä «H rdB‰ÆÏ0‘ƒçÙ§HN: Ö?¼ ¹ß€±% Ó>E,iˆqI R@CæPcÌ�Ç8nŒôj¸æïñ†ã%ž0ÁDÄË™ 2Ë¢JÐH4C®ó¹}¹±9tê¥Øœ¼ÿxxòîÍûã·ÿ8<ûÇÙù‹7½÷¶ø_Œæú³@H l0ÛÈ6Þ�ñxñáí‹×‡ð'óDrt!/4^º²Dƒ(ŽÑàÈ8´Î¶²"E0µ×+¼2õ”ÞyÎB_Y³sÅ�¤JëÉÄHv^[ž›B %®á 690­™–Ç}£8aÍU(²|1|MäœËUš¹ëü„[L4ºO ¡ îòÜ�cóžŒû³c(™J& ”I~Ð×…,˜Lé<àR+3+â´ âôä~.ÀL#ù©�|"?¦¼Ã×Û»Šâd/}Žì‡}Ú}²�:ж—�Ræj>`h,Ë•­]±2¦Ù¸Ø4çÖ©‚õÄuõœÛÛU'§Š%*•:š]=ÚäÙºŠÈ<ä4�;ÆzâBÖt)£x øbNpEŸY¤ŠïONN žÁÌÓ –#η½¿ŠHj¿p´0‰"q¶ú+ßÞ1Z� ýs}D¿†,‡ E¿'Ÿ¦‰·þYÜ´/²ý+òŒ©¤“wo_ž¾º8;=A­JFHËÀd´N¸Dœ_üȸwŒÅè?NhªØ�#ñïÂë½Õ´€uîmúëˆ×óÒ—Êdî–Ì •Ÿåú!G+f<#^r[Ãr�—³¬À„'ÉbºœD1 æÍÇ`HB¦ê˜"íe‚"¬ë–�æ§n3GyàŠ�Á(e‰*Ó4Ÿº�¶�˜D í×ÿ>þð”Ññ Í]ãˆgÞ‰Ž¾ÏÑ¥çõz"LÈ Ãü _=VW¸²ì‰œ·¼¿œ1ô ž×™ÛêÈøòÜaÀG„öO–&ãUAèñRïjþsII1pÅ–�æï_`ýŒ¿DáíáÎCä6‹J–�°ëŸˆ Ãì|‚§k>)nšáãÌOÍf®ƒ§Œ+®_‘ì·+îÖüéì³XWk|1Öqþ�,è°fçÅ7ÛÉ"š°­v˜ô0· ­°ôW™œôëáÕ>¦÷èÛàòá·¦±b¡Ü¡NÖj!ÄSKX2¼hó)óX¤¡KØE}¦ëûÉw°ä³Zª•z ’«ûÕA¼c¹3`GkqÖn,³þXÞ��·ˆà@lêÙ ÊH®n,—xÉŠãf‰,º›ñA©,8WÄ.Yòß&`gâKdC*ž²H Í�,­k‘ÌÊHy rU-/O_¿Ͼ˜q. $‹Í¸ÏêZò‰r>x‚9 [üÉÂñC™ì\*¨@]OJ Ì%åȧŸ�fKžˆ™¦!rH^#ˆf-Šb¬ºáOBG˜Âõõ:¼‰.CÊ¥Ž^ð׊fžóÂ9æ½g¹üÂwÁžÑ„þŸKY* ìÙYV–`örΚؚ˜áM#YÜhAù>–ðÊ×ü¨÷Q(@ÉɌߴs¶¡á‡Ú.Ǿš=䉞0åäÏ¢CîÛ¡@̤µ!|-¤JšÏ?ßëŨÄ! {—Ÿ”^‹ Ïå÷‹Zœ§b{E'‡çyâPx6ñ—Ч¬+ßäðx~@®•B~@1òÛ#`ï3øÕá­w?÷ï‡á¿¿}ñãÙŽ1ßó?õøïº¥eüwc`uøï·òÓá¿ß'ü÷׫âøÀ+fÉ[ú%î@à;ø¾�ï@à;ø¾�ï@à;øþ&@àsç|ü«TûÁìo&ân¾ÜwÀ¨5—Gç펃?ž°óâ´tFlNâT;Kq[Šß):}Å^ã ꯴gÕ7P¾y÷üãk`Éÿw~úî­¸mò ð3“þ%ïrÖØ-�ç"b¸È߬˜¦ažb˜Þ�7,.è—"ëÍøñ¢(Cá9ߘþ‡âœÎÇ8¼@VÁ­,Ї]~xÉÓ©gi�MØûwoÞë,O¨LVÏ5b*êBxtkb0ŒÈÊÞp™\E˜ ÏÁ“x+ô뜂ç7óhzF˜ÑâM¶´°òLpòHe±\h–ùÁ{÷ó+´åe’›ùN|õD„óÁCÝÅs{œt¬„ÁWááà¢_¬‘y(Ð{©!�J=žéö¥ü%ì–óúB›æI¡Þ¤ô<È>^y8™ûÏâ§«�:ñ§ªgñãʇ—0hZÙ~ömáî̵býúôígç/Þ ‘Æ¿ þ�J³TvËðœÈ”⌅ñ…’íE%+©Â£jÇÿ쀈±\)‘¾1‹»å³¿ðR|GœN†¦s�ÜÇú Q¶�g84—UúeR+°wJ—0¹ +\VÅ» ©ØDriÀêY5Ÿ¾/®o'2µ.íEâWy‰w�ð ³Ë>ϵœd«Lp‘ý^Ð| ".Ê"p<‰˜ËŠÍ Z"pH¾“½Ò'Ç“IªGÒc4œ�ã÷§À)x‰7ÂúºàÓ�ÂéH´¼÷–•_ÐQëTYƒ9Ц_\LB÷btÅ­aºøé^†Ò™î9“bg±<ÞåOÉg¼ah—_òÚˆ±ïÅ”]Àü}ʳ¹øÍ*Ó‹ßï?dé6,WÍÉ :�ÛÎârÉ�à³ò>VÞÂO\ó·îbØ$Åœã‰ó}^níàY9oAfÔs¾9 «:�Ó}¯¦�ðú,X\S<'“Çq²3qZÄ’¸ylÄdýJä·åÒLòýb EƱ„ ~�—´í)ÌùÏúžÁH/D·ß±OpV.O,�£ù’µqⲉ,š{š"eÇŒe \,Í#Kùá¢<\¬ö*x™/7cy²_°¦HŽV"Œ0İhÍŒ (¶\²nR:DËêôeŽ- ¸ª^ʱÉ¿¤ÉÅÔù*Û/`ñåOCó2Åç­>XÒL)ðAv/s´à£®e�P’yyX¿Š#Ÿ?;�Ihžìí2¨¥ªQ ¿²pæsŒÄ‹5Næ�^üôÓO?I¦ˆa¥od¶ MGJ‘r ¤kÉ@Œ2 2„È1%Ž$æR¸RG†�mûá•>x–ÓˆG¡,å{]yã óy$èÏd™ &q³1W_`ü°±ù˜ÛÊT37¦‚ÞtüùÞDž/º}<‹q= µe_ÉK¸Ó5‘GhU¨Q6+àÝ)ÿLæi %1y3%TPq©~ÄkºSáÞÊDÏ©'ÌoÄ™ap~ â‚•^  V.y• pæ-¥º&+U蓼óÁÏÓÍZ.BI‰#úC,8Ô¡Uú%׃X`9'.â0D@¹¾p3§,SíØše‰‰Ø&q‘q`§/i–™)çXÊDšEÆl‡ e5ŽÒIvägi6aºÖ“¼<È-lÆØ”ôÔƒ(ri~åù0�‚œ‡9|—ˆõæáE@.‚8s´DA‹�}daj㸠�‰�Ò]È”%¶‰\\–0¿r”öÅÒ�䜰à4G‹ˆEÞ<ÿ v—Áqü°ŒB/˜>¥–ì @èr¶dpç �ðÍΫ|íO\ì�O¶•2qAä­%§ß½‘ ÅG�'}’©EñnZbUŽ3�=ÛÊ{Ü6g~˜ �¯€|QNVœ�“-ÍzF6w­(ß.f¤Eâ.A Äé&-?[EÍñ0;:¯?2÷!ä��UÉVé—óã³Nß¾êå6"˜YÀôfz–>�Š3ƒo�àWö·Ñð?¤S›”[`{åPD#P9Oxh,Ö¨à…ÃÊw¿0s�ü�bmbJ´§©³L©_ÊÚ9^1Àk qzenGòÅé�2^¦u8ñ5pbÍþ;­3„-ér�H ~áN›·$aKl±œ3Ê iºÀ™’m3@\†œZ SMinÑîKxx±ÕÇ]p±œ×ÃTHª©¦«W¨Öl×ç6Ü[ÀI¼àžæß_¤á„ÂwxJƒZƒi6îâxÑÂÏ­e¶—åìÄ%�uҲ⒗grÜ3¶¯"§’ÊðhJ[¸|óìΣ !P�ÇE†íbX¦8^æF‹¢”£ŠÍ^VÙÀ2ÂfžHµf“*‹@ÜÜs!wÒϘ)ó”Z rÎöÿ¾Ø§‚+Åf ß]Ã�mKDGZÞ$ 806[ãnËÙ ­ u)Ü $*â¥P"¡¯Ÿrâô{¶:™pðéLØË´Ø_¤ž9>Ö·B3Yº¾èZ¦ª/01åÜÏ„£bP,¸•¶&× cIn‡&šÏ¡’}¦±¢‰�_qw˜~a=ä•üЕâ™)¼»`v)pNÄ̤ª&I›(S¬×•%ÙçXq…j DÀ¦"¶œ¿œN¯÷¤.VহëlêÌÞc•�«Ìó¸¢Î%F2•c´¥bðâLª?e@5òËvI̲]…—Wb™”JC�xŒ·!L~1^v]ƒu£J‘³+†%õÐË:uÅfõeÌ ´ÞãoÝf�½ïQ¦¢ÞÄÙðp%¿Ààÿáwrø}n%[®ãP8IÒ:…2Nº'ZÄÃdè|‰×@Òì_ä;°¶>y]-ÈÉÕ}q˜¶‹–ÓÉðÃ&äy¸øDμ«ièOx¶ôK: ¿’£I )=�=&ï‘×G~Û@Â)‚^þˆ°WÑœ]bÊepÿôGÐk°±zýöäì€|Ž&}bkìæó>ÑcM×d£Ïß�>F´>m0�‡£CãÐ6õCxZŽ/ƪÀJŠ}‡µhQpÁ3~YQ,C,ùgX5Ï ø1m1F(ÃQN½äö0j�{[nå%!±H]åx,¹šæô’Šl�òm{°p¿�Cöã*ce« œé¤´CÐ *qXÁ‰ƒÙÓtgÀw”áºÏr¡˜²=Àçè,fM0¨S£Ä•oºÍà÷!x)sRÏšé?Þ? EÄj¢‰8¾ÕöxtâØ÷Kµ>úXà2ñ?£@À×gÌO÷üÛóWÝËKùFBC°k‘0è /9ï•¿d¡]ý(Ù“�]\\pC}úöäõÇç/ào‘g¼:žLØø!BFoî· Õsst‹¾LMÏí¤©M!DÒË%XPôä>¿+ìEºéELEÙÀCXª¹Ò÷|Á4£'»(‹½,ÛÌ_ˆ˜G¦‘.œÜ#ft24¶Ì≡õ³S€,£¦T™qI.FááâÝ]ÅÍv~EÊX[Öj)*aéWä—u“qšä¨Ë¿ëôØ?ýËÿ~ñÓñ›÷¯_ÜT x}þ·6[Îÿ6àñ.ÿû~ºüïû”ÿý‚·#âí¿»Äï.ñ»Küî¿»Äï.ñ»Küî¿»Äï.ñ»KüÞ:ñ;¿É¸�Œož*˜!T`8“£L`S@c�ç|$bœ"Åþ¤³é¼x¼žb™}qÛ5áUÑPßëe¿ð»¼çY†I9�éÅÕ… ~»�Œ-ˆ„˜[�àáLòËÓÒ�Ò›9Ò'|ÆÏáâ•È¥Hàf‡'"<�¹ (ø.¶í‚nH£ØÇY SŒOž«…“É2;ê“—We¨¯dª6� E÷å½ë>ËÜÚt¢ 3U˜ªò\uÐ7eñ?5‹²áW6!¾JÖ¢\J1è¿þ6§§oÏÎá?§ç½Ògß½xuúv…²üǯÏ_¼}^ûHÍ÷oßá>¾yñ¶Ü·ø0ÐGvÕNþe–Î+@ø] Y‰A�¤`é”< ›–µˆü6Æ|íîºaiu4+Ùæ}¯Þn„xݲzˆ‘ÅUæ‘ ;£OGøíQ¿ßg1d¬ì`ãX˜+b™:‹O2t=œõò3±xØuÝ+8ÇÅ$ˆˆ¬Œà—:‡I[£‰»g«U™XõÂnZBh ^è[|I^»™ÕKªòs^Íöâwre—*ö˜Š‚sÑ…6(kˆ,±?e+[ º4ùBélC²èWD‚^�h!¯ò’�þ>y_õ˜(_, ¤å\ެ›’5½ a—0˜ôåŠ%vÿiz7O•yÉ'owД—áeu3¹~�½W¬ÖƒTcÙpUÛEàï:F{“?,þ� 5§o_ÝQþïP¬à?ö°‹ÿ߯Oÿ¿Oñÿ×â(˜A¼ÉÕøñ»ÿºS€î ;èNºS€î ;èNºS€î ;èN¶Ç‚®ßwÜØY -çå@#FQKeQà—"údwÈåÑò‰»&H‘ž!¶sf঒nÏ$œ9Çã,ÊWÄ—°]K�¢Í0e¿q4J�±a:£¡O­À5¨fº. Fú0ð�éñCýâw#"n¹ÿ%î �Ü´7Ëõ‘ mW­±5†õmu×ÀN {{E¬Yê�…c[wj›–9p©9 šç¹ºcF&üŸÚ®¥ =ÇÌwÊó˜/ĵ�¼ß2Dçyz�&‹…g‚DRÐìS†û™“¡>yÎq™¤ 1«dBùœ10o±Î$€TÈÁ§Päo~‚³¿gB\SHáôi†,ú�ä †å‘[þŽc�–Å8R³Bösg69ôHý‚m…rŠ'¢ïK‹Aâ›ÇïÊP=²Ã‚ºüòÿK~åS..)%9›þÊQUÜßâ hÙcº;ù=ï˜ü¨Í•w9ÿ‹êšÃ·W†’m}O³¦ºSŸâ]›ãAËÙU$Ò½ñ�Í@æ-Í¢”/]ëò õ•Ÿœ,Š=’|”{Ô²�ô‡rS¹˜Vc ®òd²‚Ül.†•‡§ñho2¥-º5ô§Ïä/:Pil1h€)»Ãë¥+O»CŒI|wXðV U–+±6¹­úùð��v²;´ó‹êcú%Ë(RØ÷¾Š)ÏAÜ‹ÎßB9‘ŒÂÚªoï&â·Ís‚91O¹eftáì ¡ú?0¸nvÙ�¼–»£~‚V¨ïQ£RnCê[MÀŽ»û½ÿw¤Hü©XþÇÉùÉÅÙù‡›JQ䘃Õü�a—ÿq;?]þÇ}Êÿ€…xxÆnÇ"Ï)lsá—.ç£Ëùèr>ºœ�.ç£Ëùèr>ºœ�.ç£Ëùèr>ºœ�­s>*ö7’çqÂã·çᔲ±~MÈ>ôþ�ð‹€E�gávÍ,l�ÜÜm·ü&�,DÖ×á‘â >¦0wX�¿ƒÎðø°ðÖ'/ú—}~^–¡Q ÆÊx¸¸0Û~Ä%oDƻêD€_�ÂOØ/¸wq�}W\,®ec÷Æ" ¦psOv 9?ò’<ÜÌD4GX=ÇjÌây4cÓ*.þè÷û25@P‚í³¼–†±>ý`‘#<ËCð�QàÑñh`Œ,×÷lk§ÜÀRÜ-ÃN؃¥8-ÀU‹3\n‘¦-¾v*lvK»¸¤Š;òæDy÷Ò\ä8Hά2Øùv9=—W#9g4ÁÒY–úu¾rµñ2wµ²¼µŽeK€']!›ªb›3üo©±•—Þ¡²ÃûgŠoFücåë¨0I¥á,äçÊÎÄ Ž¥äÅŽÊ÷O¢ÉÄ™Çå÷=ñqéýŠ®HN[Pâ{Ê’X9'䀄}ÚÉ)xã´—ŠÌx!9§ü=ªT1iœšTü#Z²cy‹Qª�nW©²»±Y }¦š8 i9arU½y›�{¡“r™0<°ùéZ‡+ЦÖÔ¯vÒ•8wçwÿËØùßdzãW7vû“êüO75Ý.ŸÿiFwþw+?Ýùß}:ÿûΉC�°Õîܯ;÷ëÎýºs¿îܯ;÷ëÎýºs¿îܯ;÷ëÎýºs¿­Ïýr{Œ›¹ý)­PsfÅz Y‡±Èt®�ö€Pˆ…YÙ,&3g•í10È*w.Ç‘ÏKeÝaÌ«[EÑ®sé00ÖRôv±œa©L¡R——Z^³©‘¡d,ØÅznVg䬥#Áûxô'Q«¤!�®§,µ¯=�Ëä꛳�oÞøÇÞ3ñ {�þ, »Ó‡­h8‰VV n];Y,š gŒ?ƒVÂ_~éõ­ü¾+ž¤šGЧG°qÆú¯Õ7õz?Ãáïðßñþëáÿÿþw,ký¿þ…œñJ°4p]B£STZJ%‚øÜ~ó#Ñž(ûàœ(!Vª�Ö:âA«Ò[&¨½´Mxø,æÞuP른¥Ø ãH¼ ‚ð+ p:ú|8 J±*lZ3Þ†ÇÄ)b"ÎSaÊM²�ã¬>ç§Ƹ÷c'Ä~x9ýùqzÌøûå"ZÎ~Π…_`ÅþòóßåsøWqžó–Öaðòª`ùz|ìíåÊ1Ó^cLF`=óŒ‰Üçx¸—ö/¿äŠkaYaÂ*¶d!_‡¢’X€§ ™Í¤¡±cDõÈ ¥Yž|žP _š Xd>èâ�ñCübSa,:CÀ‰Ç+éÇwE4 dÄ�OÐ)„…úe)_-ýÌ &¦LXT ^Ë7ÃóÄ-…âÝœ¼•i–e’ÐHZbËŠYÓ²LÍ1Ÿ…‰Ò[½ÀåEû— ”0âíÉë�Ï_Àß$œ‚}a8ÀJ'@W¸dp³‚`Qf÷sZZbŒ¨i”¾B>M‡½…uŽÕ¯¬”Ar‹ÔÃ:ÛT£«ˆ ¥VªÐÒ»eR|µ®ÔU�´E°ì9®8pdÓÈï …eKÆ+A<ÍŸìW™Jf.…æHו4›Õ�T(›•Õ°ºÎ�=„¼NÑØ¢Cyà€­ ½äxá`óœ þ>uÀIY<@ixL–ñ~Ãz™PüMd<ÀUÿ=Âø�LÙʵÏËiÙŠcdA ×3슉³O€â6{Êý<ñpâÄŸÈBo,F]££ð¹\·¨cxžW�I�ù�øxáyÞyu›ÐœWªËW².p Q0lxè]­SyãB“ ZùŠzþúôìü'ü�n¼E$óÝz¼";ŸE’â“UjÙ 3§Î'*%ònø¡{LØ¡8(€ï®¡y™Î&�ÓJì�,ûšat¤hÑ:‚H š‘÷¼Y÷¨�8Ë’yYG#«8ç�?ð¢ùu8ÛgW–Â+ð žì?|À¼éÙuJDÞ� ;ͼ>-Á#ƒ¬<8RÁ0Ù€‰–wNü�q” +Š%5#@×Ðß+„ºŠ9A Ï »lSc ùC°ÛéV†]õ 6+N(èf“Ø¡>^€û9IT6ÃQHÝŠ'§à¡N0<_DmÈ#1¬ú]Un3WSô÷O˜Ø 'îá�XÃåéÈ,³a¤ÛLj‚‘°¸º3AÍȉp{¤À€8sC³†ä¨XVÑ4uéaŒÌØMÇÀuƒ�¢‚±f ªð§Ö4 ­H°é´Iô^/0w2–ƒ®yê¸0Îßyâw~ô‚>[ÇEŒmôÐæPyý„kß ¯àv¿¼ŠÙbBpQ°q�ٞɦ´.ÑÔÃr!.§Ôr‰ƒD¦”!õÌÑzÂÃ1ŸâÔ?†§ØÛ6–•i~䇸�¦¾`À'Jç¿Ï¢Cl°žü5Þ6ì.!ÐC‹ÓäÒ+çsȼK>cé¡Vúzú& ä2FeǰÛÕð³Û ºÌ—ÂÑ‚õ/ŽX²¾-ïóÁÎü4¬0?S†eª±{döNž—NîªÌ},¯ÔŸ¢íO¯÷~Bag 4µF@Ȱ€\GKŒ·H¿iuÌ1žÒ;¡%¾x¡_B˜C wô%*Ü-�æcÞF÷+k¡lÆ‹1¨ê~Å® Ìû¶�l1×'Ãû[w3Ç*v›H¿fIí,bÏ1hi’E‹Åü7»�tA ˜_¹,ÈjŽx}¬éƒ.ùRXÁàö)±•Ÿ3 å¥5lE±W&ô³ÇŒ(jûÌ¢I³ÎuyMî>µžÌÒòyÀ�gR쾨¯át9Íšq0E3”‰ðL¡.eNÞKÄ)9 ^â]ðæbGY� OŠxëLæ+î³�NS4>Ó£¾> \Ó›ž«ëÚØ ¦3rÇþиºL¹?†]ì¥$‹çk>ä—×ä)¦ÕDq3|é0ØŸc� |`JôlTæ+È�©K%Âð/,}[þa`gþsIy:r·ŒçWÆM<Æ@Ú”ò‹‘òHH2Àºâ’¢*Ë~+\ÒÜ•I)+0³3õ|ò¢ÃŠ%R¯8Ëz(Ò^9ÒâŒq aö¦Nð–ž’6C`ÉëÔ‘§#¯EvÄÈG.—9÷¾`ŸÙi§´ØÂXœ Šh?IÂDy|±Ìë)kö*¼¼š\óVÁ¶D°óžå™ÃN”³œ�™·„�ÿt 3:ÁÈI:;  ¯˜¿ ‰£P>ãÓþ,"¸…ƒ†û=úÛ/¾ÜArOg|¯€pPõˆ­¡8ùÈ«®ü,KÖ³554íè�p®3äÈK´e‡© ‰[ˆ÷Ï!Zì%_©œS˜/OêÒ‰»tâ?ÚËÿśЎ_¿¾£ûŸ¦®­Üÿ4Ô»üßÛøéòïSþï)¯cqx!V—Ü%w À]p—Ü%w À]p—Ü%w À]ð– ÀùMÆ�dc˜’�Z?<.vEsy”p¼L"LàÅëÛY¾ å$r|~ëÖñ#î‹=zL ñ“�ëh)àÃÅÑZ$2vÅ�éå„Ö„Îeˆ7š�­íñXmÿH‚…Sò­»@Ïšüü·™ïÄWO8lƒÇÑ„…}Ž ?M)ÀC/öñ/+ áhå!òa¼ š¶zéyì0žÏ3�tÏ™PvH'K?Œ²†³3ærÿ’ð2`ñ€±LRc‡l"ÄSˆŒ �ºÐåÿÊÐ%‹ÿ‰c- qUÃ|l×G}üϰ-Í,ÆÿtøØìâ·ñÓÅÿîSü�/D¶ (77säƒHè°ºÐ`ìBƒ]hðNBƒ÷3¸>`Ù…»Ð`¼ñÐàŠzÒ êIo©ŸªW-ׯá­&zår¹0¿…V^ñÏ*_ï‚�]°³}°Óö6ï¾f ÆŽæ#:ÒÇC˜žA×ó]Gˆ 6•¸6Í�cQÃuö` MÓ èж-S74W4Ï!?'¡{è/§ÓëÝÆUchÒY\#WåúúfFc°Ú‡ì G“MòÖÚy†Î¡n>ɽÄk€§½Cxé +õª~–‚™=ùþEckžÇmFöüK™‚É.)ª¦áâÆ{ÒMÉ¿w×ð±HpZn%AdÕíÏ^|ØP{U÷9´v¶yXÓ> s@팞2Z»,ÁÇjh¤!MÏXPý YÍ)Ïá')|0ª¬š$÷õÑÀo?°G¾ãØ®çºæ˜š¡�ÆŽ5ðì±®kC'RüÚ)÷ ),–¡ +Æcçëv¾þˆ�•1|#jŠÉßþ¹Œ’'U#á0+ƒ¸àŒÎ+� TaÑ,¯™aýrÏX“ø."‘\ñX}ái±æ¹C o‹d½Šd®± VxÂòÐÅRÉñIìÄùøùòÇUÃL@²È/u˜` 쑽wí`Á1ùöJ—ϰ[©¿•Á¬²žcÓŠ²»Òù.œï:sEaB§�EÏ釧ðákܶM—n"ºÈìOµ‹Mì±Yû+�|(¾çFI­1'�V{Íâ[;BŸÆ^i„øß³5Ôãœög·¢Xf¼2§>ùM*©š¤CÅ%[°€)«¬H7§¶ú$;j2™Õê…­Ð까)VÏÀ¬Èë™üf¯°|ò“Ëa–_—eW‚­KéO(—£36øŽ9ö‡æXwƒ±nŽc:rmצt8Üh½ ÿfWëµ�0ª‡�ÜòÅüâÕé»·çï~xñöŒiyFfþ¿Ù³¼3ä´JPZsòÞIRÑÑdrTô6ÕÒîx`ú  �a®mzà�k®=¢��ŽûFÒ„tíL÷7�%õ VMCÂnH¥V-mùÒB6n]LŠû &&¹M†ZFÔvcÁ-ó-ŠÈæ¶� É>C¦À¬–EfÔ~þå`ó½IÝVAÜ„½?Tj±¶³ÓXR+$!Ð]Çs쀚š>4ŒºÝ�`co Íà� ê1 „›�¢ ¼á+ˆËÃÝÏ{Û¹ØfÞ©£¹ºc˜¾ãkÔ´5S�³cs�»Ñ¼ç–Ô£Û4ʱ°F²¹Çü�¯øõsÓV*»ÖK-mg«­_Ó˹²ÜKgÁÉÔeg¾ú£ôœ=û‡ç”ÇNYrØ :pÒ.Îô¿+Î$âH“L¶Åd; žïû Æl1x™Àþ³3L[„1œ/)9ž/ˆFô�fbP%×OcÈëd’í½@ %Šy.ò@œœtV^I×d ÁRs²-”êÞʧóE”DÙ¹RÙ+äÉ ÙùKÈŽ¿ +š?+6u¤z#Õb•;TËz-¥%”ãGÞ‹¢a…þyô‰ÂÂcÓZŒç÷ÖÍInï0l>' \÷»›¶5º²õx;žåù˜¶ËþsG³ÈÐö†R¼šbe•8�?š·ªûo¿e·íbÙ�¼Å=b IN,’ŒE‹°@¦1�¬» ºˆ�AޥϦ�iü˜Oøûô^‚tÚ{ec/ŸïIu_m=r¶Thõ㦗…ç¯ßã‡wüЯtâsH»Ë@Z&U>–p|ˆYŽ €©ƒÔ'ï˜ú„ÊK’±Ü¯=ÆéÃd4Ž¥ô2Gû�3ç] b§Kp&€Lœ× 1ß”¸E9àŠùĺ"ÿ‚ß ÎáÙm³0û´šRyIóšÖK£È¾�Ó�>cc«” Uè¯Ò")å°XrÎìc°ß3êÅ�ñ¶nÒÈ@zE¤n­Åé þX?«õÿ9pëõQ_ÿojð¿þ§­uõÿ·óÓÕÿßÓúX†]ÝW÷ßÕýwuÿ]ÝW÷ßÕý“®î¿«ûïêþ»ºÿ®îÿþÔýû¦éÙ¦e�]—ºÔÖ`<2uÏùîÈÕ !‚¢`v£Úÿ`ì™AŒ­¡ã[Ãqà¶FmÍÑ¡Wà ƅ2Þ›/ùG%žÁœóvUc_½ïÛqm=¿—=—qO&üž°ìæ¦Ý–ióbi`Ue­tåÃá,Ù¤°š‡°îq=õŠ1K”I’º�jäP›a%Œ`:¾¦Qc`»#cì¶å�7*£dvw3……«óÔƒà�y¨ÀSð×Waç ÚòçÞd¶¬´[í ·(Yß—Rgcyuvycîš¾…„®/æøh}d�Çã¡kƒð|Ç4F¾çh#{³â8ü½Hn^úÔÄ玵^Ñäöõâ„LTná:iPCÓ’I[UÕYæÀP:¹¦>ù–;kŽ’¯†5ôîWU]a:Ô¤ç¦C^eÙv.Úòg›¹¿È¸ºÓ<ÏÕ{02áÿÔv-mè9æý¬t+̉z|NpuqÁn›Ii˨­Êµ!x§øŸãÙº;´FCª¹šæ¸àc‚Gy�ˆšt>/ñžbС­tTK¶l3ã¡ Ý�íkfàû¾¥ShRj ,}ìé£ÍÖÅíL�šôì¦Ý6ìoË’mØ?d�ajCG ì±nº¦£ -Ó±\[·7ƒi¸ö«Içìm¸ß–#Ûp4�ç»CÛÓ-Û‡†ïQ6µ¶3o`Ücî«IÜo¥üÛ2dækc8yvàù”jÛ‚‘ë£Q þˆÞ3ô‰óÕ¤sæ>‘àÿjR–(a~Ä»I/H/àQˆ»ÒþE=umÙ¹•Ñ0)Ëšu5×k8Ñž6òà²9–ã›í4nÉh(Iç3õbæ·™¸V¥%϶™ðÆ�îéŽ3°\Ë¥¾åi–7¦fÚu8Ðîñü¨IÏMÈ1«�ÉE"na�µåí„¡q@2MÑ’D­Eipƒ`ÑÝ¥çƒr�ꊦvZÛ&©ö{Ö˸ }à\‘Å�âcœGÄaQƬjN?qæ«H»éòðÆìŽ‹"r~›$ðõêªm®v^½±lí»,ߪÐ](cQéþG)ì>áÕ§/Þr™` Þ,VQqÊWÞmx%#—Ñ.DMä”Çm%#®aÕ\~ÊÊ•¦Èc[‘·ÎÒwXIÒÀ·ºêâWÞKeqÃ¥îű]”:Øw/dW2·àÒB-ª7\Š'†Ä=^.}ŽïÌA°’VlÏbVâ#E÷›9OýD±a't˜¸Ù¯v‡ªç»A|ý~T½­;Lø €¨¹b3+nƒ\Q?MJ¶$ƒÒjµ–¥À Ï÷B`@ýO$§!e;EÀ¬Z+UÐ Ô}/æû]ü‰¦ûyãc•sÝbò„ÊïÇäý™ö‹Ù.¦®Aï^LÝjŒóžîºPCñ³5àôŸû� T~ÏÄÀ{§qä‡|žV0µns?•÷³„ÐI¡ý2¹f¤âˆþ˜á‡9ew§OxYŸ=÷'2y9ãu¸Ï%Rf Ð"yù¼”hIbÏ™q8$¾!8ôÔáV<š•„pÀ»Ù”­¸Ë�çLÒÅéÛÓó‹å2ô‘Ë\ÕÆû3hk„\‹ûä{wò…ŠË£ Ë©ÊnySC\´�ˆm J }ä�|ßxõj;co0´ƒñ/i´=û~OºšúôòÄ•‹ùÔßÑ·eû6SìF–í �Ú#°ð æÌ‘æÆó†>v73»7½¸f}+GÁ^÷ ŽPîªÀõÓ}£Ø*= ÖË ÛF8LÍÐMÇÖ|{l ­À L<°Ýw ÝÑ\ë�!êQ°×Wî�ÜP(6õ³+ ÕBÐvb¶ÂásLK�lm8‚-âÀö|c84\ öÆQïÞ�³VÏŠzìuéî@7lìŒÆ9 ¶œž? äUwÒñ‡?é(¸É2ßI(/’y¿¥2gÑãå"$o@Gè¢Ù��ÁcÓ‚ßã|�L=Ä ‚ü˜NØçªA„ìîÊjDü‘”#[•±¸Ïþón{äž0ŸŽçKå>ÅÀzzüÞ‰/¼h~ bs øyø³ò~»òæ|~)8hõfч:hñf.â$×ió7á»d3jgÑÅ'L6àËq þoÂ[K¶ÚÚ¾)-ÑAë>c˜Ž± ß|»œ^Ȥèv}ž,`u{ÎäWG«qâÕáLedï6gdcl+ñ“‰3�7à-–‡&W˜1·¤v9KBê¯&xÈõ�Yu~BΣO”è5‡ÌEß »‰»¹ªms¾;U˘·½7ܺ 1w¡§~‚ÜmòÜJ~Þó^[A$©CÓ´©ÚpǶõ­´Úf§ÿhó°ñ–é‹0},Ÿ‘9눇__¢Å'¹lØ.÷7Œ¸Ú æ{ÇÞU¾ÿ6ÕÝ[‡œåqCîþd‡ñã¶lÈâÍŒô”ÛMÌÁý1¯¤ÿÇ"  rIDèòL"l=—Kt?!~Äb¡›,ž\ó6˜ö›S/ À¡æÛüôÆ%HqÜh‘@ú5Lxbž& læ2í�|pxq*}|ËÙV2Fâ/ÙC '¦‚ó`J�x¹ Ìé�¯cДŒ=0Kt±€IˆN"øŒ�­R‚ ¿¿J‹¤ ”ÃbO8³�qƒÿ6ÒÄ¿úž¤¾12W~ Ñ`LEâ°ã_X–&P\º Va"Ä~óМq?WHô±œLnÿ¹  Àæä ½Ó?²]~ÈÕM`^…I<†î#hy¡ÐfòMT`!¬QüÎû{¥ñ¹¬ °ae}*#jR¨˜õjÏXØ'>¨sjø#Ëp4Ø“ùžnئc˜–èFyŸŒo>~<}»œžÑ\…Í•s [R‚ådPO¾'B{[“oRÓ²-jûº§�Fš? ×0�¡=ì¡mW“/#‹oaÕ0ú§Î5Œá3Mñ×§lmQ»dyÜñ¦n½)Ûfkw6E7 öØ'}ô;„«—!ÕÀmÁéW¨üó” ä**<6Âý]b06ÈY¹°êõYB»–ú›Œ·]«ƒ¾�%¼ÿLq;¹Ú=jÜoexí·±Bª¸�[)Tò#ÆÑtÕ´Ä‹,XÐ9ØéQKuRASkSÔ �è­Ï•D­[]—lfªn}fÝÞÉúË�zÅBÝ�õ–ß´^h ’µîÑB«H†»]¸éyPÛŖϸ»Õå–ïøN\qä¹%W ìÎ]�ššU×ÁÏv?7õ“ÇÍ] ºÓ>êñ_õ¡¦é%üWsuø¯·ðÓá¿Þ?üWX‡îk‡ûÚá¾v¸¯îk‡ûÚá¾’÷µÃ}íp_;Ü×÷õþà¾ú¦éÙ¦e�]—ºÔÖ`<2uÏùîÈÕ !‚Pq#ì×`ì™AŒ­¡ã[Ãqà¶FmÍÑ¡Wà Æ˜Ç›‡|E%žΜón�µz¸c V~ çe•Éâ–8~ûcîÆ¬]Â}rÐM`i%æfåÃá,iÐÉ£\÷—sE̘­ÊdM k4r(ž%htkÔñ5�Ûcw8°-38AaI4»†7È…¿i@>�—/•m„Ø–3÷p[Ä+Ó£¾> \Ó›ž«ëÚØ ¦3rÇþи÷ñª j¢ù‘ÙqþâbŽpQ8¶–·çoŒ= E(,q±ëÏ¿4À+iÉË­@k,oäCC·\ÃðÝ�á�|ÏÀo¾£Í@k8sÎ�ø“`Æ�N¢rœvW,ýr‘ddñ©D)k0)-ÕbRVWkΪ±åú}©.&—ù€JRºúUXiR�=ê##Ú®6Zck >§=Ô]8ÁføËìŠÞ›œn5Ù¹éήn3Õm9³ÍúÓ(5Æ,î¡O­À5¨f‚ߌôaà s3¸Ý›Ö›j¢Å]«¹ÛkÛL@[¦l3°Õ0.5Tó@×:ö`dÂÿ©íZÚÐsî`Sa"ÔÄg‹A€ÖÞ9f•ͧ£-‹þ€ I�w%ÜU¯Ñu‹ŠåÞãÝ%:åýóGu5`»ôµ·Éúž5ŲHBø×+¨Vçq؆#+ýû œù*Ònºj½�Ów/®%/øÂÛ$¸UzÐmsÑò7ËE»Ëö­ÊðÅþ@ÔáÿQ*ÐOØýëÄ!ËYøÏ%%Sg>g˜i4ùBéŒT Ž2�µPóx(Ë�+§µO¾ƒ^¾8 oÂI«¡�vxYit¾Hø&�#Ùã 3é"t&<¹ãkÂÊE§è%€ËŸH‚òõÉxžü…N&kî˜_£mÔ»™»Ó6+ÛG²v·�*yÉê…zÃPÒf0çÇ Xû‡GÝ8bظRþÔ$]´ÔÆ©Øê-ÑÝÉ ßt’Ê}ߟH@Ĥ2ÝÉóAÐWÉíûýÔ¿ÁêóR\€Äž3ã…½ÜÅ9ô˜þÆ2lüfG… a6ešúrAç¼O¡¶Þžž_,—¡�\þ ÕW†:Š ¬ï)¨ê/TH%�/§Ò­Î^ÝLœkGß^ºlpîG¡ÁºÝÜŸTʹ�1È�DE2(­h) B÷Â-Ï{"iÀaUé«ZEݦ¢[éZ@ìetfc�8œÆòh*Hö9G³`è*5ºJ�?ö«ÿXs™æ®*Aêë?4]7Ëõöþéê?ná§«ÿ¸OõUÖv… ]!HWÒ‚t… ]!HWÒ‚t… ]!HWÒ‚Ü›B{w_3cGs‚éã! LÏ �ëù®#D»Qˆ85\w`ÁÐÐôÀ1�€mÛ2uCsóE ‡“Ð=ô—ÓéõÍWƒÌ(ã²'(0M6É[ëÍË<m·©÷HG±&òs�«#Êlgú{…÷ÊDøÍ²f9îî®2ys"‰© ´˜ß$B×̧±W~Ćõl Ñø'ùY3haqÖ“fheqeÅpª‹ƒØ¹€*³ñ�•¸Øú>Àó%å÷â5€š™?ü’âݹB÷s#?yü' qך‚ û¨�ÿC£ÿ×5ïâÿ·ðÓÅÿïSüŸ/D¶‹Îßw¼Ð캀î ;èºÙZwД_î ;èvpЙiuç¶yœ¾Œ[T�Y‰ÐûùBÖŠ}®¯½Iî-ä>Å«÷ráö ÖˆiÁ®Ãs3pÑQ(5¡Pò®p: )ïãèQªu8'}êŠ>õ}’G$«!ç7;&|ÿŒE"ß“8 V¯¸Ÿ .ä”Û‘m(È6‘Ý®OSѧٌU'Ñüš™jPkY$º–‚ «/£Eì]-g—ñ¿à#ØÜ�ÿZÒIZ÷ÕÔýþ6&‹©3»nG›­ Í¾�i*ú¶�àTJñž>þ‰ü0ñjIØ¿ùa,î—ôÙu½übO°ÒS¬’oGôHAô¨Ñùîìù!Ûx˜;:¯ ¶ü渓wïÿqúö•X–¼èlîxŸ`ÇD\'¦í(+(7£, 8x£‹€ò£¡~+R´A=)Ú`÷R¦)t³ÖD7“GGí:U(g­‰r>z´ÃŸvä+”´ÖDI?zDÈÙÉñëcøŠYÁz8ð°ç°5Qÿ´%_¡ïµ&úÉÿáÝÿ hÈ‘üëð7®qû>=ú-öŽ>E¿9ŸÖޤ-ù ;¡5±»”�–ä+L‰ÖÄ” ÷‹æV�G‡:h³ò²÷VIkb•�üµfú µ×gË9]ÀKóe‚û§|ŽnI¾Â>iMì’¿£Ÿ¶ä+Œ•ÖÄX1Í#L)3¡hO?œ¾úþ¼Ê˜V¶ÍÈ×Nobàv¹rÛ™-]a+õ[9Ç+¼"ŒÖE°;ü& fˆµÄ+P?ž½øpñáÅ«Ówo/Nß¾|wñ};²ÖT¯±¦%²x9ëŽÈRXI½d%5j(”¿Q£üËS q€ÿ¹Œ’'Yð“ÓöêÓÛ ¸ÑåýºóL´Ø†Y†Â*ö&ÌRèj£FW¯cMv£h"Q“ÛŒR¡}�Ñ£4ëä,›VöfÓˆÈ7Ú�éSC†i¸¶éÙ–©¹öˆ6’½¦Á£Dë˜ø‰^‰~Š­&ž$ÕÑÙrÚŠ�¦Â‘3‹ŽÜ¿¶ªXbfq‰¡Èé‹YÄî›$OÉà a Ñ7íºþø9fÞëÁ,®‡ÿ�j¥°éYBzMgS±W¬%s“µd)L‰UcJR9f@&u¢.PÔ®œ…xêQCêÅ*Y”�gÏÑ\Ý1Lßñ5jÚš©9Žm Ææ(p/pE´ö#4±rë2Ò·7‚“¿øaÓ W¨ËÜ@Šì:?©Z#óÜ_>6>¸ª|f ÈÖv©ry·­”®­X"¶¾‰ÒµëVóæ,ûÆ |ÛèÖPw ˧öÀ¢CÓÔé`¤›îС܎٣¦¢š•éã™ Øl0C…›?¬tu7 fš-߆¢=¬3!ÛÌ“©ûö€‚Ò�Ù-3ö=mìŽ6{ñãPθaå<5Ó±kx¼+ò¦™:| ìjaɆŠMípÜÈ,7S!«Ò Ë"R;R÷h°�Æ݈;6øŽ9ö‡æXwƒ±nŽc:rmצEéUø°Õ;Ä“ó“ÂþðüÝ/Þžò?­téHa}F5‘È"]¸ 2š87fL Û�£ð|GÖ&S«poG5ñ¾¼¿xsüþâÅÛó§/Îò¦–¢ð�G�wŒØ÷¿ÅÞzYÐ ü³ƒêù"ÿiG¯Â mâ�úh4nߨ¦ˆ†håhÈZ•Ž)mx¤éõ‹ ¾ß�×ìöÈGÙõ\׃E6À:8ÖÀ³Çº® �=æNrÎu>Úw�‡Ö~3Q °¦}þüK³ý¨¦×kø~ÅWÿÜŒ™z$Ü|d\S7_Óë•|¿�HõáPøþ¦DÚ¨÷Ááû݈t Ã~ϱjjúÐ0FtlèHùÈtch{Ï‚¥l®Šý†_°T·¼90ZÈØ &« cl°‡Ô�^­E —Îü0¨L,Í�%¯�yçζ×÷±^z“Äãéuµ5r8Ù âÅ–E™Aã<¯í#« žIâS/,Þ„BÖ7²_½Ë….æKV«Y©X:"cµŽWÛ®¾JF ˜i³"h‡à, …ÏG@&á'~,Ç\¡hA¼h-Ì£žÈêùIÈŠŸ«fñ¹ÝgϱYV÷øÛ#÷ÙÚª°ÇLQ1»�ܪÕä¶r» E¼^v¼n}r‹’G™Þ‘à^4Øko-ÚM6ôÕ#~ü¸b£_£¸BXyg‹Á�¯:€´µÒÝ"Dµž³ëÞÙgñXkœUo¶åìv[…BX÷ê~ñ¾Çtw±z*µ‰ŠX¨ÒÀ¦mvX]$)Kn—ÙݘáÞáGt?k~VñVïGÞ¶�zü˰f ÿyh�ÿá6~:ü‡{ŠÿÀ/yïp:܇÷¡Ã}èp:܇÷¡Ã}èp:܇÷¡Ã}¸¸¾iz¶iYc×¥.õ†�5�LÝ3G¾;ruCˆ ¨=Øû!{fckèøÖpø†­Q[stèÕ°‚q!8vw�l³¶k¨‡ÜmÅÂC‡ðpƒñ¡>ÐŒƒ;Áyøðãù÷äØñðÆ�³�]š\ÿïÃwØÍ¤ì·á�qgï]9AB‚%|ØÏÒEŸÀ‚ §Ë W;S÷{òÝÂYÎà‹/°§ßpÚvƒÝp »™¶¡7�sê]Íø$¥KÉ¡ y‹Og›ÍÎNPÚÎÎ. v6;»Zb2톦éÝ‚^b²È‹%†ˆÈdzãÛÇOh;-»=ØÙ´ìÂà†€†v‚OÐvrv*°«ÉÙ D3DÈ|»¾ó:ó®¢hÂN§rfèÌ ñ2”X̘˜¿#îUl6ƒÛ€l:ƒÛ ì~[Öý·µIo–0e›O�B'—³áw2= �«7ôxoÉK‘2NÊ)ã눾=$/]¡×õ†z}H^ºB�ë7 Æu…×›©ñv�(†B]MÔõÝ!y)JH] Ã=@òRÔA�rÄZòïÉKQ�@ÊÕkÈ¿3áQ˜’rÝÃZîß ’×6P:÷É«-bÎZòwôÓ–ü-°yî’W[$Ÿ_º-Í–ÂV5¶R‰äõúô»–PY¦ÂŠš5VT‰àµ9 «h–¬b³F¶ÊlŽRV£‚!o€EU E8¶Ófô„³dzÚ�9Ý–S½œ£˜_\xóÉ2Æÿ·];�§êZ`úv2³Êbà˜eáOBxÀ™ì ¶“iŠÕ%JYyØŽO7‚ê¤`¾ÕÄT="Ǭ.6Ÿ3àuL‚E4%ïàâRr–,ý0"˜Ý vhA€̢/N˜`;Ë«àÀà;°V[Uú,ÅdX ÷tIDÔ_òë4'Q4�ûäúgòŹŽÁ^Æt‘™`*‹†à˜¯/Á}a/ÀÖ»특´ž©°‚@ÎLØÿ“ØùLû-í�¥°wV{'Ë÷Aœ}|ûþû‹ÒîÔV<»¹Á›óÜFºXD‹‹)|Šùsd? ‚òââí»�OÏ/>¼xþñä‹zÁ$¶$Ua íæ ŸíÕAK°©†�*Ô�Ý‘D8?Åê¢+gæOÚoìöÀJë’¾qFµéÐÖèÈ4=Ç×4j lwdŒÝáÀ¶ü1æ*˜RµÙi€$¶‚c°miš‹·9K7.ª…#¬�“¹‹iW(&»¹bj¿ºZâ”5lT¡/†jTŒ‘«šùŠrCþES:ªe¸‰j)5Á�¬qó Ë-ÿE/Ú�÷Õâl†•§¯å¦? ÞÐYãñxèÚc×õ|Ç4F¾çh#Tq¹I{E“‹Ùr*�Ä i¢\£;¶Å×jÔèX!àã&ÞtŽÛBÃ Æ ·††)Ìp`™°[§töÎ?¶ËjMqT®•ŽÊÿÓ°U…‰­;÷Þ6¾­)N²µòIv³Fƨ|B½ùˆª±¼‡T»Í!·ó]`‚¹§+ D…õxTP5¤ˆ3˜®× ‚ë¦Þ4mȰ–»±Fì‚g÷ñÏ­F¬Þøo8â¶…FCƇw0f¥{³é˜ÛùM�† Ï6\[ñDÖÛ�'›Ä 1F¾°½<¨�£ Ǿ�×Õˆ «¯Þ©U)6de»èG3ý9Û^tÔGš›.›-ÏJ×s€Ÿ “õ¯oÏu²Æ†\Ù< D!�*“ª_RÂE3¸’Çv[î ÕÇh²p»ó¹õl,Üp°®‰íEK}¼!_¶:ºn®ªóoVqƒÿÑ!LÿI¦óøÏeÌò]A@×â?kº®[FÿYhv‡ÿ|+?þóýÃ.`üwÐtÝA@wÐtUké1[ÝA@‹—;躃€î  oÚÁ¦Ý׌ÁØÑœ`DGúxHÓ3hàz¾ë„Á¦צy#p,j¸.^³ MÓ èж-S747ÿ|8 ÝC9�^§]Ý&téb6ìiPÐÕ—ÁuhЕ}vhÐÛ£AkôýCƒn;)tÃ>o ºå´uhÐå>o ºíìthз‚­Z‹ÿ5ÛÑÕCû¼Q`è–˧†¾wÀÐmg°†.÷ÙCwÀÐER:`èºâ§†.�ßC·ù逡 äwÀÐ0ôZòoúËWˆ>yúöå»{‚ ½E7m)T¾µ3Gÿ­,$YÛkŽGа†òHÆyVÀn8.…-°6�`³Újë\Ä®va/¼xu[„áF�Ö"¯ÖB‚VÍê7Ž=8CSÓéØwۛ㚦H^…ï×�ö�iSˆ8E¾*|¿nË»L¢†]´CñÞÈ6«õŒ�v±²ZZçÖXßÍÝöMYç�aWOšå˜–>ÙÚp4�¶çááR&sD=SXg9g»°ÏË ‰sTÜ1Úö®m´áŽÜaàk�7jÖh@�êžMi@=ÏïI黳њ"UOÓ6±Ñš"ÑNÓjl´(–9ƒu…'†�-u[lí|§³¦Z½%BvÎÀ-WÃMd[¨ê\Ha~v’ÆøÉ K¨¯³„/ÃEœÌy_ »RXÃRžÚf¦J¹Ü„÷S°¶K‘䦕“Üš5ÚÉú– V[xêöSçF–í �Ú#˜.0 æÈ�-žç }ìjÂ`UÃNÌÖv2CV)jú­P%嬭F�ÖæFT›°˜Õ�óaÊí³8eg¥˜EoïÒFñ[Y)E΄VÊ™hh¥j¡‰7ax^öÈ¢¶=4<Íô©nÛ7Ðu“:Že™.†Šäq‰�¨[%~[vnßp-!ˆ5jÕ™ Íxc˜Žá9ø‰c× LË¡&,¶‘nŽ\Í x†ƒÕƒJÞÜbĨº«í7Í‚a-Ì�Ug87›=†¯ùÞxd�†¾ÆÈölØ#wl»|ôêyXkV0±@®ûÂÏfüT9ýÞ‰1îtÖ†�»_ò¦ ¤Žt ²åâÂ8c}L�ÁÐÓÜïFvV/ù[c§šHÉÎ÷Ò­kÎÓ]ÛœoœÀ FÖÀq¨¥QƒŽt6–n02ìÀä<]µJ·ÊS5‘ÈÓÓ  +ë<­ Ås0ÚÖp0½–îj¾M}ÏÆhÀ8+Gw,žJ"‘•lÛÑ^>kï¢ÞŒ©#jSo¤ (¸FÆÈñ@EÁ_�nØÃ‘9B¨M,r[cÊn‹©j"‘©¯��xº{³dºƒÖz ¤;ð\Çù  -wìsžÞ±YR‰<}ýèpLø¦ìܽY Ƹ�q{d8®c @-�ƺ«Á~º¾Ç×½}ÇfIM$cçrz~…hyq–îÞ*é¦~õ,›¨P<µÁGa{ToÌ'ûŽ­’šHd©HIjÃÏÝ›&[ƒÉ£à*{Ôø¦ë éÀwÁÀœŸwlšÔD"??PÉrkZp´6km3Žjúpd¨Ka2 XUxçû®k¸¦îð-ÖðŽí’šHä(˜¶açîMÒhàYì:´‘ÀÞQ †5rCÃ1º5Ô8;ïØ$©‰ä®ýdâÌã66¾6“nC†ǃÀ�¼`dSvè#gì–�±˜±=r†®žˆlÈÐ-«$û‘e‡µak],k3¶RöËæÐ3‡†æšTƒÅd¸�kXŽ>{`p¶wYÙü¬o›éPrš?Ðl3#u‘ØÍfÄõµ±oŒA½ }�úC{àÁ¯®7¢õÆ÷¾0³qG3²e{³Qrú|%>Þb^js)7\)#�ºž9Ò|ÓÔÌ`0²†þØ€u4Û9l^F«%"õ (¤²C¤&vú1¦‹W‹h9 \kÃÚºS¬ ½9÷­15ü‘e}tè{°Õ„…i‚ƒ¯ÜXbºh+Ö.gx1õ×ê÷ ½:%±SØuÈ|é6ŒÝ½Ñ4©iÙµ}ÝÓG ƒÁÐq ÓÚãÀÚüLaÔÖhÞ�̪‰�Ê2˜¶"«8Ï€Ö!«Ž» ‡øy¥å¬àF�Žw\%ç�l× <Ó˜®60ÇîpŽ ^Õ¤ùÞ(౫±¢J®ºðôäüäØwqþî‡oÏ2QúŸV‡}cE®À¸Û Hö-iWí‹æ×À�ƒ éRœü�W°VÒ%ò)ÚÓ¥H¡7¾aµLWñtû -]Š WÇ�‹XËtÎ1¬%]ŠóÒqã+[ËtÁ3Éó¨Ppãš$�zºfÑ+-ÙPîZmÜøBØ2]‘(ŒÛ�.EŸq)™®…Œæl@—®È}Ö� úËtÉTɃMø¥+ŸõA ä�‚.žÜ¶™¾×™Òú`#}î[VÉ·]õú^l¤ï¥÷s�m&_õú^/§L7£ w—¸•È(kIW½¾‡ï7•¯0Èdkºêõ=|¿¹ÝæAµ å«^ßÃ÷ë{�ý„Ÿ˜l2�õú^¯Ëž¯§k)bemˆ©Wòz9Y¾Q£Šìq½Ô·Æó}ÿâ­t~/Þ¿¿xñöüÃé‹3²òÓn>¨¿zêïê|ü[À¦x¹]ÿä`­š"ÿiéûé 0`½ x=ÍWY;Grå’Ü€d…º¯ÃV�ŒIJy‚+w%P¬0u€ÃJŠEN@JöºýÊd+ìD"q-Ù"ØXàôúíÌ„+ I¬q-áùÄIýÚýÎt+ Mìq-ݧAQªWíöÄ*¬Or-±¯�¯Ý¼m@¶ÂNÕA)×’ý6­Ûzí!öví)V™èuxËõgÞG%£sÞÉT+ŒaÈr-Õ"#b­ò{Õ (V˜Â:ˆæZŠÓœƒ ó]ØÅn@³ÂÖ!9×Ò,OèÖ™ï´@»=É cXï\O2ÛÜ®_€|ó»Á 3X‡ ]K0?‘^O0÷Â7 Xaþêp¡×<ËŽYª„"¿�߀d…å«««ZOò2è–½f'MþÓŽd…ý+[5jT�Œ¦Û5²V85ÂKÈZ G–¦—ÀÒ6©sF�GÇ£�1²\ß³­ñÈ�Æ®§»Îp„‡ ^âñ21�Gr*Nuö×(µ/¤K½Ÿ´«ŸiV„©+PÞô ”·ÕŸu=�)Ȥ¦µlºHN·7Z@™>¬1BÛ ­¯L/á•m ´†>òF¾o <ƒúµ�±7ÚÁx< &sí= ”² Êdö ÅkƒãºbÇÛ›rΚ^ÂYkبB[ 7(eÓpiú°±ø†Î|ØÓHYÊ?X�÷™ÇßÍ�”¬o~½Œ&‰Ç/r¬ª œÜ‹yYÅ6‘EŒW7™óÅGSìØ§^¸æ…ª‡ Ò}ö#m!:�¿=rŸ‘Š[ã‘"k¡†…k—ˆà¢ºl¢–‹ÛWe¬¬ÑÇ�+ 5ÖóÓ!ÉÊÛ1–³lËYuÒÍVœU7_ÅÙRšÏz¶ÊL$R|eK¾bBÔ¶|UWQlÅWuók$¶X·Ñ@`ó/l+¯æ4�2x;M l~ _³”ã<•oÉÏaÍZkœÔ˜D›§íðŽÖ3‘múùäY×Ä~…+€=Ü^ÕÕÐ[I¢ºù5’˜Õ_7�Dùð–’ˆ•é[I¢Ú÷Þ\·õë׳71dýËû+3De^ýDP]í¼�‘Q6¿Fy}uñ÷={{>ªË¶â£ºù*>– 'Z9í¤ôú¶–f¸åúVCl± Ú®ÐBÅ×Ê×¶ä§¶ƒ=‘ºÒc+¡U7_%´Õµ%°˜T6µ­�·c5Äòæb¼ |swi¥�¢™bÌÏšwá()«Ÿ·s””ͯ±R¹zë¦*}zÛMP{U+ƒj\¶Íep˜omdqmCûëÃê;;�Q5ÏV2ªn¾Æ™o`*¼±­oµƒ »º²|+Ϊ›_ÃÙ¬–½SåÃÛÚŸ]ì”ØÛì”ͯágm¡KsÏo«QG[jT5*ÝæuCÄ;•ÇTx|;þáåk[Gå”xÛEå”ͯUŸÂB#Ý)ßv¡7ˆ‡(M’²js;“¤l¾Š§å:ÑcÏÍ|é�-ù:ÚÁ¾I�k¶_•ͯ‘Õ2’Zy-¾²­±ßV�ª“>¶pL7N(QDïª^ÛÏ9ªùä²2s;Žç©Á¶‹C)›¯Í8õš/½²í¢ß��RcÄmÅYuóëŽãRTº&Gqâámý¥ÆiÍU½�ñãûäûó7¯IE ]ð{࣯חtF´þ¨¯ ÒÇâÄY$ò¹9þξºZHÊùW{GÀxßaŠK_<û6ž‚Œ>ë} ó^w——1I"’ÎÓÔ 'Iô8^Îñûÿ7™¤‡ó~´¸Ü{Vñ!²Ì…?x§ø‘ù×ø/Nï³Þ_ºŸÝÿ k�„¿4 ]TÌ\i°5µ›>ìVeÿÕ†–ÆþÖLö7‚ÿÆÐü‹fé†nºaÿe Ù°û ì¦ûúŸ%®Bþâ.ÉO5ÏÑE|ÝîO¦9®¨ã×hŽçïNÎÿñþA± ï?~÷úô„ìýhœ=?N~b­hý9_8³˜)<�¥fÙ�äÛ9}ñtœ½ÃSS�tá€EÏ=÷¼ÀWöF&úŒß ñX˜X‡ý+rÆm÷ËpÖ…?ÖûvÎ> -›8nÜ÷âx\€ Çë �¯(Mö˜3 F‡`?±·çIþ›ßœÏÿt�Ä ïéÞoÿ\ÒÅuÿ·˜¥ª²oš½è_Ïd Gùí½1uÞÕÿg§„Zö�ÄÙ` EêÚ¼ÿ¬GÈÿÙgn‰VúaÜ®÷ƒåŒqdÿ!ù7AóÁ›Þø„üçá“^5�ÄÂkÆrÄl#ya*ÑAO,‰æ{ÜOð#2‹hl}F�ÜMx耄 ѲG1õ‰{-×ü_¹7�¶ƒrçÀ�pu�ÄM(ñèdÏü˧{ƒ=ö÷Œ6û[³þ/2äÛ„Ó¿,¬]^^%�‰eÏ¿>a\û6ñy(`ýò3‰.ò*œ^‚ «å5þÍgG]‡@σ¾E§¼k’ŽP¼'\Mà�ΓkâÄ;ck× g1[ÕŒ7ðr>“<߯suöžéý,o²¿ ŸÃ�óÏü“‡"œõÏý¼ JÜEˆŽ£ð÷ߣ÷ç�ã™O¸·INg裬E‹´Á øgÁÿ‘®›3éOr�B[BÙgî~ñŠ«,.E]ÅR¬ƒÏ`H¹”}%OÉŒ~!gòïý½ô«½"þØ;œILðÇFŽ53çó"ú¢í¥Î5è>>�äÛå$÷é$Œñ|5 ³ÍC8óéW±Ec3÷ì Ì+ŸÉ÷Î%M³óq/Vµ1‡çâBè–57iÇ™Á’Ä÷ m=ÍÅ:c�墮µ´2a >¬LH[Àb©DRGX/-4’ “Î[Êóì£Ó™ºí3Ý˽X(¾€Õ–û¾Å5�köŒN@Ћšwê\‚Šœôç³Ë½Ü«ì'šM#ð¿@�-žî-(pf– ZÿÝ,ßêÙUôeÿáÚ&–‰²…ïCŸV´Àtš¤ü¸fóe~=ìåGù2¤�|v&Køš¶GëA>Ñkø¨‚ÊìHüto•6ÖÚKüv¤ƒ>Ü#«/»“åBñ.[o•/IËùÚ·O®œÙ%ݧŸÑÆ•¸PQù²@]_�VÅ–ãÎ ZY×”©‘ÇYÿì‰4^N’øGX¾l^Ÿ•e‰=u:½Ü#.«áf6)/XÌÄ1±J§�í8W� sª›Ùr�|{´œp]+•nQ=éõ¤·ÔOÕ«–ëƒ×aœ4Ñ+—“È…ù-´òŠVùziDÌ|aœ&1,#Œ aˆ HÃXA4çeº¡°¢ù, ©ÞxÑnºT™Cÿ3åk?Ðk)É©i䣃Úùüèy#à@1A$û9—‰§�<¬äHAp±Ù4sµ3yÇ£ƒý¬HöuN†Sqäû‰b³{]±±ð^r£ÊÉè!ì\®R!…ØßLPrF¾FM÷r¤t"«..|ÓôlӲƮK]ê k0™ºgŽ|wäê†ÁpæM–>M¥®MÁØ3ƒ [CÇ·†ãÀ7l�Úš£C¯†Œ Qà´)Ô«q4p‰³‰=r7h/]Ì…�™ï»W uòÏrû4ÞC¶†Òy#åeØÛ-Wñð‹Ö«Cj(rg!‚Á÷áQ]ôÙ¨s�ËPa1ŽºZ39P`R³‘+…lSu;PàR”‘öI‘s9|Ü¿0–ñ„’3R|Oâ(H¾Àž…ìç¹xãÃvd×—)RS¦œ#»]ŸõʄԀ]äY… \̃ÖzˆÈ”ãC} 툩¯&¤\ ȮÏ¿'ÇŽw›Š�3pq˜\À®c1uf×íhª/$&¤«bãI©¯3&¤¦Îx÷“R_‘OH ŒRž˜W4Æí¼wå –`åaK!8‘³pºœpµ3u¿'ß-œå ¾øù §­E‰�¥M§MHêÀw>m ¬?R‡õWÐ�Ô»šñIJ—’Cò¼ŸÎ6›¨©õÛxvÚµ•o÷³£P»u€{yb2톦éÝ‚^â‰í‹%†„ÈdzãvT)ôožÞÆÓ¢Ð¯uPxM¦шÇ-'G¡~ëPîò$½Œ°n–³Ëø_ðÑb9%ÿµ¤“<üW ä6\9 m\j·ñ)ti"ÝÎWŽlŽÔ�ÍÍ2ŸÀ††oºÎ¼+ÌXÁ3©œ1:óB:óh,fLÌß÷-6›Aî©Ã�ÛtÈq¤9n÷3¨PÄu�pM,Ó›%LÙæÓ£ÐÌuèoO�BïÖ¸­ìWÒ=ÉÔ¹&.üùa€0mÎÌ'~'‹Ð]bä}9ø’ÿûÿ:þAÐ�#?ø×áoÜ$ö}zô[ì}Š~s>­I[ò–Âhb)v);-ÉW˜£‰)AîÍ®6�Ñö6�—­¸¯°JF«„ä¯õƒS‡Šœ-çt/Í— ÃOð9º%ù ûd4±O�ªo4Ûä§-ù ce41VLóSÊL(ÚÓ§¯¾?¯2¦Õ†mCòÎhbàv¹r[š-…­4ƒpàg¢ ãõéwß·¢ÄTP³õ S¢°…fÉ6kTa¡ÌƘÖÀh䳸<£ÝÈvÆl Rý�8†"›$O@�õ¯þv™�€5»ùKSäDi¥œ¨Êã©]éË\“^â]Ćª±h*Ò£´rzT³FòÞüæÌÍO4EÞ“VÎ{jÖ¨bÑÕ%’Üü¢S¤œh¥”±P’hztDín�(Q4C½FîËQ$¥h夔f�*,{ÝiÿÍ ’â0_+æék˜4�£æì¯wñµòÉ|£F§$Ú¶§$Û±_q0¢•F8¯¿ãÑô]/dÅ9‰V:'©4v+î!¦ypZ¢‰Ï¼¯¦Ô(”ºeüqL¯¥ØÃXÈ4E[+DZoW°w¦j¥;SK‚ÝL±4”$ÅͧZéæÓFbMVĺ±0Ø Ómo»ÑçZùü¡Q£#…BÕ8w7/a#…‚v:�OB/L.ܛѡ#ÅJ™j­ÕF™6–º‘ m_)TÐhƒ£4MÓÊq°Û•º±bõŽ«ïU©Û¥‚Óõ‹¾o.t;Ôtº¢B¾o/º¢¾ß¤QÅåØƒ»”9]Qr ßWÈÜËÉ2¾Ú±zÓE]SJÚ=qÉtE@R/$›5ª¸p»®ÌóæÅHQªkU[=!F»ÝééŠBP½\Ú¨QE€K¯«ÿ»yî+"ez)RÆy-oK¸p�é³]΀"f¦o3Óu`z]Ø-Ì€BÉ—"z¥ 3§üWèôrÍX£Fu1z]]ÌÍó_ÓK�°þïÔ’)â^z)îUí,Ýc¦œé›ÎtEU‚^®J¸]aR”7èf­:ݵ=SÔ9èå:‡f�*ôU9{ý–'@¡ÀÌJ§4ÚõŽ[WÄwuKá’Þ—5¬ˆëåùf�*T®u§©¥ÐÁV¥C5Þ>7ç½BZ›èOEªº^—ª~ó¼Wd¯ëvUôì�9��ц+X‘¸®Ûê˜Ù}YÄŠÄv½œØÞ¬Q…¦-ŒoW�‘g½y.ÒŽ}êÚ|w$e:R4:ºS7H¢×GUnÐ{gáL&ôv•Š˜¼>ÚÄR$ôêå„Þ[žÅêUùAé ìxŒ‹q¼Á1�¡HM4Ê©‰·ÊC# ß×ñ?ˆŸvfÉ ¼$|¿Ù™5gM8KVÍ”ø ƒ �6¥´~Mõ™è†”bf|r…lÄMi­_aF)ü]IëÎò EÜP‡Àï�»b(‚àÆ&ApCY4êPÈn^](PÈŒ YI]üíÐñ5èdF �¬™`“Án, à1£ <Ö¬Q…N,Ç„5ª€_2êà—n^ÆèJ†Qµ·:ã·/íxse(B堄 !ᾨ+EÙ(gR6kTa]êin^” 5†Yµ»’¢´[çÒP„�M`j „‰Qar ìW(/³*‹M°?Þq¤ÓPă ³�ÏvoÖ²"|l”QT5ªÈ5¬;u=Y †Uåzd´ۘ§¡ åÐp³F³jÝ©2U`¶v¥2E ºóP‰¡@a1Ê(,ÍULj°Æ-ð_¡ëíª­ºàÿŽm™"=Ù°7ñJ FÃÍs_�Ò` +Õ�äþN-™ÛÁª7>÷ÅŽ)0 Œ2D£FG E5ºËšC7FU5+R�vlÅño£œ¢Þ¬Q…£u§gCp6*Î?F‹O1HýΗ²"âlŒåß—Õm*�‹Í:äâ›EôÜVeM0Nïx ¦”››À›cïÇwÊû±‚÷ã*Þœ%!åÊí†Ü·±b&ÆmÐ4véÅ)Bzæ¸AæV3ÂZ:sŠhž9nRÖ˜ýÜŠO§ù™ãF&¸–æ»pí8&æ&x¾–"ûÔÚÑuwjÄRä“ZZÕÉP…Ù¥‡g) Y-­áŽ«z¥fòÞÖѳ÷¦[å{Ó5ª@,µênqÞnò‘!KWMþn�‡¥ˆYú¦;ílÊ[M·"dm²˜Ö�¢”Z �«¥4/»õì,T©U¾3·Q£Š-¼UÞÂßî(ò+-sÝnïFÚõ’T¤SZfK¿3gÉR$TZ¤„JK‘Pim’Pi)j˜­;­a¶5ÌVe s*Û;u2ñ«A ó.] E@ÅÚ¤ÙRlЭ�¦·eû‹†Ä)& 2»íuè^\Òäbê|•5i;¾ÀR¤ºYåkŒš5ªP\Ã;µúC…&VB$âí*“Èû´O@äÙoÉ#7f´"gÎ*çÌ5kT!òåzæÛe´lÔUÉüs ¦%ºÞŽ× ¡ÞLÔRdÝYwšug)²î¬Ê¬»3º�L+’ë¬Mʹ-E¬Ïß©L+B~Ö¸J¦?Îâm9­�èrŽ^³F23ÞåY}Kƒi+@cíAåQ=(�møl+2ñìM amÅQvùЍ[•h[Ÿ`ª·˜9œ¹�þÙ’åõ;@{°A†º­HS³Ëij·ËrE”ÔÖªd[ÆÝp] µ7)­·y|ö�æñÙŠ<>»2�ïŒîJΩ{¶¶‰œ+.·²Ë—[Ý.ÇÁ^[¯’sn,wÃsEÌ×ÞäN)[‹`ë» ¨µ5› Œ[¯Œ§!wwÄñúš½ œ‚­ˆ"ÛuQäªÛƒ‰diþÁü­÷â–/’]¹¾¾ÉvÓ£X¯›ÀêÚŠ°±]×°G\rváÍ'ËÿßjtŠû©ìÒýTÿiØj}�Ï®ÓØöîh[�•aœŠØ Ð »¹Ýˆ’ÄÛ#¡_ºÀð/0¼hp³l±)Éî/«å¤»ó©r£CV_ÚÇÏŠ×ZŽ[}Qrëqoq÷òú¡óË¥Iå›ÛŒ_}}ëño~«½bæU^Š^ýNœûì9^Z"(Áão�Üg"D Ôö¯#Ââ&SßÅÛšcÛ]ﻞkìd‡àÁ ðn]ÛH�úFÛÖ¼Øò’ÜõÌX=³XÛÐV,QÞÛž%›^.ÛH“ÞÚ¯8d"� ‡L$'UùÓ¿¿ø=<$Á¹DoŠ>Ë} Í$ðiŒ÷Ø'ߟ¿yM‚(oþY?úz}IgDë�úÚ },NœE"Ÿ›ãïì««…$ÿjï¸êû °Ž¥/ÀÖN�ÉäYï�G𺻼ŒI‘t¦N8I¢ÇñrŽßÿ¿±-èá¼-.A¯~ˆ¬†óFáÞ)~äFþ5þ‹óø¬÷—îç/ȉ#¡€„ýº¸gA„+(Ž– �2©ß¦�üض‰ÿjCKck&û{€ÅšaÿE³tC·‡x¹Â_:âÛý… v5ȺŸ%Š/!q—áħ‹šç@=ßA·û“-ô+êø5 ýù»“ó¼APÈû�ß½>=!{‡GG?'GGÏÏŸ“ŸX+Z@ÎÎ,fVÞ™½x»Gö®’dþøèèË—/ý/®Ñ£óG_±- _¿&¹7û~{qÐ#Øá×éd cµm<ó·Ù³0øgJPðì!ýç2üütï„ë¶ÃsÜ·KMÚvúüå'¨>cš<ýxþòpªª¢‘Ÿ?ž€êu’Ð�äÛ9}ñtœ½Ã÷À?ºpØdÏ=/𕽑„É„ ì1 Q¬C\†ý+rÆV!y¢áÏ÷¾…É'¡Ç�û^ï‘�<Ý‹“ë �¯(MöÆ)Ä0ñì0öá<Éó›óÙáŸî‘xá=ÝûíŸKº¸îÿ³ 4û¦Ù‹þõ,˜Så·sôÆÔYxWGüŸ�^hÙwgƒ1©kóþ³!ÿgß�¼%Zׇ}Ì ¸Þ–3Æ‘ý‡äß�ß ÞôþÃ'ä?Ÿôªy$V`3î�#fÓ¸ì ‡>ºDI4ßãöÝ�È,J ±iô™’ä*Œ ;“%|Í?Û#އ�ÂOô>ª 2;?Ý[¥�µö¿Ýé ÷ÈêËîd¹P¼ËÖ[åË@Òr¾öíØv^Ò}úm\‰ ñøêú‚ Ü×å¸s‚–gOˆl¦Fgý³'>Ðx9Iâaù²y}V–%öÔéôr�¸¢20›”,fâ˜X¥SÈvŠ+È„9ÕÍì¹@¾=ZN¸®•J·¨žô‚zÒ[ê§êUËõÁë0Nšè•ËIäÂüZyÅ?«|½4"f¾0N“–XNp(Òp�Í™‹Wt +šÏ’�ê�í¦K•‰0ô?S¾ö½–’œšF>ú0X �Ï�ž7D²Ÿs™hàÀg+9R\ìF6Í\íLÞ1´?€ɾÎÉp*Ž|cQlv¯¢+6ÞKnT9=„-ÌU*¤ðû› ÊAΨÀwÀ¨)3*â#:‘‹Õöví¾f ÆŽæ#:ÒÇC˜žA×ó]Gˆ 6•¸6Í�cQÃu1ç(š8¦Сm[¦nh®hží›'¡{è/§Óë´+)Ù«A0ð‹³Ù]s_h/]Ñ…�™¼W <òϪvm¼«lE¥=óÖÊ]Ëàv ñš¨Œò«Cd(—rÇáàª$QÀ}{T#}ƈ\72ôW z®ž‚ ¹V„Ô@õäkwøÓædp €E#¤æX2%ÿÑ#BÎNŽ_Ãð�\ð!öxØsX‚¨Ú’_°IHMše�üÞý×ñ‚†ùÁ¿[ÒI\Ÿý{GŸ¢ßœOkGÒ–üú#TBjŽPsäß™ðÔç�R“CRàþI4¿fþØŠ‡D�G‡ú`0n /[q¿>Ë„�Tüù/£Eì]-g—ñ¿à3Øi’ÿâBs !gË9]ÀKàü¢•<Áçè–ä×'©R÷W G?mɯO‡!¤&¦¨y(•>%'ïÞÿãÃé«ïÏI8cŸÎïl2‰ëÄ`Âø2Ñâšoiâ„“xCòës`©ÉY»‘¥{ÔŠ|Eò&©+q_ɶ™aº�<á~ñêôÝÛ‹Ó·/ß]|ߎ$…%-'sÖ�äãé9ÝI ë¨m|”k›5ªÐøåkÝÔ^ÇÉù‰t9ÎßýðâíÙæìW¨r£•*Gº€ñ"'ç‹|Š%,èsО6…Š7Z©x¤�)÷5Ôµ¤M¡»�6º›Ï'� áñL;Jª¼ ˜Ü¨QÎ11›ïQÖˆìÅ›ã÷/Þž8}‘—Þ–Ó À?&å+ûê§áßäoÿ\FÉ{þÛA­H“ÿ´j>21[é\Iq\¢x½ #Í-)Vhh³•†–ó€1æ:åéÎ-òŸvT*4·¹‰æ®ÐÉŽØ›2qˆ�†‹m¡�ˆ·³˜8Ò2âÁÿu\K‹¼�°~ꪼöžñÛ1K¡3JX:ÿnÖªU§46âÖ7Î`àŒjXm éϺÁرǎãG¦>ò¹Ö`…Ÿ(j«{ó†ãP(«T…D²±áRk, ÅÂü{m(š–B�X›ÄG÷K’ºû%7ª“« mY4—&Ú¯çÿ…8r®Ë©ßpö*³ç#oïÙ9žwñFáŸhAcâL&ß[LÅ©ØLðƒˆ�>iS§RuÂ÷UM—aßeØÿ¡Xþ¿H�¹©>Ø©ÎÐZ“ÿÏ~Šùÿšn›Ö_ˆuSåþ—çÿçç�¶ô®DöÑîú¨¯ÿÙЬÒü[–6ìê?nãçŽ ;žñ’ Q‘•7줂ƒåÓ+“çóE ýÖÅå �|¾4Âg0!Xæ¡ÿtöá³�KéDg`o™,EN×Ûè _�{ÏÞFDü^ð5vanóë?ÑŽe¬~ý[,÷Òú7M[ëÖÿmüÈò\RŸé"9�Ný}.{ÿü<å‘<%<��ÐSÝŸž„ß ‘™ÐÙerõ$üûßÂ÷ÿf‹ø¢ïÈ•Ëó8Ù>ɾ�Á×ûæ6wðí@| Û›}¯Ï¬ÑþÑÏÎῇãÿY£Ááÿ,_ÂÏ/G²'ÿ-²#9‰êñþÃþK'1åm;Õìêö.{÷fý$:c…³ûð`¹�5/Ö¼‡ÿ¹§üù'½ÿôz)³/iòÓû(Þ:ÍØŒ¥lIƯúQ€Jû1ô“«Œ±_®0%„=@þö7‚ÿþõ©Lì£F(Žô+üÿïOI®Á×4HžˆoY3…oß;XGP9–¯+ÃøÇê0®› £ñ8Ò�@Ë呜Gs9ÅHÊC¹fC�}ò1W¿„•Sc…up�\á¯ðyä…¬æK˜\åÓ€a‹L'ý¶ ÝÀöYñcü“‘sx–ýÊ22)á9ÙÈ¡�•O%WN­ÂFÕ¥¹tÜÀòŒcØÔ†3ÐN3�ö 9�ÉŒR(�}›K o#rÀL…SÌ’Žû½T>ß;@î!ÁÄ^| ´[¶ÚÈ`Yæ½GGÙdf:Hõ�ÌsƆ€�— öéÄqé„Ï5Nï_Ùÿ�ü5÷8VºÁ´ÉþÞ›0Žq8ó”GHNÚWËà�‹GG°©•?¬¶ ž²+†G�%}ÖáÊÏSÆê'ò¡1…‡rŸ§Ï~¢×çœÅO¼fzN>a ²gX28O*ÇØ«hð)1rÏ€˜%|äÿ�¥ iO{{…G>H"/+¹ }ºJpž^.¡Ìè}â˜ïäŸ`E!éS }ЛøB;BJ­½FÉ(<ÇdåÉÊä’çïÞ�Šë<îÉVàÃ\™ “VN¢ÎHnª!@ûˆF¾»£U¬¶±ârUl›ÏÐæ�‹‚¥ÚÖy¦ÿ¶}ˆz�•žÞGóå¼�î¿yO²^ A'ÛªX±†¬„gó>x%‘T(Ŧy!↠cõ[JrQ–É ¬!ß30ŽE,ž8q&4WtFX%ÖØ:>ªïh!jp},¢iÞ¦(º}IûjÑV~aÌ—ofPÙKìC0XÙ÷Ozy^¯–Û¬°%õÏâ*¡^/ñû9×.έäTT½Š/¥._Yëýl+ ¡%é?åºyø$÷VwðÇþ±î1ÖÒߟæ)Íû)äïÄ–�bk•O~Ï*™Åؼc½�œÍXZ2Çå$ZejŸíNû~Ï'ÎõÓ."û=(Ðyø´ê½¹OT­ Ɖa“ó¯”ï.rnæßYãïv‚î”ë·ÅÇž~—‘Ž6žyu‹âÚÈÙþâÚð°8_|³úhÊÒÒOùùÊ�ûH8j&Ú §èŒø çrO»V7W£[°$¯Z·¬¸18ËI�zæåý}�—~¦nUZüy�s˜×ý¬wË2•XÒÔ¨ŠEhIzíyÍÌpXùë%Íkc󃦟“lÜé4fåC$ánËÙŒùý鬯ŸÛÜû…©Í¹²ÂÛKe E)d$‘ÿ¦/!�E‘gŸÍ%›sÜ$œ¾HÉ¥Ø&nΟ>5èçç>ÐŒ¢ òçã«0ÀºJø^lß²ýÛ:´Ÿƒ T=UÛüÉ…"ॾ[Jÿ-P—BeBDž_ý9ü…±”a§¤¸õ gÄɽ͂ øFŸm1/óéÓœÊSØ€>x˜{øßiå¯1§ ?üá+0ÿÙz«¿Ÿ’Ÿ§±1¥¬ü3îÝ/᪋¿Vç‡IÉ„m£›7Óë|~ Ë4z“ ´ô�µWîJf¤,kú�-Œ±çÌa½¬\Žá«ØBì?ìcü~q�Ôx·ðBÁ(`ÀkÍèƒr9w³Ù;å�ŸŒ¤¥¤n/Ë—ßå§:o,áÃ' ùôØÞ8ïvÉ>ªyÂ``‡ Ôztÿˆüýèòö—y?,ßÌ_ŸV�Í�˜ Ö"¹rRí¸¢J Boø:ðI€¬ðïWÄ‘uÁÃü|\t¸œûÀ«¢V)è¾jsBôÏö΃&dµi¾ÿX¹ö€Øü`r2úÿ³wýÏmÛJþwÿ´ßÍÉ>;~àw²Žó&u’¾Ìs“Œ•¼ÞL.çIÐQ+KInê¹yÿû-¾ ŠTêSÝ9mL‘ °X`ì.€†ü=}ðëza�~¨dR�èJ¡]ÌïfƼyRÔL½4�ý•x®£Ì¯Sܽ•¶j.V«ãc›Þp‰¥8káÚ˜läÙääçoŽc´°ÙœA?1ÒM–«õ½5G‡ŸÏÏ9?ê98ì{˜ÎÈ’ºÏGÿþ—Äó¢3­7«Ñ°š…tgB㪬yülka@Ä3%Ýl+ ÙÞb(q¯R[ÌÍÌÆlË!€4¨H:Šñ]sXGJ®¶u™†qïòeˆ¤ö¹ž{É>kàJË4vÏb´sžó- ¥|Ób¹\Ê­]DwÙÓ ÛlÝÓIüʱ}ûq½ :*Á±ñt3ñ¶�g’»ïÈ’F[®*¯¸Ç3ÜPh}ÖjÂ\˜üL‘Tp÷÷(µÿ­¦£]Ž\Øh¥åvºž_ο�åfM`qP³Ñ»øí‚nºl~ººË€ðCtâ¸Gf>J�:è· BÎÓs^84û ¿áÍ÷¯^Ñ'zížAfŒ%wËåüÛYà‰i%è¢Æ«„¤ªÀR9šÎl‚±‹sS½”¥¦sƒ¹†@¬ÇbPú½ˆÛùXýO§,éÛòP®±žìŸ?qMmÂK'¿1]),ŽwÇÑ©—]B÷Âà¯#øW'“‚šU“>šöš¦e²é�–Ù S¬Ò½Œ7äxô·Ñ1aÓX}ôT›ü¤4/ïHCõ²É’pIÿŠ'Sæü¥có HxäÖdYn˜1[Õ­½•î­ºÛFkBµ~漫÷óÛ ®©ný«Íq7deª»}i¶ôGÈDw/5\Nš�§§vŸÌèšÕínÇ€»­ÜÙÈÃÕ͑ŜÇðQB—tÃKÀ{£­r�5¥9˜wGÎ�¨óåÜ1â@`ö1�{î˜yâ$Ü: ö“„ânæœïžnC /Éqؤˆ{|tk~[õ¯ùÕ’G5ÅÐg)Ûj§‹Þ+�€$7DŒcús›óȱúfê¹yt�=7%~U§°õ éþ²·…½Ý%²*²fkødzæÀèb9X•V˜g§¦NbñçÒŒj ‹dô§0á"xýv¦Ú¥"f~s3*ˆîŠžM¦“õ½ôï,€¤`>#ê„}ýB#ã?³#Š�¦™Ì4y.Xô§JÜå31CHõ�‘�aÇÉE«ü&mâvÿÜø¶i%•î1š15Tr¹�îöâõ?GZFºTÁÛñ#²Ù-§Âø!¾Öm�Û °þ¢²Ù ÔØE,ŒRå«ôÒ”$i ¿­Ç“Œ†Þö.Bûf+›p1×~˜nÙf!¼ iííÙþíOßìÛê{¶§å¦1¥»+õ©€•K6Ÿr®p)í’0U¤U@uÉÒ*·YÚFv{ßhùªáýêÑ7Z³ªcR+×@³qÕIVbb^)3~  áf:nIèœe6W!Ñ'2‡ÉÚYã_(¾Z+õüáêÒᲈd2õóé|¿"¿bý‰³šÐ¨é9-§RxÔ3qïïiDOΖF¯e&0Þð‘‡&ºézLHäÏW+zÐ�¦‚›¶<>,5AöŋʻĿ¤Û*ðªAµZð� >�†1ìŸ5 [#7s1cП�\)ø"-ˆ£¿�šÜÍ ëŒæÚݳe1%6�•š[~CÎñ¿5rX/ñdÚ™…Å®¨%²,å1ð,ÇWó/+û¨¸úþþ=¾¡ãÂáA1ùõÀ%|P¦ZaÿS@-ípžj… ÿ¤Ýe¸d-1uŽU«…d¯‚Tæˆx0¾â ç =Ê>bèE`SšÇ¤°³�^ÍäÕO­ñWËÿ*þãšo4Ò›o´Zºž=ªëuÑnœOÏ�LùCPù†:7 Vv\#§£ós]›õgÙô˜fÃ%V9«¸¨{Csö*¦¦„íáL“ºóÕi�ÇæúÄãਿi”EY^uTè—"ÜD¢çFl-P-Âlhò° ”k Kû ¥Õ”…ÚQº`€L, ¡n_–ƒ€|ŶðÖt]³axø<¹¡# 1`c~JÔ!BÁ àÀ<} ìÀAÂQƒ^Ý(¦3° }ŸÜÌæK© %I.iÌ�`KË| µVw‹6F6L(�,®5¼žËþ9²Šr-b愪ø×vqÞ2N¼BãúGÍÑFo>­7B<ª…lhÉõŠÑÐ=È¥tF¾TQQ²nO4G„¡¨ä”Uè¸Cùq›.éŽ!·Ï€»ô�6C–eò iH Ÿk�3û±°q“NÁ stÖx¸¾]PZÍ•úÖ‚|iƒ3…ÆÊ4’›E92Ï º[h}ÉõãÑu¿jÑð¢ ðÌŽj¯êešc†µV&š¥—k<@m²Þï,¤¦±íÙÎL m&°Bà:Rcå@m RxŽ/2|Ü&ÃæãÉf´ qF¥õ̯އ3VOù•f,i½ûJÙµ6ûU£Ò„FÖR)6}È–rtêà =²£ø)«þu[;Á#jÉ#k;ÖçÏ]æ‹Yè¦ÖúZg�-Õ5Öî4*,ͪаîxVOþ•z©ƒRŠS(¥³µXq§j0u¸Ýˆr’"t!0�p�0Éÿf°W…Yd r+TÒ´»ú@‡hí&›ŽSøaÀ¤Yd¦ì@nj™á°žÑpâü|w» ƒ$ïjVâ{‹æ.FźúÈHz�®6šÚ`Ÿ«9‹µòÊ¡¦M|Óu“Y´q½uˆ"Ó6d[LØ›Éÿ?5“¾aÓŠÐüEü;có f?x´Wþdý|½^N²»59Ug©Ždʳ Ù4¹WÊ»…–¬FâµðÓ…p×JóŒxš–ò*‡A•L//­°&Ud]mϳ‰°F_© TöÄÂ,&‡0ÑrˆØ�æ-Wf9¤¾AÚ¤¨œ:4áGòé#útV½^-¯äÖkœ`9Â�ŠÉ¯ëÉÔµúOŠÑÉh|u ¢/Ç|ƒÉò3šˆßÉ 9 /i,RO Ì|Ù—4[vcæzI7glÏ«JÑ”¶*quFTÑZ׿_�ŒŒóµõÊüÔßøüxtÔB=Ïa|5¾¿ÍæÓ=Õ²Fû¹ª NñbA2ù6U©¯EguŧߓõÄk.© ¬œ¡»YŽN1¢ g¼-‰û©a¡²²ÆK�h‚k®G ½ÆÛxœÏ©ý«µ‘é’Cõm�ýìcÆz£%ão6·üç}R_Øš�åÒ\å,¿NOÓW}¹>jœ^.{§ ƒIáñèàHUˆóJöô´·äç'FŒ�L\©¦œª¦üiKŸ,æäjˆ2úÈ,çÓ·_µ .ǹþMM†YíBÌ[R“dø7×ä¹�M–NÕFo‹8åǦ@µˆK¦„Ê€2öòÚ%KÇHòÛ�"À WBàh}¬& ìoC„íR#³0§xÌ´ì{‘PˆR-ÿL¬YÓGeºûþõJÄ"n3&Û÷PÓGgôU} ‹3]™#ó´çø4mj�IŒuÒ­‰ç³|:É�ä y‹&GÇ@±Ö«YlÓâQóôø‘–F[ûlœöP-ü/9¨±`‡>OœÁ—�Pþ§öVœÊáŒö…–: ºþèÍn‡«q5÷.(`}Ð= ;÷ãúþï¾ëû?ïâb“�–E›Î9Ó¼è;ç ËI9™ÞÎlë-žˆ[OÝúp›—ü>€û[vÒì.‚;þ6¦)Ù]ÂóžL!�½�ííÕéa«35BðtZ‘ÀôYUt°=m+RäX²ªªö’­‡@­*úÈìîvUÑÈÏW[U”Ò û•�N®*5BŸk„ÒQÙ³jî–Á¯ ‚_5þgƒà÷u‚_Ád‰Õw”îq¾œ+²ß)²í¯Ë?«ÞuôàÀwÉ¿Õå?ýAþwr©õM´“žï}„>óq´˜ß.®=Dë è.ÔK†‚X?�|½{ûã;ç¼f;5×^žžþ•¾¿þ0~yÅ—Ÿ¸'#&-£OŸ>í˜ø£«=\â²ÉÿÞþÒ)ÿnÜ�ÿÅÞ ÿ»¸¾åó_X&ü¾2££ä|©}ûÂ8lm'ƨñÕ82æœ5s9g랉›ÓÓSýø?ž�4vWÞm$œy·W³®Ÿí±ñª´¤½ŸU·5¢¶?4§½­vÉ¡z@öu�œµØË-?UC°Zü?#_jk:Œ$Ô¦aÚÃäÂÍ:‹;N jêÿpçøÏ÷üþó‚Aÿïâ²ã?qÞ¥‡®½‚Àõr^ܱ٠üÄ3úPžfIŸ8[“žÛ¡R²µeZ*À… *LHáà‰Y";òd:Õr}ýfüþùåe•{ÏÀ&�ð™™ ØrËË&ÿ�ÿ çíäðß®ñ_8à¿ÿ=büüø¯iÿó†ó_wrÙñÕƒÐÛŽ­çðÁÿ·¯î–¬cïÕýŠº5’]ò¤ì°çG•ÈWIµ]¾~ó�×o~°X9ü›Òm©hÆ |!w  5^²WÎá¼�!Ó7/öÅßwÙäÿQà?4Èÿ.®ÿíÿþðß#Æþîý¿6ü7ØÿvrÙñŸnd£`ëuí7€/a•ðןû²ÉÿcÀÑ0ÿÛÉ5à¿]ã?Àþ{ÄøÏÛ=þóÝþs£Aÿïâ²ã?ò¾]L óò„"¾—ü‰s!~|ùŸÏ|wùr@€æË&ÿ�ÿ ò¿“kÀ»ÆÞ€ÿü÷ˆñŸ»{üMûßÿ½“ËŽÿòu~í|Ku�·ø]¼¿xÂÞs^h�›ëñû+»›w€„�ó²Éÿ£Àá ÿ»¸ü·küçøoÀ�ÿ¡?Àÿ6íƒÿg'—ÿex5ÉÙ`èÞ}O8äO@{ÆÏlúË&ÿ�ÿ ñ;¹ü·kü‡ü7à¿G‰ÿÄv7Ž»ð_ˆêø/Dþ€ÿvrµÛÿÂ’n–ëù/d¶¦¿kº¯Ëû·ÿxùf,p Ý*Æ»¾^’º8øz2+ç×Ég†!þ‚ó$Ê‚2rd. Ò,Nœ–$�Ý"OÊœAGžƒÈ€~úY- á”°�hÂR¤©ÓD÷™¹¾zùÃë·o¬´±¯[(Lý’”Ò"R/+S/HPJ’,Ê"BâX£�eÓ óOŽwíòÿ°°ÿÅõø�Ð�ûßN®ÿíÿéãë€ø ®ÿÙæ‡»·ÿ¹04ìá€ÿvrµïÿçÎ�…ißÕJ=Á¼@räþÞõ þz,^Ë—]¨0õ³$‹ËÂ-súÑÒ%^x �a¦Ý¨PÒ§¡A×Ü—ž(A8\�¤Î1”šúyúI™Å™Ÿ¸ýéY�˜wSÒ h,_ôæQ† ŒÜ<Š�,ì"TäqŠü £ˆÄŽûÓÔÀÎa;·ñkr2Ê  ¾‹J?ð³(–n%¤ŒP„Ð·Žœ¿�˦ÿ�ý×uûïN®ÿïÿ+|5 ÿý?ôoê¹úCOºì¿AèÕõ¿ ñÿ;¹6îÿ¨¡ÆÏxVL‰Ú•QbFõ\¡Æé$S01Á„"V—$A�ãÂu‰�¢,ñe£(,8Ø·åyxô?š„ç ™RØh�§ÿ'ű¬E™ß2Tm‘ÿ…€Ýö߆üGhÀ;¹ü·;ügŒ¯ à#€€ºþ¯ÎÇy`¸Yÿ»®£¦ÿo8ÿe'—ÿÝB×YOr<�±csáÁ…xðF<¶bq3¢ÄR¼ǠX@‚0 ITx¹—$n�PŒ3?ðã(-£8Š3 ¶ôceÀ¼5­ÏÒ:ykZ�ß+£eAYᦅŸ"‚âÂ%E¡n³�âÅŠk•¿ãÕ…ö»�”£<ô£2Šë’"üO²$�³0áKã4�ã,õý “¢E ô,¯)yeêeî§1FL²P@B€Ü8‹qîRnFJ�¢ÍVPS–p«Éð¿" ( PjDJä&^üåáþo;-°æ0"’�x~h€ ì\ÌòÙëSX+ç ``wéCçò‚AÓ%iTT’Øõúp¾9%¨Øî™lï=-@'%ñCP¾®‡rèŒeJç Ð!’ÀKŠlßbbFIH¢(ös7€IBí]z^: ƒ,n1>ô)¬•íe1¸íAÏ*H„BSK Ĥcf–[±�š�n–ó»E¥sè©»?Ð'[˜bH’C_ `Zn“Ó0.ÒÁ¼†œàNÕGÉàƒ€AOÜFH+§¯€FàW™Áp˜»0$b7�©t²�Sß¶7n÷W›ý÷!€Ýþ¿úù�!Låûï.®Áÿ·;ÿŸé_€ƒð�wêú¿¼›ñiåïÝ¡ÿC¯qþoøCü×N®Íë?@º&7fø‡eÏù‹Îè¯àÙ»ÞIŽ«¾&(C¤DqP‚ 1ûðžë_ןõr··ë[rw¾x/NÂŽúë<³³š�ó��EHD¡�AÉ(€ø �!‚B‘á B >…!âŸÄ«îž™îéé™ÞdÝ;]öÞ]W×v½zUïÕェze½#!ìbÖ‚õÑUÌBC ‡f›­ÊÇ `¿£yÅ—§�+w�aD…’–ë<úœ† �RLD‹gjêöGn^óÞ‘[[¯b>E²ªÅ W`àI‹aãò­œ&®©7ôašì¿Xà÷~!g% b‚ÿµåĈD � ÆÚ„’ÒÙšU€ƒ?AÅ#úä¹%CàI( ¤¯×„ÄJMÖ%†Rg¢ûÃYŠà_ŽšûÃW„œ¤»ÃÙ¶Ä“bàUáE ! ‚H7<•(4£Í!xС)!³-’σ^È}¡sZò·…w5äp–0dòü¨ï¾¦m’g]íª±Ô?ÊÜöÙçŽfNür$ ƒ âŒUW×¼Ìûæ e‰d Gq¬yÙh‰44*Ø{ª¢ëL8ŠˆzÌŒñA, Ì®*£æµ>ÂÚ†#a8È?eXh¸"Ì0 “&Ó‰á„WUÕÕ[ŽO­W—0¬3‚[’p¦ÀsÖ[×*h‹hÃZó“fµ“Fj˯˜9–PúKb‰Ö(1‰ñ.±8±Ê³œŸŽ²•*$¥n¥Y¦n‘‹Ñ,œL”RÐwÊë4£ Ü4–¼©ÂÏ髯)iõƒv ]º„Û+iÒ%F)¬)7Ñá™Û„®êö’E޵Kvâ�ÃY‰u'’ ·‚bÏ¥÷Ai̤6BÙlqªé©ËùÒÄ"uóUŠSPȘæØqEEl`N¡Dg(ÑØ$ ©*®W,ÒU\º8e Ì¡DJŽ…R"n]Üñ`<1 �e )›{ò–Ñ6wêÕR·òL(°ˆhÊœvØ3ŽÖš'H1Œ¶ÁtgB7-ÕÙçíÿÝþÿVRçÿkÏÿWö¯tþ¿Îÿ·©þ¿³½dmü?¶Äÿ×Åÿj%-÷ÿ� â è:ⳡà@Ä‚ñmj˜dHñÞ^Ÿ¿]‡c)‘V:G‘¥Þi6¦E‚¥âŠ0ÏwÀ¯Ä±3êæX¶ŽÂ9ž­¥rž ®­æqß”J¯À àÒI¦,¼òñl�üŸ;þëÎÿ´’:üwø¯»¤Ã›ŒÿÚ<ÿ ø/Á¸Óÿm¤ÚøÏ™c°#j‚üÌ%X€~�|½Zë•DT&ÆYž(©¥TƾR‘õ˜oNQô•©*ýæ8ÏuZsc�aÊSL±T:A–+B°¨¬¿òp^]ª“ÿsÇÝþ¿VR‡ÿÎÿuûÿ:ü·�ø¯?8—û9âÕû»øÏ­¤ÕûÿâžâïÌ–‡ó}u[fR˜´"Js ºJß+©µH²¦‚|ûD…ÚÂÖ†Õ&VwýKÐ`CÐ9«ò|¡ã2ù߀ø¿H NþÛHþkÿÍæ×ûuØïü±_LUý÷ÿVâ¿þëìÿVRÓø¿Eè“¿]{òW›ŒxºTLËäðïì¿VR‡ÿÚÆ�ï¯Ã›‰ÿR޾ Àuø�²JüwÔÝÿÖNZíÿ+Á¿Êýjýùëê4§p¯-¿™¬®¦š3Òlœ–ËÿÙ"Àõë¿•ûîÎÿ·’:ü×þ+ίìà& Àeúÿ¬=€ký<©ÚÿÝþ¿VÒiüÕÛ¿*¸¬6þcÉ63-—ÿ ÀÝù¯VR‡ÿÚÇ�°Ã›ˆÿô`p[žùêïZý/8[ÔÿŒàný·•ÔÅÿ[–©)†ÂËoÈh)_Dv{úrÝaE�4"8, ŸD"°'–{âm!ªa Ÿ.>aŸ°‹OØÅ'üzâžÍþîÿ_Q_Þ5±—}¯ü¬‚ò\–Ó×tãiÁâ [N[�”ŠZžPŒ0T6 ÞdL#åU(š†Ék>¯í4”¥W:^ñd…BÔho„×¢9M] Ëo¨@–-Ÿ9Û%ìs8‘²ºÊ²”›XÔ•±"ÌyŠLÔpúƒaÃ¥qT™VÉlª´ UÚv¨Ò9¡· J‹Ô?в]?zz?b“^¤µwP} ¤Æ÷©Íe°½u-­•Tý?g½û·ÉþßÅõ?CÂuþŸRçÿoÏÿ?õ¯v¾ÿÎ÷¿ ¾ÿ˜õ¿hßÿ�Á¯øÿQ·þÛJZ¹ÿƒ ÛÄ¥°f2åw>Ã#X¼ðg®GOæ»BzÛ€qæ%{P®·[(h'…6ˬ�Y�BÁ@,|õàÆá­K׮;�¾O!T4©¬–íÁñnYÎs”x0- L8*Ô~�V®wÆöèvzv<º{<Ó9q/Ù“1ç®/-Œ5f9c˜�qš§8»¦-õZÕ7ߊW¢#+\GH-§q<ÞöÈ€_ÁÀthÓSIX‚é¯àT·x¶©êÿÝ�õ¿ÎÿÛJêÖÿÚ]ÿãÝú_·þ·ÁëIûûÿ%‹ñŸ»õ¿¶Òòõ¿¨ã‘v‚&£¸á~†^ŸÜ§CžN^8™øa}ײ¢½É¨§{×ç…z‡³"€ ¯ÜxûÁ�'—œqÈæôÄIü0(_ø†‡�¤þ�ké«ÞÓÙ‹Þ�<>zcï]‡çsjâ'UåCð_wÿO+©Ãí⿤ÃþÛ`üÇÎÿá*þƒ9¡Óÿm¤åø¯xÈ"‚­ƒ…g_ù©Œ½²SUþ7ÿÑîþ‡VR‡ÿÚŬÃþÛ`üGÏÿÅ`ü×éÿVÒrüÆÞBÖąסà@Dñmº:›­ËÀÛëó·ë‚ÃP"­tŽ"K½Óžke‘àA©¸"Ìóð+ƒĄ̃›¯J×Q8_¤®¥rU�˜@Œ¶šÇ}sDP*½¢Dsé$Ó� V ƸØF‘Ì5pÝ+‰¨LŒ³éÛôZP'½]޽wN̽óðÒ“�ï÷Ÿªò¿!ø¯³ÿ[Iþkÿuw¿wøoSñß|DŸ­ŽY­ÿ1J’Šþç´‹ÿßJzüÂöBÊG^ïòè~ïÂã>øð~–Ÿß è°× ƒ‘žìô>Lžxð' ÄõÅ÷îô'~ûäX[ßÛé�î�õñé›ãQ6 ìô´9 îNüÅoF¡È2r9Ùéõ�bÔ©,s¨ÇÏö�¶'£ã�ž<¾ŸeŽûÏÞ�_EÓç{}7¹³Óbšóâv O!‘,Çhû\ «tä¶íh0ïd$Wšs16òÁ÷–(2ƒ‘}n¡5åÆÄ_ÚÁ ‘ÙóŸRŒÕ4cNÍÎÝñà‘·f‚x{pñøèÙ·> LÙûcP¥Úgõ§<(QèÞNz§%}%­ðù”!½¥•¤­fÓr)EË f–ä%§Eöû~àNMoS^s^fŒÜžNƒkîÌG]Ö|ŒñôsùˆKÛ6çʱvq>Øž79ææ#éa…âYÞèn4­8²��ž‚¹èÒ¸¯�õžñc§�ôc½IÛ gú!ãLAò–q©H^dg:z³N8-O³þ™�ß(n_÷`7ÌŲ;�ø…fZ§SR5ÁªtõŠ¿œ�BNÆÖT¡ÄßNÿ^ìù�rîB/W䤨€´»z|¹œ æz�LKÎ;ö’�ôŸ÷KÇÄt fskú‹õ*>ôáÇ ‹'šéû’Ⱦ 4çèÞéyŸµ=‘u*󤫅û.ÊÊåË»{uJùá}µywQ‹—…°ÜÍÓ\3šLFËíáèÅ팂í1À¹»'Å—÷¼y®?™¾‡O¦bÕ¨`ÚOkKfô4ûj^ví‡ïoŸÜÑÐ=;=�þÙÏøY£A�õòÿ/âäÑle=z0ñÃéDžj"¹FU^/“Åü|¬âÙ‹iW£|ô8Ê €Ñr]�Ÿ++±ü³FFÒ¶ƒö0܆££Q &JÒ¶�êâ`Œ¨~;.�u6&g⨫�Ÿ æ‚B¬ýò‚XõVU·„_™¸×2l�À�æÄÉcå<�ÉüR)ï�[veP®`?MµâI¯*w¿¶^I«¹;>‰:õÁ(?±´cVª°qn4ÝËôTT`ý0›ªÆ¦VÕ{‹Ø�#_ž¾z8ñÃÒœ“ÿÞË­ÿR%]Ãݽ½}¶/rô9°$¥ÍðáÜæŸvåÚ³*åN>N5ä :\<|zïh2~¡ ¶Oú/úˆ›�'Ë6ö³ßŒŽ‡^ýäÂ2&LkŽæéôEµ�)62§o÷Xic”—*SC�šJë.BÇöh\øÊB·fe_šÑ Ø�{ùP�l—³rÚSŒˆ]%–h®uzu…lT1…ŽdÙÑq 4ØE½6HJ9•+­^!'SY�Íé.•I3JZ­R3ƒgÖßl )q Üÿì¸23ïP¹t ©²¡W7H³¼L‘õ'zзÓgj¡và\9xæbxÇ%½S„ê½9².O~x:Y.Qw{÷A?éAî+‚¶@§uD±/U›×º P¡}¾/³ÖÄoœôLV¸l¹5Å´ÀµÂ—ûCø ô`ý·\¼øøD›Û:býè¤*—ÌpÿNÙK;} cPªâOÀæ„æð9Î13­-–ÙisQ?ó]¼S/Ûé4°¢§ª…Lû+ç}‘Ì¢§bÖ¯çíìY’Šþ?èÈÛ` ÄÎ;Ó:Ö­ÿ ^9ÿ-xçÿk%ýÜÍO¾öÁïŒCóµW¯< ??oø–Wß¿øóÛŸ„¿¾õøê{ éßö†øóÀÖ¯}ôM�Ù³WŸ¾¾µ5üÕ­­“_ØÚúG¹µõ3_ØÚzñ5[[õû[[ôÊÖÖw=ÿ~~ᥭ­þààÊ¥[÷¿øÏú£¼åÒC?û'_üŽ�×ýá«¿ÿªw¼þÚçßöyCàK¯ùòzß÷`A_ò¥g®¼Ÿém7o=ôçúÛÛ?þÁïþû�}äîkàÝ÷C¿ûOÿó•/¨�~ÿo~è}ÿÉ/ÿõ}õ§ÿø«ŸþÏ÷ýò/}æýÿ2þLøÄ÷~äÚÿæ_çÖ…oþ¦þýÂÍ«�ª�Ý£7ýØ{þö­»Ÿü‘ßúÜ�×}û«?ýÙ7ßøøácŸ}ˇø>ü—ŽüÞ3?>ñføÄÕï»üÒ�þÔKî>õÀ#¿òÙ[ÞÈ®¿á×o^½ð�?{ñ¥¿øÔðß¾²óŸ»úÿý¿ÿÇÞ³@GQd; �ƒµ ¿'“žo&$®&™ŒACB|À‚Йé$-“™a>ù€øå' h@V] (�ž ˆ²ÂJž¢ FE`Ý,àç)" [ÕÕŸêîêIÂc³Ï³L¤3}ëVÕí[·î¯n70;èöÝw¬¨hÓ¡TÃÛ%ÝF4¶h%÷\Aò7“út�ÉdM|è§ »æ¸¯44L6|6hü/‡o;vó²c ¼µ»¾0$.høãÊ9M[>´�ØyÜbø:Úû¡±k|èw'¿›òÆ“;Ž.<{ÿ/õ)}º4~ý 6Þ0Ïóü‚ëÏwù߬»OUfö|¬Ãüã>rzNÃñ�œÿЗÑ!Ýþàá6ºö«ÆÎWdí©]×t¬æ¦Í‡®©Û3ë¹äqæë§¼qSÃñÇG›3míß~=qnÊ †1/l)÷î·WAVÉϻ˽.gâô³^þ\ò.ÿ½ÐùtÉ¥óù?v«æü§ÝqùüW›|òÿjø�—ÿ/¾T5ü:Åwb¯ØÈ7º{nï|8ñº„=zç69¶>¸*·ì*[òŸUMí7øHÏ%u‡v ÌxkÆ´#ïo0Øt͉š¤¹I�í়ââèRÖ”ôêéš¶l/[0¼ë´#ϯ›t¢ÑzÏÂEKç‘Å/XjÿÔpü£„MËÜcwîL¬z?û�þù‹Îu3ò÷ö<ù3u8¸?V7©qpv×e\ïÿ“|ÇSiôž©ç²÷ô655uLYÊöò¯ Œ¿­cBÍÂ.Ýò¶CBü‡J7müyê/eÍéðZ¹þ–Ëïh›aýw7ˆúßÒ'Æg¸úßß‘þ·â£m«{g÷¸ê›à�u&ÕßóØŠ'>âîo÷ò˜ün…G¶æ¾wËŠáKÊ:­èf*—Óâ\{JNAvßeKöo|ýԆݧÞË]mÚrzÒ+G¬Ù7×¾ó@JÇy–ä¹W&M_×Dwn÷Ú¸.3™ ß]õýÙóeÛŽ¾­¾iˆiÀûz»ÜÁOŠRæ^ÙhŠIÜõØ=™;¹«²ê:·ûó?]�ôóêq3†¦t›ytæì7'8ö6Ï8Qskqñ´: ¨ï¿;cÄÀڼ͇¦å¸ Ìcò;=üÔ¥ÃW5VåÌ–�¼v£)óo_O8ÛïçÚŠÝ÷¬YœØeVʧ�Í�S¿ôÜÔNÝúŽ( íîÖðrtüþº÷KoÝ}öΆɧºœÙ{}ðבOô?ØÌôÈ«Ë8ìåÝ<ÿ¸»aÚ¶Ž† Užy´éÀRÈ[ÿ¡"õ7õ!ÈÿŠ6–ÿ¼ÌWËÿËçÿÛæC�ÿW ü‡ÿ;xCû²ìÙÃÇ>º{´üÝ+š7:Z,�V1aÖ�í –°T>ô²Œ¯fò;l¢‘Ì/1¥¥•Mœ81ë�ó®Ù?ÿôm¿Ù?ÿúëm KJ íÆ˜ºÞ0:ðé–+ Wv6Ôw¼6ë�£y—MÍ6ýÖÿ%w6«ÿÙ´úßåü¿¶ù´‰ÿï’/�ºuÍÁ‚Äv¿“aqþvÚÓãîëÓ–n¹îàÞåæO3{ [þàÊ蹿>r¡Ãôƒõ3n<ó,ç¯6%ý£òõ÷¾ßú^¹}ÊÉ-§fù�Skw}á²tæJ® Ç€ß1« ¨½S�õæ¾Ø…šúÂn+¹¤Åòí�úþ%ñ±¼dÃÄWÆÖª}gUÉË?m»6©nϺóД·2î÷º�:xÒYwתõÃï¹~?3¦gtü¬EÝ—ÜnêyuíìÏ>¾ÏñéSâÌ+ú¶7w8“µ~ŒyI]Þ»®¯^•ÕiºgyAutí†~Ë}Ç ¬=:²ôÌ™Ï\è˜öì3‘ââ��ïLÜNo½á»^ûN|9nXÆU¡q�½Ú4ùck·Ø�ç.ìýû¾ú®{7ÿ0åÆG˜NI[ž-¹hýüã矬üéæÏç¸�5„_;ÊÕåþ#·�Ýv¤Ò¿Ýóü··tš~èhè+0°öÙ†¤-¯öù¥¬Ã›ÕÏž©¡ç•mì•7`iQ¾ÛÕ§‹+õûÝÁvSù髚g�>sdɰú†½E£Š¯+|w[�«ûÞ4oÖқƮ}ÒP0è¹ôÕ«�×ìHX›¿œ{z{Æ‚Åo�¾Âàøbß½œì|òÔeéýÛùðò߇NB\úÌoô‰/ÿ�–t‹Úÿgs¤_ÖÿÚä“6˜UÎR€öQ¹EETi0Lù‡cø3LÒ0QQ¦ÄÏš(Wi¢Bà7 £Q"™�¦)‹=T�f…öÂ`I04©rZA·óï³¥†²ü™ j8[ÉúQ »ÜbæïÁ“-|*’ÏAqÐP´•?$DêÖEîV‹ÅHúÅ”®•rNÊ­ê!)rô¹<®ôGnÀ$¥G9œŽôœæ†+¿4!jlNçs’ŒŠëÝHLr4Љï´@¨r[C§:êž*Ÿ{‚Myå{¨dÂ+O85‡N”ű:y|£ÀÂÖæsø�¯3B\2™£r©• Œ¢2¬2--øN%ŽÉŠ'—`›D}fž¦“X�‘ÉÖQÃ×Wd¤íÒ*æãK~!äЈ5¼æül}Æ/JS0aÅ*ŒmnñL˜z¨Ã°¹‚­€¬×›|ê,d.ö[Ìϸ#!ÉêÒš¡\E™ Põm~€×ùÕ4¨à|>?+³Zš:ý(Ù óE¨n(´� ,RëŒSvëÉ P)#` A¨ÄÍPï8'š¼ØR�;dc¾gü 7…‘Îfó²p;Tqs‹¦]@pI£KÝàPNÚN[5P¥‚!B±J\Þ`…`OH.Þo/A€è6^@¬`X æÄ»CUƒý`�„¿rðVÐ¥Üa9&B¹p¨ÊrŸßÇ•q``¾1Óti)¥€‚ø@(ì ’hŠÁ¥¨tœ?XÆy5] Øx¹=9ž:n»,©tO¶''SeÞ S¨DwƒF’RV¾.�|ÎIÉã<Â_N‚-m°x\II]›�ßéÉû\ÇX+ÒR#: ¹@(Åâ¾8h´*ž‰‹ÖõˆÈºX¶”÷ ÁY1å5¤> ûÅÇ…/n Ëê@êgBÐD¼Šï�ƒr´Êռˆ¿ç@#¿HDK–Ɔ!*F¹¸€¢w{¶+7;[@‚‰É*Ö¸ìÐ )7‹ B1‚-|ÇŒ^˜èc½þØ€˜,+�Ñ©hõ™(s)¬?Á£¤¢aràà²uùÛ°.UWy(ŸðEXžŠ°ˆ¹Âøq8�v3]ù×Äw+ˆ·Ð_ØÍQlEȯ„�¾B`òwL˜©ˆèè8bYõÂÃb8ë[xqJKz§Î ò…Æ|j(h'vîp8$Z±!†¯K¨ñv’Œî¼<»‡Ös#’<{ñµ -ÁÆÆDÔm1 ÒüÕ1HÂóP{öãö�‹s—€S¹�id]”á„x2¸YÄ×qD!mþë£�SbÑ>Y½‚ƒ�ÂÁ2QVµ•ð}k†?Œ‹6ô ŒØ¦ò"tü¸a \É×J(Š£° ¤±„P±âãP™Œ›µÎ¥µ&tèÀù�?–Eƒ24+µQG‘›oi|°Uà­�•ìx$)ûr¡ Иã_�Ø¢Lá¨æD(ä¥ \Ï$(*ËHUxJD�â¯j£=e™YÂ0©‚òùÍa¶”7}Ú�FaúJ†;CGÑm., 6=@‰?�‚™îÄ«rÁ�¸¾¬»Ó�Å‹â�KÕêXÄÂJV‡ÃDÉÿÑæŒb 9¡ø h`ÕO(Eåψ B]ei:Œ$'¬yn&4�ˆ ò‘‡Hˆõr¥À8O{‡@ž‘x©ÙBQÚGªW‡JE®l%Œ±”|¬Ž7Êù±ágª[bîO8 uE)}HUÑaÈHxÅñÅâÒ6n �[TŸL\¬`cS.U_‹´ aq!°–®Y2´îÊ¥ÈKWL¹RyÔZÔÅ"ÈVº%˱ì-G¼>–À7-XŽÍ„ÓÂÅ]„Á­Z”ø‚Aã!¬]Ø8+ñ"V{+—fËhݪ|Ê­+§·ƒâÕv4€øúÅ«SÒâÒ!«ùR]/hcTNr‚S†ºÚ>%(˜[Ñ ~2u›a­�V‰D�YÓNáEö’bV`·„Ùh%,ief«½,ïå×Ñ�hp()'†fÃoMnIýPòø¤.)ADlqT �(€x[Õ—ð8xUq™øˆE´:ø}\X�^LÖHòcaI¶*É$üaRÕaŒ3#ÑÃägJØ8Þ% xòks×4V+ÖB¬o««¾ªZër6ïà•GKdÑúÇ`ãûyÓ­`׳�öª!ØÎè°e8rì(TÕ·Y0¡V¯6 ¤‚ö{RäH¡ï ŽUd�P¤Sp²áÞTQ`Ú°p"òÇÂ(ò3ˆÑXüÑr6ÂRL˜åíúh˜e©JŽ­¢8`ªÉÁPÉ|L-UIãóθJè®e½Ñ T�—¦Z)ªcÒ¨}òúê”RcúÉãAö¢FG“¼Ò²SZÕNgcÐsùhˆ,®VN3‹•päG/°©Š€9)Hr„N' Ö�X]PÎ %6@ñ:%©ðtRE#è›Ãg‚?õ 0ûX×Ó›•QG;vþÇL‹õw±‘…Íl%_ÒHê=NÌH‰Gˆ]ªkªMËcf?:gÑÂÇJ¤AwoáÒ¡¨^çPtâù®¤ò¯ÚGb%íÕxulM2ì� ‡%—Š:�~'jpð`O**��gs¤N‚G£tïBõU÷^Dï–Î×D:¨��ð;�Lü�I ž¢Âd•œ~œWJj'UÊú+YÈGXÿZ5OÖ´ªû²H:²f8q†ÞÌÖ©©LIL»—…�VaWlãVÕ·ê2ë�J¢Xfaµ“‰g^"¦R`šÃfq©Æ¤)^N¶dKƒðÈì7gI%õyS!•„NU”³¨$ ¿O´d¶| 1ß¿v¾¨�ÿ'3ö½ÿªÙÔÿþI"=^­:)ÞÅ9ê'åýCý«& �D¥¹æ….rü7ó–§‚±ú�^ é¥q„¶Q_bõĵQGV ßÉ9Az6¬´ Y³´Ó‚Ó/X-êxš”Y¹#EátÐ9F¥êÆäÕ_•ãiH˜’ju;N®ÍìÏtì$¡|ºÓ•îÁˆ ºÆ‡-¸I§:¾¨P¯Šî±ø³Ì;iƒq%sþUâMR|�~Pšªâ͸¯‘àÈ©º$×¹}«smµ=k“y­Íûû[ÑJ?<'@�RNòl©9K‰Aø«&Īp wTN–¸Êk‹ãGÍ:Ûõs´`¨dcˆÐNÞKZ76ÍBˆƒ?4¤” G¢©^X_G+`"D”~F£úD§2—o�¦�Í;=6kûЛޡP½�£î›i4L¢ðwcÊ.z1’x£ÅÁ¬VÄÇZúàÿk¤°U¨â¬ è42&‘3eÆ6âEø¥Ü9›ÆòÆêÚ‚EíKD62b¯“›¼Q>XÎù|l@µåI+^<�ó'LUíŠä¾ ]Çc]#YC¤RøLm0ŸºðâÛ~®ìœô\,7 ‘–¯ÉŒçŒ<;>eiÆ‚÷I™3H«§îçàÔåã©PÞ #z âq¥[Ä¢@+ú<q¨Vâ�‰C4ì%dDª‰éÝIlN§3=W=x 4Ä ŠI�“0mÈ!¡zÙšÞñg£ê�²é²ç:Ü™ª#”ƒ†Ç¼œ�¡î3€™î`l%c’ w²äµ/."›Ag´ÒF Gt+A õsº²­9n ÝPæjà!1„$gy¾Pù›ü¡¾…³‰î.¡ì*.§€Ô £Ü$¾!ì.ÁIÆ[F‘XX?5¼X@ïÁPÝBí˜Dk@ØþQeR€O|rxoˆmõ"ô3ë"*q…¢Û§ôö>Eó�!Ó0¡%zyk6ô¸éŸ¢Ï\‘†MÚXTœÑ`ù:4 xš–Þúáó'h”A”ÔEã¯|�°0øÔ�*&`ü5…§¥ø¨&ø+F€õ¢ü¨dÀ² ¿|,ð2üa}ðg4èCi[QV/‰ñÅÀU½‹ N@5’b¢|TŽ1A£æñ`©é¤u(¼œ‰°ƒ‹¯ÏDTÖÜ–Î}Ò¹â«`ôHÓ¶òxhl@úO¤mGEÓnlT2#´í(4üGù¯­©�KçÉý¶oÛþm´ 묶¶í>—vaä–8E¬Â#f‚&ô …ƒ÷H° >,rš±n„]s„&‚rÚy{�R ‡ñªxx ;'™v2(ßF¶8¡a± 4¹Åm ÐØÁÔ(¦Iº)$}(g�Röz˜ì!¥âÁÿkñå¸ç]S™‚Ìù$+ ätc¶zO¹ïÝÎ ÐdÞ5(ÞPÊãðjŒ‹'Úâ�ÂÛ’ÙC A»9`ˆ†fžžó,� ÂÀýÜèŽñAy˜¢ žf h�r°ñr¡­^GÛk5{&â¥6‚dÌHú¨Ì7óœ¹U³lRyŠž“_!`]§‹d½æ;£¸O4±Ãà¥nx;V¨ŒùF†òÅ{¾$y¿š±¹{Y9‰P„+ �F 5Ïùr–YÂ@V¡éü„² ‚ˆÇfaÊ£Uìß-d�²CS÷wú £‡)R—ø÷TÉ»¢Lâý 4Eú³ )Û¢0øsïÜ’9:ɽ‹2DHˆ¤æuŒ¼^7b=Rù3Rkdù°ù°ù|òùäCäCäs›Í8ï@2bkô¨¨‹X€ŒØ™Œäò}’W)òMP BdbèÜyJX‹‚g‹Ì:Š:àÐòŽ5‡qóÏÀ€ÛâT™ÁàE # 8R ÔÊ9‹4“S”‚ÌýÐÒgɼ ^ΊÔfÕ™z²H£>TÄËýh¸V•ž=µRžh!Ò3—¨Ô§Q·"Á— uÝ0€ºaÔuS…¬9’+FêYYl:=ÈU(ç]dsm”\*—\2³ZšQº¡š,m"¦¨Ž/HæXÿj°Œp¬ óVÊžüˆ´È„,“…mLZÎ b@A€r$ S#›A‚ði�$v »Bò=8½ðÎyí, 'šíPƒ `ê�fžj¨qš¨ßð³'eç7ô_΄þ¼mq÷@“¤§3@ü(N)üêFü©]šàñðõôi¢·r ×DoƒsŽ—ñ>¦m]H/i…, ØûH=éæ{zã�AÛKÍ >œs{A^ Ñ¢h^5§�Ò¤íÔô¿ÄÝ6ùAJåù�´ÛÂßOQ½#ðÕìàI§WâÓ™¾UuñÏð�ùãã¹» =mm~zàWRZ4þ³‚‹¼»mª;Cë'zû‹£M¿¹Â'Ô�k›C¥âËÕŽ>m|…¬ÕN;õÞ†óq­FÃ; üÔÙZ�Ážn•Û‡Æb¿ v²&Ë "Ú²Kñ£]攉@ÿ”v•?¹�Eãÿ"à”ô//¿ÿ÷—$úÇG÷%ÒK€E8´Bbfý¯væÜÉU—h ÕÔ�Ù¾ïN½H²´ØX³Øµ^Ö1ú~‹q¶µó…-ÂU�2\×WFH–Hpí,ä¸&\íïû¼¨½ÊÀÁ”Å¡KHiªªªþ~J]›=rvø¯ÐvÛ7ô& n߯߰Ão^î†ä¿À-úªü@~šâÁôV«££Ò7ÿþ­ç1RÔÄù`H¤ÃoB¹¹éûC½²µºî=Õï.¤ýéý¨E°â“ŽõGÒ/µ T¯¤ƒi—ßàÇ€©myvnnNôa·ªÇÑ–×Q†…-ªO#jÒÍ2^48ÕK)·Œ~*ãihÅúLî»> Bw£E›¶3ª2FX Ùwh oŧ+) .cÈ\ëýkJ…Ã{mußr~L¬•ùë™/˜Ëørðí³ÖíÊ÷5¢5zúè×Oa‹kß¶Ž&ˆì6ª>¥×’ïqJ— ýýÎÀ¸êá¼'m} DxäÎ0YžÜuþÏ–J{‡çXúâ굕{Ñ쌅ñélÍ*aQRà3põ{Ç@oïh@£„î1i¥¾ªŠJÈÊÞ«”uG,6G׈óLö ý¿ªuHˆëÜûPlçìß±äa®wΖ{9'Ô}Û)äÓY º¨IO'ì ëP >qqw\S˜FéÞ7I|Af·»¥HêúË_äîcäá9øqb‹aÜþKf<Ñ�õ—¿yѧ¤|�–7ͨ7u<]�òñûÔ¥àö@7ð„äÄÔ”§è³#„g¬lÈ|™ÙþSÿŸñ#ðÓÛX”ÿÃ(ã¿#äÐeþÿ+ÒRø?'‰ÿ[VïhÕà˜ü´É°’=:3†kåÆf|ÂI¿Ñ »ý�qóÈëì‚a–€ãüø}3Ý›rDc‹óÍð«BëÄ>¡ÒVyâ]ÝcÌé-üjïf–älcF¯ n»Ѩ{^Ö¿€òÂnõ%kO/ÃÕ!ÇPê\I¬Y—KÑCNj«ƒø‚tO+uòÈn(Œ’‚˜9>LbSéU¼ë'Þyzxwõ¥ ×G‡¸×ûUÚ8¯ ûª�pÐ0òH½Ÿ¸Be‡Üð‡„ž1GR×SÖጆs¿'±CFD˜oýÆ\6ðúCçûP^\6—Úà¦+:Åì ¡ÍÞu½!õ û¼òsÚúCzŠ}�õTSw3Ÿ¸ï²ÁÃåù7Ç£5Ÿeöõ§šW[Þ´ 0{Ï™2l�äM®ãŸr�‰Øpæ"]„r˜ �CËŒþŸ›Hñßíþ¦«BZŒÿÃå¡ü_NayÿÿkÒRøÆÌþÿ™§+×ãÀ8´~ë‡PÛü\Ý�HárÛG—n'ªØ¸»Zôêµè÷5„N…L…ôá+ ³*æÕ.ÓÖÓÜ¿ïˆ@Ç—"µëN„FÆö~á��ÿrž=Òto•»-´c­(?ŽÕ�KÀë�V—´ Óë7þW¶©°U:óóØƒ­õ—�òt—ñƒ�—b ;9¸‹Ý o–ºªI•œêÐw(ˆ“2Ö¯/–R{Yù( ‡‰*^¨D¨òò3äyõiø»A–QNØÞævÁ5Ùc·JL˜Æs†ÊrM,6C »}8‚w·í×ÓÜÔi§t±ÑoSe9¼M*ýÝX¼¬㡯S‚Í©&«÷ïð32Ó­ �¸˜Ña"֘Þ™˜pÊŸY\Ò½×ãkçµ—7²8K]lxLÂÍNå:ÿDS ("GÅyM^K¸Äð§št½JëÛ©Eå‘v\¼)“wóÏš4·Z¬ß>ì6®r~ß±Õ’�w,‚¡zf²�} i÷‘ÎÄoy�wEIÂoÊc’M^Aõt_ÝԸƼ}Cÿ|²9fEÎ,øœN4r*cð�käÃt^+,C[Š•Âö¯NÃÙ›]6¼òq² –n'º—«*ùGR¾t¤îhÿó¤Üˆ÷y²0øUûDø6cñÈÐ P´»dÅÖ²- ¬Y\’ò÷"P›­�EŒ•Œ¸¢ ù;xE;wt§kœÐg”ñ’(=÷qdüÉþ›ŸÇ�Ô¬ñîýq+›³ð\ò‡É{îìi¢-Æüw²’²ÎßAá¢�@$ƒ6D��ó…ª+UåÖ½Œæ×U@Ðãv*2:¥_ Kš …ü)²»dŒë»²P‹@lûù(¦�ôÏžen]kýýaÉÙâr�–�`÷-¹¦IŽ.g�øÁ98ÎB¹'ÖodEçé¡Ñ@¹@°!²4¾ V“€ÇïåµiáDàÿ³±ÿž6»ÿ…Á‘”ò_¹eùϯIü<ýa$ðÿ_aÓ_"³÷¿«@ •t�tyŽwY­’V;šßcA?3ìÅcbb7M„¨2à«]&»H"êv³³Â88üßèL“¾•þ ±Lÿ¿"ÑØÿñè¿ÓgóD·~†þ ¸yqCS¥YR,R.–\u(:^K©|ô:-Ó§a�ùM Af×E.ßfR?‚ŽùV›´]ë…–Ý›ÌSÉ™ùdù ÷èË£93�ÓÓ9縪&: Ò‰ºøÇ{�ˆ‹‹®uø2Yª’]¥ú¥JuàÇ˰š‰gj<ꤕ3·ÚGØÔ‰åi³]‰;¹§©á/¡;ójäµs÷(ìÐá~ðö6q�HEé§ ›kŠ�{‘ÝoîŒT°áZ|"#±ù¹Òk=ñ_~ä ÔÜ»6î�¦ƒ}Åx¡ÚaAœjmXd[›§&è¾*†;hãéý¬,íô±]ùœÜ£² ™&�èúÝR î¦Ü•Ž�ZëÚ¥*4\…î€÷}ÎQ¯(ëª>¸ÇêÀÕ!9e†N'9½M9—줽¤†¤AwûjA«à=Új;*Ì„1à*½Ú„ŠÌwÊ)oZ¼L ½Û  ÓÙБ,¦>„È}(ÔÒ`>¨i¯}µÙûi¾—zW²aSÜË7u meç@a� öW¿InžZÓõI°Wk¯O|ø2ðä�%zâŇ ±]¶~®Ja fê0õ{Œgž3O†ZïeY¼fê`5=Næy_lŽÌºÓòçMÚ\R™‡&/¿Ý®:lr«;f—ÙÐûpdõÛþ²�ªn¸�´EZ0Z슣Ö™{™döž{¨sÒ‡?1 MÂ#»ãÕ”ÒíË\ Hüé 5µæ,µg•¿0+&�=S7�ཙŒùãÏ7òoNHÄj ‡øÊ½Ü!’uêdòÞø¢£‘׺vBþub”DÕJže9œ”¡ÙZµ{×T@W—­úþT-ÿ@× Q»)pSÑ °gbäë¯+Pi,ãÖuuCÛ+ ¢Ï ÜÝõ¦l¸þ7s�t{ÉV0NÕmЩ^]Þ�9DoÌpR_)-kù<™�)o|™\–\bä¿Ñ„MŒécí«NÛ�Û†P(áŽ(»ÇbíSî �3Ѹ~«•ÿG¹ÌNi5.i!k—M|ƒ¡JvXt'�®²åãæH¶Jôú~OIÿÌ%�ŒÿÿMÒÿ%ðåù./¿¬ÿ÷KÒRø?û ÿ×70Ý�çÿP£·°ðœ=Tñé ¶sÈ#�ÃNžÁšiyêDä3e3Ñœ–—.ñÆÈBÓÁ.#äݰL×W×¾µ-;®„óqÓÛnÏìŽêX?€êÿ½Ÿcç=d‡¬EÕëÕblMƒ÷Ý)¿ =íûNklvJ}²5x½N=R`+.‚bä/è� •Í÷ùËû7×¥ûÁÿbïIÀ¡ü¾ž’ŠP‘D¥1Ä cÌØ·±…²+$ šƒÉ˜aÆ’]{’"•J%-´I)ôK©T¤…(k–Š’J Ù‹ï¾ïŒ¥å·üŸï«ß÷÷aæ}ï=÷œsÏvϽóÎÜŒó–�dÊâcóe ÄÝ_l�‡�ÞÇ?�šYwgÊüìG=Üß}Äæ`µÑTìRqf˜º“јéã¬ì)táHÍÞ*pmšç6dìý�b7n¿´¿3e5Æù ¨æž#¦r“öyËæë˜rªTÉ‚žÓ\�[½­Ÿ(›(gV=jõ)оThpæ”ê�ûµJˆd‰ÇÔK³ÏÁ1=¸Éçs¬ûò[/oïe;F_ï�ÕáŸÑõÚo¦ƒ¥¿Ñv’YIöqóÌ�m™®U³>?n\u§çî¶ãþG/fæóÐ’ÝÈz3\`8ô¼øã¤¸¸�J‰–¦ü§=îÒ_RÒ†¤ù­�ýgäWŠ5DãËúcÂÝV^ˆ Äáß¹†úͰéf>«1ŒÛa3ùxÁ‰ð#›}ì(¾2SR,½{[ìœpâÔt~Á:G·2­ëB]¯ûc+ ž$Ô·zkž¼ôfkémyšÈvç¼Ç2Ô…mÃÎ�%ÃÓ·,íŽöí@#V!Trù¿¤Ö5J¤ñaÅÞ¼lW¨çŸý¨‡Ú�«M%M‹ÅôÄgo”X-ýDî�zaÃÚgûN;êE :]Xµà ¢ýœŸ°ƒŸà2³Œ–ÀeïæäR¶¼žeÐ�\.�vjñ‘¹Ù=•­kùŽG— 3vÈPƒüç¿3ê�8þ�ü¢Á/¢ñwëUÕïŸÿPÃO<ÿõ{ÊOâ?ô™Ît8þkLy ½¹Žîÿ Ç"g™¦Ùï%\˜6sîj �ÄøFûÍÁª‘–\}‘mÏÃ茩ϲ4fv‹<³¾¿ wÒ¥JRZ:mÐGöÐ5n§v»,ÿH:ÐvÙîëÂx#¾‚Y¤ì©óÃ\ôÙ±òßîJÿ•öÿ_öÉ?·üíþŸÖ�þ¯1ñùÿo)?ñ蟛ÿ%M…5Éÿn Äâ…øÕœ­"4Oº’@ÕN¡ÈHœÒ‰ˆüha '{£ùÒWm•“·kÃ7¨”¨Þp+ó¡;aUÎF_�tF]ˆT�wQ"9áçÿ� ìÿ¿ìÉOnùÛùÿýó?jjë¿ßSþ‰ÿ[�ø¿¿°‘ÌôÍKý$oijÝð§ qÚƒ8|‰7> u~œ=Éè¥_â´jlÂ&ûÅ7=ï]·ÍÆéâMýNĥЬE T§²læÌšîxåD{"üû…÷üÇÚ0Ÿ_—ü�ÿk©jþàÿZûÿ¿¥üÄÿ}Áÿ"Øÿgèm­E D"Fžÿ‹ •ù Ǩq,¶‰;>ëílùû»E.ìÜ:ý:­·9åÖ|…÷ïîhCMÊqö£~t žYò,W‘"YzjýgAìT‘— j%J^®²Êž¡¡ej¿öñJï›· 7[eÛÝŽ‹×rtqÓ4ìšÌ‘"lø ¨`“H‹¹Ÿw~ÀÊŠ<ôÅðóµuÁ¶øD±x‘—gåÜŶq²–x* */‡wÎz«“XFÏ*×~û¼¥ÿ\òJ§•Sî3ÇÓsý–†ì)ŽLnØÓú‡\hõ«S¯4 ,©2%g—”¨ö§¾c”ÚÊŽ#Ö6½ÿzª'Û-wéõ2ï£C‡ÕR}Ê4­5³»�Tg˜ÛÎTd]ð@e³¶'o°W)k¹ÈÓ;UÈFnׯAwÛGB]5Ó¦ÅHJ#’3n[(¤ŠìÓ¸:3:f`bMl[„H´ÞAô– eYnˆÄ©O# éññ²ƒ.¶qØ]»4ˆÏÞâsJ»�g:�º:'8Y¤wéƒõuM­ÝÁŸó‘Êå­¦�ìlZ"”Úº±Håä`ˆxÛ’¼:¤_·¨p�YWû¢žu{ õìwûÆÞYÍM}NÁnÁ=j*^…E)²ƒ)ÙD¯§¡wu²ªÄk$_¶Å5Íõ:êáÓF=¦%ê²ÛE5îÌ7ö£íÀëè™èŸ8ò^ÕötSçaâQV‚~1Îÿ¥�œø, L·®®Ðìz)µƒIçsÌ×Mº1ë�ã¹/5ñN5’O�q+°"ˆÏ7ùçiµˆ5([Š›ç¨É*h“ÛŸ3döGJö U÷ö3½T-{üÝ{2|V|‘‹»¼è‹’³eéÍöÆÒ{Jz¸!µ*7ՙ̻w’Z_·ìiÕ‰¿º�tü("–°‘Y~«¬Êʤ”¥Þß�d‹VÞú"®øn[ÄLäNÆ6‡«æÍI´È{ïu&GºÇ£'/LÔ±ZèJ÷,ãºë'»gn2ÅJ n>º�a—~òäôÆ+ÁHÅvÍ䯧ßÛá’|„ýÞwo(°_žRxO¬É'�}ÛSϲ cu…øƒïS#ØÍ8çÎÙMVâßè™Ï-:‹Ç¦-:y¾…T¹wËâJ¿y¬Œ[’1Ó� Ï 8�o¿¸¸ísêaÏ›²æçe� Ÿûþë;Då]Eí�Ÿ¯m9·@oNgpdN :§'|‚t Ss5ømuÝ}N¸¡"ÿ‰ÁüOQË+ÒÓ.®ù:Ù�?ìX[Ö�*±i Û«.½}zñúÁ[�Ëÿ ÿ±ò�C Ç�ÃÌ”=`5`~ß6ë@¼àPû´Ä4©‚í~÷ä4'óI}ußxT0¾iáuǃ×9óÍ#lï|Ý–Z8yC†¿hˆ|É1Zòæ£ewOɘJ}$û㑾é½ÛÉ•î÷ Z2³¿Ìð�–(J`Ü+•WVW\I¼*áBèJJž%YÏ9(�ªó¹¤}½kËŒ­ûÔ’?lt��l«�_€|Šu&<�Qô|ÝPô®û¥nZdXr³:5:×a¯ƒa¿c áü™ÁÉgdZr´ø­¦¸_ –HÎ|تûrE‚ã´nͪÛ4ŒöðÃç ÖËnV6\’<¬ŸUøñCCÌÝVÇNf•äk/Dë­Â?A—÷v):¾¯*õVô &$Q·T<º�±dJ]òBÏŠ§ÉÕázu¦•¶k”ï¦j„»$Y­ŠT¼.¿«œÝñ%¯ciŒcA½‹eÜ£C‰K®EÛ«(™D”ï�AŸíxV6Å_g9*H¶3Õ*¬Þ9ÝR¦�Õñ¸-÷JÐ¥«Xøù =g›l¡çÏ…q5ag tÚn_»Œp²l–`6;›®ùʲצ锕V{ÐÊìëºksqiH§”›Ô‡õ¢´-Vç(CÖ†»*q†9_uñ’x�–É~DvxeŠ][b|ÐóêÛy=QÒâ–Ew,Ãו§·T4 =ܸýÎEà¶YïU+ŵâ«_ÕŸSNµvÕLrÝpÿ8¦ÅäÇzìÑ�T¾\¦¾Â¯~WmÕiãêÈ$gCi¥�Ï�ö*õ—e)ÛÉ;7ÏEæwYx,¡j••}Þ…†¾)³Ýì>õ•:,÷}}éîËÎ-ÁÂuoÊ«2ºlª«wËP›æÇñ]¿fuMOÎÊÞYK5³[jäø>åw µ³ûo¤hêYjà[Ó)^Á¸À±¶íÏ–Öè||¿ ¿7SF¡?c›®Á±âb¶ØôÓ¢;<;¦”¾ì̼¢¼LÕÝíQÚŸ¾ËωMûÏJ=:‘e²ÓmaZìÂ3¨ÉtDld뫯«Î† Ï,ÊŠÑÚD,å'6.ȶ±*Œ}“ö^Ñ¡†Iå$ ÷¨·ñ#r×ÙÙ½èz²ªÙðí[׃'èmï7ÍwÆNA ×ô6ô•oÿ8#ÿò»,I0ì)‘þÒS[úâKEWM_çƒÅQéÄ]š‹ÐÝ[=™¢¾ üô±æÜñd«NÂCYÔå“Ù|±““CŸ“BêU+�/éä\Ë£·„‹- ¹®¿vcÜ"Ûsr󙬳ó_ضO-Ç3�”»é�Z=«0|[—ßQý5½ ,]o*‹ 䥰†±T —DaŠ�]låÒì»´ƒÁ¨”—(¯ë”ǯTp�Ÿ‘°ÍéyññÓ'g‹ÝnÞô)MÁõ@ªåµÉÅ¡r:Wb›õ®ëTFï¹Þz0­BL¾„¨Öz‰3GÅïtïØz«ûqÑ×Êj¦ÑjÊIv×õ[÷ ¿`¬½Ï8 !ylÙŽä”ÎÞ™^óó¥jÑJÙ[çiå=µP<ý¾¿s�r\y¦êk»«»x–¬[ÌÂo>9Õ3øúåwUÅ ÜSïðrØwEA¬:»ŒT”ñ$øäeÇÁ§ŸéœÞr¯ž69ÒñZÒaÏãUí|(ÛöPT 2{ݰ"êõ]fÒ ± s×÷^œŠL(JcÍÎëðäGð?a¾71ظ5?³lÆgö›Å⟇d“?©­sµ�— ‹1 šêY²TÞÛû8âNí¥å.MƸ(qB V°dUv{bç]Q°é¦)�¶iËò"OëL‹¨G„}’‰F¹Ñ°Û]V ÐhíR6›p¦C8kâóJ¹Eëâ’�»vú–í©nWöÌÔo+¸×xD3‹U>%XJ¥WÍZ‘Ðýzú�‹ê®‹óý·‹J‘õò¡�£fµ¤ þ›CÏ}™*3OÌ˸ Ã×öõäÚ¼3QÏ7Õ0e)„´�LRv^v÷N’†³ iØÎ¹e`gIT©OQåâøŠ›Ç÷£ãë"ûO]ˆK}¬¹ué®Nôv÷ÔÕ˜š–Èkê,+“ó¼rÏM»c½uáÎ3]Ã~©KŸLJíÔë\9~ìÛŸö¤ö.bõt݈uÈ’çu÷3K§+ìxý¨e¼nö}'‘½¢ÆkD�Ã"ÌÖ÷ |8Ñ#Ø3_ñ�Vªöø”…'2ºt2¢²oõ®RêqÖªòÒ n…ð÷8ºO¢ & {�üÁ¹Ôïã³2Ï�ã�š¹*;Œ¦9œ:¯Ô+þ¬o Ö´SÒÈÀg_w$QuåÎûMŸ%\lÖÛµãQ´…Š2r?¥7ðl–’Äâ¤�š>wŠdÖÞ ¡ˆ>õ}^žÿñë{ëZ!éM’·Þuw ,64)�wÓ{ÿÌ‘ñp–�‚P.­ aÇ1UÏÇ÷¸¸x Œ­í�زíJñ&þø)íÙd�¢b©)r¹ï|Åľ…Ï[ʺ•Ðuù{žZb¦ˆ Lš¿ÂaãN‹EaÓK“¯_m^­N_•Ö8Ü�;wP;V/¥\á‚p{Zõ›òG—žtý´q®¹nàæ»HÚÆrùÇ×nòCíNõ‰6‘iö»¤ÛDŒ¤¼ŽU·ê-9qÈ;ÇI&­¸¶7ñгù×_t$/º`³&êüÂÁå�åM޽’?ºýÅ›/�ïär”ÕræîU5v1}4/Ë:eçyÛ]ü¯ÅnÏTÈ®.¼È1c#æÈ.Ö‘ŒU××'ÖækÏ9×êµÌnÙÄP¶Ñ…Ƀ‘óf=7<ž¯ÝËyÉš¾_çÚöŸÊø‘•5Ÿ ækxû»kýlA2èIÀÛÉݺ6§5ºïÓþÙw ö¿Ð@ 'Ú°3rŸÔÎIÏié…“n §¬—ÒôÛ_¬01dú1âËÓÆ#ûã�êÖí‹ë6vÒiõ_•�"¥ñja»u@M©tóp0�•Oœ¡ýôš"×øÕ»{Ó‹Ö"úø’<®Ä¤Fð5:×È´¬¦7I#<ÖÄh¯;“¹c_~{SÁ†Üýoª’½î”ˆÍMX¨ˆïjÛ´ãk³I¯t^ßÐSâe—ÏKŸV<²-ºû¥9¢µÅ¨Bü`ýžÂ"¶¹oo–ìË_#€ÜíÞ/y¢™!Ñd¶ñ¬|}FÖÓô7¥b™+Ý#ªô?M}S±3­YšX|«`ÏåÐÁ´†ÙãôÚ®Ô\ÿàv‘T¾Ê¯�3Ÿ­«òýmb>¬î´äKÍ«,-ˆn“ÞÆr|¶h±Äòè EÒCl½ô¡û eɾŠI-_–&ñnÏõ©¾ØœvúN£vª£ôÖ4w ³O›™;BôÅ‚õ>öQpM®m *Ï]TèÖÝÚ[²C8UóCïëÏÛýSRW,t=8ááZàâ}3ee#…&ÇJ]2H¿Ó>ý…Õ5%ÄÃ´Ž˜Ž|ļÂzÉt5Ä—{Ë)/5Ñåm7“”GD×1€VqÖ_föKNušŽ<úZ«Nìýßî翼ÓÒ~�¿{þGUý‡ý{·Ö· +³Å–ížY¬v;¹ wÙ±æ"ξ¬íÃáöiÁ×õÉë¡¶DD2KDëR„m½÷bŠª˜-džw�¾ ¢=Bÿ±Õ¢ÀËËË­tbÝC’z3Û†7c6)5¦u?�5ú¤|Gñ>rμ÷¶ŒX¿¹HuyÀG¬:°v‰ãáý‚)‹b\OÅnmï¯9³qÆbSZò’ÁÀ¾˜Ö 6¸?Ö“ ¨ÚI’gÌ4l›¬¹î-–S:Ã4�¢¼^ºY±qÛ!ê~µ[qûÛ^G:/BØk·_ŠË$м-O:µ_ê {˜ˆ°O\µQt�ô&ç¦ue!…|ˆU×ÎEˆ»Ý ϰçô #n¼q²É¨_ñ»Ï �¨^•{ÚÉ‘­³õ¨C¯‚_RfNvçÉÍKí7:#Œž“ÒmÖ )Ç,²D]îE …öHè0x(ÎÈÍÝ×!Ñÿ°qî¤Pÿ z‰¥™Ô]ïz6”t ø3ëÖÈì¬N꿆_½ýÊÐÞþœ+’òšÙŸëµö>â»øTdŸàÃmN F_>Òô÷k¸oZ¯•vîIKk›ÜÑò{4lŠzUuÄ•瘭B>\y/97}ëa½kkÖ•µ¨ïñÏœ¾Åd¶DXn\'Ê¥9ÅüñE)³“TD$YãNºnš]É@ O^¹¦°òÍ.³GVc‰~ DCü…jÔ£øŒKÿð©$ç•&Ûn ƒls"Þÿú2úýŸ_õð?â|þ§öCü'hiNÄÿßQþäû?Úðï?^œÌ_Þ¨£Ï Þ ™-/eåKò{¹Xæ»û*,o—Û,zeã-³­ùÓ ›ð1F_ûTKÎËj{EÏ»¢ëzéTúŽ8)å ”Xšôa›»É¢Ú9Ô€Õ‹nïW¦¦3 û»hÃÔˆÉ>¦23>­Ýñ4á÷¿¯Œú¿ï¿øý¿~ÿ ø¿Ö„ÿÿŽò'þ/û?¶Ý‚ýý§›ä¬[•ºçUnv¼è½L0I¶5Þ•[ž{|r|Só³]ý†Å§lµì:ùê6áÆÿöèŒñ_¸üÛù_sÂÿÿ­ò'þ/ûÉÜ7ð>2ÿO¹‰GUÎNJŒ›>Ûd+ÙÊælÝÞšÛ¡‡6¤äK/�*¤^t!;Ä\ô*oh‹>Nò-±½í4Xs^åÚ‹›eOÑ÷W6º´í­Êò–$ Ç?À—«_Œ÷V<“f!µÛ´©�„ïܼ´JÌ¿Uüë†Î¶ç*)‹“_˜¹˜@¬NÄ“_PFýÿ_œÿæÿšÏÿü–òŸøÿ¡›Âë�f™ù¼âï^­ÕtÕ5v½ïVs±IË]jíͪ]רqi«ESLWŒxçP¤¿NZjƒ•a`´�cù²î­ ®$Q%êòùhz+.ÇË'jm«­Š;ì¿ÐÚtUŠ–ƒÓRk³‡-Ù Tºs~šžÕNÅÔLJœ¢¿N:¾YBxØÓßbuÂÿAõÊ¿èÿ?|ÿŸ 1áÿ¿¥üÿ™ÿ ág™>ï™›´bÁRÜ­‰ó„îí\¨·Õ³n¾¾øèޝŸÕÝ6]mZä¿såü£Ú´}]|§™„éPÒ’õ3%™6—Ý|ñ9·®Š+¢´ ,¶ž&èËìt~ß9¼¡ÚÕ£{ýÙ“A•OâR™šwš!'ÜþW–Qÿ'ÿ‹þ¯JøÁÿÕ'òÿßRþ‰ÿ¯™ÿ¯ oÂÏÚð¡P¬Béèœ9êú„©ü …wšFZóòºä»˜¦/õ–�!–þçç4\ã;xã�¨tRôÔŽ·“^¾1Û²ª¿v[UG•]ùõþ´fÙùC3† &SÙ7¯Nüˆä¿W¸Ïÿ‡194*tð'·æÿÞÈÿÆÿ5 ?|ÿgâü—ßU¼ƒ™°â‘A,m%tÌ�A C3èL?;Ê tÌ[…Ì¡!‰H¹Ñ9(ˆ�V {)`ô¸ #¬AP ² JP%e^õ(ïð´ïÁxÕ£`Alº��ý=¯zŒ(›J”CójG˜•0݉æáÅÑ9h…‘sä0D"1ˆLÃpp�ñ¥{ÑÐø 5×8Ž/+”W5~ì^^Kd@ÉýòœǦù³Bh¼Zè+µ4®d ~?a ^pœ` ´1}ÐxøžAcúù*kc”ƾ”c‰BÒÚ·ÜŽcm„ÛqÇí7¬�2<6†ÿ·<`wä;Ä(d4) äeu45ñzc À0C˜ñf7b–0;Dâ?â‡Ëråïùáógihÿ3Ž"¾çð1ŽQðõw¦ø3K1‡M÷âÚ‰Š P: IeЩ~`lV¨ WsÔ`6tÖö V(O… ÉSA ôÓäö#3<É= ôçh`â8l8&mm�1ƒ�F±Q\\0Œ™´Pä š�ÙÚ´‚Ç=%ÉKÉSN‹DÑA@šÅd„!YL3p•?9ˆê äEó´8HcsG³°MÃÀh*™©„„$7Ã=_32h_0k®à² q>â“ãf$ŒX3L pèÁJà²ãMgs‚ H@œçÏÈP’ ƹÌÂÔÂv© ×èG)޹?ÜXÑ_xˆ›À SiHè¤+$|æ’†„ϽãÝ‚¡�Hž§’ïuë@f~§o:Ó �â€Ͼ¾á…µyÔ·15¾aÔPãœáoQýê)ãUƒr£{y!cAAÆ‚rG�:$$XÛ�¥Â‚´Ç\ jçéÄa™�3W)߈v¼0�lÇIú·ˆvDV?îhÓwâå ý?î¸ÀøSËâ|gZ® ™ÂÚÿˆ=�œ�ÿ0úo€ÿOíêO0ÿ¥Y�±Ê À@ÐÕöó'‘öûPkÁ=çv4ÖŽ‹‡ÐôÌÆñÂÅñÂ*ozõ÷ùÀÓ—FAÇ ‡„Â(8H\`pPù}¶ö[à.ThúâΫ€U€N‘ÓÄþÃÜïÛ9ígÔàÔE´(p½8˜ð"¹ZARÉ`ñÂA® ö@Ò™P¨1|íÎÙ�yÞÿêèá‰òÿ Àëÿ5�Á4°vøK¸üåú_]MCSý‡ýU­‰ßÿø-EEQF©ˆ\³²¤%9„ì@!:iM§°¡µ|§…#@0¾AAº*#ÆBeù«€Z¨a + Œ;Õ©â ,Ò’åËi)‡îµš“H�æÒ˜PÖÌô⥾6ŽH0%.µ·F®¢…fÕ8îG‚,¶� ¯™GׂIe{�Èæ@+·5œq½8pÝΣ?péx0e­a!ÍY€)24 A`+@¦Kþ�S,ÒÄÁ‹$3½`†­Ç± �LmºH0[VR•þt ]¼L ©Œ×À㜊àXbL¡`­1ð’/„H¡à¼XÔ`(ÃÆR‚¡[&9„îCËP,…Ý3XT˜E=x+†8.Á†qP̉c˜ñX Á˺¡%ÅçÍs#˜ZáF,Å…¥8Aˆ¹šÇR–A7r Kq!ªx  uÝXŠ=QåæA1IlwET$4#GÂÛ ‘Ì`#RÙ,ƒ&Žä¥ˆ1„pÒÌÜÝ”ëP ÆÂbIT ‘º‘X  ØtÃ(A-a %”Fñ£aÜ�$whÔ8w%hÈ+@˜Ùd¨ N1„k¾Ãïá–8ä ã* JV8�Áàu7D²CtGWXŠ QEíFVw�„îŽQ¡†\�°”ý9ÊÀñO´�¦”P [ b9þ–CFCš^E¤ã fì›ØJ,e –†¥Xí(khÔ \›Ä  �®ðÔ�¥,ý±Ñ—̱ eÚCGűƒ€Ñ„�ÙlrØ8ˆ€`Ž/–bõC=r],ÅŽÈÅ>ž ›î�¥„üÐ$¿´µvÞXÊZbD”lÂDð: @ŒY,HS‚¡Í]Š9²oÝo䢎¥¨ñüCKÑ€-_S�î�–¡àGZ–F�: ÇdyÑjL¼V…·ÙÖ¡7¼;‘‚׃ë¹é‘ ÷�¢(,¯0”¼¼ E]^ž‚ƒn¿ÃGÑAÉàâå€Ð æo AÃgy#¹ô¸™ ÁÕ—Ì6Bã¡¥«W#™ÜjÀmåÖ�¨(ªD7Èw°@zл{”wBÕm-� p`ࡪÊ˃7‚{d$)†KºHÔ‰u�h‚‰•I…ù47¤¨ƒÑêRÔõ(šD4EÜãÀR‰Æ6åE½ÈHŠº.9£G!)Æ£¤ ]AÖ ½™ƒÜžA¦3¹V‰†©¸RÙ4�͸{ ć;×fàÜG+žIÀ‰;o\ 7Eóç½£x ÈèàäÀœMö�!Üà�ºcA_wÀ1Œˆ(PÁ¢dá†äïLTëÍëƒÑƒƒ×F¶ÀÚ8Q<Õ‚Nþ4¶ Þ­ÂBRæ’×€LćÄãÎ$Ì ’³ª;W6@ƒ¸2´l…ðqE¥�£{ɉ\¸;§¨q”îo­kÔ¾5¢~f§ßØåxKä²»“:¤@w¦ FP­fŒ, ?~7hœCúƒà ëÝ|Ì«1ãçÆíÀµþVÁè­y^7ŽûÑk½oÆ y÷r¼6È~48$Afo!FaGºë¢PXîXuQpz„Âr…© ÖKôpšî¸Ùyüp¹@QØ Œù'`+®©ÂV†…ªÓÆ�ïCj#æ!DctŒ>®tGR‰¼®+¥‚ÈT¿q¸AlTƒ �/‰?(ˆkq�:xr!@Ž#0À�*4ñ¬vĘy•U¶i!\Ç…ë�ªñáuä&¡'ÈPPDSà7êTBskˆB¢€Z0`¤c¦£öWýQ8”EM …ox%5ª}Õ(,´íÿ­pÆÉÞœû©×Uá¦(,lŠßª `+`#�b ´‡µñ^„¥~× OTó48È+¸z†gQH÷›[À�3Þ¬ø3㣢!>ä¿Q†ðÀxÿ hÔvÐÀX¹º‡AfûÀ¡œƒÁ¢`(ìˆ5�5áÖ°èL4 ‹Â2þ䀟Úö÷d g àWŸäB GxUXª˜(?�éõ§ƒ5ÇÈÈ ò+ž“èR±;H×ͽc¡z€l [øŠ—™ÀÉõ¸Ü®„š€M6¸÷#7ßçî:Xˆonb®‰¥ha¡¨?"2˜###@§N„EL®îp _ÁÓD(Štf0 ¦® f>”„ü�0‘‘h�g|ªx9Š& £É“E Ä~€g cHÁÿ{º�F¶- ƒ÷ïÝcÜw@±ó8‰$hÕƒÃêe˶¬Æ�¬ÌAˆ�„…@H‚ûbõ£¡~ÔT=@½BÍnuÈÎ}÷¹çûF}yζˆ+V;×ìÖl`{‘Yœ>¸,8Ô; £T¨�¦Fªjq‚ÿ)È]ž0I?µ;›�ö%Vëc3 žáBì@Kø3ÚcšÃSRœy-ÏÑ©¡h“ Ù;b$…“g„õ©¢ÑYt d*(‰ ŽÅ“Vƒ%>ÓQ Dµ"%ߢ6P^Ò8URK„õp& $pÚtqÈ®æ<ë�ç;ïì� Í<»zxé%û´ Ì)g0­)+ЖÀ\'6÷vÓ1£ånö¶oïúSËTdšÈmRcÉîØ 8œn¤gÛú×xÛŠZ¿m|É»K›ÿúøý»)­ÁlÁ¨P¤7@' �Þ©j´Xå°A¢>ø#G}°±KµÖà]®÷H!7¦éèSàýßèÖRžº‘Öϯàêõ^¤qbš!ñ¤3äà}?M´€–$íí·á„4)š4W�eøüöÀ…K^l ÙVQPä!VF P ±S]’&‘Äy>QÝέ:t(ÃäG·-Ïhðãô6ˆ? ÷à½m6êu.û9 4ìa“¹:¦á4ƒÛìa"D¨€ƒÔзHlÒÁ„•X´SIlÐV°T½�‡“úÕ;@ši�†Ü¥%ò”¥Ñ÷Īáá¢AÇ�'A»Ó¹³ÉH§­NTomÃG3�·j¿aqYQ¯Ã÷ 6²,"ËræÅˆÓÎåœDÄBù,Û0új3ç (._ï¶—µh#ˆN||#ÆE˜+Ôsª r–úÁÕ¥"‡UHªW²â"qñ °ŠÈ¹�¥�5ËŽŒ® —Ã^ä³UÒ¼¡•"a‚Ea`•À½xϱ#h‰iòS¤óF)O4+¾\™þxó9ß¾uN÷¼AÒ;Ê$øëo B¿tÎ*Zͬ¡hM(À=åè}õYåyPE¦Éó +´¾;m�Ì>âó¸��(®ŠFÈÝë¢Â €Æã3Y•„#ÊMódƒ(ðP�ö…6þåGÍp¨‚n|�î¼u\d5ŒVq.Nia¸Ð>ÊÍvr&¥À™LEô'øg`Ön v/Pª�‚�kÛŠÕ¨ø²P}[ï_ƒØ>J“rj–£b™©$T{ DE|Á±#PÂ3V²Î¥�ƒlv§d�{ɵEGõ+†[".é½öým´Hm¨+8£‹–΢E€MT¥ÂȦ‡×Ͳ/X$¢�S~€`¨†ë£u9K€2¬\´bkÝÎàL,#�YX¦B¦†ºk¤:j”‹/Q›¾H£\ÆÚ+¨¹ŽÏcHÒAdGª2äµï¨¹*]×d0Ë4´%R û/†ú¶5Ä XJ~K’t ïZ´VDuÁ+¤ …³Â9ý‰ŠYÀøT,XkAÜW0È@Sz :*É„£Õ46P:'@\m¸:u¸jýI¯ma£h…ùf»™•sšë/4£w™H É‚Rq�–P]{ßl€< LåèÁÒE‡ÝZtnn’@(:¯£f&*1™wIÄ’aL& z“ж äã~ÍP0/i"°Þû%‚)E�ïOà äp>xªì¿¸_êÇýÈd*æ´õ‹‹¸×sÁj�i"]­*ÊhÀÉ>©k–ÀcÑEÚµ5âV¸ÆkÐ6C=7¾bs,Doä„–Â…h ®$ê³ +¾9g@ª‰ZE{-| ¥‚)”ªš|4ù²jø€åP�g�A/L•k¨bù9’á´z’\4'Hû>2q(ì#�q_‹  +*¾ vÐ*nDIÍу\¢¡6,:²>ØEuÏš&eC½�nžÿÏé±UèˆsgL$ÐNR"z^ ÷ßXRÂ’‚,[ï>²g§-ý¢�Þ’k P0 ôrbtb(éêÙâÞ=ð^hÉ(W º.XêW,'>›µ¤=¼Á¢"¹ ¸�*¦ïÐ ²¤‰ ´k‘¸Ðy2�(Cm�¨u‘¤”Ãæ^‡š&êiun+�±°¢Ï* *íVð4™øuám°¶7õŽÐmŠ™-*¥«`‰ÁxŠ…O\¼”çIÖä|ïŒ�bŠoIνsf€-�ÃQ|DG`4}f<ú1'Cå«þ}fŠÏYagÞå’B¨#?'¬’SÄ Ãj/׫_Ö»MjŠ*‹Ìá}Õ (Ä“aÊÙ·>Ÿgò4OÑ�¿å'ÑVÈJ¾Ê<%ZlãQÒÑ¡…íßPª)]©?™«5súø‰*\ñ/hجn'Ûô¹Pg}«ÒP¢üûŒö,íµâK@ÊJ±Õ‘à¨àtbõmо §z -:ô€>§c¡ƒ°^:‹ÏC¼îѨ‡±À'ZåQGCdFFðJñB×P7œÅgÑðœaKw>˜DFójÏ QFÃjz†ÏÆãÏXèÃáâ¸AìÏ&ý; ¢‡ ÑcÕÐÌÉ´³#3Ø ¢×ÈÑ^½áÑîâh_ãùPÃÝ}½†i¸ûðâ,Úª¿F"#ìóñÙ3úB¨¸�åF6ÛsQ® s÷íæ�ûÕ[h¬ƒßÀ·Âî$€Àj�FŒW;!2p€åaa±!VKC U€bÑ®Gµ0ŒÇ€FH*Ch\æÅlÚ ËÚËèj*þ~ã,ª�+¶ƒúS¢ÔæzýÎÝûöŽˆ~#é‡E@èV_nEzš¨9õ:4±i4£žz×ÍË>¢ÿ-£âT†”w„¶–ˆ;R–ÜOP¹Ñì¡GZÉO¸÷´^€"ž-$UûÚöÎ,ì“a¢hÔ(�™Vß0ôÑ‚î;P‰Õê>º)fÄ3†ýø(\îî콌öá_ÜÍóìâFLš9ìª�ÐÜ#yla”ËøÏîË0zÄ©e³õ\ƒçZ6 Ã†Æø~^d³ˆ°Ž‚OKÂw' kq8»ÉùÈL1p;/£=øW yW†»c,_èžX�Ĩµ—’¶Û½™€HÔÂ{œQx0³ê¬ ç…hc´:¶±´³ -4�€ ›†NØÂœö7éꟽœ<ÙrevΜ8*„äŒ[çb!-•DƒÄÒZr¿°WgVÖ‰KT¦>œ9X�ÉDs;[Œ…ë¯C¼pGxªDú®t+¾Œ»N38C@s/ÚDøÏ¼¸oõ‹8ôî _”ØÐ°FÜë´à4YèÆ¤ÆšÕîô›—e 7H4ž�6V@ž˜�f ªÐoàõ®º($EÄoDºg,GÌ—¶ÔQ¢u£2ìˆRÖ¿Ží[¬m²äÝ!äß c´m?‡CHG[~Nõ�„ËݘzkXè¹O (ü½aí)58ë…Ûæ]Ó¹[Ú htF$Í©�L;g?bΖtàÉ’{缘g¨™ãµ‡"½¦g0s�7Â;ŸXL-�e1¹F4r@xö þ@EækÂPŽ`¸G´ó,Ú?·Í­‘–ïÍ6|¡&^Ùqšy�Ë}Ûꆫ‡´ŸÃ-ƒ™ædZýÄÙà/ž€"E»gÑ›Œ‡çÊ;§^ ËU£]2 ΢×x|5á¢1ÓG\ì›^'�ü´�…ñÃv¨ôÛ€äŒÆ„Vl‹äïM| RÀ&þ1 ‘m¤“ˆuWO8M�Ì=Ò×5^ÏGøº†t+T¤&g¿Á’‰‚_kâPABÃCNQaL8»h'#€žü‚O ~1šúBSê‘ï7`2†w>tÏWMcšúë¤î¥@X¤zRú² ¾"åVLH(FóñDü2,"Û”„œš†œjT+[çÄh‹Ì®n:Ú"nT;ç@��,NY½*VgÍ¡í�Jg³È#µ�Ug†jÖÑw‹Çù=oüÝž¡7>ÜÙ6mÊwñ«¢Ò^ð á‡É P­HÕÊ$WÔyéó’˜}&·PéÐŒù<>b�/\� kæ†s—Esy›¨…­ÍªW‘/.ŸÙ*Ùm’éQÅq×éö§Ýk¥¢}�<ü­a͸vg¬›ŠbÀOì"Êú¿‰¦ÛééÊ�;–Ä|T0ÌÍ’tä©220Ÿ®›ý¸‹—ÎrdÆIýhƒ@÷‹~ÐG{¨òÂÜÖé½¾Ø Ð·ï8î6ë-´I^˜ÿî¥ùŒö­œ‡}ËËõí~gAÕ€©¸Ùï:Ý[ê¡Qž®‰<2|ÉÃ^jãó`ïMóÔ`NÞúÁE¯G–*8fõR•ïÛÐÙvnPoÝ“vWZïÓ–1¯Ô“ßhC}l� ™. ßhöÐ÷‚ŽZÀ,,Lï, ›[X©B«º¼‰þåéºí:26ÿGs|¶ŽËu W::ØÛË2T‚C<Ô“Þ6û÷œŸ^™”�¬ÃqŠ.áÀöšmUÆ|�BÛ£»z»Ñází�ŒC\ÒlÃîÆHåÞÅq£wP€áH ½ë.lý§nýŽ*ô´i`«‰çù-`åfû�樱 ÀvŽÖ?nˆ˜þ:']nJ1ÖHL_¾¹RÑ]ó5ìÙ–*[0„¹A¶ã܃°X‰ŽAÆïôšdZ�€[ƒÙV��)T�q�?´ßÄÏ\Ç´)ø“7Þ …Þ@Q+_7�¸]‰:ÝFÜ¥ qè c ~œñäÕòÝ(ý5© …Êà0` à‹ß¡ÍC £)/g¼Wøè‡õ/1_ü6u·Zòuø{áwzFÖBž¡rþ×@–�þéjæ :z;ÿp¼5tø„œ¦Ž2/FA- [-*4š²t¼%LOwïW¦ö’û�ÇEv�¡t Îéïr`hm“¼O²«ìj¢»Òpœ‰ŽÜޢà úÒÛŒ;݈ž:ï°cy7£º@[l¾]ï=ª ãÞ»N¿Öhl0œâ]*í¤s[ö¬£+ìtº''58xÞËhj«?ñàÝ>ª­—SŠNv#Ø)óŽ(вAÃû½=T•�1à> ÁŽ[T\ögôâ¶-Ÿ*~wA*†£Ië•"�:ÏÒˆ€Žõ»õ 8yjÚï¥ X®��gj YÕûœ,ª�`j¼ßÞ‚Àç ¾ûà,rtà#–rÈÔ[BK€'™4i§�ËßãE¸’ã_›ËÎcަðí)÷Ç·ÉøÛü9÷ËõZ˜OŸÕ²_Ïýü•¥Ö&GâòÓ$¸G[¢B ï±O�—IGh3Àþ§²³ëb…[´Q6‹ùo[ù+4[‰`«Þ¯—ŸâÛÄ" øF¿ B~zØ*­nnm¬lgkÛ+[Ùbñâ2»¾²±–]ZZZ^^\^ -^€úÎX¤¼¦¡F5aŽQÅkiµ±;4^Åædüççeû©¢þèûs -L‚†Ó&ê7ø®UÝ[�ÝÈ P-M×B»ÕÍ+«B@úV½ nM#*Ëâ*@�ÁHu;j̨ÏÇ(�EÛçeþ2Ã6é7©Œ+Ùï—‰Òx¼óí1"Z¹•„¼­$ämämämV¬M7@ƒ¹ŠUzU6Ëï\“[Ê�ø>ˆ±ß Ëf\™8Þx9KRy¾òÀ²B0Ê5¼œ%þH]"[FJŽß8C¡v~>á;Ƈêq‡iùÂø8~=YQ³>è&Ü©"Þ Å1Ð%ލO]Òœå>å¶i7û”àð²ÍnÏL‹v˺×’¡å%<ÚÉ2SYQúœ;Ecƒ¿hp€RÍк-k´q±D³ Ú_Ê®k_–ŸbÂX÷ÌzçÚtÑÁ1Þ< éXn¨�æ:>Ò¥5�უ]6ߺ£6[{>§Ÿs{ôEÊÏ`ˆH«…¼Ð­Õá+ñ�‰mÀæ¼*É‚X~Û*Ô"¢ŽÜ_vÕ€}b8Ÿš‹Å*Ü ¡)öŒ}èÁ|`™�^Fø—ly†ˆòFÐ#,§Ø;hãJì3KšÐ›Ù'nhEÜ[öýJ}Y�–„`PåsCHÐìQ¤³ŽÚ°Öñûwc?Y«‰¸n‚}#¾Qç>‡²Î.!ý[¥P ø«,š—Ó9ØOÁÞ³{plZh+ðƒà'e¼/8ƒŸ…sqÁ%2ùâÅó›Œ#C‘Ì^, Idní¤#5ÆG{òËj…ž[Ús@ßC‘7�Àö¯¨’ëMO �HÅ]Ï€CÓ³nfÆ÷ö¯ž¦Fñ϶Ñ|Ä�ÇÔ–u[‹GTG‘4\³‘sn´}žÀq@V±šõZàe+RÔ)Ûš‚VT!¤ÅHmO¾ð •"0{Uü·ÌìW¥?R„x«â¿DDÄY˜ªíìúà—ëÇrÓ¯¢œv†¤wуÒ+?úO…]ÕšŠ~ÌÉz0WžÇ„dvˆEo† I YlËã+H‹Ä¥ÑFi–Ï€/"ˆ�3‡SOm„jn[›„>GƒRe¼Þ{dÆO $Ü£5(=ÜÖ»7QiA$t[(GU xlå¼ ³j �…• ÔŒû>FMËÔµPK´d!aþÔT¾Â$lÇ›´éhÁŠÑp&FJú GáRIí¬" Ð)ïräù2éŠîÉfÚ~"*FOÊ{ßN´Ê ,tôÁ±ÕÑ­àCEY(Ã0âwî½"Ôv —~ˆL[¡œ6#ÑŠ~V™Èáj˜w¸?ƒÎá+Y¢¦0¥Ü# -L²#&•YËÄ»^!Êd-NEfÅ¢ ÃT"»›¨Dvؤ‘º0dÁö§#‹> ÑÚÆÚˆ“£} ±âꎬu$.•ªJ ZÍ�2ögyJCT4)s �G©+Nd••õ'ÍUU÷m®á|;±AŽP®{ßfãꡊ<.áŒí1NãÊ­”&dI`WÇMìufs epwUbõb®‚dãÇ"ë‚h˜3 ¶<šRë«ÈiìX Î&ŽÃÐþ* î+ ÿA7há m-Lí‰^)E˜&þ `ø)…K¶B�´ÏFB >—£*þl jQ¨Av¶ \ÊQ°-×dbqàˆC™ùCh¿š¨ˆ5³mËÑŠë]]í�çI…ž�ªôÍ£ ÎÎgnmÊŠ¤n¹Û�Ò$Þ«�—Ö‹–s¢A(܉áPÝQ$r±eÈJ�ž„¬ k´¥‘ÛÈ2BÚÌ�ÆC(ÏÅ®ñ Æ[ K+®”Ù¬„‹…ZÀ9‹ÎQ~>àÀábÜW5ó*ñfS½AÅK²½gŒ?ù”®3™ Ûmâ…#˜��Ø2¦›ˆ’ï}JÚßúߺçù« ~IPóAý~t¡äŠ•€Àõ;í1Ýûú¿å›ÁÖtù˜Yô1›/Œ1¢@½שz ª×¡>>W± Þáê÷ý]é�ñêÄÇN`,·¨cä5º�VoL9V×ìcÖ¼Ž[�ÎÝøö¾ÕoÞµâ1Æø£ÿ&‰€?îÑÄtÜ»€�±²« í„F;$ùQ ‘gZöñ L�«ù:dC‹žp�˜8uˆØâÙ:IJÉúp÷ \ëwÏŸ�ÝÊ^e‹ —)×cÊ�ò#âd¬pÕPéMI1Ÿ´ôPb íu:78¾yêgäèìjxTX'ýâª)öYŒ* TÆBºŸzd ¨yÁ‘jdþ‡l'§IòŒkÁj40ësŠ·§e|¯ƒÅ &ÊX?qDŸ!õZAóh¥¡Ö{·@̺äyàKçãÁÃy¤}ã£�øZL_rm jJ*7œÀ'€ íJ–T¿Á'4¢�«@}ª¢VtÓZ”Í 4D›í�ÕSûÙÞ²~Xí’•7ŽÝÙÈô7ô‡&¾3›?FVm‘ê£üĶÙå''˜²q:Ž-U¿ % ¨Ê¡û®ø¢yٌ՘+”aR/ZÅ„žÓvM]a�È×C›$ïã© ´s1š>ãw=r ¡å °¤ÚY2"ˆx™ŒÊ†p]�Ê쉋?3Ųö‡­(7 ¼ˆ(ú·©ïE�‰4$ÍÆ[&¹UÛ$·œTçzê íA4„Ÿ˜€äúkR*ˆH;u4ž¿êvîï(Ò’ ¡Å�¸ë5”§�-Oå�%Wz¨5Kx«"îÔrEbÒõ¤ˆÕØY>�â,Pòí·Ó‹8 ,}Öü>‰³Ei_{p¸V xQ6½µ²:ikd¸€÷ž3A ³W$\Ä{¥BffƒE$®-N/¶ ]ÝòàizâÖ­1Ý®%wÛÃËsF1”ÉÄOœ¦îå-e"ø �ê>•)Ì$IÐÄVRó®o®§qÆ>¹�×ë^À¿ÿ®Årsd™¤¸Ìd”ær“¢�¶æÐ§=kýØ©cJÜÖwsŽ·†{úÆã$8Û×>éÄ·!r؃éuµ¼Œqd%ZbŸ^¤é·É¥²¿áÅü2¡1 R‡k´ŸÜºZ{dž¥É•of5@nª(ôàG‡ØŽÄ7âym�s™â[uF6ü`5GÍsþÌ®¹z£äa50re!lt¢þÕþ­�qßsØö„ µåm ø±’î¡*ˆ÷¾œ}: ¾¥Uw¹rÑËûEרm¬pöç·Ü9gªü–Kç0äoùàu˜ÿ]£¯Lú[îÛqƯ~‹òAý=|q?äƒè’¿íã7–8á âòÉ×Äôoç¾µî»è�rŠu¾ ÿÀ””*Á'€Çbž¡ê—p†í”c…ŠÅÓÅâ9úTI”Ð)óÀÁÙ"ìþûâ†Fá°”i�Òq~ûÖóñøÁÛ –Àóø7ßó-é#ønÇñ ÌP0Æ’ÖçQ–#Ù74¥ÇÁÌU;Àa ÒbÅËù$ tû4ñµŸ5¾‘*‹ÈÀ¿ÌSádE 8·>ÁXºAÔg~Ä~ L}ë­msµ‹Jý:ðhc‘dt+¦èx¤AŒ&—H©…D|:¤Ñ›аè›â-R1¼Qá w�‰ßU J oÛÓ—®ÈÅ;kÈ´oâ?¯QS‹V%ÚZÍdi Öüuîš-[YF�/�ÏäBF-¯)|0y×s„a '<Á¸L[âÔÁ‚ÅŠ.Æ%!¼~b›ä-i�+mP%. áµYÃø+†ÓõV$Å%Æã—ãܘò(�JmGù%ºâ½}•ƒ-¹µAßT‘RÔÏ“_%öQ‘î[|g¹�1øö_Õm´OÊ�½°-Ax71¦âEï¥=€Ó úºíqÌ]}‹ÆÙ”ª,Í‘H\Ã0<œøk'Dÿ‹h›œ®€AÃ.Ã3rV”Ã;?ÛÄ®A¨¬ü˜êÀºqK8BÖBÊ®—$)D¶l¸É¨âä�{ÀVå/(Ès@”XRÆå0?³Ž°ý8ãž®J0€†ƒ’mvîád¸F¸¿ƒIÉ/±ßC±O†•€ÏÁt Ø…Îl#™ +Ú®øîsš½íw8¦ë°·±e ®…ÍÐvÅ W�u`Ü‚PÖs¢oކ:þbb=2™ €í&L3w‰ªÒ>sRZO–jFìœ"Ù>Ð51ˆ1Í6¡’½@ÇkÜðOA¨@–X‚*^ûÈ-VUÕ I­ðýøbµÙßh_ξA2šúTmÓ!˜>Y;x²v^ª“µ#7!êdmS°H>Y�pØC ¾Y¡Ëì³’€Ù£ÄSà@fd¥Ë«ÅKA+ð˜á¶d!Ø!Cy“^2q’å$=âA®F‰ÃøàÆGŠ�0ä¯p°h‹§g£Ý¬:t©h©èæ4j�C(5V¬¢p~¡%•›`KñA·Üø èºF‘kÉhdx€Ä1§0ßñýÁ(¾$è¥@DÐB´¢ê¸ûür^îÑ AH�÷Çi>¤Ø'„?jÔªA!5í�Íò)‘­£ oüSÎÝk-Né9£ßš!5زï´ÑС׻�ΰ c4º-À÷ÓZÆ4@�å,ûåQF›,Îl ß Åö&ÔÑFâø†É _ :6Ưƒ3å± ‚}Œ²JÜ|`¿s˃žÄ3‡u=ûÁx§È•‘PHW`Ý¢“üšQh�\’ü„S°–ôâE¡ÏÀP_ƒ¤ì¶I¸å‘G�ffg"­ÝÌñv9’]c˵à�þ„îJÕB€FøhÈ B‰[äÔ ÌöƒÚ%›rx$ŒL©ørLe­3Ó%7ãî7O4ÿ˜á¼[Eu“v¢Æ ŸŸxBvÎOQ¸Ž+¿Kq z'¼<ƒiÍ]´@2 :ŸõiÄ™iêë¼ù«K«~žƒyF¿ˆg7Z‹]ÆU¦’»âS¶€Úç8_YÆL›l$@ºZt¢ÂzâeM€†+×ã#Á<œãE7!ƒ�Þ}«¯‚õÂJ—sÐ(þ‰^Ãd]ÍYCªÎ½ñ–_FL½¥½ ˆƒÙ™¦»L š—]I™*ä·b5ÑÇÝÂ'jœáÙ¾ÛÑsÎ� ñzÍé5ÛŽÁC�gòÕ8H>T°©~�AÉÕéÚ‡­à0”5[O¡ü5%¼4…1ßs/¶6T”a8¿ûçä³'¹KÅ%št²ÁÛ=¨.ë°›1: ±\W £¦l™$дär¹9àhã¼ÜŒçß„ªŸJôfA²¾¼Á¬GÑp}ª¹;Öù€ Fò¨²À×P}îLtÏ Áø'8p€\ €§û.®©ì6²Щ¶¬Fkj(“îÝöooãF evOjÑõçhzÍ—¾9ÅR<Ýû–T€f€6ï��e?+e O±D)Ùçx±Ðy`¤CL‚°C‡0A†÷µø"<þNð¾Vg)ôÈ+£dôh‡¯—cÅ1D;\lÐv<…µÑðÈZ/NÖ¢¯ 5žA%}¯ì¡bs“8ñþDl›¢IqAª×½�àd©z«ÿ&~HEv I. "Š»èw[øÊÙé�ìvô‡ê×±‚´,ˆ�Áb>Š©~ó6>î×oïR Í©áuóâÚM'ÔÉ­÷$¸‰ä·Ìä‰.µt7qÜðÿ‡¿M´ú Cùùæ¨Cm€¥žQ9Ï� ?f ÊqNú°�XR©ºƒcü•â?°v­&¬Ígùû%uÙF^–™ Ógùû%¦¿¤zÝ8n–¿_RýŽ|õüm'Cy‵Ú<"Ü5ÑÛRϼ”WEF­“Ù‘?¾"§.ª­ˆ+{˜ �n4”…½¢;0-g„ƒËõ(=†’ƒƒJâ¹UPð³ªgÕ³ ¾êã‹éãK¢�“Î�Ó=Oõ`jYϹCÃ/ ¬‘‘-ViH®îz½ªh‚®68`Õ�šOHÔ")Ák�Åj£9¿(UéïRµT.øÆo‡ñˆØwÌrÙk‰x¶q ßoD„tm³®©<"¯€wœ@šÃ_ÐO�óO^ùeóŽý¿YrŒE�6@PšŸA…ù¬‡³l͈YS�qOÏ%ž•‘�ÔOTãh¼„ÀÆV» �×ÖW¦†¡òò¥ (¡Ïæᆑ›Y埯ªþÅ·ExãÞ/?Q²*2Þ»¿+G$DQj,L»Ro”Ÿ”è$ºâVËOŽ¶Î“û5L0ìëÌ·�{Ì‘QÄËû67Í}ºF É—˜±/î´íÂàHi�f`ÊYŸ` ž™mé(D½æí}ËIJ"ÊYË›éÑèÿm•ƒ�•äB`4{ÇÒ”Š>¶ÙƬѤqšLÌ•aRF¤0¸VŽäý‹rÁG7;æšf‹;ëI�I_žé £DóG[ÎÎüVuV\ùcG3뙚•=ŽT\r‡0)ÏkÑJúF-%’Ày�ó’ ÕSÀ°@ààä-äºÆPÒÑ $€à¯"`*À±·xºŠöäP*<.™Þ��çâ’¬Ç#ø(÷¬´*ÞÔ¡³}4˜©RØéj³Ý0°Øã™°9…WåÌuªYªTÞµáðùv§ÒX™U„–¿û�ÉÙÃÆÁúU3í:UÉÒZéŸ\дsïÌ[Á¦ ‰1½¢§rãÅ% ¶Aâ»9» –ÎA‚K�1Æižÿï�2Ñ »DLñÇ”„™YFɼ4ÂYÈŒ¡>#§À˜Ù…cª×`zÔ‚YçògzAUöjOæz¿ÌWýhàæ¢_í˜2ÏJ0ƒóÐ%<€D#?ÑÍð:Þ�ð¤kp8!â"�ìÄAl´°Œa”›ãr€F’ìë€g(•NÍçå|´�Å1tôUæì¤Jê»xâØÕU¦bv…©…‘×a’Ú ™Õš+ÖÆpƇĉV-bL®F:�Ü_Ü4Š/wÜDxvØÛ®/ë:m•ÙP[ç3ֱʕ-;r¡8´2+§¬à“îþâ f±ôÓ#E[x®0c\ƒ`X,æå’ÀZI!ãiOµ“øP…$špZ„ä¸B 8‹Yù¶Aî]¹¦žÛ´¹ž“Lc.øõ¸h°^ÁqfôÍšiÝ–²>c”.—Œ OÓ�£Ü;¸÷Ü_*kkbgbiæÔgä�¬:&o(ê÷¯ï÷½¾´¥—»2nçt:ÝT"ftÆI:§AEõ!‘4|L~r²˜'­Ã°ÐÌŒ¡jy`Ąеe®y;nã™cò“͘}L4sûócc¯Å3Ç&1Nsl¦�·m:j–›ÇHœÄ9Y”g `kVÎ.XÎB¦Dƒ´å@30DàyŒ=S™²˜P'W–ÅXÏ»­ý%ÞÉ5�|>0ÇÊéüQ¢avªdü?;аìˆ[@W ŠØÀåe@$Bè�”‹wIylh°ƒ�šu!úOwI²`¶�ÈŽ )k½(Ë‹@{I#ï©ÍIÝŒ£sáÖÄñuAGÁÑ0§ Ò’FmX³B§Œ"\Í„ª_ÙI+òfòN"÷îX¦íPUêdÅ¢)¡—“à¾=õYò˜²ú¿h5ñŒn"‰¡Â×t>we9¹ã&PÍd6ä©�„S-Ñœ¦Æc4ïšÑš�Ûälˆ¶�×aÞ·æÃd¨8âUk‰pH¢"e`• œÓöOÓ‹Œˆþ‘(46’Ó!ªÂÄí5&ô:¡~Èæ‡ŒüPáþhOô³š fŠ$åMÝŽiÎÃJ Ÿ@¥ã1ó�£ÆuˆbåX±ÎÐ]ü\ê8'’Øa Í�ýýs;j„uô÷02z c€·=MF )bg)#¯R»JnÅДp¹¤]žsì^ªIdFMñÑÓ î³�”"¡~á ”Ý^ý½Ø•úæÈévb£2u'IHûò×¾1—…¸×ÿÈÿ±ð�Ô©ãæãc+Nm§Ž™¥¶Û ¹Åø6µÙ¹{è¢]ªT(ƒÔÉuœÚê|ï¤v:€¡H3DõŽp¿`»Sˆ·ºqqêíþI�Ú8Þ R€R»‡©ƒæEÜîŽ}òä¤:õtoYÝ•ºî÷ïÊù|�†ô1îmªæÿ1»u/̧ѷ†ÿ9û3íŸg¾ùcþáãÏogøêììÏogßÎÏÿøv>>ûÝ;?ûþù�ù üÂúçhöE©W™ÿ¤áÅ7,ŸÁ㹟þÖû#€ÿùUì.7þÖkûøù+Œ€ãÁpɰÏˤ�”6èüi¶å<ÊiƒîAt²M¬Q¥æú�câÿ0´§²dűß„ùoß°³÷’ó[~€ŸŸò•³B€©¹ÐnÓFÖ5‘j` Ê™ËF‰‘| ¢¯PÿK}!Ãl &[píbÈÎ|N '²_0Ïë ÉœÉ%ÚGãýÑa°Fü—�ÇA´D+˜ú.*Ñr-Ñç :•IŸ v�\ì)çô'²ü)„ÑÇJ£ƒV%dOá0ŽCõøBæ¦U�ÏÏ+Ñ'1f9F÷(~�^POÑ‘ªâúÍDt=æJŸt¢gà·¤ý�böÉØV—ÈØM¥z:‹>Q.€§h1ŒÞ¦é)ÿÉø«ÒT/†ÓßTᬖ£l\†Vqèt‡ÐðÇÐÔ`{«¥�ØõÇŒUe"#ùHëýÕ·‚­,D_aðöDcûFsµ'4=2zÉí+¯|/é&f¼Ñíe‹2¯„ûH¡‡ì‰ÁþRl”ÞKt«T…/8¹`]]0Ýa™Â/uM~­>aµ2înçZD'Èh'�,[òK{¿0ÊMÙàÿ‰Á÷ÔCÆKD6©Úe3®æÏ-#vÁ °WB⢂‚S¹£˜ÞãåP�½-…Ѳò2½|NÕT$4¬%_IXÒl X†Ä—icA…³ÄŸ{â`pЏ…Ο²<„³âÛa*âD8¿?£µÖÊYôù|AÒ•}V¹Ò©÷�~˜Ô.ô8#$§ÒåÃöQR眰H%êHüb×3ºšÕ¤ZÛZî/¼hG¸˜iÄyEA¾ÈýÝ·›?îãcÄâXÑ`J÷¥…¼�xD¯}ŠxW«DGL „ÀnÃJí+ñK¨ †±šÎ2aˆñ¬>aì�“3Šm5zDCÛ·Ðæ2� fPìó@G¾ý‘b.æ «b¾Æ4úèP;x¤­øLäKØ�O”Dõ”Òª¢;âóòÙ¢M´·ÇH{O÷R4mrü2:…ÉÈï£~}‹‡ÐIH>X—ý·8IJB>4!9!{ëµ€EñåÁ%¥ô8i½þÙ"_ñ¾}CÑû„�O´£±b¢7êéöŒ3ÇN¡"Oš1‹¶ŽúFŸÍ—‚“ñnCÈŸæOPÿ“òψgfu½K«³+Qû2,,¯09¡Ã60Rþ<‘CìhíÀ|�0Ï©Þ7¤ŠÄ,'Àûüu¨½LT¸ø f‰~LÀÖt²™7 gM&ñÌ4¥=ÿJê’mŒ„jÿ”ØÐ¯jC‹G´xŸ4› ¾ÆŠ„†OìÂ*WŸ¦¶ýDoû‰ÙöPm»�<&Gp™�9³PÐ5;ºCÚ°daAþ ­å2þg¹TüD&Ü+,Ph•ã§PåÿÐ}³Zð“¬ÒGÀzi¤m_ˆ‡P¨ï£Â‹LŽÒ¸OŸh“ ‘Ÿþ­Ðœ—3.ÕfT¢ŒTzÜ´º–×C+áÔîDž€/ d|+:HÒB´ÄŒêòÓ¨8à¿2À79€‹>úê`{E\íc•æF)iu+*ÊÌ_&°1Õtüáû×ÝÎ�LO¶9 Úñ�œK£ÈCÝø¢sÕÆH&)< ¯’°ãeP"Tw«xÊ(v‡9.ê”㹈)«J¾‡¹š=‰´!Z¾"Hñ!1ä–ñ”b}nrà–p;îÔ˜Š½zʹbi`³¿Öï͆¼Çm°Hêi2Ÿìi…ˬ”²xЀmâ¬'�*®wøgÉîVGÙqˆ÷1�1ÐSDÞ¾àt>‘–вfzCȦr´àÛ¶™@/|â@dgÞþqïjo·áÏIm×;g[öòÓþV9ÿO1ÚÄ}¡pQÈ~»ß�ÿ¾eI²ô3~>Ø<¨—óßr?«ˆ=@½3Ô ‡(«þñüTåÛy>¨�œᇠ«>ÿV¨–Óߎ«¡ú��øéÜUÿÛâ8ýÏê3ßÿá�áÿà;ìÖ¡œÿsfw8³ßÛ?€U*§)1C»=F…Ú˜ÀÂÏ^PŽZ”åq8¨¯w�1¶š�VªßûDñ6�›Jp(�Œ_õiP¾_͇ï�±3ì'þ1¾ê�[Òw«zðY‰€-~£�!áÙŸ8êß`ćÇÛ§[ﱕg×’[Àå«úJñM©#`>þù¸â%×$ÐTMËQô¶~W~š‚/¦O6òMêFBú•x41 5´hEó õ)|"'mc�Æ–ñ,ì'âÚ蘜h?Ï#'C-°P'(~¡ðÈ'êMe‰V|dºzäÆ0™è;ŽcŽƒ¯$¢€Ø3Œ›©Î3!•OtÈý'«�p jb›�ûžÂ+@•N¦J£/�k¹áTW˜T%:ªF§¢©-CX¤ä3Q%!YTŠkïÕœûHú�™‹–˜2-Ó©»Š3MÜÍê�‚@ñ®¸Ò²WÑGÇùQ–àäù©Ÿ”UÀP�dŸíK5{Zuº+;OÖ"žÎ]DXE{Oˆ=T³9%q?“Á%{g_öÚ‹ú+«‡@sT!CK€~3F�ú#Ê‹½�Ìxÿó¿`@.4O� íðÛ ¢@–tÈuNàØbã7öÉ2 X_l2’uQVDå™ÀÑR“ âŠ¢á2Ã8¦õ±ÆðÑ%¦… YÍ#bûOÃY(EžÆ'|pNµ4w‚ày¢?p'ç $‡„•btq[(ù2J•­LoGV I×€K4/!ÆÚ;þ R•aef×NS0'À)lù‰ˆ$£ õ) |tÂùbPžLˆ’”7FЖêúÄ ÜS”Œ?VP€½ŽN�pªò£¨>ÿÄ$õV"ÎEòq^¶†üÙ·þ·6'—rÓ6œPXaî�ÉÇŒ6á£�+U¹4 ¹ØMí`¾EÖ¦W ±m°tV0«£éú Ú$ LÒÌ xLOп�WÌR£’)bO'XHÁ·Ì²üù-3n…SÝWìóé,0È�#ÑNvX‰R†-Iw8µ^©ía/.††Ë2EÌr™ÿ¶•—«!ŽûåÚ;(ìUèK>Þüƒo@Î*1Å8;‚³Ã�ÏšÜ$&WU@~AL˜µDª@?¢tJ©xO§—_ÄYv%g6‰ç“|â”N p '‚�¨Ÿ-ÏV¨0FàÕúŸ¡G­Á‡Âø‹Ò!i)c¢xÀÙQF@ #æEi}q «çó8”Ž}<†�ʶp.ö$th´öj¹ ­¤š<¤˜Âp*îI•+é­ÝCcŽ—R໬‡TÀ1ë7öö»Ù‰Vh±Þ;ç#Ö¡#8%¤ +Žƒ½òSÜæ 3YSå™­ŒRl3?Îþæ‘û¯5ÁÆöbx:»¶ ލ*«°”SÇþW#YšØž*¦jš?™5Œ……Ø’–'AŒ1tfVtë]×{.ñµ1ܪg fŽ4Â'q½ÏJH—Î_kä›þTì÷ çi°úq¹†)Q" {6öªQ°r<ŸéKrÀUØ�G¬"ÐæY@ZPÐòsö6þBël7JqšphQgô/·¨íN­FÌçH]¿Ð ~l7vôuØéÎÝ_hP5`7Ê6YÔûy4§M“26�óÆhkŒgÎFí´mÒUó¶~õ¯¯}m�¼»1‡ÿM§f�qóË¥§TìLAz1m»½Ã aÍ™§ÑŽºªójŽùÃÙÇ”�‰g­6‡:³½¨sd® J™�ú; CŠ™Ã7a[…I€*•)ÔCˆæ¯pÒFH ø—y�þG‰›í8qA§«@3­é~­N_ÆÌ¾WÏV{¥ª7¿WbÙ5ˆüZEEéÊOSœÄ1™;|Ò—XNŸÑNÀ¾p@û�ŠÜêáÒ§Ÿèë/¾£(õÔm§–/Òˆz�~èú±ÑØb8Ù4éP˜GÑœùgdK0Ï�Ó838ŠÁ:Fû(7k'Z ûHwjúá„”ÿ¬|wy››P© …½$Mp’ñ¦›>5ºPú„wHÌY~!MÓ©ZÇãJoؤt¤ ö\ÀÑôPûè•é'¶WVÚ#’Å“Ú#¹)M\öº ©ŠŒj©Á„Ï$�‚úÃS’èÎV€ÿJWVËÜ&Êeæ£Kç4zA¾�ï ä¼À¦öΠ>…ÄËU¢¯H›ÝØÝhÿ`Ht‰û„s™`Kã“Ö§Àö0‰¯Žfÿ¨2=±™ó’Εùq2á>¡Ç ^óX]f£‚ž‘™ ÝœÜL_þƒ+Á´¿ä£‰e$”#öÙOZ %˜˜&g‹Ÿ‘ùt`pÇä,aé,¡+Ìß< ’¾Ý Š(¸ŒvÇä`Y‰ìûGÐŽ1=â”Dö1P Ô\��…Ê(UUå/Õ:öË"l±îFuªÅörôª`rôPfŽ•Bᘬ¹âŒç1ÆÀ ø }éÜ¢›Ü*\½…Ð+/�¢V†'ñQXë…^•.8£#)øƒJ :;B\&ï@諲Æâ“»JRkµž uêäe=†*^¹›^þœê!O^þÆ/Õ-°¶‰Ò%ßðØLí‘Ôg€ÚTõL‘?ÈxYOT²®¸¥S¥’Dî„––Œ AWÅ"Î'ôõ±(4ç²>b+´åC Ú14ñR;“޳äÄ�„G¹x§(�œ\Ó>ž‡VÈE»<×ëÜw/âL:Ÿ®. }&^kùü;}Ž7;y©âc„hûßm4ŸþÓ¶Ô¬êï23º3:™oßÒx�„ö•€çØNq'9i€U2r²l7­hfP‡�ãi1üÈ�­+G̦ýL‹õA2´MŽnË_cÌ4Àãë¨äÛ‡0L{à§öa/ðq#{OÛ�ët¶!Wrh¶5×’â—ÆZkjòvs$KUkÝ$X*Øãsß¹o ¢yõ¬•ä {pÁYëÖ¹EZ§ØÞÃN¯)Îú¯“»L4‹ƒ� ‡y÷Þ2¦%5ËѼÖéÇó{2„gN•j¶X.N~Z àëÅ׮ɞÂRkó’Ï3&¡U@_ä©ûÙ~¶¨­]œukÉÊdD�o•ÿ‹í.Š|Çg§ø�SVÊá8?™îve–±ê©~ äÌ›�ŠÆˆ�š�MäR4³ûмŠŽ >ULýø'Õ?"O¢÷(TÉ/�‹¼|ˆ>Â"Ÿ#ëâ•”èÙÊ*Lk’ô&ˆ÷ÈÄD«¼ ôü–ÍÀü#²�v]¸ ĶE�®V¸LÛî°fjö'£;Á"ã'ö³ÒS&ùG&a’œ7̲:@ Ðqèõ.ºÍ»>Ð ÄÒ[è“êûdòÒ¼�Ñ 8œ>®hÔH²ÊÞÉÛƒÐ{YO‘AÄï@»�3ÞïùW^%† ½¸Ûß §kZ‹õ $/³Ž}"Gxq–ÛßrÑ$k§çÜY;7ûd_±&û:µ/΢“*¬'ŧÆTþd*U²ŸU˜;µNI³U‘òÝÉU´,éNÕbÿÌ�ôÇŸ�bº �BOñc’£6ìz�'€³Äk�6 ™'¼ò³„e´RrˆšÜSOŸ$ˆ1Ì–Ê}'Nš{„¿ÿó÷W/óõWl fˆ/´á§)t64¹ßs+*ËüàŸ-œ(�—k­ì\w&[ JHðÍæó±ýqw”Ùp -õ¦�‡OžE<ýÅîDýå¡�®½\w)˜ÂßO¶�OpÉîxÉ Z²o:É´—Ã/5ÙâéÄñµY"Äò5 ;J $ÉɆÈ×"¢mÍúQ%8-qR£ÌoþøO“ÅŸþiäN0Zb°+¡àîž?4×w|:DÍP¢{oµ);é¹@½ä·þ°tNwrtLH`UXÁ|½©dÔçºÐ•¸Q_œSèªÙò“x4`’ÅÆc!üe·~&eç‰áBåj³xU¿ÌBÑôžð ê œ«f�cs;v—_¸77u&¼�â röÎLA�Z_áÛ|¬Ë¹)TúqŽö`ÁvgÃêîs˜”¾ Wc†¶O Ó­¸vAhr�ÿó[ï�³Ìÿãè!Jnò2´„í-8Ñ!ý3Åœ&üý·âïçÊ@cÆOB’µ$Æ÷Œëª_Ð--¿æõ³²¼ Õy4l°†íœ’ÊEM›âÔƒc7h”±¨¬TKðO¬åÃòÅöa‰>ÙN,“¿ÍØØÄ Ê¹Â©¥b$XPø*ùF•sê‰xÒEPšƒŽ½x6E‰§®X­… ¡ö öj^kEC•Žö�(Ñϯ8ôÅeÄž5l³{žiàfn çÑ¢#6¼ªX숉•8EÁtóäX¢¡2õ«eŠ‹(üÊWäÍE?$'–�aÌxED2+3‰‚>áÖ¯gqÎ ``åµÚ´Ýs™J,à˜øËècE}€|£®<ÛÜóuK˱Âs4â™M2z÷ø…»²gÖBÐ'ÇMYn»d58Ï »ƒ˜>Úç“ë§æ,àdæÎSLñ½ÙV©‡ÙÚV G¨H@VïHW­Z¿aÉÊbC«Fü·Ta?ÀÂBúy½TqE;–Îj,y©5QH~:9çQ˜F/ÜDÈï¸\ð§”zuªÖ% î,âO¥3g½öÛоLŒ�=±L¬¸ÂÛ‰/¡)2rU:Òì%èÐæÄ�É!ð4àF÷kÇHv’žJò %b Û;ïVŽ3 9–áÀ¸êɧu ”‚ É`Å/J1Ó1ÉØ‹‘6­"W(!Ÿ¨Ø~.Ê Ž’P°»%ÆŠ"×fÇ!FÊμ²Ç‰iïºê¾^±¿jèx®B1åÊ0nN•ˆ÷vU;úWLèÍЂÂÁ¸ õ(ÌŸ¶ûÍÖoù þƒ3Ã2ÙãÅ-½£_(-B�õ0äƒèªæÎþ,ÿóÛÙ·\pþ|~8[‡ì©ù˜k�úCøD wèHò‰ñez�ŸP=Æ¿°g•ÝXvé4Ò59`F.³ Æã™A0d‹ì¤uŽèöaƒV)Øxx -FJ³`Å3bB˜@r;f|¹îqÄ[T;÷ë7iQ`^€aj”zå±b÷LÌèc��ô vÉç°I4ŠhÄLØâMÉÑ�žÌ/­¯(ñg/D¥É#¥@yT3ѽ»Çt>ÆÊVùô68Ÿžv~µ°& åL(Ât"|Óœ—u¢°{Z �^bÄ Ñô¢süH Î5½æA»3Ó0± õ]iF"mdŒ��O"Ã/´AÔw¿äVš3M…�Î̈QWÝS!gª‘ …¥ÃcÑ�¨ŽøDW¯j%¹ª!˜e{™c‹�N‚‹V§;fE� ±4Çþ ¥'®£“^?(Î#,*=7'Zp¨ –à­îHÀlˆ`6|iå ª-Å(R”.ç�ÒäPˆgÎmc¥‚ÅW'Çy Zñ n•£ L�ƒ!ç€m+™‡„§’……áåðƒ…`½i!$^«Zô²d ÉÂ9‘C¼c£I¨µ‚!ê‘t‡Õ¨&ûE¯²Å2Ÿ×¤L—¦P‹ÖÔ¡¶â‰Þ''I<Ø#ŠY�I*ÎéÓF”ÍfÜPï©N-âµ�¶�®*₵ xf6 S@T†�ð4³¤ ¯ñV°úâ…ü°U@*ý•´Ñr¶h±�nøFµ§:ÁºŠk†XÜ�fý:Î}'%GíèËrD&�“;6á-Gá¬q•²�Âω®Á ŒO1°s·q÷Šö!=¦´þœÕÜLS**ÇM¤ð« Ëf'0wTPo7D,‡D ©P�´Œùˆâ�iybÓ±j¦T;=–c`íÀÊDÅNMšS;f-€´]˜é¾—9U°p³ða”k4‰Ù~b¾þ‚Ø�œ�8/3ŒÇ×vLªíþÚýkè¯øÞ\ÂQ—Èj<ÿEÒuLú(~vj3:úÙ'szúåõ°»äÑÜÜ/-ç”�6Ñã§9û(oC~몃h¢fú~Ò‚uá81¼áìÍQQÂaÕš—]rCÃ,Oü‘%á¨"N¡¢…÷x[v 䘈Z9ßîÁ$gÂü;·õ;?Ð$áêzdŒðœµF_qPR©Û1©i‹Li‚J-Ô`òaâ9ЬâÔ�ëëBý†˜€±þÃË(¤8 ó/ÓÕö$éŽ/:­q|Å�ñuwܼ½³Ï -J} ”²~ë§ñú¹|žñÏþ|…×6ùWùæUÐÀ¶äE>ÂSocóÍàü¿øgõÛ0SÉõ˜:-³9и×hÅ>Ôzïó]¦Œ¦ÃË¥«Ö¯mKO?ó2õ#ÄÏ@T :a^üø$DÈŸáù/›”{_›‰nÃü·|ú{}PÇ·uŸûÆÞñèËŠ º¹U;©};Ë~Ë¢Ri>ñ�ÊgÅÀ{)‘ioï[ýæ]+W¿~ãy™ç÷¯¼s�¯€ìðW—͸ÕèÅ}®cžP9�À•úè¹È5ä'ÆF.Ÿ•ô;^e©B?íªÐÌb²êË~Wªw_Íø€`Fûº"¼&å&ô“ÕB�Ø ®F?Ε¢¹|VP©ä�ƒÜpÖÓõ�_©�r°¨ÔZÈ¿a�±”:Æ¢>ü¡z¥ß|–è=®}qM� –=uÒ £rw›p�@5 ‡Ûh^Ò­Ž˜~œ»YúI=IbßzÜÚvÖ•Cx@JÑtl‡²G”ÉŘoÑŸ$ƒrËÏöé‰ÑO4í‹9TzZª�Êœé ®C…,™r9ò)�B„Ña·~—þþÈÌsÒZbæz¾*V¸^¯8˜9?ÿH`­N;có½›É}àZ ª>&”Ñ÷nʘ‘•³:·cCå<&-¶ˆ+±¼rÕj'zcxI­•âåÝÇËÞÿ•¸ Lí¹K< %žßDDIY0P²HOˆ¨E,‡f+M6™&gË¡©M+¿‘qfVù{� ª à)sÎ�û¶ÛaBJ g$9oƉ$Ndmä›ÎåçSDlÖ¾Ùò4 ³FeÍÞ�Û·õvóÎÊ{N—‰�×)d l±*Ųu”ù÷?±CçØˆª×–x)ѽMdyyN©ö³rl´©‡†¿&�¾óLi×ê @q½mɇ•„ŸGmï0êÏÓ‹Å*Փ礂í¿t„ÊÿªµpD£_X—ÄôøÐ\ì &×jz5í0è¤�FWŽsdÝ¢pò¢JZð-Ê�:ðÌ@ô.H¬Ôc§s;"œœ@Ä<°-Ìß/çÚþ¢>ÀÔ¤Æ%Q¯C>ìG×ryhù 02OÄk°]_𾬒–;34�É꘼ƒç¦1xfÊña`N“³U;p�®3l¢¢É$¼¤€gã1ÈJº.šÕGgé†Üü�üñøŒùZ£Ù8æ5çFƒÅã;6ó·"0ο•^y>ÙàéC1œq­:¤kUu¥nqž]åÈ×uŒ�å§Ó¶A4 ¾µDFmá(GF*Ís‚€?š+Vf}cbÇQeÑðÇ@Š™ó5™pg À…]‹2'9¨gQïßä°¬\˜ŠAâLQ4j؇Ep”‘â¾æÝôãâľ$FNÿ—Æ(ÓFójì[FÍ»PŽ&áà�§�s‘�uż!uqù7Û´Ù‚ÈjRóš\Ç*ô…×Mžµ"xÕL7¾LŒ„óœ{m-ÃUùE-|±D;A´­Ú¤`«Ñæäˆ6HûŠ×Ä 1�T›ˆ�^¼˜NŸ.M÷¦ƒ&:rð7Ÿ…Ã+jB®Æ)3aê✚盌öd†»FpÜ €[›6|íA/ÕhW@±|µv§‘”°ÐÅw¨çf2€^/;kd´E©0œ 8*1|°YI Xù=]Š*®m)ë0¼=ˆîá[­¦ƒ�*QeÂö#ê3VmfWˆúB¬^³E/�;Ï)%…4¹ÇF;0x+]íCàõ»žYpê2­ âlѹSß /¬¾Áº¨Ó,›Dsx¨#Áä•”R0ú£_U” —˜r’rTó%kŸYA ¼è$(·­Ä†18™ŸÜ+'ÒÒx~u®3TŸE€ ¼ƒrd�DĘ„Ų|èÙ7šZÚN}Ÿ2u/‘»®÷˜±ÙÐ'€Í ÐÀ! 8*TÁÅ×�LÌLâi�³õbìiý8¥ó>cv.®�vml·¤2èqªGŽI¦Q–5O,Æ<‰T«ÑCF̨ТÇÊþçå¼2ÆYœõ20…ÖÏNE¹¼<òÓ“üÍ-ˆW�ªªQ‚7…Ac@­4“izô‚Òä ºÚõ¡‡·!‰"γe€[3Q”¦³9 ç™óF„¶K |)ÆÀBîb t�¾©|í%æõ«)‡Ø^ Á*‘Ÿ¥P.3;GVR˜vó9úÔ/ÚL°ÁÛE§ 2åaœc˜ðˆÇpS›P#Ö·©ö•V~=/‹Á}¶ˆ—}ã)oº¹mN»Ýéö¸:—[ôèQGÆœ�¹ã©¼òóµÕè¶¥.¶aê #ãl#f|¬ ) r¦ÛFÿº­”M2¤G'œOô˜Áäslßë¦4r>°ýª> %~ôÉYÏRß?ÂÛ�x޶Œþ&Ôª·ÇçToˆ÷ë£³è ˆ4Ö¥o€¢ïH´ÉåVç“dEbR„¦Î*�´ŽÐ2õÊ9ÆÐOñ<+?JÚŒk+›ýªñ«œ¸ÊŠ>{¹³îl¨�Híâ'I ƒÓBÙÇ�KJûÑ¢§e qYrg¯¾¶êˆ™rŒŠb¢Ô»ñ A6‹ÉåHG`DçMäl%â饒i:ÎD{ã|®:�Þú*[Ù|e,jolhJÜïNƒTWЂÌB�Ð…#ÀÙk !�vê#µÏ"oçËÚEú4ji+ìOÅ¿‚-�ƒË®x¶lãç"sò£š« ¡×�"£ˆÉ¸L5m¦ù¢è“Gkõ9J2-þÎÊ(1Uâ ½õËò×PyþÊUŠsL0möÆUf“r5² Úü¿/¾D*ÖÙ~ŸfŠ˜oWñ{¯}œ=÷ð˘ŒµØ¾PTuLÛ§“Qn@×’Èü“”&‡Þ]|Ѭ·X ¢�ÕÛ,ZÁöˆÁ­ �BŠôhиq–²ãPÂoÏ™U:uc¡q:%Á>ÓÂç¹Ö!? ƒë�Ÿ(<#kZ¬¾MÒµ˜Äõ£C®Ñ¬ˆ®ù“MßRHÜ¿Â)výø¤æÐñ†ý¶}Wê {ü`FI›|Èž»'ÒÍ{’àâ;iË|8×ë^àëßë£ôÓ}·Uæ² Þ{h_°?j€jÕ²‚½‰^€«V'ª·¶Àm¥Å$ˆU N4_‹Ì¸ùêï/ÿÇo…?òx9È#JÄÌ;]h²IŽ7a¾Þº»®cF+Ã/¢qÜ}˜ïnöAb¢b?<†ùôY-ûõ|üçm�Â'^„ù?³˜µ ]4G~õ7´¸kKa>ØGçͳoÙ̹ÒßÜ·FL¦ƒõÕðéN|‰AD�z�l� š½fÔlA·eú#ÿÃd¡ ju.n0AV;<óâË>ðG˜´ ÒŠPvÒ¹ƒ¢�N¿ß¹…²¯A}?¨f/Í‹ž›Ð”7pÆÝª,S·“Æ^ª~q÷”¿rÜ®™;¶¶hÃU…³�¦�æ}9Â1I:ú‰?±,Ö¡œ¸—ŸdÊOWNô¡m¿Î|ÃW,õ¤¾g~¹AʽªWôʱÊfÈCËÉ'�†ðŽhFoµÞË8x®—Ÿb\x~n»ºg=wìÊ�.€V[œh‡ÍFg(¿)¦ üîtnË’¸¡×;ìvî`îÞe«Sï{eK+Ôëí`YÕS¿<8R8v~˜ôPNnÆí8¶ó!et ÖP¬ñ’¸úê ÂO�„ÄoãaPÒ„ BõA€IsjÿC³JÍ KÐŽpé÷›§xé-*w¯¤��ئf‹üηÂtÑ+p›Eÿ� ü*�û8ç=^‡´ Y@â65Bb‹oõa›ëòâE³÷®þŽú°”ʉ: Ô4CÑ Hw#‘¶añ€ÂÆ}�ÃÂËžæ³PF#ÚÂÔ«8m H3@F[ê2º†qV¬¼%/^xWº1^ hëŠÛbäŠb£c%mnÆßT S£:²\¡+*kSG$~Zû!×Ñû8Â}U”-ƒ�HºØ%Ý 5Šç€:ušÁ£¼1v'0Ô+ðU~ÏX<œ½¡mûf0c‚'+¦Ñ@Ý�ĨËÒ`J~&öƒøž`Œ¾ç‰@¬pjÓ¿v³¹¸ïnóÚ(íå™wMøðùþ5 ã¤Å‰YÜød*:¯/¥|‘ñh<þÒ¬s� !,ÝWµšrÄj/ €Úk:;{M“„JlŠìžk¾òÔL/ͼ)Í\’Š^jõö™ž›ç¿¼´S DŠVŒH„ÄÌŽ´Dúë9ÇRñŒÛY2Q´’¬]�¬(÷KsáÅ Jë„ú *µGݼ§¯{€/ÒŠ,�6¡?˜F�ç9D+*ÚÛî´1tB%1’ò[±Lk0gM—¬q–7aþ?Jôo¼ 1úùoù êÁÏnõ[5?Âü?sú©¾…ÊLt^>K}ëŸc ÊoÝomtfìVËßB_9¸ÔE§Õé¢gLÿ�›¥ú‘šZG�Éz³5æÁŒo;˜oœe¢±Ê¶6îÖÛWñ¸×»×ã~Ü¢ü]ì³yßm�‡q|ã£~¤þ–{­G�ûþ¸~w‡ÿû–íõ;Ý:4�Ë|Ë’ ÇÞ£­xÜ�{c@"@­ü2Îì7°»}2ÞÛ®mA«*b¾å¿åó´þ­ •VÂüKÖ6}‹Îþ|yNÙß« /¿å¹ô•ÿ’Šý?LQþªHÀ­D2Ô ]CËèPuQT}qîÿžýùâü�|ð†=Ão™o9ŒY\¦téèx ‹ž¯þ³|N©NË”wïbævÔv^¶spLA½BKÐÅêÛA/¨ ϼ?òÞyþxçd7]ÁºE§EV¬àCáô¥k¯\·9850ŒX‡Ÿ&½ð ÒPà°>eÉИÿÒH÷®Õ¹*{p,{ ƒá5 yÚú³æÛì²Ó¹ø6_“¡[�èÆH["(צò‡ Ò�X$„€£|�ifóšZ³AÝ:I–LS„# Ú’áhÞ¤©­z’¸pT×{çi²O´/»?‘iÜ6Úp£Neƒä#É7(“¨RsR˜&2„�Ñ¢…Âv±AŽ¢£ºIÓKŽK$w`ÐHQT½îÛS'áùµ3›¾Z„Mø!­FåÛ׫›SW“ø=އÓ›¡˜¦Ùc7é!6Iu’œô¦áĈÊh�Q¨R«‰O œ¾Q(ÓZÑ[%e #Œ,^ÈÚäã¸ßÇÈ&¹ËV½ÿžŒÒz´ž–\®œ)p+Y…@a«ç¼'MV¨p¨€ßéŸÅve°$êFVBP” ×Ϧ+…<&�ÀpÁVUÕô©©Éu iI-Ç)�ÏñvÌ\ÅN¨ŒÊ¹„ œ$† Ùâc0äX~ÌV¨¦Dˆà7 %§ÎtÉaß§øràòM}¦|I;GR’›<1èînõÑö­·|<Þáûão"óbËýŠs_0 °›2È@æž­6q—SüzÐX¼r厉f4�͈„ "Ê„�{1Â’”ãR¨bèsX¼IùI¢TrC¸³ÿ”¶üøo‰Ã•F¾ËN@dê¡Ô e].*;ª¯Ñ´eš!Â#M­ «©òæ4(“cňrÄ �-ШÝ0:FÏ€-ä+�õ &Ìæª×¯·/¨_ ~Jé1Ù��"4ç¶â˸ÛEÚDïày³ÞjEõ‹›^ÚëÀw©Ûø¶Ó}ðÈL:†Öú÷½M sˆ#ò½‡âNôžþý@¸æ€xÆý€í˜ÿ¼ ¢×!Úzãð(Ðÿªá�â÷pHöIÝ1Kî©p¹5Í%�$ô§˜¾ê=^¹Ð¿0דJ´§â–;¤Š´ZGNÜ[oÙFûþR5ú �¯p„öGö•›ØüN±ådf;(‘·ã°¾%wžH]ûpO»Û‚ S:'“L`z35‘Íð.Ÿ e< :pºÍFüär ?RZ;ذ[yÆîª€ÔÞuÄPt4�Ê™¿Ä+݃ Þ"ÚFÔ�|1™Xæ$;i ­Ê)ŽÅ ‹WF®!à±D ÇFî<˜L­sßÇ‚ItT¢”ÀoG^ç ¸„Ñ×W…êR¹PQY”—‚h‘S'cØó¨P�¾§ñ(¼†ÞýòÅùç¾¾¾ KL°ûõåb5u_ñ®¼°ÄÜÊ5/ßvÍ˦˜ÇQ¨ô×¹©½O{õ^?«êz´—d©Š$j?ËS¥9�l÷ëWòm ?ù›[ÿè�Á¼0^ò­ê aݤ›¦ëæ¥p—æûÔ2ljšÔ2øšÐ\—’TC•Å0*ª»i|øÌ7y˜`ç+×—š4¨—˜%àkˆª>˜Ø�Š~@üz˜ì3“|f‡2­ 3�|;yGÇÀP/Q¼÷×ÊŽª 45^S�EŒtóÚB6è â=€ˆ²åÚÅ«²«+\TÄ‘ØÿIÕÞ DâÇmQ“°R'Õh©Ì ¿CKÊØíóܟײâòÒÉ}ØBØ£¬†ðP¢‡Ò9šyìŸ-Ê_¶<¾î÷ïÊ^u­P^ZZD`ë¨Fov1`㩑ñŹg3~ïªÞ¶”7¥Håü Pçˆã“ú'à=¬GBÔ®•\(vm‰i®¹µÈ_X¨S�Œ5=ÝBÿV±Ô êD Ç•}ín&0ŸÉp®�9€²'ÑZpÚUHW|GiÃ2aú­î ªê½€ó[EßT®YQF‘ü8AeUUP�–¨¡ä¿¶6µ;Cäj¥¶ÒnàýVü o쾂éè0`}ˆ*es‡åñ§è>;Iî´™+{š_%è&;«Öáu.É ¥=i%‹U¼ÀmJÁ—M»pQ6Õ¡dŸø$ušÓÓþ¥&kÙã&ð|ÐÝô·r³#Dk~Sï�e)å6£ë3õ˜ú Fb ÍÏVºÒÚ‰Hs–xw^}æ]&�(Y ´–U/Hy™úÇŒWIý ¹Ù‚ âG·DJOVI¾!œ {ɬâì¹"O«« »†Úö]DÁÑŒý,IÇĦlù¡>»Ô³[šËâsl†õ¤$îb@þj¥Zq‚-àX _pU€+º.ªX În'�-Þ»NJK/ÊtÂ彊ó#é64Q”Ù“HJÛ×g掳”†=N�‹Üžm¤æëIm”ÞÍ·>¥ÚƒÕ)V€í‘Gè„no…ÍDjÇ‚"‰¥Û¦¢·Öåk }^¿uô æÖ=�\“…+S Õ¨–Æ Ôþ«�ÀÓœ~z´�œ‚6ùzd<@³^Õü‰v=?àH|s°êFiãU§ŠÂ/®g‡(ºs¨zŒ £0ĎŘh I F¿Ø•\Yq›l!’Ap@!ª%)¡�á�„©~a‘û›ÀËxn¤ü�Ò? lý“•óBŠx°Ô|µ@é¶ãqÝŽæ�X}/ÆÖ3Þ0³dk¼ÎÕ}aðŠE<ðÎ=R‡ øÄNÙ�öZ b^¢oÇq]ÇbGߌ!æ–ˆÁ’Æ%nHZ­žåÉt$aÕ–AˆFœ S}–n6�±Ú 4$¡'²¹Æ{Ó}WÓ¢Π…ᓚ²ˆ¤#D�ìï4D§ást¿‡¿:G9Eq‘,ÁÑFŽ/—ŒÓÙ»ù‰írgÉ@2ê,®¯¢ âpÄÃP&áØ=ZÐá_�g„:×w[5“3‡]5 çz&#Ž«c`ÛÌ’v{ƒâ†ð:Šné í0G'¾“(X5“²m�Ää¨6Qªr Ô·W¨„Ùà(Ö­3²œ°."w Ÿ ¬ïÑîˆéªbíÂG{z�å:h+´Êz¨ B-L�ô/êúuƒœð¶È��cíPd3İ5ÊTÓÎTì�ÄÞV´n{ÖB9 ­m7ÈþîY´�Tp8£ËÑ„×p³Âã‚6&ãa›ÜËx¾0!G£/\åM¶o4²b·¸Ÿ»@Ë©Tb)íàžØ·�»|Ù;°ó=*É‹ í15NvêžiYÂÍí’ ²² !—côj‹õØc»-´tº’#£#F„HÐÓH’y©zt…‚cŠœœ–…!^ªßI)O™�ÝÍN51�~£ëÑ… Ñü‘]e65{|æÓßBÿ[5ýbü›?þVýVÍ7+Žâ•¨ ß\ˆf�ÄwJQ8óL�€UÜ\ߘâGƒš&…=éhï< ýoo;‡ùÅMù¹²Üä�R2•¢ô+>_ó@#ÐOűC[÷Ž(€,ü‹¦ŒÄ�¿INž³H "ñÖ¯&KÒÄ›:EdOq¾&‘QF¸,"Bj8óÃo%O¦è̃T|ŒîeaÁ%8lÆþÚNMKÐÁ#;É Mttj-[n£Ž‰÷Á¨$é#VJºf¢ÉX ×6KB€rõÖ°þÐsØEþB é1ÇôÝwÄV„† æô.—K|/pnçxdŠ`Ž!ÙBë½T»ÓO!è£ÒO#¢+•$ ñ”°îÚEN¾'}UÃÊIWÓ å\½Ì)Çð³ÊGY󯳝f¤7«Á±©™O\°Ð%‰4â(‰G¿Ø1¦žq¾ÕEQB7k‘ý€B;ÑK:üÖ(lð=i-Øì!–îSË03úT,ÎÐmWš@Ã+ã0èÀG[|-QƦ­že žzNLc"²xà¦ÍºÔý&L†¤%@gø‡�ì0ǯ7¯QgÛ§åáŸaòÝ$FÿL,F‰?ÎuÚhç‚A8Ú$¾¡>/†�ÛW¶¶ÐðÖ�”·ÊHzãqˆc%Qª£mUò):Ö3=‘¯¸"ÄINÛoÃ�°>—"2€lR*­ÊFªUIºÉÇI7øä5†ºâUcL‚"'Mç0 @õ£\�8ïÏ,-Ug¾E.á�ÿôXyiA`1…ä;+ËAšý¿ä`¢èàóÛƒ½~ÿNi-®Ð)Ì|ü}æÇÎèÒÞÛ&Bmç²O­žœzns ¡qtÝ}vŠÊ:•ceómõ‹8€mФ\?°r~ÛæUÚ¶6x¢Î…L- è‚Ó.zÃfÿz³7`Û°Xì'†²¥Ÿž$ªfIÔ‘  ‚ò?6§9y©åà”ï´GeyR�æœÈ Ë`—A‚àqs¹{4”ŒÉÑ¿s‡pB=AL´VNk`*ßl4«4'Ï|(ë [–ÇT:TZ&» ÎC« Ÿ'ïN„+ G–KÞòÈ…ÖG¬‘uÖÕgÞç¬kÜÈR4-’af•‡ž ÝÞD–8…4Ši}ˆ8_ì…ýžPUÌþ;ªÓ˜yª1ç�A‹ ³�oLÕeɸ²Y× æI£'´mé±Âp‰]D”ñ.Ö4CƸs‡u6´;þ;te s[¤#«él[Ý�ûw0ߪ�”SËͼŠFåû>ELÛ ©]m A݃­ÞKб1ºm�\5�_œ¬¸æZÏ‘îlËŒ ÕÒ¿&›9g\#ƒ…ÆypUÀÐå¥Â’ËvPH,•©V ÞLL<æ]aª�­’nnW¤ý}*‘ÝÛ§0 ¤ [�£2kë`çÒ&ØN&ó ;„Ÿ!ª¦LG‘‚7aþ BÛ†"ל�Lf²¢X´ƒ„¦dÖ½Üõ ¶-ïw®®Zñ¸wÝ¢I}Œìõ2!Ï|Ëž‡~5}ö­‘!Kr?}VÏ>þÇùl;¿Ô÷Â3˽”=/ØñŸ‹û¿výàwò cœ‰[ŽúJ Øqú#y'O*âÀ™v±??êKn.hœ›ËÕÔŒj(¸“�ÑCÛ‰•“?´›·°Üéz¸hÈ ý@·‘Ð9¦SÁÐ-†âê[÷›ÄNfl`ë¸qˆcªD^ÅX­†öæ@Ÿqè˜õ¹œ ®† ‡i—»�Ùý#•!�¬%)Ôé0lÍ¿>-ÆÎ²Ç�œÁ¼É£eE"ù$@À�µÃ¿¸¯øù¬}ÕÌØY¶„ÿÅu˜^^е¤Ÿ=ãùÄêØY›ÒTëçjî³�ê>¹ 1Z(Ó9âß�¹ž°Ú^>ÖqÈÏ.êt0 ‰l~I™w BØK¯?1WWö¶¨ršú^G—Œ)k®˜ì6{i¯,QL|¢hy•Ou™�à<í†Á·¡„Çp2ÔÚqÇ éˆáIÇM½¡¼màS²¥Á‡ Rðs8ª´ä·ÑÃÐ!H0¥z,-c zíÚë1Üê݉0¶QÜHërµ3Ûé_8uR?LÅE�µGpF"Ä9ÇîrÂ%Ûšþ�È0ÑòÞºÕ8Æ,{’�IbáÙÍ`®ä7áTZœco½°™µ—�ZgË©=b¥vÉ~¯V‰¶ÕÒ5Ä·¸›˜Ô[Z˾áFœØòuHb9ˆ,üÙ:×ùô4AÆâQDz5W5;xlgõÎMíœÏ+ú[|V:þg>ÚVá©¶ë= }°‰¬FÎ?1=ªì QY8Ql9|¸Õ¨€€‘ϾÑ|nëý6ÑîYwö†£~`CLóQÉlÜjyÎȼ_¶:ÃðŒ�8œ�3Ê>Ï*ü"+z¡Âû¸¤‹½ì5iãçÃ&mMÇëŸ?Ú@Ïüwpzõtû�ŽV‚a8Óõñ7è‚«qHQŽ[ ² æ>3fªK“d¾¦Ä‹€†G’t`›üªt¶h‘ê¢ÅÝÇ!¼(‚¶2ðÑ®KY5ÚwÑ_¹ v8†æ$ èR…¿ªÊWü„Fax¢Y\xÚ97¢Ä^X?+§òæBû°û®\¿a½]Ç]w#éT¢�ĘÉw³u^õÐ;n$¤ô€\ˆGÄΰË?¯×V\üx\ô3Ñõš–ç¼êÞÿ/_E›XŸ#ü¡ý;.Í¿qúÙЫf‹å"|» -oN¨±°³i…Œ!‚õb' ƒM5ÐÎÑŽÿk°eÕà_Ì1OOTA¡UFýÐò]’$;q�¯0ß8P6߃‰ÈšTK°´Õ&äõ.G^pvþ ÙQFd{Àq€ Ñ¢Û³sp. ¹„„Âû6Ór* ,cˆÈ¹î�_‡µC4‰ ¯"Õq"<œÃî¸i1.*û:Ž&kÝ›ò%&†J ¤ø%xÖNn°€‰öþÌ¢ø¶¡Óæ°ß¡fI°�Õíô¡ÛòôwÝVûYV¢Q6[¡œ¾£ zœÐƒ£©(QüZA ÙÈ5½ápÁJ‘ÃC¨bAá$Âþp(öšZD^¹èË-*dØœ¡óþó¨Éoǽ˿†=·Ìaê}`Y”G{}I]ÌÙ„ûð¼9°Š N>+Þz}OÂ= 'x2Ýžö#QÄ1�!ÙòÉš¨ØíðY#Þê Ûe#Âý€ŠOïʆÿW…'ÌçÚ,¼BÖn¿m‚ÀqKÌò½¿ï[/¨5Å RSæ�4ø+™ã5ÿ6Kjag!„ÊöS"./7ÉÊæ=•W^ŒBª77ôÑ�DL²Ð€…ÍJFl�’àå‡Aã¾K7èUŬGY׉q�ùs~ÿZz*ß¡÷ù£#T e'\¿4!Ϫ¦´l~Ò¹ÆhêèP¨Ÿ™Z” ^•ë�Ä›M¡BŸ.¾�Vψ'@±[8]§b~Úátfd¹Âùâ¡ÕH°UÒÃÔÁSåÍ<,ؼ´ÂžÔÎdbî±Ô&&­¦t8¾s{¥"³Ô»¤oþÔŸ¤X â™Ô9åDäR @¾ÊÖ ¬Ä¬a`ãVÊ.K|®ñ-3ãq¢ÀúHÈØ´ÿ¬Ug¢¯ ClÍ ëhäȱc‡Ù¼º€'�c¨P(8�˜lç† Œ+^Ú²¥� :Æánë]¢a} Úr!;Ýn൹ZíÐTÆqj§§‹áT¸ô¾Ýì“Q‹~J0„f) _hK¤‘ñ‡�i Éz1Èév„ŠðâŽS/%–hjš¸w�õLjþQ,aއãã‚h2"z‘‰y+ÄÖìÙJAÌ+#Še”ª)º�/‰â< ”ˆ‹@ZÑ—ùRÏфՀáÎ#±€ÇY!<“6„R¾PÃAOAž{þ®qç‘Á…“”ä®ÍŒ²üÆ«­ØVÆØ¯ KhÁSÀBŠpZ-– �i vÛ N)X’ºÃªHÎó—–êï¬öÎk1g ÄäÇ6“ÿ ƒ�Q®/ж/§,àÆ�ç6}«´…Ò'k‘4¿B­"�÷àÊBèC 'wæù,Êù$DÌ gè/¬%¤ÉÚÆ›3ê+c‡Yš�Ú¹6SDƒ¿q¥mâ>”üß»)èæS·~G:€ž¶Ü¥LŸá_œà˜›ÔA"·�yªi”ƒÏC«/t˜¨$¶t‹‚y}ú�¶_`V*=ÇXtöèØuœàhÈЈ¹p"У�BIj7£†á¥ÆdÂQª4+£.�†KƒË‹h�­þ�¾“Þ¨d-vm¿}ÙlSM AÊ m£¬ h ˜¢�¼Õ”�·H4Zg?ƒ®ó´i OG!(V‹þ,Ê“I§„[CóÿP½ûÂÙÝ �Ä/xB¬›Ä°$•yi]Ä/µå=g#¦p› ðíÏ�ð=>³¤÷$Æž ÅÙ¬Ûœ„…Äž€ŒÈ^!þrq1¡&×UM-€€T€€°Ë0sÈe�›€V¬ Èôúe´kQp¶æêƒ¦!på¼D£ŒgâÏœtÒ1g€ð……¹ÍÒ†Qv2BRª<|¢�­¯³²6ä¬yÙ­ßÆ.l-G?7(Ø_�´Gøƒ7),LÜD™Ð&™[̪´æ6ì?݆i,d³ŒOÍv£3�M‰ !êkû„ÊmnØmÂYÇø ˆ ëèÛ@F»›ÇÇÅM*ñªÞËøåŠÙðŠsQz/éá%®#&ιÅ\N=R¾ ÂÛĤñæ––|:)ÕPÝì[C7oL|Bˆyódçé™Ä��aþÏ>·ù¢1¾æ[ûßûc§c*–âêa<–�Î}¯Õ7[MÞ*�>M ²ÂBZ§b__¾Ñuc�‰¹Ä|ý!á n �n8С(Ÿö•Áw�#|%"¿êv {©û婸°œÕG é K¥7¼K%k“ üxæZ#¸ÿ‰¯¯ö¦z¢ã1eëÂ}ƒ’t™ ¶CS« r«Oˆ¦£�ü 0Jj™Ò7^ö'ezSà‚įÚÄŽø¼n…õ7¨C'Å+póIçŽüW¬§ÅÄWЖªÁ�”ý}ëWñ^ÛH-êŒð0´8ôäE·Ój©~ô©|¹…ϿԂˆy¤� ´™h�%§ŸPV#=f£me!GK¶+Ë5ÒAf‚çŽNž(àI°¹ól.èÝg€s‡ì�:ÑxÅŸ@':w%kýt>Ê}é&Á×£T9$ÓTCL;û˜Æ^NG®a)CÅð·6£aþFVz:`ó#l.'SZ/5"ÚýóŒ[©âˆp‚1ËœÕäxÇZS?”w�•Ëæ=IMB¶¸ò›‚ãK¼ï!WÊ@þ·Æ]‰¶²–Y�m%z° $l2ï’û­Œ3O¨žILÔ|£÷ÞuúµFƒ)ˆ"‰·úÕN§{‚Xº nµz/^|T‰¶,‚­µÙÌqD\ …™¥€º8¬Y•p„ºÖDß%€iâÌ¡wõ»õ‹~O�ó½ˆ<0³�9–r„©+ô$¢¬÷o/€å&+KmèÆ­:Z SÂKûJÍ šÎ¹»V³vmò/€4ªY=LÆ`0_Í<øÔ×t=Fo5ëI ŒÌ¶™=�¯¥ ±'ƒ ¶Y.Obûü ôã\¨Üo_´îÿ~¿½¡G)dFØäضîãÀÍÑà¹zd§Ç–í¹ enNð�œÞUìšL�¡Îžâ©}P~nî.KB ³[4&‚ò£4Åžˆ'}‰é�B�è¤1TÔ¢Y¢¥G�IY>H�MS›�?X{œašsÿZ�n‘Oã&ý«-wØCðQ:Ílß&R=ÊQ¹ÉÔŸ)ÚÐ^íXŽŽ³Û:¶sá²ëÓõu´«Ò‰�:AÜ¡v±3%V¡Ûzç.”Ò,¦¾0F÷'®Š£±êR wUž%A`9Ãñë½{”Ø=í¬¸›£3†-m Ë˽Åî¶å¦ÎJ•prêíRW9 šñˆÖËBnœšÒ*&¨7T´^Ìâiò°º<F^TaŒ{\ áŇ3 Ͷ9.•˜˜ž•qx*ºÂ úbŒ~ò‘ƨò•}0yB±Åzʨ%!À$°ò~šëgÈ ñ™pèz± vÁ$ö•uOlŸ~ûܳ7 C¾ô%˜lR̆qS¦ÒßàxŒ�½L\á�–Žcߣeä Ù‚ò®¶xÉë–€N(ræ#s3ýPM{gì‰~•bW=‹íÆk «âyy&ý Ù»$ŸÇ±ûí ¸æXZæhÕÏštðȵÅG…ÓÄ õNÕè±Q*VCÉð„M½8A�”¥ÉȤUtg+9š=ÖÑ-3.ǶEàz5¶yV"þ´ýüEY"©ÍßSêŸfç?Ò44ž¡À£dާ¥xõª�×Y…ªŠUgg39|¶é!OOŸ£õI‡”ÚíP«üÿ•.ÑÆUr"”u>‹y½Ïúš ãæ* O�‰}‹•¦ÉÏL›RÇcV…hCWzô}4—´l÷ÆÃõEâ² ÄDtß@Þnî�ðXÐÅÅ ØÇ9zQ­ò¹ú8zl߀áÆMÃÈÅxÍ[½†)¬=?ÈŸYƒ›¨lê÷5Âhqî'æµe` HM©Š(©y�à56 F³sJ"+«ngÛâë,¦w³2U¾x¤äÊÑ1Šrß?`lôü-Œ*Æ¢�Srï%@{Á…¹úmÃþ-m ¥=Ž7ƒölÁ4‹¥‡S~%ÿÇÂ?R¤¸‰Ôé~ª˜[Ë×  ‹7;w”º)U*‹Aªvz²÷þè8×õSi ¦–Ïso÷M¢<¥˜ðñÓ­ûz+…züv/n¤0Çx–(N½Ý?Iuº©ÝÃÔG‰œPRõz9üÒi7×é^ååµ JÞÃ^÷$´u}º/óÿ0‡®4ü§zî¾â?­íHáwNb6耗uÅŒáÛàI^—=^ /¸‰0–_ù©vpR.®µÍ7LJµÍíòZ°Y;<þëàýæ›r©l¾û¶5Öø×»­òzQýüë`{çÄ~>Úß݃‚E(xwrôþ \\ ¶¶¶O¶ËK+ÁÖûOïÊK…`Y\†?'ÛGx˱} =n—K«ÁÞû·ÛåÅ•`ÿÝñöÑIyi9 Wƒ·ÛïN±áw§ok[Õ¶¶ÊŪzÜÚÞÜ[ƒîŠ]´ÿqkJŠªDú+¬©‚·§'û‡_ lE•ŸnœÕ6aM ëÁamwû/õâ?œ–ƒÃí£ý÷0€õBÀ3^\Ž÷öa¤Å•€Wq±œÔ6Êë~±|ÚíÃZá)©;Ìr·s‡9ÕÊTŠOÀgáÏ:]èñ;úp�uÝqið´aÙ¶Wsí>¯8ŒþìèXõô•ÏýñÅôqÉhý ï¨P·Ë¶­<¾9®ã·iÞSG‹ðŒº�a/îæn{Md(óiæÇJôó¾í�î/ W‰ q:¯¤»çk> KË,Lln„z„ê}¬Ú“ĨS—œ�bh­û оO³@arÌóŸ÷‘¾—†�2sÞež};¢'~.þ‘.è@â¿>Íÿ’QªÞiEŸÝ3 À·`ÕzZÑB�›$õ­žÔ5‰˜˜Î²áO0�k{Á5± T®n_/C¶ ¡t÷qp%Î¥Tzñâ’ãùé  Cr´d“P6ÄIm—­Žºbʼî¥3L?(²EÿÛ|]H]9‰:¯&“KÁ�ˆÇú~¿0 $™Â1%JáöºD˜�6[ë éºD¯zÖpŸ·�{ y�a/Ê€žd“}¸a6ðÞ–Bsn1¯OÎYAÜþ¥aÝ·i`³»ñ{Š|ðIî€÷¦î€¯”xpÒŠsÍj2ãuy*ÝõuRšnÂ'%8AáaópJqÎÛlÞIö:’¬ïÌ3¿²¿³ ¬ÀÖßÓ·A+hm$ûŒÄm¨åè&ô黵R¶ÑI$Õµ­ùÜw*S~¦ò´™Ïñì´Ÿû\ä•D¯V“Ö¤>O:kÒn†ö¾±jÚÖ·Ï Àâ®@ê:øÎ¸¨é ›êO*õyâZ3hÙ.ÍCFíé/-9§ù¯Œ‰S·ÌÐl©úÂñ÷ðJ+W¦Syz˜[̃eûε›PÛ\ÖD79èâ%!”+ÊâxõzÔNzW‡‹èÕÛ À—Ï�¿T‚\ÑýG³E ßÅé]»�›•N�!QiX 7Ö>´ya-Òh`¨•K7§¢^»KI‚ütÛl vôŠ…ÂRnyd%½à7ÌtF‹±l�¨ƒ"hº�Ðí]S …ÊLÊzÃÂÐ>Ôò]&¬7.ýÙ¾Ø~%!tݵî–Ÿ`¬fG.ƒ«@Nê5‰qg—çÆ4¾âÄ‚z×9n…R|Û”uÎ.`Óâ3h¬#—ŽèÉ®PT`„ë¯X9ô�X-Éá„út;|’È”jl×a¡rýò»²�»ÏumK}öýìúœƒXÒ¯â¹Èºƒà’�²©°—Ç@¼«ÌéÆêz\]óU/罈~Q\)_&™âÒØnÄh9\ïÇk1�¸2(J)>ÝŠëµQA!òQHÆ»ÄJ|éTõŒV],•&Õ ®Ä.ÙTØ¢WVd´IIJ°X¹ ÕÛ •(u?°|A³‡×¸µQÓ]°àJsô—¯K¦/_¦ãÌ¢þÄTÿ(¨\Û¥H�`Ú†:Í›I–_ÂwWäTæ§EC3­mùDI6ÿϬtÉóº—(hˆ•a¶·(ŒlR4ÄZ?] ’ð—¡ßQ.ºz&¨ Æ`5^ù—~Ð oÑTnΚç~ÿ•ñÜ×~ùûnƒê-Vm|[n€~'ðɯôŽm<ßô¤I‘ìçþBëÀþ"@XŒA<¢ãH@Ï÷ôSâTÆŠšþ ÐÓá6­Ø^‚”züÛ›¬žtTö4-<ðÒNWæ«)^±��é‹gi<1' ŠŽÐôa´ßòÃ_hÒFýKv·´�«o.×�>X#ˆ1'~IÖ¨¬MÅKT8�T¬Tì5Uþzél \î©rÙã`jl3C)߯ýº¤Ñ¿)í¡=pÔ™�%F{®—Þn ±·H¦2åÊ¥–E냦–Ä·]e’ï*VAÚÿ…VP�²t³®ÔN O½#ôfw¡qU;ußÌ’‹õýDàuž²K&9N@(C ‘ªäQrcÙ>à6²®“Qçe2�óU8¥)UìûåùSWbDÆWìFóZ} '±Ö»²ÍóX�Mi¯®¿$›o©$™ëÖ¼NÜx8F%ŽÖ¾šÕr`àì²ê»BÛæ•=kg½óeoY N@Lp黡¥Xë9oÿ­Ù{Vä*®5¹ïcv p–M2ø×ab Aò¸âÜØ€ÜÁ‚¤N¸˜#É›E²p5.Ï~‘‰)µ°1d  ü¤ù’¼äšm ï,†÷Mæš¿£$ÌÊÁ~¸ôá ²gMøÄH_(̇“ÕZ)×´áÚG6Àõ$ç�Йä8—ð•è°Y£M‰ ñ¦{¾ô•åÿ§–hRk+FµN¯ ¿ÿ»Ô‚1 ÷½7%$]ø"�ˆ¢¹´ÉÑ-½eh†—Ùâ jØÆ´íSU/xÒ„ý‰¶Ê^™Ô‰‚.=ÉxêeÛ¤3Á!-š÷7¾¬Ää`¸{7š€ÇÐ ³~UëÕ?iÅ@O6a¥xÆÿ:µÖM`L›L yÓ:&>‘\ó˜Gðâ…Uv ðã+nF·G³`Å5¸ Ó—¹áuóâs‰�PQBíå® iDe/ªÖ�W£´*óÙ)LÝVº�(™yO¾¾„Ú�¬ÑnÖï`ž1NÂÑþ°&/1ò[@’ N'ßeEëVUŒµ)Ä+ýîœÌWq¢ê?˜îÌ\•JÃrØà¾³+ª-šÖô†S» uL3)ç#´8HÞ#Vì%›L%µOI–þ—NÓßûxb ø-6'àʉ/qm®0õ xRqàùW¾¨Çïllj!®9Ü:ŸÞß=ÿ¡Rï©í¨sX{WÓcÙÆô¤:sm=ÒSh°÷*\Çð�_%˜µ�$xj°±á²[¿‚š�·§.¦çƒxcˆ7~ÄgᨠaÁýŒÑW§_NÎ[s˜3�ZþÓ;gñmÀQ(ú_çã¿èÆ "ãpkJÆ…Ïš…÷+Z»…M<ýe¯ÆÂBú&gøÎZ9¯-Óq‡e»÷à/´uìtq\ Š=ðΩ8ˆì/Y©›ÿ�or´ÈøC¶­j^:“Èr©ÇFòÿX7œÚøá–î òÀÆ ê=c£àX.ˆÁBóö*ßôLï°[¿K_¤ÙhR¸ !Ž‹q)º-õ•b9Å׉ïÕË<|òêw¾s4nSNë +³€¢*¸UŒaQÚWåÓ” žáé.Ø�Ž|ˆ¦_òÝæÄOèE�ŠÊ�ñ±gd§Zòm¢ÍýÞ'^7+¼’=”'ãxÅãLÀ�×öÎ ´c×O? ç¯ÀJ`ðÓ/Ø’L}Ãvd?ýHÌÍ´övVU{žk gx·ãB²E>Tä7Ε`ÒgF£‘­Dhö¹Ìöóç§¡]¹…€%y6«({§Ùÿù*ýtÅÍZÏsZxÁÕá�ú5§.ØÑB-ôÎk%ýUš/?ÁÌÜïÚ^'Ë ™^²¬çÃdªÞÔÇHMzSU{P·=Uv-hOÕm= 9ʤñö äáû‹~§†Ç$›Ðˆj�BÖO)YU¡×pþC,Œ †`HŽZ¡Ó…\Ë ”Tä]®Ê+W/[ÊÌ„.ÉÙzåµ|·é^¡qè"~/ó½ÂV*Ó(9¹‡©ß3qæwƒ‡q%ò½! ýqþ¨-ÓЇàM(o&s“ãŸìÔäÁV�ÞµKT›°”)ù›¦à®w «–m4ëW¸ƒ.è¡Z3±G8!—l“©J„ÂÁÞm°�†"øO?ÂV|JÔªª¥¥à«v·SÛ{Ö>Ÿ ‰J°È‰’ı�x} ú«±¼ÈX‰£;‹S$ÂÛ_Îdè/gpñ—S¬ûe‚_7Óú9o7�sô+ñÌé$ïjg+.µ})v×)”Àcñ¹O ’µþéŠÕÕ® ÌÒ‹´¼xq5GÇ¡.@¡8¸L2:®‡Ê¥6—ôYŠÒ®±]iH¡.,�›åOÏÛ4ý’½ð'Ù3å�L·~uÅÀ;ËÏ-žåä–䮵7’@ŒŽqÉ"|‡‰8ìvFêØÞˆk·HØ6dTÎzI€H¸õ{ÎR�øO7 'n™3oôM¹ž[‡Ix×8²ŽÝ¹ðA…:˜ÌÍó†&~-Ô¡ZŠüqõ‰O]<óÔÅî©›”uía²âµªãŠ+Çÿ»;<üÙô·š——áÌAdgôâ ';·Wº4Nt}ÅÊNÿþ"_YJ"}1÷Ý)5®7UçE9�žZ^t~ºœÇêcÞ1«œbjDƒ�Œ‚˜~_Üw{�.jÁÒº7xnyÐÔ�Öõ—/+H´Ü¤äʳɬ¡[G‡×°qÚcËhÁ¾Mqõ±±r°Ž@p墴[ŒYôƒU€ßÃù;´C= Z¢nˆ±ºHWý�alÁ;UúJû,»P±´¿8¯%0žì¶8ÃR¾6m7á³8èwçè`w‘¸2Ïâ¶þrU¡h¾²~Ü÷c³Û¿¯·(òc½ÛŒ{0ÖÞuó²ÿ&~°n, ÂÈ#ºÆ“ˆ¦ÒUH·ÐÇY½Àܦð)‚½˜Þ=EBá�ŠZɦ°…BO/KǦßQ zi©÷z´ù•­Ùëð¦—û•AB]_=«¤q-3ŸÓ�ÈòlbÆôtkÊÐP¯³÷ML³<ë6ŽBP]k¢Ê\‚Z¢ñÑl'OÒöe~ª@˯´?¯'AN`bzåD‘BŸ&„ÄûfNû‹P\¬Z(ßjp”�XŽÝrÚ=šM[aÜô­¢Z‚j³7Ûšw Ëf/�×þ¦µ§ðí,Å,ú gà•OÙÛ)’ÀZr­ùÍ2G™lCMÍhñ�´É§_)çzrlYß,´:"-> ß�U�$'kC9FÜuÖíÖ:~,^¼˜Å<àžÌAóŒã]åô3Ûó¸ý¦G©´)<-Í©'NÍ$÷3¦½|.ƒ› ®Äᓾ<ª‡¥�²ês÷Duä�ê¨*D¼u1%íñ“4(¯ Öå–4iUÓ¯T£“9˜•alÚý#É@T.ùõ'ÃØoÑ¥[÷6ýñ ¿žó1š!¾2­“ñŒü›(e_¾²†&¯•×!¾¿~iš§×ò;¼Æ·7/­±ÉkùúF)÷fËC„†§X‚Ë—}ϱËäò Vxš&I¡D‘“ztÐÕ0ð ½Q•个|‰æ‡ê‡ªÉG×®ÈÃåïDOV®a�·Þ•£R/@ Íæ” Gl;ú™�^K¿ºl JL¨%üP�[UUÙüp¬ÿíˆ~@‹Ê|U&-ä!«ZÖWSÅÆÏÚüß…q§Y=�ÊOšUøäÖÓâdÌz¶ƒG©X; ƒn8ë„j^J8NZæ ÖÓ-ºÏ(Ðêk^ª@ß±ºÌIêóYPðÓK] dÐDr4ùyx¥{èMõ Îªú€Ÿ^éJä« ¢ˆi÷§‡/¬¯IÕí|#SÅ·î7jNûð΢ٙ920æÓLfòà‰0O:ïáX]jü@íF¾ÍzS]F3~ñâÇIPu™ugÝŸziM¯÷âEŒ/^ﲉE¹M¾tfßdÉ€v«5ÂÑ´é»{ñ‚>VmÐ9Qç’kQBH®¬ÇHÕÔhMf›$�'V†µþ%fZ”°gªlfÞÆ\bf‘—¿Ü~åRÝ„]ÿÛ{vyn†ÏÎòÀ™*çŒ3–V¦¢“N9ÝPÌ|ÃW3_YQKÏ5«žäâ„oÚÝ2u—î–ªËòD1ßíŸWÜy�,‰±L-“ëOá[Íì¶�³E±¶cʾãU+±å6ÓáÛ½¤€º�^H“ÛÉh=S™ Aae ¸ð­Ë‘ße~wB q$KJç4v‘&®´‘¨Vœúp‘>DOÚÀÖöÍ6Òf:Í<…¼{/�ú†b.ƒëžu9›4Ž™²�‘„_Q\…鳇!e€_¥r¶¨®—™ñÑzg�¼?±«É\ÿܲêÌÒ»NÙÔðº±�vŲ}Ò&Gª Ä%5ôÍsSß<»sS¹^”43}1g9ŠÚ[¢¼ÐДŒÔ8å';„ˆ´Ä^¥ij”¹„6†6£vibØ8¬ÚU8Õ„´ýSáŽi›L /úø³Øoû?©_Ü™&ÑÕXA€:­YLœÙ›·T6¸ÌÐJRÖÍÞ¼…N9&xJ¿–›i/p*ÅŽž�š=ÇX½áBgÃ9�µÿæÌÚÿ+3kÿÍ™ýRgsf&‰ö‰¸%¤.âÀ*Vl¨KÔuj¥Ø9š¿.„J_¦”tÆmÍV ÁÔ$NKùiÜ7§]ŸfšX& ƒx–ý¥XWÚ,¿k�¨)â�Œ,eó4xɃTžy¼(\¬ÞZ9­L™ŽWJuÍâbØ ÛÀÐ3¦¿^ðÔsïü,_Zu >eƒ ŠA‘8f­Lȼ²þ>ß‚ùDi²r“l4‹cRZQÁ›šÛ¸Ñ÷,Å‚ÖþYo7@¯ óY/Š?¢É×Z�7¡˜gÚä³V¾I$Í 3ýÆ ÿÓt¿Òl®]ÚèÒyíöĤç‚Ñ~ØëŒÑM&*°I²…IÐMðêWAS±,ówö;ò'‚þ¯-?S‚Õ–U ?o¬æÍ.mYʈÝvii/´Ø�ïqgà­£@m©ûÞWû51-}ë2 ,É[äc/@€œ ‡?Ô€„>g)lxD3(@(�Ħ¶²\l—hæµ9Ã"K›8Ngß+OqZQ–ŸWdã;f·{Á=½¦»g÷ç0_?“¾‘_–4û‹ìé Ã>+˜k°aÔ]°¿Ïlû�Žëí+`ü>i¹cú£lÄnH½�« òKw-{¶žÙ‚ÉOq«¯ ¡Ùý4•Ds÷,Ôß%ðÙÝO¯G®Ÿ»¹þùõȵ{=r7u=Ң둻Y×#WúzäÎ>L-s5rçC¼¹±î/îæ_‹Ü%ØÝO®Enç7k]‹Ü¹§zF£öµˆiGvÕ\„\·/^ÜpÖ’[Æ 7 ÷~ð¤òŸ–¿çÎ+*U¼~Áî+‰”ÃÊ&2I}³Šø>‹%ªÊéžAwæ­T‚zÍݧ‰hž®5y¹ €r¤³Žh½d”¥Pö'wîýdǯÜͼ mú’¾âÙ£gÙ Ìâ'º s=wþúšê´à·Òù0¬;V.ÇW)àñȧ«s™ºð«Wf¥à—ÓyFÉ¢ »òýjËxZH¥+ÒðèU“¾j>îÊñ†‘Þ°u³²;Ò ŽÇWv`cë[ïYòbbV˜T¬ s« ��¢ =)æÓ²y ìúBEm“¨„ŠýJqF㱃ÒbXÄhHt‹&HZ›8½3 Giú÷HÈ•DV‘€“dö.èÃs†¹ÄÓmGåe:>yL-\Û²Kš±hm;�”U� †4÷á„NûÙ&ªqãaÇ"¦wEŒ²Å ÁÔxðÄíEáåÛ©rÌÂtÅßhü~#ËÌ7ƒ·¨]ŸªljÉ]šNÌ„�†ˆ„‰ ,~�¡ÏSøÞd&øãçç±i�ÇËätQ‹>µZ¸(Ä´Ccˆ óo?âÐÍ=…AV¦Ž"ÇÄpâ €‘Þ²Œ2컞eØÒ«—é¾6'»Ëqwx“f_£Ù«~º?E‰þ•§^¨›ArW·.×vóù¦}ë5I´²Ab¨<X+w´xþœŽDk2g"Lƒ‘ä–ÝÒÄà�¥‘Û¾¹ƒÇ[†©ñA…ŽÑß…6<ËU�;ûŠ®ÏÍYÕ鲯é®Â–RÚ9Øš­Ó­l nÙt©ïgú  �ç³�ê,bV“fM�ÕݘܓL¸P¥ÐP½$ÁꘟJ° iF{ɳ@¶û/^|§HäSë�°ÕÊØÛýÊ­Ä ’ˆd…lëçPßw‡.À2NõDϲrSMNUÉö~µ‰Î“ÒÈ¥’~<ƒ¯Â—òà¹[x˜&?¦© ÖÓ(NÜ´Ò?äà£XúÝäîÃËlÇìôG\�%úž0<ý‘@\¡–½Ï•b…�*èRµ9¡ªe!þ’NS×>EÙ[&FÂ;+tÃWBs{vù¿·ßŸò­ä=ͱR¬µ¿¡£€Þ¸Ü•˜®ñUÒs Õi£�ŒÔàÙ»}Ñì?” ¹ÒrÒ� 1Œoƒp"Ê‚¡@œ; »8™ëų·^«°¡2 “¸JJ0󻞀¾?‰ÐN³¿¤J¼¶T‰dÍOí£u�µRÏ,Fló@™i<0™V=ü/Œ såªË:õKдõ\�ž_ý ,v› ÅäÆÁíϵ×F{¨€%Ð;Wy÷=œ–º�[»có“Vx=׿·r�Ã᩸²òd’&�qIÀÎËüW„7¢£]´‰I+=n¶)T%ŸæªÀߡѹÿ‡û ËýZÐ}S‘ý}1ñ=?“÷'ù»�cß8úO¶Ö$”Ñd®*ŽÒ$TÝd.µÝ´Öþ_j©â*BØL)ëtÐþ»:°ìœ²WÜÅ¿g¸ó;á¼v”YÏŠp«ï—´b#ã¿ê³êJö÷~0A�¤®ù.*ElRÙÔ ˜[„?«ùR1_* V ¿(†cp[oS¿»nµŸ= ÿ—5Meù¼æñK76aúÂÇø„…”·ÙF�/µ·S5lóg‘ëí…"œ€Ð6T�ó‰è�¿q© êž2ÆzV²Fh ËÑzäðp7ë-À ×N© �y¼Ìú˜!UÆÀÑÑxÜ|µjç-Ňïá÷ñèiÕ(ÕˆÜûzÿô2ß »ˆŠÏþüçùÿ¬¦s0ÞoEÏŸü†«/Î�«"™�CÈ ñ"ø.QœÔ-ßHéò1ÇZ — •+lê7­„' äК£ÐøH çŠß(m|Ì×» 'ÀÞ3ŸcO)gÂämÂw¼¸#‹<ôϰ}Ê¥™Œat›ÊwîÜN³z7£µ½‚3f¿yñããwUX:ÏîÂÈÊx¤†Ð¥¾„�ô-Kp aˆÆséÛ° ò~å7Ìöb-§B7?¤ž½£¡ódöôŸ¹?`'=?óc2¹³ƒåµgsp£@ L²�¸‚ º³Ö5s¸n¡j²×½¨tC໘båGø[ú÷—ÍËný6N©Ü,¡—-z©~³�¦1ñí]ÿÁËc˜öÈÍ!çåµ:õ†ç¤Ã@N×Ñí_ŧ…î¼£ã|¯꽋nó8)`’šp»ýùªŠÅjø‘•�UB^ “�6*Q¡æŸE{jà ŽX%ÕðzÃðÒà=ÿé‡ÉÉÊó¹æ¿ ýßÃÐÿ +7•ŽÝ…Jü¶³‰\-SoôxîCÓ]Ð×KÞèÜ‚x‚`4ð€º÷îX*÷ÀmĤ†{ñâ>7ì6û1l ¯Ö++H6z¿gú™ß½—ßòRáw È�¸ŸÖ@ƒ…Š«]a¾ãƒÆøkÜŠ‡¥Â§^h×G'H>…ËR©NMVg~ƒ©­$½r/|B&¨ì�¼@_#XY».0GÿUT¥Z(±nÛtjP‡é÷/î™5<æÔ–U6c ûÍÍ2øzÁä�/:)¸¿•U<‘–íÌã#Œæ?Õáícÿ¶å Ϙ^#[$Õ¸™D,¦¶è;kƒ:p‡¾d‰ÆÝ-SPÑ% ôê—õn£ÛɆ½�úÅ�ä®^’nä™D߉Zµ¹›l"wÇæ.Ój„èÎQ°{7섺Xá©Ó¦S]n�Fâ’’y�àÕe¸^PÿMá…5ÜÀ ô À4�ºÆ ü¡à§ÒÈÀÜÇ¡ü}ñ¢A¬¶Üؼ*rÔ>zÂD>,MÊý J«Ÿ>4ƒÖ~\?7r¶fÞu·”WãEºEä)hO³¸® -2Fi•Þ°‰XFëNÀ�âóËô Ba™™Õ³Lö<ô«ß™ô·üëWÓw£ñøUÅÂÞ ‹žÑ7~%êÆõ› Ú€ÜÈI¦e·Êš¡ÙÃhed刎,iªíûZx�g)k)�q0;—&»ê©va7G^Õ“ìBt…qö‡ã.Ô™¥{@£[gwç Õ)Ha “èÚWx�Ñ<»?Ϥoáøw²FE…>ï&Ëà\9&ÍLT¿§œ]I%Ô9+ V΄ ,øâŸûD¨À@«$Ê�f·|°q?NákäÀ¬ z�¹õ/f‰ 9¾÷ Ú/^X§Âµ6kp*Ážm¢ °í‹ªlf@Z’Uý$«º'¦±Ÿë G—ùî'O–átÏâó,Ö8»vÁvGLàujôk€¿»¨5‰�$kØ9Þu°ÍKè6h`„ˆ¬Þ Ì©eWx ¦—1²CQœ)‡´Ú(Ó�MƒuL�éØî‡8£“æK_¥\~€˜´˜-,e ‹ÿPbN¯�|;mÔŸ4û×÷I<"€Ýa+ýæÈFy ¾Ö!á�&±-äª#�º‘ÀPúq*ÇcéÁ—ÝúЃÝÐÔ€nëðº›?ØßÜ~w¼�1éÿá&·‰ÑO’¸ëŒíg*eûyPæ¼®–u21�ß0,ÖÂër¸OÂjCø-쩸Ñz¢WÜò�@ ˜!˜­ÚêÑöx(^vºqã=pvˆ$±Æ[Ñç�ƒØ¾oŸt;w÷” ÍSê¤â^ƒ‡ÐSëä"Õßx ÿèGNâÛaq­�'p<ܯ°ûÔìðà $âg³·ƒù“…›À?¢E?÷ùíþ-€u¬#ŒÖÍ9@èÅ}o>— êçø‰ñn›0·ÏÖo,oĽ‡ö…9a—ठ, ôÍë'}‘ä³ß>ìv®ºq¯'¥¼-Êc”Ÿ´»§Ö¡sôBV‰Ü…O;PÔ¸E@#²°Äo) #Q^›Tn(ºœ:ƒ¸v‚w,M›àºÚp¢·¨é?´cºßèæÎvÎM*W»Ô ôÏ;Æ]ïËMrFfX¦?Ø¥|]£ô{DæÊgØæ]Ro…{9€fK½á«>üàPýîøÁ‰ú ÜÍ1â_yDÝÙ�Ý=‡X:ò'ÇðK{"uÖþrê üïðÅ‹cÿIõû•#•úˆ~Ûùoäû‰ê’R?õÓGÁû`—¬°á÷€€Û÷õ–ÊÂÒN?ñYøL¥OŒVB¤^§�±S+ZçCðÇ€Öñ¬�Òη$Ó Â—œ}~ÆGoÒ³;Ä�¢ÖýÌQîÍéHåTñnâJ1ãÛ}œ!,Îa*m’$–VŸmÏÊ£Eà[™ ^áÓe½ìžÛr©Pðñý=)+0pp ­3$Ô&§ôñÙ~£ì©Æ¼ I²Î1Љ&r¼£Y•²Cø|7nPoQ{$ÉR¬hz$e ix€G{Àñõu÷Ç)vPªŽqŒÐ"9¹³tÛ;höpÂíòöåµ)àèþé!‰¡4V¥úÒê×ô‹êPç<èAÝžª&oσ!Ú©:߸í©†P·�•©âT=Ö9:9œñ÷Smð4l©7tÆ+Û2¼st9ãÌ�T¥!·}Ž?³õ0þgê—jFzª”‡)CYU�Æl®¿ŠíÏUi,+¢Jh6³ú™=&Ý{O÷>»ŸÙc’Þn4MxÂãlÎÞ#І]:}ø/ü²µ¦�á.G³±Ê¾HÙ—Ê P …\Up=bVèÅ%2ëéDÊ÷ÆXïÞš njT]hbv;@Oc“ªV‹¿ÐÎ5ÅW-l¥w�¶È¼nàŸ©–¥ìíçEÎbÐÂÙzt?$]ïNÇóKmê^áx§=ƒôRyjG(Û¾¦l{áˆ((¯�ïé¾� _û� Ì›ÊÇ öpß6žÞ³R‚íNl( í@hHÙU•%êàôm逿ÃÑevèRˆCÀ]é'âPÌ#30æ¹gç@܈DÀ;àk»Í XJÿiçlïܾÜE: GÓO¿ Þážã�^srX‹ü§·ìf¹ðFÒùÌâv'ØFŽP÷zV˜Ô{˜¸ô°�ñßå¦É�,èWúkðï¨õO¿q¦°‹„Ç8=�ÙÁºnÕÊCSIðŸ¿8•Ú^Ueº ©ò.ghœÌÑþОξÀÇc>e!—ìEN±à~ð~V•/¦Êdó>dÞã_ªõ¶H2@‡½¨â1c0™éÌAf¦ƒÊê“–óuèÜ·¼ž¿*´“@Ro$/<¿SX°p—K¥·:B¢ù6Ü3M‡¦-Hy¯�µ<ä5~(õW–Sø¾#¶Îh°Oæ>é·ˆCÂ=øR-Ð~¸ÃO¢é;P*>¯ü�¤Ø˜ª¡ Ýôë| °�¼â#Œ™&lQ&»O–y‡¢àc¥^<³=¬$ÅäïB_fÓï©ëëÞ¯ŒÆ´�è{¨¿žîD^tYu£&BZÖŒÑj¬mZûÙôÞv¶TH4Î4~Ædÿ•EoÏ^uêõ_iÍÜÿúìÝ-žµKÿÚ*ö~açKïçköÌ·NÇwJ#.ôúÝÄâÞ¯ù”¿ßKÀwø`GÁÜWÊð/$¡´ø¯ÍÙ~¾gà~—/Uà�gÝãjª¨ ™}¨ìžÊYídö‡OUš×N{F�$O�& <Ó½$·uÖŒœ%'UækTÞNl”þP$-ÿ1|¨²Øy½Á•B´ïñϧð8ÇÙdŽ?îvšh³„ïÐêkc£3‚§�üt ÕâöæÉ[Ü!ÀÛl[ >ÀoÖÎÃÃaxv;*r”x´¬¤å$/NƒÏÁQpR±”þÓ!s…Ÿ0îw·9:éÖÛ½ËN÷6ýÑ÷'Ÿr#èmTù”{€¿ø~�2@†¦~>dÂÓ?GYS×ü|ÈJ$Ôx)þ°†‡gEø1SÁˆ Vá‡ÿôYÈ~¿Þ.¥?æ¢àc®îÿ±]9âò‹¸ÙJ§ÓŸÿcq¥àgK¥Ü²Ÿ_Z¦¶�^ý§£L¸6^7[qú(›E™f¼Ï¶j”mãÄœ„…ÊÉËCæCÀ k}vr†!ìí) èä\ Á‡S˜°¹M–Ø¿§°6V^ 6†™pøÂ]:#äýp‰Fç&�æ1r¢h Ù¼wRS ð‘åOÍFYWf%ÒЩmiy'C•ßà=ݪ|ÈYú fuß3Ïx¼@ µO&•™¼õ+¤‘R7X ê+½ µêj*`À¤Ç2j,WÿDóãƒÌoÿ’¤Å\òd“Àè¸LËïÒ¿Þ– Æ>ñmæôØ:fšg“¥(Ã¥Oü§=¨Y9AË)óΞ×}l˜rDþ"§Õ×¼öX ªj`ÞCŸ¼gÞ2],üéq|”q|L¡nr¬­x´¶ê°Qxϯœ†ø t}Š{D¶0 ˆœ 8¿-Ý�3Òð¸bÍŒe µ¿Ál°6Õ…Ã]¶a+ó969�ð"¬k O_ë¦NÒjIÅ< ?VÊÂÆô†ñ<Ý… ©É^ Ò’C !B"9b¥PŽ•w”�êx%Þƒò!g©/ÍZ‹˜u¢þŠ=n5¦Äjsñ{'('@¹Å»Ñ�•2?8±™##SY5ÞÓ½õ Îcj™qL±»ÎoÓælØ|ñÂ>?ãqzJ$~ñÂà2_ݼw9¢�ª@sD§Z*:zyú³ùžþt¾ÇámúˆïGõc nw9¼«ñŸNº¿“óèâ<�C|ßeW–Dã6OxdÔü 3Üú±¦L™#þ±µ0gÙ£ìÔ,Ë�ýhªL&¼¯§¾£®$ˆ¬W# :ü©Æú ˆ›*8¯Ü°~ìÈpœŸ¸“�°Ð;écx »œØc€ÒðŽçch6#‘¦YМÕ=~h=”µ7ĉoóã§Á‰¸ÀÑ'€3uô>ZKYÐ�¼úu:V�§ã´V>%¡µò1ÂÈkëó ¯iQ‘ðuÖzå,êkâEÍ®60LÇᎾwQ­IÑóÍ -ºî=x§•¯C„"’9QG0°IöCGñEŸT¯™úd_³§Ü.0m�¬µ©¦Ì«pO"ˆš²—R–Ù·J¿`MŠ"jŠ^rQÆ:é}÷n¸¯ïðwÔQ¿[~°¼®ÈÝßì(º€»á.Ûìc°‹Ék8k kìL±ƒW°VÖXQY`Pá»#¾yÖM•nÅ=‘ÞÞìì9ŸîåÐÂ‹Ä ¥Äymf}K Û7jæ¶PùÚ@Ø¢Ý5‡Õy�qÎE°'„ ‡ñ–œÁwÇc­B«¶ÔmÇϾy +¹7ïTÐiú6óæÕþ/|ýj_¾å×ü99Ô¿†¯¬2¯v¤–ò'æ:øB×zùZêГZ-K×]Çç«¥B…©ì¾w³ÅÊN&c®1ÃåûOýw5߇…AjûŸÔš¯¬,áßâêr‘ž‹KôŒÿ•JÅÅÿV\.-–VV ¥Å•ÿV(.–Šÿ-UøO�óß=úe¤Rÿ-ºo¶@|¦^ÜýÏZ ÿÂÿr¸÷AŠþ”äïbêé)ø/2{E—‘Ùæ- çrê¾ÛJÿUþŠrwí«ßý ÕcGÔˆöÿÁ�YòUÁ¢"—\vÚý,‘ÃTqñnd^Öo›­‡rê÷ƒû‹f£žÚíÖáÛ߃ݸêÁ^ÜÄýæE=¨uÑ¡«Wo÷²°ÍËÊ?&ÿø�[ÆkwRÀN&ÿpæc½_ç×ô¾ŒºÔ·âT�(q\ô³ò[FoœVì6Ðjª^Ðn¸œ"}팯²1ÈÕk}[ fÅ8µ¸¢–»Í’ùx9EØÒO]†£{'_ëä¼R¥‚³Cé%ê´s©ÇسÇhUëÆw1¬@»#¿¦*h‹B�üú¢ÓêtË©–Ö–6—·¸ #�e{×õfƆq¦Šò¿îUTO—–—ƒ”ù§�[÷­ÏñEG|[dqðH¸˜‰õ™Z6k‰,Yk[¦lŽ??&×Ï/ÿÉŽÜ%¸¼¼ü•ù`ÎôÿÅ\áù™»`ª¸=ÕgÆ_ÿß7þÉ?þ«Qáÿ_þGô_|‚ÿju®:¹ÞàêßÜÇóô¿¸²´RJÐ()ü_ôÿÇ/«£ÛVJ‚ꆜE/·/:ˆüBï¾™]óª¯þÇ?^.d³)¤É€Zð”×�(Ní·Z°~T”*.å 98Î ×§¶GM2uغ¿Êî·S9*ü(‘{S+¹B!µ�ë�ZZ\\YôS©l–úØz¿yòåp;0˜:<Ý8ØßLyÙ|þÓâf>¿u²EÍsÅ|~û�—òÄb8憋¹N÷*ÌÃÝuó¢—‡Šy¬塱b1×è7<ì›¶¦[ôRÍFèmG0µ¿àV£Ý g4]PŦ¤Jy„äfVÅâúúzžÞBÕÐ¼ç¥øïÿøÇgf)ôJëk¹µåu|)‘¼õÅÜÒR KÍx¸ÑÁ�‘BsÍ¿ÆÝ!6Â`ãÐCõÜŒªØ ¶Ü»«_Ä¡w‡š›î ¦e¸‚þûË;�ŠR—ÍV+ôþY(,m®l{)4ö»‰§ ²2ðBnÙKAŸo—–sk¥Õ`¹˜[Z¹(¥Üêb1 o +Ár®´¾ž-æ–‹kÁjnµP„¾þûg— ‹Yø·¸,AõÅìR®T,+ðÑVZ]_ èßìbn}q)X„׋Ùø ”– |½º• ‹«Ùå\q ?X^^É®åŠÅuþÍ]–¨…TZY¢ÑשÒZ–*IK8²ÅeÇJqK–KÜ]VºãÑà¿Ë0¦üom}™‡�¥a›ù•ðûB‰'UÖWå'­ÃE^¯®\§eÕâêR ß¯®^`Enªˆ½,Š�ék•úâ±Ð¿®Ò"Œ /ÐÃ./pjk4¨b€‹´$;¢ç_\»ÀõY ®OÀ›§×°ÈÓ¢fš[€+´ðÞé �®x ¼u8�µ—h%0;»º ð²X‚™Àé‡ýèYZË­ÀNÚ°ôˆ½¦Þ.†tÁŠW—`ÿ——dÝa@+¸MÅlPwq�–{whyׄ·u}7g±ˆ{C‡ÖÖÖ—á÷|º5 ”®•TV×°xm —¹¸º]Vù'BM©´`…ð±붸^¢÷�¼§6lfq ×smm™; œÎ`TŽ oÖÆ¼*#xä4¹@MfM;¾$¿yðüKË8”\öâ"n.}a±D]A+°ÓÔ nÔÂÍò¶%=-–`KØÌšƒ™ãN¯Ó®¯¬ð¨/ÔÌÖ`H¸:¾p<™=ü ¡¢óº3X‚iËB• µÆÜÊâ‚ã:ü¶6ã—'¹¸^ piVdQô¦òÄ6P kËÁòrn`PÀæ¶¶X0ôèåÿ—14´²²†�—Öð(ã\ðÔ×"ÖÖàw±ˆã/•–eÑ 9 š,®à»œÏêò*ü.­,ã1_à|³’U§¬´¸.Ps^F´·Bh¡XDœ²¾Šøqæ"XÜ™"Ë2ÐS:«=˜ö:¡8¥Ë¹Õ•UD Këêø¬.â7Ë%<E@Í…eú5…TºlPÀâã¦eÜÑEí±ÂJ« ,­k,€àÈøÖN?Ñ{<û9‚Hü)8iÉZ ¡f}1@‰GPÞ¯2þËšv–ðà¬,kZbúÂÅ^- o¯ rZÏêqê2´�Ц%p ”.a[aþÄ9K¸©+«E¨´ZÂ̓�{ˆª�–|®¯AKëëKðoiuqPB ^¹æ}úÈàó˜z» á>WZF„Šf�¼´”5Gû¼¥0ÁÊ v¶Œó__^ç�s.­ó©A4·H”v[\)­ÉÉz†Ç‹ÖK ÊŒMù·"Ÿ%@I„çW Ï-òx ¢ÃÍÖˆ®„;¹FƒYÆÝ‡s@#ZAl˜ \Æã¼¾¾ÊÆ]X[_RÓ›�è–× ¢[[²Ýò¢FtüÆ…h®°fÐ\aUÐuh¬‘@u‹%:VK-¢¤Å5!j°J„t�jÃGË%€Èõåþ�xn•ñÜb!‘•ZEX ‹Vã-r˸ƒkÒ—Fv´kKD]¡I„"o½±›kpž�Y4· ãQ°hÖ†¤¢dÝÃh�,/^0UDfŠˆð àë%^yEÉð¬1!†q¯©gDE¨ëB8Æ,É‚�*Ài^’}ÆJ¥U¢Ë£Háµúiø’²sË„W™ƒÃß\¸ß lfUHôRÄ&W—餗„x^0Æuà@[T@ðÕÛP[HßCmضl Va�^øº(Eèk�094¹„*°ZØæzÀ؆0rP«+ò$”õµµA©„ªVtiI .Ö"¢ÂÌkˆ½.W‘9()z²Šœ0‘ \‚uÀpEþ}‘Åã)^E>Lö`=GXUo!t:�ȵ‚P†€[ 7t•Y¨¢‹X‚PÊ,*³þ„H.hß–…Ïb|EçK~ZQÐLRiOÁÒê*Ÿ5æ×ho±™u”ðT,ÏĵD\155`Ø'’€l£]椘EÒ¾¢qæÚ²ˆÌU•Ú�îqOV KB¨c^EZW–å«MÀ€ŽÖñȯ#+_\¤q| üy±´‚)X†5+®_èóZ, o¾²L€FÌÜ †CÀÅÇ�à9ç€øé¼-‘ܶBè§�Z…UE˜_¡ã]BÐ.À8àÃÕuu8P”ÁÃ�sZÃ]Xa‰‘Ðÿb‰È�ÄÊ"Bóz‰8Ž5 b£–\—q‚$LÀ µ¸º&¿¡¹%áäXÀÅš«ˆºW‰uú&t§Dü,ôžîU".ëH›�éZᇋEf±. œ#`iµ 1‚ãŒV„ ‚/WlW––?òŠÿ[ðüʶ‹ûº´ S$P†8—¶„ä“Eo%BDKTqy‰Ñ"aŽuýõ5’XÖVŠŒViËWµ8U"¸¸¸Æ¢�é` `–™S‘ß 5ÑIÂC_X•-_&!“1o–É8…ºU&ÎHZé –×dL4ÀÁ¬%Ò+0B:ª& ¨QË¢ ˆ‘5béŵEÅÐ�ðJ|<ž§BÈ"àÄUl‰á' 0P*, *ZYñ±ÿ2ÄþË‹rV.ÐH�.ÐY�ºk%ü½^,ëMCæöÆÞà P¬¢ ¯EnœÔ6¸.+«"Æñ”Ãú­õ¢¡pÉ� \@�AL´B{QTªŸŸmj‹¶ŠØ$%¾“x"r=6"ô)kú)ˆ6ƒ�Û*ªÎòó~YÅ.¯(.R:B‚/ßEÁ¸×j˜B 7qÈ‹«@ ½k€-wq€‰/®¬ç–qñKëëÄ’¬2¦gÑu•Щ€­@Q�ñŽ�¹ýÕR‘pÿ*ÿ©Hh€Çq�ÎTae‰Pþ.R+‹ŒqÅ—ˆj,h/¼,‹À˜,÷hpypÿÐ(Ö`ÍA\'^œÉ(" ÜëEÒíÁY}Ñh­R!�Þòú¢–Ãu²�ÄsÜLj°‹R‘k‘D=Jt4—èla…“‡üJi™'×¥u<ƒ%Ôÿ`ç×YX‹Å¥¥�+¸© Ñ£ ÁC—k¢ÆB¾µ„0²J;V"&`y•(ˆý¨ˆC^ª„üT$>“çIŸÖó#d¾¶®xh¨„ ­­ò|YÄC΂1â ö$Ì®3Ljè`�y¢àéð8,-ÊòÀhVdÖE»…‹¸NB!�²>°ÀÅ ©CÚ »ycÙC~F…¹4ç …ÃåUBf¡¸J+Úc�Ž�/*)JÌã3½]ׇ–õªë…uþ4+G‡€�Ì%L“xd H¼ãß í/Šì¹(òÞ’ŒÈ ÐÒª°÷t¦�0ZÄe4À!}ÂUöRiÍE`ˆÝÝZ£Æ–Hc¼N¿"˜„ u\fü´"¼.=!gщ¿ÄZªY3ŒA£2â9U,/!A–…—åEf”˜Ê1 £G˜YÊW–IÔ%Í�Ñ ’Ä¥E]©VRÂþ⺈Ÿ<5%¢¢|³(ì:¬“ˆ²ôûb‘ÖéÒQ[¤¹k¹’è<…º-,i@BDÀ¼KÌÄÃ\ ü-iÉ¥j¥Ö[&Íå: ñkFW ­#!¥ü½íOF\+QpÁ§¤u!Ž”dvè�Ô](R £k©À„‡$BÔ¹�¼ƒ‡p}‘IN@àI$¡TD‚5[¢ ±°žÃ§5<3�‹ϾÌãËLdKˆtu )òkË€¢Pø·Gd©$ pþ2âTõ@VE”9Ö¯K° @ =!9C^‚ë+òÿÅíPÍåkün„ÔeX¸1ž½ÿL¨4yÿ’ùÿuÿÿ¿ã¿ÿ8ÜÚÁƒñ?þãÿýÿùþ¿þÇ?Š©Bª}ÿ/_æßÆý:Z*§JPv”¿yÈ�œ›qÞnÁÿÞ¿;[Áwçù÷Ç3µJ�6v»�û»ÞÙù«WðÕnO*ÁÓaý*¦ÚÌoBûu¯^ý�¸ÝÀ~K¦ÿ2?N-.—óÇ÷ÆoË~{À_ªÑ½zÌj\¿…ZÝÕ/nâ~*Н0óÿ÷ÿþÿàÛýOËo oï6ãëæÞc7>~|wrñxs±Þðª¯þñrTÝÞÝBkêb?ôêhÜP†ßXœ÷RT¥zlõðùíaj³Ó�SÀ5æJÙ‹ÂÊb ðàÍ D©ÈmùÂj~ùZ¹°\^*¦ä?ïF½ì6.ËG[;Ò!<͵#(”òÀ{A�lï¡Ý¯�²íÞ?¹ÕÎV̱¦)°�žpÏÊœ,¬´¼B㲊žûH}­–ÌGRôÜWrª^nïšï¦ŽÚôwdºù*¿þ=¿T«}8¾ùúú誶Q»Ú®×6ökµ­üê‡Zït÷zÐØ]¬ï®÷·ÞÞ¿­Õ–>Ü´ÞÕ2…ý·QƒúøßvíÅ?GµJí~ ÿ}¨mä3Kµ­›�›¨ôºUÛ=á.óQm^^}ØÞ¨�no\�îl\Ýìn|øòzsxµ»quu°Uë¼ÙvÞPƒ[µ·[µ!þïÃVmép»¶ö~kãíÉÎÆ‡“íÑ0Úõ.öFk—úÃí½�áÅ»­Zá ôðe÷úôhç¨Cï¨A§òßü_~ &úá ¦¼]« ·�xʵý£Ú‡·G0µíZ�f¿WÃÙ}Ø®™ÿ>ìÔ†û»°,{›µ˜¼»ÚßJÖ“5¬mÂla].ö7?tàõ&t°U»ú° e°"ÐPû-lÖÛ#Xÿ�ý£ýч�Û»Û¥íæÅ—íÓ·w»×£O£Íà jð´¿wývôµ¹¶yôp5Øn}x<:¹ùñæáËâáæ»Ó훕÷�ï®§_÷N¶ ÷ûû¯;o_o^_}½~ K÷ã¸ð±ÿîã›�îÃRþp›,¾?)|ýüi§UÿT5>·Ö?}-]ßÕoû½èÓòàËâQ±Ñn,ÅŸïV/÷Š™ËÅ÷Û×_ê{ÍýÛ7Í¥‡wß;™Í›åã�­»øËíWjðGÔ~]ŠÛËo¾ß½ùt{·Ò¼ûñã¾×­¯ :G°¾0ýý­�.¾lo@D¸f×Û[›ÛÇoO·wN�Þ]ï_}]}Ý~ ;ÑÞpçíÞÑÒñ»Í��¯›ƒíÇ×[G[W×õãÓ‡OÍ/«›‹‡Çïâ×ÛW£ÆéÍðЦüúû×�Ýf㦱sº¸öãýãðáêŽ,d¯_ßôßžœ.µ_>}¼‹>ïãÏÅ£Ö×ÛF§þé®íï£ÒϦO f¶Z¯?}j-7¿ÞÞÝ_´¿®\ÞüxsW¯·¼¹ýñcå¡ßý‘äëh[Ûb[kµõÓ¥«;Ÿ¿ØÿPƒ‰²gÿ¹[|÷¸Q/ú�ï÷—ö·ëÇŸŽî›�«å·£Ì‡ÝíMžòv!srø¸�?õ?Ý_Çõ.5x×ÍŸ¬‹WýÕ̧ëÛ«ÖEáä6ÿ±ðõû‡VTìžDoOë>^4š«[Çõ•Ï;ÃÇÅ�ËãL½¿xÐûØhv­¨ÁD™õÏåû½åLý.Sßé.¯õ—íâîbáþÓûýú‡þUááîàÍÑÑðòøÝnkù¦y½¸Tà5Ü{×¾Û_zÜŠ»+÷íb¡×yغ¾¿oÆ�íÁAiëáîËâàvãz#}z{Zúq¿¾³y|°½{ûõG­vºÿúðúvp³1Ú>Z]¬SƒÃ×K¾^¬,Æ»™‹ËÌEëÝçÁ»Ñq~¿x³»u¸rúný`÷ë×»O¯k§Ãacãtýý‡×‡Wo×âfmçÿêÑëw_†W۽à 5xq÷îóæç¥›Á~íäã—ÛÛ~÷}ûC~góS³”/¶>®ÄïK�{×ÅÓ~¾¸‘oodƒ›ûõfs­Pê~Þ¹ÿÿ±÷eMo"KÚ¥#&bnˆþX‹å�G°Š$�Ý!‰UˆM‚_ÿ•^ÙsºÝvŸ>îÓ1Ç'|a;LIUå“™OY"¾i A–£hà]àÆÉd}qçÃ…‰ò1"ÎTY²}´ø…é‘°e¬ KH¢=\¦(3ȱԶG-ŒN§’ñš 5’\96Bso_cs´6ײV.u°Å]ƒCÍÓªí£›ß±”.tÃ"˹'ùæè¢™DŽ›:� °[0‡�ú¿Æô.0À�uduZ´¹j„¦=âånÇ ~#ómu®¤æAŸXÌ]èKkÉmãú�§6 û2£5_¿ Ì éÜ#.oI„bF§7²rñÈÙ³f¼ZOñAß ¬ãÁuÞ_«äNì*i±¯=¿¤ÅÍ£G€³-½ÓÞ²AGãÇ ÂRž•6^ÄÙÒ,ÌïËâûik†¦-ºÖYspÔ"ÙÙì–Ê…ƒ[L†*Ë$Szy ^ñ�ÅvB•ȬÅþÖ3MI㱤�­žçDÑ.¬^ë&aÌχ‡ÆßÒ³Ó=eÍ Gµ•œ®à‚q*©Êá+ê�d9ÝfºívÏ©·×  ®�²Õ´f»jaàzc80ÄáÈ–Åž–}xË}ä—ê�¸Ô’¹ µs÷Š)¦-É<Œ£–µ½Õ…p(1¾'M:Æû,AÍ8;Îr¥eüŽßLÄĉæì¶çË9³wûC˜È�ÿð)�³ð#·yXW´`‡ÖJ„ì03všWÁ dœ>ë�Æ ‡™øÝþ4F{ëéŠ ‹zª°8ôJÙ¥},´Ž 6½”rGBÎ`ïñ.¡ý[¥µ£Y‹%Vj]àSq›™}pkõm5÷{ËûŠZ!a¾Zè¡—’ÜbS{¨7� š× Ó+³fcpqªk÷„ :¾.fjª°£e‘sGcæFË›ÙQ�#ÑiwTbºŽ;zñÅò¦ûÁU�zy›A¨ q+�v·œ™¶lû¨‘‹£ôÈ­è�/Ž.}œ'͵ÕœÌÓ{ƒ”Ó¢•¯£¾ZˆÏ£u»æ¥”€=Ví¨_£ÇVez¸åI)E�w$÷Ë`*„1=Ü’7 ¹„ nñ‚Uo �ÔÇàJXñÛ« Êv³«‚èE–LP±SÜé a B=Q|ÔEãc´•CÛåˆkn"Y¥zÓŽ¹¯9f� ¬{+Òvh�“7½WâBõƒ.õø+Ð \r �GÙYVÍåÛã…p×MtziO£zñõ¸C=IwݶuýY'ë�OœzËê�“‚8ڞɑN^qyß¼?×�ù\F›È-+ñµ¹Y½tƒZ%K§§f6'†S½>óÊe ”þtQÿ\ˆŽhèa9åvgì-þèotlYMWÝ.+ å¥b»`1B§±‘Ê*6*ÊRE]ëP*·"9°gpf¬Kh "d#õШ�_i…ÕÖä˜Åý¬q{ʪ¼íFW:à±ÝLùèB¸„í¥æ¬35…°Ô÷%$�ƒ6Ýk ™«)õcñŠ) ÃO÷jψG�’9-ÙG#ÝõÓ B�‚bç…\O=ç,_·{ÆÝ1-ÝÝêÇÉÛé#h7»úêè»Àc�)I“îQ‰[8»Z°Î›6Æ£øc€6›ƒ2žšÍñan”ú ’…%ñ[ ds“å®8¤®•³f›­u´b,·ºF—NÎíÙýûÒíÙí£­^¹ž¦zUš©Àéã×|ï&H•jºS;7Ä4è™ ~ |P“r¶Ýe»£ó8ðp01iJ²éC¦p ­lšW �¯ÂõŠ,†èå PÀ�} ÛX €\rÇÂižâ�lB–úýÝ,Èà[éÝ®Û.=NãU½9�òî�³ê»À­m²S�˜tÆ®tmwD*«4Z¼\žúí´ókßÚ4ê$�¶¨6Y•ÛìH›ÛÌ�ßZaÚßäaÝt:·}˜z 𽪵åIÜ9Þ­ÙýH0œ—?õ11™GLWèÕAmx÷Å€Ví�¡#4GÞTr8„÷ XŒa¯ µŽ}V‘6šSCÿç€À­‡ž„9ΚGÝf¿õØÇM­E ;¡.=HGW¤Zè“‘+Æì4R‡ñâå¾B+Ã7<œ¹Ë~0+>ûä´2^›<Ô)ßÎÕ¼�§,@ ¢¡M¾è¸ýyw,&ÔˆŠ¡Ç]–·€¾BŸÊ¾2ú"q»-C!ˆ-Äk2Þš ­�»Óãî…å^Glrv\¾Â(«¶ÛÖÁ¹<2½ùva3;¡f=ƒ”­é]—Xy7ª§+·R#L$³}…)yaÜpO0Ä8š»±¶g~qß µ“ðO€O^�‹�X¿‚Ýãqô\þLmc"z6jàê- û²Q¬ìmƒu(‘ï‹*y¼L/àÙ 5B¯J®Ù¬äõé:¨ÌìÞ˹ãBHkíK7Öv_’1¶ülÄÙá|3œ¸ó`árT5g†ØŸ…cæ¿ ¤t­°�¼¡Àb⩹Ë!ÒµØT®Ë`«u¹Ûv d"ì+”ÞÜ1Œz9ÁtÖGom…./[fˆ9hèy�„¬Ëûó`æ~ß`¸CLU[fÑn8ûçe1ÔÀ(la|:œ9`ql—ûUzY "oQl(38б¾¢€²¤O†ÞÀ<úžÏ"#m7ì6ó�ñD}ÎqÞY×4}Ü9lS´,_”ø±Eå¦Z«ßsÞ. ]!ì|Sm� cn$´5Z´¶meŽ7”mABLgäŒpX ™SIº�﹈ã £l¤Íˆ&ÙG· “ TÃd"y®à?»(ÒjsYKÙöÓz\yÞAdñ¹W¢kŒZèÒ]¼Q—ò] €o°?¢%»™øYåù°Í¹ãtc:ç­ˆêtJÍÛè%¥%óœáh­#>‚ í¡=Çp~(SŠœ©÷‡ŽV;Üvåª%6ÒÍ" �m�qè—ÊfšŽë¸¼” ŠÌ*\w#Ú ¡Ü;ÂMí’eô+УÒvPPD9âŸ×&ÕÑ|‹öCÜ\›QÚÄپ皈î®O:§7Y„ޥƮ֌Îi�iè{²…cää]à”áÒa–ØŒZ=¸.×݃ìâKü˜tC-éqzÀèÏn¯[Ôo”+œÏˆ0Þä+Ì�j67AÌH8:¯Lª!�¾’ou{'-âpGl1܃ϔö±ºÜ-]ËFß êÁbÏkœb»MJˆ×«~,bž?UU«„ËìO¨ò²e§Œ´{6o؈”–‘OZh�>%ßfLI{½cÀ6&N’hHÔÙ3r–Û–f‹¶Uj(íéC�©˜J¾ Û8‚éÚ.a?s¶çt~0æB¦¤»Ó0zx°‹4›�µØÂÆ×7ü´Ëm²)Wj3!\7)¯'79ÅLÊ� å¶ä¸Ì{9ØÈ ë·R…‹i[>¶÷²¨WTÕ1ÂwݽGE¨�8'¢g{讜ĖAx3=_Ò8„°1öÉ9JNì_kHŽ$ÃGN¾Wµ\'‚’-‹pm1µ§úC~ò0·b)l¡ '0°Iw‡YZw‹ëßwé�ðîËIõÜî±²áê²ò<û)¨FIÆ�Rؤ‹(šRÕϼ—õ` B�µ®*Ì\/KiN¤�nÝ„Åo>\ÍH¨UC”mâ €„ÓVÚNé6�"Å3®á‘�AîÑY�P3Êô«u[€ ÚõüÚáDd óÃÌrýv£¤¾à­ñ)µŒËÑØÖÖ …Ç€»ƒuÍCNwb)zKkˆiN=‡ÕéS×&Áž®]�±w:5õŽtk=ZÔ‚õeÌ$æ¶ŒxÇÕÓC íK},Å=%QºsyÈ»‰lzÀuv¼üµ;¹§âÐ1“¾ˆ9¤Ñ$:øÁÔ÷púc£"Þâdf…K¢PGç³Ä}'ö¤!&g¦‰÷ÅH&§pïu¹4%j.W/€üP5îôvËí[ ßLŽ�ÝU›6‘]žÔmtk<<à<ÎìeÑ–¥}ÀÚYØá›Ç±àä¥eµlìÛ¸{4—EjbÓC6¦‹+ …Zž¹°h¼Ÿýº«¶=Ë4'«Ý¢Û<£Â8ç(7¹ FÞæëñ›‘T_YöJ_zº.iQÌÆ8¢âL¼EÅ-nß³Ñ8©úÑÚ'÷AM7ÐÝø u”0´¬¸d„ž³@—©ÊÄÍ}‚ýø>½Vã¬ý™  Fµ {/¯l==WîžÖjmåæÙN‡ÜÌ+z™´« û%«?@ôPÙ™Û8Ž5>¤Óù5Âj°Ç‘�ê‰ê­¢²+þhéHj8ÕZö¦ÏƦõãñF )dã|Ûz.<ß6œ…`¸ 'ÀgN„ô¸úÊFcUsÂëhRÑ€î÷tæÐ�Àìzœ#ä8Z— 80+=Ñi#®&LL ï²uŠj\Y{Âã 6 !ñðôJI¯ IqK9HQh¬ £Áb�5¨A¼ëN Rî×�gnc¢«·R½µ÷ “Z QÔpyã|mÞ'LWxí´g3Ø+ÙGœv’3šDÃsG©¯˜Ö@jë*±dElõÜJ,bóšHÐàÚŸqã9–Q ¢±›×®^š°K]ºâKL¶­t)NG ¥´€ª7U´tH?t ”4‰°I? ­>²(ÛÎhÐŒ J.@_Ön5: Ì™ $tã3 ÒZ�Æ·�ÍD�ŸÜrd�a-:6=ºäõÓ-1¤—ÞòÀM¸…Å‘¸Ë�œ ³{m¦�úÔ¾yk�0nAm%^]ðþÎã<õ®48olæµñ1™…’š[œyÅÝõÔÓt ºY‘HÂdéò.ÐÓ®(Ð4â¸"ý–�–��‚E]+©ú&ìçÚd‘yÁØŽÞ709éi[�:K¨ëHb’ž½,'V ^[U�Zah–0ŠÆ´8¥Ü‘(f‡`�ÒŽr¬ t¨s¹‘/�4Q™IyW6ÅL‡”÷ø�=üø5BW=í'šŒQ»ï•›œûêHkÁf›ÌE ˆš@fg$½õܬ׻ª]÷éÙ‡äàbÇë„k¥@ž��¯2ýeuÜ$µF—}Äxdž]PcË.­´®.Òå–ïšÃŸÂ�Qš'6e4OÛ…ˆ=[Pó ñ$¡ŒÕúõµÈ {‡:È=¿ù�š|'�ªëŒÄVö¸Ê2Œ€ttöhUš;çÄ ö½¸¿Á°Ú)¤6°ÕkËôØ’elo¸b_Ú(VuùP³æ�Õ•wSðxÇ$ZG¢x“sZ&+| j7!’.Z¡ ™Çk¾¼¦ |vÊ‚Þ"²Kœ+ÑÖÚ…�$å5L‹uÚ¡µ Êuñª“ž´jQòyßÛ“<âä‚_73Ñâ~Ћ"z~%�ÛÛªm vêvó¨¥Ó­Rõ{kèƒrqÕÍö¶/U‹:. ;sÒCZxTÂ^I²¡¹m¨3\Y“`ÕÉÉI_Ì¡˜«¥\H °×,8ç˜Ú핊9H¾!²�Ðí7‡«í©5�=Cm‘jßN‡±gè�.0ÜJ�‹ž^[UJÇ�˜.“­ºö©9•&A†¹á †µ!°lôÄ`^Ê£rµ¿uÝ’$^¬U&D¦H´E‘ƒûíµ‰yÃÞÂIi6%$€ø% &¾Ì�¾B“d† nü9IhUÉõ ­çE;œ"öODréƒô`®{wŸõZð.°ê˜d¸µMm6£^.½óòc@@¢Q4S^ûH˜M¡0¥fÕ$ígSÞœ�Åãæ�KìVLF‘p‡ËûÚv†D”p n=”¥˜¼ØÞ±�¦ìmAZ¤œ½ ŽH²¤Œ— SÅ-�ÑÚ¹Ül¾„ì}ÒÌûÚÙ¡ö«,Áá[)Ðf¸c§]ªc¡OqvÃË¡7ŒÎµä D¸Ž�ýÒ7 �5Q»Šçs.à�vœÌÉëcóðÂ!¤ËràuHøò}4Rãb'U20]+,‹Ï4)u†þ¤F·jš2o6‚9´Òµw*G“�Nï“�ˆƒQO¯˜¢3‡%Ópµ1a-ý´(WfŸn°~?Z¹Ç x9¥N%Þ¸^£EÖŽÛW\�]©� çdìùÝX�“;‡×&F^Cfj{dݽV'jî† ®)ºÜNì˜#Ýip‘¼ÖX- B¡ŠÚ¤yõž1tû‘PQxóKàºñç�íK´¹ü¬ìfdRdç`¯à§iäeÇ[å-¾-íC¸«®Uû†X›‡lÕÇÃÑëy«K#}½°Þf�¥*P*$NÅê5žN‰=E˜f” 9CŠ·:aÕIÐ"u£¨h œ‘ óÞÒQ_˽D_¯ƒ=äÑG„§Ï}ƒúöL¿d´+Q­�ÿoa‡\õ!×6�Ñ«gëIíÃ…!SOxq‚†ð`÷Òqzåz³§ Õt:4¿-½Xgt­`Ëâ1HŒ`°Ò3't¼¦náy1yÉvJÊ«âòº�_8Fµ*7€OtRÇ¥…l¥µ5˜ˆ¯Ö|í¯/”% (±ýŸÿù[ùØ«6ì7qÿ@)å—Kîþ™•–õû•‘MóŪÊaÜeùïß9¼× *ôƒÝÿãË‚äyüGÉsÖŽÿñy©¦e½iã\“>LS‘¾Œæh �f©œù™"¨ÓÏlÆ¥?3 Ò,I)‚|•þúÞßÈýôÕ{Ø/ü¿ŠVXFÁq†ÂcÇyB§€ P#èObqëoÄ:?lþ‹>ïæ�L“K‹ð’ÀÓ2!±,#ʼ(À'~’ý…ûóŒç·VÞòóý{ºþzÍßÞ눿ØþÛ©g}1g©Ò_›?XÀùßïÀx+þ¶žÏ5+žkÆü½5ûÍ­_’œ~APrú¥•ú›äë7+ä«÷é1ýWuòÅöϼÁ¯•ò[�©Å0^ûå Ź^vûçç¾[ì[üþ›Ú’k;gý˜¥Ïáÿâú×o„ω›áCþÄÔgåí?�ןþ³ÿkj«özoÿó<þ×'±ïúc¾ôŸ2³!žÿ�Y}ðõkXr8Æq")Ð.R€b?Éþà%ÿ~ÉÚÏ??Ïö3Ϻoœ{#po$öIÔ{¯¯ ®ùx�ûŒ?Cx~­üK]¿.2¹Äí9K¿Ôã“„øü•æ¿ééúUM~ì‡þލOƒþÚ`þB”üûâÿßwfÚ²é3ËfD\PpJÂÀÉ,ù­– ~ÆigÞ0ü�À~Ƙ÷?,ûÿƲÿ£%‚ˆ³¼C€À3ìŸC çãì޽áàJ~ú7ñÿs›~Ì}Š_¨úÍ¿Ûé{ö¤Âg6B¬L Áˆ¬Há·ÛA<9A¿QÔùé‡�|¿6‚±0i�€c„$I8Îâà Å`¢,°¬Äý a}œ~øÛó‡ØÈùnmäs®Å&)ŠÈ ‹‰ùv!1ŸÀŸqäù[C?lä‡�|¿6ÂþÅ6Âü0�Ÿ~Èwl Üg‚q¬€Á‹Or‚¬|«�@r“òDðÛ:¯Æïx[G‘)êù»Z<ùNlj$%Rq‰äqˆ›oG ÎúñF�o8‹ü@É÷�š¥y™àC�ò%<­à/(Œx†øŸ@ çØN½Qä_òÓwŽî¯E Á½�¬ìÕøý¢çhÃIRá(ü}ˆ�EYÄy™,CSàÛQBPÏ {ÃÈO? ö%ß)J rW…án§YN‘YQàdž" À7oB”Ðþó×¹7üÇVú«ñûE‰Bq 9†æ)öéK8JâYŠ&F"ÿföʼç8ÄŽ¿�/%_�ß1JÄÏ^Ëá<Å "Åp„B‹ ÿí(!ðç«k˜ãPÄ�Ò¥Ÿ¾o”œ$…#Dˆï¼ŠB#±Ïß”þææýÅþ†ýp$¯Æï"Ä_ ‘·çl~ ä»FÉ篬$¬$Id™“èoE ÷3Á=ßL`ì¿Pú]kŠÿ‹5“ ü‡¦þ š"h¨$œ!1î…dŽâ“EL`¾ykéY€îãØ ß÷¯²Mý}kŠù‹5żŸø¡©?_‰Å°Ø¯Ò"Y%€É@¢eZæ¿©Zñéî ÏåÞ٠󆃕�¸ÿKM}ã‹ìlÌú/�?¸ãëHä?þû%ò{)H‘&e‰§>¾Åæ(Qp,û<(ûM %ÞC4íãà½ìœùÒ¿ híKçÿaMýòà Ðås?4õ”Nýšìw®©×Õ_Ÿ2ýtdõ³S©ÿ´óë¿ðÚ_>Bþ‹¯ýrp¿h|óƸ§Îí¯yQg‚ìôßèï´ÿ³'—ÉwÿÎ7ŠF´;å,¾T4ä=ì–µÎð•£øJû‡Žâ+×ç ü/Ocó÷>´ôùÉ}8ï75ÅPœêÌ�q¿ë T%®‡ì@_ëñ{rü>nè-²6Y¾*êW�~+Í~ÿlÚüïüxá·=­øñlòŠ5ûãçä¡6ÞîŽ}~“eßóëÚ—z^>päó ¼äëàØëÒ—:Nm1~p‹GVŸ:¾_úÌ*?ö&õÔò—¾òô¥ ¨oôÑoo9|Œ ‰ÖñªfqZmö³ùü\Ósô¿êðû2”¸)êJù铘_ øØú÷D$Ù‡ß<ûýêÿgï: šLº¶(Í¢¢€CG�ôPC�Ž´¥©�D òRE¤(BÀµ"°ˆtD¤+HSš‚R¤7¢BtU@À?ÝU¿U~Ý=çÿ¾ÿ3çääÍ}ï�;wæ¹÷½3“Ì|[�n-æ¼;ˆ~õ©ðò�¯ Ó°L÷G€hgŒùÊ7Œ~úòÇR>gùzQ4/£%ºÿî_’W±�Ö¾è{g¯€àÀgíñ‘ó{ž Ÿƒæ~‰±�Ø3tÅËJþ €ßØÉ£æ�u_-“Àècé�Bìª|VxWW¢ïªlª®X§CßùPüª‘[ÀÄ 8\9ÑñûÚàû�ZSp¦«YîSõ•sA+êAËúW6´ù„éÛå,Cú©ÐW�`™E�èJ¤â/cÍêöþ-ÿ¨iÙÞeë,ð„ºäÕÿ„¼znDÍ}–Küóûêbôó51†Æ¿¨i˜˜|�¾Ò`_H:ÑÀŽ�‚—ÏsýØàË´ÿE]W\àKé�äÕ ð_ö�/å?PWw¤ûÌ—Ò+įwó·—G@ÿ4LœÒòæ€ÿ(ÈÉ‚Qôæ”û1,ÈÒÏÕFý 0È ÁH…ÿäá`˜œ,ê‚Ã_…ÞOn®zþÙÑèñSË ë Ô•¸ã$²Âþs#«±¤E{«*A:Õª%ütªïr*“Çÿ—ù”š Ò§9•• éþ˜ký¸�ô‘8MóçOr€ð×SM_ÿ G/» êÿ6ñù“ÿ_¥>jË`ÒW‚Óq…¢¡Jæ¿Vÿ¢ó;qÿ»ÀBý-XÉ|P�ü· ÷ßÿÕ¨÷›dõÀ}eÇRÚ  Œø|j’FT0ô"â¼�ð^&Ø Õ5A®G/¬—?HLï¢Ï˜¾Yߪ±º&fÍZúL©~Xüc¯ŸJ~*ù©ä§’ŸJ~*ù©äßJÉ´²Ÿ-Eà ¼;NIÈWHÃF»"^x¬ýŠèè†AAôO4¢Fôv@0ˆ.G²–£Ñ�m!Ë‹²+k“˜�"rЍxªD?k8G � 0ýß�(\–E�ääÀP[ˆª+�£sÑòGý½².)ZYuDÚÒ»´L–’§+…èaI€>G8@Àã$Ôè¿g€AaH%…KAáâP¨ønˆ>GÀ~³XCúò+B,jHÀ;á÷¹ Òjýé¯`Púm æ�MàI4 ?@ËÀxÚµ– ƒ}`¢/*Ñh¦¦Pꉖ£9™àk-…ƒ˜âý[:Éï–ËÒWƒ‚dVxiÜË;îƒ`ðå:™zܾiÁ­ÿgãËÿÙøšWïѤ¯õ¨ã�h#ˆÞÝ8B eä0˜½A;2Ú¢%�ß–¾äü§¢{ nHR*ùÃ,/mQuŠD3úoÚ”јû‚S}x0ð_³qa¸¥ŽˆØUõþy:ˆJõ[xuŠlÖºÿù5T[ÏCê¦w™Êè ß…çÔþL-L;aVµÐ{ ƒY˜:,LÚÇnNƤ ïJ^šå~ž˜š+<|k±·Õ5�ßÜàŠ?_ò€€ò»wmÊ‹ãÔ–|Ÿ…×ÂIÏgßÅNoõ“™“ ìqêL-"#ÉmÄÍU~‡Ñò[Ñ÷&lÂŽ†ó·y•ä(¯?�¡”Gñ'ïš5Ú�ùmq�y¬¸Oó+?òõö�â‹�­ ½Þ%äÙ¶ú/Lïä¡Û6­Mˆþú†òwûÞ-ª#_ÙUÆ{TÉfgÇ‚¿jkgu|:߀׸±RXŒ2‘;õˆ­&4;ŒÖÍk‚µab½ò }D÷‚‡¸w¥” 9Z²ó2›bû¯F9DÅv`,ª¸�µ5×{Ìç�YŸÕ˜h,Bx×·C"—xÍ/±Þêˆ@Z*2oGëΊAä‘ó­žú]¼‚9|•kúq�Ô�¶×9Äó|ÛJÖÞ%7pÖdH­Dû†¿Œˆ››N²(E�¨kç´Ån†ß¼©>Ásâu‡—fXQß$®É5?<6–’L�@Há5zºu˜¤_¥M°LÞ7Ÿ~‹÷QÓïá\¿{º!ü~kv¹7$.ïm5ñÆŽWè5£¼·$ù‹¯ã¹ú°Ez¤ñ$‡ׂcŽR†³Êpóöéë ‘’Ó5ù!Óäg¸$êž,•]گל`Ó"WrÈK•”jÜ xë¶h ŠäîGZgð`Ö)_‰Ý«è´¶BÓ7°…×O#'"²±ÅŽY| ¡Uü9ì¥>'–b16_Kñv»äRõlºx`B‘½Vž¥i¼b�ÄZÒA�ûì7¤D’÷ Ù& NÎtHÕ!¦wi Ÿ^¦Z»Ô¾Ï\R˜y«ôú½pÖûŒ·=­Ev‚['Ÿl¬ô…C6*q=¬û¯ Pot‰Š�'û�ñ—{r¶–ÊPÇK#ÑPÅT­Êy—^\·^Õ °XsúQóTÂÀÍ nŒ5�$Ývk^¨1š»Ê`"3ù»ú¾¤ÁVA3ŒØ¦’ž³/î4Ÿk´WØâ&»Aéð^7°vÔ>@@*äÖþ1!HK†ð‚2â¿E±6ƒ4¼ï!RªæU¶Ù©) ç _ úšÛŒ/ˆû¥§Y´eYTYï†WL–‚¨¢(¤�?ÃDéJÁàáì²î×�˜Ç‹ï2:ªP\@m~¥În ÐWo¤q™™ô´�³ƒ"!è@¡"™ÅQs¡/Û»%a�9«@ÂÓ¦}]èí— .F¤ÞÍU}›ƒÍôP� U3Çø½…j÷³÷€�Û)¬Íñ¨“"çŽJ•6 *.à-!µ>õ9ªÒ。Y]š:‘ö„[�iîÅŽ%Ii7È¥Äti(”$§ Œ0�)Õi&…§ÙÛ«÷¿ÄÌ•+<9Fl5zF™cjAK~æt–ÈÙTÑ#—š;y–ŒÂr[“ĉ\˜…Sƒ`A± ÷íºÒO^Þú !Ì0pŒ#C*ÓêÆ`*°&îqø½ð.mé7¿-ÉóT#72/…Úvªí».–²%&!óq&§Á1nïp‡þ9˜H.Iˆ2ë$è‰0 õ�«Í 6Ygc ŽÍÞо»”c¿‹¾h“4á-cÅô~Lí}‰Þµ¶ªíFý6Fuªó®ÓïBç ƒ’›Ë°Eçš�Ì.ZÌÇíSÚˆE!ÍHH«†C»æ“ˆÛ³Ì“àö»ruJ 3‰‡%2ÅÔÑ+~‹ô�ávV«ë¦U‘f#së£�×ܱ´²wO¸:ÇT‚'&†g#¶âyZ*ÍÈ£ºŽ“Wâjšj'mЦôK™µÃ„ñW[Yv{NÁr˜snä² ilàF¨‡ö”×gJÜ}2§ÂÚã^°xŽ—÷¼W�zí+7é|ùQ=§Ÿ³'•õzÓVï M6Øð[Ü|»Ä¶Kyšwš8Rdš&« [æ×øæ¿=�«Nt.“긮«Äbv[gÂïu� ‰„Ó7Ob �»„Ô½ÞÞñV™îq{úîß¼Øm×Ö¯eÞÑueþÚƒ—91(¼A$+Ó•ùM½riY¾¢ÒÉý—*"™¢˜±Ù=! ‹Ï†`¯«÷F¦Q&ÝÊÙkžCOÄy41«†ôø˜~Íî^ b£otD­�)þIý}ÙîǷᦅGZÖ:4(ú=’ ±‘UÍëÍ׌*_°9ë Ó=ƒ�*c\)ª8{öÔöG“¾õ*©äíN#GØ"³%mòÏ>(6îfuCF0{ÛÏ¢±G°]¶39/O!+ï=c,+êlJyáU¦"Ñ»ˆšX«¹þæ=é+è‡N6 mÝP‚êè‚K/‚ŠÔñqŒ$]ç;·ö÷Ãͬó‚®ÈÄÍv¢¿ Z°Æé0žŒ¶í™�íg4œÊêMtTQi¹es‘pîϰtLŸ)Ö·¿êÁÆA}Ù"Ù]ìÅïg',ÂC¬ì¶`±ÿ%.¨¡Nƒ½Â:‘aoÐч6=-›Ç“ðûû–(b§ß]Æ™ílæ ÛTw½L:Gï�ÀgŽíhSª³Q°`&T£-=ä*‹†’g²ˆïÑ´:ˇqö¸6v®,|˜ïÙ ;7³�MÖƒøƒÚk ëO†%8n׉c8Þm¼f¸»£±¹”·zìvB ‡äõljw¶I—ú·›Ÿ»3wj{¤öŽå센äðš»ð¨ÒMËñ{ÅPHÃ3qð}í6Ù’óXƪF§Ãç›cªx1šAŽ”!?½QŸºqÜ&_[' áû<>÷øŒ4)ÒžnÕ©�ÜŠ™`8³¦m‹†“âåªÙ�·nÿ®K2Óuâ½îxvœDãìCî@¨3„zg¯›vLzT-#Ï!zKè¥Np‰sË¥°{=\¯Ö¹G\Øsý¢¬STÈÐËÝ ¡ÐpM1BO}Y=ÁÂwèÖñÒÏÁ9©/T»‚Q:“gÊßhd¥9ú3HŸÀíµ`˜X„ ±=o�n*¼fkM“Mî †ô^Sô¤Í¨P›IÔˆ=_ÞSµí<³g6³œ8|:CàÒ&�«ÃjZ�­�¶]úŒÐ……»ô-“DʱÜQO0ö6"eû ZRò‡ë�¼ï>ÊÐS(Ìv_8Š1$–¥Ž}˜ã€Í‹òÔ©_³r6ip�KnÆoˆVÏk|°v7»](|Žôgbu§+JߘÏ9U^;ܘztZ•äZÙÿ$-¡!j“îAóºÔVœØ€ØáS bì%~Îyç¶q#¸‰éI¹€ŠDÌl«îÕ‹àž--ÞÑ 3Ïw?yßžJðñ¸ÒnïujüN·7Þ|àyÅ»ˆÁ¦�"º9È 'å˜!“”¤t«jæ®û‹è²yé–L�ZZYôªïØ:U½¦ÌÔ˜22ÞåŽz„¸Ž_Á`ê8Û×é>ötltÌY^3ª³àxDÜ´êdØúÆÄ~V³q«ÚT†-=—üÞò[ÆDŒéÞNÒçóöä±ß©2½õÚac£Ð.ä7ð²¬Ý¹8ÊÃVÒ ë£þ³z;:ÖË2^÷;×]œJñ¸ÑsDÔ0_ÁŒ]wÈ>%І€X;·Keè¥÷n:ê[’aá~ïG]ºM˜BÌ$›óÍÏmYH sá&�v™´:%9|³KY••y~øNùh�€ýF}¾“ýž¨Á.=‡ÖrÞ ô•_ýbJ5A†bÅâ ã�–‡†Rˆ¿CW´ÕfC:o£º1~ý9bì�¨hþÄÙ³¡G÷í€!·Â¢Bâ᳿^k)-Q÷Z>ñ”hÉ(’"÷$F¢Ïð¯›2ñW§Ê"ÄÈWÝ@ÑO›*ïöm{*Â_ÞÿÖsVÎ.—$l(áy<ûæ:Œ9H2F¤S‡ñÝ/“ŽÓço¿ç–`韾{Œ½ .žå¤š’;29óê¡Ko‡Òïò]!̘#® {‡ÈÏßÊš›×{"Ø*]áïHV;ü Ë™]lC1ëc­Ê¯>¹Ðƒ3ÈÁ¨¼›£ü-ÇÒ­  ¸K„àÜÝÝ‚»»»»k �wwww îîÁÝ!øe˜°÷~ϻϹß÷6¿®ž.]ëYÏZU]ôL|x ó£îø?€?? þy¢4wr”3v¼Xixve§{þˆâÓs¼1ðIøØ§I' ($.ÎÎòçÉïO�ÚtbÆ€7MŸ[_X™éTÍ��†l?²s©è*sPIèi¾S³¢£•0e³zO¢ïdB©¨oÃBÇa¦aa@ÈCÍFíHD£i£%EJÈõžVK†\BNBYŒÓP×Ù ÎVÒÔ™ƒ™˜�[žßæ·©µ¤˜‘)‹ 1�¸†±=�=©´�<¥¶™±¡07'…©³©�¬:‡�0·1 ½.‰ : ¯=… 1½ =›µ¨./��†¥²¨ŒÏ¿ìX0¼lYhÒ‰Û»Ñ »˜+¼$`da!``~Þ»ø«>óÿ|dþ?±ûƒ3#û?�RÓ–å±—á'!#“Õå'1æç“à"¡b'ç0æUã‘V`Uä3×Q7`âѦV¥U ¶—â'²“ ‘#'¡‡3ÐfÕ·°–Ѱ¡$ä!“•×0–×Q§¤æÑ梤ÒR¶2å02¦$2Òä¢äaÒ³•cÐ$TÔ¡àc ×`6r¶Óƒap ¤£¦¤×¤ä ÕW`$5 zçÈ­fÅ"*ƯÉÍCøŽU…ÂYXPÍFÜ�V”×VAƒMØŠDZJ]‹–ψWÚŽ•DžÑVÝDFA”˜˜JV†›J[AYÂZˆ^œÛÂJŠÖVÍÜQƒKQ]Y“Ží7)›ƒ¡•¼¤½±„ñ;jeQ6S8UQI^a fY%GzEBGý÷¼ïßK*[ÉSÊó1³p ‰“2K�é2Zp;Iˆ Y°³ÙÈIðȲ*²)ËŠqÃÉɲ9h‰ÓŠ9“Ó‘ŠpÓ’Q˜ˆ(8ÐYQQªRSØëS꛳p;;K©Ñ²™Òñ«I:ªÛÑÛP©YéÚ(SÊ’ÃYi³ÊØPièÊØÓk;²™9jë©©1Øh°“r0ëkýaXÿ¶¿øóFÃóæ à_Íä"Æ6O¾EÜl‘zO§ì¨oú”ógÓæ/±üE;sc×'Î9š›ÚüͲŒ"ô4º“­ÃŸÝ¦?wäÿýMfZz :EgÀ®{i®¶–€m¢—NYþô�»OtjòbBòêTÿó•v:›'þšÛ˜>ù¹�€�£ù_÷¢æŽNBfú,ôÏX/ÿ?HÀö׎Ûs æ¿äQrp~þO?Ý__̆GM€Kýÿï�……åä0ÒÿóŽ•�ýéˆÎÄÁ¬ý±ýcgÒÑ`if:!}»?‘�ž `·çFF€ç›:01>«'Ø‹£ad¢.#`$OíµŸ �où“ÿã;ϸSKÍ­Œ Ø�úÏ· þWS*(>QÔÉÐŒNÆÖÁZßê9K($==�¸“¾•¹¡€�©•1=�¢“±µ ÁSÿË›�Ní�nÌÌÿ@â{´ÿÇ6!ÇË Á@ÀÆÈÊðÏ=C/x7Å LŸÇç?Ä"Σ™yÄÅüÏÍç2iª¦Ï@)ИGÅ5çõÑ8ó`8ËÀÞÀ¬`Äì@ Õ}&{•ãü«�Þ˜q¶¶ŒBtËæ'Îçv?]IçSîÛ³Ä³åæ³¦åÇû£ÛGPPŒ™Ï¹Ijlœ¦³ÙXxב)Ÿ²«»/Áá‘¿‚åÂÈ%ÛjŒ ô0}Æè¥Ó½`�²­¹u©ŽãsJÇ$#£!ª9>Ï)¢ù:øVWçŽúÇÙ—9û¾>~”|Œ!*á‡}Côê ¹°ÐWŒ¥<5„.z³WÐ4»¯Ã!ˆ‰`{é[?£Å~ë+‹Ó÷Ó¡/„%ªG,Ú6äÞËOZN�5‹Ñ�iGðÖÝ®ý£Zê+Cùór¡(:î˜}ò l”ò-&ôpl‚ ×@]õˆ,`#äƒ(bƒ¹ìß6¯Ú,â¯èH ñ`�ü<á ,šù„;xï†}µÔ©ùû�‡LK·~c ë 6N›'{ðÕ hت�ׇåUÃÄΣè�NJîÐ.µ€ÛcÅ;ª2øcTꬭcj¤—ÂlísnGWM3¦¤ ÜívQ,Û5ˆäöð²Äê´8—1RîO)úPx¿x¼°@+õ_of€ü~½i€6ns‹<¦%ÕƒC�ÉsŽ¢Q†$mÖfeÕ&cÕí8¶U†M§÷VG0¶Íó¾1X•ªÂŽïnBl<v/ïc|Ü xuÜ଒Ãå“È®Lx÷ W hñ^/¡Ê„`w.þ(ë™0®'ÞÉ2ê%VÏd¦Ð¤Œ\Ph¨Ó 8`°DwŒçèç$RSŠN‹fYúaÅ >Fà %r°Ón<i,'¶)“J¢OeHÒ§vÄ8•'P(3."NE"!*þ£ Ψ)ïŒKÍ\ «[«Ó„º¾°>ÀR�NQÉ�ú9êãØMµý¬O÷ÕÆUÖ…ú°�Ïe[Bå!Í ÄÐŒ§PÓ´g Róܵ¬8Þ½ñíX>A¾CÝ:�¤]Ñý�òØ-¢Õ®ZZr‚X¼B™2m‡Ë6ôÊÿ3Џ€„‚<„ˆšHD¼yô§1ú19sqÙ“Hþ/‘½Fï²¾}Q'bRÿ)ÑÑ+úÎŒø+W–"”±úW¤½ðrs„�o�á‰ëé^”©‚X!ø¿@)Óçsc%r#ûr)JG)‰L* ­m»œŽ¸Åó»Žçg‰Îõ*½W4£\wýþ¶"·Y÷ËDèmžÈ”{Pá)©ú�WyåiÊÔ5І•ɵù›¢l–ÊÐúm�¡œ^¦s¢ƒ¬·íd  N^Fnõ¯•÷eÏkKµír‡êÑ÷rŒ]‰ó¢¹ø^3ºµÚlFÇ*C kN•L’]“<Öš´(‘T±²B£±Öm~Ao±­DãOrEoÉqôWHÑ/�ýuö¦_d&\ðríª,hϤo¦ ‘UÁÄ-Ó/Ve/iÑ©Ñ_¡fX�U2Ê?YÃ6µÇšþÖË* +4r/È”©§�¡`áóþ•Âb$Øñõý=OÇÈÎö]c˜¿›G3ÿïþ�VS¢}ùJeEÓ"îIsìvp•ŠÉû›…Pܨռ3‡L]RÝH¯ºqÂU0ÝO¯ïÖx0’xºÓ,E�#„,odàÞÚtnÀ<`ïÛ)~¡/ §ši�È‘`ºÛlFŽ Í@ùõE†þŠg7(\×êûiuÎ~—ëùå�÷Cƒï¹%TmˆD¹‡üštÚéÚƒ6B|:Ýø”ºJ Ü%L¨Å?®ó ^QmÙÃ2*%Ëú&¡eŸÿ©Û,€z«ÖÞv‹ç¸d1×Gs úgÁô*ö%ÏwÝ¥y¤] 8Ú[Ù$ôÂ=EËÔÛWiºnÊŽ>$¶‰õQWª›÷4� +¸"ÉØÂdÊ}‰D>+žQ¶f %ª�Jy. ï~½›«K+þÔ)w”$ÓŒK0 ÷í}Æ—�ÖÜZÈ[™bEÐÁÍG[Ø[‚›Ÿ¹ ':Ø;T÷µ–a×9üÝ!q!iûqÈ“àx{z¯•J­³u«ã$Ê\Íuœ¤’ê|yƒpð/Oɧú—CÒ“3uc~k‘úˆ„úvó®1.�tº�P¥ª Øú?|Ôb>�ÛÂ’ ±wA5(QGÖ Ï…}íjÊ‹»–k?A¾M”-�¾ë¿“ðãT�x(çœðc¾P¥B#8qO¢f'[”CQ¿G…ùlgìžoµ6“«ül9­"EÊ›j>é¾+ØéJnÝ�ž¤vç$‰�Åï koäêŠ�µ¿*"üFšf�lLœH‘ˆ¸$§ù¤á • ’ŸO %á¯a:Ä%_põ;Gµ*_Z>‡ìÕ4¿l„&ü¥â=†/ØÃqØ8XÞO,6nÅ-ÏoêGš:µðcõKÅc°û`‰�þZÞ�Ë×Îút]¹°¡ ЇHòá�•R 4{ë<Ú${_ôSÃ6�6gü��Ëü]ý[IõXމJ¡Ì ½øyF¸b¥ø\úý®ü.Zõõ0¶Át ïZ)RÇW‘AAWpìfÓø¤Œ¨ãñÝùsÚέ¥U+ÎÉF â;[›­¾?�÷œÈ¶¹ã, •çk6ŒÜlt^~ML§„Ç'Mºô3èÝJlBÈ÷E״DzqY¡GËœÏnK{c½Y°¬ŽªZ]×›F{Ë9ï7w2Ë”sRD•-ÂÆeU&He3}G== 5¬¥¥µIðú«LxÐB>°¤_™Y—ñGU¡�eÊ)U„æê[³µjÍ[ŠVéãŒßœ Ðà|1÷ê�è`‹Çœ:?Neõ‹ešÂžE¿¡a20¿ÿ4i*šAzþ>౪2mqÏ|yûR¸ñLœ~Fù×^ŒyTÿ“Ví>ç~¿=“ :“Ð ÙšjQ*ù”b}®›õ´Cqù¥ÂGZãËý.§šyj&,úÃÝJ ËN__2ƒoÔŒyAöŒÌ^¾“©“òYãšH:L;híVÚ1®éÇKä±Ý@óm!7…R#âÓŒü°RçO*I¦ ¦"+ò­/– Ì0pðn ‹8XóHüÊ(ŠöÜÊ÷ý*L@î0œDÍ´æé¼?¯ôzë,’ˆ�İë¹szÎñ¬‹„Ι¿«3.lÉ1d%öfx•Qý徸­š÷�>ÏÊ\Åà™ËØÕlm†•iáûŸ=#†÷Ÿ"E4t¿§G9›Ë˜\PLKÑ�FhDä´ûâï3�Òp0üœ_£ùHb îæbØ=ä­´Yõš-ôŽDf%Tö„K|ýAÕÄöÜì_vþ±W ®H`øf;� ô˹�à»òt²rJdå¤ èœœ�é¥õ-ŸªÚüÙùë…!:Cýçv¶vÀvÿx$§ÿ{Àÿ·7œäÌ]žº$`àø;Qÿ]ÚØI_XßIŸ€ñùM¦§9aÑ?Mù Œ ÿZÀHÀÈø¯LŒLÿZÀLÀÈü¯,Œ,ÿZÀJÀÈú¯lŒlÿZÀNÀÈþ¯ŒÀ×Ão‹é›Û;üõ› /{lå0ÓÉ8[ ZÙZpÐ)Ø:Û99˜Ûý]ü7˜Œÿ4ËŸÍrz6–¿wBHåiž÷îh˜hé IHþ ÆIð_;zä Ï›zO•ÄÙuÿS*Îç¢çBQ@kri}C#-VV1ã'ÞÙØ8R�S¡büÜ)=-`Û›“…P¬oã¢ïèhî(debgzÊ@`nc*hëÆI@ód,¦'ë³>µa`y*3W0vü—*´lŒ¬ 2Ó²>™‘ái$6Ö§¶†ÎÖÆ6N€wߌŸÿGáÈIø…‚?¿€@ü…‚ç_0@|‚ƒE°I& ð.§'ˆ8ˆ30ê :›[=YËÀø &V6@6“îs—ϱOÝ>²ÙtÅßyQ4vrzôi@–dþ)Ç“Òô´Œ€êž8IËJ@þ/ß8ÀHõT `-À;Èÿû»nÀ* þÈ5åž0˜ÈÁÒØF›â�”¶v€GblÏ/A>ÁõŒÒ¿hÙ/E20Òk+[Û6ážf`cy�…ã)ùûãŸzO8ý±û“ÌLOŸèYiéÙXèi™èYؘXžìÃÆÎló·EŒ]Ì�]9 ± »€ƒ“"� ÌÌOª=§Àg+ces§'ùYY@ÜŸB“±'ã_ퟷI9ÿì¾2ü�+(é;˜;ÞŸ´rvz&:ûËOv•Òw7�ƒ8à§L”lUže¤axR†‘‰�ý‰§ô´LÌlŒÌ´LOwì €�W&À†*`æ'ò=GàÀ /)p @�€þ^zb à�IYsSsÎ?b²é¾w07ú›:Oc±“gMhÙÿqr¼œ@‘;§NÆ6T`8ã?(HO+­ø4¢ˆ�‘�­5ÀŽˆÿ=Û02üW”a¥gfüG”ùÿ±‹~~×ÔFßüÉ”ø˜X áAÐø @@å|¢ÜÄŒÝÝ�ŒIßîbb¤¬¬€”ƒ� ½ä21®LL€R&&@)°TTÐØŠ•P‹•pÇÊ ¨ÅÊ ¨ÅÊ**úÒ'  ÇÓhÍÁ¨ÅÁ¨øHµ„„µ„„-…„%BB€:¢¢€RQQVV@kQQ@¹¨(° Pb ¼@y€#K-_Ê™žÂ# ÔèHµ:½h ,hHuR€Þ/HÛt¤€;€F€Ð'`Ï�)@oÀ� Ð 0&Màø€Z½) Ž¨( ïÅ>É�Q¢H�-�š¥Ê” 8:@ò½Ô€Zý) ' �ZË€\µú½Xˆ °-@?@ ¸h´? JȤ€Zý)Њ@–qŽñ…É_øób3 |@Ôµ€¸½àÔ(=@r \Àq�=¿Ø XãåÔh÷ÂL€v€Ö@­�¥ý) �ßý€˜ÛR@€vˆ$/Ì~ñ rÀ€ì~áð W^Ø�È ^üâŦ@Ü�ÒQŽ Ä ù‹E^tʨõ2:°w`{`9ðJôL ›�6bìAôùò÷oo¶A$yñÖ¿=ë§¿¹d÷ ïÿæ õßzñô¿­ü‚òßvHô‚$ õßh¼Èú"ï˸À~�-€ß“\�Q‘áÏñ4?_�`N}þnì_Wà�HÂÂÌùû <ØØ€÷_�;;ðž�ýelö?‡€°äï+ðÞÿ}ˆ$ÂÂÀœ¿¯ÀCDxÿ÷xÐÿuã9Àv€hWàýËðú¤#³3‹¨0«€¨¨ à�‰…ƒQô߯,LìÌOuŸ°š{q›õéOè9ý_¯Œ¢ìOm8€mè…ÿ”?·úgÎ^ŸÚq<µc{’‹ý¿{þ?ÇfayjÉÌhÉ"øLÿô™�ð÷ô¨7Ç_cý?žÀEéYc?÷ÊÐé)篱E€ÚÒ þÑVè¿Ï§Öÿ’ <ÿŒ!¸cÚH )°†£è³ÞÂÀŸex–饇ÿË—ëSë?Ÿ^ðùcQ>/öz™�™Mˆ'£(C€'²<-^ÿ¿Yü?¯O#‰têýlö™ŸFúÇÝÿ…þÉÿÓ¢@{<÷ÂñŒÔÓ˜Œúü'þÿæÿ‰? =@ï?d²ðIoaz¶ç±Xÿ�Öÿ‚¹è³äœÙ™ÞóìGÏ ú+—ã¹Or lÎÎ&ô»'¦2±0±‰¼Èô”/ÀøÌ:�¿Â.ðùVþ£9+À{žô~⨀ˆÛS‹'nþ÷ù¿Ûî¥5›È³ÞÿД…ãYŽ/{Öƒ àcìÌ•þ…£@.@¹ÇŸÑÿ:Yž½€›€è3梀^"ý“¹ØØØØ€Xëþ;[€õŸÇgø °<�Ãò<Òß”‹`Lø7°+�_€öO¸slòâíÏœcùã5ÏÑ h ‡2%jù,ù3ÿ�¾Ô‚M���MP@È ½€ü�||>€Þñ…XäE†—rvæg½ÿ¥€54zòùçxò|ÿ$ ðPó[H¨`”Èság­ž[lð—„þÄg¡¿"Ó?| =P;¦?ìfg|Æ…�¨Ûs„aaÚ›ý�t/¸‰¼Ä~Æ?LÿÓÇ ûw.>�-ò'6JÿxcvÆ'œÿÈÉö¿°à¡@.óŸ9…õÌúÿ³ÿQþ'®ý£Æ«ˆþưù‹«Ïlý{uóÇ/„ÿÆÈW #þçõ s!Àü X>_ÿHü„põôôé)¸2úÓÿ_6yFM8ókW’ÿ! ó‹ÔÏ5þ<Åž“€+�ÿ#‹¾¬ž£¶À>ì øô2¯ÿÅùÿõø3SV‰Ï+�g†½0ŽåeE äÔs|yñþ¿<›¸Þ|žÇþ²ÕŸZ,@I�çKÿ·óÏŸùù‡'Eúÿ>ÿZq³WpÏüÛwþy0“�¨ß³ ÂÏëP¦—uW€Åþ°åuþ^kœö>Yüáùóª`‰6ŸþXè^9žçÐçCHôÅ›þý؉ÀÑ—™ `ÀüýâŸÀ€®1÷©„Ø7 €Ÿþóúä%€»'„_&*Ì&üÏxÆ&ô'šýÏ€—ümE¶g߬Σw‚€ú€]òÛÌgüŸ/WkþëWHØžßÉþû•êUkÛyv”ÈäzdHƒàbâmΠ½ÑóV5Ò¥â—#{¸Ýé¸Úƽ“’5³º¾ÈAÕû¬³Õ5·Æ­åÌ^ìBH¦Ÿ&*Z´µS²Ds†¾lq'KkÝdó¸Šïê(MŽ\½NºóÚ=µûå©Ó‚{òvÑÅX1E•eHú(b:_;9ËyôAÓa§yâ@tÒÙu791ÀAñ2 jÇ¡`nLWJ·Å›e½`¼É›<1O'BáPº¶µ£î³tE>_~1•/ÓWÆÏà?ËMrCÊuLs¯ÞÚ¬44 ãӎܔߩ»ÊÊ‘~§#q[¾AY°#&ÕŸ¢úZ|[P­¾[œÀª<î²ux.0yhY%â°¼›oáã\!A³ŒïÇæl›;(Yœ_x1+»qÓÌgÐ8Z?Òut:_õ ™-ß•Ã�¹iå�»/ß�Éê�¹ûçÏÏ��ˆ‡Õ¹¡¬ÜØö•µ3üE·xŠŸp+(»{z˜nµl­mÁ.dz2zñ {ß/\-Ô ¼Ý­;¸Ã-Òè_…b@ò¹ðz¿Ê•ØØÐ¾Ûe³¼wÃ—Ó _=8%ƹvkÖ~Ïßz²n;þ›NxÛa¹b»iVEÍ[ƒ Ví-¬MP.²Ï\‘i(,±¾™¬Œ×rˆÖêuD+êwl˜B'´žêa}ë‹…G�Ãfs ëÅäêû*ÄúΉmM<ÊÅ¥©,uFsá/·{Ù#“u{á÷[QD®¨¿Wm`Ùòµ÷ðÚf”„d)P�hô´}�ç>`Ö@ÑÖÔ7›û¤1$ÛKu#§c¼>’ ?]´CY¡5ˆ5?‹Ýÿcȇ7xv¿8G�õµ¹‰Px¤‚êC¯±fqÿ�Û€ÙI:MˆÐv«Š•-s„¸×¹ä%—Ñ@ó‘sS›¹7ZÀÒú õ¦3ƒ5« ,gDVöë(åŠjë5¦ªÔÛRç%�v^é®íüʱj›É÷Ö&ýcé4œÑÕf&ãY´}ù ÔªýiÓûÒá�£û²Ž33BêÁDÖR4ýè£eùçdÙH8óºßO7t겓‘Æ« xwó{г”u5dÜ;)ÞËHïâN©ÙÖ ¾®Á¬ûŠÛ§—˜…�ßñé»fî…FMa+H•‰äïç&*¦:黲†´|§a¹À¯ÐÕWVÒÊõµ+YèðzÛ4 B–»¨¢rf½aúÌly Í#TÑ›ûåJ®G¡é4¬ß¤Õ‘¡Ç¦­˜¼(\ðN.¥5 ™•Òtâ·¾îFR$¿h®xÐIŠ3½Ó`º7WÏCä!ªïËÊÑ߯¤Œ¹XÓ/”·§j2/U.ºéH¸€Øõ­ca:ª¶ÈS·xûnrþ�Îôë—ïõ­ßb—Fð!µ¤$®èTÈšp×UÔ"ñ%Q 2ÆESZpSTŠÊ©â‘­…ÞeIaöHÛfé  .}„¦® ÙgþûJcO(y1O&<ó­Üí­Éö+"$ÉpAf>k£õµ‡½xxªv¤é�ïNúâ1ÑNî™¶|G’ýµU¡ó†,5ÕyôT3@¹v­ßdD}qEóNÏ#!ù mž0ŠÔ€¿[e$�õ Ïý³÷*�&å¹£�C~ꯞ.é ÅµRsxJE÷&«�Õ_ Ú^u|K¿–ËÞ_æÆÐ¬²=–‹Ê½½"]HpaCÖ4;cŸ¦˜5Ø3âíQi'Ùeë”6´¶¨÷¤Ìa‚Zá5øT¸&¹T¹‰S zÇ�û§'œä�e£–�ù/d§§Á«ñ¾5·¨ëœ±Š½�)D-WO<5œCb{Ça S-¼ý¹’,ö¤¡½®;¯O~kVE‹Wۖ˺åz®¿º»8¡Nq0cWhFy-¹þÓ}%ÂÜûWÁëÁã2Ð1ôÏÕlkšo; ͼõ’^¡¦þ †0àÊDü^ó2@D¿¾ý†¨S°N3CÏRÍqý@…ˆ¨Rl‰ýÍÉ6êìQ¥Äõ-{¡þi4¬ôÙ£Å$¦ ¬à‰£…T¯×5e ²Â5käFOÞo¼`ó&T÷Ä,±×¹¤WN™Iß#+˜†º(Wý¨šÅÁƒ|IG¿këFÞØjnY•-22«NOܾ[öXæÊ3bÏþA˜†²hµ´üÃý}ß­&㑘»¯ä&®¹h‹¶M˜jšÚûþq�ßï¶ë’Î{iç–�2ØXxiR¦×2N‚›->añLÔ°›Ü©NC¢Ûb‚5fÓ¶¡¢ûÚoÜÖ7s˜Øßa)z—þ†ñýg‚ÿ¡‹¯¿ñW¦«Ûý(wAwCìbå¯&“ÆœOä߸¼¡¬>_ÃU~½ãlùµ6ô{f)<àhd­¡ò· Ë–ôÛ�WðÍlù~¡y$І(æÙs’ÈÀ}Õ²³CE²ë¸dA‡Ö„—©íç:¿hGJImƒ¡ñ0LÀŠék#‡¯LHMÃ2óKÇÍ´&°‡Ì jsá„õ¦OÇ÷èv AÊ¥ áìf¡ª7í¾:ÛÎÕžLk8ÿøô^…¹XgÔ� k4ƒ0¨þ­“imÑh�ÈAþîŒ~[×í¨&�´­�¾��x“Ú¶Ž7à £m¤ˆ6%} +¸AäZ+$ÆxȦˆvjÐ9,vZ�[oVªÞÈ|àµÛûÔÛZðÛï˜o§HªiN©DŠÁ,ZÌ$]¤Wa”uöC½uŸ¹ŸQÉ\šÂI´T£4¯~nœ("t·~þj6Ù>8æG�Fª8ËYR�M (Š-ZòõHlEiü‚ø= ãÀÒkéY­y¥E¥eÞq6e·ˆwo;‰¿¸0Ê;¨KÅ.¨¾zÏêœÞ$…‡JO]¥ŽÖkÄX')Á~Í�³ÒúÅÌ"NǤ‘\�R�¦Šàãø9Û†Töˆâð~,&#  ³füçHy1ä7âé+;ñ?²³Ü™óãvë($¤‚)× ǿyJ©*N%bWIO^|…£Ã«ãiÀuhl«)þ¶™lŸ°´UÞ�±Ý,~¨X‡ÛDWSæ1·ÅÈ%n%þî¶{×ôô†¶ˆ¤ÂÕàUÝ;vâ§óYA"¯Ä}˜/ºëAÃæ/ ãáïòàîè#?>dñWÅtkC¹Ò,Ðo{óõæÐÙ6?ÒTÝ9O×cÍÄ…?_%{ó]mÊnŸ_ψó}õµm¦^ny8Ðmñº?˜¿ò�§»«Ñõ½Åó½ˆéOy8¹¿¥{¼»¼8µü=™evË×Rr‚´ÑåÛÅà�Ÿ1Ô3BÁ'šž¦èʉ/”Ã�1so_FÕá�ïW "­vêô¦T¤„Ì!TñL Ñj'�£ö•C;O›õ­nï×´¹ËV“yȆRäËÄOïúbÛ-r5»ˆ¤æ&yñRT?I�ºˆh³Æ[îײ\Îo²Û̯¡±þT×;øhÈUüCD�¬,~&n⨘’¦÷ñö�ó±õT«wœïAY+^…¤^@¿!Ý|r6hÉ×5K¨¢ ¼˜Ê(àag,]‚NDë™Ç³ãö4Óù ¢¥ûÖÊ]p+ò\R(æÜ)(‡ +MïvÚê&Ùúpvž«^z‰v® ¹(6ã>ý"}'ú�ö75çÀ‚ˆî"o9RJ%¢^@xÎÊÊ|Oœú`®‰BKPwœª}ö©úçB´‚b¡ nå,mÃ\ªˆÅÞ#¶�GfèõAŠÇI÷JxΊyMÝ:X!™ :Ä·,Ç÷:Ž Š ¼Ñm³:;²”•‹X*á$üùþùQÈUÞ™rÞ¹´JØpÒTû óô¡_P¢\ý�Tk¦Ëñ&F-ys{%~!SûªR7ßb“�Tû½…!·5m”ŸÞŠªîÈBTú9èKáÀ9¶¦¶üÞçèöór�ÎÅmíûÞ)†È¡èh­oª%ïÊjÆrLšÊ4p>Y^Qê|�x'¯·º>§+`µï�ù&»BŒ¼½«‘[.sQÿŠ\KKKžRKK5€š¤5ëW(éëˆoæ±ê‹EàV”6Xv””N`\I}IÃ&oÚs~å€åæ æää¦ç¶åþÊË#¢H�TÛÓ'YU:Aó£4RÊRÚP"Q6VÎRÞP&Q1V‘£ª›ü® �¢šb¡F#€NNå-›¬œ®œ}±®A2çTPõ×£†`�ò@…x)~bþ›WçhxåFL“A_×ïûÚ õÓ× .> \ž“ÉïSGßO·žH§ÞòªØJ†ù\O¥×“U×%xörB#÷~=4Ë鯮D¼Õèé’©¤]<;°Y>ºD´]>ùÄn¹D4ŸmÚ ³pÙÞtê#8ˆP ûz³Þ"*^[‘gõöáÄ:Ï “ŒŽÝó yR&•bË ÊÇR!sóL3ÊósLÞŸ¡[{4ÍNp…g} þJèÚMÌ$oÍÊè;™¿¢ãaV´î›Ÿq í±÷v(qœ†Ïæ1-ÍÔŠÛ×K0šÙxÊßË‹_.¯ 7�@q`œ–Xzh�®‡ŸÍö劤Z²CQjdx¥j;}�Â¡Ø òÏÈΘw‚šL'!‹ü5M¹Ïd=ýÜzÝmœcÒ~;/ÎrH0é dz n¾uñÙ¸atØ@ Ží«°9(yyÇ»hœî`wªMÜôîÓÄ%Î.§¤±›|Žçݽâ�]eð]DHp7<•þ½šéÙüwõ$²Û’;‚BW¼Y}QwiS‰?+%ª2ìÂ.?hvÍGƒ(¢:P؈72ðC®Ü%,À`_²£/gtJþžnë‡×âi[}·°´F®éÕƒe«A„¹PÙžÃÄØñŽ B³ vðµ¦!Œµ>�|·‹�T²áYe¤Ëõ[‰#ÔYé“Ü«âªeã·63®×�ÝÒ“SJ£¶ƒ²¹Ê…,¥,•,µ,�Ê­,�,?•XF”'Xf”&[?y FêW“ˆ&²@„ñs½O%C¿£úna›Êj` 1ÿ ÉJ±RzE…ýS³±Î¦ß-Œ}�çÀ›z6²ÅÎÇKú®=‹¸n®ëÚÌüDWèØWX×Kå%£¶ÓWØ¢2„n?ZÛ`aɘqÜg0ôs~%…ºr"…RƒF̃ º¾¹»×c‰·�É0šÆÒ¤N#ì�+²f-ƒ ˜â±™QÀ%ƒ%� ®�´ ï,rï(­�G¬%rlÒé(‹^…qÜfÜ�·-ío-€]™|Ýè§#x ·/r^T}<éH%wÚY§UáÀH CšYê’QšŒÆJY.=ú9‹¼ºC­“äé šiVÆx�Q ‚I¨Æô“éëNuÁ“þ‰ZU,}¾�V¡I–·®öÓi#¡Ýá�ùM‘OžÞ„6´3 ˜ÀÈJ.[Öê¬?¢•Ø¥�ç_ %Ðø��V»/ÎÔöËiKB<>ÐòÙ•4™ª³ë§åÁ5•Ü!ß*7P¾·NI]Ò€˜â[+²©B“Òãj7q…¥føP[µÆÞÆÖvrXn›’¯ ®=fv8pÁ‚4ë·V‡U¥¡�下†þ¡•*Žd悃 ©­xéúØô:‰•}‰è`0‡Ì8;¼·µ[ZÈN¥i÷òýoÄ·G^§VE=\øwŒ_ÙŒò¼¦ÙÜzh��¨Þ¦ÔT œ™àt›—Ùkßw_×^‚´Ì=Ø<º]�Öé4z�ízcÍ4yÜoÒ"ß{œuÕ¸ºÒ-5{Ô¹Ó%Œòø’7Ã×Ü£¤Ý"Dþpû~J½ÚPõE2^»ÒƒznÀbàŠššw/\ V¥aH_!¢ŽJüÄúkxç§õMaðB¶ª_FƒêÁ›‰y2£Ie•>cwþcI…ÜÓN96 B(8‡#jìs» *:Ú®¹×Åù5–yDðùÝK1(âÁ_d‚é<ðýʉÄg“HDrŒ)OKÆQæ+ù‡B%$bí¢cãYXSJ¤†,]¢9Ö=›·×›W÷û 8÷º¦Um±b˜vüÊÙË$:ãƒã EÝã&;вù‡¤B•-,† a53ëÛ®\Û‚±¿O}"GMÇ…Q‚2ªÂŸõ2Úûþ5h©ÍÀ§B , Âùýk+¦FµPÃ=‚¥v¸~SùSÔ[ˆ¤NS=Æá}ü®3 ž¨Ž4Ž.Í´í¸šï4Aû¡üàZznY¸õP…(ùVVWÏ?ƒ�mbÆŽk4ä[<´n)°”Wà—Õ"(Ò†Óö1A`isgxw%{hmÀ,ö½N^¹ÉrÀ0¤®6’R›çùÁHp^c†|•›òÞ±¼[ÃjçR‰ÉÕ=¯c^ÜÕõ×�̵c­Å•§�ÍÐlgkt6œmlµTB¶õx·ù^åõÇ�§¯·_í`@_†‘ñ"à! ¿O’æ§Áw¶këkÛÄS©ŸÉç92’¤ƒ—r°1å³êP­FH„kÚhÜ™¯öª6×û¾&½…¸nmÀ ?Ý9�÷æw£åoÒè éNNþbø ƒGR‘ ç­úÀ¤ðomY–Ä)ìj)Z¿ô´˜—´åB y¯ÈŸÖ�ºõ8ÍQ]¸xà†«',¤ vu&Û*5ó»š5íþ3LÚ«6Eö‹”ÐyÊʇSœÓEN¥ÑœyN5SõÙsEX?.ÞmÕªX$mpGéäHfjk:xsÌs.;w‹´(“4^2ÏMN¸OÇÑÕÉœFµ™Ÿ–ðÈ|õ }uT£‘„5w¨$–‹Þ&VR¡Û€cìeÁov–Á 0ä–WÐo˜´QDiLÖëdr®,@Þ¸$�ž#h“t–xkù¦J\¡DqSñ�iúíÊ9Y»)ˆŒÑÙ/2´u…d»oß¾½iõGñG€FüŒ…"þª|1«iÆTý˜Œ÷#ªÝÄñLô!b5è:\0WèÒÝ�üYP!t¸ü‹ÑEß^�Là<±¥¿mB÷J\2$!¤YD€Ôšgž º:4¡ñÀ~Ú‰p¶ô»^ÆÑIó,Mç÷Åö�Hë—¦?¸Gö¸Û}CµÁu\ »/Á¿-Zl+¹(4¤ÝóÀÕ3_8 GùÌe›XÜ/ä$é̉ôî[× WûP\uÜúÕ;±Ýno»Yÿ:b:¾R¿ê®èà‰n²œ²¥Ï= Â-ñ†‰^dÄ›ÕÕëOÞah—²;sûþöúª§,Ãvx4e> 76þ³¸½:Sö >Ø�}Ú{©}<ÇÆ./ºØkL†úôa'A/œW\�R�–ÚÇs¦!LïôˆP¬ìFg@Åà1ÏjTÑ )‰Q•²ÜTv×6œŽ2öÝCšŸÔ^Ê›³lª6]ÏŒšLÆžHª‰´¬<È ;ÕÏ�6«ðI'Ehy…Áƒ@*äÛƒ¸·›(÷*H¯¬¯(÷ÖÏ”ê<ΑøÊÇm—tY7Œ5~ávÁ5çÊÒäØ!}a0� «Ëܰ™C8Úâën—ƒci´À;ëûÏl=è3}Ë( ó`™ù,'³vcˆ[ö¾Ü8á=¨ßb8ôief´õQ+å æ’ÁSáýá ¶;ZNx±`¼ÉÏ[í  õ¸É…ÉùÏ G¡Eü!•jå~ʵn e #�k{‘ ÷;'óƒ€ áIT£àßÊòƒdÖPi4Cu£ÝÞòð"Í–  ™ðŸ*gJÓ¸Ø"°§¶ï“ïƒ÷å—úMŽÎÞ£d}L�"@=Ƶž¨¸/‰#�C"áDÓßð™xÛQŠdEǀⵄðkXaÐRiYš§WXìYrÎŽM � § ëZaê`³ò\DL×zÝ~ºï|`GÝXY3XF?ÂãÝù{� 9k¿E‹‚g¬Çdž_©À¢Íò±U6uùù™†žüu09‚e ¤YBX–¼³¥£€Ä+È7Âû!ßðHö8ÆÃHX¾XD+£L——’—)ØÓЋáRј[+hR¶(ùU¬“Ž’ÌŠ¬ï°HU}'Œ„ˆ%ÆÁÿ""þ5¯‚{s“¼^ªOjNj·q—‰‚9ʆzI<'B›ÔQÁrl/s&s6s.s>s¡À%Â#ç" aXt+ÆÆ‰¾C”nØ Çâ•ù˜™zâÍœ³÷&™2ÕòÁ¬Ú´ª‰ø�Ú% ~r»ÔjGÓ®…r\5¢Î…ýøÞ»é ©¹¤»rèñžÚÔz°F¹šÔÃÕ¨¹t�%�º!(h“1¼7‡)1¥\�îÖéå8^L9«íQqáí—c�—é»Ç�_›•³¸8M½ÊS�ÓH,ŽZlŸœ}µXœ´Ü>ǯ¡t‰9Ñ¿+Ê_|âAÙÞ’j¥íg]Uý¤µz”=êåqûl©@Ëb:SÍ­†y×€L­·Ûõg,õC C^½Í•,3,?ºQ®Ü‘˂¤º÷E¤£\/@0Ålz“'Ì%M²!UcÎt$}¿Œ Ý8¼f$úÃÞÿˆ[„]°>‹”s^ Ÿ1¯EÒ�im³1ßá´ZúŰlƒÔûk¢Î8$e] xP“o`e0ÛL ð#Ž”`ßW\ôòÈÊð…˜À~&tš%©¢°XË©EÅ0 Q#y]Mò5»_mÞ'4L˦Pìá¯øŽÒÞ—{^u´<^†\é65hžpÇ“‰ÍÓ Þù ÜŠï]ÿî9:é_¶ßά¼îØöeHˆa¾ ?F;ÙýäÎTG‚cÑà/‹«ñÉ?1롳ûVeä¸^ж�Û'ˆîËö-Ô| \%Ûh–�a‘K‚ïvYý¯ï—Ìê[P�çÂýz¢ølììZ=ý f¸8㥹5¾²ÃØ\zʰ汤XAÈ=¹dR9ZÔÅæÞqÛ¿pæ¾ð�uö®¯eêÈ|òù<åÞÔ¿»´.ì™»ØæÌv‘îÆaï2µþ£ÅÖ%XïÜ­öF‰ñjkó·qq3eÜí»‰šø+¹EߥõôËcÕßè¿6Cȶ|ÛmC5!<>ÎYêmŽ""ÙvÃM²rbp!²×À®…~4—)ÕùžÚ“û©¥0èä”Ç‚qO„¡$„d¡ÑïJ�Ñ~‘>^gGïÒ¼Sݱc<[/‡ù3É”õ.ÏêÀ+tA,—ˆÊÌ8ãÃòÔ™“T’D']Ž ÉXè� )>©Xõ:F>=ŠuíNýÎÓê´6’UÚAg},³º¯…¡Öï3‹h>x|[u¯t/NX7®Àd3Oïrˆënlûzv†Dó‰�к•ÝÞ‡zª—™íøã*�Ák²õ†¸j¿Zç+—Îôøaµó"ËHHD(¥n}ÍÑ£½+¾3Åñ°.hÑ}!z}|3±g:dþƒ|ßÉÒ=›ç#ûõ~Ä61Ís­qr«Ó˜%ãf+™'€vÏrT—’µŽy¬°œRWWö‚¥^t „­_í­5s‡Ï}ÎI!J-BÝ׌å·Ìh£„›ê( ½¬.tcª#¼|/Ú�Èø‹”.ÛòÄÀï~÷äÇO^ðZE©WŸSʶ nÊv½çëÞ�úx›âûKÛÊ 8"°B³S4Csž‚ýÖIÿ„$CšµôûÚ›õí�¹œæ”RS«Ù¡#ý.“‡I *�³vèϯ‡AµE¡ü„x�å¨uºy§ ÜŒ,§nBµAG¾{�Y ž0‚ýšŒó%{'¤‡.Ef‹= õY„ª"é€þÐnwؼî²s1ÇÝ€!ĺ6Hº¦f}¶Ì|3U7* ƒÚ-Z/J�%åȶ}…¦Ý“¢©<Â÷wõÆ€X’?|u°%%G¨cyÆÖÏê¨ITl¼Ý]=kí*§&x¹�Yê×z+3.äºÚ²Þá„&ÆNg·ïçL>>dÞLÌïoRÿ¬8y57òu…]cEçÍŠù‰IüÐëR³éž0HÑ”"¨Zè-­BL—ªfŸ”îaÊ"Ðdu´ŸÈƒJ|oô\O;%lAGLdí èf%”òÍ�@®–>€Œãâx3� ùŒœjáƒE“¤Bº‘$žÂ­�Ç÷#„Ý€¸-bÕî�Åö»°„’fg‡~´p°y§ÖN°]ÛîeIÃÒJ²^Ƀ¥ %MÁº~;«µV¸�˜aÇyϵb©ô«¾šf8 òtÝ"’À,ÓO� ¤úÕ¥ÀÍ(�q¾=:¤¤]kfY93™ßÖêÊâ;!bò{™ŸèXv­¿“@�q´èÊ›=%ýÂ7ü‰¯Ù7ÛsXvõ¿qI¹ÍñÂ'r ©èµ@œ±ûú¢F‹oÖ2¢§Âż‚—p²:óÄ}£RÇXÝ+TùSƒÌ y™ÕÜ|–¤õ~bAÆ.ÎøÒÚ´¡aÊ>´ÊmÜ‘2¬hý»ü2Â7œ5§±ž5“pp̱%¥Åy;2 GGp¥Š(°F.ü,9†æ\~�‘Ó-ôÃhÐ!‚ùCºU÷ ºÑösëoUÂVtTGÙòJþ$Ëd8;ýŒÞà3a¾áï[Ñá½'õ2æÕ¤å=Ém¶Ó¡öNdƸšâÈáµ\Ó(:(‰H•XŒVØ '%¡µ‡�8®åœenKdwQ€(�ûÒX‡VÖùó{�9hd<»²³u îØœ¾_ÆûߦðÅ<*ÑAïÞ�¬ˆ.Õq©úík %&%¹AŨ=.‘SÌב¶ÊB]†•1ìItucã Çϵl®ãâw»�IûµB�É”Ÿî ý;˜Écª­7bF-l@»«i€ ï¡Ü³ 1›Š„eP™¨9%×GV(¤>—üê óôý]ŽÎr`f�Åz2ˆT[UîÀl¤³lhµ²#G¿j7”ÄLž2yðímm •„ß"kÈFа¹DNºÚ.ZkϼÖJ°ñ4ª_É |(é-èHI¨Õaš>:ˆŽíÃ{rÜêúb p3÷ؤ~"þ\ ÏÅì‰<Æ’âßê^RMe*ð›qpã‘‚�­Ÿ‹Ý0ëz¦Å±{[ps3¥NwïD>÷rù@fYj'„I‚mZH˜Àç™}ÍÏ_DY⸈pYXeµÜGOÍŠm¸n¿1`–2•ž9·ÎËo{³ü�ÄkË8�ž¤çµCЉgRLRóXo­BH·„ý$*rK"?�u³-XëG>Ÿ¹vÒh‡‹dîeÏŸT1pÎ=ÒØNš_ìïQŠmÐ}WAr¾óNk…6Ìé�,`\Ù'£A ë;æÕÆ'ø’D&Põ"Г†F2ŽQõOî›È�S _•¬¦K*à45¿«TXP„ÿiŸ—ìõUt±�‚Äúd)Y|­"—õm6ÔÌç70©Ô«³³¦¨.§¶Lx¦kgÉã¡!$bïVôê%Sߤ²ÝŒ`¯D‚©e±ˆMÍå©ú½¥~ýÞ”~–~�—ˆ•DÀzãÞ«`õªAb°Â%ïx²û.G\Hg {ûu³¿æÝh¹{Œ)œsÍž�3]îõÖõ”E4_˜sþ2É #‹·©¡&çŽÎóa°?Œ¾‹ùQ*hQ�µZWÔíˆã.Éz<}ª¹¸ÿ¢FÛ$SUØi¤v#ef9ôë#EI�1†‹³ (zñjhÍûþ&‚7ôìõ_µf�jr42séôZ¡�†Õò.¯è{wbÝÂñçÑõŠ ˜‡ïpHÅ�wšðK-¬Æ…v�½„˜2 pÓÌWÎÈ€’‚,OÎêîõf¢^ 3 îÅWig×Wc×…fsUS÷&f'OY›Ëgºžr>סÜ?>Ñ®¸|›… I½fÔ’1c?-Äu°|ÃçË�ºÂeï�?PaHÌ~ª=lÊÚÜzßuôÞx"«¥Ð�´ñ†^ml%o,#ƒ`ôõýÊðŸ®ã-õA�’|ͼœ©bÔˆ—XöŠŠ^˜|[×SÜðŽ…¿æÕ(­pqH‚b¢‰ áÚæ�Ö0âqaöð| _PI ã@ðhMšš3÷*ëÁ�·æŽsÐS6P`�u,¾Ò.S™æ³‘‡[D™DaÓîfÑÈÇ9?â~ˆŠ͈Yp¸a‡âñÅ�©Z€ºŸWßWSO¨SõÒ¢—l×ҔɳMš3‚ 6‘³—ùPÄÁþúáÈñ'ªÎ$ÛÑòW2>ÌÖúYñ1´ÅéÍéïá% .išžR¢z uê2Úç+‰D(_{¼ɇýöûóØËJU„Û�U¶[ ü¥_C¨™*ú<ÖsÕúYÊ9]Åïù]´¹s`~.£ž ¹æHí0Ø«2‹V�w „�H™«Þq Ÿ„ ë—©ÕÂî¥&˜Æ]*´ÐÅF�'F?7õñNáxüB¥æ6²ÄÔÆ«Ž˜Ì¢jGýŽxnë—M$öÈ8èÍϽÛkŒFرq#I]0)œî-R38dãØ¸wÄ7Jõ”ºëN“•‡íC,ý…Ý&»Qó}­Fjb<ÕýòƒÅ¶Þ¾XW‘ã§•&’ðŽª‰‰ŽœLáŸ#r媙F•7´jÓîœö’òõgj?÷ç§ ]}XŒwqPÄ�š-'I>£Þ¤X.ؘÁè÷ÿu|HCwÖDÉÅv¬b�ó½àu†ör‰ÈÔ÷¾5)-–Ûôï¬SœÎ%å•,ÝÓïæÞ[êV‰AâleÃ�ïPó–�NµVŸ–ü+f_)C‘D]º¡Ö¶©êݱ�vcˆ^X“Ô£©­è§JtÃR¶’¥ä ’‚s1 MŠNoµÕá¨õˆÚ £c—L9D¼ WT„ÿàß/æ<Ä}®Òz‚bz…£„èq¶ÿJzvuÿÍ N$.õI)¼ï�³ªñÖ×}öÝ.výœt_Oîý* çúf~‹%ïéû,_«ö"| ZצŸ™4 0¤p.f!@lŒ䉊¡q©#£k�¯­:dºéágPŽ ¹nˆ[ÚµÏ=ÍžemViÅl¯{w¡e�#š<ìdéû}öÂ=µªVú¤'ºm1ïg>=ÿ[oþÇ�‰Æ/šÅÝè| ¼Ô£7ñÕ/“cd¹œ‚ÖÕ¤Ž�7qwŒy-$Ïý±¿¶÷Ü÷]ÂDn›Æ(;¿A \HŒç¶¬uÖéžé%c_l'DøÞí}ntã­Ý�ÀcÒ–BŽ¢Lr×0–BÑ’“å(ÇUSžî©ÏhµvuÅ—É\ÚÖ&Š®c=p�jùéõßoP÷\¡ eK:y͸ﮔ>Iµ øÉÞ‚83åZôEA)-­«Ÿ@�«aàañôÝ](õ"Ùrø:4§^&3bvXÁ÷Õå TraG6Y•Ãl‚k^÷M|ý2äw«þ¦ø;³h×Å÷o}ÂßÎÌïý¯Ì<ÞüÀÐ+¤DÚŒ¬NÓß�¢#4C5P©�;U±·C ¨N½ëÄúïÆ¼¹ÇL›ð -þ‹;\ò2³ŸWÑ…û�r�nƒ�µR&×Iò¬�RÿŸY†Sƒ :„ *„BÓtP—Òg˜ãÍ �n›©à\¦½×RISÁA2â­®GÜóY¢ ¯±ŽU½ÓŠLWJ‘Võ¶fÓŒõFwkƒ¤,"…ÁG| ݱ vê|8–ªzb*ûÁ¹¾sÁ·,ÇœAîPˉByêc¦Ý,-Ì9¸WË¿FëX1b dö{“ºK­k�”L÷¨P‰Buݤ^Ó­¡A4ZÐ"ü¦5/(®ˆ$”ÓØz½�eò´yÉqëâk9”ºÏ‚ ñ|³jõª‡Y�¶¨¹ã5¥y ý_¼…Ø+~·SëŠ�K¨ÜÝ|:^¸÷WCór_LûOß�ì†yTeÄ €GíbH»é,Û&óÌjÙQ‘Ä%%A»ÑV!¯4¬i“+ óqäeëëeú¿>¥åÏH§Q'ß7ºº$ÓG¸”šåw¯‡Í�zˆnFI¨ v*Kk“uÇ~Èž½Î*;Q¤ÅÁû{%Ž)哵9ÙçýSóŠ`ôzz£¥éJªþÜ•I¡P­{âØP‹ÃàÍ+™$ãêîù°"%©塬tx\Ypéd# ÏŽ¥µpú䨓�]µqy(9+6Ýo¡fx¹‰M©Æµ+mpÖðpkWHœ¬Y§±à0£»M� y�WÍG�§YL”ƒ¾ô€äHUÎYÒƒO©Aî—+É`ÆuÏÃ-î´Q:ÝÕ†dCcèY-ÎdžC›�uôO߃¬lÓ V~W±V–N¸÷¦‘ÞÊ©†'cá û6€›(îri¦sÄeÐ×¼Øä%¸Ä*Ûç–øyzݘÃÿëÖf_…R‘hd:>–š$oÞ½xmÁ¦gj‹ž2±—.‚Š9©9N;:ýå|ôïräíwŒ­dîVveo‚.î‘MW>›î×øÌé´¯ëì¾¢øe¦˜‚rÓÙæF�¥ôÓWÍ9ÑN»»ºæ„ø¾ž‘×åñë�PydÈî”�.²óçw×%T?n (ÊöÃr£Å�»*êx,¢\t·�µ,u�á@#Û� ¶SõC™Ã Ú–Îdýˆšf;rK3™{�Ñ¡èeC_'.’YÂÚ-Ó”$°QëYÏ À°Çïbk˜/Ú"tP®Ôï*½’³–½¬¬F´�Mv¢GÚë¤B‡=PßãÙ)ðz£áÓ!³_j>;ÿò=η+Øêf š½6úTn—ý8(ƒÕIÌNl¿ËmÌôÅu; U.K‰û}„íBO1w]x�”)©ø~§Ìkˆy—vêLMÊ·�m7¤¬Åé—pU‚¯’‘¡ÒÆ©ÅbL¶ØÍ§U”»í5VÁ¹¯™ÓÎq:M¢‘ÈLª;Tuª£�Üö‘ß´B™åbÒ�Õwð�ÀÝ1Š 8ãµV5!!ð,Ï…�€O ¹aç¸>÷:š{|ÅmÎvPê¹Ó_ƾ 8±Új¦ÏÏç�Aõ qD“©= S=Õ»¢Õ ¢Vo·VÞ‹ÙF%ïˆ:P_ÊÄÉ$–'ÄÔ5<½ˆ,wîÒºF*sä“.aZyã”ô·ÐÂx4Xð ÔÖæsŽ™[m_l³Š|*7$zæc“I!üÆ _õ®Þ6j8ÖxfB�¶K¤æ6…IÐÃ×—I<#-ËÙÓ±F A\ÅRCÓÞ¶é¤J]ú—ÆùëìíÓÏ͇ÍÍEw%¨s;zš[eJþŒøÙ-a'# NQ€;¨<ÕKpã“�ÌÍíñ»ÎôÝáðÆ«ãÜÕÐŒƒî«Œ£1þ�yád–ßåF[à¥õßÒ­êÉ̇‹‹j ¦RÕ+j§ƒkçúÄ8 ­Á¬\•©è<Vp/è»_Ý·ÍŽÓ\Ÿ�2öeûW›¹ÎSš¬øfªÎ‡i¿}pt†Ò=’yôÖ­,0JF$ÚÚÀpHSóû#oA½ŠóÕ¬é·ÏrëÉ,U–ªªÓÆ4¡VÆÛßÕHæÚ‡§´ù+,Q�“³9ŠM@ÜøÔ^÷8æðËOÎÕ”¦ƒZf~;ÖèÛ\P&±µ®‚Ã>› ´ÁÂø…Ìj`yvvŸF_¹R«‰Ð&3â'–L[QL MâT±q [ú®WPMd7ô#4Ã[lû¢X𔆂c$ˆÄ@¶/‡ ÐåBM¸šP±°�i œµ aœ[êý^‹YfÙ:D+¹I\�yAôoäH¦ñõ(EiL¦M­ê-W 0œí¿4Ù£ ž’)+ËË;¨›–4eÛM�½R‰e²®(µ=+¤‘BÁÌî� €¼4XC‡tŠî �ä ûð�‰w}‡ –ã—`–¹šql@¾V¬ôf¡MH4Ô¯±C)½¦E IÿÂ9ò�j(©Iãp2 þè#ëØ÷Öu¢34À0 kA±; µ*ƒ!¬£ñÅ#ÙÍc‡!1ŒMüå#É•è‰èÕo¡ M¯ü„H<\f ²£�ó¼fÔöŒ„Êýðµ[X}¿÷ÒaŒ—�ÓRÏ‚A„1=FÜš�TA™?4Yé+-ÌFkR¿ÓŠuB¨Y"U@>â<ÑzB/&ì¹¹ìC&A\=ª§y“l\s¤6+>_üó Û#Fþëwú±m+C •å=ßG…ôI'1àktK¼òK—]ùEaí`W� '|°Dä–�& 㢰X,tnEÏò¾GÏ>ilÎ 3ÞObŠI‚"‚Mº‰�Ó7½O™ÜN‹º�Ñ$U­z.&0Ú|/“æRƒ:ÀÅãÂ¥Ò‚Ñ@øS¶–$/„?6rØê§)ž6¼Oí`Ú Waøš”p�Ç�r„#®Æ¤~;—PS^áò']ü‹8pT%W"ÇšEcÙáî<ÇV¢¢ò¤=Bïþ4€² Kƒÿ,²:—þ.®‚Ñø»1[½¤ÕǬ“§úþäÕÐ-¶þúy•6¦ØìØû4¥}»ðäZè¦y¨�Þæ‹ý¥zq¸Êú\­…VàÙÒ<¿ÝCúgË„3�ëÉqtâ §&èÉ®ÜåšÕÿ$„Ò y£ŽG•X=@3Póa{§ªR.;�'_Þ%p ;µ¡x/” Êöë‡�v ˜R°Ÿ‡Ð)�¯JQ=ètŒ>MÄ•~u©=É�AÂËIƒ�rJ6Û°­×¹J`§aÕÓ�<8×f.ýú+¨�`Ó4°w„-7ƒ+PÀÓ ,,§!(ég]ʲ×Åúüe‡í‘.ßýïk>ÛÇß§ã9løGo¼n6{\¯Þgl]]Ñ Ûê¤@yyQ†Û.ìÀ>4ýÞÙdòù�ýØô;@×'(Èìf'RÆ—ýþàèð\ƒú1Ó0iÿß´}" ' ±¹áC™Ç�Ï% ×,å:Mø'^®ïXtƒ± ‘~ C0غ}ö–˼bë[¤7Øš)Ÿõ”dAËÁ§”£@ïÉGËðŒbÁïùŽqùÆáüÍaÉ|iÔ[ýc�oŠSü6þÌ ÜѦv]äU^Øø¼' =ù‚¥öŽ5,Êc„²ÎÓçÔ$ËÐßjÐXj�Ž[Glp/T–«˜b¢ @ûšBî‰Ù`ÊþƒŠãkãÏ…›�&è~ˆkòuCõ™�:1Ÿ1‡�Í>Ž _qšU�%Mïaê%Œ©)¸5õç@í½i˜×AdŸl �À™ÿ– µŒ»’/ø‘áÖÞ’¡à“2ÒÂilT˜ðJÌ.Ô»9«¶^å÷E~Q=aDêZ\ðy½Èh¡&éizLŽžZˆŠÛ6©·Ñš&Ñý{Nö—?k §* ‡¾¿�t ì[ãV Ñ;; ¨A +ˆ'åãäÓ-Ëàx·aöÑ¡ïÂæCÀGßAzIJ™¢cî„!Åg�åÇHÏo¶÷¶ï%<ö{_c€ÙFc7ˆãE–M~ŒXc"ã±ùɰc½üJŽx™À=ÐØ5™šÔ’’birÚ¾�|Â5 K�\eð{ë}—c9bwæ Ò[›ÏtúËè`3îfûø†§Óª¤<'×Ý)É^+‹ujêþB§Itú¯ekÅà†Úüû/<¤c_­Üƒ³8°}Ê �RQ…¬pOJIEB§–ú¡áâÑU[@‚KD?²‰™±hU³F[2Íñ Çû¢cZ–×çfs±@öèÁûñt-f¼”çæ~m|zÙ÷æ÷áCÏxÆÑróÝñæNËÒBK÷©çíþ7ï½Dhòƒj†m‹|ÄòJÊ~/rùW/!Ž_¦E ½Œp»k„PoÓ(–ÏD[ …JÇ”þ”)"™`y–ü‰u„ú£A„—Ÿ‹,E˜Äœ5U¥ uŒ ™Ér�%#;•g‹åEÊ!ød‚KÅ"RC£Ž)±¸45¬qh�%K†E91µo—j3ÆÊ5È•féH5ƒ™Úþ×O>—Fÿhþ˜n±yë²é‘hèx#ˆ]½¶™‚¥ÙÔLÕ�ÝÈ]c( (Ì“†$K÷¦!P&³}2ø  „z<È6JéW´Ñ‚¥ïšy//¯A\W ’(ªœhÒâ9U鄯^��[÷®Ý%�|2†¹^qð¿kÜÖãþBß`œ™Ûoè½Ìß�/ô„¯MÉ4¬ÞÔWÔ¡6èðý¢5ÉSh”Z”#¾½Ù‘ì¡€âJ(b|áßjqÞà4¾iµn¥QH8ñWõüˆzÒ "Æk›õOýžÓŸõ€ TÞ1Ì,ºàZžy €ŒU±`±CN¥ÅïŸ~CÇ홡öÒt»‘JmCŒ|ÇJJU–ñ11Ò"2M ‚åÁm>xò¨òÍG´_m{`˜þ‹~m3‹¢?bTíàño Á¢B\*´·æu6ü(ΩcR„�n XÝý$0’û¨Æè…½�b…h»™È�‡Í�³6Vþ�3 ü GůzT”í[�Ó�Œêú­AT9´= ­�?©A@Т?=TåÞÔçoòʵ�ËÐdä5¨P„‰�í<\Už­¡­}ˆV«èÎ�lÑ84Í¢P>ôŒKðJ…ñÃê¦.âŽóúÀw`ŽzôŸ½ªP˜s¸¼IGÀÌ`+õØæ� 7Î)Át¥à‘œœx¿7fictv£`TÔuÚš“ެPZ �)²¸‡Í3¼ëmº„0ÜÍšô*ýŠ"Ìå¦Mð.–�~•Øp{¬`äÊ †Ÿ¡?¥«žúªB&FöÛ�{V€ºED¦}Ì@e”‘íä¡é›ø£ýRKSå­¾0ig¡à&MR„ëÀ~ÈÝ郋�›ŒÒƒ[”qÎ]Ô†è[:Z{±ã'û�d\¾§-eg[+[±¹kË!t¿!ùt–#Ç3zrÞú~ ¸AØæJ;Jûéç\Sd`ã~*š³ÎÚs©@'ó*F²8…ÁŽõ‰“S·]\ÔÿBCŽK¾—\ƒíCY¼NH™ÍÊOsg =Z+*Âu fþÝ“Ìy-•çƒÚ[KsÌ�P;�¯oß�zeÜŒ�Ó�üÞ\Õ�A©Ras©öõÛЦ¤(ð=ÅiÈr†L@ÆnoéäY6¸�ĺ›/„Ê{…�c±>ÝKù±%ÒE1•áƒÆÛ½ñÅBdäèÀ:ºµ_.ôä(˜ºgGµ»kæq–0nÂѸ Š»4T�ìj–»H@ÑÀ ²V޲ת#>�@;æ‚](¢Ók‡ö!PγS£>ábÕŸSMQK•¶š·_7WŸg £9»’FŠe÷ÍÐ-’Gd–Å®ŒºD¾Í0fUÙº.Ì}„Oguç� =[ÿòH÷‰³ƒDÝ/D_È2<�pµþ|ï@ã_êä/ª4Þï«u•i·‚SToïýÞéÐŒª|ÆÛŠR<ªEæþtþyãçI›ÅÊõ um&˜a/B¿t�ˆ†BØ©I«Ý>�î* ¤íÃÕ^Ë:ÝiÏrsß²¯×ýÍt‰/ÜñÖ¨Fc¾.$÷ÀÔ·‘}„–­Žröö_˜]ZÕ&‰ëVãËd‰Ýɪ)£ÅK&’$‹)N°L!¼`•ᨉ°Wneû>!Æö ‹Èjˆ•«ŠÈ¦F sÀüöâæ,´ %§/d‘‘y1•�œ D.ÈÁý/%93/R/åãæ�Ñ�¢R ¡Û[_)¶t�¾y×àí8%2eÕtG|KjÿÕHŒ·fAˆ³ºõØû‡” 1áÒä¬e…+„h<>Uy∈¥^,Cå Š¬ÍÖ(í¨é"§2{>¨î]~e�ÛƒÕmë¦WÝ”Éç ¸p í|Ê{Ú:Ý7ç+â"ÑN87v}†7Íi§j**à†ÆqíJ?ú¶„÷Ÿˆ}ÿ9Eáêà%4Ì­Ò“Pâ˜{ïe7ÑÔ¹s¾<€âiC¾© �;útJ&9ë_®ÐÜóƒÙ'-å�ó”¨ÊN9Ø�„Ï¡‘À§M½HÃ!�,Tõ–?Â-õ+ì�¼²ªƒŸÿXk©>•·{'£‡­pØ^Äv&wë"§Òi!BF«úÝšÿAˆ/·T^W}bèÅ÷2¦>êröð“¨w¨ps¢Ô»/¯îÓ…†É}OQ”¡Û›©Mo>G ’€+ƒÂ $OïÑLo»Ø>Ñ×_βì}½ž·Çqo(c1Ǫ”Ű7LíÁ”�ÙDtò@l«ƒ2èv?rÜyL®”¾o²*ÐùÞØ—Ëùå÷ÈߟúX@ÊŸ{75¶¨{ÑnY&?4—1¬¿}ÿAHº^9r ÂVw#.IL;¹ŸÉE+&¬¼�¬6§Ozfohn¬~.(VÐ?Ϲ,:ưÉýXê�:}ÒT[ölû‰ûz@OOšòÁð®zµ$üð þ‚:b"kÛ'˹=¶yJ l=ž‘빬ǡ€‡»3ÑYá2\1$}Oò:æ�<dÙPÝ ~§Û"•²õ5H´ª³Ón²’Ų‹3< ¸ò~Ï˜ÂØÎo#…ï“y¿ô¢ÛïšÛN ÖÀèæ¸$ñàc9˜Ÿ¬¤€WF½Œïú +û¶ƒ§õ‡Ù8|£xŠyƈÝüôðÌ;ªRŸ­Ö÷ŽÁÔtY²Ãó¼~œóob$¤ú#f¹d/(>Ú`,HNÜbRÒuqeù;:ºA¿:øœƒÆ‡"nÌå s¤´Æ£àP4Ns-k‚¦>g9/‰[˜EßJÇÖS¼èô1*ˆé;¸>ÞäŒm™üÜì”ís‰–âÚÏcJš“ö (E6xí™™•¹ÌqÜö�ñ ¶Î@ãͯ{¿ôâ(¾¥�šÅß;¢Ý~cR¸ædº0z (Ón$Éâ²€%Ž1÷ÔZ—¬°ÊFÕ«Iö–ñŽ=^._Ê‘ºi½@?eE.å�;Y�nÿÐ�ª‡¯,�ôÁ×Aå;kíÝ“©ráVRÛÌ�ÌÉ ˜ŽžÃïž�7 ü¶ ¿�T&A ó`ýu„M½ÉéÒþAEBù$í5&Ô Óâ;ªI®4ÿzŽ)ìD‰å°Q T†åKÕW›úÜ ßy‡¯Åg�’^³1_V$Zv¨œ­éæDÂ@–¹VÖ¡ ?ŒñohRkŸ5ñ©#Û‘ƒø·±ˆ&ú•E/¬ µAÔøk…T5²îu>²' @~}' R1Ïèø•�™ªæpÄfÑÿ7_Ä{«�‹§X­T ˺  âÑ]O}°\´7†kŠÉѬyɇ)½}‘ã{7|&OÜcŸ ƒC>l™¼%™á«3xJÍŽ–åqÕ˜G•%I«Èûë´÷ÍÝ�6eâž�tõØôÜY³Î¿;`nNÉî.®Qîö«Ï®noÎ:J–¼-�kíòÜ+0í PøïX¢,ËÚ|ÃO¡G ¸L½A—ÀÂå9µßLugÇÄ,ª¿aÆ… ì»z˜Q{÷0?]MEàö:WÕrLyªZÖæýÈ·2b´°ê¢�¯PÝfÔ˜•Û"o²C)1#5ÒAã�<‰39u ™?'Þmºb'v£�ýêxEªeÅÖ×ÀOÀ—ò³²Œ »Ã}ønÜ5}ošÇ.ç¯GbuK¤�uooCÁ6#Uú~PÙ–_ãm�¹F‡Ë9W¨H±\m‹ÖWwÃ�TúŸÀÆÛ²¦º-tú<®V¾Tmß(q@ì¨g¼ þ÷–9€>$Ä@2ÿ»êÊ�tçðj$÷Cæü)P(Ý#ŽÞ2 )s¢ý59¨™ÞéÝ2}îÃ�ãl{8¡®û_“®då �) Jj8àM'æ¸÷ uö 2ÝyOУÙC“žDÊ©�Ö/€t_ö]çhxCDà†ÌÀº0;«� :Y-¤XWuz&S±Ÿ¿=—XßÛÂËœ!kZâ¾yÚ„‹��ÿ+dÓdฟÃåÃ×@­+ÿû�‹Á1®s'ÐÏü‰Î?½ÍtÒ˜£_µ—] ð§)�ú•EúidG¡ Ãn÷È’szF¾i„ÜU<8@™RT²Sí~F½®ÌΩlq"^m°¿t‰û÷9¤¹Šî¢�–t¿KjMÙÀPx’›ÿÈ1¬Az)n¡sxc±,;;"ùÖÞ…±<\Ú‰¡rœ#%kòš¨;gTüŒÉTE—{ÿã— ³äåÚòl ö5· Gêàx�9EFTò/ 3c-e”njð6ÒMåHÐZhï+�êÑÔÆ‘EK¶"tò�Co"0uFw¨6Ö²å5¥î�.Õ~ϱ%EMPkäú0…cË ¡ÃRÄã`Á¨j‹7Ë�€É¥n‚»©N,­\F )›+&tÉ–Ãçk¤³yç(­ e"7Ì=Æd“¾÷Ví�p9ÆÚ+Õ˜�o9{ E"Ηz´AÛÄKŸÀ‰(._≅Ü@½"pâeK±R` …†-ž!ÍgÇ�øáMµ‘ªl_ž¥.m†¢¥ðv,Ï ETÀáÉêÝ–_v@˜å:Ÿº: jâ:žàeÞ-Ô0Ü÷æÑã^<ìâ µvÖø¥e›Þ …�À>ig¶ŠË–†—Ü{]™B�bí0‰NA]'±FêGp€ZF:e”Uè �<ÿÉ•ÿ�õõ{'´ÛÈNþ t†Y™þVtMFÄÎzÅ05îVµ§¨´‚VJé—«í8þÕ‰Vº¹…ÿT°Ú“»*L%€ Ù„6èè´tœ¥<`bà£�¬(S°¿QgÐÒ|¸H ÝÑ¥ãÅ-ƒŒIŸT�çkO…‹ƒh‡Iã8€ƒ‘ xv0@˜UÄ~íFKqfžG [3Ѩ63–èÍ0'L!ÉþfrÊ�É¿~Ó5„JÉ}½ ]oqµ�k†« Éë7ëê+ÜL5ÔsŠ�AS—tyJJèŒMM�‡×¢ºíä–o9ïÏŠŒÁÇZ~4ò0ŒŸ»S!<õã×€5cÛ,�éBþê”BÑ—ªÚ©èá}á5¡‹mQNs"(<üÚcÍ5ÚÞsœùzÿÑ =~¬‘>Cû%'zÊrhßøW1T¨Õ÷´â] ÁÆ|\ìò8[Ék2ÃYŸšh:LñDòêÀT•ÀRÙÜ¡ø�‰1ù~yóËüˆM$ܦó#5–צò;SÌñ[û›Îߎ»•ßã¿¥-8¾Ýò±@ÅB X{Pšqdc/m˜›ûà¥Q‚±Þå·g¸¥c[Ær‡©yuU½BTÐß͹4C¡§wWg1)&Ý'‡5`½ã¥[—]vCéX ®ˆ�(ª8,„ÍICjˆ4ûª2ýNωi%!„ iå>¹ì5­Ý©z!|¥eðÇinµží-ƒå7¯!$‹¾N:!î ’MEžXÞIž“•@¡¸öŽó»jÅ2úÙì‹È¾a:Ï�Sö:]“OíM"Ø6¾<¯|ŸîªÖ¥t«J…ÂÓ#™K¤½ÝwëÖµàf<ú͈k-Í÷òð2›ÍX‚o.HtÎ@êߢN×½IPyG_Ø{IF·ØÖþ�9üë›äó²pëÿà “fßo÷.Üï2~¢7©÷$SäP¿4?û�ÆŸZZ ú1Ë™¼ÆÙŠš“ÐS²EGoIy_fOäy$¸4L&v+\ðu2a/î•«ï·½…U-^¸aÝûÚpÿòÏÞ,öèÂi&×:˜ˆb·ô…7ïÐl�.ž îgç]—=¤Ñ]¸ˆôdrþ|–²øý§Çª�0F<…Wàöï5Ïup¨IÄä .;˸¸n‚ŠF,E7gI\%à9ßÐà Úµàq™– ö¼�çVÊû2™ø$Ëêm/u¹xr¯ÛF?w»a„µo�C‡3�*(.o2¨9~w‹W§�ê!^!\0 y¨› gù¯Ñtp<8ˆL%Ë?«Ž§Nœ%áp ûS>~C̓¥ ðÊQGó¾\ôc æ5‰;@·œ…j^¸@¥v;4�F»Œü† ú¤Nðƒi~,ḙpÕñ*鉓ód§Ú ©ª´®³“Dô#Ü2âß½*>çâÔ4†¤)Ѝ„ô½ÊBSÒÙ–P©¡Ë¢þÓÅñÊÖtä^'úµ½Æ¸fŽ]p�µ^ã¯/Ô�¿ ¤L�éæÊ®<­‚÷=>)·I¶õ¹·å>†GTÑåm![á¶dZdnf†¾¿y\&ÉZ­rÖô{ðh5+4ô[ûªÍZÇñ‘ê˧¶"­ðï+Q¶!–éÌe æÑ¥”f1hàÓ{î<¬*R>Ç”GÿII 쬴¾w"|%ýí¸†3‰ïÓòLbŒ]lC" s>¤¥&–�tÝê<+ŪÏ=Æ‘CEáÑÓç K .Røu²2ò|³•ÉÎGg^ ´‰æÆ0h¿Ñ/‹$.ñÃÔqwÔ¯’îÚÒµ¼lÆË³�+ÏÀ�wñ]¨p‚ÖŠœ$}Âï§y|0�›«Ù"qWe­lÁFiÎ è\¾îDQ÷ÊòmžÚù"5$§k€<Ú¤ 5û®ì2ZY²¤cWW4ŇxùƇ³mcÍÂ�…¤ÃƒøqàSÀ2”®‘ÅÙdz*†Õ�1 oKÃÔ]óKÒLÁǸ#çËu­û­×ÄÎáO‘=Ä•³)Ã^û÷FÐ}¡bÊê‹›õvE±¶¡,±7à3ð0ÃJ‹è§„"�ð…˜Ìë3•ó„Ù¥9s½¬)�&”y²*t<Ìhû«�Öó4E‘íë H=~)|¨½YN�¡ (Ö9Ùö4´¨ÐýW5Tv&Xª»EÞeÖ Ü¿ô9ÝÔ†ĺҤ¹¤ïyœ3”Xr`ˆÒ¢Î¼!cfÉ [ÚBüÜÛ!Æ£ù¾÷¬^Ð7Rdˆ¬OþÄ!yº�>ô>mˆ‚'yÛ9l;r烠ð0z~�ãÒÙ.?ª?�.yRM'y: Ǫ2ýg�A-¡½`­4aû1Eî«( ©<òîX´Ph°ÚRTDë4õ.!\“æð-ÜD?Lç$‰ï‰"M Ÿa�ç*œ�Ц£ Õå2-£Wà>š+n®g¨-3÷ ”F€Ðfá}&|O¬b K‹ñw>L!8¼c´þ–�ŽHý©÷j}rÈćhr Þí·{b,ÜÁCñ^w܇`»ù@ý!R‰L#…P‘ÜxåEc‰‘@´eêOÐmãa¸ˆx\‘ÎbP‘£7º”Ý9bŽw7š­é½ vÔ9“ûßüÊgWfŸFµë¯D�œÙDÒ'Ü bë5 H31 ‚$Ø÷�å�Ï£X�W(‰2jâöãÆ¥Ì-—ï)@ó)kàÇ ˆA-²Ýss×Qu(í øAqmC JÊQ…)ŒáW‰:@ )­²îû[ëÉŒåW¼–’„�o÷&ýIÁÚãHð�%z"l@ *®ÇË<¢Ã"·H@±Èìa¼½µ”o­‘ß Á0í„|¤ŸƒÔD>J®cðÎ37L¦�Ä.¯»‚Á�ß)ªÚCëLñRY|‚ÿºCï‰[ýgsí¤šp^¢ôaØ*h îãþ"‚¥·]_<'óèW3ˆX 6ÃM.¬ mjøPŠÛ:¤öÓ—q×ÒºGœ |"ÞŒG³§ÿ¬þGà×K4ö!XŠnk8\+>´ˆN´7Ƭ'JzòrAÃ�îúÖ†nˆ¹^V8™Ía;B¢ ê0<)u#šñWÞàsçqjO]=ѽÝ7BR&Vd1úWú˜¬ ªM3„âÚ°Âw·'‰L®¬Ò|ØC~Ž ¸‰Ùìe#yûúÌ{Oá`€à)ÜX�>…#°ªò‡›ê±:¼†J4N*M£zæ ö�2çHeÿŸñšÒ[³ÒÅ ü¶pã‚ßkç$Yt‚ ˜�›LÄf7]2¥¾�î‰ z/í©6_^|ºésÎÅ/ûðÛÚÉm”ÕØ™ÉÃ�ap«ë¤0—ôèÔåæÁGçŽÕƒòkX³Åù®Rw�ï²Ö—‡}ðNk1Ýæþ%ˆ3�uÒ|ÏÒ‘=j?ûSêwq ñ£L,  F߬_Ùà‘£R¡Äò¿þÒPM cS}²ëOñËeP£mK;öu#ýw¿€¬Ä�ð^zÈüÖõo¨s Ûóò :¸3°V,†[r°ŒpnêJ;\p?bù{Zº¤¶i¾fÓû¥½£$úùYb´p3ŠBQŽ6õÌò•Ó9™ jViUz7[ÿÏf i¤Æ£ö? AƽVÆütÕ^+þám¥ìÅ›jÎטÛ`�}ªÑ¹ÞH¿BÞ¡ò#ôÅì~¥-R 4oW"eÒâF ²ŽÅRBÞídWšŒHüô¥A‰t÷—‚R$#= CÖ;®FbtðÅs½T&po¦/dÀ"ÂùsàÐ ô¥œˆ™’~oø”Ïã<[íFÂt1µŠE>|Îâ7­6/È+Õ¬zt'üÜ.CƒRîM]ôüìÎdsö/,!ì ò0‚±âœ ó‘¿YwŽ¡ò¢ ¬H¥Fåöø &Êëį÷>…¼î‰ûD­âEKCwawï³n’ÍY\ØõÁd“sPêZ /N2ps¿/.S*›�0ûjþ9ê„”p.%q.E®ï¸2†ìbšŸ39_Ú8¢ð»q<¹$£â{ŠIMP·š£3ÄQ¨"oŠÑvÒ!Ðè°å„7+½Nôº.Rv|[=ÈËëÑE§«±fR+b’ýC�¨­ŸÍùéÆ ¾èn…¿£§KZýš�Ûƒ)¦EXøÑédz¶ßÊwî±}ŸýnkïŒí"óÛãBTÉñ×ùú¡‹J›,ô+EšyÂè�,Ò#õМ «1´¨»¤0$]å¢[éóA'0ËaC Y_• ½D…æ�¯ê‰êñôƸêåêâSMc„²ÔëqïÍó¼ÄÊq=‰n�½P$3öŒ=VWÏ¡uÞØÞ{¤Xœ¦zîúzŠbÓk·9tßueÍFÚù�%Ö¯»ŒpÆê2Üî¿ßøŒmšƒ„{ïPªV£öµP ÷«»© œ-_‰4Yuw�Zñ–TÃe+«p¥v ~¡žë5?)0æo‹¬컢ÂI·µû}:nÿ]÷­éµCùÙ®ÚôzMàC÷›ý½E©v죷¸|‰bn-)ûé«ÓÓÓ!é<°šó¤kÉÕ¦�*‹SàÇLyÑ ŦÎg·9æ³è«÷×>Õݵã±QSýV tݶ1–KÇ.y0?V‚5Y§¯kk1¶Ðt¶F.¯ÚõärûÕ—'&Ó!õñeì6V.ÅH«7×&L+Ÿø–:Aã�Ù8|{…’˜ag]oîüê;bí‡þíÜðzؘá6-Þ#¹ÀÆ‚þ|žGþ »o0´ŠºnÝ$úèîµàŸäœqã¢Cwîr"/p¬÷»5 D0Þ¦©²ýK¡|ïw³”®ó öD±Æiáö þ hzÍK_µ¡¾Km�bM)¼¥Ê‰¾ÍÂÞ­q‡»Š��FŠùëÑOL7Ʀ[73WÆûSϰ%ÓLk�¹Fî„Ñž:�. 1F ‹AXÏ!ûv7ü¶Ýß^Û(¤‰¯Zæå¦)~?Œ�«sç|©�4“Aúúõ){%qŽˆ;"þ¨Y³·|-hŽìFf”"ãÔ¼.wÀõ¤cݼ%ÞU÷¡këÚöäÀæt�WáåÕÒä EŠy%Ê¡ókêÒÕkÒ  ø±Õ!+ »‰°˜ê·c¤óÆŽU‰o&ka¤Ãy±bßÞ !©Ý[Ýbº‹þ�“Q½Nw›E{ÔiïúÄ–¸”WÄT¸RmÕc™mX'7uÔ¯þúAŽË´zèÛ'…‚èÛë{p“‡ïI_6¯|¸ÜɱHÓ §ôM½Ó¸rËž­QAš"Û‚¬ÙW-e¡í&ÎCßX” Ç{Ø:¤3(îÍUòÖ˜Ëʳ£š �Ô\X‡#Î/Ñ•h³qˆuÎ&Ôk!Ü.-yŽ–òì;ÓÕ!í-%³†è/bO5é/Î78#Ø3g( Þe|¸�Úëøîضžà¥@Ûa �<¸DÀBaêŽM]ƒo ä©ÍvfÎS`{v¹ˆKsÅ¥A�–�ˆk½mæ¹4ªÃ|‘I/��(mý˜ ÚÅy^™–yU)�‹Èc½m.$ëù›ç€Z÷áŠ/ä¤ÒìA>rmÇô:‡2^ò’ʵVï4ÄÅá†ï²ß˜Ã®£dL:ÆÉ�õ@ªî¼ú§:·ÿ7ãLáßnNßrJèj»õWß‘F[3 ›nzMq<>†Ü¿!¶…iâL×»�Xlœ †7ŸÏq[ ØB¼qéÇþð Ÿm»›ÍÌ…íþ3.úPç'ìóX¥ž&Sº·ÙIŸ޿Õõ$‹8ödlÞ"†fî%ßäñåo¶ùbÒGšpUƒ=Ì]êc2AÝJ*?5¦±¹]gòñ¡l6óGE±d…€7FWe”[Sa˜g‹ûÛl/{n�l7HùKÍï‘ðÁŸÚMñ¿Cøaá oÙÓø5'ÀØÈØv®xsÀé¼ê‰�ó E Á3êë­‚uw£ùq`ÄW,�+6�œ��Ú…B/÷-õpúÇHÌ~_ ‰RlÇýyD <.±ciʯʫ2*µiÌÄÔÄ�„#Œ÷}Ðöü Nu _ŒSmÏFµ¸&…K5]êÅšT>&ó}úÿ0öϱâ4ÁÃ'zlÛ¶mÛ¶mÛ¶mÛö9ßcÛ¶mó>¿w÷f÷nÞäîüQéÌdÒ“žªOuuªR›ŸÕ’¦Ql�Èy]«´†ÙAha°wfvH EÄx,V=ð[qéê�ƒÉFC²¯�F{r{ižá"{ú$‡ë—6bȶAk�Í\wcpu3Õ8�Ÿ·Ê¹½ ¼ÍÛ…úÒj#!Lìª6h†ÛUôf®Q? 2fþÇ7}“’¡þˆ?1½Ž�Tm«,«O»…PÖVžI0w¼Â(lÏC„Fjâ¼(“?Ï¿€¥ÿ²#D¸L—¥Šòl¤¡0ôÌ0d_•’o¬iêÃV8ÓóÑ?ÃEÆ«6ò¿P�ÜMu9NKé]ÓÓG;žykâ¸yú{Z€ª)¼(É=¶l'¶a÷rã?(´öŒ•´ýY!Kd�–¯‚ >[Bl¡º|R`DQæË~A}Q?×>ÉûôYÿ7ÉF,ÿï’�˜9˜þïÉF×é v[\HaùwûÙ r�K£nH.��QÆÃn¹(®mî ²±Fm(•‰v=smî_FÔSn4äÝ+ôèd¤äY2ÃñÌOsÓ[³wört±†Ñ³{»:.~Þ%‹ˆÿŽ˜ ‰…/m=ûœ7ņìÝ›÷¼ì¹ÉÿT‚Îú²5ˆ—êvr$Û™¾õ +5”0NÃ5²NÇ>�¿ã³¿ƒ¿ È…jç£2ÉÇLØþ¤•Í)½¿ª t1ŽQÀ9mY$ðÁ/À"Epºcp òW¹P^‘‘'‹D˜ȩk¤°�ït�o`Ê /dxtX‹P¢0 Í!5s$ÊM2VÀN7¹¾{ùEîÈr“óó9ʨsK¸�Ý4Mùùoä�æ5¹‡@ok¤vîw#áaïr9$†¼ÍÓ�Ü“2µÁݳ×~1«üWO¼lsÅ—¸ªçvSêª�8ˆ¹f1¢èL¹ŒÁ¥×q“;ËObÛ,и:\Zй¢‘Ùb´Éì[Æ!dÃR™3à²Ù=O»œÍ.I(á”[K¯ä[˜sàªKòwÝçS(§Î7çóéào€Ê¼Op."QÓæ&kz‘�>ìÇÆþÀ@èK'IÛ;�§­ RuƒZÓpE-£{Èiþ”áÇH®ÿɹÿ¼ôåáù¡Ë{�ÙMÿ3ŽwZ‹aöt¹©ñ+¶›¢ñ*-e;’le|ÝXÞL²çàÊ= e)é4˜^É œ” ²ÖIƒ,KëÜ(Rò'¯²X(M ‘ýg¾ÁíÁ_ÈŹ7ê(öš!j‡ßÖÖ²¬ú¬EøUž­ðƒÅx.ÑòߺJ7�€¸ÛˆªxoÛ}æ(¸öÒFÊM0TÃN7»BpX‘WΆ”¢I wúPIýó}iŽgcùâuw@y$ç?lR(ÚM»âòn§â{[6¼ÑDéOMOÆV³|çb˜Cú•~âÏœSu�,£R—{˜¯]B&žnzÇïÒ•›žh^¼Æ�aþ/�Ș`®ýšBéu–!õ„X>úÑ·(÷ eŽù?ñɪ\�wÍô+p5u‹9:ã+v]Jï¬z²•t‘ Ó´5È«fð¥"!BNÓ"�5fzs¡<¨.çížõkr 8¹#�ÔññÌ.IJt  G_Šý2‘p<;œ™8ž:ﺷPpz�íòTv;ô [»ÝöV?q(Ã'jbư´½É=ßá„yâ ¨L´ƒÎ0A 8~¼Ú‹“ÏÖò¼ó�SÆ²Ñ Áñ#ýOùÍÇÚÎúDiƒ�Õ"’tfbÒ™r$`÷Öˆ3CGšb¹·4²]ÊJ{õ[,,¹…4³ñ²kdÓ[Õ½Q›‡ê0,$ˆ|†"„j0–v"1d–]P‡N:ê¢@«^¶8fÇÛ*f�‡:LÅ¢aÐR™1âf²}ÌÑø¢[K/ ‹FÕyëôañõºÞÇùM1u±?—=Æ|þ:œtc66Æ}ÀU¦ã”-}Ò¦¹Aª!ý?æ`’Ç¿\ÔöŒ;9´C)ê$”ä‘;²ßYü¶Ü-Bˆþ%Äçþ ç % nŽ„O½º*{;X5èRîù"ÜÐßh9‚üo“R+Š&5FYh2Ns³È,¥á[žgÉmùƦ—kÏ›;žÂõ!D^ ÛùÏÕÕÍ% ™UïÉáÅ.òTײrƃßv¡›²¹µLÌ ht BïÆÕz˜’gß„ kQ§á$ðþÇ` 1 LEß&âW•Q0…ELRrrÝ»$U�þh›TŽ)zNÁýÎF‰Â¬t*]�oÖ¸Ù·'ùÀT=j÷ô…«_—þ®$,j$,†Èp¤l¯XØY”��kÀµ„áÎY¯Q߯’H]1‰4cpõ ¬Yæ¢WŒZ_ÛûÌð\»_æƒÀ"³’•£îúç 'Ê„U¦™¶%‰�4IÕ¾VK ® >6cŠi`Y t3-ô|Gßð@s¿«"aÇÂVóÆ¡h´Þ |ë:HBV¦Ý1'ÑV1w,Ìqê8 “¶.GñD¿oÂ=ö9¾î¿Z¦î ûS¥ýÚ+¾ù¦ë¡•ÕSûs!áØcÊ÷ð(Wñ< 5eNaª¦±)‰šìù?pê]ÝH‘¶snÌY î±–rŸ•É�F†À Ê^Ìà+VôìÈb,•�“@jßìoô¼=ç}£SéM˜Ãý'<˜-2š9 ÝêšüÕPŰc©ÿƒ@S.ÎN: Bï!µF$Mz”’ÐdœÖV�Iú¿€×‚ïÊ�]ÿ¿ûç-RMîô™ñU_Ý\¼Ä“Qñ�^í.Ír'%m;Šýa½ëèQm+Û/[�سyµaŽäÑ?aó�ïàk N™ƒ1Ý4¨2ÐåT¥àóý9¾-â=cš—Ö¾A‰Ï7V¸¨_Ï Îý¼RkD> å­Ng¦¦.:ìâé“ÝÎî¹ZO¾5�+)üÝÒðÉX}þ0ð *Iß`³(ã-«ãìÒ’ýð�7ê‰9öy¸—ᔬíN­/‚£¥”¶ÔsŽ•Nl�39“Àvhš'‰•0%#7Í©´ ¬÷óýlyKÐÆ�c’êŽ(díõa.­tiÿG²O�U)ÆÖê7æ:´TáVÏW?Ö¿ÿ4-ÃÓPbôáû?UMýMùÀÃí)~ér¸.ÂRBEDÌ1•zc5»jmuÇ#óo�6¡hž^Çrêk{ËwÉÝíÛºÈ=ÛëÎýÞýÍùëç?/èA曲™¾‘�‰4YiØl*‘3UýwW’—ÜÊTÏð–çáš… pÙ)óŸgûÇÈ€Dç)ø| •´a!á<�”è– t! C|Ú$ÃÀªqb¤}l�jG<´˜¹ï1øbm¢Ã/0éøŸkžZ«ÒV/Ô¯sƒMûÿb9v®J;Ü Ë¡ub Rvü�™EZùOfqHЋpÔêÿÜ.@ìêõ†ŸÓyÏXØZe:”l.2¿e‚gírg"º¥%Œœµ¡o ÿ�íVG]�]hÄù×m Ôȳ ôOGBz%û`"ápv$;y"}Áõ`¡`›çÎmö ÒjäËóC‹�Uo·õù?`Ëš¤A%éSk¹VÞM ±íz>?c;rÏˉ~l€}ê­;)k³;Xã‹èd%͇!ñ–c©_mG ¸E…jµJ;IGn…%…»ó•¢ÊŒr¸G&×\ÒIYüŸ,A5\_t$ûðX‘bl« vgj@Oj÷|“uôcñêÖÛe|Lˆ9úÀŒ¢ú¡|âåò¿r=Xe-!�""â˜J¹µž^µ¶þ‹.ø@cH.œf2¶ÿÙÜåVg´×{îÎõ{+Z½Öä9xšå™×N‘X¯¿iÏfNUeíM¶“[�lÜönZ1¤õ‹!æ_˜uèJ¹ˆ�è˜]耧�0+&œÕƃÛt…*fü?d�m›¬ÇK›qœLÁ÷|ýî!ß *Yé_ࣴ=góûÁ]W:Z^Pn÷[ÎíцìxÍÔµH•‰Rw9÷ÝC\'ï`£[M¦¶„­^K¶}ç çNc~èc[CÝ-'1f%ÕÎ�r^UÚ¾Œšr_ZóO\«"¨0¤–�þ?s©‘zÅ õüß™‹,”(ÌjNÏæ;Çìt›+„@ûŠ ~(ñè)lÿ�;ÀÛ+.°Ð£&µá]þSî HÝú $Ò«´/NFnÌýÑ ˜1½�Z&%ß²úCbM9b;¼N–cí²@½íÌ §^W(`k®�…õ»G¡\øw.ZÏ×gé*æÕÖd!6‘2$}¬å`p±¦j le8r„0œ¼BRÓb'kr7úþ­33%.O ú�W¥ óºÃ ?Ò—ÎЉaï\j ¼B2âÉÅ\G.åÚä2"ˆ£­Ã}’¶¼4gúv¿ŠÛ‰™ž·91G~‹.Xv9K­Y§®û‹|nʾM�´QCÀúD¦ÞV_¿ÍU„I‡úŲ½k@6í�™šƒÚWˆ*ÓTÇAáò‰·lDyœ­{lªçt2Í$ g€æm彃õÔù>� Oã8ãm2ÜœRn`D‰E§¢dI”A# ñ’ªY(;N¤$k¤V.bIý>Î’�˾,¨D4nuM“ä³&µ¡�¾¦´©“\§qÜ7raŒïcƈùw¯iZö® ?2–hæa9s_Êýjä„õ`v‚E¿¡oNmžAÃ^ü°øs(¯RªÌ…þDÌ-ì7¢]»{^-ûÒ´µ¥GÚÃÒ‰”^yh¦s¦�\Áii¦£-nž‹`˧[µ¡“ê£Pg½7ĨÅÅÒ3D7N7n Æ9(ç=- ;á‘§NÚñ¬ÏÊÎ�™Î]žQ;Ô¹hÃwrQgA¶´-cnâP$s½pÕévHÀ»&· ò¬Ãí˜�g}ž–QxN®SZQQÏø¾<›» ÷¶ñEÔ½[?×-M¼ò�å"ø" 亽 HôÃ�ÖòÔþ&žrGªÿJÞW×ËŽÉ{9õ„ïžìbõG8ÁÝÃÎLìãRõµ—’­:1�w#Ä[,bKj[Ay`ÞžÜÓ×»ü­§W‰‘™Q!UîBwªÜFÍ×oH±FP:!ö<®éK€aÉL™å£ÓXEÙŒn+ï· R7è•=ÍÄ…Z)ÌŽ ×Ô/ˆÆ(柗nrɶ˜â9XÑßÈ‹òæ±¥ró§¸{>ϰÌô¿‹™Yÿ_öffdfûÿ šÿ§ð8âÿôþ6"àË©ð=³{šˆº"=B9#aU@’UBsF¹(® ù}ËÕŒZ�¶µ¼XMò!i?˜¾íácNÍÑQ3ÍÚó°÷‹kÆÑë~?óÎ�M6¾[›ÍfáõÒ|¦œåÁÑmÏ3m…Ÿyk ¼²L•¹¾+¡â¾³�ÆY ˜9dj Z¾ò¯>YªîÖöîZÓ®?aøÈHaŸEˆÇ?˽‚ÌÒñåW›/uÏSÕ:6ŒÌâý8Økdû×ISfšÒC?´¥ˆUëþ”ÏM@_ÞG'ßLEɾ»Ã-¶»%w÷xõÅLÝHÚž“�’L¼–‚Cz1Sá$7æ+KØ› ;¸S†o©›#›åh¿SD—:‹öãÒvz–§ítf3±GÃùÁÐ#æ`�ŸÁ\5†½0øh³“uø©�¤úc”5V Ý·ž Z�Q³2Ì©#ÍD—k­?ÿÈ•�VG™<Áâ,þß4W‰õåÉÉ×n(½ë6M¦É)Õ„ÉT|²½å„TÇ6‹Mó³`õo.L’C=úgÇÖ˜a­Ö6FobhwEÉ�؇»c‡º,MF9$¨eŠ™Ãµû­:Øë~´Þk䨭¥÷úò[¾~a½i›¤h¼ŸQ =x8»é7±¿“€žœ n.�¸sÿϵ�œÒEÞ$ÁÂUkî¶b£ª€jŽ&Ê%©ƒ« Åå]Ún1í&z5Ïݦm"½X§qSÌDômlk7•ޠוí„#ŸÐÌüf”}÷mÖLÜì ôtÔ,MõfÏи�³Lë0>Kš^¥-^ióáúÑøøjMT_I�2Ññ~» _ðajËeÚÌP|>7«–:a‹¤V¾Ô$jÝ‘¾.Xx:›ªÈ‚+ßì�L�&£�²Ñe«™E~Æ0]=Hó©1|Û6Úf§]Ö€Ð{ú ml ’^ÚfG…"Ž&vˉ5f™j7X úu úê …‘6²ŽKEû´:“ˆý¹µ�ÕÊ1Ê8Âð…¸Ë¹Ü싚Vë˜åN‰ÎaoúU§ÖK)o!³fqý¶ì�wÖ¢7¦¯øhøè©¥'Ï,`ˆûj*Õý?Š—cÒ^<ï[¸Ù Jg«bÓ·¶Í«Ç~ÁÞ^Ò!;Ù@µ=àB×Pì„Kvõ`Ë(é®Öd©Fz2Úí]>1ï½u¡ëçëoFúj1Q‚Ói6N!i/v¸ç5ÛÞx!þßVÊ<Ùl{ë®eöõÛ¥íäLo«ÑQ³áÈÜ-ÇÃGvßÒ3×déÛ¬?wK´‘–fn•–ª®�Tq…¾Ì¦ë%Ö³%*°_Ë6ÃÝ=J3ý´‘ÞB“VÎÂ.¸Õ××üíº¿ mk‚ź5Gã÷šL¤kÓW.©™éÃ*Ðu,µ²V;=]UK;km{2òä7Ç,Ò»�nÂfGèÆJ‹×?ªêÞz MÔ�­­×Wó}S`ßð„»Æ'<õ®áñfªÊEãíñ‘S>ý¿ªõ>CL!œŒÝ‹†[_¥ò8n½kÿž8Áïžl©ÂsïžpÝøÚsïÎ��IƒûÎ~nÃI"SDÿ�ã*öSìÚÉÞ’³Yô¿ç;;ZÍ#>—NvÞ»Æ ~sàüç’¬×IºwíE]·3ù}ƒþ–‰_÷Vp{¾�ñz/ÂÉ{âwûþ„{0*Ôûðå|q%ì·/ûÓY`K¹¿lÇg¸Šäž|è—|ÇWxDsWì«¡Áçð2çbĺŒB¼Õ—A{•±ä?ÂfzÜq¡ä£4äfRg+÷•D x©-—¿£6†º;OÎr]ç{Vð•z>’ŒŒïÊ`ŽXa Sð¼u�´ Yù ‰JŽxç' LÍ~í~_í¹¤úŠÈ\²ÓëÈtÞï­Ñ(ô¥éþýv0ƒ€~úFìÐ#ðÍg8 ¸Z¹¾B¦F>ö¹[µoz¾E,ÂþnÙV¼P _‘ßWí d“ÀèP….¦Å*ÄÑÁ°Žv©\(^ùÔ–ºRªN®3€æ)IÜÕWøï¹ªÝæ]´‘Y-ë.´~”oåx‚p´ª5kFUXYýÑ#]gš[.OóoÚã<�úTc�‚í1(ËäR’†ó·¬î:Ô]^CQÞRÞg¼p×îûýYéÎtdÐП­~$$d Š9E½1åƒo*Ø—=¡¾¦gf²îh™~yÃQ>N¥Ï¢gW¨;Š{ÚÇý«öç%Á�…à€ù[¥ãƲqÒ á¹Úƒ¹Áqg±¸é*>ã•Ô¾RRqÿ§œH<ÆÅ?½m¬ƒyÕÆ q!¥)p¼MáÀTTV�ÑÏš2@ÑbŸrÊJÀF�@@ÉIPö4^!Á¡šÔ‹ˆàä3³ Ÿ²UÃ+pˆ?ÿî>@#@\†79j.‚MËpcF“„½ˆä8qJÉ’òüÓá² ÜÛŸÖÝ2S£òBlÉIÞ&5]<À¬ôd1ÏÆi½ï(;·™Ö ¥4'±�zX.í¼ “¥­N­Æ.Ê“,É/À"©4øbáÀmB0ÉFäÁ"àÌÊ UP=µ¯a¢³o|¥D0Ð=ZŽf¾`0ŃsO +^LÉÔÕµNÆ…% ½= �@*ÈK óªzà ¹4ß gE£*›´Í†B€Iy�MˆE$€ŒIY1Z¢6ÿ�Z0óec4$ŽAM±T†G½/UQ !8yè W¯M\8Os] xï7º ]ÁšÃ GÆáá ÑåÌ5.°\,¡O¤àﺧ°”äHÚj%cŒGEb_–|zñM�Äp}À&E0qÍVMȲ9k|Ì2£ÜVÄ„´$$8ª„ºþ�õAJϰ�šÆ3­“¡@€Å Š^öïÍQù}˜¬HlØáa[û«®lŸÈ´3œ¤H„’†äXÙ)kðË^—Þ2¬ÚGð¤ Ñ×fàÀ1çŠ3‹G‰�ckPÀ¹žð ÍRYTͰ. mkÒõw«Ž´„V-™´v%y §Ú2ÏæYuÆdÞàòJ � å Àë²ÞjÌo…ßÚ»•8OÆ$ëµ(s9"ñuUxtø¿¹°¿R°ÔI- Bµ¡ ‚4,ç„þ¨'ˆ˜õa‚Š ¤ }Çs ”fcýàÀ £�õD®rÈG}Ci#i ÖÒ îj£`àÌw°AÆa!¿Y[ßô-ŒâŽM†Ž êM(6¼2QYëTŒ„®å#QõÔÒ¬ý+£š(˜’UL(Zd>`yg;Žtú”'y“wÿ�ú¶6'’OÐßp?LȲ­ífï· §¦`˜”�~I4`°0bêFò&“q&§�¼oI?yTú™Þõ4㻩: K´èª$U׸¤ïÁØšJ.€}µ~?+~锋lpÕ!~y1Òê0é>D�K:WQ�”F+î¼275Ø"—Z$Ъ§¨[ÃÑt6€ªÒ25ÍB´ÍªC5Í‚ÝÃGg*;8ì8ÍZ�Ä‘ƒ‚(`¯OµÎPÕË&WaµÖêÛ\ö¾⻾¬¯½—bÞÃÙà•ë7íˆ7øÕì³³æ™+ϦߤŸ`³/ú´<œ”Ë·ä³^=¼þ}ÛUò’×Ó©“oËWæ·ˆŸ «Ös‹^�¼íiÿN>þ\}NZÎíÛ‘³©¯%»gùïÖ–B ¼>�¼Þ_§»ÖýF¾¼þàÒtο¿—¯öæ‘—Ç¡•µ��k›Þé&ž¯7«Ÿ‹¯ö—ÓKJ§/œ·¿¨ø>ÂÏ”‹kÕ×3}S7¨ |ñŠà¬ç °3pŸñ£ÿàñx–vZ–bß7Ü–®Ë’£Þ„žäÌ=ÅË[„5À}ïè¥qä¸3û߆ØàäžÆù9±§ÜÊYô-t ›pѺ¤á‘qvä1– ာ¨AE"8 »�Sä/»Ì9ü�s8¥0Ö1Ez �«¬Ž€ïDMñ¿"·#v$¨Æô1Øo7rD9Âh§ƒXì¡{@.”&y5¹L{Þþµÿx\‡÷t{8)þ Í?¶aYùÑßXOÂ�ß³ÿ6Û˘íeÌíâüÿ-ςݡ�•iG!Ïïtø³þãØŽ¾íÙó~uÓ¨›L‡£ãÌÏWî}TCÿ¥Îr0úžÅø{: â†a¤*ŸôÚÝý¶‚sîÜ[òO²Ê‰—î¹¥ùl?Om‘ú»ÆÃI?¦ÀÀ=Gô§Ü -¬•ÄëT/öÈ�>@Ñ”ˆ%…ÚFíJìㇸï™y?0tŒ/÷®Ù£zn³–=ØÔ&/óöEb;öG:#,?t®èþ*ù³Ô+ÙùÛ‡¶“‚JgY¾´?DýPIh–E^mä†g‡�Dl×%i2 4÷„t„ØMÏžå*ó½¾í° IC€nTz «Ê¬ŒŠÁrB!ù—¨×ÈÒ†bW)ôc:Nð±À!°ÛNð¬.è'Ší1¶ †ÒäZ¿/V#k¯ª*jŠ•íŸô…xñÅi"¬ S`E Ï�¸¯ã)’^a\Å:‚ŸD—A„>­¥D‹›#Ç„m—aæªfYX|Ø©<•®nö4ï õ(cÿ¹¶ÕòÈM�¢ÍNl$ŽCQÏtí�@˜w…¼Ÿ‘†égØ1%¼oºôÆ«€R¼@’ç÷›yýtîÁ0࣑{£M, #Ë+Áóƒ·¯e+¥µÔ¦cë—>ç%ö ”Ô¥…:Eïº5¥eZERQç¢e<–M3S/h(a±4ÝX5±ÆŽ’(�º§P¦Ð¶Ð7k^9¹ôòÌÒÍÍÕ™mŽ^±ŒºÝóñß =îÐÕ´ÔÎog­ƒPàXåXìdµme0µÚ~r19ˆå¢êm«¢«��-Jø×®“ã0?4�)©Iy¸%·rM È2l™ ´3öz×@³¯ç¼f´Ðæ†=ÂK+ï7ÜTä,|I2Dà]›Êº,¢ˆ^Q^”ÝUCM“Øÿ-Îõ©ôQŒ¾‰!è& ÊC¿½Òá¹�6¿ZRÔA²o1�ÁL+EHƒš@€|nï(eO´Ó×n¢s x¾å›d,¬½Yæ•uÓ·[3—ŽßDž<1`ãæëزɰ"»{W ÙµÉÊesh]´ÆÜÆ€² þÑ•_7ýê¯mwÚ¼ò‰²qÏÌ-k­×e)›)D…uG²ÅŸ•O£—kð77?“‡ƒ×ó=R>ŸýVýšýTïû/¿Ç&îàáj&}代5Gw‘Ú*ž_¬Å–U±/߆íéåÑâ÷àÛªù`ϧóÔÔ¼I‹–+‹>�üíI¿nNþL]N®Ýûáéu·»ñ¿`äGDõú}äñù%=Ú½4þå�æßñÄÀËWý^_.m]:~]ï윹ù“išy_îôlÓÈÇãÑŠò)~œ³ Àjýû;v‘|欞©ÿ¯ªYy¯ãq'Ä,h²x¥ÕÉ(çX"¾çì$Êd³š|yŽšú³ºè­†8-ré-œ#®Vi;ÇΕÇâÌ,~›£,�ïuró‚�Bœb�J­¢á¹t–’2¶Ð:P½‰F kUS¨'FA%®5M¡™¦5Lª�þ ²Èã ÂS£Ç�ÊGvUÙ$˜1’åç>¼j#ÖŠbW¢J "ƒÝv;wš…f´õ6Šß�£Ç72Ù“‰ìmÊ×Ö”ÍÍI%ñ/Ñëèâ„0. ú�PnpßG=®§5—ƒzn'çï ”7v�rD–¥œ8 êk¼Xz¸÷Bî;B‚ 'êÆ€it…«Èò®Ç! Ÿ9œôÒÿ?äíí¨±k{’ÄHT€¹H¬_Ükù'Šàa-©£c%—„Žö¼>$2 "�ZU±­¦}îØ®k¢ìè¨*¦Ÿ'òˆV:!�zW�>Ï?¨©‘ik ’ 72~">8â£SŸ#…Ö' ¶¨-<oÍËExX©.n��‰Ê˜I'×`KmþCÞr'´Ò†®Éà M¡·r÷®@YÁ�&Õp1 Ä·YåÐ6cj /+-¼¸Œ+õ8X�ÄKëM_˜ø‰-z°°]†ï?OÂ+]¼5’®&ÙsM¸²r�­•Ae›œ ;§[©ˆ 9èýTQÙ¥ ¢÷*Ú¯ñ¦,­éK1d)”míÒ�j:`¢Ð…J­”7äCl…#@ó«–<«™ÿx¹‰Ÿ²+…Ž@ ›eÔÆ[€Ú2H>)dƒ»Œ˜¸(sS.m,îÊ âAž6DHEQU\u >ðÏõÔøâŸâq@™Â}XGŒÿ¿8R|? ÀaL ÇXqEkÑÁ™€�`´ŠHo”õ¨W k)Se¤ mB2b$;îçý: ˆ”ÀYf‹C�•wЕ©p §X?Ã?iaBß1)CèÀñ.’c>2ò76ME+V~ÁïZLwëR#¸Á÷ÜO�Û8 Ò@£Iý ›Í1†QG]"¨ì3ÀG2"7dò¤ˆ°…�¸•\£´s‰¦NF”!7®¼1¤ô‡Ý 6ax;„ÝIa•Ö~_¾�p˜ žsc~\x`YF—Z½†u;¦1/q¾Ã9[“-àŽàˆe:ø&!³T•)„J‰…¸xž€øš³ææ™•¸ÄkŒ‰ÿKcB Š¢Œ @Ña|`Bf ²ØŠz /u8È ƒ¬M ˆ¦wd2eÚ™�âgG"Ž!×U Dóµ�d AXßDhí4ª¨ˆš*�vëó‰}é˜@[ðka¿Û€è~^QÚIM9ðòàšiKöÇ×’(@¤eô†Ø¥îÍ ¤€/.Ò]GMf‹¢É‡Š !¹™ ÀìD«¥Ð¡Ó•ŽšäJ̸¥…ì|8jW»pü«{P\¨Ý¾lk‘}!¸]€Ïè“�l�mÔå'³X“’¯)£"6÷g¾éP¿þCøóê̤wçðú¿~Ô¤k²h�*â,è9žé’ŠØ�¶ ܽ� Šz ­bh$V&#tE�¸–.;ö“0¤Gr[Bÿ°/ìÖà�½j6á9ú2¨�>ƒµWŸÛW†?t¶…hÆÀ£ÿ>\ th-Dú…bª €‘Q�­ Õ#úµDpÓàžC$�ì ˆŒ)àñ³p&¼!W Õsýªõ`9Ž�ÑÖTׯwˆnw —5õ­!ˆƒ©85ge!EâŽØ 2åß�_ëÍh"ö}†ÿy:[‚݃Ÿg‹'² ˆ'‹Š4–1�ÔµÿÔÖïzU’¬ÜÛxR34‰ ÆjC–ÉŽF¹ÜOŽ¥�ÙæLžC Hìµ@ÊkI±ý2®ybРgÍüÓé—Árúi�xøAïîOÃFn�zö ))£Y4¶,†Ä|JŒ[7—®¾N_WÿO~C»w“Ïë£hXáš=ûVö3åö¹w§g3Ÿÿ+SÞÐaóÎÙÕ‹çʯ?Kù÷‡Ý×QŸÚÝR£­Œ§‡Œâ¥/>ŒAn'jaB×}WYa!~ÁÍK^ ¨W�‹Ã¥ôY²}ò„¿ “c˜oç|¨H†€Aƒ:»Î›ìÉüçC«0ļŠ|³�ÍOÌi *ÈD±5Äø‚šb³OE& ªõ5^9-hšß޾©Oç¸ÅÇ8S±Fkèj>]+L­äYð‰Ú7gçžm%g*Ò|«Û0ð~U—¯ ¢( Ä~cðjÊ”à¡é°øL¶W‚eŽ-Ú’½Ïú؃ƒ7{ƒ*Œ-�%íd}_Û tWÚ˜ä¿3}+©µqÁÁ’ÝÉ•"#ÞSÑZYhF“Hl–É÷}Hh )›Ä“D®8üZ`9��ÃñFA=ú®•ÓÓ¡ÓÛצ¯÷öhø«[3ç ¥/þ¸ã_»ü¤%r�p“!X§ª Ä >?üwED¶­–üé¹�-”ӒN‚m•‚}‰l™á!¥�¬ çUyAvK`#Ó£€Ý£rL–`P)~¶ókæ$ýÊ÷÷=…ÊŠì2E]x1oiX” �”\Õí}FÔ€ñ>q²�Ù‰ÄQ­‰)",{NN–± éÙ�cÃy<ïw`7hJ^âpø²;¤ÙCÖ¼iyÓ]ïû ¾‹Â~hü�¥Ûs›ö]¾k¼œ|~mZ;;9vn<»lsn«ØÈÇø 9û=�ÿn+Wñ9Ô^Í5½–ó®ãüÖ¯åÖªg^‘Dï­Ù4¡ÛG‰ˆ&¦÷]]Ä˯¢¯ÔÑ;¾‘ÙÜäÓæôzÇMŸ>o̼“ùN< féÙíWÏæôF�3¼Û¾|þñÕWeW°îšŒ:΋j>ÿµkÛÛ˯ÝÕñݶ]ï\Íá3…Xıg_ýË�³§ßÕ©×ßÖÕ­ã/ÓµòÛy’ÇgÛÒý1C-ñL=XûtÖžnžo¿kSçi;o8`›Æó13Â϶U½³Ä¥ñ�7= ^y^Ï\Ó–ÔÛ³αðÇÿ ·ÀϽôïò÷Q}AWè³\™ez@4SY9¾I„h¾ç²%ªD+ä¼ma¾�º¥m{õ!§��½H¡õŠ…J± €‡ à³uÚE°ôÅI‘$Ñ@hAºDx÷`NŠ#0Sþ ì_J¹°äs/u›âÝ(m–¬ôkжWmN�i#�À@š—*íÍfš‰¹×ëú�ç¶³FÄXJÃ3§­õ±œ½Šj�³ˆ"lLwÁšx°¿…t"Þ ‚«’5º›ç¦žÛ‚¨Ê«â’ ót,þ¾æÓ@±¢* Øü«�&q„Ìi‘e“æáB¯ƒÛf�*6ËÄ @È[áv"ÃúTU X‰DZ¤-(â–®]Â$y a7aˆ‚úR F8A©ifÿÖQo1©¨¼â;G^ó�ƒ%&âì~‡°AK ~ªâ½”3oÐæ€ƒ¥é×¾ÀJrgÏÈ1-PËJIÚP;ÂX ÿU äˆáhù]PÉyc¥ je0û}‘×öF×´"#+ û]vÇÌbO޹ߵlsä5Ÿ¯ Ï£è`?o\#Ó8‚.“è=Ø×áÆËŠ•o[W‡Ø•Gã¿®o¿\ÁÏ>|wo×·Ÿƒ[÷>†[%MêYÜ¿‚ ÌQ@IÚŠ*Y!ú�¿úŠþª†ü¼óòôÀ¶‹™yëcM†º©L¯m;Z® 8¶âD¶9»ìŠì,æö÷ R‚Šõ)ý°ù±dBž*$�Cñ1xÌ�ˆÏ‹W?/âWê*¹køåM æ¦|ÒžlÀ:ØY ™ØÒ@4Ë’û• 2Á’ˆ4è4Žªƒ ('JðµÑNÔ«Qú«ÑÔ<¨ÒŠeäBß{:DÙD3øj�·R@ª0ìª@SzÏ`¤*BŽ›�DHß¼õêÃñð½·÷ÉØß½p{4Šl¢×%Rû¹ê5¡w!�=Å´W+E묷 ÉØÓ½q'ÓêQ€­LVñ+ŠIµc„–:/è'y½ñ¿Ä‚q§±DŽÉØÛ"cÿñî=¦wG»‹Z½ôo¬–x>ã]hÌù�ú}S>²ÃRlë#7Ω {{Âx6‰³Í“ä�5æWíÓyVÆ–ÇRt3îéxߘfÄâ¸Í kÎóá|˸s ÇUÚÞO¿È6¸_ÚŽõÊ*Ü0"sÏà¥e “Î@‘|(ÐáúÌxa3¤([¡õs ß[jÊùÈ6W( Œ+À2f! 0Ų*Ú/ÔCŒètJƒ$„ˆ–¤A%8ae‚)”ÇÅÍŽeâ^·¨ôŽeçtТô»äP#(_!+Ïël/Œ—·)#zM‡èDhšôÀV_< �Ò?ÿ¡<ÔúÉšCzjóú÷�—ËŸœ÷˜�_x_’½´/8©)ûŒÀ€7°É\˜Ò­)‘Âû  ÇpšàCÿ[À(ŠõžlKš¨Ìæ5‡Ž<$ÔŸuŽSÉ&вî`¼ã´ ÿ9ÖÛ©¸ø¾rL~[m;{áøg¨$!0~óEꩵA(ð| à§]ÓÑB$ �Šðã;[ÙËi½x9‰x#ãØõßu¹Ì©Á"½zµÂ?#ï⇀W§CC@ß"Õ"U—@sD‰¿º|2˜ aŽ`n¸Xášø\F±Õf5&˜™˜ÌdVË …“”‚3,é¬á¬EPh5V¤‘ô�°Ø áHUMC�Ý2ÍQ™+…ƒÉ‘“îÌŸÏN £ÙËXͯ“[ºøC ëjï‘Þ‰4¾Õ…ÿ€_Õê�ÝÕ""‹ R†"ÁŒÈŽl–Â�±&ÉŒ ¢¸5E©0Ë%¯+»4®9é2%ImøÁ(!Õ°çnÇ›¹"+í0Ÿ�{ê J!üYIAÝRÆM§)¶Ã`lÛÑj¤eºTáпôuÚ>‡Ž{hs Û¾9o%BBÃ-ûú°ÆBÔ,AXE±u¹A&:¢³мå—ò^² ˆ]ò$³°,R¸/#�ìÄ7' |ÙH:™õ5CXf§%můæ6lŽY¶ø‹Ò°íÞ½Ú"zß»BÕ´ÈùqÓ1\½nJä&mCo%,€fiÕWc¾Ì)ïµ…úüxÌ6vóð•O^�}…"+¾U€êog¸ÇnIë´®}i°#äöðøð�Î�w6†¶åi~¬ñõÝËñÒTm"ÙuŠdî® 'VþŸÄÄ!€ŽãœZW/ÿŽ<˜)ÍÙ©sŃ@¨Îjƾ¤šä_°+¶ HE:N²r ]j´FVá4+Á÷5¶1`�Ùi)榚Ʋ ÄŽ89Ty×À°ïë%Z�5`l½×üÐÊ¡Mº ÷Í/D9¢tM…^ ¥Aׯ! dKv™YÆ K¹fW#…'á~�ɤèE—ÝP« `$$5^Õuqä�BKÅç,?ÐBìÄÜ·‹ðŽM_ÖFBçbÃŽâh›æœ[5ÝáK¼×òÎÂÇF^¾] À?zH{z ÎM¦€—ª€`â#áƒßr€°£àZL4d£ø<†ˆ# àÃ@üI ”Q­¬B*N…›ÙQ›€_,½ªÂ›aÑ•ãù—Ý‘JoÆì*¸M¹…$ê…{«ž¡©�̼|Í88 9¦-½ Í™{�)_?½)Œ 9jâãB„ø¡Á2Ö}DE€J•œ¨{r›C€æþ÷Ñ\XäOr7þïiWfE��Ñu WЗ‹BÈ1·™ý—„,Kœb/Nþµ§ä«BÁÖ)ÒΛÐkàC” q–¦ 3x\\Þr Bd‘3Ïà 6芹´™4AOA ƒNG;`æ“uÃÁ;�‹°®Äm¹väù,dÙ¦Ðý/±ÿ™Å ËÒàÁɯè.`˜"ï m ýYSÖfßuvd ô ¦0Ž™ ©ÃP¸pxš‹ÝB(t $%nÞFß²ÛN�Õ¬ nÉî5î©Óàm™Ö–ŸÍ»9pQ3ù˜©ŠüÄòÓo&È•·êW5¾Ç[+çΛ€ÁÜÂBG�ã9g8‚åkzæúžW ~¾è¤¶é<ÝLH“"Ø) }¿±ªÐb`owct  ¥K´0&+Úî|ëZ}h´ªÿÝJo<æ`WklàˆŽñEž¿kÇœ;… ¨î˜Ž¯ÞX£LÏIÆ„r5'F40l°ƒ‰H-ns #£ò©«aœPC-†3!Z^òh‰¦UèÎdž¤Ñ#‚VòHó‚»a,9€�)θ.˜†�98Ùäb ¼ì<íHh)¼j N*ÄM5~­± –O6[(`ì-Za�3Ðþ�I³`E ¬ž8'H¡O,(Æ8 b‡”vwÅ!‰›ÂøSÏ„-Ÿghž:jVqœ“röŒû�×ôÀ$�rIÕ |l…*>­ÂÆ  ç�Qçs«¨|v@ËaÔPB™Ò 'R´Šséœ�ا? g|t³‰|BØoe+ÞÚï¨LF ÕþiûñvŒ’€ð`â“é–]|�.§#Or<…mžFfŠ”Lè�ö½§`ؘ—¹Šði‹±1âZÒßÔÌÊËÐ<þk<¾Ü[;|~yßÀ3Peb¸ }yu{<<þíž<}ÛÖÕÏïÒÃÌÅCÚ^oÎïäÈSêÿ ñêÓù}·@õ»8vü¿Oh_?èÖåèÝWêü«\kKC�ß*l¿Ü.ë;;§Ÿª½�»|~¿˜ Ëõ÷¨B¨ ½mèDœÖIé ×`jr5C£Œ ¿6² ØŒ˜¦L½a ýÊ6t,q�8º9qʾàâ‚ÖÚ²9@€.‚‰8CNl� k�u¸Úø±u¢ƒöÃ#ˆ´1T:šž¢h–.Hç�×@ 9<ÇðÇ1B‰Š¸‰ø…íqe)%ýàPíHb2 Øn>Ï!â( ue‚ÀênÔ‚àMBM`¥! 5 &™�öCÐ5í„Ò…'8Çõç 4Ka.Å€eû�TªëYE ±ñŒéì÷¦0âé 35¡Vdáõó¦Ã±n²„énÊÃyXæZukÑA.*›Þ1ð ݶ†ô Ž\‡À K¢ÞÈ€ýÁÄ…YG:¥$˜½Ôï“�@xéa²e]i5ÃûÇS÷…¥lEžd>>K¾¿˜Š$p(†·:ÇT-ås%8&ôŒ`ü`ÌÝÁMÒ£�fùV.t� ëÖmBÉ .-¦Pc�Iÿ|RƒÎÐp„×Áp·‘%Cþ¬Ü8êºAŒ•”�hXq1a Ȉ|ø)%!G"‰�iÅa�I¼G•hJØ12€ü° Ge{‰7¡ïÒbÜÅä­æ°Á"ßA™6j€ �–µâ)€Ÿiœ÷`ˆv«•lØ&;µÌ2˜-pqpä³t±7ÄH+Æ} ôŒt{ˆy51pö7L¼1î3Þ@6PÅ'jÜžs‘« í {C2,]@ 2 E©µ€‡áe[� ôZ :ðSQ"ÐÛ:tÊ!0øÏ?EpI¦è¢ÑU°™ØÍ’ÐÂÁäžI·çS¥ªÏ†FÕ÷öóáYŸíˆ5aô9º&3ÀË&CFMDËAž $Z`ÎɉeP_¢ÀêiËD�ßcÍï†ö“9^EOæàÐ…åöi‹ndä˜Ä.a*˜PØßE•㎪hŒ¡ò-¢‘N–‹¿'mÐ`©ÉJ CË�`&`T -£û‘ó8I¨�Œ2(\ñs—LsùÒ&Ëî©(�BwC_Ç;}ÝB‰-ÏEñúTÛûa¯f½ÁôÿÔ¨'çlk@aÔ§qÊê+)ÿÄ};¯‡]A ß!=›MÐÆ}ûhdMDåP8�‚P(£pÅâˆy`¤¾_?~/™™Ù` û'‚`§/–|ÿg?ÝG�ÄZðÊ`‰|j ÉëŠZ‚ÑQ‹Öˆ\+a À®(`ÇTDi§™Ë;ƒéˆ¬lmxàG‰¹@I},°•f·õîà€œ7ŒR‰1”VJÁÏd{Ÿ¼3O׺�£¢87H€Àæyç¾€ßØ¡3©¾•þµ{dŒXÁD”«džF·@ß ­È‡»íEq¸®Ö§½LffÜ»Qì<m#3#Çs–uÓI((¼„ ?GiæŠb«g*[+Â-è…FUÜC‘Dá5®Q>ú7ašØ<ÉžôÒÒÆ½¬2oµAXC)kŽ4úŒ ±ª(Œu±¯™bËÀSç�ÍhD}\–Toçª|�Ý’‚€´˜mGr;`D Ú‘¤šqェƒ/áHk -j¨òY8ÜâD�h-Ð/ !U×΀"eÎÉ©ôûV�–|‰ŒM`þÐR£qé·jµ†. ˜ªÌD¹&1µÂ⥾*…èAÇyÛVmbhfïFв…¦ÂôÏÊi›n�í‰"p‘V0º:#̪™°bôÖê¾dôçö®0ä~‡ÝZŒGÃÙó•¸t•KÇ|v¢ú0ttÙHoÛ¸~UALU»rÁÔËVfÞpJo`±>ê@?HdUrÎ3„.hˆ8„.¥à7ǘFf  ²…åÓ8àx óþ΋¯†á3Ml¬—¬Æ ~©lZø;°˜®|A/»+,Ï-·fh ‰Î²ˆÆ³F»[ Ø_ÙÌ„P¹D±Œ f�bÐÆ„lëVÁwv´çeóÔaŠ­Îtá £`A²zÂ¥ÝVÕ™%Æ—†v#»6:€?aƒ@¾‡2fw¨õo9¥¼  N•;QèZÃÂZtÌ—þ�1p4µÔ×ÇÇ®U!®ÎBár8M2�1/Éö,Ie'`ÄÌVÚ“|ë¿fn=xÜõ˽žz¶ ˆ‹©¡#íuuÊi²9’¿Úø»îÖÚ¹+?½>«~âÞO]�þäW‹^N=¥ |ØÛ…)ƒá(Éi;õ9W€ /Ç�¸A·ËÝËk ¤-ýO'HÏô ·õsìn-?,~^¯I|žŸß¥ñü½�=::4úô»ÿþ<< >ŸÊŸFÞ{³ópórsýŸFg¶–FÚÕïäÑðÇjžœéùø»;¶}Æ�tE_B"oßG�Ëåñwór7�¹øH‚NxŸ¿ªÝ£—. ¼\Ì>ìá«:­ê9nÑQ?qùMÎë)eùeú~OË�Åü=ÿ¡o?Æ­ªVU#²H¤~€´BN\Ä X3»,=™}z¼ˆžÖ‡/Σ]Á+(kÂ^¯ötXß­"ÎF׋ۜ�áý6¢^mç“{P–…¨à«b4aRÀ�´§Q Àd!€š2˜{Cb.³I4ç rÃAs¶Â0‡Ñþ‰Íº»Œê2þ÷XäÅ!ÿo sØþ_æp°31þß s–Õ·ìpÆþWCTOD¬]Eõ=n¿C¥Â~9€ ¡g1i)B¢$ÀF š¾9Εæd]²2:z6Â;YuwUוJeÏ(¾Ð‡�ê«©ø>½[|;?ü<Ýò3sz¿Žž®ÎÞ­¿×ß߃6?.\ÿáµüÑäæê/÷5tsú©‘�¡ß—ß§±«htöŸ�“¡³6¨?0æÉ÷W«õÞ!埭_熣‰ìîî©­«êanc—ÛZ„Ͽðs»vay¹±ö? ¾ƒzÖ£­9�FSªÕ“·u‰¼ážh¶Y¹�P&©Œ’Ž67*#ÑÑ�†¤ �>ßìXhä"ãÏ!»yú×@«QQgÏ|÷»";Á½ÂìŽuÿÞÇ“ôà‚ bAälù±ØÌÄ» ²t‘óu2zΓ#.~È_å�²>›¦DŽÌÛ Zˆ:ƒ‡›û^±ß¥{`!>Lt‘¤�pZ‹HL8tóæ˜?,« ;¡Å�øºÄ`„ÖÓ)͔ԂÑKó¢É�€ŽVÜý^9Ï8oÓñ”sE±Vá¢Þh5rY˜O|+Óv¿÷ê ß¡]ÈÚZ!O®GÛ&NSh„5¤ÕÍY0`„­ßwõ—òþ\øÏÚ½•N:)__\:Íš o±+÷O§ýôø»0ö,ù qÿRâ@æèLx¾Øý`rüÝ].o¤Öe¹Y|­ÃWÄõðÇN(<ªÜqŽ_pUú:n^%âp Fq­/®oíZè´^¶büÁ©2)é*‚ššÔˆêŒ&GÀÇhΉKEíÂ'Äóy}#)à×)”‘Ìä”ǰ›µŒq ÖFMÓéÎÉ+£ <$v7wÍ’Ëh¦œViõØ-4Wlõܸ\lÞPJþàó %‘Œ©+žÑ¢D9©Pó#<ý@©`ÜõB±­85ÂäfßKTÙ§xÒ@hÊá{-4¾QŒ5@`†m Ôê Ä¿.íiŽ.dâ˜G ‚Q#=Óš øLÛi˜LC]�öBk2n¦äÃg�JœšMÑdÝØgã|<á&aþ`ÁµŸÉR�ú’p”9d­2ØŒëÁ ât€T�0OÙUR&/á¬t¨U \—õ“3kWUžq�æÀ«™'ÖPZ‡xkƒ&ª -á `‡�bAiSueÄi‹¾!‰E‘Þ§hQ¦#N¨D"î"*lGl5p ¯ãêÆY‚¸h³iS6KBê£ìÒø±—ìòÄ7 Hs)>.Çíþ§úN•y“i37‡÷Joçö•ýÕ=>w¤OÀ%X¡ 5û¹ôðqõ34³þ`ÒÍ»u÷ÓÛµ§ïtsñNœº–uôÔ·s§¯{w‹_ç0òýmŠþþ½òr2¦Oï¸{7�+?;§÷»ýxÜþößþ¢ÌûNc¨þvWG?«—íqïõ÷qô2b$«êŒèL…4ïg „75Z#ß#bÚ׊0âébÖy)‡Úo@Z&µÜü�Dk“a®¡[�sÕ´¤¸Úܘo\QY¹A„LÈÖOÚ›.3¾êþPã«Òuᛞ xŸ"ÈP’àšB Â]�1uŠ�™J@Ì�ä’p@4±£ò.°ËÖ ‘(àáÕˆ„âUqŸH¹\& C 3<ªJ@4ФLÐ8é¸ß GWpg´ÀCMziÿ ‰ŽÉ*‚ýÈ4&P»­¬(%5PdÄ‚VÌÌhCð†»ÉÖ¤)2aöªZÙ ï�8Gë€dåõŠ~/z,Ä�  òl¥ý!ýx wàã±¹Àp RQösOÍW%%8µgœú†Ê�gÅÖy©¢Ð&¿ÁöaüŒ0kÒ‡ÈÛ{É÷C�„†°aÁ©½‚ % þ!-å�Û9g†AÆ)Y 7áŒî;n]-‚)*žùj6צTGµ`Ô <¥Ð+pI2Šw%ÆëÜ"éš”%žq9I Àºp~žÌÜI’B ´8ß¼4/°¨UáÕ8é�ÔN^P2i߈3ï^µ„¾«\J‡ˆQx×’wœÇƒ…zÚ¶hˆ–}1 ú.±ÉOô¶B€T96b'zöpI+w$©Q .Ë…²ŒˆÚ/™bÇ娖b“8,IM&?™.0ÞC)�m–ÃÒ6¼Ç™*Â�;ú`}–~�r°¿Ù²G&úù1ÁyèЖ´/c'ÑI`p… BÊšBËŠü ‰ µ³ô×›�ŠéÑ„HĘËEèLöO.èȵê8»G«— ÁYɆ!> ’ïvÛöJQ} �i�Ì©š ¿ð%0 ÷DÝLÈII&p%zLÉRþþÙ´U{ÔVt�|Ž{J k�rÀ©'j‡Pâ:?X jÈ‘”PÑxÒ߸pzóT+;›ùTÜß´ÔJç2{Ÿ043Óº¦G}òÝ-;¾{X.Fä2dYË̾f“ˆf%¬Uæoκ•â]Ü^.3=ËÃUì•XÖi‹9-ÇS¾˜ïŒ‚©2Ì›–~†‘DÅD¯×¨x›˜õŠÔöLw/Ê öÒq+Î)Ò¹ “è!I$*'dG|‘ü+œ]¥Ö¨(¤©\GeI ÔMÆgPBºfJSŒ�¥oÔŸY–P%„ã:‘3pwQ ó#Kùe1ƒè›v •„–ϲæ‰tíºj¤†ê5NXWFêA½$EÒì¥Ë¨’T‘ÂQYIv“Dzv &‚½RÊŒi�${ãbé¦b¶­LèELØÁ»‹ÞÀ 1á26ØýÊâG0.b�(O³è^Ýù“ jìAŠAw‹Ns°:cR]”Ð�òð–Ì`# ùûð?+ƒ3på e[»J$˜ÒJ¾fSr\©p" Z-Zu–óWAWÀÈ‚£”B§^75˜3£žÿ [HˆâæÙ•¨Ù+;¥CØÔŠÕrÕ�¡R,^w™EÌx$#%ïÄä6@³t«h· û"²ztHúŽžÇö´ÐQ¼ Eˆ¡&Ü«¯~°*¸0$™Ž±ìg#5y3z–®�`M¹örÊŠCG‰n´�&×€³¶m6¤xÏXŠ¢GV¨’t)XÕÓ �a¶¤exïæ4Û¡©€É©Š¨ ³äê-DI¸?‘YŠtçkC¸n/èVóŠÏDãhOTÍ«Å0FЪ“ÖƒÙY}ûy+}ëMddâüs¦¤}žÔC ökîNö­=ñ{кµFo¸;‚³#'Ð\º[CÅ÷ÈÌÇr÷È5k&�µ‚v" ¹— i8–ù™”“X{ãRûXp!a¨q—vP™ #F›NfP&ôÒ+çÅÕª¸»¿@>¡£ØÈÆ*4_>ž)+‚)Žòl@î. 5;ŸÏé‘Ä· òF‚a©6á*p· RBÛc0šš6J È9)�Tñ& Çpö%Ú  .^4#¢µ¥#•„CÃ=çÐǧ¥Ãú`<ÀBw„øKeóÄ=|£ÀDáýêPSíDqè›FÄ'ftt,bg§S¸T8!œáç9�ÅìœÀ2 “!^G5ϧ)Ëg烙ŠÏ>£³f“ÅG)X¬ð Œð¾©Š*×éi ±¤<äN£ÕñKé�€@¦;?ì-̺0d^PFjyÔKrØ {þz ßÛ-E¾xAçÏ­EŽ¡¡ØMJþ¬&/^7b'™”‚(µ@ È;µ™zPEõ¾²©>²{yí±›�Ä8:UŽ^ºeM±šÁ(4ýòòtû>B{ÒðsŠØ£9xœ‡ãk�94ìUr¹æÇn£æ„O ¼�°<“g+ƒf?V~ñÄâçf¤“K1“]%JÃmÀ”3ƒX‘ê/:ØÓÑ-(%qæøü³÷}(ÔÞº,YT¿¹�¼ÛÈÜ‹õÕ¹)xÙxâha÷€§P Á&£ýbà@\¸l>kwWž÷>ó½á/B’Ú�ÞZkgð‡s“Ÿ›Ýìh4wÏ•Í÷—Íåy?´Fÿ}=¼Ùºbo—¯ëëûø¸Á&^êû{\rõÿcòõ{ø|™ ÎÔßí}¿=yQ¿³««ó¿mþ¾¸êýž“¯ßëÙÑ3 ¬Sô>ùHoW—÷÷|Ù¹JÅÉ×G¸Áð¼?¾X WØX¬¼®_Ó"¹ê"Ü9‡ÊâQ¿ÎõûxH¸O»˜óù@þË;|žyŽ÷§[B-Þã Lw E H "ÍÕwÀŽ ”:p #< ³Ø ëì½–¥ ¿[ç�·m1�¹x�µíÞ·i†sÙ3-¼>­i¼ÕsòÁC}ÚÁø}Í›ëýE~÷uð|:Eâø8ƒ/çßüG;ˆÁ»“¦2|®^ÌK%Ïò¤¦Žg ‘UUV=¯>2L°9—©­¨uÐcª‹˜ß"âgL÷ç·;›‹†_úªÅÆ;Ýœ–ÎŒÍǵûÀ§ƒ°“=ã˜E'dßœc-üGlƒKÈœ'´rt€ˆ—‹sÉ8Ñd=axWPa®»™êU¹(¦ÂD>ÊJä'³¶l.°ñ‚¨V®%6ïk:qļ£vNüì¶ÕÊ k¯ÒËuþ:äé‚Tô[;©&7„¢(³øô©rk›!«‚7FÓ¢Þzs1•=uUžN¯WÔØëåìü’~%Èò÷óðüž�®žÎ¯³§ôòô|ü2G?LpÇå»�ŒS#èdb»(ÀƒË x q°…«*%Ä�Žætä7�Ú1äéz÷=VÄzOD²�7ZÝãð¡´'×¹ åÛsZ‚øS”›”�¶{´î\B¨€ìÂo€á n“ïZ£û<Ïó`ÝÄi^i0ŸÏv…¼÷‡c7ÿ*0µ©}Œo UœéX%'½øá©Ê/uIj¡ú%¯ªæ˜P�³3ží[N[ èˆI‹Îf‚wFÝ)ÓÍ‚¬grô(·»AÏñ�œ=–k©¯dWÓ–”õOíu;Ó±XudN—Ó5!è[¹¸¸Ð×ÃÆˆ»ù”Â9:NçÅ@óÖz}]}ÙÝ^OGWç(uÇ:Þ#Ö-ø°9ðYà 8Z€vÏoßû/ ÙôÑ=ÏÓ'ƒ:Èw§º¡:þ¸0�z=ƒŠ�O öû÷šo0Ý*­ÎvUÝPúµ8h4[i)“}a‘xW¼Vø�äg¤±hÞÝ$yqöPÁè&Mµ:�D¶"ò³\NAb{QŒÒabŸ8å½#áDûQ�|«f2G©�-ùĦcIžÑrñ“ל#S³„¦ 1ÁÌjZF…*¯,�ÁA¦* ¤ôHHa($ˆè+²Ä °)S‘\…N'ñB¶â¦øþˆH]n¹šØíŒÿª¼‘5è*¤BêÑFSÕÉ›¡¹«€ƒMøea¿‡Ån¿;ø 3ºÐAs]#ŒlIÆ`ä¡ãø@šFx©™pÒz¬Ò€ª‹‘¶)$m…–ón€”!a?$“C¯@”®Qhš�fXß@¹rȇ !�{hEzJ4û\'TU³Ë^h!%rZzÇ©$©g}Ÿ4­T{Mé¸îPôÙê i�ug2Ò" wâ8¦"|`å¢üvC“TÒÄÜZ*t†žš„*À·BF”%ùU�‰XµŽzÓàÊdJ¨,tõÔš]šþY7°ˆøˆw+ÚO4RÅ)èi(%zÚ¿ŠrÁ*z“å6ªøãí£ï¦0Ò9±ÊÈœÄý0ÖŒ²ø^¥¡ã,�L¾ð²©Æ�€~ FÞ¨i4‹²à¢‹B«6 6Þ}Y}ÄÉ¡Y6QãÏ.&߃L[Û¬^Yý½Ó ,ܤBfèHí®¼G$²ä ëÌEŒ Õ�Ôªé°é[yê�Ì4øàím…2¤&KMÖªŠîYO#Ú­®YýæÎÊר¥ÝĆjâ ÕæÏª9ÆïÇdÙ/³È(Í¡$aóÍõ“÷,Ö~[yJ�­2}§÷¬]«£*@«¯Ú /—‘XÍÀäBS5ÓïL´ˆ\Ý ¼t�,fãéµðKá\È×ùëZjeµÕ:Þe´|•rKè –Tkï]á4 ¡4SïB¨±nÕ>J z¥8Í¥bTž‘ÔÝãö„²Õ»( –¢•xØ'UÕUiÏÑÒµ�ªÃQXtE"´‰¼.Éœ?òP½öªîA§£ hXDò:Üšò–㜖qAg%Ÿ‰Î0äâ„¶0r|õ�j÷v2šî ÔB[6àu#6â{œ/”9T�Ô`Ù¼ÉÎRð–³kA \”9Q"ôБ�c“�f�³‰Â¤8ÄWJ¿”êÀ IS[æÙð^ý×MAñntèg—ÀaÄÒÙÁˆsÏP]äºIш® rv“¢Ð±>Á$ÒUQž™C] 1þõ{MV¹wõãq5~&êÕåœ7Ö�ÙWÉÒV*R×›óØ,sXúZâ–aœ ½VŸYå9²’eK‡é>o ‰ŠÊn(:¶ýkò\®ò�žÀÎ`¬³Nu«@C½½:VÏIç÷/ÂöÃÎæR!^tvyµñ'f^hêgÕ 5½SOI+¨ Voß²>]x ë§4øÇòÊùc¶UÞ,ÏDUC9Nu ÛEjƒáâèîýöVEõéFšÔRpòÎÚnŸZYá#ܰᠷËùÂHë÷!"â³C)À•+G; Dº’’³ÿ9MÒ�IY}äQ/}ÈÈx;+ޤ »Áa™FBý «ZLèË’æãÒ ÉÁ ÐvØ;t‹µSûÍ %Dp~z7þ;¿7·77v"ã;;7K�'�·ø›Á‰R\=ß�?1–ªä©¬“îñüÓ`v„®2Éð&¸`\‰‘"`'øç^‹fÊôÞœ® dì.†jqg$xòÃ88yìÙÑ9ê¾ÑíÍÇå´a¯"äèYÀ¥�vB;ÆÍů2@Ä:[ê –ìr¦æ­ì¶W <‹_pZŒ¥›ìÓî›9_tõ!Ûö=ˆ =Vpn×FUì\¥Á½«ÌÚÓ‹ÔD-+7YY{É>Ê�½ ¾Æ­ª!5¼”eaxìÛõ{hÚsñܲ}pÜÖ�¹”6›Ì©ú£eØ«×i3ßöÈóìžJ{_â oY²Ô:âÚê‘}<ªŸ‘êŸ=Œj ¤8{:h.ÞÓÊ‚â½H9lÞ\þX sÎ Ú #�žä|NwƒddD{å~T¦hZ„ —Aî)¼ŒéŒ ŸåÉ&ãˆ!§®˜�¥ j»È…«s³Ÿ¤Žpt‡(!êC�¤1áçäñ‡¨”ýŒØi29´uò\l�šOÓÑ4ùG%›‡ã ÄÆn%­òѰÀ:°j~ônZëSýœPfšªiÚ>¢‡±Ì¡I!•srŽYžŠp�†0 êNò&²‘A €L¬PL“± …¹LI„M�µßià¹Õ35U«±Š9ÎŽy®^¡x¡Ä‰Èuãz(`¾ÒåÑ@‰ÊøR ‚]Æš9÷e°|� ¶�æ(©”ÛÓóËK¬x£Eû‰Ð¥ÛÃÀiè¾YäŒMÑK¬bøRCñzSˆá9Ì‚Šg̽¸ò"4‹Ç(,E\èçýÊh£¤M@§B؈ÈMSN‚$´/’nºeRz>1WHVk©¼³ñмe)„·DE~YN¨ ÷«œÈiFÀ¥ÆÌøH.0À¸Oã‘Þ sÙ©ƒä8a›ßLC¾l�Ú©¾<Ô1tù¢>­èŸŠóÕ <Æ�]´ŒÔ~È•a:_lÍ�æ aã<ˆâ Ê-Æ|:î„ø³dµÞµ3¢U„k¬^‘ LWÿʸ”!1˜N·ãùŽ|2ë&$¸æ,íQù!'ŸÝ›æòá,à²NaÜê‘!3‘¯Û ø*¢EºY$nÓÜñ—áˆ+ÛÏ[M¨²RI»ÓÐ|]!šëÖ=¹†ÒÊå[¼{mt…•г÷0ÆJb„„s±fÃ}pá*†�à:ÊïëZ,%¹�;+eô:vUšèaRâþ)—hÐ`˜…“é0{"$(ê¥ö±ç?AòH2tõ:ÿãöž#{qëëëêþ‡ÉÇ£³ãӵ÷$­g, WžÍ’ËE€6@·¯À­p—þ—ç»�’ä2ÚŸJ Ù ‰ò>�DaÞÀ¥àa &�«…²×Í-W�çb Äu;½Ìoé"]ÌÁ/aÎÑÍ÷ºØüw³YäC¼ BZ^üýÁÌõ¾� –—E:cª÷ácYè6mË0—ˆÞÂ!f�£sûw§úhå߇�PKòóÀÞU¯ÿìßíåÓã»þçñu°D¯¾ýúf¯ÿXÙñuýûû40»öUý–oÿ÷ý²4sCß5eïý“Oÿ%x¸«ÔÅ–ïôáåÿ´ÔÞýö–âÞÁ þÕóxX~ŸÏ·§ãß3b ÆÜãÙ±éßáÛùå?z0cdz â?€ÿ7ºX/ŒñËõý¤ä¼âÎ;®h>Ó,p©’Û_]BðaDîš '½|íhiw£ð;WúÝz=š”s²z2 ½0M0öbÆ9EêÒ+â±|—b°Ñ꣪æ,×9ò†j.s¥úk£uöĸÒ�YKíxDXU§{Ž2½sÀH¬ËÑ ^M=BJgƒëè+R«ü±í3c^#n‚¾jÝýwÒ³évÅ·�žã¿ŽT–À™õEê¹Xˆ2 ÒŠÁDdÙ(É*ò—Öþ­QÕmîfîþJؘiîmîÖU]]íý.O‘Û~¨„¿$3d(º™æ–¡»^ÜÒߎp‘dÒ•tÿløæd`×_QkÜ2ppCº QDNåݶ,ê§òˆlÌ©†Æ ³‡K5¯¢g~EŽNÎ�&CÐ ‰YȦa/-’-V¶Àü£¥\ËHZBÈê¼ B ¡±,êÓ. F,�„KFÙÇ#ÑüùQ ÙŠiØõÍ€¯eÔHNˆù#/ŽgE=!.‰JÆ|að \FAtx2M)ž%½%Îy�¡f’sœœ‰ykõËè[ò³LÐØÄà QÒQ¬ _F`\Ò½6µõ»Bþžó‘q:u€\6¢7yZ ]u¸(:Û óM7¶äl)f°Lóï°¹ºXZŽíȳ£ÞÓþ�îx^y4´ÁK—ܼ2í£+µ¿É)´²Ì}# ë(�²YA¼µ: Ê×XP“õ–¦�,¸Dºw9A™õT7öX�×}®}tEB¥UؼuÈ«UǪ“J8«)‘LŠtgêBP…:ô_g«ïa¾µ_��u—�ÝÝíîý½~»ÈNù}~Üú|›ßž\,•ÇW§ÚãÕïùö|½NýÜìØ7MÆå{?ÕÏåçå¥Ãÿ@þÁ•V ]V³Ç·óûøz¼]óU#óxÔ¤Ùûu|8ü=¼ží…«lseÜdUAIŒÖˆ¥rºègè›ïC|íD†N·œ ëIyª‚Bô@YjÆpäIØø„³»l%Ô wÂEIî¸Ú©ZZæ� ¥4{|kws4§”ªqܼ¥ªðÓ2™ÐÔhaa½ êWn¹Üw&ûr±æx³–¬ª t±kZ/*q>þORCð¬LcäTgm´L%;� Š�褸Y¹™#2E)£•X[B?Ã<¥œ±ýŽËž­;ö{Û˜}x@Ù2n=[ñ°Û*ÆXâÍp®åhey¤óÒ)ÙŒ¬óØ�·¿-8 a~µM ‡F‚pÖÏbLV*åÆˆ§„ÉÈ‚­…‰`ReòK+uº¥âA™•êrÖ%ë‚õ`ǹÑÒ,Y®¬6û¡6>}ÛÑËÉÁómÁ•�ß§@{b{|ü¼{ûÒWùÕÖ÷6¢_>ŠÃÃ9ó3q€ yÃQ†³@æ„ÁÞ¯¿—ÿ½À’&cÅkASÛFEqAE€wØs\ßþ÷d{zÅüØE»â…D®X\ðw?ÙõOk˜‚9M/€\× 0ß´¼ÂñU·¯@Ó(êÅÅtħ0[0‹þ$!éX§Jv  ¯®‚ðñí‚‚¤U~SLêÈǦÒö£� /éÊŠ A¶ å^#½t¶¹¾ƒ6¤Ø&”‰è§”„ë¡PɶZNn>}ÄÝ`q]Å?˜9:NT}b±P]eIAééJÌnb:9Ñ.¨ZAض@Z�Cx˜€MiyÆ&¢.‹ÒòóÂCÝ2Å?ÇØ=;øÀ¾6õ‡5+yȦ€°9è[Še o’v*�óõõ�#ÍŒ¡"IÒå‡)°ÊƒkaA-²vgéÀ€{²ýËJEAiÂy�ä÷Wôä´&6A0+p°UÞÊûe\^9ý¨ƒ< ›Ó¼AežÙ ‹Îò‚ç@%œ¨Né¬{ýÙê2ñ¤­°ß _x_Ì~¸‚@©=×g›e€|´�­ÁÌVX|7�‡?ø=bÕR¥¬ÛA î+Å¢ñ±1ñŸÛFu~»¾~”%›öá‹�7œŠkJ/~ÂíÛì`ù û~fW˜&u© Ißh "UÔ¬ÁE/PÀޑŢƒô–“à ‹ê°HLâñ[삈†Lú7ÚàÄk$@Zèˆ�p@ î ®47\Ió‹þ“ÿ"õåH›Ïƒ­Âùz«ª?u?¸ªÐU7 ~LÝäºT µ7½èR*ÚàþàÆP¬ÏP·…ÛÑ=ŽÀ…²xÊ)2D�«Ò×Ü�!.ÀŸí¨�ˆ]Ñ Šå5¹�\Õ®JW-kšõÌGr1¹<ÜînvªV;ê}~”~;ä]‘ªC4Ô^À¶…#à-)€e.I­`ˆ]}ÀÌ2 ¡¯*0œ”å¦Ñ¡3‚¦éÆ"¾›oÓ„äÈÇ«a5œŽvR5ܦ»²óÌ.1%«€ºv`Ùˆ—fݘGvU€îuHìèIÙP33¡ç§R®cBngRîàL›ÁnmÕ­lÄ)XȱãœÐœå7œ¬“”£’·ÓZ›ÙWr6vf|ìIÄ&X1d¿.È}]�^;2SvNìíÔÛâc�·�—nú7¼v> ÿ6`ãÍT¶ñРs±�Í\½àwæœ\$¤—×EŸvOwÒl‚‡v#w–kî°K¶ã(‡r±ÇðmWa6¦)ácVn× 2j¨(<àóV–Áb¹T»³j·5œ.—tÚì*´«¯}ãW~˺ق0†7F‰²ƒ¶"Fs×-‚°Moº¹ªmƒœŠ{]‘¥7R)Ѿ›¢ÕC‹îÞí¡�m 0X©È+xwx’:¯l~á1~ù ®‰.µà´”B»ê¥mT�‰Ž`tõ¤®�À»Ðpm¬™æöoXÁ|Ó{îµ «×Ýi1Diµ2„± &ÚÍo¼­ ªâ¤…ÏAD!ÀÔEPݹl /M™&)�>µÐ…–� € D�T¿¢PC✶íySkÀ#4`Ýd¯ÐÅi{)ĈºåäÜΤÉêNîê¨F@ž»8Ä•Ù|šù¿ŽwÒvóüÖžü•|[¸«‡yð¤òFXæ‡"¹å¾� ß�è”ù÷Ï�üҜ̤©û"•åk¸™™gN)ò‘Ùù,íPœ‰3½c'—OÓX�îeU>Ýù{~~ÉVÒ±,à?Îc~‰Y ¦ëÞM+£eèõßXèRË&t9ã#¤›Ê~Š s6ôT}¥ô8 Y0Õ0Þ•€|G‚àèƒu“Ž‘,Oa=E¥¢¹ÀM3-#PÒ�’Äÿ±`ò±¨kPãñK !ѳ&J÷»"Í­ÃhöÆy€do††Ln^B�ξtzNÍ qä´�¡0OHÉdº�;JÑá(‘Rû­ FÑœn¦Âw"†‚€L&?Ñùº½Êgºaë�+Ÿ¶Nu�m*]è 9ZÎn´�O,7²j»d”ªCí—ZÔÏÎXS¬j¤ÌK‰(™”#¼¥ªGí¯¬1\kå¯%X7G †¿ö¬²Rª·¥ªB6öˆÍ ¥°�œ³.%Í–lvÔxê{ŽL�!Ày“°‰R WëhÜì“’‘B‚ù´M-&PSb×ËOd’�(B«h�ʲQ³Kì?ÒÞCyÄt×J¦BS­I)<§®eX(rl*!lŸ[‚‹T=Oí ÂÁE^T¥˜ñI;¢•ÖÝв$mãéç!6Œ”󠯞" F�=�i[íÃAóìuKU¾«Æ~&óD:—KÚ íòžH‘ÞB×§$,œ å­ˆ¡ŽÿkBeÄw´(´ “^ 2^­7 V”P ¹EÉZü`}ÀŠ`Âì�Œn‹×:ÏŒKÑ¥dy¢ØDRÄè´Úf]ì�áÜ“¹w 3õi jé¢EjMSZÖͰ|ø6†í J©æ•Ù#:ó„¯Ðj ˆ)ZêOZ(GÐ6¥³^Â%‘5$ÿ;•¶2Ž©]iBÔ)¤`P/A[ªâÝÍqõPŒµõIäæÅÆÁO[~ç¹C ^”‚ȵrI/¨ï¼µDJ3: šM5‚àÍVÄŒO³³æk]í£6÷ nâF!èb(ŠóÁõ%©�-.«@¥î£ÑÑŒ^S¼\ÕkP‰bi«ˆ%òtC…„é”ݹwÜàï·ûrÜŠî¿äAú8a¥Ý1l�íâTVÖš>(€;k0ñVm3cÝ*‘jØ •EñƒÆêÂM¡Ì#�”ýᚘ2q]!PQa�H+¶[�J·š#qÀ(µZS[7�‚æé§ôWeh€éà FIèü„Ù‚ª x¾÷ÚJ7º³G2—�˜#»mEÂ\À1Ù�oy¤²¹2[’�îkNòú÷ïûñêhkK^ßÿ×éï¥�ß÷ãæ¬ýoçêÍ}Î_(ïUýÏÿã�4^) ý‡9ø*KúÇ®��ò¿7ìKùš?d°EÉ&‘à¶>?Ñã}>N“¼<“"ZÆõExz{¶ùv^–Òµ;ýÅm+…çh(ÂWÆHJcu⣥r ëÆ¥þ=F5¨LQ/.Ž®‡�”ÆÚ¢“ÒÐCÊ`è%e0ô�1�<M£LQ )O×IÊö<­§ >mû|úH:ðùö’pæóé#å>¶P7)Oã¡ç¹zU­&ÃñQð�œ*~>$�ˆÆÑG(\:bB=óQˆ”ªÑI*6v“‰I‚¥S@ž'¨.z+$Q�ðQI¥.Ô�+Ý©‡PÒÔK*ßÌ¡SÂÔO(ÿ÷�+£~‚Eƒ÷Qªÿž;dT»©…^.ž°S.áíûúvBYÔ¢:ùEv~<€íË.ôU°uâ¯ë�¢°Ðzn:ë¥)$вã�Õ%[á&­R»BH­D}¢@ïÝ23³áÙ{BÿÉFx¡Æ–bI=â„ËA OÂY±zÞ‘:UtgVŽº9y͇SsébÝÝ„*iGªÉꮑLŠwÙ%×xP¸ ã½Imé¼ÙUþ]FÒïq)¾JI;,x\·—~rgžw¢&Ko vS 6Scþ"([Ñ7üz!«Iûa.·'dE9,�e9¡<`UÌH3ä+àã+´�gœò�»àò"×ó@�‡J,¢Äª# “zûl§éÄ�26'H, ”oùìk'9áIdöä‚í’UŸÿ›"‡£#ÄÕÐ(¢1Ñÿ�”Hr)Té�ðF¯ÿ Ê †ÔbÇ0œTîѯ_ÖOå0ÅV�v°<* j W²(dq•˜”$�×ÖôñMO™Ðç¹;ùy*y&ygêÂ�ÿq»ùÌ¥ÙÀ]NÝoŒÉ ÅÛ4t´Ÿ®ˆüÌ`ùÊòB0ÿƒ."4º’vœSÏ>³²FÀÑ#%E?(ØÒ™„„&¿Ëh)º[`D,ξ焞 �¦ôËÿµÒ¶%æ$ÒðÇ@fCLübû™ÄSk2¶N [ƒÚ €Á2ÒšZJœ†puç,÷’Àœƒ¹€3 Ø#€g’<Ò«¢ž[ÅEn-½ “1'0ØiC=šìsò”4žn¿«CšÂþ´B[m™ŒEȧXQfûŽx�HX–%ŠSuªÉÍmSChl´ —6¬å܈Ñ]#¸�©šº‚‚ïA×(9šUk窉deÐ}úUq ]‚IÈZõ!‹�Ö‹Az£ …Hpà§ÕÖ¾LÚû Õ÷}À\߆�‰¨ccvBþ- ðÛ”‰-ÐsÍæÔÖX±£Ó†Žy?zØk�ƒæt;XøQ-CÇ6Ã’phæ¸×«*‡o{íÞìí»~ƒ1xç…‘'³¾Î´ùTöJ8ûUöU>Z<æ�HÕ¡¨f�æž�' žªøë]l2gäo8¥²¶€è`>ñG´éRÔžL’F ¸J�ºË­„Â~0j[(�´ãûqfWàxÜ…þªs…£û$fÅ%{ž/N8™^��'bDÉ1‡¾Ãhd½Âݦ%�§Ö »>…Ê‚Ð(XJ(y@X <¥¥:�æÿ‡‘w¦‹º4¯mÛ¶mÛ¶mßû^Û¶mÛ¶mÛ6ûû«ÕQƒšä y2O¬½Ö“'bï”ÜIâc‹L –­®5Ò—~SM9¯ÙÃh”PTÒQ?LbôcV|CPÒyR>ñô6±ñç½dëÑ+;øî¯·¹ÜÎS-³i�w/¥ÞqØ mO{«Øyº°:!lÍG°�:[ªÞ7|!elô3Ë]…×8Jnô˜‘o±]Kt{�¶zypвz¤ˆÁ¨ïE%­Ž ¶ñ§ÏHgá©É‰Šâþv�îûÜ0+虉ȩé+X4’ s’êA…*̓'Õ&²Sá#U…¥ýF#�=�ó(({�o0[°"©’l‚5N@”t TÍèÉí6EŸô csýÕ$žÖ¹jU¶ ­ÈÈÏœE�¼?ípí¾øÂÐÎÑè‚ðRQØM¸�±×y¬¢´ñá•Rx&w8îe(.žãņ`š/ø±úNÑÄ�GtiX×¼w \¡½ä5w.I&`b{Ô÷_Ò0nâ;Ã_»†©S;ix5H|BËÁqD�ÖSÚ|i|ÉH¿ùV”0•ýH°Š˜Ì lÀJ¦=�TOs;$N5B¬©0cÚC% ŸZ¾[±åõà¹I¼]Vö Û|èñð>•¾i�#�â¼äìÀoÿ”)møI¢ð€&økþŒä= R¿’Ííñùbe¥ ÜlÈ9¤úAü §Gaã>[ê°Q ññ“»M`Iø.mðÌׂfáÄséÇ [pÐoÁ¯ñæý�:rXäy ¶89)üŸœ–ã"jgE‚' NÏó<— ð¡dßÁ�R ݆€¸ bÝГKôyšEQÕÏ¡>&Gl�åæ@c�R‚ËV††»JràÛ<5á*4·8Ÿå·¬×ÒèÅ”?tƒ™}Ÿ+}ÿqM6�§T·zÒ2±«6²„aò00vÑ$y!<§£ÁWº Y®A¶åDj À",ËDQJñ–@2 îñÏ:pE~=¹ŠÊ;äÒ8ö¼<Ȳ°ª ­€Š]ožr²Z<¸6t)U Vö`ï9¾Q`,˪d6àòj8÷ýœ5S4rÌ„2äu�\Ò7ŠN¾9©q‹ ™idL°Vàá¾ »ÝY‹ÁÆzƒâꎜ?.@‰)�UšüYC‡Ð099¡c!ŠÒ þ=H"1FІ%yÓz"ë=p2-v�Yõ#_T¤ktÈd"LK)•¥‘ÞÃ=ƒL8Säœ`ñ°ž*⽸} ˆ¦=rÃÜ#,á€<64Õ–ªÕ£@®ò~…A©(ŒE•ÉVž?€æÂ¿HI%¼’þ$‘|·Dq´ŒðIê …3�"’ĺú$�°z4M�Ä,säF‰½‚Êh^Œ\ŸÛÚdÙ¬²R�šÜw'ŽU—`˜#ÎŽjYÏ…=íú{Õ|(ss³¾ésøv{;;Ð5Œ»4˜¥”"¢"Ap6ÅãŒ×«*Ýò{´fSmÌÛï Ün�»ÓèèOH»Ýš{:ÍÓ|ÞßgiÿXªß=yµ}4ºÀž©Ü{�¿2Åëë!¿n†“ô¥+´T"¬Z (AžÝçFjöcº*Û5ãûŠ:;É"gkÝí6ºpÈ]y²Ýt}•`Éž€Tkæ‘\UP¾|áÐ_‚ Ⱦ˜6}LÜC赚J&ès i:¯ñ¹XÅ:@�l^•æÊ®÷ Ý  Aãzßl¾{æ…, rcp¼D²·£îð[w$ø#´ÃNË™ ÷‚Ÿo†¬A$]ôC`-(Áè´Þ[©4ñÖuºÊ\‡Eð'š_º�qCNÍÕ�=ÀüøÀÖWGXdt§û—Ç\·<)½ÖÍ(b…Üc ×Öøótk´®»©bË`‹ISr‡A’7H.9ï2¯.7Ýdy(Ó DplB³Y\r±?Cp~…}Zˆ»`‡ú‘ßáìôÍÊò ¨ÛzEÉT'IÞæQH›i¥%ôÌÁ£FŒnúf¥aAçl�íŽO]Þ ý¼Ž †¹h¡A±4ÉrX>›Ää°¥•¤àï2‰ÌÒøDœÛ›‡.[3¦„ nréƒiUð×\ž"¦Ÿ¦7�,Ll—ec¾zH㢔2GeO“›0Îß®ÔX.k臓Ëy‰P| V|BÏûœÛ³·þ@±;·°7ëÚ3³“– aËÜF¯tí�îÕ¨b[ƒ*Δ+pÏ!‰ƒeãǶ†Ò>:‘?ÀA{/A{Ë)=/O%ñ,gx&üö¥*UK–="k1ÕKнËv‘ßýC#‹ó ^Ù¼>” iÂW;d4%C0æQâqIÀAÀ d­k3ƒI5jvŸØ°ì{Út8pgyó&rZA0¥üªÒëT°'•Oè6¿UB"°E7ˆôûM‰ä¨‚ �ÆZ#GCJ¬².)媢¨Â�İE`'ß²Ò0# ?l56™Õv|%àn˽ɺâpÝ@Y©iäP�FGÞ�Œ¨Ì‡ãdœ^e…�¤\¾­ÈÏR6^Èø/ªëûþ¤o?TìÐdCi”]‹Ît–Ÿ¡ˆŠãü OñBkl ‡T)ÈÿAE»í;T¾ë 8Ý\ ÷Ž€oë¶Âè7"oyaaoyZ¬{^â&ç˜3 ÖjЛî¸{#{1Wɹ�ƒ“ü}œ)ù-Ƀ'ÅàwpeÐËDÿáa6Z×ÁSä�l8Ñ)tNF&Ìe‰žÆ–E6>Ó`‹„%Ά%]úwØ 0zõ¯É?G€‘¬Éj˜­ [èq„u ÌŠ Õ„ Ÿæ°v²öÆØŒ*j¿'�Ó¹¯ç¹Šp˜–9UôÖ'ÿ¾|�Ö¡.ùÁAY%œš «ÛHÀ„�B vÂTëÊeÉkyÖ /VÖc£êjàv‚!Xgš¶lÓm `-ý$þ<›aµy~ Óή´…î!Áå}&? |Ð$Ã1:%;?+‘_px¦t±P7§OqK¹ * �rªIJ®]�Ì#cž7òÞaÜ£ýq]XüφÏGn²‰¼Ãzd5¿0‘áŸ<Á‰+ èD¡Pœ›+Û]wƒZ”§»íÚ�%/Ó¼´Æ:ÔZÅSèÿèî©Þ]v£y{ÚA÷¦ßbnmvÌ�|Ö3|£x˜þ&-±ÿßMZbeg`øÿZjV¿rÚjEòêþõ» F÷lí#™x_Ž`n]JÊXbÆÒ*´%Eº(¸`ómûå¦wã©SBâ–Tm6¢ß»5B‡¦7ÉNð§ÁaGËÕk_<"‚£àCŠƒL@H Í5@ñbŠàJ)’lærÕãLî¾¶qhjpæzÜf¢¦f„L=UŒ!yå´¥³èQè `àh  `5†¤�\½U°(o±v±ö<¾6ºþ«p¾ù~Üõ¼Qø4¼1a"Åÿ½Á¡¾²à ìY.p&~ë’ œ§“ïšbK?ò�[l<¼àphÞ>B Ž!.ò‰ö  Ńwn;ï?/Ĺ#`Ì™~$"§A)�¤ †=žŽ ¢�$:t¢‡ò@!¢DÊã‰Çòé±f—¿.›ý–Òü—wvA§�”ŤkߨM™…Ä~ȇ §k 7X€U‹2úëî LQRL”Áô‚4a¸½ÌÏUdxäe„R�žî-в3ÛJò n"\ ¥7jÒëÕ9ðÁ ÃDÇk’K´ÆÀ™ÇÝGp éo:‘_Ù^Oiì­€Õ˜ž(/GÂ[ „ëÅ­YýˆTÙ-BFo¶f—»n›&ÔË¢ë¡CTÆ-]¾vŽ\XÔ2צ þ¾°˜—²25S¹‰â©Å—¨/˜Ù¾Œl ]Hù@_é”´?áͧ]ƒçv&šBµKé 8»wï^. P„Á…€ ¶(1¬Òï.ôÜ•8ì§­r¶QI±ÆqHÏ¢f¢•£OåÀa€§éâ)ËÃ$öýD³Ó+YðÇì1aÂÈí©»6râªx;­† ­rÙÙ>™Ú”d9Œ¾rĦݺÊ�x…º§¿ Î$ᘘ=-gñNWSY==×”5ã£jG�×hy“ÊOi÷Ä!_׺q6ÃÕÅ®cS}ûþ¤«¨VCÃÞPj\Ï3»†×UeTµæÍ Ø]*C·ôEElQ~\-ó”eSù•t¡ÐªØ¿$NóGð#Ëá)üû´ç_-øã›ÅÖP–=/±7A.‚Q•ÒIò,=;屎Ô蔲e£­©©Ýb`]×´Øf3Ä¡´ÄÊ$2/¸ÐsÎéX߶ȱ8ƒš£:_nW» MªõØÞ¶Ùrþ8ªN+o©aó¥Vímv®¦#Ž1/*ã’U�”JàôÀz àó òÒ}¦�Ë?Æt9˜¤Hz“ú@¡àŽ0©¢ŸòÏ’*d IYísi¢ê!ô¢µ�ÂwÅš8v9 UûÙLº<„ÌœÁúOMEšmC%ÊÎme&Œ¶‰[åÄí¦�Å¿dË݈ѡ2C{ ¸Z×õ+ØËèäTÁZ¥±5kßí�ÆŠLí¿bca)‰qù—û/ÝJ›w· ´61œo¼Úü|i�l‰®ÒŒÆ6çœÚh7ÎK(ëÄÒ}CÌa‘p$ cm7}q‰©q|eŒå9ÿl�@¼æb´ñ 6yw™ò’p‰Åáék™×º` YRµ‚R‰@ INôÚ0ü2þÞ-ªP oˆr@ÎxûEå�[9P¹IŤ²»—†4ÌA™¿ÓÓe~òb%™�Ÿ¬„’2—¤XÔ|ºLÝ,r™ÒXÚIÜkÇguQÌý8”Ûmeå ¿6¬Šh4HNg,A/âU¥¿7yy�¤ˆ %¶:ÔGœ­�g \Hwn„sÃ0–-Ž‘g+¶"`ª´]ƒˆ;Yì~¿(4¤3•¸YI‹ßR%ÁqÅUÜ4Ú§rÔïê–rЋ=ÀªZ’B±\©dH·ã)U‘™Š.�"²—'tÙ8Zê%ߣs䃙æ0å(cx¬)Ó·.\ƒ¤ÀŠ‹(Ò#ÿ3Á¤S4ÿK™‘p1@DZ…I(Å ¤yËíÍ…Æ@b<£š=‘éÓ«B2Õ©rqïêšteŵùÙÜôÅ©©’M475îX=žŒŽ+Æ¡@.ÂO1%ë;TæôiÃ꥞›¾RåAnÚá7´OØÙ{®æR±ls÷º W –~ŸW‹Ø®tóäÚ�4⯵|¶IU±ÖñUßâ¸Rl¥ ’‹%&=­=,ñ�GºÍ^éüF�IsZNo ÔÙS7™»IU쥋®¶ñäšDèAô¥}&µæEî{S)îp Ü‘@0ù�œbqâ:8ôn±rrò›§kc[½Äíåñ�.kõ÷ý©pý•#îéÙ*«Çw½ºéßÐÈèe,ÿªé Õ¢m%1ØÔ‘·ÏC{U«í²ÓGëøá;êá]g(xmw×Aw�2wÆg›O¿ß\-ŸYÕ$#"ñÓãÁoj·äÓ3õf¢²\_·øô)ÑŽ»…¡{[–êŒ'ä��Ó«z')�á±îÉñ)¥c΄/dƒ¾Qÿ·U•jqÕ–=§ßøšœ¶YÍáÒ#ôeKdÈ á !×TÂñVîã^Ô–m©Fsä�wÚÆY%UϞݣl«~™š!èïødœ_¨à;yO_“ÆdUØbÒ\6NÖ.æû€ù…‡£™ž-÷Ç Ö8ÿÊÒ�ýÏÒ¼ùÆM®¨mj…¾‰zFá ^ ÿ”Þ~¥�+± �qÆ/ÈTOP¹,¶¼%Bzßæ]ò½]…å¡ïªËÙ[ÌÔhýð]D¨Ÿ í5µåþbKÜß� Ì>é4ùkYl˜ü3æÉj´ÿì6 Çš3DZg‘IJ‘ò†[m©*½@âe�cE—¢? 61|f~¬¶kçßÏÒ…#ð9Í:þ„ýÐÓ±s|:.·ç6÷ï�çƒ{-z:áóp€ámýAà›y:ýïäum…›;hì]Õ Z‚ÚwÔ–Kò�A¹rÌf�¦žAôÃßú¶=ƒ6Eˆ1,ºjçç³.Vn¤aZM»$þèС²ØlmÝ]“U¥±Ÿ@/džþ³‰j²ž—{X~ƱEÕû%i)go¯Øm¿OGE3Wé�ÍÜd&&@K´w'¦[Ñ'Iߨz©XcÄ�ÍéNZÖW—í§Ejä{¢«ÒÁç. ¹dr>›‘dÐ_“¾�´­±&F.ú>® ³êûà$>ÕˆhÒÓ¼¤Î=)pÌÛ€Õÿ.f§}è–‘{øx“`:Tû#ë0ûÓö�}]{²CLJŠ5jöoŸØÍÍ]ÜÌQy�v/XÛY’[n÷;3ß…1ú#ôG“é,T°Jè°*­£lz"â„…f &„30Ô YNgC’“Uy»z"L³pD öxb@¥)A´œ”4�‹^S2Ãæ±y;J¬|´©tR r‡è€$Ç´l6öì7‡föܼEÜ'‘­*'ç¢ÚKs ®�8‹Aªd< 4o& ¼€V~äjàTæ°è¡‚£g8]A0«@T*v˜|0Üj¡³ê–Nî´*­³ìz#ↅv åø*XŒC¢l‰içD¨‰p#áFµ›Æ¼6ž4f’T¼Ë*%n¬ óÌfBœ67ILÖ¢?-”iºz½[{îOý¶&,¸ŒSAPP…çzÛT¶Ê.Z©“¹• ®˜ž=l³"ýye‹6FíÖÐFF|1„dV( ؇èÐ%<ë›VáZ÷ý(§ rÚ £Ñ"0ÓD�ä¢ä³H,I:¢)JHÉG~1¤TiebR¨+‚äÓ—¤V) £%¦Ñ"£å¦­Šé2 ¿¾y\Á!yy}p¤¬¨i¥ë*½0ÌMÛ¤4æ�•(ì…!R~éÂ*õ©CZØ´§àËtv¼S¶RÔ[C›Èô25àNèM½)ð¿‹*ï¬ø»f ¸à½~A¡ƒ�Vhd?m´ƒWïE™ÓG“Z« k­Þø˜q±¦­rÁÖPEaJT±˜Îƒ=¡Óz- 90­²€áNX“õ#6„㈉2CZ·iÉsÙ㫹JM”¯m.hðDí�„!Ì6«¶°NfÂH~;ÅQ&Ô‰,à‡ ÑF”]-›Z;Ùò & fR^Ô‰ºDPÌr-0­òéPr5% {*–q5êhœÁ“K£hê �ìJÜí�á±ÖêÁ›�âŒeRIÝ%ôòÅ… 0r›Â[E. I'¹–£D¢3•)Nè‘’ÄIÈëæÊz�5á sQ &! ÁÁJ7‰E’j+È(!$Ëóa% ˜£EØF$)1iYËŠCˉDo >üÄ9©eó‚ãhlÞzxø’×ÝDïJZü·öáËö ¸õóåE«j¼œW !LKfƒ†Mð“eì»ZšÞvÓÓâ§ÖzU‰êë ÇéGEÓ»%˜µ›ƒk…Ç8l)Ä: k1è ”kÜ[§nÆÚ˜~+S¢Ùa+�VCî¨ÊSÓøØÛ=û¡\çÜ´ùAê\<ÊÒ'Ž·Iªbêš©qÍg´¤\̈—ÜÅÄ£äjŽýE�[I=’º–©©ôm]%¯#Ï[º1Ð)} ÃDgÙÛÊÖ.ŽŽ*­ÛL4†bâÅ…k.*çøÔb”IŒÌK­` Ù‚}=/­ª€áMX’q&L W0¥ø@�qÜ£Ýü€hèw¤YO1 ­:²Vj‰Ä@ Áb¥ùJÔáö¤2¹uÍ1B`ÆÊòG(¥8mA’xVH¹{;h¶’ñ†Šg,jwS¡ÑvçU¦²åÁým¼ÐÙ`ìŸvGaÔ»ÆPlZ—iË:ƒ; Pj‚=õIŽ0p…(\œä;-´Ë.ë$eG™‘œdó ¯7í’þ³Ñ•@.áIê”:Õ©Ž¢‚ÃY.ª”*[:áÓÊÜŽôelÄ7-#½§AôK .ˆ1òŠ*ËÄv �*„´éÒœE½Ã„yÊ´(èÕrBGU�WǨ¨fe¤t0NIa»D lÛh£sBê`@B^ƒÌ¤µ,‰-¦a(›UÖi©}ÌU@¸õC›Фmª ©daf�UÙ$ŽÚ(Š6,\ÅãÝ€aœQÄj]½ŸÝbÚv—F¸p¶—'æÂ{¸ñÒOÕ’¥ì#a‘iË …ØÍ3ôD`Œm"œ«Àº&/ÀÏe¹Æ<7¡º6dK,]°»ÍÞK2L€Ó¥ZTAbhþ¶J 9Õå?é¢âµëÒ³©Æ� ¥ŒLXYŸÝ´¿+iâ)S^¬;7^ïvO&)¹®³›ªöëÕ½‡b¨ÜîŸî rXºë ³ð³¤?Oæ;QnÙ}ã‘o}xÿþò}ÏÍÑü8ƒ™€ø`èÙ:×¹#¸ÖÏ8x#¢Ü£¹’ô?[r†KfxãæÛÛ‡íY_™¸hÿ-\= ?h§Õâc»bˉO(%E¨*€Â¼Rý< /Ç \!vô�X’_²ßµL4ÿä XF:Vý³)㖩Ȳ£‡*šìãŒì«èùtG©8¾Ëo¼?½§ñy«3užn†$k—Yu°†4tX-†Ã4fÚ/¨ß”SØúîª0Ø�ú]Y1½g»ôÑE#ÔíÃy¼8?Y;èIܸ~´ ‰ÊQyKwgV+¥Ú72òäR_ÜÎíaTmæà²©—F¢˜rK–ÌC«mäÐï®&½Û»úq½{â3•Õš½d¯÷]ÚW-ûúñUá—ïB¯9oþâ�Þ<‰Æ³·âIKyù˜ ùÞ�$¯AÝ™{ðKÕ=}Ç¿ÜoO:>šâŽLÞ‰:/fËeŒãþqá>áGÝ÷µ›á ̵e˜k%£‘ ú„¤£°hc@µofÅE{¡Í»XsLÏy^ÄQ!:6ó˜kã˜{C)òBlqöX»³r]ªz„ QÃ+Ìu¤/#Ûó£e¸ïÑÆè…ï"S±ƒzTkÛÿ†0/ò%ÿâ =.zý5>ÞÚ:q¸G‡‡+ÍæKs ê*c¸A;½�é�Ä�æ–é=òÃ.qé�íÞ÷0}ÐûýIcÿ�Š:~Nc™êZbÆšóö\“Å¢ÜÞ‘›½|9|ö…ÙjFt=¤‰zªe‹}J}03&þŸû8lúÙÞ£'OmÎ_×rG&רî¸m~ßeIò?™àáwˆ×âݸ»oT1Ÿq¤Œƒ¥Žl²Ðaÿh<@ÿ^ßÖëSŠ’Ê‘_ä ‰½ê�ÜónwwúîG�=J1,,Ê�µðãûð³ú«ìß@v!–ZÌíš߈Ø×ñgÊëÀý¼ÕÜvuQžÒô1g÷ënôØz_íizþƒ7|?Ã��άֺNI4Wÿàœò½ê( Œ²ÿ%é¦ö�€æÔ‘ÁdG[§P`ÐbKÌf±°<·š~ë<«î*š»#yt­‰6'5®Nþ[·úŒ¾V„zoó7×®¥a9<—%ãkk|®(ý'¦O°�An¸¸ØúªŸÓ•¸¿V®ŸãjwÔ¶‡Ú|¼î!{©?yŸ–càdp6ÑÂJ¨©[÷ç&ÂáÒFìªÈC9?(ðC2�hv7š -´òpÙbÏ'Ì9s£�›Í!œ8¥yÃÈÚ N$Pà&þñ&ñ46Ù8üà±ÕîøËœ=*XS[á¤û�R4Þlï�Zi ßÓñÄ„]èÆåN(Ê.4Ù´(æo0�yÃmƒ¢”`"ÎÀ©Å³'Ÿ V\¦ í]úœ[†é͘=J'æƒá�¯loÓ�ÉPô-ù¨�Æšå¶Ù‹�{×2ÈÛ‡ÙåEnSOº,V¿H„>~ã9ŒÞJr݇Ä4üöŸŠs\¸ñÚ·ÁuÊS´ß!Å‹ÄNôMrº£Ö0ñtÏ„US#è«<5ñUê$|pÑnu;ÌI‡n!ίKù×wÂ~€z’ÿÃY4ÇÿåÔV6æÿïaô¶z”Ò¡ÚÐ!Ûãü½”¿ž‘žˆ (Ȱ' 8D0Éé�í]Ø ütÜŒ¤?B³mFçŠéܺªÚ´žù]ËëU1¬Gôü <£ìÚ¼q¥mV$ÛˆjeéÃÁ¯`eS@Eg³ÿ#¸,ÍZ;Ñ)ñšŸ�C¿øX,lM åH&™ÇÔ­qŸbŸXú ~ ÑFd- ³éöœ(é Š*[Aë ‚FeåF—Ë�º±ì›ó}¿J¿†«°/ïoFêeòwɼ†HSn5•Ài²ó1=â÷!¹˜�Œä5Ÿânß”fAÝ¿�転9®ìuYå ªM¾ÊݼàZoûµ×±d‚2îÌïw¾ÎŒÞÌA¤M±<�¿dñ_üGˆ‰Îcš‚ÖµP8ÿž!xØ‘VU ¡hW²Ë¾?SÎM—pœËÈàY»ïÕÀþàEŸ0²Êrä0ÙëÑ`´ækþx~Œs¬¬w��UÑ tÓ¬O£¥>üصª ÆÐL°CÃ:x“5HãªXÈ´ã`•ß‘Ë{ÐJj“Od<¶ï9�œ§œ[Yƒ�y™n�‰UY•|ɼðd•‘~’�¡ß€ ‡ÈÖ…L�èq²¥ —|9èV*®ÊÎ ôL´@âª9¿rNT¡Œ'6awíO÷=Dî¬|Øiâ5W] Jmœ©¦?ëw�d` µ&‹Ûvü6»å¼ëŽ4?ÿÝÚ–"lÀ,¿ Ýr®I+h¬ØK)}Í º$hÌôW ðÒèÅÊB&„uŒá: ÛNle\T"‚e“äKý@ôL:Zyee÷hWWg>Ÿ4A`-æêÖ Gv‡¤Ø‚ȃu¾ œ Ry~2Y¢;„Û(Ö‚n!³EnžÌX[‚Â>3!0ž-²yà|[â"°ÈhÍÉ=y´-?­ÿvù†^£2<ö¬€»ü†aªF£ †ÃØg¯ë¶Æ]ú"®ùR¸t¡k1v6Ronqìè ‰f Bì2C¢,Ø’¥TôÒ‡gDeo™\†’vCÆUÔ .æ‘Ï‚À;/Oms)ÍõÓ”¦F’¤…‹.×¼‘"PF�|pôV|§ A¢Yº—Î�Gã¹{&T'ÂËG§VÍîhd›ïe³±çßÁ·»|ÞæÜÞ�_Žóµ &RÐŽã(ÕÇH臆âѺãIAõi4ŽÏË.ÁõâÎTE¯ÐÈvfOÌ^×ÅÆ(ˆ$…¿ÓɳE=)ø"‡øeq\^‘<Ъ^ã¤rgâ6܈‹j8Ÿnpƒž0iTJ·l£s�ò#Hس"·\|ƒ˜|^ä�óœ”îÖšŠ‰ýƒ>J÷“Å|Ú¢d‹”Y“ åù<«&r°yâÈd¿;†W7ãMS锫fA ª×p˜jI…ÒßÕŠ2 SwæP²eÕ’¡¬%TôPÁwŠHVjè%1±B�i’S !ò€*ú…ŽhÒÄe‹ìS)�_^éU% uHsg4*i—À¨TKÝ¿ái��Â8a¡¹[�hb�“Ë’ã´À+Ev¬ìò¦vŽ2¤«5)W–FV” ‘áaïý.E µ O‡‚pƒmV«ÿF§Œ,T.UkÕøô0k²ÞLP[ìøcÒ¦R8(³åçV}½ÌK yú|Ÿ©.�Å~3uìpAÚ3å ÚI†gµè ÌzÜ;„å<•h®x¤aË;†Ý‚9éd”ÔçP ÅqX{»fö‚¿Üm’Îì‚%µ=ÍrÃB.Ó§vÝsÕ&póEöué¶Ì³ îx&³¥PɧîUŽÉÉA¤ Äh¡„lûO¡ zTAW$’‰Ž/à¤X¸õ„$‘Ðu9Ò—Çca’oo§¦eWºº¶2_᢫·ßõ—¿X+E“œƒ·²fˆ.4ÝÚ´ÐÆ…H>' Ù¼lXA«uþLÍ@‰Ö†æD�ËÌ}ÞâC]W�í†�Z££j瀿¸Ô’IíŠmé�PL®Ö®-’Ú!2£4¸uùÌsdçw‘ÔWG<¯W ÏæþÛÊ:�Auuš.- dzékÊ‹½7ZÉÌ�¡ qÂ9(‡·ù§r´¶ÊÃm$•æ�$(¦Û z‰‹Á!o³uaÒ¦ýŠáÕ`"S�ð³ÒQZÞ*’—�?Èf<\Ø ¦2ݺa‡ |zÿÛ¶.bk~;í>ûq~+;¢ªZµl£yż°/ä!xtò ^ÁW¾«ƒœÛû |"É @{Žýlÿñ é4H�pð1­Õ«¨?¤Ÿü[iÁ8BD{i>�VmÍ`‹§+¨ÕZí ·g¡ã ?È.ªyUa^X¾çܙɊ¦ fÉè³B_�tú5Ä´d·Âz\üxiªµÙ,® _çV)S±èRd@Øàu<ÅÎXä«‘Ö¬ —xC*Â˵߄‰VÜËã°&EvÕÀ…Ãç¸zeÆ-QÞÀÜŸn-Ðn¹ðQüKUÀ¿ÈY¯ê2ΫUnö'O»TÝ0ú%Þ¬z€�R Â^Gáɸhûù×'R Î;ß·ô¨ƒf…#sÄ*+=¬6ßB +Ü3¸ß_޾ÄŒ,œŽv2¦ &�h(þ¦ùíá!J¨`£:TõaÄQ|gj™Ùò§Q‹æ�‘G‰¦†––ªY+1U•µZÏò²â'®M-íVZælºÚ0ÅO—G.SNQЬ#Ö+0s)ákzô'\S1Nt dV¶‚í_*ªFyìôbö½À£./|·KxݺƒÌþÖ& sBse‘þ¡× M­E¡ÝåM>SßÍÉêÄ.‰¦_³ ¶+mØGæþ­èE â=ºßÔϨbk1R P ðÐñpöw•svÇŽBùs3û´† ï =ÒaŸ¢Æ�Tœ|ÎJÜ™“7~z˜´ J/J Ž[V½P;Ç´þ`œÍ¢weäó÷;øØ\K�ñ�–:lz”~!­å’Ò�`§°ÿc†µŒ`Œ5ûÛ`Ó­A®7<ÑyH°nI8žÚQWVo9P/*àä®n¹d$Ð.ìÊ—õX¥+cžJÀP5«›— 4 £i#èFWÐ�Õ¿U±ƒ“ûÝ6xñ“Eâs¡q£hs‚Þ%?“¼Xƒ{d¯~Ænî±;�XiL|ÀÃ-M²¹ŽH:–<ÊÊB}ÕQK¼‘«gCÉàɵÒÄØ%�PÅ·nw©$ó$ i&µÁN�óQŸ!¶ý°lÔ7”Â’BË+R�“w &X4�ôm½áyë�'š}ÌWq8y»—=1Ü­d†åZ‰÷ðúÆ:3ÿoO’ݪ†nÎ ýSÐ{¥ßÁåòãWwŒºl¿Ö5-mÏÚ×¹wñgŽõÊÿ¸bÊtÇÓyTiEŽRâ¨ãYFë©]äTmã0‚’©�;(ì'§ê†|R¶4Äßq>6'KŽ“ßÕ“Ýsú*®‡³@÷ÅÀö‘Ž!'“‡ÿes5²N‘ꉗS¡'t.EëK Ãïí`{1gŠŒ¢ÒªÄ,ÂÈŸV¿~Yoy<ÉVG­Çrù.¨þð\¾’]hžÎˆO…^æ8ïÛ”´û[§¯®rÍ(\©§Þ¯äû´“Pƒ’dq$çIÏC˜ˆ’>¤»dê'DÏ‘G)\5o„͆¡ãå2&ÚÓ0¬¶xPR;æíõŠ]ë< ÝKþÁ Ú­�ü‡ë›ç®úxöÀ¦×Bý“c³qÀ }ýÅš¸ò QžÖ¼¶­Ìˆwø:p†!ÜWf3¡Ò5ÑØŽËQH¯ÿ=%†‹9ޱaì6ÿ Ž\$�†’Ù|Ä' ,K.ˆë5ƒ¥�ÞVO]  ü²ÂT̓9!ÂIÚŽÈW> «8%”س£�~Ãl]ºRG@¿E9Cgl$õ5‹ùÎìLMa¦5Žžú„8 ]D%ŸJµ².9AK�!Će�ô|6c•ú(É6­hDþ¦–�Z°;]wñÀ| ¯nŒ„+NƒÓ´~AãI•‘SuGJÉêÈN%`ñÃ2÷½A½–w;êkñèÈÁDo�ìq¨„.µ|fé0)ûÙé0婊Õ]vEíöŒnpóȰõl,äÖ™ú­Õ*ÌsÁý•z:ñRËŸó°)¾î¤‹3hÍ’¢±¬\Žð_l[^V¼É¥�aÑ=Ap›»T \ë#qЊBð' Äa?:óu-»d}êhÄΨTÍcŸ§û0à:cŸ‰ôúLEgÚ g^¿ÎÏü�û/"m”†Á³ü¢¼SgR¤WéTú h �î†U£3ܹ֔<ÊÇɸäˆô¨žDf&…]r�ÿ£;9ê—&ÏèÒJŒjä7o /bʺ5Þ•.À(„‘ ØnW¶ÁrWYë9ùÄ©ø9\Þ-#ƒ¢jpçm›¸(},+Z‘w_$¤F‰Þ�Lª­‹3cÒDÞÍšö’"�0 âûaC.ºè° €%ò¿¼qÍà< ¶í_¯ÊxžU‡Ûæñ˜ È­ßv)T=!ÿáò).ÁÿÑ[rDO”0ù+ƒ€¯'÷N©ü,îÜqÛø-Wòÿb?¾g䦎ÞRÌ´W¾Žwò`êðüC2¯8¼¨ÖÅG•/W z®ÀõIïz ×}ç›v6ꨓÉal’V€k–ÈÆÚ‡&t ¼®}Ž2£"0¥ -Hú/@;‰Õ¢þŽº'±Ôϡօ•öÖ1x°¡&ë`ñ“ YŠm %)YPâ>ÏÏiŸñ¼ÀqôÞ~ÿa÷ÄôRzÆ(÷ÀáP0ßÍü›ã=;Ö‹VUjñÜT�ŽÅfk¤EÑà;~[8B>Ð|.ï÷–b,E^G_ÖcÛË_2‚Ql™;þÔê§TÙÃb"�­dÃ!àÔ¶~=†çâdöóسxÒù!ì„h9rß•5Ö’ëê;?aYA—ª}¡nMÚö„NI—c0Ÿ¦õÛm{e¬úæÀa¸™5ãîÄ\UžÉÍΘ<þN\Ã¯ÅÆOã×?Ì•V¸ =Wl욺 Ë1Ñ“‘ðW«lôf2¢Ú {Ÿ’,݇æX7>[á�€®Ð9*…SÞpâz¨ó‘No6DÓï¯Û¬&ûHÓ"h:oü0+ SwGƒ¥ôé 4tºQâ.TR$)tÌ­±ïâµùÀ.Ù=:I¸Ú«»Kg++ÖñÉH{›0TX¥ÆÄËF�{ι˜ØÃòE“�Þ…Z5øæ¥mzèÙÁÿà<±¾ Ò¶ K6ìpH¸ríç(ŧ4«’/Ø ±Üã}¥K0J_9`ytŠjGÕ0BÚb;±>ï³­¯[tž‡}Q§PâõpÝö‘`m—*A ˆdœ±]: Å™•hC/uF/‚Úx°· FõoÉ ±žõÊŸœ=¥êÚFc¨Šò®p`i{· ƒW_gá© Âa}øb ×ßq‚’+´÷ 2—×Iu0í0 Z�{ÊðÚ¯bylƒR˜¬èÇ)ªÛÊ-œ¨ö@6YLK�[¬ëò?6Óž@?OçÅ�x$'•âŠ9Å=÷=›GN^ïHÊD5Ê:É-­HO1­¸©án�ÇógÒ³Ódu‚ùtòü³égV¾b8¸¦œ’‡ÜÍ꟢ÉðæžÕé¤ë�}ÖÅ*ÔÝi¡ó>ç“_Åoªx•fÌæwÉM>þØò­¥`}�õV-Ž2�¤œt†Sùøgë¯FÔÏuÖv„ž×·5>üË~>*̳ãÅúþ’£V=snœÅîWÈí­sRùv:ñ¯djõ{ŒŠª:rãºä‡,J¿7ÓÉX­«@¥npqƒãŒÐ?õùí /ÄÖJˆŒÒn©<B‰ƒbûFÄÆÔ”Æ©Lñ5’4Ù÷zŽ�*4WoA§I/ØÚ§¤m2R]«¨Ò`/˜°MRGÊÒ”?žkºÆúõ^¼ÑÚ<‘-`,ù’Ÿ†“¶Ê²Üí�fȲ­†Ë^áx®Ñ 2«è(ºlly"EÑÆf ²ÇÚr°YA¥ÆÈž¤ 0‹ËÚ ®ð�% GU2EèP1šöÙè5¼,¢ðA‰0ËØhÖ@TùUo£ û þ¹Ú®W›l�aZŸôrĨ³Kê+:j¦©„�U#«&Œ>øÖ1Úylɱ_FÞ%6µ«9'6¯Aºþó°ºªÒ _ÿŽÀœ )4P�·‰�B‰#_m6]�o$ƒa NÌÃvi¨¯.ª ò \8+ï[Ë-eÂØÌòwÿ­ÌkøÒÆ¥BÐU;ßm„ÉQú„b+«°×©Çäbëï+¦K„˜ù†794g¤Rע„Î[TÅIè_2òì@™m hLg,¿ZÇà´£ÃiµußjÇL�=ÎlË(¥Aèc›ÂV*-«~›ð8A$í8‘°ÉŠ‹Zá ÝÌF5_ÓLQB†·€±æýñFÚo¹>²s"TUf™1ùðÙiácÓKaƒw^9¬ Ü[›+…ùõÔÉ›VéP ‡«58z�_ÑUXv¤Ê¤5̈¯6XnÕEëߢäŠn¯äú¸’Ž ÕS+&dsÁ™¼GõŽ@ADŽB%)G Ô@Œ�Æ�Å8…Ø1z½ÊÇ+ €.*ü;Ù+ÓOp�5ýþ�Ç->ÿ%€p¸ý� ]Cço'"Vžgy†ëòÃ%|…À¡QQœ¯EfŸÚÌûK }ûöT æ÷+Þ’˜k ©Ù·ÛÀâ„îQÁÑ.§ *ïÝ̈-Qjdc†a/À#Å‹�?q´×JyžJ˜®ñ&hòÒÞ0¸LFº +�ÍRPò=Hû/‰#4Nk­¹L�šµð$\e3ÜŽý‚!ÚÔ6cPJ1³IõLÂØ�7#tïP{Ÿª?òƒQ9�tƒ†é—íwh·9ÿ·lù²·“ ÝþšŒm‹Ý[” ï3Ÿ#PÛÜô‘’ÿÓÓ@©~÷RIRDµ�…>í d=÷‰J¦ïßÞbÃ3‰¾–©‹¨ˆË\zÈiý$Rá"+íy-'ÃN>C~Q@6$3"ã å1(·)Ñ\P5ù…o3ùuf1²±ÌDD¦ºà…̤òP㡟ûÚN%±/}ÙÈBw èe´qÜöó¿ã ×,š³çÕ'Ëê½²�î V~†ë0¼XØKrëÓÌ®YÕH-І® ØóŸFKÈXņÝÍf°¿³îÉ5e×Äsäc\’ÑrED‡=dwäí#$Öðv ?ç³�SÐÓ‘Rl†v—¢½oÇ»´b9çÎÊN9Õ o¹ÛªV€¢n4„&C¸®ç­à<÷o†áÓŠ'F¸4õÑ©³å¾ÚfêíÄ—Üþ©|â¹j‹[+²¨û)+²ñƒR˜ÈÇ¿rÎd‹N‰Ù`NðJqFñèex¼¦ûÅ»7z΢i¶~)t}©™ØD<dâ.d¤’ŠÈÂDêvÆÄÂ�‚Y‚—�qTi’ì„J^J2ÊMLîd—âï'„¯8›kß3ƒ)âuI™€ë€ôAɈ&}ü @¬ŠœImKò¢vz,ã†n€1Ë¥”ÞóòŸK��SÑ”cSÈó†ZÊÆ[Õðï•›Šñ‡Õó9’x W±IªjíÛiP¸bKʪ¿V<0S–ˆ{ÂEÍ\Q9Â4ôÃßý»R6k¥øö 5ÁQÀ¦àko='0Yý‹>z€&,…e…¬?͙瓌*ê|µW­È ŠÓwW2ÅR{šÌßÙÑñ}¬~Jœ6ÞÊaÐ}ý„v€*<šä³ù/!ıAv‡qÞîÐý=m}ÿ�®Ðóí"‘ßù±²dÓ] ÜK¸ÖéŒòrçz:Ž~”˜à Ìy„™M ’yŽTi€Îµoùø?%‰�ÄèÐ8!::Dzÿ¦æ)= ÃFÇLÆùý¾òY•›úÃØqÿ5ÄCÚCöb£°ïÓ»MA0Ûüjzwd¦ý|å ¤£{:€Q«ßÔÒÒù@ ¬"Z’ Š aZЯƒÏIíýN°ÊúÌÀ d„šbTˆ[Ì`ý„Wt�&>6�*4¸Ê?–l[öÃ܃ufÒ±d7~×kªËCï#@Œª‹y´’‡lŠë^W´³ùa™x¢G?ÜÜŠ€ÒÊb€¢ Q5­ì ÄÌß5ËäÖ+�:E÷ÎÈÎFJcpJA£æ—3UZýÂ{q\P»ÎÀ®b$´|¿_ÇGl(*Œgóh á�7u1r¼ÈÛÄ,ÈÊ|Îòd#«äÈe ÐaG¯úS#”i‹X)êî¡|Cð5Ø~ë”+qç’ G ЯC7ºß7þÍÿÞbcµ<[zå¦fXŸ,3‰dc2˜:Z4GÙ8ÿæ•û%ÅD<˲E÷Š—r­¬nÁ¾Ë‚ O68�EXqAþ/£¥5²Ç°ÅF‡f€9Éñ‹åæ²ÿ`祸s’zWHÄ=�ÑÁ vÝ®ÿþöúSͱ!»y=Ðpq%!åFQë]ªìÎê.øKÍT“!úªàÀÊÞ•££óS ¹ÕžÅê~kqè>Õ€õ\ªk�Vó²»zVå!ƒ‘�ÌÁt Ž~K¯Zd³¤FJãIœ!•²*òþËò”'juD6WW·ê�ÜõGhÆzD¹ú=…<¶çú?à”¬ÊŽÉ ?:šœü’j§,‚ÔsÂĬM;MTÎ\àKID|$Þæ]PC}w d?úV,‰ �G@}Xãc½HƒS,2!À3ùõËÄ÷äd™7¥Ä}¡·wò¡„È”0ÏFž¹•5W·z±Ôs†¿k“ N=ï‰÷!ü_í]�ß\Ò Yö4ˆÙÓx�qêáÊ5ˆ‚>yÑõ”þåˆmŠ´NK¬·´Í}�*?W öé0ÇGî·�ùhm)I>´ü¬á¿³ZzI†´j}�Ž`-:'-Ï·C›DYx®™�ÿ:ê§QÎI4Ÿíí¾J…iÔùz�p|Þâã�D&öZ$èŸî&›Î Ô1¿NÜs î‹Á;_{.‘{;Ñ‚ûàhל"ÇÜhëÞ› ÚߎF�¯Pá·iëêxæKðï�õ9eƒS«¥€GÓ°vš´7Šl÷¤–Ñ$û³·µM›Oéä&´ŽY�rƒô­SÀ³ñRÝk›2+ÍšÝ]“/š+šï¶äƒµŠø‹ì¥ÙÂIpi#]Q*¤ÑÌ{‡‚£r*�öQe7©>wæ"Ç %Xß8ôX$¤ùZrïÈŠÑY,—ÿÐÆïoÈ"Uv|K|Üsi\E 4hUK 4eü�n³LÌrãáø+.ó×E½¼tUs_+7˜�©U�§hR—¿ÆÅ²Úïùªòxž $Ø( ½~°†]è90Rä3{'´‹qëÞÎ)EÁ#2-â­2Õà$Å/ÏM¡|8‹wJÉÎ6ˆ¢IpÃÀhi,‰xîþÅIF f‘~W¦ÂYX,Êuÿë#/Îdç/f,n(ÙÓF± Õ"òŽù°1[NÔSïHÿ"ïµ-”¨¸Tnó±ª×Ð|Nl uá(¨|4ð'«Ù9¶Ó4üˆ&©qM¢Ï§b¬Ý …p²LTã[[ñY¼nÑÚ�¹ß͉_%ÏZŸË\ 6Š¿­"aÓ"ŽrÁxÄíÙ‰&Ù[(^x#±ë„d±<ÂZöMÄ}”Ìr‹k¦…r¥¹@þ(a,Ƭœûµ±Uڟ»Q6™V«’䲨ÆÒXôeæ{LH�ö-¥l®³çM—½e’XLs”Jì}Ž0J dwØ*Ö! mFò葯$%¹øçÀ0š¨çÙ[nƒxtež�å¨ÈbyåÙ"÷OK�äÂã›­ARPÎÒ´`_{_"kY=„¶H²jîù%k×6_¢Ž§rªƒvÓrØO…%`Y—Ô(ÑiÍë&ß"¼¹3&™B‹‡ÐöÌ›ÿhr‹—`¦B=—xS@ ŒvÑõò6|™ù¯�M›Sg1FØó\1eU614ö¿GæWµ ±+‘,6“þpô§L²[&¢y§ì' x™J'±_,. @è4¾JÝÇà¶=¶Ÿq±W¯^;ŠH1Œ¼.ɺOË÷�è˜Ú&¢åj®’…xN í÷ݕظ¨2ˆ¸J}¥=×PŽvö�5ŶŠýä[<2\QtAá ;‡4Àq«�nÕ¦¯&iîóŠ7¼!ŽÖc=úª¤Ü�FÞ ¶þÌ 44•qÌjf[#™† Fõª—³í�ÈÉ—ûZÖWã Vþ’9¨%bm³û¨ #¼b¼È|Ç[X§æ/Ó&ÔW—=j”éåFd[†˜ºUÇ-O©Ôß„©¥zõHòîWÓ^²êQT‹ óq-wq3æü–ŠÙß¹c\™bùÌqXGbñ›u…çlÞUHz'j�SÉîòŽ0¨ÍŠ—õ¦“±)³ëvãª3–•ù|Vüû oxdÚÑb¦¶6óõzÿq‰âÃÅ–’Qóׯ¬öø‰£šôxêý,x ¸zó¤6"ß;'Jˆáû�{¡º“Î>+ÌËÇ’ÒŽoñ�Í÷§×VÆÄƒ5ùøµO´“”ÜDy'ç«pï;Ëþ ý±'õ]¢¯¿¯Æ§¥_mãú=Ód[ JWsf§'>§<Å*`Ž3\¨,–RŸˆQªx“æ[ û,×÷)×%ë¿Sz‘â|hS¢$ÏRüöú—ÈgÀ‚¹ƒª9Mq޲\W Öí2ÊöJºu¦/E¥‰aw` ÈÓ«£•V™þ­îë� µºz¶ãæ¿¥ÊPƒÂå˜#²Ÿ#|Î8E+äâqAs.×TD¸eYÏ'½˜­¥ŽÔîÂ�<–d M—C9u‘¥L›Kü¼.“*Ê­^üK[†9xá \ù½Tñ*˜ÌŽ1šcæ¯,(d7 ZNV¯#Y&ñÜ�¡ðÿ˜c&î%_Sò“ ú+ÜCô2çµò7}€ruà&7µ‚Q²uƒbeæYP˜¾î5�aí^VeÄgÖ.Î�éœ{ö.wöMµ1†¶çžû›‹v±š“zó<{¹Ú†_‘ÁT‹±Ä“’º40R]Ýó ne“?Zm ¬P�l ™öÎÇ+Ú—‘‹*Œžmý ¾ò>G�“žÿ•¥,)osF¯Tä3à†8¬Ò¦�ëcòÙE‰Y_˵Ÿ×h³DXš^�RÛÓ¾ä¨Zó£G\‘ÁˆÝ¡‘M¾ªw¾²Š{Ó¢tèJO®¦ É·ß(A]²ÜòOa•ÓK¢AKÆ/Ú«R?ýã6Jñ™V|aÁøxMEÌ7ÇŸ˜¿ÉH$ôü‚“ëü~¶îW¶•œÂ%>ÊsÅsSØ”5C‘¦÷—°¹;ü“í�‹rà0ã-÷PmL*N’éjkÊì„TOù¢ýÉÎU¬ì£`J؈ã�ÄîQyÃz@®¢�$G}#û?Â{·"°¥ydµq�g–”ꜶÛñ8EnZekõÝð[ÎÔ/K!‰Z’¶­ÊKŒžî bŽ ¼¬?îHNŽ˜:‹ÖÕ®|Šjé�ã �‰/ÕçC¿e©™u{~Ž$$ÍvMÆÎÁt¸å嬦ajä›* ;üb†d6©r3ìÀû#é¸Ö‰/Ð!Vמ7vÑ–Rw|î—Næw¹K{8œÌmpY&ý¯wÖizr­Pó^7é!’†£2W{[NKvä¥Éᡃc|]ùs`ãqÃFlF'õˆH ÍÑLÄÒ=*HÆb‰îº™PÄ]],ñ{6’¯ÿÊHïΨÝc�üñ‚Fô†X£Ò×3˜¢2‘U i1תö~gY\±”°º/!+¢pLШÑï©Ô8§‘Î}?Ý…á'#ÇT5 #èt,Ùã‚xx÷„k…žç¿=ÀyIrâ~KN—&\ÿ(FwOßd”�—0$)²5u$±þ)ö†‰K!Uv©^“âûrh�à„Ÿ¶mhÀc7–¾ßpè,�à“A(®4àRï£ólþa‘,tAjq ²�š`Õr„BÛTª@ö€Ç5§ÄXPêX{MøýûA½Ưõì*�€»:<‚ž„±$þ(6,¼ü´¸w£•€‚£ìLØ#«dxB&Ñ× pöa …OÈËÞTjïT”Ÿ´!>nó•ÝÚ\t&LˆæÿØsŽÙì+|}¿áËòkèVÏV£I&q$0úÐq,Ô8$¿mëx| ÕyˆN R䑹#K†ÃU§sSߤ¦*+ß9‹™Êiû§Bðcg‰1–_!›`]…=l“?æ3/`UI${ü]–J¹ó¶uê³ðÜ^A’ yÒ«Ì£9à ™QoŸö52Éɹ¢%$=pY�ž€x͸éÒDŠ˜Ã݈ñ í<©ˆU:#VçðÒ}ša‚ Uè!A©;éÎG™C [ PóžO¿k”y>Ð()e™»‰ •.îšgW‰Tº\k¹DPŽaJæ�pÐ(¹¸ïû¥„…B>ûÑi6-è÷\­sƳß}&#qŸîbíÖàÏg<ƒÛ»UÅ WØ4 4Ÿ(ç C ]%Œ”CHkýŸ@+•ýÍ:¶µ4Uûïóv9¹ÛfÑi^ä%‚7‘—¹òض. ††ÜmŒûÚNJßzûó(‡ £�?º0éb¼(4jEY¨KÑñÝä¾Å‹Ü÷ ɽ’«�ZQ‹Ç^[�ÏNx‡ £>â†I¬Ô¦UzÆo%9Aª¾r»Ü6²'Ô$©Cܦ7c`ýŒc»¬í;-“Pá魯(:ÓœÈÊ’º—–S–ÒÃÁäÒ–Â�úïq˜äÄYêé餌88À wèA&úͱŒ‰2GRV�B,Þ ÿÂ[‹’•ž^þ�îï€ëvqpÞ s3îZìGw¬ ÜY º pŸªìÙRO¬‰6h(WfêÂF%Űó©Áak([�ãb�¨ r¤WÙç"‡å‡õY‚„fµŒ½qåè÷ûérŽ×1aïr  ]ÿú2Ta�h›0¶lp�˜ÅŸâÓ2—|ùþ“0rŸ�ZÇ5ä¹i—þWŠEMËÝ;ÇiŲ¿X_#€³5ybé. G=ª%lÝ ã#$4n[&H{i2dY?â¸ÄñÂk*‘ Ä• ‹ß·Ó¡p?ÚŸÞÖ[æXàJŠ8 ·ð&&¿²Á¨aƒeƒ2â�‹÷p‰+ûˆAv]¼]Ñí¦âÎær&„d¸là-ÏVìlȇ#¬#á5棇ˆ†ÍÕÍþ*vµº{QµìÍ,Aöñ�áÅÓ å»YÂÒ–˜Êß+œ´B(•6lbaÓwS:bz×êÛÇíYE®ÐÀ+5}ÂûV2Ùû*1Õ¤�›QŸ� Ï4æÅÛìâÉÉmù};—yV{LPš€M»ãº².£9·Þoâö{r`í_•l7¢‚�“*5xĶÉX jò¹­ŠTFç3 €ÁÚ[Xý؉~؈�h*Ït^²úqÌ:ªñzÆÊãè»@ä9`>ÈKÁ\,^\H—F�0¢uh è+Ez…|É�Í›>M]¥úp«úÕž'Wyh£]u&¤îwùcTæ–²M‘âÕ÷lL"ñ¿ñÈ^ùã‘ÁõÙ"Ã+‰Ojæ÷WQ\\©¤íÏïÊãò©}Û¶“Ŧ &(��c%·g©{¼¢²XžÂ$%—&9ü‘Q_ßJ pZ“ø©.˜)e Áâš«_µ&�Òd›� /�)0ãÄKìîÔ¾”â¶Z߬„Ѓ§Œ4¥‡ ÂOG|‹t“9gÓ‘D/ _uØê–‰¼&K)‘Xýý68frb3 µêÓMOÍ Ãwå)*õÀsŸlXšºÐº/×Í8u‰?ß4Òwý ŸÆÄ%X€QK7 ê è§aŸß¶{h’¡^O«[ÏtΡ Ìù$d¤déBÍ)¨ø…W·g»E�£õÃ’³ý�%íŠÝæ+ÎÕæ›Y«5Àª‘£ól <Á˜º×Ùä­ “gfb¼J‡H}‹Ô°x›ØÜ&<Í]¦Wdª¸åÇ_Iο&û­'®ƒ{dŒ ΕÍ)NÑÄ”y Ëý5ºv`W%;ã"l÷ɲ#záÒ·Öa7OOed¯™‚æ8“C \O— i,Œl ¼‡ÎtR©Þ·È#S½pVÞd¢muìB™6A!m¾Ãç§ó³‘6(Áá»ÅÜ?ï‚)óx€Àˆž®�‘ù(ÕO\UÅ9B,=õFŠî$ ÿ$!G´„©l+,E5`Ѳx–Âô uî'ªmû¾~–âq$ž$ËÓ/é©£™ÈtÞ0GݵÙÑ·('wµ”^«bUâßæ$ø‚©b_ÙeB8`é0‘H‚“XZ¦ÊõõVÞ )¡ ßð¢Ç©)Äm»-Ø@¸ââgÚÎûºB±š‹‹_>cç]féàÞ˜S]œ¨£xn‹!º1Ÿ�ÙÉ/¼+òÇèr÷p›ÁÍ—‰—{Q61Ï.]“ ¥Dì­ÐZå±1uReön©f lzr&ÄŠZÎÉé�MêÂÒ¤xF�2|‹û†ÙògÃêŸV†Ùv Hc÷Ú¯ ž Ó]¬×¤nFc³ß à2žp”?Ô1N¢I<ñØ ‰좹/AÃnÙ(sZ}¡Â]ŸUàT6…æ/�í…ó,òr�EYW¢.¹fÈÄREsí¢geéh¥âÇt'Íìò̆±m¹„E;jǹn›¬ ã:ÑyÈÛ¹îÃ�Ä€£ñé\ÿQÒO²î�$rvÃóGqg²ûÝ™QK;ˆk©tŒúKf &{²àÑÙ7ìL^[\7" üQë¡�ŸêŠO{¨ß P ±h9$w:/—1 2ªR—“?F°;bûï§0}‘äKrANLÍG”ûß–ÈÑ£‰ yWRµ uûág¶»4ØCÉsª:%CÉEq¥ ëÒÅýÉÕ®²5 §aFÈ�‰Ì»‰�r&^áõãÖHÈã jòe gÃ@ƶ¼ð?0ý~Ûd0*ƒz”O–Y/s„ÜŽ¤i™/£™YÍ$‰„²(«]à:“lnÃ"œþþu/,¬UÅW=4W@µ‹ÉŠzóR–X˜Cz<.)} ¾�iŽVщðÀÑ…0(wkø ~tÐ :Ù?òóN«J�]‘ï¡xC›KîAÔ£¸C»,ŸJ3pÿ˜ÍWcGÒ�äbâF0šÚÌ�îʆ[cV!CçÍ¥²6 ã I^"¯m˜B“Q]FZñ‡bßѬ“•ÿ™Ø´÷ÇÜì$£¨–þ�Ü`[bàWÌJǹߪâ,�(žÑÆl){ =µ¯ìîYGëßC™1,_cX8ÀV.æÌZ�œ¹‚-�\ºbü_b¦¬i?â1 ŸÞZx‘p�Âlž—¶P¨ÝØtóëZ“h¦[;RìòÈð/õqÓ|æN!NÕ,{ ìø?-„ÛïðÇ\vÞ·¹�\ 3FὊԅ!œÆúáá ßo™KÀ”uã¥u3’X8Œ„OÅkJ2¦”»�íóí¦éP|9 ên“8*—Ó�ôyÏU5•VŸì�¨æ:”5ò·%�ÍXg0­"r¯§Ô‚¤\3ˆR-¡4|<Œ¬ êmZ #„ªÀ¼kPP'‡^ToM)#|¿6λ€ZQ�†…0¨úŸŽè‚eŒ\è\fcû×½ó€)4~`H8Ó¤ŠBNbܯuí§g’’†ƒn݈¥~0V;FÓ~”:¦ïêµ8¹weþ¨†já)�†X[þOùŠg9äÒƒ�ÏíL$>lZ�8ØyÆÎ»|x¦öåìø²š¿?•ïI~í§Z‘÷�4âçõùÓëŽ9…uô–Ž1ÍÑü[øÅ�rÓóiüYûÒ8ýü®íã‰;Éüñ©šÇõ{Š]˜0‰Ó‘÷-ìƒbó“­rXÔ�9ûVòüú¼Á×W¿Ý!Ù¯”‹\C « )ÚÎt«Á�r1$#WÎ"³Aæ°ð>�Žú‰[fØÀÿAâXyþèÎö…Ú^”;J£ç¬U¾z¼ÞO=z&Hø¶ÆKPnÿ¨Ð™êAP&o�s¿äxʽ[†Ë¶ârø§!? §&¥“ó'áŸçXv¢/‰³ÛµÄvú¼Â€°Ôsô‡çkt=X 0›ý;+³!7Õƒ·gùý¸cÄ ÞÀ¿¶U­ƒØÿÙ>�ù˜ "‡[%ä Í´öqØ“°ÏÃK ‡çqo¦)7 âÕ¡‡©¢zÐ~ÿï9M=<¯J½äιhŸÛãÍSÔ^Þ í¬êWcLŽ|:ƒ¨Ðàé«ú×�MWEJ%Aºr¦ÝŸ’0ÈSß¿†/ü*ˆVDJåf�¦r¤®N´f28/^×ù‰Rµ*¼WŽ£ðâ3…àÌုÔǺ)Ðõ>êPíÁ脟´Ñ/µA­1jðñ #¦íÒñþr$e2]94:9s/¡ T} ÜsÁ):Ïóý¨1HÒÐØ¿êx!�𼨦„Ç!�=ÜðÕ,Ϋ[’¾n=�7¡Êâß“Ðâ ÅÀF7VúÕ-×IHr*nežbþÈçE2T}znTjjÖu=+Ï‚¨ç®%–öb„Þ­“P®~Uo@Oð`>UëI &/°èsªÙ9<ö:OMΖ²`� ‰‡³“’R‘ï¿bØdÔÜ‘ćð˜4Ò0Tä. èîp^þiŠÔöñ>i]O,Ê ¡ÐÐ÷B²´òñR)XýEâ©”ÍI'£«,Ä�C‹Ád�Aï¬ügèžZ¥ìŠ…cÚjrÓjÝxÄ�—c'!ó;Bê°ÖÑ™z@ô?œL =ÁÑÿË Q6æå˜±mú(“h¼e^åXÀ ’+·†¯ˆ„©rH# €* ߪ*.€¬ÂYç«‚F£dí¾<�GÅa|øøt&é ÊzQ" žÓTtÕ{ŸC»t&>¹X¢Nq‰eÓÀX#Ÿ0Ö,ÌãŒ((¬öŽ'*xû öÀ_œ£¤äÇÄ•”„–áݘð«åìØgü¹:’ö4Í]¡˜ì0GÒ“™E«Û¥‡¥º„§wáï²½bREmñ)ôç‡ï\œÁXW‘?0Ò$n}»¦º_YzM`þá>j“3=u»f,nÏ׊³`ïÓà¸$è"[tF-^øÖ¥åª›Ë5¬ºz#â—Õ{~áŸu%iZ˜º,Ñp x«¡€•¨óÕ2ËN­Û­}àñzô°ã‘Y®œB_é¬ÔÓ#Ö¬sÉ^N�ÇK8<Ö‹õ?5å5¶“j l+-—�Eý¿V2Ý+ÔÑàÊN�M™pƒîä‚ä[‡´Ö�mküZ™²ŠÄð<æì=´¾ÎKæ‚ @‘>ßF‰Ý5©8‰ùÈÚQŽ™ÉrG€,–KÑÆþu@–Ç&¹8céèò¤¤‡rªž�åÊ…ùS!ÉÝì„NœñmþçR‰¥|KÈý6”M¦žÒÞXÞ�ÝSKBzô‚ð"þúÇ9ÿ/ûǘ˜ÿýãÕêWZ‡\(>�| i­ÛÁh(f àåãÑ…˜Áıà±N~IͲB‰`÷òf|ý-uÖw-ªÄ¨ö»ÃQYZôXibTÿ²&~Û'ÌGfN¼µ)4¨¼�f, Ñ<{¢ÐC3,Ü2 ƒú|ôMGöèA‹Ø,R˜FZ½�èñG&G«ÜþáÑã¨ÿ)«Üý+ò­®|Mú|³ñ°÷³‡ ¬ªŒqÆ¡7ç8”f1ú+ޝ Û÷K‘$T¿Ù…^ñ7õ;ø†ËTZžy»±.ZÕs°ÿ'Ž˜Ú6j1§¼ÛèÍ*¶&YÃõ›H�-î7ÄSrTrу33‹«,·©€vc/]ñ¦HjB¶iÄ׊jP§~ p’I¢¼SvBÂðêláØ?«¦C12´€S;,ë–¡ÇÖàf©ô1ÚôSXQ¯†%¡Ýpm\ÙYîõø´³‹ .®)w²’6ì¹t¶“Ó ˜3=ÌÔ3Tä5%ŽÑËàh`\:3jpr\´N* ÆgíIk=ZþPÉŸêx-.Éè¬ôú9ò¾P�5¿Î‚ƒ‰5.¨{Õ .*ƒ€–„evÿ }rS–&e¨{ ¾ŒŽs$2I¦…A ½2‹ò[,ª˜×s <冡aØ ŠÉÆTS6õ`€’Ež0ä.ŠÊ„ï’Ø…¢àWSöÒd6(ë zš«­«hýøC•SÔ±—a™ÓUª¤‚�U �„oß|BrÛI3$Äh\òRÿ™È±úÔHuSø¹3èu³_Ž’Rlˆ5&™LT0›I©�¨€\óªDïÅûú5ºS§' e¹že»„à}º¥£è^TðâÒŸO(*Ô®ïvç ‹K‘¼è-=ýs(<´k㎥VíO›Ë‘Š0RDX÷ߺ‰,Å á´fG82ÂáB ³ =Å=Àj^ã+ÑdùlP© M¤Í_ì\¿+&ÃôÑœAû)qɯb`å¿UnLGÍkKÞsBûŒY‚ÊŠ¤Á±ÑÓ€˜tÉ…R¸H4]K�^ѹ*AûÝ_ÅDg=´\¼(åo#2¦=vŒ`rö¯¨Š¼3¦vŒ~Ù| °‡3ÍQNvÑj7É�Dî-0�UTÎÿ]gXß'‡©½/}°ø�aš‘hÄŠ¢Y@¼;åX@òZF iDl첃�ƒ  -§fOG•7B–ÛµaÒï=QÊ�0pÁ†©¨@Á®_¨pêßâýªvl¿P¿8›×«A �!ÕBM˜Ô¦÷XúNk¯é£ò÷R{©9‰Yñ%�Økª‚‘G]¡¢ñÆ*vB. …ç Þ“ÉaÝ‘B/”Þ\eQW¾×Öµ(¶ctäJ;¸ý1@Õ„øÝ¤•¨E °)ž’´Ñ^»éX¿[é½4Ü&_¨‘wÛóáæNŽ#†W›©-÷R /_“ x|_óQ‰¹Ý9ÒÒq5/ºðêOöÚ¶¿M6…QÛµèÐ.T9äPóÇ€Ä_tèã=ð÷ÎxþÈ5áI¨j˜¼o“2ªtÖisÄLa~êú c\Pø­}þéÓȺ<1'/Üt.ó'VœXÒbËœ9ë‰)Ï,ÉïH丮E�Äåƒ]÷ü8Ü„\‚ÕŒ|’z¿�²üÿ¼…¦OÌ_�ž·)”ó~Ý%زlýÛÇÒ£%3UQämÙªÓ®Uœ©~û;Àô‰1³J_XÒ/Ñn~c?R„öK+xK``^XÒ2Äûu ®ùLjy¥(Š”"y§™aµÒ9ŽÖÇ)Ú:Xÿ„³¸ÓTüh£OÕì]°:,b­Œ#"¿ËUD€Þ• (?O™eíÔh…¬UìO{:+â.¬,Ú&³úò+GXxº ›¾û­æç«Ø+àû~Ô¶ø»ü}åñ÷ [5�þ~NBʹ öŒðö˜B–=‹z ì+ÜãÍ“¨Ál@qj¹÷`Ƨ>¶Ûí•*qsÝÕBVªìYŽÒ–šðÛ�jF?Š~ƒªðÌ £¬LVƘrƒ”¢µI~‹%ZÞNÂ_¾1šèÄ©¡®p0G¬ì0Y É+£`—?6{£ÄU8Úæé`rŸã±m|æ=¥,©yšÜ9CT§|ÐîLjÇ­•ŽìTæÇ,:9ö}{Ÿè‹¸?�:tve�£””—lq/ V>9>Z»?éšp…*�Ð¥ Ým�´ƒ¯âOå­Î—ã»N®ÏRýÓ¾&­Ü¸Y]í–ª6YÊOY†|ß«~]rŠúÁÑšž�4;Š„Ša5.À !î`씳*·êGzáÔ¬Õó{/áTlèBZÎ6¡Ç(ÒúmÉLÐqVRÅÎÜIñO¡iÕ”OY¾�Ø�“ö3,éyíÕ¢ùFÆøÏþ³{Ó›hQ™dæ~>uìaè¶óî×­ñÕ÷_§å+³ã¿b•3òe÷ƒÆÝk®¦3áe“�Ì™|^=sOήŀ'¤Òðœ\Ýâ#y?�^ƒLibÍa&FfH™9sÞ4^u€üvôÆ/‹?="‹/)Ûn þºN<¯>± UÕæô«z'gêzÏÇ’–X­ýò-)¹uØ'°À†'œÒŽ™Ç0äNKN«F!Óv~�/·isƒ «Ÿ|µ)_Ö:E@o>MÿóìÓÛç2R½��ªi8»PО7x æÿ ]jѦ/ÖÜ|'øes Äý«ŠIL®˜9ÕW/ ˆÝ8¤Bx]Ÿ¬õå`os`Œ&4¾RìJ¸Éìî=óýÙEãšqBʧ¼i¢¤¥ìówDòmÞ[á§QÙíGMô³È�Ôè�€e{Ø!%XQã.M¶d£®êh�ĵQ$¤2§âØŠ� S´Ä.Ï�j⤩ÞdV�R²ôˆß3¾ï'4£\Ý©-À¿±ÐV²¤ê¹bÌÁvÑL\´²Ì¨¸1eééñ.R•5ì F²ŸP˜ÑÔ-‚%RWÒ¤úHzoB†nöÆý"Fm4›IÊ*à¡dx\¡8l<‰å¨‡§átý}Q=_â4‚KFÚ?R…�½yRІœ" EõXž5Hµ¤Ú[‘ß–N5Uz¿v{„²!|¿óø>ÄÅjø¸®&×¾uŒÍó$·¦œ}–±©7µÝÙ§n;Ž«’9ÕfG «“ç_†Òh�ËÒ(ÇC9pÀ¬.S}èñ"lº¬(üf pÏ<ÓÁ] õv=fkâ=$-6b¨Ù[ XÚ&=�úÿxúk UåÆÿèYeÛŒ¾4é Š‚}.œ{Ì×?eÁUéh"‚«þ‘%M†�¶ªe2#"à §#;ϹIØ)ukb«³ß-åºÂv€Ï:>0G®—ˆxÃÐ «Ù`¯“Mª"½OñL€"¯ÅŽ5Ÿ‘»p�o¡BjñKÔ5/Õ‚]€K½± ã2°Òô—Œj¡`ðׯC{IõèŸ Eù‡gG„„"èòÌH»±ZfûPWý¾¬CÇxœ¹-ÕEí£B?>«ÍùÑNþ/GC �(;�«ÄïÀœo†@Ï%ïjo�[…z^¥–²:qùLj4üÃÖ÷qbgÒ2*Æ Tí}Œàéu'—¬Éoר4}$C4a$÷0Æ™tƒã�>‚j@¨¡£{6!˜}� D]UFWÁ`bg€C‰«åCȶ÷6ǽª!ƒØ§�¢ü.>ïYše%¥£+üýA¥×ê"Y&­, Á@ÝI$nõØÅèï±ÚîQ¹Aƒ,69)·ÝÔØÛÜë^-à 6*£|jV (0ÃiIú ¥ö©Q¿ß'þnk?@¨eëõ$äPc´Œ¸–T-oôb¦—ˆJgØ8md–ƒ6‚z £f“rYØ¢ïhåºK¥—é*Ï+otŽ�Z-ÿXwÜÒ‚Õˆ¶¦¬‘#@K‰$¸Á_GnˆÝÇÎ!K÷?V"H2‚“òŽM0`z+ô8 °á�S;Ú�K E‰,ü<¼†Uý3À‰ ý¦=�*+8ƒU^_B ü™óJ¹+›^ ¿'PDˆhU½êÝ×JkÕêiµSïÚ°õù£‡ìR_þ÷ó{.™.3;�Í™aùgAS)ÚñO*ÿ©€ô-¶òú¼èi¾Ù¥ØÉ ‚;Yú³G¦ŽÒ³NwÖXÞ�ÔùY—'d� } ßù*ºŽn›sé_7wpkW^…Hb›Î/woçi+qèSÞ¤iwDuûÆZޱŸ±9„êìËhmî¨¢ÓæÁcs‚@ìjâºÌéº5!“Kãmq*#ðÞe¸ŽúñýQ7NU;ŒnW´ªKÝ7ÿ$B®UûË!c9mŽPÿ­QíîM0“à¿(É4 G¶d¾Iàé†ËØ©á[LdõÜRïäçÆ©5yRh/ŒÑBkyc§ýÖ]Ý<«±˜õ—?׺à†ë?É—ýþÞsø×K ¢49“à8.a¬ÍA…É7ðï\†`câ›v†à~ZXÇ?"˜‡z¯7îG€œ’Ãàl¼!d…Ó/éÇ`¼§;Ì /ØH¼Q¶€#¢ñÃ[×¹Á͉¡õT®šòÙE`¶¤óíœËÌ#Ýwä9–úôØ®õä�‘XÌ' ¦�p‡â“ŽÌ 8®1Êu;0s“`sçù�E+ø¨›¼ÀXOvð"úyà°,.�ÖPÀº�`€h9ŽÎâ“ê,ÖÉkß¾à›†ç•(ó¤ 1ßú—n¤÷a¸þýfh· î#&Cu90[ך<Õ�þ%SËô‡ÂüÊ‹¯¸êzÙU'£ë A¨’ "=Äæ*¨¯õÜJ�—i°—xˆª;’— cû¥,ެîüú8ü)VŠ>P…Ïcd� ÷HM?£¹lð+g¬½:ûü—pxw'5~¯üªž¾@¼u߀]Š`yï8°¾v:`=3èh±u†Þ´6¢7a'qwUZÈÊ×î^U÷ÃʲÛQÆMqË‚,‚D�7mÕ”VÂ_c=KÕ̇5›»“5lD8¥7·¯”²Mø­{É‹Åߺ=V,øV³¼#&yñÔå�àuGþ…S�0!‡r§Ib (4gŽM=ücb:XØÏ|K�·ß ‚÷o¨àßG1ýÄÎ>_sû>¤aÁr$Åp øk6ƒDÆÊÍã�ž&.y,ÓO%8Ӏĺ³€ÇÏ.°ÉšÓ¶S|Ý9"'b9Œ¯vR6Tk¸€ühÈ÷-&Š»ÑÊWµ'à‚–ý×Ë ]>AõÂ…=/«BƱ…ë[ãƒý"–@�$1H=ˆFJ¤ë;‰(c(/jD›°é¢6¬_QìÕN0ÄÝ÷ɲ¬ô„¥I8Ƕa¢]˜ðƒ@í÷t(¢Î>Š#Ç×VÁr)ÉΨ�¶0ü„ÿ¤‡ÚvÁh6RM@þhÁ÷´ÎÃýù)G·Îˆ`þÊl¸Zô׿CEóh.Ç=Ÿ,üÙù°‡@Ll/Þœ�ÁUQ�{×`iÕý¼¼S4[ê¢3 u�û­Œ:5á›Dc7)]J´P;€X‡�-Òª¸Î²/#�¯òÂ�i_¬dÆ@ðË{³�e0Œ:åj]Ðþyz¢|ØÊ>ÌFä�lÕfÞ7á~£Q¯ÅXkP©Wg_ q47^µÓ ¤~ÌËÎâ‡RýK³ ,gÛhF ^,°m1 ŠA÷uýÃÃ)àMé +�ùó f¼'ÿ±H Áé `°¸÷PÆiÍIï’1دó{5Ì„!ÛU+¨M¤寑)…¢}ãž�º*Ð.[ÏêæŒ(hÿ¶7“õéejÑ Ç£¦Þ˜b’ià’G3…ý,̘ˆKÄE�øÀúŠÁ–)B{TnŸb‹¥‚hB‹ë?$èf§~ß@�J ˆC2�¡Þ +¬õ Ù��«BŠÞ²¡Ê²¢`3ñôŒ£}lOšë5øîÂz²%ÑÚ�Žo�fY åŸê°‘—$Â;ŠŒ'sdžÊÙq†žEã.èÍ6~$ÂYùÍ׳<€lí¶ Θ֙ƒÎ×;Ö¶ �-9tïuÓ ¼š]ôKÒ½€]¶¨­¤¡™îZ‡Ãgµ&òhQÃÉŠKÁ±ŒÄ®Oë#Û!ðdè÷I~…©(5±ð¥¹ áâ‹·Õ�“`Ê¡ âl¡ª´²Âukõ¦@dUR¤°¢ƒ~”Zgž¿ksî\~SÆo>=T‚,ï|öžšØ*€Xª/@+ÖG»Ç¸ë ç{-ŒAüá·6ƒ�i“�’å7Tòºê×xu—@íÉ—"ƒ}xêr C�‹ £»Î÷gƒÆ›å )+ý•–,}îòzS„ÉÁ,ä O=HÆØ@Þ1Óq ®i/gƒÉ4Šº(‚ì£üé”M“9SC3ò,…k«ñ1fÐ':6G?¦rX‚ˆs…}÷|2%†ÿ¡j½Ü߀°[DÈ×uñÃ!¨‡C­äaôwÇ‚)½·æc"ôßå lW|#``Þ€âØ T^¯ÎiÌ «ôÚÅ̺DÀ |`êB�‘ÜS鵤…E(Îñ0Ãp3z‹hQX$Tx "\5ƒx¦qø»N—Y J!! SšX˜5 å%ÆŽ;!Â}¬û9Û§çcBxPLÃöÒLëÞ§›±Œu®/Ùî�pH`Ž%4çféîÁ"+ÍHÝ >wŒv.8&YêoÙßX˜wêÙ×¢ ¾I HñÞb[¥ÜKäæx>áÕÉ4¤û�öðŒeL;ÕXg›eÈK"÷O1öÃnG�š¥S_çÏ@˜¥T߸6òËäð)óYC"zM[@˜­xçÅ7 ë’ÑÁ‚Ä D"v{eœ­ˆæë�µÉŒ§«†ä+#V/¬èªÊRXRoœ vQ„ïÇÕ<”#vܯûdñf°úÃ@R:ŒŽÏ¶ñ,Dö|&„Ì>rlMy+몒hô™ r®­s5ÀÃB{¥Sý)y—Æ|kdÓœ’¿Ü³WiÖ¼–(`Ñäñ†fùû³ÛßòkVßp;ìDúú-Àí7à�0lÎògpI"„„&°Î)ûºiSI�IºÕ+ûÊþ§ßM“FS¡Òb}×¹³ *ﱚbé¦W¡Þ`€P/ŘCõLÚ†˜]Œ:¥hIm¥ÕQÏïÞ¥^~ä^(µ6�Rª %±Šs¹äÂTä¾J|ù‚A±SC­UPG3|x‡—‘+èDJG¸Pª¸R¦S7´«§ÛŠ¢§:5Pd­tny}ªäz‹{�;ò«� ©Jü;T².Û£_ÍV`wш±³ ÄÕ|õ˜ýü¼x¤ö=þ@o︩ƒ·“c /™úÅž,yDŽO˜i¬„f'dus¦BÄ&-4(‘í¾„nÖ;UÆÖ‘¼ �¯Ž1»~å= ,ŽËˆ¹ûYÏšíÛ cÓd·å’æc?áE*'Ì“–ûÙžçs1xŸJÍWý&¹î[Ì�s„›¬VÑ`ºÀÄ~6l¥ë¤»Ô@XÀºñ«À/ÐdÀ[U܇ö˜ó¢á‰ÂÛíUa•’�¨àÎzvÆÝ¥aýJ½ü¯9Gz®ƒ†É4–ŸÕ¹`õØ(€ÈŸþÝÞîÐP@ñ#Žà^ ßõš�ÐÀ3ܹ߅*!ÖŒÅ2…l湟߈u—7y_G‘+MºXBCÎÄ ð߯ uh–…²}áÌUbT¦rÆ[¤äú6RºR ^5ùQÖÖ°„—¡… Å&˜(}Õ»H¢½¸†ªð1ƒO×-U½€¦sùýÐæGýtº¥~|Ž9ïÒÎÓ´a�Ý*cu!Q(ãiÔ }ÌŒ9%nãÓ솔CýêæçúŽì­€7LG0—õÃëAA:~úiØ#„2“ŽŒ ôP¹?I¤.f#õñ‡ô(X{”ñfÔË¿Êgƒš.u…mËFÐA<P¯Ðü/ å OÍð§Øµ!c3yJûHÆ‘Iý(Ýæs¡&²{]Ùļˆ7ªS—}�;feõ•õîÔÈWÞŠÓú—üZ¿¹&š¬Ä[75P6 uT1bù°?ïüð¹>Òçôטf~½´»™·³•§Ó¬cé‰ÞJË�#m/}:ØÕ׃#ÛNß®w±ÿß’®9vc¹TµÔ®=)ÚÊ)ÿ@íaTaÀK6uÙ—“«wIpˆg­Èõ�jšš`qœt\2i$<éy‘½‡„ Ç_IÞ):¤œí9‘ ‘*3|O«�/Ò¨È7,fí,´(1Ûm2~¤k°1‡8l…´â8Œuþ¬g ‡³R»˜ôìÓfçÆ¿·/vKÜÍ%ÿÖ–ü…x2mMQެ/ÛÙ6€�Z�Crüä|�Z®›³«ôWWY85éi40 ë }ãkϲ,Ã`$|q-pM,W9�Fv»´¬EÂHG @ªJut‰‚0ºÞÖÕÀäM–‚p}k éCÑÀc3Ê…¢ñ@4ýr=2Z8X±uØøíðÜ ±²õpWš(£Ý�Ƀw¼X4. {Ì`�ÓáOÕ‰ #`™ê#sSR >SYN\n¯›Xf +¢‰=d:0�H�º7*œ” =Þä¤5T¸t^«ciY-L‹TDär¾ÑàMjî‚s8„Iˆa#x¾5s¸tJÈßßP½éc�n¾&A”Éô4Vb‹‘ÿ‘ØØ_P×�=‡«Ë þ`”†©ëxGíí$jÙIK“ïÜgúí 5 h?û©ùpnµˆè^mY8ƒyJS±]j›ùD‰®ùZcE4Ó™¢¹Žeq¡gQ ]�Ü7U/HsY8<÷9“Ýö×Êt—”ææÌ5ÙFÕ¿-aÂŒo•y¢®!sFÞS_ÄmÓU»UÒi@ÿÚp�üúîEÂuw43 NxÃk´`(ä€1šÓ¨—àJû‹àsÐ. �n“¸`ù}snýH- �ž¹YK¨ `å8±WwA|µ–uÑwíÛ3Ãñ ãÐ{9— Ï-½£Áð–- q˜[¡¼Š©ž�-×$s–êJï6’Ù% =„Ò¡²Là¿/�mÿÌ:OåAjPu-”§Ž^Îwò–]¬Ú0GêÓvêãOP 28oí-ÆYÅ'' ùKÔ«±µ¼xG¿öÓPˆ…‘| ¤€rª¢@Ž$¢Ön H•Û¢?kË“|½liåñÙ&KbÈè~š5!»ô~Z¾®Öð¯�i´k½¢“jÛȦæ=~À’nEãYó�gôÒË;:¢ïÀôÍqÝ÷qÄ;üá¨ô�ã“vèc\CÓ¨h¼ÈÈ‘•4Í•õ¼›Rßåi0ª8µÅQ;17á(‰7²{þXf�JmÉûœJá÷Z‡©¢„˜9©øCKn:ªóÀÈÀ2£þï—´#Pç7›úÿiï<£šÊ¶8Az•" (ˆH‡Ü››*HI"ÒéƒIh „)Š"Ø‘&¨e¤H‘��¡)ò`egDš‚"#¾ÌÌrÞ{á­÷é}ÌïÃYçþïÞgïsÎ>÷ÓYë*é6°Ã3‹Ø[·×¯-*3rX~éxl gº(2ºY‘pœ³8`ò)�Ôø‚³ÖT6*“*5¾¾|Ÿµ ©= Am5>tôÁ<ŠmšLupJtÊŵëɯh’ÓPØ*–?3ù«g_í�œe®·è/¤Q»E{s†¤¥â¥;ËVÓ5\uÿn&[ò„{e;L•ÉuÓ[é¼Üº–k¶„Pº è']ÌV’2Faß7̦µ:¬™ŠdOdFpTËU­ç’5UןI¬©aUßÊ0Õ¿Íó_}“9¯Åìmʹ\žù-§.ø�23d÷¾-ò!ÞröðÔT¢Æ‡�Jº‹aNh_¥ÚNI[ã£ò4’RÒ„­RAš$÷¸ìÓÂÓÓ“3Dæ~˜•N™^ž·ÙúK¼Ô/o¤¤¾�X)°MÙ¹NV¢°¥Ž[*W+Ñ›¼JO~ ™*6Xß–š…U�Ô‚éèa±Òw¢ŠÆ— Å®g²º`n‚ݾ˜6iõm<ãÖ®¯øþô¶åØ8\» ¸x-Í#¨~¥l Þ:0ûØšÚsQT Ž�˜å¨l)N« 5ÿL]�C½U[}é¿âÜeúþ¤&Õ�»F;BI#©Mø‰W1çO¯=Ø{–3‘4¹zó§8nÍ«¡t-‹âð>0ê~©|þ“n­–Â𾚹ٳnóaâéÓ‘³b,ßFÎÀ­ÒøKSËÁÏ^¯ˆ½øv×Êe~Jë¦ïj¼g+d†~êÓœX¯Ðê´r©šû?cF,ª¼\�ù>]-ÎQrjõwÔÈ N=—�ÿ]CC¢z1cì�g*Ó|ÿŒ­¦ÜÔgŒÎ‚î©ÔTŠ9º&9È) ~geö"}ˆêìÍ9­ÝFèöß~;ÿ‹qgN´!¶õ¹Œõ5»ÆXvû›À‘sÕKÒ·ß\õ~ñvAFñ›p]ýr¢‹zȚĸËÞgãø“£žî»ÞÅj~zhEÛsÝÊó­ÙÛ6åÙ§•­i™1G¸ù&ÒÚ-“½–ª9"" ÉMâdN¹îÚÌt¬H.½ã¥²Ä|%ýÑ#Ôý¦E.û´g·ë€©þèE½øÁ,:¬%<ÿA®‰\—ûq ¶D¬3¼`¯Kǧ÷Á+ƒy^&3ðêÌŽ‚†¼ÔÇú°jfØÏ—"ófqLÍ3Åºê Ÿç­‚Ö•ç®ªÿébÿeÂö\�§S�!ãÝ=7}Já•[ÿ[�–»ÃÚ¡ñNÅ ¾šk÷Wb‡sç&Ôöÿš¿:Ð5ð^ÛnEÎÌ—G;¾îøá:¯£5®GêÙÑ:—ò õ›ÃΗÍÔ¤ ×M® àåÊôÞ“xç÷j¤ÂcV¥l¬ÏŽßøá‚ïÞ˼tR‰[u÷þÜ€É <Ùx]•B�Æ<%Q55XâPÌGå×V¬±\fäóšc–%E( ­'ý-²ŠŽÍDŸÉ£•ý¤=±Y�Áá_Ô®,ÈEµu$ÌmßÝ ŽŽ�ÞÜ3•ª9ÚhS¹µbGÇãÛÇ-sKƒ~Mü¾g²€Å$;Ũ“]Kº©e.Li)ˆËp>wàÜo+Ä,îµ~L{îëoñ@¶nzçm`YaXùs™‰Å(¥´�z&¶xË‘vjiÏM×d§sƒÒ�B$eÏwYüƒmÀ¤ïìõï\tØ?¢oÚQhÃrôóÊŠ™ºAQr9sGÃàD‘™‹½Ž¨—Œ¬|Ïꓤ4[b1HöžßŽó½£šß@UªæÊúTÖ˜)5¯,qÄ(Іž»Êý®*ÀûŠÙScŸ?õâ“·‰ö67þqLâ¾ ½ãÖ2>¤|&äKÇÂÙ„¡my‡HåU2*Þ¤+™l{5¬š©7r _^¼§Ö‹wö›7Æ V®sÆÝm ãù{ÕX¡Ìñ?©ÚÌŽóz°kdŠ_ûËÍ¿G'J›Õ©2È gƒsÝÞíýdƒbù¢¾Ÿ!ëõ33ì+Ë�®ÏKØw$pÈKâÏmß<:Ý?Id˜öN“é)úÝz5ï�5#B³ §4é vÖØx²5²R{ìw³ô­¤ ü ²YðkR†gܼ R}cH�²‘cIË;J ª’6g¥ Eßg�ˆ»—?UOfúdôYet îÒ°'¢“º²gh–5ŒûýQ-…dßËê©2(»š‚¬Ê¼šÝn:V|ìÜM£T#¦Þ33}Ѽ“žÞwy&:YxŸvûèר•Ò'“µÈü`{N²ÂÁ]id ¢¤;@±ÜÜûÚð®É½ý¶ˆ§·áöÇÎU%Gñ3rC%IC¦ñ›m«œ¯thu9j˜+Ž6³ˆ’@<ÑË�ªS›÷±´>æÌHxWD($Ž{êåx$YLá��œ(ZZ€Y‡ 6û‰ö(éo##ŸzºÞ2µo]­>(cÐÕ¯šË2aIŒöŽS1êtBÔùè7§yÒå§3¦'ýܵœoÕ=%õSöÅßëÛ�Zdd¾¿NÛfÙHð-Hû"¾UÄÏzuyã ¯?C?‚æwÜH_eø×ÅBßžJ 'RA†Ä=D�ˆ‘(,€0``ô—�nhË÷Òq R£ù�þPtîH#øZàÿö?D§F}àÑN‡êO§ÐOèàÌÀîÊ ºDPè¡¿pš_T…Já7~„>NFVV_S�¥Ë:(ü�…‚P:Áò2_�?ß?ß„ÿ­�H¤€¡ Œ ö×Ó_í×ñ�„C Ø!€ûO Db vC $BÐ⯌`~H$nаІñpÚ ¡‘íи 1·Aƒ@`ƒ†Æ އøA5°anHþFlðå§'è‹B 0 ó_öƒC¢sÆBZp­phF` ˆ‚s  ¬ a bÃ^"�‹Á¯õPjý�óâÄ/?¸�ÆÐÿ8Vp‡ð`šÎŸgŠß'±ÄBDŒI„ ž?y$ÀÛÐüM·ˆ¶8,he‰Ç£÷�X„à‘ˆPh k‹ÅbìÀ}Ɗįø(…Îø³Þùé °XùÝ»÷¹ØÉ‹"Dˆ!B„"Dˆ!B„"Dˆ!B„ò៱¾ýuopari2-2.0.10/doc/PaxHeaders/pdf0000644000000000000000000000013215232670242013310 xustar0030 mtime=1785426082.595235723 30 atime=1785426082.655235368 30 ctime=1785426082.595235723 opari2-2.0.10/doc/pdf/0000775000175100001440000000000015232670242013717 5ustar00builderusersopari2-2.0.10/doc/pdf/PaxHeaders/opari2.pdf0000644000000000000000000000013215232670242015254 xustar0030 mtime=1785426082.583235794 30 atime=1785426079.279255346 30 ctime=1785426082.595235723 opari2-2.0.10/doc/pdf/opari2.pdf0000664000175100001440000114506615232670242015623 0ustar00builderusers%PDF-1.5 %ÐÔÅØ 2 0 obj << /Type /ObjStm /N 100 /First 829 /Length 1440 /Filter /FlateDecode >> stream xÚÝY[OG~÷¯˜Çä!0÷‹E'­PC‹òP‰Çb…€eƒšö×÷;K˜õ0³c›RºT ³ëÝñw¾s¾sYoãÌ0å˜eÞ³À„ðLp¦¤fB1e,š%˜pÌXÅpÛ*ɤ`ÖÊ�”ÌiˤaÎá ã™ €òLq¾Äµd ˆ‚[²%„†”tL[7Àa„dÚàˆÀX¤¬ ÌÏy"Â2¼ ÁxÁHF–9ŒX�£µK,Á̱ɂ  ’ÙÀ$¹ç8“š æŽ é4ü0ä ŽÞ1<ç óÀóÜ<ðWpGØñpŽ1p„?�\…�€°© þ)ç‚Ã`!q² NŒŽ Kñ6Ls,-à‹àð[x’ƒ3�2œ�ÐC[NADì¬Ö�dÚì�*ÚK?ÐE8HþÎéÖh‹ˆA±„>F9 ¾B,9©�àR$2�Œ³Ø ?Œ n Œ d2™€Øèd C@(+È(Ð-)+ •U�zBGÂ’‚”F9º¹¬ v­!M Ñ¡'@(ædspBÈøsš�éE_‡jÎCÈæl [ÒC�sÞ‹�€r¾„tž´ó’pb/ êyuE …5ö’˜‚P蘒 8‘¨V ^¿fûÙþÏW§Wlÿ-{1›Ÿß,§{ãÑâz~u¹'^²7o/Δ³øsgœó!-W´\ÒrMË4ý¸z™áŽ¿qº, Zθætü�–Zhù@Ë-r}׫õG©ñeä7¡å†–q¼;OÙßaŒâ•Éúå‡ùºšŽoƒ×éí^æ÷§+â/×ïM"‹qôè[�Êh“—ã莬¹“ô1út—VÐß»ó£`B–Å^¥~_Ä¥†n‹*·¨Ö-FÌUÄ—¥kv�7Qí¶§s{:˹Óxö*†³Íîy Âùú7ßF=Çi ¬íï–W—²U—³µ©ÒEš>�Æ'Ý~›ݬc¾O™~­8zÝKê÷îÃq$ÖÊvƒ7í*Ÿ$wÿLSìöKÝÎÙÜ9»Žy£v?nSú¥t_îÞº‰»œ¸['ðŽ–ïø[þ"ÚΛådC øÜ¨ÏRa”•éô!Þ»(žPû5^ùcC“ó¥*ðå*8.L𶵕ú׺´€�Óê]Ux_E©î®¬âå¶w�³ÊžEÌVþBy�‹éådþ}ï wí`÷ç϶ØÚú:ˆ¥ø¾bÿ0·˜ÍðQÚÍ“Z.ŠY˜p àC»“ä°Ô'+O Ý1ýQ5m;?/=ÂþØÕ¦Ï,{¨Ç'³tæ¶w̯ÕÍç5ÿ·ˆ@‹ö­�ú½ô�”÷¯"³v²,¶-å-·ã�düOÑHÛa'O’gU¶r§ÑñÜRLÖSLö5Åä¢õ)ÅT�­Ú)Å>Å,y3ṦŸª§Ÿêkú©zú©~¤_|$v¼cˉ]<Õtv¾øËõ¾Š2ÝûÙ“ÔÅòÁ¹ßXü²m@'÷‡åé>ìçt�¤e�²Üôó%Ñë"šýü߉ ë"ôtþ Ëóo¸iþ�Æ÷N‹”è4ûmôØeŸ’WÛ‘WY:ܤòÖ^Eÿk�«J^íTÏ­g©z¹¨¾–‹ª—KǼ>ŽlÇé[‡œè,ÕiþÔÉ™:«¶sVe¯a/ d–[ýÇO©µ<�³z;gu/{I•¼Þ©—Ü”^ò÷iÖêzóÐ}mºÞ> /Resources << /ExtGState << /GS0 216 0 R >>/Font << /TT0 217 0 R>> /ProcSet [ /PDF /Text ] /Properties << /MC0 218 0 R >>>> /Length 3468 /Filter /FlateDecode >> stream H‰ŒWË®IÜŸ¯è%,N»*뽃X Bc‰5²€|y ~ŸˆÈ¬îs1BÖh|OvwUå#2"ëÃo>¾ÿ˜Žï~ññxüó‘ŽUÎZí°5ÏÙÖñ û§?<~wüíñݧG>Òiø?5üÓ�¿>>üê‡tüé_�Ÿ>¥#Ÿþø휣¬#á¿ýÛÎl¥VN«yŸÞ?ûûÏ?ýåñ˯vüõ#�íø÷Q�ïávä6ù(ë,cÔ£´sµ4ŽÏo¾x{<Ó9<Íç\ƒ†Ïr¶ª? ‡>빊ŸøQZ>žý,V�'vÊóx޳Ò'ý|ÎÓüÛu¶ŽøÏÄ�r>Û,4kÅÓ\ÎÉ3ÝÄǹûIûýD4ó^½�„×½ ^^3'­]^Y…ï¯NRȽ#&ëç¬ãŠ×�r®ttÒâK˜p'u½+6ŽŒ*Ô¢ ;Ò’Q±ªo;Òt䊵ÜάuävöUÜYä%�3#üÁ`k$ |V ¿Óˆ4X:kVÒ{­ïÚÙ+»Ïõªo—·Ç̎DZÁ¦+ |?«�@;cºFw|ËxEªˆŒ<� Ë^eŒ‰µfÇÎ'í1òMas�WäúÂëum j¾ìïµÞç;Â9Éåº(shEл+%hŽZ"]�Þ3‹ú±Ó+Ã3ïGQÞá—€þáñ[jÂÿ§þ:ð÷=õÿ#¨ÿ¦÷Ùδp^!éæ ½w2/:i\A� 3ÙZ°Þñ»Õ%&åŸvŽe¢Ùª·9Þñ{™*tâNŒ0;£G½újÛdÙL¾ß#&ÊÃ<×Êê›Þ¼˜mÁ×*m)F˜ÁQùÅ‚S6éôDI�ß±!U>&�sLgcd“lŒrƒý ^ß-‡2Ûm.Jaã_z+�¿Zî��4Xü.ê3ëây;¦sâ€IÖ4+Áó©U‘êtªhxÁ<°mðw òqUŒX¸Š¸Û óX!/0;%/²¦S=«±ß{©¸Øõš…|ázV™'Q:µ±ñÊóDNÜÄQE¢4�èÇÓë9˜~f²;ŽbFüÜ©uË›,V›èÉIÕ<ËHò›jQs۾܀UL5| p6BUb™@²CЩ,.RÒëÊ™5‹$–„²+·Ê"kµ±¶sÎèvAÝu ÊD-ñç¤æCi‰Vre �+HÇ8¡�ÕE:¶œtº“NQ>|p¡ÀÞ¤S²“ÒžÄy €¬#éäï�W·À<ð'4œ�T_˜G9ð“¨$•£%} ÊÔþQƒªÎ�'oÑ#£~1~�›Ð^Õ¥“iòÅàž3#Þ„¦+§Y»ß£t�چ͆ÕH-öžþ9Àµ4 þ‚]ÔCI³&¡�›§Ú§N„u†`Ýù1$¬s"ëøc!q3U‚y�¨€S\].�© Ò)·Z&M%�-Ž3u6Yí2„Cÿ¶L CϾQÝ\QÃBúlïû‚ù/ß*¸a´–Ê;}øýWú�I= a54tF‰/�E`®FæˆÅøé.ÒÌiŽÀ¡¡s‰¡Tbr™-àPY³ÓT¾‰Uâù Œ…ÁÆXY_n›­ù¶eoœ†©oˆe!Þ˺tFî4KbE麫�ÁÉÂé\Ç´êM¶|Hƒ#e­Î)qê1ªª»¬àE 3D‚ٹħ(Ìæå2ñ1Ò�îqåá¹ÙÿBŠõw8ég¢×Ä"gqñ³ÉuºF 1á÷dúÒ( ®FÆÉ›¡6Éé¾/úw¯÷—°Ã%ù§ñbÕ¶WøÔ›ôÃÖc0œi»ï`¼‹…à�2lÞ‚tñ@uu™Y§n�,ÜмšÓŒ^ÏÝGVÓÕ«ú°ÆNòª�5eN‰«ú Û¦8>-7y´›ps‹Z¢zº‰Œa©Ù�›(ýìà1õÀ@‰¤ëém¸ÈÁí0‡�pÉ€B�ÙvStxÊnzr:&ãöJ%[Rë¦y�ÝÜ©n…dï"Ì2GâË`Ç;x×+�\7B®Û§#'MÚ5¹ü[â•g1K”dÞ*t½�lëBdj_£Ò×éwÄA£ŽcEâ} ‰©*\®œ•ÚzµRÙ#m4ˆu_ùt%�}aÕ]ðªî‘4½Í츴ÜßÉ¡îr¸A(Ûý5çF ¼Í-«<Ö/$v t¤à¾3ñbjd¥´0$Ãâ�³–ô{Êú!lÑŽo^%¦ô!!W�J‹Œ]ÙøøÝPê¨ÛœbAAË¿\štgݦXb¥úò.M_­p ñî‰Ë*ÈŒµrx^#$o½ØW_O�~ÇÃEº[¡3¦_NÓÜF~bëàxLãvÃÇ'd w]cE#ÐvÍQFë ¤èJº*>ç”ÏEc;¢¾ø ¿ÅôKsUKc̆b•åsŽƒÜ43Dƒ²u©ïb�×À69%¿"òJ€¶gË ƒÍÙónˆ˜,³š7cŠ�àòzK~"‚†F&iÙĸÄiWw ŽtØJrMªdboñîBÕ~;5J`锹öNE¨¤bw„N¥çd@_ÑPœ´5�Wå‚—[¥T#ÁÉ\¬ßE"0ÍÇŒé\ã"ÏSŠâ_®èCø”±‡•€“¦  ­áCGÈÎÔ]ÕM0üf²LÈ׸.s$¹aŠæ>E_`\$¸I±Ë¡¯áÄ}ÿØÙ²# Ð#Š��Ãáf\꒨¬Þ E޶¼™ ˆ#D®ÈÑ)Ò^‚2ùsèdSYÆÕŠMRg£9aáÈ£ïBsl½Ý椛NJ KhVãÎd&Þ&{‘Ç&¶xg®–3k&L+j ´$U]¾ÍÄ$dìþýÆGƒV¯n‹ÐI,½.…�·ØuCimËm¯tíºûˆßÉ$ºKª4ºc?�àS¡�¥YÀÕZÚ$K rK¶êãXYWÛDêŠÀ¸TRëú‹™jÆDˆ'Jx±ß£å lð-Á¥aŒ�•Uñg!åˆ�ïBéÝ´.[»çZUåY£Ù x÷X�ˆäKÅ�Muq_Aï°{RQÞ 4”`m.æAŽ7^Æ8�ë”PÎsð×Ý•LÓ 7³x–ص¥ ¡p»Ù}%P¯:UKZ�=ëE&Òj½‚ ÿmJD�!1†xÿã!jØS�U*ʯV–ü¡ƒjs …$éY‘*á¼Õ?BoЧÍ2{ƹê ,_ M‹Ýq5ßÕL`ιç<«’ßx�·F (Pf�&�P™¹�P‚ñÑ'û<ºÏ©/ÔÅ5Õ!>xݪÞ&|5ŒœøðUà×Ð^tàm²‡%"¦'†ø’°Ë¹ þñ@Xæq(˦´*"ŽÙœ‰<”êSy?åñ73&Ž­m Œèɽ|ÌÜè$¹Ý÷qø8^¬d¨~#P(q…©¼þ<ƒ~*�$Ä>Ã>wZ6¥dMÒÍm›P‰y¥)äÉ2'¨cB¡¬âéðóÖjÛÓ=ôz9Õ�>}l›@àüŽí÷7VVÄq4f]=«ÓŸC{O” à� �Y¹­æ˜ÙdN¨â>AûùëÇ �¿ 4ÿ_Ó endstream endobj 223 0 obj << /Length 1075 >> stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 14.0 %%AI8_CreatorVersion: 14.0.0 %%For: (Marc-Andr\616 Hermanns) () %%Title: (Opari2_CMYK.pdf) %%CreationDate: 14.10.15 14:58 %%Canvassize: 16383 %%BoundingBox: -25 32 265 115 %%HiResBoundingBox: -25 32.7266 264.626 114.5576 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 10.0 %AI12_BuildNumber: 367 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 0.2 0.05 0.6 (C=100 M=20 Y=5 K=60) %%+ 0.5 0 1 0 (C=50 M=0 Y=100 K=0) %%+ 1 1 1 1 ([Passermarken]) %AI3_Cropmarks: -27.1235 26.5576 271.7354 120 %AI3_TemplateBox: 175.5 59.5 175.5 59.5 %AI3_TileBox: -280.6943 -206.2207 502.3057 352.7788 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -102.2378 160.3472 4.38 1815 943 18 1 0 46 128 0 0 0 1 1 0 1 1 0 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 224 0 obj << /Length 6042 >> stream %%BoundingBox: -25 32 265 115 %%HiResBoundingBox: -25 32.7266 264.626 114.5576 %AI7_Thumbnail: 128 36 8 %%BeginData: 5900 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD6AFFA9595953592F5953592F5953592F5953595384FD6CFF5906 %06060C0606060C0606060C0606060C0606062FA8FD69FF59060D060C060D %060C060D060C060D060C060D060C062FA9FD67FFA80606060C0606060C06 %06060C0606060C0606060C06060559FD49FFA85A59FD09FF848484FD0FFF %590C060D060D060D060D060D060D060D060D060D060D060D06FD49FF2F05 %0659FD05FF592F0606060C062E2FA8FD0BFF59060C060C060C060C060C06 %0C060C060C060C060C060C060CFD49FF2E0C067EFFFFFFA90C0C060C0C2F %060D06060659FD0AFF2F0C060C060D060C060D060C060D060C060D060C06 %0D060C06FD49FFA8062FA8FFFF840606062F7EFFFFFF847E0606052FFD09 %FF53050C0606060C0606060C0606060C0606060C0606060C0606FD4FFF2E %0C0684FD08FF2F0C067EFD08FF2F0C060D060D060D060D060D060D060D06 %0D060D060D060D06FD4FFF2F057EFD09FFA9060C2EFD08FF59060C060C06 %0C060C060C060C060C060C060C060C060C060CFD50FF84FD0BFF53062FA9 %FD07FF2F06060C060C060C060C060C060C060D060C060D060C060D06FD06 %FFA88459532F5959A8FD0CFFA88459592F5959A8FD08FFAFFFA87E53592F %53537E84FD0BFF7E5A2F592F5A7EFFFFFFA8A9FFFFAFFD0DFF590606A9FD %05FFAEA7592E2F2E2F2E2F2E2F2E2F2E0C0606060C0606060C0606060CFD %05FF7E2F060C060C060C065984FD09FF7E2F060C060C060C0659A8FD07FF %842F060C0606060C060C2EA9FD07FFA92E0C060C060C060C59FF840D06AF %FD0FFF7E062FA8FD04FFA78182A7FD0BFF840D060D060D060D060D060D06 %FD04FF2F06050C2F5A595A0C06050C59FD07FF2F06050C2E5959590C0605 %0C59FD06FF2F050C2F7E597E532F0606067EFD05FF84060C062F2F592F2F %062FFF7E050CA8FD0FFF2E0606FD04FFA77B817BADFD0CFF5906060C060C %060C060C060CFFFFFF2F0C062FA8FD05FF7E2F060C7EFD05FF2F0C062F84 %FD05FF7E2F060C7EFD05FF7E5AA9FD06FFA80C0C06A9FD04FF0C0C067EFD %05FFA9A8FF7E0C06AFFD0EFFA80D062FFD04FF81828182A7FD0CFFA8060C %060D060C060D060C06FFFF59060653FD08FFA82E050C84FFFFFF7E06052F %FD08FFA80C050CA8FD0EFFA806062EFFFFFF59060659FD09FF7E060684FD %0EFF53050659FFFFFFA8817B827BA7FD0CFF7E0C0606060C0606060C0606 %FFFF2F062FFD0AFF840D0659FFFFFF59062FA9FD09FF840D0659FD0FFF5A %062FFFFFFF7E060DA8FD09FF7E0C06AFFD0DFF84060C2FFD05FF81A68182 %A7FD0CFFA9060C060D060D060D060D06FF84060659FD0BFF2E0C06AFFFAF %060653FD0BFF2E0C06FD0FFF7E0606A9FFFF590606FD0AFF7E060C84FD0C %FFA9060606A9FD04FFA8827B827BA7FD0CFF7E0C060C060C060C060C060C %FF530C06A9FD0BFF7E060C7EFF7E0C0684FD0BFF7E060C7EFD05FF7E5A2F %2F2E2F2F595959060CA8FFFF7E062FFD0AFF590C06A9FD0BFFA9060C0684 %FD06FF81828182A7FD0CFF84060D060C060D060C060D06FF2F052FFD0CFF %7E06057EFF7E050CA8FD0BFF7E06057EFFFFFF7E06060506060605060506 %050C06A8FFFF590606FD0AFF7E050C84FD0AFFA80606067EFD06FFA8827B %8157A7FD0CFF7E06060C0606060C0606060CFF2E0C2EFD0CFF84060C7EFF %590C0CFD0CFF84060C7EFFFF7E060C065A7E847E847E845959060DA8FFFF %7E062FFD0AFF7E0C06A9FD09FFA8060C06A8FD08FF81828182A7FD0CFFA8 %060D060D060D060D060D06FF53052FA8FD0BFF7E06067EFF5A060C84FD0B %FF7E06067EFFFF060C06A8FD08FF7E0C06A8FFFF590606FD0AFF7E060CA8 %FD08FF59060606A8FD08FFA88281817BADFD0CFF7E06060C060C060C060C %062FFF590C0684FD0BFF5A060C84FF590C067EFD0BFF5A060CA8FF7E0C06 %84FD09FF84060DA8FFFF7E062FFD0AFF7E0C06AFFD06FFA959060C2EFD0B %FF8182818282FD0CFFA8060C060D060C060D060C7EFFA906062EFD0BFF06 %062EFFFF7E060628FD0BFF06062EFFFF7E060CA8FD09FF7E0606A9FFFF59 %0606FD0AFF7E060684FD05FF7E0C05062FFD0BFFA8817B827B81A7FD0BFF %7E0C0606060CFD04062FFFFFFF59060D7EFD09FF2F0C0684FFFF5A0C060C %59FD09FF530C0684FFFF7E0C06A9FD09FF84060DA8FFFF7E062FFD0AFF7E %0C06AFFD04FF590C062F7EFD0DFF81A6818281A6A7FD0AFFA8060D062F06 %0D062F7EFD04FFA80C060C59FD07FF2F06062FFFFFFF7E060C060C59FD07 %FF5306062FFFFFFFA906062FFD09FF7E0606A9FFFF59060CFD0AFF7E060C %84FFFFA92E0C062FA8FD0DFFA8817B8281817B8281827B8281827B828182 %7CA9A8A884A9A8A9FD07FF840C060C2F84A8AF847E0C0C062FAFFFFFFF59 %0C0C2F060C2F84A8FFA87E2E0C062FA8FD04FF59060C2F84A9FD05FFA85A %060CA8FFFF7E062FFD0AFF590C06A9FFFF0C0C062F2F5A2F5953592F5953 %592F5984FFFFFF8182818281828182818281828182818281A6FD0FFF842F %05FD04060C06060659FFFFAFFFFF5A052FA8590606060C060C06060659A8 %FFAFFFFFFFA9590606050C062F062F0606050606A8FFFF590606FD0AFF7E %050684FFA80C0606050605060506050605060506057EFFFFFFA67B817B82 %7B817B827B817B827B817B82A7FD11FF842F2F060D0C2F53A9FD06FF590C %0CFFFFA92F2F060D0C2F2FA9FD09FFA9532F0C2F060D062F062F2F59A9FF %FFA82F7EFD0AFF845953FFFFFF59592F5A53592F5A53592F5A53592F5984 %FFFFFFCFA68182818281828182818281828182A6FD15FFAF84FD0AFF5A05 %2FAFFD04FFAF84FD11FFA8A884A9AFFD2FFFCFA782A7A6A782A7A6A782A7 %82A7A7FD22FF590C06FD7DFF7E060CA8FD7CFF5A0C0CFD7DFF7E060CA8FD %7CFF590606FD7DFFA8597EAFFD66FFFF %%EndData endstream endobj 225 0 obj << /Filter [/FlateDecode] /Length 17494 >> stream H‰ÌWmoÛ8þúºbŠ’HIÁuÉ–Ûl·M°IöÐë Æ¢]eÉÕK·Ù_‡¶ì6Ù¶·ûeõÀ²4|8Cg†Ô³¿]]Ÿ¥Es§Ï‚‰ç:ÏžM[­ú¦=wIê^TÕÐõ­�ü|êòpâ�”^Ä‹ñÝveSŸS5ÎMï“ת]ž¥uÑþ[ré¾ÔíFÕuwêžœ‚rSö•ér«ÚÒ_L_¿}5Ù«Ó½}(œ©^“RîM¸ÀùˆM³ª?ª®+3�2ˆȲf¨‹²^gͧs÷Ìn໾D.Ðú²üYwOP&‘/%xáDúÜp"D$ÑaÖ,‡�®û«¶Yê®›6UÓvçîôAÕîkµF‹rßêªj~u³J-ßu™7uo¨ÍK­Šª¬õÙOåú¾?b¼ÑºÐÅïòÒ ±˜—•†7ªw9y4½àþ"ʪx3lî4¼ÈȈƒ î¶Ã¨Œ6<q´¸Ø@r­ûS†³*ÆÇÇ3‚û\oâãç ܤ{2}Î=Ï}ýÜ÷Ü·Ï…ûê¹ôÌ‚ü­`ºáC1 C~õ|Gá;œ¼»Âê˜Ånßëú?§»Q¶ÍÖH:ãûhÂý@Àñäo×�ø$ Dèrß³ì½ÙVX}Z+ X n‡Ç~Ú­gŒ $a€'ON|ß‹\áù“À‘¬tǶÏamõÇRÿzî¾ijmÝž¶ýµ «0ÄÔèn[~*ÝÞÖ¥Y2iD‰õûë¦ÐÕ¹ë�ýç•"wøán 7ª]ëÁØTCO)ï-`]RÚ„·.·º¾i~¡1žqLÆ¢ïM‚0òÝpà-Fb˜ió˜ì„c?ÍóýÝÚ0�¾½!Dг+„Ée[®Ëú|7Ìhñ¢-‹CèÀVlo4“I|ôKö?;d̾ïu½›7i}‚Þäõ5,æu1m6f :“¹¦•U³¶mã3µ û°uÞ9AÂ> M¯;誴›H¶nÕGmfËÒ¢Ô-Z:–¶hfÓ¥.ʪR,WË¡×ìM�¼ÑìrOsØíØCYŠ"mL-Ëѱªô'¦Û_‘òå^¹¦žÓ¶«>êªÇ®¥U_ZNyÄ)GNMêÖXnc¹Í·¹�Ê`©ƒ¥ªÃ†‘[¨õZ·¬ÀµfKø›u½n+3‹N/Mü±»¡ªtÏPƒ�¶÷lMUº¸«à¥ `zè‚-›íCkêÃFPh“ÉÌŽa47©›¾Ð+–æì²«Tw-6�MYÒþÿA×l3|)vñöÿM[¬4T¡^šç�ê–ƒ)ž#AA¾³þaÐ�™dÑüZ3ýiY© ="ºÊ¥ªÐaìµB*—õãa¬Qq+½i°U­úÛõê¹53ï¶j©Yj#ÝÛî/g�‰‘ºÀ�˜ÞÐ2\LJ÷/V'½äVX”K £ÓFŸ¿ŸV­²+šmC#¥LÇMo¤Îa«Þ…,³-ì4… ZëCžÝ©N�¤Pûûfè"K�B4?zNmdäãàrëš +¿8׋‘taI—–ty¤o?ïK˸µŒÛc5·¶©0+…£;êmb£–­‰w}¢©%%„Mi›Ñ»êµj‡M¥†yˆ}á=[*ôsnrª âÇÅM‡Ýã°i *Sy½lÌáâÜ]|¹£?Þâß±G$ö¨—-á7ÿ²FP÷&Ü›vÐ7[í¼ã’ïÒ;cÀà&ýaP^$+ëÒ¤8J>ã" vâ„¿›{ˆÉAÔ€¾TUQ®V sÜÐŒmÛ¦–¨%4ö¦ÖA}œ°Ë�^+×á‰`(&Ÿ\žDLmÑáÓnIÌfºÂQÉçá.ˆ‘|¿éz­]?ô ¹BX/®6wMµ`öÿ³™ ëÞÜ}…µ2;‰ófëÐéóªÐô¢m†íE½jœ{\½A&7]ÞýE§Í�àðt=”½ž¨r{úUEØÌZíÚFt¦×ýÿ·{Ïô ¸Cw+Íë�ºj¶GjG RÊý§j·ßV}U©Zµ.ÉGÍ?•Ø ¯|tÐ}�}‡RÕßã0‹JÕ�:íëçú¬ìÛú®—æ(кY;t÷îMÓT£ÚÏ›Fí;1I ÿ¯aãŠ:Ô—µuÐcK;—–püËYû÷- ñ¯¬}ª°ÝÒ¥\>eà‰öÑ’mû‹*QÙmñt$¹2•rYé뜎6_Óf¼�2\ ©èFÛl¶æ{Ô½¾W[M:ûû91¯G…”ýãÒwvö•šˆo¶¬>jaê2ö¸s÷ä¶®ÕFîz'§.?užã�ï»Y�#÷?œ@2ˆ‚8H‚4È‚i0 ò`z!ý0ÃP„2ŒÂ8LÂ4ÌÂi8 óp.<Á…/ðA'„�"±HD*21uÄLäb.=É¥/J!¥Œd,™ÊLNåLæry�ü(ˆÂŸ‡>Ý¢$J£,šF³(�æ±óØ�ƒ8tbËŸvq§qOãYœÇóÄKxâ'A&"‘I”ÄI’¤I–L“Y’'óÔKyê§A¦"•i”Æi’¦i–N�t–æé<ó2îüxæâ€LßÌÃÃX½˜£^J@oo Ì9070jn.Ÿ!þÂV.yDÀäxBÀ(yL 3 'ÌùÜŒÇ(qp3W„¸Þ—øÐ‡Ÿü„€ ûa Ì€œ0÷çvbf<�ï@“½Bë�ðO!øÎcÑŸÃ×úÎÑã–Ì}¶ÈZ$„7ñ±Ú7瓉Džô9 ]aÎ,àáwñM^ÖA—LüírÀ câyQl$*÷Ž”~ohÏfcýØ—�ï­ ~üde€ø¸2P´ï?‰èIÈ'!œ]J}Žï ©§û°ˆüI]ûDç”â!%vD �R"›6ÉË)gCÊÕˆr4¥Ü4Y9§lô) MúEå]JÙf2mNùeR+ücUÕÙ•ÕGEõqM¥ MÅT"Jã4!¤@F°× È s*ZTkfT$fÞ Cppƒ©™$DTÛYBH @úföÊ�¹ANU�Š—­:˜±“‡A@Ýÿûe³ã8rá'ÈwÐeû"ÿIc`€ÅÃç…O{,0ƒÅ<¯ßŽŒ¬"«$JbOÃðhåazºIJªÈˆüréX= 1½Œ,¿ø[º GÑÒ^]‡íØðÅujCü c¢Q³^‡²è»æ‘ÿ^_ù>ãU‡¾«ÔvÕf»{ëÛl¯cs†’0·’âY–dtžœûÜÄ„©|íßúÎ÷~ð£÷~ÂÉ@Èc±Àø©¦zjRU?å#Qþ§‰R†xpצ/mv&Êóë8ØŸ¦NU\+dÇÉŒŠWÿ±’ª>ŽªºÊá¨ÿÏ:àÀB¢½ñÀiø@–—^àÆr¸³ÈÁÒr¸¶l-‡{‹,.gø ƒ!ùmÓÓ�<Ò¿êÜ•~-éÒ†Ö4[Ž4£špÍ.Õ8O¹Tå\ç,ëLi R‡À Z?V;Õ;W<$ŸÉÓðË×ÔtQÍuO•ßsð@üteÍõO×Ö¼¶�¾¿Y^ó6Hج²Yœô‚ŒcÚ7#9o¶D舴'˜ñ»Â¹Æ©ÊQçÙV\*]o;m¿ùÚ˶Ʈ›¹SÍ£êCØU㞺†ý´ ÚG¯wBùÍð±Òˆ¶7ã[Ä!h}`� ’$b;¤ ‘·„‚EBºÂú"ÄB» [£`kXsäía ""´HÞ$Ö%èÙó"´JÞ,Ö.18¬aò– MóÿE)ÕN BÜ%sjLÉ|ù*—Rù6”åÇ©øŠi½yœ¥1AH¨&÷t¤�‘”³3ÎÅ*á€+¾I ‡&Ñ� ®]_”úo[çl±Ý24W×Ôû#ßzß;©d8¦’!¡ÝlÞß’yGÊû[2ïHyKæiF¿]nŽW¡XGËÓ^ø‚G»è¹�ôÉ.Úßï£75>-ŸÖ ã£ñоj†? Ôºb8füW×o¬¼¦.!Áqåûº¾9fqüïS}°ø‹°ø‹°ø‹°ø„Å?˼âÊwxÜ90Ñ;<«Á3+<»˜Ý´â½f¼§Ç{ø >Œ6~��Vâ#:¿âãÎøØÞ�‚ïÐã»´øN5çM‰oé9 ¾õ„o?âzœF‹S©q:%N ­…F\pppÄAö8Ð[ N¸ÄI;ôõŸ Á-zhÒB›•ÐÊÁ( ´› ¡h€¢¤m q©‹ÎÁy‹@ÿ }0¢zÆv‹©Ñ)%:Æ5+ºgÆ÷óè¦]Õ¡»ô…�ýV4®^Ñ€3Ñ£!‡ºtg‹.­Ñ­-Eíª=<£—=zz@owèñ½^¡ç‹ÊéÌ‚ f¸ÁÃÜÑÁ& n¯ÊRà‡(\à%eg pX§5p\çàµN„>påH†Â À«ø€ð-à­L½ÚT¯L1h–Hf¢EÉRÑ6Ù„ºmÊi€dÊ%Ú¡Rñ–L¼M>a¨¥ F Æaªá¦"'ì…A¼+™kÙ&Zæj=)ç.(ä”ESM«šëJeƒ°«mMÙ\ÛTÝTß>Ó7Ux“#Ä$‰v2QrYL˜ÜWG6u¢½L(š,µYÉd2³™P”J8ù<§àÀ‰hj™^f¼(X*Y-µ …Óô7åL»èESÏì˜2%4[šˆ”QHI¢àéš’¦¥y4ª™ê¹)JAMRŠ*䛎¬Ó�{LWSÖœµMÕÍõ� /¹=ÀAr¼Á·®�ëžq›Þç²»–£è¾IîS¹½/·±}“Úç2;IlI#ûÆêgòú.­%³wbîY}˜Ô’:uó«œ>Jé0Žwí»æâ®]_”úo ü© ü0”…þ¥@µ—Æ]w-Ü0è}?ɧ/o¾Ïÿ.îbµý­u׺Úí™�þ®÷ž}?÷æOèôùØI?�o¾,ß¿þí_¿|ýíÛ÷Û/ü·_ûõ—ËŸþñýû/ÿüöõòkøÕ¥hû?Ëñ¯ñåÅÅ1–£ÎÇÐ)?F��¡S~Œ:C§<£Îýq±+Ãr§ €®MXòt°E¯'rŒaÝó\ lé›9¸rÂ=Ámû_É�¡ÚöÀfÛ»°öœ†#Ës›˜Âj¨[Å"LÚÕ>ŸW†MÑvE]6šmcì¸5öÛæ8nÛã6ÈY`í…c;®’EX'±šØ™Ôï®*-Éÿûþ:ÿÀò\ÉÓ?þU\šV%ºA] »¢iÕÙ‡Þq¥C³µ®(d‚þàÒ¢J/E\î={Ãûò¤oó¿ÆûlyBç”ôKC—ôt‡§'¡`û×lúžmîÙÜ ;º`×ìÞ.Ú±­‚ £ý¢õ¢é–ð.ø,:ÌÜE_Ý>²Ÿ´ ~‚�§ààÛÇ™YͨfR¿‡Æ™Wq¦òYˆ¬E«®C‡–ÁÙ^é«O*´ÝV�%@ª�ª•µ}¤P}¨.T M+ìÜÛ0Œ‰•w�tW·×²ÔÑk>¨ÉJâ,Wc,¾û(ж€(ogÀÏBQ×ç•¶ÅA¥ TÈÍ)r:ÒãXßG{ïûˆßÇ|õû¸GÉÖ1”Ζ–\�W¯#±·Ò§f½±Z»†k÷*^‰#Q`áä×™_Alì�¦²H(ÂżVnîKŽ~ùÖ¢º'¶¹›}îÉ:Ƀ�îh§Ë¶ºÍ ûZÇÅN¶Í.ÝíÒínßïö oßñâ–‡=�kÞ"Û¦g»^Üö¾‡ò~BÍ‚«_æºj•š]S=áû#!Ôä=Í3N^põ4Í(�¤+S¿à…°Cvii¤h*ôô>ÈŒçë-³¾t ¬óÊ1�T]½4%h±0Ä4�³Àìió9Îë8ÉÃT9òî�Ùî©3ÞØ¸IqºJ2ho«{QýQIößáD½9ò¯kz\òä�óÙʨHí îk8*Z¥ {bd ]t„L)ê‡�£¦£ÛtÕœI%'”â×*ì3m׉mäxÓ9Õqè©™kÎB�‰¡“ªm®óÓc–ŽÌƒ^oŽÚQQsü–ÆŠy+›[¢ÆòœÞ:ÅzNt�Òúª9íuêë®åêUê xVËë·×Ùª#º%OèKéB)C÷>¥Ê•ü¡ÖœÈ´Jµ£pŽö„[ÅÛ–Sr+‚nI¼1@îàü�‚Üö8®ߣƃKø×ÁË \=Áá#ÜÞã([|ÇoZ"ܴ§32Ã#>I‡CÓ¨Ÿ©DÚ8$Ï‚„˜�E#R©‡-rªÆç-‘]n\aý‘æn:Ô{„]‹ã«ñmJ]ޏ ÍÂmg ëL𤲠Í[cma-QÆv`/L¡z!ó´¡vùJïÙMñ¨÷®µéUne“x“7h;ÿÆMÕÖTåÑoÍO¨U¬5°5´5¸5¼UÀ5Ä5ÈUÌ5ÐUÔ5ØUÜÕÀ†|B”Ía¶&ÌFœ5Ž@;G %Ò÷H+‘jo 6bmÛâlS´MàV8„3¾e^æ€ûqÇ{̺7'Ý„uÃðÞawÇÝxwä]4@"÷÷ùÞ²¯Ño×÷þFN!x’ÀÁ '4yØa§â�Œw:Œ,“Ûwüý`5šo—£d×C[,¡!ÊÐ ­m6±΂Ö=jEØR' "FØŠ¸Õn‹IÄ­yí¸š ¸"rÍÂC^ñ–ásè2ìšo°ËÀ« àÕ¼€^Bò ìEôº‡¯–ðÕs+Qüòį™\³r2&&¤°v£°ž6*²MÓˆ¥(¶ÃXÄ1™$D–3ÙNeä2T3C³g†gÐ:YBŸfËÔ¸Wa?‹»6CÕ5wqסЌÆ�ª½”åU%½ÎéÕ?ɧ/'¯ö¿ã¹m…¯p¡Ó®ªõ�‚-~(ѶxŠÝظËP]Kÿþ.?p¯½gY8^© ½¯üûU»*GnDŸ ÞaþÖ?ÜH­nµL`>CÂfw ,1„°˜µã8Á7Áñî²oŸªRI]ÒhîÌõ5Ùx ã¹µZR�sê„À+™%Øõ9?Á®Þùðgù�68Þ"íͧ'e¦‹ÉÀÆMCpV½êöGø ï|òÃl­Ç;ü2�7d©}‚×7xÇ.ðt+Ÿ·³ ófÆi±q]ýÆù¸öî¿Úþnþîx÷ò·ï^¼|óêî}ؽzýæ.ýzóÅ·ww/Þ¾z¹y-C›Ñ=�î(¾ ·ý¡û ”’x‘ò,ỵ‰Kš]´z,ÚÌjÌâX\"}É ƒÃ*c‹Ê¬ ^VšÔäå6�ĆäæDr¬7µâdÍYŠæœ©NÑ�±´~Òü�Ò�¬<×t§nCîÐX8Úê»V^]w£¨ù®ª·k©å" ªÆÞ—IŠJ‰NŠ/z€²"IÙ�%E§e*ò¯ÓÛ´@ÎŒJK›˜p–˜œš516ÝŸ¯LÎjsv•Í9ä{¾èsä¾áìÊc1:ëÅ×Wo—3é €²8±JÄšŠš!Fy™Õæ@ÎLŒUjjά ZS¤¹ƒÁ÷wÁŠœ‘Ö†(¢TdµÙ|dë‘�‡ØÁbv³HžuG�l3¼XŒ-cë Þ Ëg�Qòû�Äg`2Ïì’wØ1{s-svb¾.ÂÔ[‚#[Ë€ ¿ÇûS5<`C*?àáSáôˆÒè!¬˜ÓZ»ªjþÀçR5²³±¸ S.�.Ê3\®<£}ÃCžz\åÝÊžàú¥rc,¶gÎLXÛ=’2 ô·h÷¨ŸGs²ÆZlÝöT3wy©ÃÛIwwâÎNùs¸jÐ+{~nÎÙ›+:Àʦ o˜¶L›¦mÓÆië´ù…… òèéöŽ'> ‡DG¢CM@-umÒÁÆÒÁæVºØª�=ïdK/ Lrng?lÃW¶ œ ½å¼éÛ¶|¶i`‘ãMç ç�mb< ×ÄÔø¼kø&–³MÄ:@® £bÿ&E‡uç¿0ƒ�Ã�Á¥k$Ÿ8XŸ\â`\4Þ]P‹>÷(wí_íþº¾•Åc£áñ5&»“p¹ÃfèV·Ûê[·Â�Ø3]án­qÝ*©ÌUUîÖ:×­t°–:©t·Öº¦Ú­’õ#ç¸Vj�å:Ï•^§Lƒ¤ZD[r}9Û:ßuÆE¿AR®%¼ö4ÚÕÔy×™/¹‡Nò•Áiò¯=N�€‚ï·Z�ÚîTH¨�ÂH¯³_»e|j@hó£1AÎx©«Äšc�å­*e'ÉtfôTŠA(¼ÞA©§Bn�óœõ˜kµIR¯SæSî3×àô'ÂghdÚ'â'äRžp���À��  ˆI²å ¥½ØgYð'(…pÔðØ–Ö!7 ¶‰/w°ê…@¥‹/@Ý–­�ÐÔþï8­¢Ï½|œÞc%&|œÞc¥"|œÞcm=àq½¶Ÿ›¼íq×t!ì °‘`£ïñ¾Ù-Ä‘ÝÂ…äögÈ»<Ðë<ÂŒ]2^w �Æö�ÝjèTvR»¡ý= º4õr•~Ú¦fjýܧ�^ÚEíÉêŠmŠ·Ï¶~)÷Ãû€ºt7ûèèxmâï3ð÷Y÷ƳÃ=–½kÖkF0¨í"¯E}–Ý2Ù_`Äžé1ÂOCpóx‘ù÷DZ£oÏÑŸÛ•˜šˆIZ0Y3¦Íaíh0¡GLìs¼Å|/˜ù1à0ÃÏtB|);ÄLÄk]ðÚgÌ‹3#`"âe…´Æ1=i¥¼VZ-¯—WLkæUy]cוeëÛÕ]Þ©Úk½¶g䤕՞Ô�·”k´í§Žòa¨×h³~¢& ¿•= &CÇ ëêœP‡`±Ê­¨û€g+ô™s$÷~{ê&ßCŽ6šÜûÜw§÷ifðr¢ÜÍ¡$Åic¾9D–j�êÅrs°–A#mýˆ7ÇØÊ߻ۤª5ñÙpþÒ çq<�Ç�—9a.NØ]a´P«rÚž  � èÃÀAñ>}(ôÀp`<(D(@ô!ÑE�T¸PÈPÀèC£]|(„(€ô!Ò€%=œTH)@éC¥€4ZV¼hx.èçz|&¦J-‹Ô�Ö²3¡Zõç q,qÊQÊ @Lø(8ÇTb–ð%–A"–Ø;•äœSìKJ%N9T-Ë»‘$èsL%æ^b)JD‰m D°MO-Ã^tå8¥Pus½›¼›òä\ŽYÙQ;"3ùÔ`Æ€_#~ Ñx66£5Ñ… ü�Ï}ÒÎtŠ]• 2º à³.¥~oUgvȈ-8 (Š ( E*·h‡ «¥QuksAJDì‹�%ë9ÓŽ%5‰j–UÖ$­$®$¯$°(±Rq-0H+-imR[*¿T€³ä&Ñ%ÙEáeé5Lµ‘!”˜$ED‡I‰I‹I�‹³"ææ(ºLÊLÚLê¼ê3)4•n,ÞI§“R&sRkÒë¤Ø¤Ù¤Ú¤Û¤Ü«v“z£~³‚›ÏFç—nt0ÃF) ÏljiÒhYœúÚu}æ'U+ßíÙp×Wj%Iü€ö3žÂ~áýêjU™¶ ^õqëë#ׇÖÇvP�ü²Óǯ. º¼P· îá’ë¨/ƒ¯£ƒ_‹Õ—>ú°;ÄyAm¢²|3§á•™�ÂöÒƒö¢êð�¾U¥;: g}ÈQ,Ó-JÝÑjèô ó�jÝÕkèô·*v—ðÐaü­ªÝ%=œ±þÞW´oˆ_Wa�ãºë,ßÓq¦LƒrNk®/g[ç»Ûw‚¤\èºóÔ5ºÎ»Î|É=t’¹ÿÔ»F@Á42xl` •¿BÂ¥>¶[ ‡¦Ô€Ðu ®TΣ�ôšc�å­òÏ'Étfô$-\¶Íl™Aš²’òÊ-û’õÄñ]1ÉÙ"�’ûÌõo,¾¸@ Ó~5ıµ}¶Âb„Ùƒ� ‡mm$\1¾µéÝgYð'(v× 8jx¬67[\Û€DKÄ ¬z!P©ÁRW͘2šÏNúÿÀI¯>d`?<,ÁŽô¿Çûfw N¹ë"òÌ'õÖqì­HTº±tÃwc3wbꆻ£(_m7Ô独7P•$ņ,ÈÂ6„€‹ýÞ1öL"Â1™q&QÂ2-F¦‘c‚âÏ=ód)Þ%Š['ÖoöÌ�óDÁþ�˜D\™OŽ\"ެüH-"× L2¢Ù–;žNÛŠŠQÑå²U¿2“¨5‡Wë‰Eò`‚BŸh׿=Žv¡K» ZÚgÐ¢ì± ƒe�­Ж„ë�“û êÊjŸô>)~Ò|Ý�&å×]hÒéD¡¸0ÝŽ¦b ýù"ÄØ %U_j f�±è3Ü Ðs“*å‘Ýàv`©'±C4þÈî›Äh�Wb5mPX•˜«3ïC,|÷Õ?ï¾y÷æîý›»×OŸ* ëà«Ñ/!ý²{÷ÿÿöÍ‹÷ï_½»[ñ<š'HÛ-þ{þü€AûHeëùÏøÇïñËßqè§Í´ùÃæÏ1›—4÷�ðñê†y3¹% j»y OZ†�œ‚þ²ÆûCÐðºBo¬<~‡/üo93Ò Ÿ ´7Ñ¥J=c­v›è§'ºâ‘ö4YçÄôDÃË`F788z\ÇË›h³Ó°³¨·OÏ;`U i˜&‡Ǩ'þL§\,®i}™èâÚ‰?ÒÄÉãŠã¤^N†~ˆÖy½ËêÞäD{¨çŽƒÁu7õ¢x9qvÍä’¿ovŠ`ôx¸úT2÷çæøe®¾*™û#Ô·š÷PÝÞíY¢öðWøâæ‹'›çÂoŒ[z…Úk`æÑ oÆ Õ7c:;!8· ㌅iN°^â8áÆ—¨†¿¬‡ñò=j2 ëE. ¯‹<ܼ€÷X2qÝ0Œ ^é[öiÄMsÃÓ¦`§4ˆ%Ömê=áÌBRvé´¤™eî² Øñ %œt_N9£K˜‹‡L?L˜Y¹2?`)ä]ÄaÄò¶¡Á%á.Íua h¹�¬ŒmG¤­-„}cb�áy´y®›äe³7i¢År™Æ¼Á�óó-†1!mÀ2qp,ÖÉ47ð…á b'ä»™‚,€¸u“lvÄ¢š’ŽÃ¸ÛEß"°xʾ–ÑÉàØ®š£ v–Ê‹`Ê?ؘó^'�Í?‘' ¢{¾ÝÛ”ÊÍ` ’˜½3Ù®;ã:¸SLþˆ 1±çbú±ê|ƒÛ¹GÑ~}g�MoPAs 68)¾:òø^¢†N&¥Þøù}6’Ú§¾Ÿ°glÙÎïaÅfþÕ+AóˆÏÝ]F€C»=P,^Æ>×ÜxdkÖúŒ]Б|lBñ2âÕ™'#C`L'oÕˆE+³�í0îpêÏiÆ öÄݧeb1�m²“ÎÖçûèÎNrX$ïÖ1¼w⢒ùŽe'Cˆ¿I„XSÜsrÊǬ°û÷ß",¦Ô•è)Z€³(ðÒr‚C{&l0ø>ÓmýìLÁ¸¯ìÁÅž—Þw�øà†8‹¶—elƼ-¦TÇÛn>„ÏÀf‹ Õ<«X²âNî åŒíWPcÍ™‘žÚå'0Ÿìe‘;Ì8û÷–³o'»Æ>(ÜüŸØ„rOo«ÜctNП\GÓÙAö�ÉË9OµoÀxE>XŠˆƒÂÑ=³1ß%#U€9Kp µyk•²°âu8»,�£mÔàăD5Y®Î¤`îY–Î.Z=Z=¢ZtÀ‡'/%¸í°Ø.F °�ÏFs/7W¥6#x 'Ò•u�ûvÆr$¿6Yà_IÈ¥Ck°Y´°‡»K”OÛœäОyIî[îyì•SÜ•ÃÙûäÙÁyi=ôß<«Ð|*MÆÅÈ ©†=‰��9oÎ4ñ_K°#ÃÖ÷Ë‹ñ£>ë­ º»Vk“3�á¹ga‘Æ(#– }þÕœlHådCó¿`™lü-áÆcžù¢Â°?sƉ>ÀëÊã¹ÚÞ JûÑ/ðE6ÛÅIç›ð²•!&vÓ 1} I‡Õ+®–cé5ˆÛÙ²Ôû¥e”{°£h�ª´ Þ¡ÑT,;yV›?diá¿„-7žñ† ˜‡M··äÙ±iæ _‡�,xª`•R5ŸïoÂà-Â{1½²“ø¶åÌH�� ¶Šk*9Œsµ(£çȶÇÕêê`m]µt½ P…¥Yù`àØv(_]O}�!fetóûGÚ» f…þ¤úÔÛìæ,ȹAñÿIÚÎ�à8Zà^àiñfšÎ°h×ÇŽvFŸ¯"¸Ÿ\\¬vµ¾~ŸÆÏ*­žYÈÍT?`wòÄJoÐfOpc /Ø!JTªÝid÷Þ„‚Ó}3­Ð€íÐò\Ï"–% Íx&íœò ãšË ŽûÍxݸì�˜€ÍHõkM88ÿjrn#X è¸Â|i-5À%ä´=_M)6ëûÙ\ã¬Ü ƒ�“p:ý;àkT⺶-Ï‚´òÏj” h™€`+¶öAúÑ-eªqKpÀ¤±²4'€çáàÝÒ'89!; žG5NÈpÀø�îe\/²¾{K€�å�B$ù8œæÂ§5ê a�;LxÚ> œ:V`¿ó8–Iæ¸2  — Jtló{V¹2®–ÉC´ÈZ'hß6ciÙ%ÀýÐÜ^p™eömg»»ÖqŒµxÓs*Ž­ä‘Qß �VàXtÒÇ—Xf�àHÞTÝÛp'JssT³•5¼;¥zP1¾›@zÐòçî–Î !«Ûî/áy‡Ã/ÑÂôm—5}W!ÀsO²´@�kž9 pa£ÉÆÈ Ø… Èî@Êà^>ý&|e>`Í.>ñ¨¿Ïp^,}œ4÷Ö9§>kãZ­í¯“ JÝ–Rå0&%.q ×Að¸<ÍÙ4Áœ8vR°Ú‰¼¹ƒ ±ÄÈ‘¹i”š8UZ4m¯ÒÚa€£Gøgz ®=V–‡##àFÞ¹;W€­ì\Μc��x—XÿÞ()Û¹&ÀQƒ�ß NcÇœCBwx7>B�¨k¾¹;@xõN¡âà)3ª¢�v‚]øŠ3zÖÁÉ“ØX¤Ì]²ºìÌ+þ²{Å ¦+%5ÍU"¾Ÿ ~OC‹º¨(÷‰4×ýü§^߃¤¹jäžPÁ³3+¨ÌÙ”uO•¶Us9Ë|ÆJõ©U(Šûû¸—+J€Ý6‹åŸDX(J§¢XêÀÇÛ\7àŠe×€¯Í Œ&û7ЯŒlî¡a^oþG(¶º®)hy˜�Ë"@¨{«S¦Ô©z2¯®›¶É&[U+úÓ%~eЫéçȳ«)ÝÆÃä`g®˜ëç ÚØ³°tü³#EˆÉ;~¥k]›ŽK!‡æjJf ©h�ªªÝÜC9õ“vÜá6kì ¥˜ÁÌùÂúb4LgMÖôm©ªÁß„%|çe©0!ÇrŸf{�—�¾ÒɸR‹ÆJqÕ�5œ@=m¾z.À…?~Ú—8&–rõž<ß{È“+— uÇMt[‰qÿœý®ná§‘>×\Œ»Ú`ßí÷qžÏas©¸š›%”›+É 0&‹cî”2ƒÒ+ËÕìfP)Ï÷²…¶/�«:gÑgÓú´RÜS Èq©ž|ˆFÝÁ)%mñæžI㳨6¦؈ ,áÙÙg‚vòo3gãóžÓŒj‹%H#à`¹ƒK  7ûíÐà”X¥5HÖÚ©W€,Gg0Ù0ä>"6%Amåý|«á÷»DÍÊv©ðÕÆü§IC^Öè¾�[÷/Ѳy—g ~4·’=åó_%<îãŸ6äŸÝô@±K‡ïj ŒfôsuÛŽ ’d‰î H€*R\)'Ácm³¹éIÞO{›åņ·õúÓ‰X.½N¹•¬ÄdXúLhkÎâ…)¯·evun®áŒ·G˽ Ìx¦äâ¸Ah¼XP-NÚ¢0\rŒƒcÔ¶Qv0Çsé˜yr�Û`® 4Ïü&IÿÔ»Þ¡âOç’­q 'äpø/388ß}œ(Ê¢§wðôtÔ€¡F¬¶w˜ö ‚Öf‚x[ªU££L²ž¥ÆÉ}8‡,àŽb$ÉVÂ8[IX8_7wXY}$8"ÓŸáÚª3ùÖuô^*ìðñ]³ö¥,ãd¿£Øq×C;ý ‚ßú?<à>•q}̳c$8ò]Ïg6¾ÀýÅïGi¥åÂpi/á0Uc½(ú„»¯ÿú&úê Wû€!ÁëñõvÐøÞ9è}UFÝ5Ý>Œ÷åçžåß«ÊÊâ£�×¹>°~KþѤöص2ZšJß|•–ÜչǮ»#5@·Ñ.D®‹›Sœfv%!ãæü\Ï ð¬¦ÏÛ¿?‡¯ƒ2ÌŠ„[-·óyµmÍ‹„Úð§Ÿå ð^j�.ƒß+gª7(�j•f•.ê¥-Q™uÿ„••£“EÜr÷8=}CÑصÜýÛYìXY›¹U|\0KÂ\[N©o�Ùd ŠfPqN„­98þïsÈ^Õ7ïß�'?ÀºÙIÒÝ׿ב�¯v¡[{LF`£»¹YN]ôàœ"‰ÍÇ |B(Ï€ìË©8²»°ƒîVDÂï!VèÀ«�MXgS~ÿº;·!€kPt÷šë€÷ Áy9ˆ±,Ô%ù9 Ãbëµi–Y”Ór!JŸØ¶érÐ�ÕŽËQйF\É, ×Þ¬j_š$ôg~}Ÿ9ÿ‰+XxÐÞ3Á>Y ž5^Œp0–#$Úçân”ÐÓúÈëûù¼ „˜™Ð�ÅŸ:«y¿LØ'Óü$úTºr*9_ä«tÕ«´îÂÎ5ˬÆfê•ÛÊÀdXH=¶ËQÍ®³o}÷”“Óò´fK sWœœs:3�rˆ“¨P‚¶3ÑîUå\¸¡›ütë�ªaظˆËª C÷„Ýšvr‚SÙ²%¡Dó,æ)ß«åØÌÃI�âðî-/ó½*@•7ðVb§‘«£]߯ZÖü<ìm&.x×ø¥òÄÞUà¥_ò‘i}çYlœ‡I7±Ïƒ#©ßï»ò]»áÖçàh‰Í*ŒFvÆãè+ºyïê—"bm%¸ŠXàa JÆ *À'Ÿ§Í&;4CÕF×çÁ¹XÇFoD¯Ör«“ŠÓSS „t ËHuÎ<ú `•ÇŒñg÷T zóìMÙáìà”,ñ° ’óµÓÀÊ)qÆvpË:/�ñý€³¬ÚÊØøHœeëa€ ßùWÉ �‡ä].CÔEBÐÕf‚c)u®5 ¼”Í=•—-v¹'/ÀÛ¸µî3úÇ@1U“0ù»™Þêq¨ò¦Ù6¾XÐÀ¹#õ\mFžÏtkr ‘Ùõy µ¸Bñ¬–Á݃È™0 @Ö7ɪÛ>¢„¼Ì³{b‘D¿©ªp+õ6„ñ¾C)É–ô4ÐÖ`‡·]ßc½ã÷wÞ<Šã÷dZSõ¥lÉ¢�QsqôÁ³crˆ™‚'FšÝh™ú^…ƒö`0fa±P25öÖ_[,“QfyvB”ECQ7–…Ëì¸Éô#›Ô¨ÁZÑ8@b¯ ‹—{è^ m¥òëgö2ʘÄ�ëûý¨–¼ûpüAÿ�çR§SNžÅÏR­ÞtkÑ9÷½©_ò~Ѷ]¶³‰Õ¨.À½)Åð`-^¶Q×äøëw¬O¯ Ä> h<ü÷T†L¿Ì€Oûu3¨jÊ•TÞäYñ(W­=ÊüõTÉo9r¼be öž2Ãl Á¹§ ´;®“¬½l±eæ[õeÊÔˆŒ‰Î€ûY®‘=4FÅõÜ<øa!øu4G�÷hz’`¬*æ”¶¡aê•/H!hbV¸ÚòVqp ‚¶ üÉB‘ x4æë4.›�š‰y žß4€|­Î)y’²Æbåã°13wÕ^(¥‹°�È¥cÖÍ^!»V!C×/öM³óÓ¾xæ ;gÉùL�ÖŠ‡NÔIÀwï<Û¥FÜðVÍ}¡­gà°á`çÙ¡e`Ñ긇Lj”DÐ~¬y éí¹R9޵Ǘ´Ë;‘; ¿ß—óé,PF{^e¡úÞÜÚry¶QÃàd5‚ƒ4€ ê0_mž/ÿ^Œ‚´+ù½X³ÆZ^"Ñ«¿DÀ©‡™­*Œ:emäÁ5Øò¾Þsçõ�£(Y~Ün$Û¾W¶áL9b'«]Fisù*H'(Ÿ0Ò?šjH@xígm³‹ö¨·_ª/> G÷ÎÛP�RfsËòGÐêŽzµ£™A•ïêMevï^ßož=Ù\p+%™�œ­x.µà»ã](RÌ$?; ©£ea`¤�ò.@£¢0Y(ìd÷ö'a öLÙ@yº ¨—Îþ–¾›³$t±¡ÁPÑyþ¦Ùù©C±ñS0F’à™3Ÿ†mi'ˆìòi³Šºf0dÞ×´+˧àÕCØ\ý$˜ŒjîŠæ÷N�e¶“<ÛŽ­TLØUÎ¥¢ OMž�dj{ÃÞã�0ž˜ñéê XÓQPl7_�Œh¨³œ½ e¸àÁ m jãå÷:6¥ò˜Ñê½¼R©ƒ÷¾ï…u×5f‚U‡‰Ç§J‚«­´Úk0ÖXì²UÎN™ÆÙï® ÝéÁ*udð"ü¹¬‹¦`lÝÛ˜î�hÒÃËÖŠýàè- ´‘VmUM›ý}-Mç§´DÓ'5:HŽ�΂œIvöh^ï;m‚ʾݽ|BÞ6OÊxœˆ×äe9��çæÊ³T­F”«1XX>©ýI¸«æ{‹¿`U7$|_ Vi&iÂ0Î*Û–ø²è#2À'ylp±‡õýgàˆgì·~Ú`íÂä^ê)âhSŸúÄÁx,¥TÈXu‚ p]ƶ·ñ$ýº2>vÿ�íCÊ(”‹êÖC_u„u#ù¯+’úS«*»±ìލ–HÅ³íº›=j‚•v_ç!e\k_ts “œÂð«è aŒ4ŽÁÞóO€"¾AÙè°¤4ÇÝ0ÝOŒœÝ'k pß-¯›7,`mÛA8šêZiÝo Ã*àºìîTïPmOö¸Í¶ qFžt-ë´+ÑíYGÇ{ÄA廆î4€Ž½8@ßýÜ�÷ ¶¾-ëÁ0 %«ºVu÷Ùg�ˆPäÌž5µkWW×e-ŒÃleè‘Y‚%ÚÂÏÖ]@³kuž¦9­2fx?XÇbs§@QÕÚ·±! ðk¤�ÒðZÊÕÜU%omϵÓÒóÚƒnâ6bkóóý¡0´à¸X ÁNÐuƒ Hž.³®,%t³åò˜°#ÉBXF׌†21q­˜Ÿ»«ðœƒ7‰îR²C½A[˜ ¡1:¸Ž:çYË|Ý¥h¦^õ"ਲ਼�;¼©‡0P%×`*F-f×glºjÝábuœq‰½q ò& dUUQPderYg¯½¦p×ÒV˜3m³°oó¬-L¦ÃAJ ÍögÌãt–à K@A/„„3>äé ¸9âB¥iXe˜‚½\± Mæ¬n‹–âÒîL`½ÝJK%�‚!Ú(̶9LÕe�='ZE@Ìïm˜Gm¹„–£Z¬¸Ã\´ŠlÝ–I”8hs˜ÎÝef�Q”(œT0"0Yûg÷€C%zvÙâ­B8ô=4B]{”¨„�ÆDYìÉörÒ91:k`j1E8 ¢—Im7&RU@ŒžT�.çÀ�Ëtàm© Œhœ+‚ª Û"ä›É PÚ¦î3B`+‘; 'Ó]и¥šªIˆà/7ÿª#aJ˜Áà΄UQ{G•‹ÊM�3eÌZÆJC€¢Oàâ)mrq™¶¡ Díè‡"x¦¡ANvRÝ®Côl05GÇ`q�ÒÓ lš€JÖ3J “7M½) :¢ÊU6p\,Á2f X¶Ú—ƒ–ië¤?öZ,‚vzðv´j2bD†‚;\K>�Žá†Ö=Á†Â]1Azå÷ŽÌ[* ¼ðƒPD!Ðwe&€éöÖ|�QñÅ@Ý +¯“÷E ð[­Ò)¦�y=ðlFFQ&ÇC#ÍÈÈblŽ¡ ˆEáÔ ¢#™³$ e‘e7ºKl…¥ñ[­Ò�(¶¿o�a©´ng“8ì-°Êê (\Ïg©}iÝr˰`™£Ua;À¬l ¦M9=øy‹ËÙ²’�1(`P9Ä« ›`dOàúd¨hºÈ!\‹Y+œ¶Ù‚-Ì·„èéµ´P¦ƒ=ªQvƒÌ¦ »®ëŒ;o�„…pÜL ˆÎ*u÷°z/^eƒþA†Ô™°�v¸ñª—§�AŽLtžbÒèÏÌmIѺ^÷›8-6`ZKíô`Ï4²Œ�‘‡Á ægƒ»Ð7¨£;ƒA{tާ»‡�ȹŸß|õäÛöÃoï_?ýøù?oÿøòÓ§7ï|úæÇw÷ð£ç÷÷/Ïo^Ÿz"|*�oÜé þ½øéæ3~ø“ÿ½ø‚_~‡‡úé”N8ýíïîôZ,ÿ¤c�ÓÿgÂÔ•• ¾»„±z’ˆ¯»ùþ5²^½ñ|w#5_22ЬƒÈD1oxˆ}P¤÷7ÊÝ0båCزÙ{K5§+BP)ÓǪ¨Ì{•5Lj�örô‰DKªMûað�SÖ@n�4<–gpÅ(µ|Ô«>ñJǪB°qs ·5UÒ!„¥ô¢ÚXKœ±Z-k\Ó�ä »y¬UP³Ö3))ˆŒŸ({»g8È+9�¼ÈÐRú‹½^Ëù(äcYØ…^—ˆσeh…Ð÷:hµó�Ö®ë`›ÒXRAx½Ë§ïë»ÙI_E 8ÕÀ‹Û�¨ßàªB…1ûqk1«†UÜò˜ÃŽDà—ê#ÚlÁÉbU»yÝ@F`D ,¸Û`”–C½M×-09Ǹ³ûÁvL–[f–ËëtqöÈ·BcÖ³¬Î‘G”w΃ÊãBH:?_±£@AG™ åh…rÊõn„»ÌzÊí¢¯Ÿ±Ss¨Ôc)Ô:Ç\*…”{�oýoGJzìÉo–»I"”±Õ…“ã3'=nÈ1éqßP$ß yƒewž,&k*)ÞÕ×q¬(Ôy‚¥`(Våc¹çGÅs² ƤÍnˆ/aߨyhìcò×W&=ñùÆŸž|àݹXY�Cò�/aO¸H ›ÎÁ�ËõzM˜àüe5s7†£-VW³y� E ,L’ZvzŸ«%"0Ðæ£Ýl·ã.¯×9�}õÃ×O>~úæÝ«Oïþ}ÿòã—Ó¯=úýãÓ×ßúøîþÇÓ£ïß¾üðæé¿ÞÜ¿Æò{ûç/Þ<>ýJŒžþW£o¿Q“ßàŸìɲ�|C9âg­1É2 êã!¡)ßóFÀ’«Î�!KÏ—°ÈN­%Ô5Gž†6Ð,…b“|€vO)ŽJÚm+´n,—N'fß·k28+{¿p*õŸã!ÕÁ v³Ý»¼^g@®It@–, eŒ¹k5£P)²$,ÅW¾=àù÷[¹&ж1hXì�ñ{?v¼�–@—ÆHÛm±×Ж¯ dê`ÁØ«ÞÙ ¤Wéê”êeZíf»�ky½Î3hì' ‡Ô ºÁ*M.–B°#¾>ööùwá �) µt-¡š:WB/CÒÓðÓmÉãü›%†eùàr�ü¼åÏ`<‰0»pŠœ”¨Ëc}ß@ËCÝl·C-¯× `þ�ÎÁ�¿a­ãAKò=¸ï?›`ÙЦ‚EC‚®´$DøX™}-¡¸x°•šb÷º@ `MEeãæzºpŠœô0óÇ ´ü1ØÝvkózÌÓ‡µ58Ö¡—Šìò�ÇÛÐ,|[xúL Á ”#6&0•±£…œ”j”¤]5þxÛŠÕï´…âÁë�Ý€ÁØÝF’—Wp û!‚–A‹v³]çÚ¼^å€)ô’CY)ŽÑçAlüÈ dP‰3ƒX2|åf n˜æœ@:“ãÒ²‘:•ZS�þ`+*Âçƒ×2‚YÄËmW9]zmts†X-ƒíf»Îµy½Ê�fw¬;cfÐC“f~oÛ µ©ocoq‹\ÀFé„^¦F™[­Œ?£ö´ RÓî¶Ð3Å$Ãôºƒ#s`0ˆ|µ4§ ;}&Ð h ´`7Ûu¬åô*Ì_MA ttÌ>‘¼£­]ÄÆ³¹Äoi&Ðà*lÎóS5yŽÛ1Hɽö Acê¥Õ|°�D;x] #˜70á$cèÒ«Ð÷|@1˟ź,÷³N—W �üy¥‚YZ)“¤q—Ì´•doÕîgÖ šïì«-&k1gUçÊŽMuCн[& ùƒËê×íõ…æ2MÍç*™õuÅ,cç^\ë˜Óåñìÿ';ò¿±óçà瘨ãß‹/ø?^ߔӣǧ…‚ú è;¡ï¡È€u·­bdyòF§ä6ÇöR/N=áH%ÝÖ8†::_ÂIFzõZP;QÉ(Z7„±Ê ^‹±nàÈiuJ`.l+c9x] E ŒÏz%^Ë+|õµ]F`àp°¢Ým×q—×ëŒAòK4Q•¦Ódjv¦qƒQE<xI&E)ªrp‚äbÛ@;*Ïl³”pß\n¿­oO8‰þhñtáRŠÞ©î]Ÿ7Ю�¡n¶ëD›×ëÓÿ=„·}vŒ?äÚfî FÐÍk vp“(!xKüõ ´ô•–ýÁ6£lŽN¯ d–AƒA·9–Waëï+ÕÁŒv³Ýε¼^çàé!\UΕK[ÖS¸`D]‚¥0ÕÊ´€ÖX øwÐRˆ‹?Úb-‡ž^È,…ƒÑ’|/¯B�@X/#0ÐRÈh7Ûí\ËëϤW[r!¼Êž`K|¡¿¹Cî•àH £U©�ä·‹é�V�>5xb‰ä?Òt@÷®wСÒðóÜÛ”m#é‚  £! Ì Úbe.W옋ÕÀ™¾Úå^Lóg¤×œ³Éý4Yke9Ö]�G–H¾NLØ+Ç% `9ô¸Žš¼Gg}WòYKÉ�3™ýÚ]¬Œéžhc5P3€‚€Å�ÞVcío.:,'�eëb­.ÇzhðÄ�ÿpSý9qR –c C7À;䳡 it±uÜFÚX Ô   `�²J¿î¬r…r¥-¡ ²u±V—c=4xb‰F iUŸP œ—‚€¥ÖV²¦Ú®ÐµñE£)÷®Â‹›`UÎÃ%O7;O Ú(†ÕÓ+"‡fYk£ò‘c<( ¼~�ï ¦\qó@z»ºø¿‚«{hª.ÖµX†lßÿñG_Ÿù£ßÝÑÜãÿl�¸ÊƒÊè~Ë ,s5õ7¢6…<÷½çÂÎcE¹Æ ÀKØFãnÑ=¶¥w°]`5ðf�,k˜L”×�UÆ%¥{ç~¿²õ±V®±rý`,º$í endstream endobj 226 0 obj << /Filter [/FlateDecode] /Length 9253 >> stream H‰´W»®,¹ ü‚óÚÁ6DQÏÐ_àÈðæk8Y àÄ�ÿޔĩîûŒ»wn]ªT,©)ò¢–èÕ"·+S+¯ß¾þþ®J­æ—üY+§$?"¥6p Lüúýë—Úk¹R q­N�ùõ>á®ÐK} °^�r ]©ôv‰,äÀßA£‹X–±-^I€“Õ@(X—«†þ:H9_Ì¥ŸÎõ&ÖÇZ¶›ôéÀò¯ô<\’�s_.G£ÊmûWsáµ:¶·€ûU;©}=’ÚBoªžsóàÊ^έ×tÆJú½Ä~�:L÷‡ý€EI“<R±$—˜OaŸŠõ±–•±>Pÿj/­‰]ÂÞô†Î‰äJ¨�õ Ièçr*Mý3TŽw,`»‚x¿®ONÛÀ˜bt L¹å3V\I ‚Õ�K Z®–9¿R1¥6=Ö-à2p‹õ±––±>Pÿ¦ë"žôuJ¡ŒëBÂ>ŽòÍÏÅA>ÿíà~‘”õ�Õϯmÿ(æì@øGÔâ+`�ð¬T \äW�² (•S@¨j}¬åe¬OÔAAç,¹®"�KÙÇqRL………Ò¬*réY6zßàvµJ¤Ê_Ûr p@ áWò‘ÖÆgì¸Baee¬Tû8Ð;öi‘{'uë  „XkiéÃ5p�#ñ¬|£úÒô/Ðøæá_—µV7y‹¶€å]*)«òE½A¥u›¿Ä=ßbûÕüÛ¬ªjä×É*…¿”vS  „ZëÓݬ–ƒ¹/ãâv0(J_óï¸êãi™«kxD –“ÌRSêz-+8Xkê„Ýb¥à8¸Y T 0˜Òv¬E^ɘn „ƒP{ÄZº›õá�:XS\W.¶>Ë_¨a=Ì£¾¦´-L5êÎûz”¥jêNYJªnϵ±äZýµ~ĶÄü`507ËßÐÆñurJ¹â b±Z�X˪}ƒe»,ž‰WÃ-}G¶_U.犟Wûý€#^-ÑVˆç•Sð‡¸<†ôˆåÈñÁjàùÍm¸¤c­=> ËM«EZRŽòfÀpì/_á%oþ÷ë¿ä/òÇß¾Êë|ýúׯ ðçÑZÇ2ª_<ÌÖ�Ðì ¿çò8ÂâÅ\¶fœälÓß'œÆÃžWŸÑ®ÞfK%ÝŸt 3‹>Z´�œ ÷x±ì~‹eqÝX ´Aá„­'1ÖÑþî§€ë™Új]¬K×õO>Udu«Eõ'2�öK:¤õ öQ™Û2e•ŸScÂÀS¿Åò#Å“Õ�Kü**µ×Á9š¿ Ë÷þ—}[«‹uYmÒGþŸÌ)rHD°ž¥ßR÷ –E?WQ$““ÞÉcUõ)¥æÀ•=]•×­t±q?Æê@Uûíáèm½Æ*žô1“ Â?Uëb]^Æúôà£IE–³túpÊcú¾¡òXVVcJe™ÂT’ÊçDì@¨ýˆ�•Ï/Ör�:lm¿?EDZÆ\ã”ì)¬áÍöûT«‹uIë#ÿOæYœ;¼§�íþ]µ�™ðI‡†ò'KÙ�°�R¾Ç’4~¡Ÿ¬T \¯YÍOÖrqÐ�Ú(¡Öb]^Æúôà£9E–Cµ@“x � õ/QUWr€�ÒÀ°a+}yÄ2zoDŽë“è¤<ÀÝ :Tò¬ £ÀYüã�í‹€r:…ªú—JLË“Ù;Oõ)…nÜKÔû)ƒ/Å;¥�ssx툧?Ie;vïTèŽ=Rr­Ó-ùOfYÛ kÛB¶ƒ¥0ÄŒ/7Ç®Ýt� •‡3‘aÕØo±QÚÙÖo¬ª–L;ì©4Î�ÚM€‚°b{¤¥¤ß9ðÁ„2÷ ¹bFâý€«®à?Þ…[®‘Öx’®­ð)w§¤v2zÌU-ƒå�O5œÒ4Ëí¸m¯à6O•ºXKɱ>Òÿùˆ²Þ§LúÀõò6°ÏÍùHþƒÙd�74ö!´í�ƒkÃVóã_§”±w´¹DþÒ@å[,]ó½?Yp(�Á5Fœ€±–ÜãCÁ·�[­‹µ¼6ëÃÿ8›Ì�#F¹“Û4ƒs�84+·îÐzÝ��âòÉô˜DPŸbkóá1ŽÑØ­ÇÈ6Sl­Üª\$´;Â[ŽóNÛ~4‚L‚2âV.Íî¶ p—V»;4µ¬=`Jëóù¥³—~¾Æÿn±Ib{¼±¨ `7`y6¥óz¬£¹ã}Zªàvp©õ±–—c}xðó!d®–ÆPjÜî£Ó*ê`aVWÆq@¿ôH„ƒ%`¶Û±2Úövg5PÀAÀ’k[mŸ±Žþ®åS€bðOµºHKÊQ> ø`™Ë{‹ÚÈŽ›þ¾¡ý¢ìkAïj‹¨‡Í‚yI«•‹”¯¯×xã4°¹ÏÏкæÒ“TÚ»ñQùíÚÞ©Pi)9Î{ö?ŸBæ6ÄhÍ"±>*Üs@™«Ñ¾èÒU|*Ü÷bñËûqt¬œ @`©¸Ÿ_'k¹Z w Â@¨u±–—c}xðÑ"Ëcmcäön ÞÕšÔ«˜ Š·´Ñ�šÿ-LnN/tÐyhn¼/®Âòt묇œƒtnW·iÿ¦½ZVö:Žàä¾MÀ†ð{î—deãMÈ&àdŒ"bA~Åyá·OÍ™®éž9±­Ï& �TꯦºÎL_D¡‰ÕL á-ëgÖü:…Âõ©pýØ`Ó3Z¼‹)/ýžÝò§~tÂÞÛq÷óÉjÁKÍ#¬s�aÅ\\s;H©ÖÄj^†õæÁ3ëÇèM5ÊÐÕÛêº ·µ*M¥Y+RbÉ£¬(Hsÿ±­ç|°*( H pñkB!+ª~HáP àr°Übmº‹õæÁS[ÈU!<îZXnÚ5ýK÷u9y|nÁ€t]³ßbQtÃÁª (Ðo@XÖ@C:*W¨‡é ÅšX›-Io çÐüÓ‹Èö�0”/Ûí©ñ³õ’xÇSdÁæî) ³ö½Õ[,ªP>X-8ð÷ŠVXüØI·ÛH.Û —ZsÇ4­Åz:0w‘ßÿã‹/?|üúÝ›�ïþóþÛ?>þ賿|þøâ›�Þ½ÿ×ã³o¾ûöû·_ýûíûþõÛ�ßýíÇïß~þøÃúò'ƒþüõ ùþüì¶ó÷ûúóïÞ}j¸p©y³¼îprb@ü5•k±Á�òÐ�b;g}ß �Q:]ÖÆ¦—šbÝY4уÊ÷þØX#þÛ×¶+ x¨ZkÒUÖ»OnGÐ�±$޶­‹�Æh,´èE¦Œ*”Z¢™A{$¤:_¼!4ˆœüæwœÆÒâÃ&\l7Ê»=š ?ŸÈ´±+ÃyÏüÓw¢ë×=p§ éõ€ÇJáçEÁ6ëëåR~ £ MýÍUo@Z¥=ilÃvô;«EÁ$P¸¿\�yc…+䛂ÓÁ¥ÖÆj^Êz÷à‰µèúT9éY£Š… 4‚@ ‹‹bKª‘Wà’¢ - u�„)X%ýÎi@9ŸÆjÐs}NÜŸÚFË·§¤}¢ÔÆjNÊyÏÿÓ7£ëŒwì��÷OQ¬e)1¯·9 gÔÚ<Íëc^ë¤y>ñþ1–8Œ�;«§ºGËAý±‘^ïÏå]Aú'bm¬¦¥¬7žX‹®_Wר¤K Ë@¨$a}j|i1¥×Jý¾×f@87@�½ÕƒÓ€rþ*þ�ƒ\÷�ý‹»jÍÒ;ôt§{ªÔÄjNÊyÏÿÓ¤yÎZÚ0ãFqOá‚�-²ÑÖâ¥&†Ðé^ µpêïk:רQ½Ð(wVŠ‚U?FKÄXýØY¹±n t±ÝÔšXÍ˰Þ<øôiV_ÝC\MËA5 ·±ÌÎ��x�Ðð b¢° ¬u�¼®O88 (çëõeQ ¡ñcU™s*6žãty:•šØfÖ³ÅyËÿ‰åhžß¸²¦Z8·XxØ-Zs ,ŠšÚS2 (‰þ›ØÒz¿±*x)X nMJ½²\=HªÝb5/ÃzxðËëÑüÂÍqM z½Á9¥.'àCñ‘9VÔƒ ØRθ˜k¿*xÎ_+ìÇðk)·‡À³äÏ)s¿à+!rÞ“ÿÍ«ÑW¿}5úAfö_½ yg^˜.C £—&7w¯çrˆùóÛu•\åU"xë2žfÊGl“¼ §e]à¶ ƒ:ÉccE“ôÞÇ]ÁI°ÔšX“®²Þ=˜å÷ t>7ŸmCR1.F®Ø&ª8J’}$•å Z•Šq°�¥a�Mh\Rë©€FArý±‘Æk‰é»‚4PÄšX“í"½;ðÔ>4쌬Zcì}=`<ÝîÅ>ŒmuZâ\o¢¾ 8Õc háŒ7¡¤ŠÉù´Ÿ0mrÕ),¹Jã&€ í±&Öd¥¬wžÛ†p"�/mùGtû”Ä@‡1¯ONËÀ[2 ĺSŽX<ÀXÃÁªà°*€ ˜]sÌ��t, M¾À@�ŠXkÒRÖ›ϬCnŒ»^^¿ÃóŸþ%àRŠ)8Y1\[þõœŠé_/>±—¢ÔƒUAQ@  ™ С9í N‚¥ÖÆj^†õæÁS~Ž.)ól�©, ·Ñ“¼XØÒœ}1ÚD)K8ÕÖ€3�ºæd‹+TyÛ«‚¢`ÝáÊ;Ø;«�nø6á ¤X«i)éÍ�gv¢Q**£æ[ZþF_Â(JkÌbî:ýó­eÒ¿’¼?b1Óôy+ «‚¢€ »ØoÉŠM¡”v(�R­‰µé.Ö›ÏìDãCõè9F:i"¸ð[ã.ÉôÛº�Ñå`@Л?cq„¯ñ`UP�@áV,Yë\švÒAªÝb5ÝÅzó੽häÖÔ½î E{|ÃWJVæé)„¤ÕGßÛ‰ÛÐn” æuÿ,|æU#gÓûqúÄøsê´‘š�¡Üsç~j‚ãþTØs78°»AÚÚ„|Z¯äÅ€ëcç^o±5ó V÷÷¶à"«ËÆ:ÞØ)``ü¹jÕHMÊPÌmè—v•_¹¦´Žú*s«YS œFSÏC:-&c٘¢ü`t3à›‹ ½àýž±.pòY¬ ´kŠ…×QÃ9?'?_ç\öM­6V³RÒ3ÿ'v”qJ/‘mÀ㊾0æ“ù\[GQ Næ¾Bõ%^óAº×¹›V#0¬Éö'/ÝÁÂÈ4��žô±�m N‚¥ÖÆj^†õæÁ3[ÊøyÅ‘N€Fúz ý%Ö(â[ˆ�Ñ—$òklÍ€4Pf‹ç—CÚI›Ç¯ç/(šk*ý±q"{ïBÞÏ'HûD«�Õ¤ ë™ÿ;Êøqjl¸�c¹G¸��²ˆ}5qD¡fùÃ^ Hû0¬ú#›oïõ`UP�€p}¹ªùÎZƬÝÒ@ª5±š—a½yðÌŽ2~R’÷ÏqG[ô^,%HQÌŽöı;;ú‡­ ÐkFæÙ%wJ :Ìí- p¿;g±ÍƒÇÛžiÆ¿|ÄbWí!¬ Š(ŒxV:²âÑ¢ ¤�Tkbmº‹õæÁûÉuÍK ¬2ËŸ…‘H© +‚|ªÐY}öÝ€4‹D>b‹™íkÙ¾Üõ,xîg–ö”�Ò@ŠÝb5-’Þxf;¹>T`I(=¤e n"ÎWVÀä8(…ƒ€!çd@ê÷®ô#vt½ÒVE T�‡‡‘µj[Puo!T»Åjº†õðàç×”ëÄùqZÓ[§pŠ«m`¼â‰,Äø«Lgu/Ú±÷{lŠìz†UÁKÁÊyÁ¨ÿ�“´­/©çl¿¤j¤æ¤ŒGúÿß%¥áµu_Í€þzÀh²ƒc€ã�]9Œ¹9…+‰†Á­\�‘à•o‹k¢4±i–r°*h—×ëy=6VL~ð*ï N‚¥ÖÆj^†õæÁ3KJ¥¡Ê#E?¯ËAÂcØœG¡©f—evnÝ‹þ”»§þ„¡ œ±ñÅû^VE?a<Ò9§+)zÇÊ HE¬�Õ´”ôæÀ3{ ~]ÛAŒ½-ÿc‡ì¼€¥%™œñysêÑ€´/ùkw²±Ø|{¬;©br>Ý#ŒD›\àE K0›ø]AÚ'bm¬feXo<µ¥àç •[ÚA^öÄY|¥¾Öé‰LÎP_bŠÑ½R\Ù#±ö–ZJ¯ÃéAF”~$ßú~:ÁåÝjc5%Ãz$ÿ̆‚ß_djó…óµ�1á…Ì—›³°ŽYwª¯¡gÒ<”Ûÿ²_mËmãHô òzIU¦*ŽA$�É“/‰+5ΥʙÙ}sÑmq#“ZŠJìüÌ~ÌþØ6. €TA›‰$'|ˆ+uÔhöi4ºOg=[E@²žWšÐ‹Àô¡SEèùå`@LëÙ:ZÎéJ6ÚOà8¡•Œì·+pfWê­}±mÜ<âÜa:xXÏ’˜w-¡v¢$ëzô1¯k9F.Ø#Ð'45¨ŽÞç ˆÉÃH=[GÉóºB“EÎ'ÊQñr‚×Á0Œ’.‹R\:(Áô Â3Äü1BDϪ‡sÞóê@�-_ 3©Òº^A<Æ¢�m#2ÖÖ§k½®ä`“Ev‰8± Imœe?'Ĩ·4KðùÁÄ ¦,KVlã4â=¯>¨"@Ë ,Cè•[ÍìEÀ=}íEëÙ:^ž×•l´¢È«b¸!qB¸M!Âð)Ž•)L©(ƘŒb¸° m¡YÅvC1Nf¾�眀bu�J‘œE½ ˆ t2Ú³ud­×• ¬YP¤k–áR …iSæà$£Xß4ÊÌí°”‚.¥ˆ!G,ŠVm .žWª¬ s–açp^Eºò}ẞ‹ÔÚ9Fž¿û�ý$Í¿cIÉRyþŠpÛƒaÎ&J¤dRŒE¨šUÝe JЃß,†ÁÓŽ…R"=wó—–åÅUy9—Rðé!å¾m0}ÜéY:2žËâª8U6×pË´BØæa!å+7Éc‚¡ff‚" ì�˜@š©)áÛR°E•d½:ÐD€9DF*¨²QÇ«~±»@‚˜E­oëxy^Wr°É‚’)ùn.&9µDt ´Ì KMVäu˜øY3Ä ² ÷>kK!¼ëÕ�&Ì Â™Ì%u¼JíÇ“n³ùÓ±z–Ž”çr%í'pœ}}\Uûm Î3é‹…0Ú[Dïž¹1}©icž-AEÏ«¹÷šé­µëÄŸ|VÝ ˆùÃ`=[GËóÚÏÀ&[ |F0ŽV›yÓ�EB°ûʼn{Õ©0á£"6 æ�g‚õlcoÈ[¯>¨"°ÀÎXÈ2êzmÇI?Úšh=[ÇËóº’ƒ�ö8Î v )Æm l?“Äe)6ñT`Q)P‡Ï¼yamcx ¨|lJ¤¾ŽéCF»Y=Ÿr¹Ð[š÷}Úô™X=[ÇÉóºÂ“EN§ EÝ–â¢Ò�½ Bn¾b ãÏR‘x æ�f‚÷l¡~8‹{^}PE`+ØÀNy^3�Z¼{3ˆÑz¶Ž—çu%›,*rÞK1iÖ;ƒÌíR)cŠˆQÔ)cØÀ9K©b�Vm#žD=¯4 §‘Õ,èfe´�mM´ž­O×z]ÉÁF‹Šê™y°tR›B„¹›¡ ´ŠóJÎqM@PÊ<3�òˆ®Ø2žðžWšÜ œ¦8±Ð©ìa4ë`@Ì ëÙúlÑéJdµ²þú¶Ò¹ »´9:+^[dº4Ô8‹±u»U�Èš[MçÙ‚þM{^}P€çšAŠG]§�jÄ hÓf‚íÔ˜£e½ö3 –Ç—‡GM{ZŽÛ²®òæ~ô;@OþømtxÑ6eu3zr1ÍçÅñ¬¨&ïòvúþ~^ü6z*�޾jôêT›<‡ß\‰þìÄmH_¾ËÞNóä-n&ªnn{°Ðë,€qò,#™RšÑ351d�mn(+˜@‰»¶)Œnµ–ñê�&‚“GvÍZÁç]˜¼0‘€‚¥œé�É=f%0ªÀä�ÚRèÛQÌ»^Ø l5cçP 2 xYTé; ’˜@Ç¿ÅLè-�¦0€¡#*"‰”ˆJ̬æ§)SU . ókt‰PENå,6MW0xzo�ˆhD…!-LÓ•ì„ά™U†÷¸I„�/.Á*Oõ§R,E:èÊW–¨}â‹#@ Ê—ê�.Ñ­XƒiÂT&3\L¾WïüDp£Z*P¹–Û’Äži8‰)59‹81QB˜I:1Û‚”ø6éð©– 1l&LÑPë@bÔ²¹IùìR†‹ÊE™†,Vs.-%‚™÷“pý~äf¦:®¬Å„fæ&ÍLùC™KƒæìÊ™¤L¦7!¦ªôÔLD¨*$¨)¨ÓUOÝ“T?u(?¡Ó Dã8eš(K2SG)Õ[x’[ÑØ$•E®þé¢þ/ !‚PDø¾Tœ|ù²ÎUs¶Í>>zÅ/_T“ãf¹˜B‹n‹¦’`"ÁË7uõúx ­üà@ÃÇÅMYù?˜Éý˜½º<ºº)®gùxÚäU[¼.Û‹ñT6�ê2 eYN̓¯¶ ¦UV; ÄB‰,ÚÉiñ±Ìe@Á”º‡BÊ÷+¢opøòÓq‘_gùr±(óêX×ä·ƒþÆìëÝLÂþd?œHx¿Ÿì¢á××׋¢=þ [Û&ízãž¶£gÿVÝÖzð3©–åb1®guóû§iÙáýù~¶Æ¸Ó˜•õÖËl1/Æo—kÞÃðzv©’àŠ[6×ù¸¸ç›^çÐö÷Â`rP¨ËYÞœÔÕ¢aNpåàöI’MY¾¸›×Uñ°tÒnr�œ£pmµ iu‘ ¸„Ë«]¨«º —ÏÁ\>ïPƒ¼«Ëª=—s=@‡ü�.ÌS=7ââé¡‹zÙŒ‹£Ù|š‡OWºÁx¥ƒÚ­}WAëâsLêyÑäm½Fÿy|Ü��u¥“úv^/ôvñPšAð`øÀ‚¯Bšn½´Â‰¬Q«>‘hŸÅô‡8œH¼×D‡ˇ0[öXÎÊö]^®[LÞ´ÔÊæ¬ÉçÓrü³Ì̼)Ûémц3úegçúØ÷eìÖ×׋¢=ž-×\Òw”éŽ.òuÑÜ2“HmÚÆ»øqìèãå¬-šµß><-®GÏ^üuöR�Ø£&ò8´$§Ey3 Ñh¾}Q¸§Oå¤�S2ÖÛ_<‚ùÜs¹Ûk÷Á<îwÀãèÕåÑl>Í/ƒ÷�r²¶M(›­S©¯þUŒÛãzYM ¶ãzMõ›˜¶‹à»êœ YûÒ&ÛesµœÕ¸M�>˜üÎXýlûyF’PNWù¢xÙÿ^Âņ7œÞ©­3¬ê‹¶lÇk¦–c¹PÖïËYþP;g¶Î�†R«–·oÇmþqfþ‘�‰æ÷~;y(Ì&Ý¢¬ÖÜag}¡;¨±‹zÙŒ‹³&ŸOËñ[ʶLj]|ŽI=/š¼­›`>îÀÎ^ÍI};¯e;l{ö7l{ö·õm� ÛÞ/±í]79HÄÙ›º\ ûÞÞï{Ѱî=ìu/¸­ëÞž6‹aÝÖ½aÝÛ»u„ëi1­Šê2þû•ëÑsÁä›|R.Ãg šÍìï 5)gy,·bC{]7ói=«oöÝ-ý•;Z0ù¡£ mèh{ÞÑ^4õ¤,šA¦ Mmÿ›ZÅ:ô´¡§÷´A¨ =mèiCO{ø=í,_þ÷?‹ñ´hþQ”ãégù§*šKö+w¸`ò‹vrú?öËe9m ïÒM—t€6íLº ô¶ÈL<��e¤Døxt)�§¯/¸Æaá#&–lð2Dgæ|Ö9ÿÿ‹ý$o½;Í¢`û“ݼւ$ iÛ§xÜ ç úvË„†7èÆ7hv7ýˆÎĆô˜Tǽg/¦�ˆ G#O{'šÌðD{4;ç$4É!Iæ=@¾n‰fÊ&›÷·Ï<°~fÔ,À&QÖÛZæè­ fG þ±Ù¨’³®K³A}Å´•x½¬Ž{¿y¦b|q> stream H‰ì—ÑnÛ:†Ÿ ïà›N�ÓÆvt±¹ŠcÄ(v�u¶8wM�b¶©C‘n¼Ï¶wûb+Ëv,'»Õ/&%'š¨ñLÄ�3óÏÌÛÎïoN.�a‹ÎßÞ\t~{H¤Ò½ã3!#Cêmþy¿sòQÙígËov‘Òò³ßzo;'ÿT‚ç¿›X#Ôý®ÝœI·2ü^a©XRæ‡XšæÇúcü�›üƒü`'CÁ­ÐŠ™'Çd6ÿKSg){û« ]ä9m4Hé‰D»ŒP¡pžÂÖ;�öÊ¢D†2'+¬KPsï\í §‘aéLp<\5¢Šag YœH§d˜ÕæÚ:ü¾?Dï'�“ŸŸ8¦+�¤:vYe??íOÐX�;Ãî¬ÑJÝðÞ‰ ï�8HÃ{g–w’™[w›×þªÖåzm�GÓ:«ÏÞ”®«ã8#;�Ί.e:cK×@“¹§å�¶h:¸t´ ‡;@‹!6Œ[&o´ÈM†•3˜›7yæºsfê$)Sµ¥ëO´3œ«¤ž‘ÞwÏQ”)ËèÚП.í¦zâåP鉖ÏPʬ°¾rùn�qÇÇÿ/¥Ê%·¹äÌk •]‚µ–Ei‹¼',ÿSÇ$ì½Nwýõ¿žƒ"Ox&n̽c�r׌3ytí¬~£nË,z¥¥6ãM¶E1öÙÔÚ’kG8:�á#E4¤¹`ËÕ˜)ÊNÁ*iÄ\– ¦–¹Ù¢Rz'ªhÑ¥�,M½gÙ;x>�ð¡< 1‰ßÆqFö˜En¶¶´ÔUôZ$û§›Pý1éH´+�¤K²åwlET{ÜnúœPu¾-‰NÉ0« ̳u8j'©Î„¥IC¹|*J½}õ³�64½„zïá)èuØRNÄd®…�E»-ÕtønT}î¦ÄÙ²)~+/ð&6¯ð Ôïtaœ%û—å3œªìLT®�âŸ[¤&G—eï?tº�—‘g£×< ˜g½—"g Í·ì(RöÎ0•å#O‹ò}¢�á”Ï3éLp|š©Ø�vÆ™~ ug…vŒãç>£uÓ—¹ªómItJ†Ym`ž­C0}*$"–Z$ c2÷t)åÁ«§=»Î~²r€åï IZ|y›¡iq€@/Ò�ûdHqçâÍÉäËèºðhPröκASrFâ~†×êÆÜ{Wèõp¦"²3imí�èÝ9 ôÃ<„©‘n ˜d€äòã׿ÿçß3I#2\Õ£Jµ(l¼ãèé7âv �Šò³ tE=ÕÀÜÔâëߎO›Zyï}ÅSlX$~%sï�gǶçÀ@E-‚Vˆ’\ÍŒ—2�áH ß×"!™…Ų�;ÛX›t¦¥¾_´hi;BY››¬Á@M—µW1{³Ã®hH"|ÈB¬ÓÞщLÔtÃ帮ŠªõÛ8Îȶ¨ÎcøeòF‹ á•3ŽÍ›|g>‹µ¥êa¢ÆW=®_ ^ºøÈ?e]úÓ‘âxÇ|âåP鉖ÏPʬ°¾’ðífÇÇ;á9Ц\r›Kå¼YÙ%XKºsfêdž?Ô¢¶ô�ÊÃÕŒ)ErB’x�Å๣÷Ô»D!ûB>wôy Kg+ÖÖMîªÂt§yõC°À±iÍŒ½à)PŠ,•ŒSBÊŽYÚ¢f”°üO=ÓvÔíl¾:Ï{;�(uñ„OFsÿuuvtš5^ópõn‰æ]i©Íx#mÑ»)¼µ¦F`¢Æ×^íukÄ3 <àd6Ò\°å�ðý`Ç €¦T_lˆþU1A”4FH _ÊÊØ{¤•V0ãÜ%N2‹ÏPeïlR(b¥Ë—V>γm¼“áeWŠÞæõ7À]/句ŠÅ†Œ"ażߣCsE66:Áu¤0ös^±_li"WQ’%˜ÂÖÿ³Lé¾F+_[{çaò[ÀLù h™©58®ìýçŠd5L³4 ´’0%’Uo­ZF²�˜Ë2ÁÔ@Ú–…èÝ_aáYຳ�ÎnmYíp¢Æ¯vÛì‚HML·qœ‘mQ�džqËä�< ®œQå_¿Éw�ô�®êa¢¦W} ýª[ö¾GÚ÷]xZš²Œ® ýéHq¼e>ñòN¨ôÄ Ëg(eVXß I“q‰qÇÇÿ¾ØEÙ”Kns±œ×@+»kJwÎL�Ì‚›Ò˜>£Qy¸š1¥HNH·ÚÀ±yîè=÷.QÈž�ϽC›Dƙċµu“û°ª0Ýi_ý,§G7%ÁD/xJ Ô‡†"K%ã”�²c–¶¨%,ÿSÇ´u;›¯õ�Þÿ{D©‹'|2Ú˜û¯«³£Ó<˜¨ñš‡«wK4ïJKmÆùh‹Þqx«mM�ÀD�¯¼ÚëÖˆgxÀÉl4¤¹`ËáûÁŽS01—e‚©�tæW úøí�¶ˆø˜Ì=-o°E>}�B¢À^rw€@/ÒRµˆŸ )î\¼9™|] ÒæónçÞèV¼Ÿk,u%ïÓÄåǯŸÄÉ,$¿Â³E1î5qÎÓÓoÄí@;ågè‡zaËMmÝÀ­}qiJBJôœj\�¬s'2@Ü…Š(y$`*C)1;,æKt {ôðΧ´‚Éç.q’UÝE ­ìâ�-K¥Àé8“|¼j¥ÛÖÁ;Ø J¡Û¼û¦8?½]/ï˜yaHÆñüŒ"aE•þ”ù¼£õºpì¢RœeJ÷5fëµµw&°Ìd(³ÌØr¿¶÷Ÿt�ÞE¿Ûé�çß»�üßEþœÿ¼È?è ¸Å>ËlÌíHL‰dÕ°Ú²¤NeU½ï¤ž“µ2¯0÷žxu˜Šã ² L´3œ.e:c0.yAôî ’ÙhHsÁ–‚‘v�é@L#æ²L05Xåb[ä`•n#ÃÒ™àxÂõkd\?@Êq�¤:Ëת[W¡_G®v —†ªómItJ†Y�Ϫ[‡`špµÉ B È÷38KSÿ[ ÒÃAz!Æjä9m4Þ^¾‡è.{Íhmj™p¤ÚÒ3÷™šÞ;™v–�Åç¶ÛC«ÏÞ”ö»WÖÎÔ@±“¹§åe±<ܽ\HKÕ›áÉ�âÎÅ›“É—ÑuáÑ Ü<ïvÎá©jÅûyùZ05KÞµôòã×Oâ�d– ’_+Zu©ð¢Ê€6Þyôôq;ÐNEùÙú¡^ØrS[7pkD\š’І=§W#ë܉ w¡"Š…ZµKp‚K‰Ù¡Ã‡‚’‡w>¥LÆ8w‰“¬ê.JheïlR(baØÒq&ùxÕJ1¶­ƒw2°”B·y÷Mq~4z»^Þ1óÂ�ŒãùEŠ*ý)ó=:xGëuáØE5¤$ ""8Ë”îkÌÖkkÿ‹ üÁ0“¡Ì2ckÈýÚÞ;W1o^ô»�~÷¢ÖìY<áóËÆ<Ð^Ä”HØ¯í·ž3•U5¾“nNÖʶÂÜ{²Õa*Æ~Œ'Èô?ÑÎpº”éŒÁH¸ÌѸ(Hf£!Í[FÚu ¤1�˜Ë2ÁÔ`•‹m‘ƒ^=-˜ä“(>ôìøxO»I© |RÜÏlþù;®¥Æ§ §nþ§;x¶qì2ºÒ*Ÿ ®êÏü¼#®Opl]«&VÓW­&ÜðŽuw,gâ|m¬'‹»NHÇjJ·0”誥·Ô…”𥬌½GZ¨ˆb¡„­!/)1;¬Jö…yôðΧ´‚Éç.q’UÝE ­ìâ�M E Öœ¼Úø8ÿ ̶u@†#¥ømð_öËn§qˆÂO°ïÀË��rt­T`¥J{‹L2I½¸vå8@yúu’–¦»#ÕNºÜµh†úóŒçœ¹i Ðnfgµ¯CØiCf7Ü5„º|¯ á½ÙI »3�y’E™$0Ë=¿ŒÎÃÄ[ÀLÖ%¦½\eiíI M$kÊ(±Ç •ÔWñ‘š,§·\šq­Ô@¯mé Í9^º…µ¼Bhkøx¡N‡ü�¼ûË9¥ÖëÛÊ¡"S /�iƒ£YU�M©‡ˆbOP’²Ò¹5ª»àîs3)<<�Wíz©d3ØpÂû\Ãåa¿=Ï•¤P®åéϸ�)×ÊÔ.|1mpð’[OK9—ÜÀTvÏ$fF{V'#8Ÿ´]›§4­f¶9]wÑõO�”àl‚Kb°€ØÉ™^Û¿Àlë„d¸WéÔou€›-áfVpVû:„U62˸á®!Ôå{Mˆ 'Žmw�•yÌ“,Ê$9€Yî©ðpkËèàk%l(Kì)l®IØ/õqàbt2Â�¿3Œ½ðYe¦øP_ÅÇ‘fxiÍð¥5‹öbrñfå/Ù\g+g˜,7£ñÒû èOT¥S:ó)ƒ;C~Å[£Ž Þè«Mõ¶‚ÛÝŠ^%¼4² š‡¡‰âf\ç[“¨9if\[E‡g�m>]ªÙ\•|PªkßÃ1\Š:4¼ŒÃ ŽÈ.ÈaŒ 9ÂAŽz ‚‹ÌC �ÉxžW%¼ˆô_47?—;§˜­Ã¹Òl>åé®h&ÓÜLgdp¢OíìÛ€ë¹vâ =×NÜô\;q�žk燖˜¡è'\¥¡¨¯1øÔÎ�ÑN÷Ùû"»Þ¯Ï»K#ÕñštAõEuÜÞ"ý8†´ó·÷G”ï%_ö'¿®¾7=êËów“tjÿ!É;¼73's|tªûß”š UÉÌžíB=£Dm%m¨)ág·‘ƒ¼¿¾Ôü^T©ž ˜¨J§t.æS¶+>Àa(× ¥ÉFôÈY} i3)š|\±ª,9“mO~Ø ®Í1Z›Ì1‚:©Cƒ7²ÀA1Fž—dê6Ò”yÍ�¡Œ8Ÿ±=÷xÛTíÿXÞèÐ? Ô:‚5 endstream endobj 228 0 obj << /Filter [/FlateDecode] /Length 13136 >> stream H‰ìWmoÛÈþúüb >œ¨}çnóÉŠë …ãç$5PMRs飨$þ÷�YŠÖ‹miéÖ’|'±ÈáÌî¼>3“FEœ\Vešßxo~޳^»øç{˜M“cï×Λ4?öz_òô)Î<[Æ·žeµÍ÷°�ëi•LðCï¤,Ã;ïo‹Ñ(Íâ2±‚Ôë}È«åÓ«»[{º×[¯å0ù˜”7É�ç�ë š\}M¾§!*älÒ²Ðί÷át2Iü_çäk†µklb÷F¹âÞÇâ]4²b8œ$¦Q™Ä­pàµ@\Ø~-{×'µÿ¥ð_OÛ}~†¾–hÚ%=úŠ�¼Þ—áí(�þÊy9vt¹Ï7ÞÝ;M†ÞÛNïòëû3+±Gˆ�ËYÚ$V³¿Äj6,è ³‹"�$®ª…=ÓÜ´e»"ög›ÆÜ-²%éØ,vQ™}±¶·eKˆ/]M¹'ÉY™ü1MòÈ}³Y‘Úº�yqY¥•{7˜XîÏi–¸cç’ÌÖ-¤ÄÕ¶|:þXù½…i‹"¯©+”ɸøîÜ ùem:e¶ƒ0§yœ SèÏÎV•ÉmV§Ó²Ek¸—ØA¡æÎ–…Q4O³p“/L[ÙºmYš'á†0Ì­‹Â,úXÄî¶Í¶nY‹¦°¾æþ kƒk—¥¶n*GFî9Çi•n Eûîöy –ÅØ*-óÖÍ‘úÛÜš¸8Æ;�Å0ûÞ9Û³}–­v�š)8ok…û®V¸�)OhL×hìõ6Ô{žŽë†´^Ç__âòaòyZ^O3@a öeJ»,¦e”œd·£Ð}¡Ú°E.mTl¿×Ü=_7é7·¤¸Mʰ*ÜÁt.°£r&ïŠñm1IwV²iV%寻{§ÉÐ{Ûé]~}f%öhÉ¢„¹fÈ(IoFî�©aßzη±éGW#g“fÜÛï´Îöüt¶åç^Û±aY°ãnvœ||MÊiy�dÓüfÀ�ÛE¼-,ÏÖ-*®¿%QÕ/¦y ºõ‹ y´Š�ÀZm˜pwŠE—æ±/hY-Nhnƒ¯u}g÷ìÀªÛÉ4kµœXöì&DºÚtN’³2ùc �uÇ�©­[˜—UZEš×Üʉåþœf‰{¡.ÉlÝBíjZ>Šªð{ ËEv6¾¾}YøÚ@àaå;¬|‡•ï°òí˪tXùv±ò9O—‡•ïU¯|Ã2„91»(ÒÉaéÛû¥Ov¾×½ó9ð°óm1*‡�ï°óv>·�ïèä%ƒ¿çñýî‡$‰”ÁE‘ÿލà”n·&÷“›4_üй¸µgˆúÓåÝøºÈ`þœÏ’kØ$»ÞoEuÜ™Â?â}‚ÿÔ#ößÕ¼ü¾é‡'¼�Þ¿ÿC¼¨W¿ÁN}HoÜéÒÀ—�4 ¥;ûmÈÍ;ñ¢Nó|/Ó}ÈÕ "¥€ã=ÐÉefþnþöo:JÀñ¢&t›—®&\øðk(_K.½þ¸3ú}ˆÝ/>Иq!@ujuö •Š¡ò¿wj·Úx¡÷ˆÒ ¡þÛm¨õ+Cë'ð¨BßÁ›$ \*…Ò–�PŽ. 5ƺTë€Që|­¥u)UÊØ0œ BRIÁﯨßuVîžéµ¢&jÔ]ѵû€§Ûœyá8µV³YŠª€kûjÿ/꣙giÔÌ?Úoó|«%ß0SL�)&`�‡?´ÖÞp®êì )î)ð£™`õ;­ß~ÿj]͸ᘠ,€/çÖù��˜ÂFrŠ÷2ŸÚPo¦ñ¢ö—™™5ÝZeû{)ò˗Λ¨WqGyo޽«=$ 8 ÿÖ.;lrZ„<ë܆ íw4híº£ÁCç=I[ëRTw½S‘#Ç:?É‹Üc\ëº9ˆè€ˆJY@äÜ(p<¢¦¨ˆÀ5”ʇ€(´o”æ5 6/ˆ )9 ¢óȤˆH8X’¾r|ЌԔ۬=@ãÐø‡Æ€,@#¦Á‰ÆgD-0íf$<’‚à‚qÉæ)3È,¤enQG«6òžb|Å̺†ùʣܷUÔeÚç€ b|ɨЖ µ6ª>ÃÎH„{¾F¶¸E&KÀ¿ÂÔ¼'#¡�n|¦ ®Ux-÷�¡à;îK ‡!¾€>h ÊÀ·@(Š<ˆú@tÒôŠ%_Eª�!i`�Tpð5Γ]É| �À7Ô°GK ÁKp¥€þŒ– ¹]�ƒ)³¨Š ÐUs I9÷®ÆÅ|i$Ãï> ÂÕÊç   ña^?zö�}·;£�ÏÁ·Ð”ôñ ¸tÖ¾À–»´Í¬Tõ#i9'¶JÌ£Á3RóhÐ69kàqMÏÚ–¶ RÏHÑ•â§KsÑR šV‹W+V7E<“I?@0„K‰RÂú„hp;f„ Ê6"x4L€s5…5  «ËàYˆ`‰„\àjëR Á»Æ§gÕŒ`Ë9Œð+ G£)<2˜ ºÜ‡,†9Š@G ÜÄ%A=) öUí3 Óлj,UM’Ü6 )錋$�"@ƒ)¨Í…¤VÐñ• ÍûlbÃG+(Ó¦+àJ¨ €XA âv€^¯[#¡Ð,ì Að~ŽƒŽÆÑC ¨5œ3 Ž&8xpHºs;ŠÈ@Ô£HP�"PußPØ‚�q%µjLc*"„a¦“æéü)ˆ0ìá6J Éì6«!4ÚÎcä1„ S¶¥‚2ÓBAÆRØü� ý%/0Ù–<Ì\’ˆP 0U¥†½÷qQøÄ(¢FÕpñÜ[û®·à%e­‡$À_),$½¦æ5ƒõߺjÔ VùƒÊAbûÚ�Áä9Õs4x¤~,qµ‚€è^Cõ,ӦЬÄJmµ’ìüµ\KHZ­&K[©'¤9VÔ<Ú竘ʞÂÔÕ�nl)Ân öÔ^Ë8ŒÁ=¨~×øjG<˜Ê5ìE3§#쪇‹’½Ï†ÿ¥ùÊZ!PV¸B¨ –s�ÀŠóŒØÄ �(�X‚àqèh³Pc_ƒ�‚bÝØÕ:§  q_aKb8Kh5¥˜;«b„”ø 1ÄB~Îm}—Û„#�8Ú0¸‚+Ú 6¦EMk•�ºíSãEW•¥šàíjbù,ˆ ¤Ö ->Os\n8—/”óOdøÙ¯¶Ý6r$úþ‡~ ¦ÛÍ[³{÷Ér²ƒ ”ÁÀI †#+±'²dÈ2rùžüI~lO/;ؖcïË®Xi‹¬*’UuŽ’üÂ�¬©:àVÀ~jT?K”éáUÃ?TO`F%«†K¿êP.uEX”Ñ1j;ž¦vV ¢t­ªárŠîaÆ—6ª¥¦VY¡ÚªâVY Þâòs*nŽY­\‘Åá ŠzúV¹…Uê²uCVµ«î�7¿õ#ᅳûßõ£=â΃Õì÷[ˆ÷Ö›çç³Íùjy²þ’ýƒ fû/ñž¼ê÷“Íf¾^Í?œ_mÖ'¤öæËåüiö3÷ˆýÉjµèh¾Xž¼[̹>?�_9-9ÜîÅçËÕzÓnôOüí5á4¡X¿Xž¾þrñnµà±>žÀƒ¥—<9¸~ÿõû·³ÅõòÃÕ×ùùìl¾Ì²<û÷jýéû·õæê)rñz÷ÿŠ�¿!ú”éìUöç_ev éG¨ƒšùs‚ç|È㜃È�4ñ7-4£}÷´ºê¤ã¾�¼á™ßQêî×à{‹Ó½Ž'Íàüa'yécŸœ�æ; ÉSš/´.Ú‹p]%‡‰Žn'ŒiX�‡5‚¢DÞ(òË'ÉõÞ3œ?òÏ¥ kŒ¢^ÑòÖ5Áqø"²�þDpî¨ñÅn$c/Œ÷íN"œCæÂ7…ßpt)Édž¬É�2ß`{­½w¨$Ù“ ·ÍŸèNÌ æ[æ*GšEÉð®<¢JCÕ1ÖãÊL æ­)ŽÏ' ·L3:«4ÑÒñÝ©æK«³ygº…x¦7‡ýìmZx�” -›‘±#ŽW™u¾ˆÁÐu ðÍK À0Ýe!ð²é�{¨ QéO?~Íöús¼`>,N÷F-‘¡†&ž¤yÇo­6¥-i[.6ÀKè=#x)I]- æºîe-2ÖTW:-1äI–dÇW ²¤4ieÙÒÆdkŠH JëÈ(S([h_f³ÕÅåêzyš]��\γ‹ÕiŠîßF|Ý…ä¸]Yk�\CŸ·5® @P8Ö8Ô¹5mµ0ejÜótdá�=B*¾¶ª.­ˆM¢‘½·\œpÐÃÐIY(‰âÛNÕð Q4Äi›ÝÇöï°,à^s×bÛ€¿�†vÅ=-O~IJ¢sCê$Í‚ {­•5ÔDQ¨§¢›º¬+,˜ÀüG:úRù£ÚAwEµ ~©CIç¬ÌÈùõí�Ën¥ �Á†Î1[FÑ Û`“å£Â6êˆÉé¦vS¥±£º™‚<ÉCa•UQÖuƒá�yXû?Ë&'÷6YQj5?@Aü­wk¥bÂø�úîŽ@l%�bŒIL_‚¸l¸YÇ0ÆDq]" ›çò&"v'’ˆ†Ñ„ŽÕ�b–èHˆ2õ914ÑBv:žÇP—ñÞé6CnÞÊCPTµÀ}>„‡ ‚¼ècP?Md14t­^°Øn,2ÇLzG>âÏmDdÛ¸ƒˆ S.²Bf•TË”) HÑŽ�<€�¬ç³³ÍÕŽ‘ìÉŽ‘ìÉŽ‘ìÉ AEÇ@ .ù ›A4mEy Ó¸pLÄÄ×ÉE—¸™2™ngûÆ›‰âÇ®¨‹>¶ç€˜k퀉`ZݱTTEeP%»\ä>Fû\d £h?Zõ#l ]úë)mä"JËp=<f[IÀ�­$P–˜¾„n•ßÏ@”ÒÒ.ìŠÊ›DO‡aDvd Ý‹V”..¥Æd�HÍ v–„Ýùq[«t8½®ñQÑ­Üê¶´Mõ îј¹ÇHȉ´ ±]?&kÃ@×JBO¬¦*#g3í¸Wìÿ@ÿz¹™/w8‡ów8‡ów8‡óŠó u“E‚bÎèeÓTFý[Rð|TW²-R…‰™1 ¨¬GZ]7óC P8“¶�ÀÄ} ÛÂáoU›!èÔn_*0kz�ÿ^6û˜ ›hEŠÁý1Àà�K‚­—én •^`"b¼md*òìHƒ²Âßp‰,MÕ"Leäß 3C™a:Œ*ô¯Ök§nbÛ˺þD;„]»¢4:k+îapeG+9©¡(šÝJÂ)ÿÃ~µíÆ‘Ñ/˜è—6�nñ~y´fÇYyH$y4vKcö2žÃâ³ÝçëõyÕþ4§üùnûã¿VïÓ�òmLyxLQá)} `�¹š!�ºðº¦¡¡ íÅ4ž”z‚tD0êH" ß&“o“Éd2q†}¹Ë�¢$%x·�Lë|20Õ=4£È´‘…ÄGAJaZå4æE9_~Ô#¬&/—ň¼>Yðþºar]U…´W#NSË5<ÂT?—\Šß-hÈ¡|Ò_ÌKè6é¯Gxùþ_æ˜�VIÞÈQAÍÆ8ž×)iQЍ¬ÊÞzHvECÏúd"Ù–ž]îöTgßS¸ïÊÄ œ�Ä7y&#Öi55þûI9FGµÆÓx1™8o`¹ Öì‘rš´,¤ê�£)œÙ§å_§õøëµbhs>ú––D€‚ï¹)NàD˜@`°W7\÷MåÐúñµCÐTO³|lýŒæŒÉ£kÈÑVQ³|¨Žkì§-–~Ý_b%|¹ÈhùÈ2£Xµ…Ö®.µ ­IçƒåVü9¹ßm¼)9•в5vÄ઺}AE $ã"±ƒÖ”ËAâeÓGÑ ›z�iš­Óo|ØÇñp{7°D m,i-ʆ/¿ˆ6 º–Á| ½ç_jJ×ÈA¤ބIÕ¢b=æE­M 1d‰4Êøà HJl‘å‘:Ž­|NXÝâÈÁ1AT^/ºÕææÃæîö²ûø·‹ëîfsÙRû?ŽäþnŸ’Óx't@‡dà rª‚‘¨>t~øQ6Û€4ŸÌÏÝÛ!”椹 ¼[DT ¼_H›LÄÃR„”´ôÖOA7xibeã€Þã§4ƒJ?p6èÁk3í_©øøßP¬)´(›¦Q]F{K ˜@ý�4UÜà1€È¿G&„ÎÉ‘ÆZÉùJ"dDo994Ç‚ÝKÎÝäDaÐ{øv )=#‡l¦ïíMâ5žÌOeÞ{ðÉ>é¡À ÝÓîèl·½º}×=9>~¶ZÝÝœnv<Þ6ÏvÖ䰜༱½î©Ö8WPögYzÔžìŽ~ØìN׫ÍöEðk6Yò ·Æ"Á"PÉË!àutG§ë‹ëW¸ü6vO–Ï^¾Èeóúíf{“>åx Î/7oÖçÏ^Æs˜{¶û|½>¯ª›¨5Ý!dÆqÐEYñCÿáb·[ooO×ï®>î¶ìÝëÏ2„hŽ7›ë½�Ïo/Þ\¯_Ü]]®?¦]j~ÝóO6Û]½ˆÍ+Hô+­óç·—gŸoÞl®ymÎ�aÁm–<ùÍÅ?6Û«ÝÓ:XüžÊ„‹Ä©è¯3¦Œ¶’¾¼ß8Ñý?þÑ?;Ó½êþòWÑ]Bú§S4ÌÁE‡SS�²D"пê´Š¤C›è¶Äа= ´¶ÜÖôœ¡!7¢Pµë4*Q²<&úµÌtA¥õrQ$‘`BÑK¤CÞáÁJ8�™Kø…½”˜'CIô¾+¶QïÆ&-šM| ö”[z­ª e±@Á–zU-íÙ–dgzöØïyÜsXˆÇ”°ô9mkäzoTU‚s~Q Œ» ×GƒH(?hK‘ý$uRk vyÚ^vÑETÁ5QÓd.3Ì�àYÉ2Á£QUÐö`Y#¨H ë%Ž"i²YâÁ¾p@6Ú U(4É„÷¡Ü‘0ØËª¤¤H–‰mÛ]n�Ê'�!»!ˆZhÓ´‡ ¥e™ÀÛã¾£%EOQø8ž–3íB0iÎà¸C`¿4�_•QðJs=‚ÚÁpieûà@Õ“¹¼Åä-´Õ¤–÷Ç� ?ë¤ ÅaƧ豩r4©ƒ7ð¢zÃÙºÌQ15*7ÍÒ¼œg~ìM³‰ì0>Z2=t<òEÝÀ=’±2È]2EðûâÙõÕj}¶º¸Fëx±½ºü~�Aú¿w{uývý´`îw¿0îRY+Îÿ ‚ÆI`-¨ªMB/Áÿ¯¨Àª°Ÿžè§—‶éÍÐkÕTcY0®Ë™z¤\[n-:Ù6£‘L6Ïn›¨›š3·øí¥ ¨ØË_„ÐÇ“!<ªT\âGÇ0݈úéö~z#ö+ªNìÔÚ3² %¼›®+W÷ãÝEqÏÆôl É'Mhz¢ÜÖ\;Ó=µnîqµ< XNDXpP°Xc0+Ú4j:R/RÓh$pË”9·Èà@Ó)¾=”�3 ÍÏÎƹK£#‡´Nñ­¨­ ÃÎËôÉKê èZZj$Ðç4£�C‹ö‚{ÑKz‘!ÇM˜õ@³‘2IÄÈ]Ôp"�–¦6NA”ã.f¯.+êlªJV É�IV‘L”* ”ó 0å05±ä.ñNûD�‰X lh÷L.RÂGA Þ€À¬£™¡Q÷f?�¬Ê{À81'…`˜†H²½Ä‹=+<�@DQ“¤˜Á?ÜÃá�Bb"ê)<6QÁ£�x$�×E @`�a=&bm¤ƒ'ü¥À"ù<ÑÁ.‡ˆk¥ghrÂAÍ8]%ê¼ðeïMäšÑÖª4Âo(׃ñÊ9} üzжI€‚²pb0¤‡Þ¨ì¥óO“Ÿ¨ã'JÕUrÐùP‘Ö…‹••ÌhtD›Ÿ#)‘‚À4‰,uŠfUÊx�ED¥¼�<§i‹š­JŒ)EY„(Ðs/A]šÄTЦ,®àYêàG‰A‘R ç;Æå¨e”dCÆ Š¥3wÈÉû¨Rè~üó„ï7Û7™&È_œ&ô 5'€ àüh¹ôz |š€™K,ÔI੨LƒI,,qUÂåRñ­@‹r+ÖŠx_Ö‹+<K@Q¦'Büù€hß\"›"ÍV�îJU H7UË^ô%ñTBqÚ�"ü=¯WÄ�¾îð“ü¾pß,Q6Eì¤Jà�W¬…¼£h-ëÕ¢Ø5î0“̾ŽåÌWе2j�ÕÿQ’­Ç!i\õåž¾�þ#AŽæ�"q“ÜDÇrQ$ÕÿQ’­/wïŠÖ걫Hôä=ѱœùJþ÷SãnQ¶¿'cœ¨.÷óôdŽmžI?�c?U¿\ôSOQvc¼¸øÙÏC18³ŸF|9÷œÃÁïp/ERÜà—é›`ðÓÜ‹Ezš¡Ùb&w˜=-0&Kš@Iñ \:ú˜õ6a(¦Õ-~r‡ßÓ²œù›gP¢�ާ€Ác4Å!€ej¢à¡^�¹r– !‹I, å57Aà ¡JÈ™C�2;Øh©{�79pZ)|Çê8V §ÖD&§ž¹·¡�Nl§÷"ö—¹²ÊxCWÕAå…Ë_èý)â^ýšÏó²BFz½ù�?“žò›®ð¤›ÓàB�ÊP Mô0Á݉3¡”»YH—„>�ñ@^0æ�|/þ 1E ø”m%‘S6zÏÃB¿�šè©6LØpcÝrÑXúǾ¹QÒøÝä'î«mÇ�ãˆ~ÿa^H@Èíû%yZÒˆ!@ñƒä~[¬¸´"@\‹ý}Ω¾�9k‹ÒêʼníLqººººêÔ9X4KÖëÕ<�ÍC�t~¬Ž\, /´BŠ´J®�,ã"Ž ÖÔá›…ggaÒ¨u“‡ô¦(Û¶jÇA™‘“2f­4 Œ’”ÄIsXvZ ¡jÇ¢X”ü�Ò³q*«,+›´Ì8©—�J8œ—s4ÆhtcÍnvV°c›²EÂ,O^S�ñ;,¨)¡eŽvu6#-TÒ6YéBÍžw¡›�åÍšÃ^‘`$Nb$¢[š‘$>z7 _ZªŒü¤mØ,"[œãUŒ¯ÀEMŠzæ©[fv[�«{j±ŸŸo_Ðç�Y+o•ðììÿ7ýôþðqZOÛ�·ŸÈcõtýa±úBŽj!µ á&“Š0:v ʸh–TÉ)Êh=3­ås?>ï†æ‘õÑLP¤Ð™Sw`t¡[ª?�´�ýÖ#¬‹Ï#Þ¯¶ïVªvûoœüÅ¿îïo�‡»éýÃí݇RníËú�&: êÊ+D ºc1y;ùÐÆ4_OÛ÷%¦TšÐ J‰½Š•…JŸ’1,PŒ¬íQ:r»}º0¯æïÓÕO§Ç7‡ýéáAJ¡]Óyï®_ýX�øó¯§‡cù©Vêìîôîpsý*ß  ·�Ÿ?nF³zcV~¹;K£ùRëßò/r%‡µt?á?Ujñ7uhˆš6 L% �f"n&Î(a1¬’f ˆh£µ”R·štžº›µ޳’ꃒVÄñb�•a¬ïÝ{3µš‡âˆ7;Ëë P‡ôRPWiLv\²�¸`ÇÜqjŴ̧Pâ¥öÚ kœ.;ÃÚËo³žÕžYXv›ìâ¬hYf�HTQµÔ°L‹ˆ¹¸g´õ)ðI²7I噡¦‰C¿˜�&å}œšÄbK“<ö˜CLÝ´–Õ~¬î†Ù3[ £û)a¶ðw«‹à{¨Ue¢sòÚq‡W®ËDí–Ù^Õ†€,ÓÖ}XЦržö´+èäÇo �Úâö>OW7Õ(š�µ@*ÿÝÕ¼nÓMæ®·ÓÂÀÙ„îâäùÿ.v=ÎŒ-´óÐDZöøzqêe^É“uË$Ïï œ‹ÎO½HÉâ\qÏVº¾?ÝOe,çæh3¨ã0@…\Ö˜àIVIÿ„ut¨¶0.˜N”.�‹Xš¡Ì5 üìc¼fæ¥ÚVXÔLÝG' §ºÁÄH:8=öê¬k�¯zÐÃÕâl—L;íþ§K¬¨R�)`ºÙâ ´›�çf˜Ât§Yº±(y!à dÊEéºnÃ�öL‰* +ªì£¸ ÃP´¨Ñ9Î?Ñ�ÉÏütCÝl¿šÙ�¹Ò°ÝQƶYÏv«.ë!õ�zÔÝÑùÙžŸnŒ½/ o/H9Ú,2ˆõª€ƒ#ã Cáþ§†ãƒ­b�ž0ˆã(â�´IH”EZš¡d*9PíñMÆl€þ^ª¡íÄEÕäÐõÞÅ©{1›ªÚNÍP’+ÑŒoj¼ÃËÙ™žŸY¸N2Û^˜YÍðXË}~^˘N+#¸c¡�æ5àQ©TœŠð'l�a³ÀøÆ� ú4'Lv?üÌLu3QXÝÆØåluõé¡ ÇvͰ_õ�ši£z9?×ó“ë¡AµË%¹í…ì�aÙG4²Õ(fT=§¡Dç8,yƒñ¶ ¨Ï–Í–AyA(`°9qn43ÍdØaÂù nxx醺‘ÜN·dÁOšM²…àûFͰ_õ`ši~ñr~¢ï€Ä(žè׿EMlàuÎÅÅç ¡Ž3&¸aC¡ÄÌ)7hB…Ó”ŽÐe _i»nA5f ®ÓnöŽæ¹`÷Ô-m?6{³�ÒY“ä2ª'üiú~Í‚u=ªþU�¼{Zœï{ 0ghh\^8ôœÄˆ4ûÌÍìï=@ŠТè­²è—fBY(ƒr€·à³ªÀÉhÐßÞÙÆÁªºE¡‚ š‹nèÛìWÃÆªÀøj^ÈŒ½ºµ�ºÅ\cé¦u²8Ïw(f ]Ç\}^Çœ1L¼å˜óS«9‹>< ƒpp$D­³¬11SæuaŽX0°­s!ž“ƤJ?™V*…ÝʈIbòZ“á³ÅH7aˆ "0'leÈ]X`g&ÊÒ¤MÐ-Å…¥p�\•á,«¼-ct|›?¢6…8¸ ç-¡®sàÃd³P¨´ ^G9*¡|Àž È4¸J[»¨â$vPÈó¼Ém>y…žWš£ŽrS¸ÍwÃzÌÁÊ,S¤ªå�¨U-PÙõyáb¹ôµEO›€´ñ!¦ Ã�¦Rå9‹r s¥ÏlFúh9�‹³p$O�†þ©µ×ë=ÆLЬ*àæ·äܼ R@C‘óeÛn�‚]9q<“�(mžX™”JL…ÃRðyA†Ë"zgTCæ„4~#c×’ÿËÍÕõÃãö�N÷·Ÿ§¿Áô©Ž‡t/§«·�îßO/¶ÛëýþÓñÍéñ–ß¾œþÊÅó•ÓÕO§Ç7‡ýéáWÌŸ¿î¯Þn?þóûýk§»ëW?Ö:ùù×ÓñüT6þ;tØÝéÝáæúU¾Á Þ>~þx¸ÑÔ¯ðÿáBh¾¶˜"9k’—�ìVN¬ÃXÆ1ÑþlM 1áe2¾xɆHÀSl.4ޱ]œŽS}GAk[MœtA‘Ãr6±ˆ×ò®[�®E ÂoÄÅ-Œ*\YyEitè�ì°œ<ääŒB‘Q‘¡ÄµŽ¦”¤À ·F˜L€v|¨ô„GøH…®¦AWv+A²B˜²¥h„°¬°d™¹oà ¬·!K¡åä¯è`,Ó†t£` @¦à¹*UØ@𢰠��1—˜7ðxe G—Pͬ…j&‡¯ÐeÄ�vM!—HvSÄžgZ®×`‹(‚tTÚ{Œ°»ma/Ñq:XâÓE{Àƒ#¡šñã\áÉ¥€$¾˜+øÊ¹—†M¦ºÉ–¬ÄHàäËð¡¥6¢y&||Ó}þQ$aî\ä*´§Ï¤d/1 ?3»ƒ²KƹfŸjt.ò�Øk¸¶B“Ñt´e ǹ’½|•ƒÁçCØ�ÜI„ÿjv8®»b!RR�,51 &"}?)‘Iâ ʼn#c-G ${ÆRá,¤7˜±°0 ÆM¾#Ú ï±P—Œ�wFOjωòø3Ù°¬abÔ[€�(ô,sß "Þ«Rl6ʸÒZf˜3hOš]±ÙF$A¨È} ^b€\�¼#=Yß�Ùd{Að˜÷ÑÙ€Gɬw€ôœò«!o!¾„˜it`˜ E+ZÄMµb ^´1 €¸•ˆ¶¸\§?èúD$Ë.‹T27f’‡ANô%ÜД!J«çÃÆWßàŸ5ôo0#Y _8€ºÉA˜¦pÊ…�ÆdE§ô H0´ è'#LõН-¦Esø�gïÃà“8öEåЀCNà-¢íLN2Fê Á¨27øESŽ@ãª,c Ÿh‹åÔ£üÊl° +�‘&¤Âa…¦° É U!i‹Àž9$QpP+b°˜(u�Óe�ò>–ʦð*p(…Þ…öȹ}v…#iÒèE¿U·À ëÎ{_ÿV+ÊÏm¬ W˱¦�¯©)ÿG}¹ìÄuaø x‡³±dÈ}¿,MdEN9r‚)Š�FŽ#< Jüöùþê336 aÀÉ‚ ÌéÓ}ºººê¿$ ‘5 ö0iæe =u¤¸­ ±­D`@7Q@n2¢)nY�=ÍqSkh�è€~)‰Ñ(�‰+ä@Û–nÛøppžÄ©Ö¥(?2mð“ÝÐ.»…ÜœTQÏ 6yïwѱ¸\ÊWÛ—ûÞãcƒ¨2"�Xg–.à/² Q>Üz(âØ\¿[×&fc¾Ù£{ƒÁ lLÍN<çší¹$�ACÓÏ)fum^eM¤ D;Az*£¼(’(zÇX§ÆñŽÃe‘³Ä‰7’õ´¶7 ÔTÐjÙ$�¬)MgÆôÖQCéÙ�Y”m08 ®x1l+䦒ªnu…Sðì›´”Ò›n$îÁb#¸›‚U˜ð{Ö\Hq( `KEaTú¡Ä´r+‘k@ÀMFˆJ®¾‡0Jg99Rþ÷ –“ê &€gñ´¬Xê~Öj×C•S2)×HËÕ4| WØ…Jx.9î¶«aafov/´ÛR2½jrÜ.Ø;î.�Ò-A‹«˜†j¸!¨Æîjü¤ÆýîﱄðÝ7kF5ºTÂÛ™ÊÙZ´©æÍ Ô¹žÄë §le#¢.>ª]H”ZAå&•ß„×܇](ÝW�$zq£™-o~PZ¤ ¤øH,ˆ˜ªx¶!é4ó&(‚ŒÉ:è1b?]¹e5€"º}-êÐ^MY[i^RN,n¢|·½é~Þ×ê$,UfÛ—òa,¯\±ò~x”ãÖò@É ±Úбwa·=²åëÅÅ=/ó±aGÐi6.¥Ï^þC-þA€à¬Oä*‚ _õ1U$é cpéŽ&íe ˆ5"CÕìÏíÊ d,IÁw „Lß øxíƒÁfV3…ª&vúÏ.ÙA&a&~TJD²J¿TêÎC^P‰^p/>V)á #&À"‰ª“¨ô]„G])Aü8áX™´4hióÈÈ�sàÝõ|=Xaô,��zMNÂ_¥M–‡ør]O ¾7u. <î2;Y…  $\ÔDXôX·vŒÿ¦ÍÉB§H£Ld QºÙÉMµÛ ü›‹yê³Ëâ”m\Ì¡å1A “WÀ�ênÛªçiÁ:X[±7[: !°@ŸxS»…kþ§)OH\ªw"…×°Ñ׋Œû_ác‹+JûùùÞj‚!\ѡԊ,“ c=$ÜÎ*$©¹ˆÍÛ–óOµ½³;^Øê´^½y^m0<ÃÜ¡”h‡“–ݯœëõäx¹‚îÔ »Ô×ÿ%´ÀóåÙô/Ñîéh¯Ï7v´ý4~zö’>yúü¥�?¾¹¼\\,_/Þ½ÿxya`úó§óÅø¾›žž��~1óÅòÍÛÓÅ·WïOǬpós/þ>?»¸Ü|È]Eõ„‰îøÅòä§OÞž�Ús:>$‚å<òôû«w‹Óé`zuñfùn±ª¹�j¯8îú?þdè¯)M?L¿þæ¦Fy½#܃ñAŽÖâUª«4H• Aùµ ÂÉé�@k3t`Óófúz`õE毇ÒÐëPSY ìÖ¿€¸kïÖ΋¯GlçæÃþ±ëbÜŸ'x)¦„TU²(Å·–)C še0g{ Ô6H³äœ; 9!µ 0�#†-ÿFÎwtÆ]1ý#ÀhžŽ endstream endobj 229 0 obj << /Filter [/FlateDecode] /Length 18721 >> stream H‰ÔWÛnÇý‚ù‡y@ÞQWß;~âRˆ!ÀNÉBôFPKJ!"’±¬¿Ï9ÕÝ3“]&¦./6!ïLMWwUuÕ©SyŠ>…ñù«ëË�¿^în~ž]Œ'çg/~¸¼º¹¾Ûÿöþþá¶~:ÄןƓ³«ûw×g/ËÅÙÃþõþóÇë‹7»ýÍýÝåÃç¶ ÿ3ÊøöjؾÃSýÛþs°ãÉ›»»ËÛë«ñC;ctî´-üÕßúÿíèn·CONÇ·ÿ>á¯5ãÛÏx±e*ÖåñvØHžÄ„<‹6ÎNÙ…2J˜¤¸´6v*bEÆÝ°’Éd¿}›� ¢cúÃnÐ/Ñu�jÆEsyŸwï¢nAß¡›¸Ø¾òå—ƒ É#A›OÇ�™Œïýh&—DœgØ&/9åãP:? þSÁ¦¿l²‘8™âí˜- ®`ñíð¾FþÓðB>$Dœ¤‡-`h‰`g³Œÿj nBÒ„�®½#!kXÌ”³)+A‹ÓùÐEˆ“ qj;À ˜zœôé÷Ì�)Ï¢�j‡E{¬NXÉšó>ÕÌnþùðWü…º[ZÙ„óuãÜdrËÉ!¬%«³š !µü8ïá¯êO:ô[X¾©r\”ûû:\³¨YÑ÷ �ÕðóæÀ/¸ÉÞ o4ŸP޽”ŽÏ.d<û7~ œvqtêíJØM;4}qk‡ÕG^Çå(xªwäõT¿¸píõQHŽ Ækéìîþn´.ZõÛŒ*™).¨‚²²V"®bÊÅÇ,è"A¥EAn‡ÉGŸ=}‰(Ø(SqgÁNSdzZc ׯe—.è'A©‹`xHÞÚqÞf“¦,ÑËrÖ,�^7hYÕm^v:tl÷¤ñÿŸaIc+¨ô€ŠEq9+Ÿˆy~* w^…j9X†0NÎø¤U7Ë<°–Ap,§¾hXücX x„ƒ&­¥É§¼Þg´ÃvÃJ†ØÕ‚�7*8¶Èê´& ÚlÒ¼h¶zÞèзo9z 0·…¼¿ ä(3Xò˜p€p 9í0È�1N)†èZˆUãS ÂÜ›ñí…‰œrèt]PC•ƒ‰«5eâm¯vi‚~•šÈ£ìƒO㼋eb»ÕI]P£«Ö,kš½Ë.>}{h±5j/ÔÐö†MÕe†Öûɺ°ÎfôL¯IäqÎ"²³„…kA%’BRM“Œƒ 6·¼ƒ[Lt RKFgË&+Q;i7¬e4 AhÙ8…Ìí'õ÷Ý0ÓE‹m‹C�¾=®a²Q|©qí/¤ kH=’Õ£Ö ±ây¨æä# À –s»HÊ„ÖbÁ¦R,ù[™l™€À•ÌžÑ rÖ”šEðÏâr—]fA;H/f–›ÀMú&B¦ã烺`7ÌÆtÑÚÝåУï€ÄÈœ$±!q{aŒÑOŒUXàuº5* Û¼-(%v˜hIÞ%vÐþWP­ø$•+£ñjÅͤb!âÒçy\ó™É7ï4Kúy¬ó.�S*¹ì„OQAf>¯K 7[5¯š-Ÿw:òï{ ¯O–޾õ… Å#^(<Ìýï†4 Q+ALÑ᥋�Æ",» ò†ÙÁ®\�öÓßYÆÑ™g‰A+ô-fÁ|ÌnXdÌ ëÆ¾ Y1Ú”ŸšHæfË,šío›ùó’ý@·çM*}$8¦r€™bÖ0lÈ^@ø«Å3Ê‚n©)“ÑBظVª@ì¦À&c3Xcª©ç8%œVg‘¬¢€)k„ {[‘T‚Ô!B‡Æ [*º˜Ž[E÷‚FŠ%ð– Z+—ÉT‰ÞP@ÜŠÛ°:ÃØ]Žit[6[(!³K! �_Þ,|ó�ð.I�Å<øÎªÐ @P("tÕÂö1×FO,C§úè-Þ"¦Ð’$éeáz„ï–)Y¢Ó^f8;Õ ‘®!9!"BCe½÷�CYÛˆdãCÊ Ñ4Ñ‹òÛ’#g¹Zj®àÞ·|ÀÝ9& Ÿ0ÚÇtn8à ÆœÐXMÄåoIºyd€–t£ä§»½Uø*™í™lÄÈc‡fc2Cá¡ê"–WpxšÅð‚t(l’6LÚi`qËúgÏÏö/nvû›û»Ë‡Ïã_ :A¨S ÎúÓñùëýÃÍ݇ñd»=Ûí>ݾºß_ríéø#•ךãó¿Ýï_]ïî®pÅüüeøüÕõåÇ_/qÞïÐOÎÏ^þÜòä·÷÷·õS=ø'ŒaW÷ï®/Î^– xðzÿùãõÅbM[…s*Ð~iÁŠÆ¬O¼De¿ÀÅytf¸ êNÀ`%¦JÔ´ƒñ’-o ˜gX]¨ë²ÓQÖ³±Ÿc£ˆ© ‰Ø"ƒ!5†À%¾—LÈÖwñ¬}Tºè„ˆ}‘ž€Qç”A0¤�u”#;¯ËæÐgÉ• #;t�á"ÉÖŒTø@Þ6¾‘M€pˆ|бz¨ð‘+‰‰Ô¦@L \ÄÆU *‚Á²S"³�Êqà¾. ïbÑ<+%êoö… 5Dù2Ç@­ÜPQJJÁ¢b4£31l ñÚ6²YDÉföX…¡‰°AŠ�xÏ-pg |:ÖðEä@8  ôj[ùKòìŽð|xÚÙ0áD¨¦ýð+>ª DŠAËßc•÷;žj6¹êTP¶@à6ùcôÍ�d¿=¾ê>ÿŒ ’Ùh9Q Õ IùKJp˜�¹Ïf&9I NÉsp�Èk«DEG™öf϶R‚®*Ñb¹ËP¾��@ï $Ê€…ŽëF=s´Iu’”ŠG˜êȉ)5Ñáè“3¹$ž„#ÒгÓÐ@ÒZ¨z±Êx·' ¤ÊoÀ�ËwªÓÞS¥.¡ï´žäž7 ð…À†Òa�‹éÄøHÚ?"÷Õ ‚©É†ÅnEçñê-JŽãIX¥ ‡M:Ô±�I”n:qµ†”l‘ÄI+&OÊ—Hȼ)@ˆ fœ4¶ÁÓ‹Ž3Çêr1‚y’IAeŠ3–£³?û¨Ê©ðIgˆý:çU¼‹ñqMCàPUŸ9©æS­íÆÈ›T 7óG"œHŒ˜oÇ�/¾Ê?|È�GÖÚØ€òå•� çR‰iÊNG–˜p—œÆP‹ °l)5q#Tk ó•ŠA´¦ºF ¼«‚’Á_t̳%k?iÍ=˲,S�ËŸPÖ€%âÀýØþP¿Ö°n@;œF¾@œSjÌ®ŒÓ¬ã@ƒ–Eú¢8…guÌ#7ƒ¢$–Fz8æ¥ê™ ÔìfÙT\T¶ÉÝ•þ¨ß¡øÊ•D?Æñkç—ì”ð†àÚ´ß&EúùÉ9ðp¶’àLnH² (€`ë‰%5˜-5ü ‹ ÝÑÿ²�˜x² 1�:!s&õ�(Aq:ÖqÎà-^™9©6L‡ÊŸvî¶ö(«ðáHk“9P“€_ÑøŠ@ÁTó$‹³!9*‰,@ëEä)4§ý‡ú²Û­ã¶¢ðèæ&€]`”á?‰^En¤uЮ�Ea8’�¨±åÀ±Ñæíó­MΙó£À²Óµ.tÎð�ÃÍ͵×^+åü»ṀÞâ§F"tÌ€‚b ­37Ñl‘g CV„ ¦g5Û”{£·ª‡LÌÎ<:£z‘¦° mÌN<§ÒŸsTÄ=–—ç’*Š2/^±Qö¶ô.ðE9õ¸îG8‰D¹Ô‰ ‘xI"ENBn#é“þC›ªV±QBYSª%Ši+»&>`¤%×g…,¯š_bÀ˜ ¦�§ŠBíuÉœÁïé­ ýM'‰ûhÍ}–ä Š’Ÿ4×yìs…ÖbV…zÈ!®¦%p ˆ+ØJ$³z]1�T’¨™„8©©&íž4×äDÕ¥3oMítivThÜS*�z+ƒ!¸=Þ°0HÉtÇ»ö4~ ÈDoO,Òw§ ¹ÿŒ�W…cx%.î,ä€ÖÍd«¢�°”ô€÷’0lK ÿ�ñaW÷©qƒ˜OaM±µº¤áH2–¤ûΔœu*‰± µhµ\ÔŸÖÕ&ƒŠR…ËöÚX3™Š€ô½ÄhHEžn¤VoSr—l­F­:¬&(ÒìºfˆÍx““Ý@C „�² 4»T[µ }5x¸I}ÆèŒ�¼´.+øBˆF’ðWÖù5Pt0�ãeÇ4à›ä²{1y¥Õ`‚åÌ"u¾9NâG ŠEٶ擬5µ"Ú°”{Íh¡D‰¨U$ºPj¯,ç´–˜{Þœ³nTNUDVC4�^ÑŠHwó&h�D»Ÿ[uÜÑ]«=GÍ‹[ɪÐVŒ1ˆ-W' §njü~{Sûü^Ê"a ˜™½s)/ÆôÊ^+~³»“{Æ­å~ñZîk°ïãn' YÓï×x™Ÿwx�f³'�j r „ðJ„°äLýÊNH×÷:VùÑt$0¬wKpTÉ.#FÌ“0TÄ!z^ >E]¨ïðéå.*@Ù›¡gÔäͦ¢ £Šx°»¤…fâGÏGžD¸„Km‚{ 3�D«d: wjÅ‚Rß0bÊÌb� œDå IT{$‡Gsx„Æ"Þ€+£ÖÂf"-m.%Iè8_-.ù1áqÿ•6yâ÷(=û¸VU¹p¿ËÄG%1qt¢77+ÇPêPå$AÍ>È<æÎ¹É`Á&L#ØgŸ,¦Ÿ7¹+J�›ç.k6M Ò¨x)ˆ{íªŠ§\¼¶„i)â;–-\~”¾ˆ.è⾡šéa3ÑS·Åò^’pÚ‚FôûõŇßÞ§Æï@õ?�­Œ,(Þ’“ú¯ƒ'£Øb7$ÊN¥h€žælËñUôël«ãnõö¼nÐ�ÂãæS‹Óî5”jÍ¡eûzyvüãóX~rˆß,áòÐ>·EŒâa¾QGBpDìC?¶+9 G”�éN@içO6F¦ C6GäSõy?9C1.N”fMÖ"–°NfÕJÀ¢áß\] ¥$s8úûÇo}ñ¡[Ûê¤ÒWíîÊïÙ™ßÇ�}\í õÙó;€´7x(Q„&-û08ÖGê³ç·wSÐ{åÇ}ðõ?¢Jà‹Û×·0vOÏÎÚ¸±gwŸÆMŸM�<øâkþöâíÛë7·O®¿¿ùùí#Ó¿ÿòÓuÿ2}~ñúõ˃™_Þ¾øîåõWïn®®î³üéë¾üÏO¯ß¼Ý^d�®Q}ÆÄåù—·WOyõÝë—öŸ_ÁíyðäéÓ‡PÙÒ©ì¯È×Z$ëºÃ!Ýè š�—p%€”*%š[‡pˆ!Jáp…†!æF„Çn@Þ†¹¾ìM)‡ïØ=�m´d éõEÎm¼CÛl³tße¡ì欱î^r|óÝþö›ÇϾþø}pyóæ8ùç§?Ú½-Â?îÝ–TÄâ‡W£=*O4ó‚VX‡kšª¦«ÐWÅÄ ÚÏ™[‹QZá¼e]Ÿ¸K„~c.ÿqÞÎ�¥öZ6=˳–—3>:Û ñ>\Ý›Íqš.Bo³œkCÿ#l!3žBÕãá�ê1ɲkÉaï ¨a‡]Ú›…z©ÒFT2/èÆ5"~L×Ôj‡@ÙõV§ZFÐ}l…Éã3ÝVè#ôvÛµ0]oT¾:èöÃyt ‚þ­ÊVNÃQLÒóúTîm˜MTÇ,´WµíéË›Ëë§—/^¢±¾zssõ—ëA4ÿÿŒñôò‡›—W—?\ßRõóôäõÏ/Ä ï:}Ü“¬OârdmÒ@<2�îáÛUJB;—rãw иÃyuâüÇ¢5âÏ+©”*ætޔř˜ÀŒV A\i@ÔAË*rTsL´&  üxö€¾®Ï—‚¾«©ùÝŒzîc…wxkˆ�’hZBÇg „Z†ŒcR1_¦2Q ö‰ ~¢qÉ[Ù \7¢ÛóÁœudB2¹9—ÒOÜ(ð’;c!�VðUŽ�îˆFa ÊVùΚú‰ŠNÄÊ�1™ $¦s>j£¤PX¤ÏÖ=¢v˜cs�•#`ÑÕ^�5ÉÑjÇjÖ¢ð½**Ï=̨�¯ÅëÖÒ“ÇPA­iq6Ç'Ù;ºVÔ^"Ò°Ä7;’î¼ÛÜ–rç÷¢åó\–Ò•Çâ`aÂ縮)p ÁÆ f@Š“pä^ k K؃ñG3�\’ÈW ^c› ¾’}ãy±Éýû¼ý8VÏÛò±Å¼¿ÇˆcÞ¡Î[¬ã<rà>²m‡ž÷O­´Ì[^FêæýÜ�ôλüŽ ˜÷oÀn©#ŒöôÙUÎÛ]ŽÛžw×½BbÞÃÄŠ›y΀ּaËðׯ—VjsˆnL�ë JPT2låÉ6λˆÇ\ë#àZV4¦µ°ò8(¶´—£Uß¼_~Áˆå¤Šçý2¶ROû³Ì;:°ìË@ìq†ñJŠ6Ö‰¥3OOì9Í;­üµ›³2ܼ£8£Áœf: G.`é�‚742 [ ã’Dk‡ °5„Çvl¿X—6Ú^Y}<â5…üÖÖ­�Jøúcu«ŒÝ&ÆêæÌF$Š5„´«…rp NM¡„íÔÊK±9=/J]ó~/uÊn [2ÉrãNÈ4z©–m»$•¦n2¹¼Þ$åFíØe‹19bòu`稖ìmNN® dÅÒÉodž¶‘ÑzÞ j(Ž[�­´>JÌö1ZÌœCv[�©šê²++Á®SXk/LGå™zãHn¿†{£Î{Ç%H¿R�ë J5g'Ëj ‡¤’lŽOÕ Ú8F-Xu¤j‹Ä_y%07Õ´2\ïìºö�Ö $­ ªädFâÁ…® V„'ÓÉŽnðrËÓ!s—i�Õ÷ ? }2�-ßb|{Ë(±<ˆ“l{®òÄâKy:èL)÷ô–�GóŠvJX<[w‹]Ï�…fMÑ÷=€aí²N=×±wÐ<ôÂ®Éæž¥ƒ>|ܨO{ùq»?Ö+eoŒ}¬*ŽeÇ©29/GâæTþ+¤•¡Wê=UYÇB¬ssJ-÷œ¶�EÅd´\Ú�{’®æ2íÑJ y“‹Æ;n7`¼äýNou¥}Iº²ÛJn+ý­ì·2äF�+‰®ºrì!÷§GGBûñÙÅwgËPè?œ¹éÁ³ÛÛ¯®¯¦ïß¼¸º¹Æ+¸ØòîÄgç�éG„[¼þ¿øþ,&Ìãð<óú0Wü¹WaWÈC^¯0Tl|�[øÃ;Å}ƒ.Ö-\Ç"ª®Ã—ЬØ�ã¥k-yré�^îœ~§FGB‚y0í|o*žod!œç%µAÜYšo´�ÄÝóºjï¥xe�dQ ÅŪ~[ýJzÕîÖqÑ'¸ï°ØE©,?w·ýe)n‘B…‹¤F … KŠíº2©ß¾çÌ�\^®T·’èr9äpæÌ™3Ú-å¿4¿þ>GCqžPªKó©k—…ü#¸|šs'®ÞIÅ3&äõcÐöçÈ3l(~ý}.ýħÐîˆ)j;± ) ƹ0ÎIlüitÚÛÐø“Ö}Ò÷¹1I©-"þX�Uç¬_+r‹6¥¥?²o¡¢Gº�Z‡ïIú‰cEžïÊ'£›Ã ÆÚ>,«W.HªQôNœ ˆ·¢ŒR⦿G)ðq!É·ñ"¬HµY“8¥nm'ÉÉq¤žbÔ£ózÏB12³HYA# ÍÖ–˜°(U=MÁ§S„ùT!,w…¨¨”‹7Á¹ ª³tß…¡)–’¸Ù%I%y¯¿K-J·¬¥Èbë‹Ù&éÂ% k¹“Ò,;„Èn�©ÒOܰ²J’ÉÏו ¶^VHUüP˜Ši'ë¬dF²+\Wˆ0ó`ÕÊ”…M „+Ù ×V.–_ç»DGÅ{µýŠ ®(ææÀ…)–½¸(Å'Aª/0|dÔ¶*�äÜãü²†%ÏF©‰œ‘à†5˜¦�¾RÃäš™>‡¦Ë±Ù€Àt(1=ŠÌh¦ƒ¢é¡j¶h6=àM_ÊÃÎ6Ecúº2}á™mmš¾|M_ßæ€œ’„l!3 ‰[ºžòL&“Ùk™ÒPÙUù•ªÌ†Ì´mO+Ý™–ƒÜÜP¦²iY5ª”(¬;Îyb-ŒlZºÎ_³¹©öù ÓÞ‘ý0«#ÙU³úªÏ1í{ò“Mûf‰ŠYÃ’CgÚØåøš5ÀmO,)XÛ¦_røšÞjãªjû­�hztÅ�Y�“¡eVleü™€�t]Ù—|@š3cÌ׌êC� öнØh˜ZV¦­«\{¦->©NÓ°i*8×øº‡,0…,˘øB�v«|R^¥³á¥F(*y‰@+»Èo!M«Þ€`iE© håªH«ª–`ô‹K­òUÄŠ.¢D`-‘= t“9ýO˜ ¾oUw‚æÆÑ"ÉO\;YOiÈ9iŽ‚ç¤ú‘s 'G!m N>¯±VðnLYwÑÉ+BÛl®ÙÅlÄEß9õ)œ* +›=“sJi΀ׂÑ:)œŠñD/ ‰�ÇÊ8±f�ΑC%Á#ëRþH)W’ËÛg›ˆzÀ첂�v.çê†#K›ƒ(Ïô º'¸]’‹uјNnÊE €8�|˜ƒ$KªŠy™ÃºPŒ¯ß²ùj�ïh¯Èެ~dW«§ù9íkò›ë“KXjTJìÚÐñ4Ï_ZGi†9¾júš§œMI¦Óâ—|÷�h‘QSv\mÀ×`O:ùuOÁp�pÁys5Îr®Öþ ¾\jô’èðõCoÄsgJ„z.nž­�åfzWç«P¬¾Ëó’Õ�j÷üM|ºØæ,ä OSŸÇmª{4ôpÙ"ªÃœ`r®�Ü¢V‡G`wÀoj¢¯—bY+JOs[vùúZš‡Å; ‡îÔŸCØð„DGÎXÔ©ÕãÝP"]IIÎÌ%ùÊM_Æ|z_ � �nj8’ˆHnÝAÄL±!_‚jñ- ꤳ䥂ÊÂé· ïh׿P`oÚ‚0R?/v?ï~÷v÷v7"cïnvixñrx÷�íÂÉ¥^}ÁÿF4ª“Ëšå»õGŸæƒ,7º¦I‡²ƒHÅ¢rô¾h³)—¾œº‚º0«Gs'âŽOΠEÏ+¿ÁEÜÚòÔ–Äz¢‹ÎÓù·!n1ÚÒû¦<®m+Ù4›§2³íZ›¶öžh�}-Óí›æ»íÏ}WÃm·ß‚^5;u±U �RÂßë™­æé•‘ZjvMMoI¿)ùߨ>±ÛªÃV<”¼SCîØð -èG�¦àµÙÏ”¶l™Ë¯ãÔ ëöÌ,f}”7‰è›€<©o}#é{M&•®#õ-«Åà*ýÅ«ýý^ñ+(Œ8od.t :=æ”) £ß‰N=�?�g9¨-˜b@¼“Ÿ9w`Á4oSÀ2‹-étÂT;˘̘Ù|ÔʲcˆÃrºŒÁÓ‚+n´\ Ñëèfý’¸�,pŠB+â’ÇCô“Èñн)À18–LœX-®O:6òYóÌ‹,Ÿã¤ÚâÈ#c@v¤µO‹ \ V~/vZØËùÀ9 fYU–[|˜Eâ�3…’„@©ÏNqšyQ�a 0WrOd M‰‚ñ25 Xñ2Êá�Ñ¡�2ùx’€!²¹­ü–�«Í¬ªÖ�Qœsqžuz……#‘®È^}K§‹‘SJApºcYœð¦ > Pm gù•)ÜÌÐÔÓ5Æ¢àñ¨‘ ¥ÜÄ–}š'1²‹Óé5xFJÃ�^ˇœ3AQç3¾OD,Òä4¢:èÀSÆ%²æB¸(ÿ²ËrA$-õIv]¸¦J^|Œëjו=Î�Q=¦”!î˜"¢~šr°°ðÖ9–b¥c3t  óȉ{PÏ›•Â'8˜†Úüé2é¸Ã}6 [•}<+Œ.ŸE|µúQÁЫ°¨\w!Î&­{­ÍEª!×5z‰°2뽦:S 2æÜ�>ã|ñ™®ÉH:Ïio�? Êôv‡²Ï@Ÿ�hášæ v¯ ™ì¶ >¨‹D»4Hî–wÔ#©·èµd*šÁ•%»–}u³®ØyQ:ÃP–§O´{¾l]CR›ßǤŒBC�·|¨Äb¸§ð¯p´iI:¹©L^¸ÞT²/ Á”Žp½S䥠X,f‡&\3yà �Q^•¿7Ÿó < I0º¾s½;{Ï&õv¿¿º»½><\Ý|ºÝ?ÓK^cI §›4�: †Á.àP;Pï—ÿž}à€”’tÆÀ‘/ °YøÁ’(g°:TxiK�Zß»;N žtc:îÌÔ?e‰tD‹¢ƒ??Hg8»>öÒ³ÿíÒ ¬‚|#ÑT%§¬3Üù3:øÙž“Ëï^=<~ÿéúñÓýþêáÛð™v¾ûá{ñê p÷åþëþføåãÕ—Ûáîþæöåð{ìú#þݹ>ŒMß¶ÓÓA%æ³EUâse‚Êàç U²Ï– 2C=[,Àê¹³#ƒ  Ï– ÙꙢ>_6Àèá fÏ–’°ç‹‡“Ë£äÃÉåQâäò �§)"þce«í(!Ã㤠�¬ñ£ä �jv„¤ áQ¢‚†GÉ %Íc„…^ù|i¡vLj m0Ï‘´8F`œ\îÿïV …òj¿­$ýñ7º¯]�ô»z|¼}ØÿxûáÓ/�WÜö÷o_ò©¸ûìþþóÁÎ×û«÷ŸoÿüõÓÍí/ºËm�{ýŸ/÷�ëAâÞRº6ŸrùzóÓ·»÷÷Ÿåw¸<ƒû¼òâ§ë�Ÿ>ß\¼Åc3¼y¸Ú¸}¹ûŠÆáÍn<ÔÁÿÆÒ¯Cþ:üó_ãpƒÕw?îÐQgÈ Àä@êP˜�À¨   ùb'u™KÝìqifíPþÏ¥üµìÆ’œá„ÖåÌ ÑÌ.€Çõf9Ë%t¾DxÔï”`Ùµr UVsN¹Í4×gLëUþlZçó1Õ¿‹ ­+qð!ª®]ìŠ;ÕÁ‹Ýá1#]8¼�«+Å%.lâ}O„¡ SùÜ|Íg¬GdÖk² ÿå¼Úvë8ŽàœØ¦�9šû%yҡö0‚"i‰±H 4…Dÿ–·üXª»gvgwö!±™g{gvº«««{øO(�·âRÒLÃe�EÚ–v˜]Ø£´À·é’nº’ðôa÷r`l>Ÿ¨­c´Áíí%ÑX¢'*~‹³†Û�ƒJ~Tòc9\†; ×*ÐT^gë/‡(8L µ  ¡6XoKD›F¬×3ýZS­1%¡ �2pƒÑD#XÔEz ·E#H&)¿<@ˆ³ö‰ù Iµaºü0\ b±,�è!ýOL‰‡j+ÉGI&3é`ü¦(#‚âå΋)GšKÛG9éVdœä“™ì�jþ1}¤ýÔ °�â²<0H¤¼ˆ£W ¦ c¤»×ËÛö�Õ'øœù˜æË⊦Å_ŽÊæ© ªâÒEΰLü'‡ÆÒtiI†`Ô%Œ½â³«£KN)ãy¸¯yoñ.äÐSÃ…°z]-©–ùº•À²r…©£wÕ’ãž)³PGµ· €ª}cAY5î,©&ƒ¤K¾Ô�S5æ]�äP=wÔ·ÔÕHTµCgµÃzµSj§†ÔN©©uEV÷V…;£ß•wê©R©Q*TãU'(jGw:]º<ü*úšM‰5FTMÂFËC)±v6™ûp:nqÍÉÈ1'¨½ÏjÁ°ý ùu[/PÏlý¬d„›�'[š³ÊïúWÕ�î í åœæEï�¼ì}®_hN].àܨC”bâ2ž_TdúÝ‚ËpÂÊ Q"zgËâi;{‰f ¹‚±ƒÓœ#è;©Y%Ж.µ€±ÃaÊò÷—Ë·yy,¼=Ä:mš_}æéö5M¯ÏýB…m»·¨Á4@ Û˜†$�]�©$Ç8\%FÈÅrÃ2ŽÇíðŽŒ[zÒ�e`±\ÒJR,4’ÏÐ\š;`"¿U j†™†¤àmIÓœ ¨2T˜5e"L”K¹•Ñ‚¨W Ѓ+:ößQ-‰ÝqjÇ«¥Îù¦.FµÅ T‡ØüZ6¸fÛâ/ÇÑàÑñh•͸&¥jøuÜU=y+ªãø\|ÏÚ»\¥ó 5›�C=èh0„` &›`½ïVp1—øfUh*UÅ™è2Ë£ ‰BÖô·À#Û NÓ…ð§jlp6ò|ÝíouöXU\Bõc :ÝüîSOÿÛ©©dT°ñ´Õckp�N­Ä·[@ü:öÁ^iD�7Z#Ò½Q2zCG¶o4‡ŒƒêÀø{t‡eúÿUñ¨=¬í[õ�qä?· ã¨A0Ž¥Ç-h«CgW;JtvµSõgW;jtvµ£GsT$é�³&QÖFU‚uG—`ÝQ&NÜŽ—{ê$�|«Od݃iO£È:ª”XÇ<í)UÇÓN«:JwjÕ±_­é?*V_LC‹/u=»zùêéùõýÍóý§Ç맯Óy}ùôì›Wß÷·ëçç»§ÇïïÞßÿöütMË~üúùî|úgîåéÓ§�«•o¯ß}¼ûöËýíÝo²ÊŽŸ{ó¯ÏŸžž—ý ÿ¥©ê«7�·?|}x÷é#?û«Î1æ)‚.[ÞdfD‰müfÒP© �ìD´J$¾Bµ2ó,\¡=DFˆ%‘Ó¢§+f+üG|@µgÍ‹å·Z^ÖÝjÙ^�PýÕµ8"žªÅÕ <è†5‡¬ú˜µÀR¡S=v_µ\3 ºp–TŸ¦šI5§²æZÍÉn„P#kÔB›J,µ0‹Ù×~ á,ªÞ×åÞÖ¤\‰hÕiF�ƒ×!+¦ºG?Ø_7upYÙf­+®=Áb.>”§c˺†U_Ä\è«U¬�-ƒPölˆb°ª8ñJdEd'³¥×%5 S®¶¢)›š¥�ØáJª| $qˆ¤HHU„e<€0ïœ.b³3 KðI“+…‰°8#V¬ŒSôöŒk !ŸÍl¡O8Vöú :ǹ؟ÒnÊâ ¹ËUÝe—V,é7]âŽ<äÅ !Wj1rm0¥ûXfì ‹'ºK‚(Jbš“8qš½¯iF‰HAgÃÍ� ãÊjM,¾4N9=ÛT�‰'ÅT:¡$þº©WR'µÉ§øEÎóJ‘Sà5M³©ŽÊª ¤ŒZÑÅiS—Eú…÷}ñŠ­É˜\»Nl5å§•PP‹Á¦•˜Ä‰å†ÈÉr3wM© Í;�é¤�ÈVæV–™ù,l)K7�µ»³– 9JUH#ŽÐiUCóÔ(&BËס¡¯j 0Öz�§NË;™7Ô£YȳPMUd< £u–°=#ŸÓ<’°ƒÎH �1‰Á º9¦"-‹Z ©7 dBEÊGf§fq(¥1jF¶�À0Ð)NcoÝtßmwø¶Ço‡€¦Ô¯6£ÄvÖÇ‘íIJiÆ©§‰sÓæ&ÍMsÇáj;m4!Ÿ«l¤8X�CšÇ<ÒŒš•*)ÙÅyHdÅÑmhdA’©“õˆ5+—iQá¦jUÔšê5Ñk¸èbÓÎ&�M[7â[/¶ãõåáôî ë`~ú@·‘·��×w·Óû§ëÛû;ÜJ>Ÿpñè3ô#€t'°ã˜s@™É`ßþzð@ÓY1¨ö ²¶ù¨£ ¨€{†ôž¿àüÓ ·„¸(ÐÇé¶7QéH�FŽƒüÀ&ìýµ†Pg,¾"NºÂ60Ñ>KObÿ#ë¶;B=p²Æéã(̈úC6ƒ4_Ê!%ǹT›�A}]PCá #Ñ-ÑPIjŸ²Œ•ÅùÚRÜò|A=%óÕL �ÜL)DZ:/K›J'_p[ FÚ dEúJHuâB¤ÜVœ�Ÿ/ˆû.×£®¨½ Ït. 9_#F…]PSIAKÌ©P»#.NEº ­A ¶�-â €ÚKO1²"ºh¥§ g¡â]¦Q”~$q�ßnÑ¿¶Wñ×jO ²€†Ï î(ÔH{$·*xèØ�7’#dŒ&þt¿º�zÝLËn@r7·+ÜxGÇòêv_í=n|�½Ù �fTÜ �cgñu{€ÝÏr0tHKÔØEóÞæÝ–lƒÃÞ‰ÝÔ¬ï¤ÜŽ)Ã��ÇmÖ ÙÌq)ŒÕîØ ˜¬*(xžÕÔ�â:U»±š¬âÜXrêÓ\¶n¨[«ì}�Õþ¦»6‚ÄÙÆ"›‚ÛˆÆ�ØhP‚eí»:«m‚r£¾AuAKÙ•)Aü²‹W…¢ïøo l 5*'¨=Ý<’¹ëlþþ> ì"êZZR…»�¯KlU"ã ]^K0ìbQºlk2Ïàí5}—¼ï![!a«þØw-E-±Z˜C± É·gí{jªŽKCèEWDw:m!êe2Ê)ãúZBÔc  EbUûPŠ„��rÜnÂ=•¬ˆX vMëG-¾(G€#»Nx¾°Öâ¦Ã� ƒµ*´gœ‰È§¦Ù[9í<ãû¾Ð Ÿ÷ßÌ|·¶;Æ+Ì‘ÝsuóÔž3¾ÆÞ¼=¹‡e‹J�Ý:ü&ºÇÖ™‚ÓR`‰ódÙd2Ážï" 5}Ç k�à°G„ qn{:†;„;Θ#¨¹©^f- ì+TI¤R¡¬Ú~˜�p®�8v®Ü,]$÷›áYÞ�ßtáæ;Ÿq„HÕãóOñ™xðbY>ä`NÓœÇsªg4Ìp9#jÂ1Ù6HžQËðÉ£;°'à51×K·Ü*ЇË44”�]¿•æ±xëýXàAý9’À‰'ž±‡É©ÕýGz#%žŸÌÅ|¥e§7æ3Æ�‘ðŒæ¹g\Q¾ˆ©y _€Š½bQWÚ¾ÔQÙ9½ãvàýí­9tØ»± +âðõŸ·_nûxûxó’±O_nåþÝ÷÷Oÿ:/<}^î?üGþxiTOŸ·,Ý¿Ìi>dy€Ð+L&”Mœ@J‹ È3ÐçR€Í©\ærš Ž6 Å=àaîàp=q,f^ùaëÈSg›‰Ž“nòïDÜ4:Óû©¼®s+95›÷2sîZ§¶öÞi�síÓí§æ{îÏsWÃs·? ‚Y5t'uqV '�ÒÃ?뙳晕‘ZjvÝ–Þž~×óR}´;«ÃQ<JžÅ4ÐÉ;Nü ø±r.S?àèb~–rfK+¿‰SO¬;33Íæ(Ÿ17>ins#™{�‘ÊÔ‘æ–5bðMTúw?¼ýþ&Õ—iñùçAŒþþ#5 Ì®øe©‹L/_÷5‡Á*•¦É]9�ˆK²¦ý¢q  œÙ^U}J^8a4VøR}Å‚/ƒ]’ãâiæ yÒEJ‹:e™hˆ—b“€G½4>4WX+?JÃ/5‘KÀuÏØ Z⾎x›Ú…„ÊÚê ÆÎõ¹yËÍ8œ¶ç0cÉJL™vÈqâJ.R%+~ÕŠ,æÚ—¹…Ê“ó.}ÂvöO™v_Ç#SæµËºÚáâRé\qiÎÙ´'ÉÔ±5[t˜¥W à¥h¯ÎÍk(ÖX”ÐJDRd¥ä÷•WŠàÕ×0ìZŸ×�k³ŠÂ‡ö¼Ö5)W¶•U ±¼DãÏÄ”7Åè5ӒΤڸ¬y_yÅÌÇ{$6E)C«^ Xíà%'% |¶ËÒ’+)¯OÉ™$$Q UáY‚æM6+7Hà#ò-ð z€Œ»­I• *×JPô•×›`hQ8ÚRÜèÄiE`ªôËàc"A‰éª”f>Kq¥®íaE4“¢Ü_ža°Å§<ÖæŠçñ&[jà <ß»J©øU�ú“<‰s§I`AoBÞ=å`J%î ¯”�ÑçÃžÕ F#aÈþCY ˜�¸´P´Ä%é1ëØ°¨¤+BvŠMhýù D Þ‚ÅÆÙ#G­sÏ ÈJ.”™{!l‰(�€\µmšéßÅBð&w¹C2¿XÂZ]‰ZÌ)i¯Í4ù}±†àAJUž¦or> ‡Õ-[@FQ¡i_ÊhS‹Â .²"—5ê’&°“½æKnBc‰ä7{]þª’’à/$öq:5¦+i`¥ŽÃÒÀ°Bây좙ÏqØà¯ÁŠÃ ©'8¤å­×²\¡(0W¤Óª=ÞœuxQ�m|‘;=–ÔöÈ8„ï+ÒJ�jt—¤Á¯¹îi‚’Fbá"ΕÆb=›Q��–nm>µÖ¿+aF‡lƒ²;Å#€º0¢Ž|zE$¯�£¦¨+¿,\Y‹×VÂêÖ^°TŠ4¶¨�"yv ¹MÚDðqÙ?ÀnûqÛŽÀê<ùå5-ÙÅaµÎº9SSZÌá ç°d{U¶gF5Û¤J°Þ…M~ º”)ž$ ÂMý:ÉÌ‚duÕ TT5É’F£nÕ—jÏ#„p@¥j×PØeŠ C<À)U7° ¾@8+Ä„�¸ú Û ª€ôðzÛ—bïogHHÏ&îµAÑdÝ´ò)ÃlíBfÓMÍÀ÷³’z½½üòëãÛÛO_þrÿõ¿?}ùíç·ÿÝë÷wÏBžöWÿùõ%�MŠý3ƒëšO ýn¡6)ÛO_o¥>³ùLE&ÉÛùòú�|ùæ‘’zy’ˆµýÈ_D<¾¼Ü>Þ°õÓ—[¹Gm©CÏ,(‡ÕÇ$¥�\�‹J�¡®ÈJ½òаTË+ÒÒÆØ‡Å¥�mä%,/ L^’˜0¼&2Åò¢ÌË+BSÌ®IM¼ñ¢Ø”ò‚Ü|ú|Ip>}¾$9Ÿ>_�ò´+²SÌžbtAzªÕ£â“>(?ÅæQúôù’EŽ/ˆP êq ô>(D¥V.IQ±»&FI—ä( è’ UÒ{P’*Å>*J•ѯÈRí"W„),¯ISíÏÄ) ¯ÉS½òŠ@ÕÆ~A¢ÂðŠHU½ô¸LU»+Bõéó”êo¿¿Ý…4Vй?DÝýxo¦ñé_±T\�쮊¼í¹±¯K(H¢›ŽWIµÊj•º„ï*‚$ÁQjE|Šð‘v™™›7¼…½Mˆz�a¥Jò€‡N CÌ�j6¡yï%r¨»ä™©ÆvrzЇ+:]ï"í…RYä‰VM]×$ÊGºn“¬áx(u`÷JÛ\÷m¢©ÿê‰/ß:QöJJ£pÑxì·¥ú;™åâc¹“KÙ»+ù³+þ€Sj/ƒ°þzVK~Ô·�šŠpÓ碙ÃrñB¨Î K0ŸP£P¶È›Áæ>èt >⡯< ƒ…HÒ�W%xc|Ü–\Œ%1³�HÓ@¤äÛ|à[’rH™¼�Þ&«ç½Ë' F.!XX¢.Dd_þÊH’t¡T¼{¯ý‚‚™ƒ Z1aÊS¼_¯Ô_•8eU‹piã *´‡Rh¡4uHÊOÂA'�[Y|}—”É_<ïåýó¤ô$ø2ºýví½:Y¼;©‡+Àc= =²Ããà“‡]�ƒô8iö8ÿ„ ÐýDBÆÕ–䜯7È„ Õ× 8¼JJ/ÂA´¹’DÞ1iEÞ b#C‡7ßr“ Rþ?ûÕ¶ÛFrD¿€ÿ0/l##õmú’<­dÇØ,� ¬°@4ŵ•¥(ƒ–ëïsNõ�3œÑƼ@d“žTW�ª:'kKà� ˜ÏL¹l"‹Æ“|åó’È—c�Þ\,„…”7óÕ-«i“!>Q¨¦møé/⦚D5ªæY;4 l¬!cbÑ^–ÄZs±ˆ»¬AÑ™U•Õx.±L ‰Æš­nuYj`»èû¨î€Kª„!5ªùM´�(�íPZ á|Tж·Ø%¾½}øÁgOl!2"¸ÙÎÉO÷Šüe2;�y×h æmcQ¸¹l$3Á‹Äz×8,æÈŽEã¾F!}í}ÚYõVLÁÓ÷ˆîZwé„ij"¹y( ô¤ŠÅ�ÅHû÷Úæ¶i”–y�÷Ô͵Qqù¢Ü‘³žgð(²!í²ŠC4—’¯ä&,à‘¦,^`pS�ØùÐ}Ò‘åèC¨©-"I®Ç2Pòðhl@êl�a�8ØzK+•W4k¥:õìÉSMÌÙ9uOöÓ›�cÌ]G¤xsÙÈ$çm£Ó<ˆóË h¬3ýëc7H—ØvúÃúþÕÍüþæn5[?æD.NDžÿ𣶟Ýß/Ö«w‹7Ÿï×3.ûåñÓâEñ',TÅéÙÝÝrgåëÕìýrñæáæzñ9¯2ýã^ùt·¾oú þ&i“:,TW¯W×�·ïï–òÝ]�ÁƒUmy~q?[ß¿@¿|À«_I9çž§˜ Ãÿ½s˜‰¢¸á/¿O6 ¯Cñ7|øLÿ.\ñ¶øÇ?Uq ë¯ï&Ö�ˆ0)I[b¤Ò¶Us’Dn4mL€°4›é„”î)“44o`‚¬Uà KŸJ}�/lŽ�è¾&ØŒÕÝwöîž;ps˵Ηºïõ¦|�±·óßÖŸ] \…6´ã º\ÛU|í>…§6/ÍÔ©»¢ìRv/Š÷Ž»Ó.ß m^ŸQM^%`„ø£¥¶qÑm�æHô爖”’ùQG€n wà; Õxš’–˜Õ,I±hÏIWƒ¢T´Âå¬dMˈū¢¦ÀbÅò½òÐß ÷ Û ™D–I6A ­r).0*´”<&ÄÔ:¦äe�r¨¹¬ŸÐ[>ñÁ^¡—!!ÂJ§ýHM÷È>Ù$JVx<• ¦&®q¨é^L%•kéÐÞ"âT:h3‡vÇK1q5»¥RYÀE´½-JQANPÓ¥…0Ö?±•ÓàÂ!h¼TÇÞzvØ­` d™˜P hTËÚd�p¨f�«b~wûéîau]|þ8û´(nï®Û³ÜìŽâ® éãšµÔCv6v° ãqèF�÷ñÍfÑCø³«>ÆŸ]  \J¹Á9\@:¬}¬Kkè¡�îã=‡¡ƒø�(æ^òߦ®éE^ÿѵUf‰?¯g«‹oÂÓÓDÑ6DÑo^ÜE—ü Q¬j¢Øù}à˜þe}�Æ1EmÉUÒ!‚ B/ÈKaŠÅ˜"j1�äd¦X!SDïLº"SÄ[ªè[LQx"�Kœ*ò•�’MjˆD•Dq€'Ué.O4¬–]žhjN4ž'Ú¯óD÷-x¢;ˆ'Ú#ybçýå@˜Ê�hÆ!SÇñD»�'Ú#‰ƒZó—ߦ�¥ÅÀgÑ‹j*oÅ„TFN É �Õ‰o,J½´¸ ¬ŽeC1—ñª,>V 6¤b)ìÂèd�n›œÂ6ІäÄà*_eƒ€²QÐIÎÁþÀËe-ˆå’CÁYö ÍIð,ÀRlîäèÒªªhÎ…è Wá�å9x¢²à6–áb�#äówl‡¥ˆï-¡ÍûÑY¢Éô¦ùå6�ƒþ¡þcÚðïW‡Šè§$G'%ÿNZh<"1Òº©‘n6>9$½ôÐ8:AÑâI¿áïR‚.Ù@Gl¯Ãó` 4Œè—h£«û<â_8޽iÓÁ²­R‘tÛ™XwF8”‚÷Ð+!Ö ;G>iüMzÓÆéËV? ±fZ/¿u/Àä­œ yp ¼W“Ô#u[ra”Ä £Ê'¢9q`û˜T&ž`œiÉ–³ Ò( 4É£•¤Û@”]äýØ© °'@Tø ÓÈÐOÔCt-@Tn¾ŸS”V�[ ¦*•¿Ë:¾èb‹‡ 4ÖV œÔÖˆ;ðÏk2Œ�ÉS ì¡N“ü\ g%^#µA4&e© �„Z‚âàd7nçµ`ÙØ±QÖÝN€¥er*—Oç±¹\Ä''2!V1¢RÂð’#ƒÙi'³Ø’5ð”-ƒf¬ò>‹ŠuŒ…Ó ’ µ¦*R)n"^ñðñLˆ2› ÏA‰#Ä^D" ð@"o‚DYo±ùò !ÁO *ÛUH*ò@žSà©`¦B h«dÛŸ€YÑ{ŠIR ½$À“D v’G™ˆÊ+ÙdPç�D"$’¯°“X‡{Ù^,³Éº#4Ï'b’¾ASzh1:úÜ[H&Ùéœ5MJºY;ïåq«êÅsáqV›ô¢8½¸_߬>ÏÏÎ~˜ÏnßÝÝ ­h1�Þ,¦)DEDƒlÙ¡p¤`È1ìÖT¹¼Oß-fË·3Üø;v8HºXÞÌóÙÞ¼Yß\ÿ´xÌ>|ÿüç—Ù{4«²øy=[}X¼ô*w¾ûšG°’A°Ò ûñíÄ“_K©@ZT‰j¶1¡)ôwÏÆá­à�»ª¸Y�¿£ºº&ŠÂή²wnÙ»'u<œv]~R &óU­Ð0uT‘û~ˆ õ„`&û2‘@Ú}dw…/Z³¥É/ž¢,ºì:5FºÁ�löRб§ìß v�¢1¢�¾÷lü½ÐBh`ž�|@x�¨� xVXL‚¯s·µa¹C»,=ÆŸÇL£8‚F£ÊÚ¦¼¶ cvMÈ^wŸ-kê£C}ÿùDœÜ‹�ï¶ÝH?‰[‡æ¨2`Aß„ôíÃkIt_… h)á.Zyú×vê„¢Á8í€uÌ¥g£/óÁùøµA*YØ\»§uÄDÉ´õ±¼c…ægWx>ÑØÖÅ4L]ÌÀÔÇuÛx0²)QzØf(ŽBwŽa××>Ÿ]­Zì¼Ò’*ާ ¤%•žÄ”Ù$ê9ïšëêÚvM<)— Dl†œ4tžú…þC}µ#» ÃÀøn_f¨áŸ`+·¾E&UÊ$÷Ï’%‚´-KIñ^gA@‹Åbí¿ÎK qÏmcnäæt÷ zÒÁáã Ä;@,â Y'á�4ú³FNòKRJ’ïš#@f—>Ds¸´Ãê¶™ËB¡íž/„-Tþ×tó‰ÌóñÌÚhdmÓÒM�üÒ±½%�‹RšÅâMæ”´è÷ëV±4ê­/Ãⓨ="} Õ}†è¿s¸œÛÿºÛÚ¯¸šœ“Ôa §vÆë]oïV*޶ƒ©çS©è #„M�ÇÛ×ùºù¾ê¾§A)yêæIiÍ<ÉàJ©1U¥Ôx‰!®’W¥¤zq§Þø€†Š¤ ‘ ö6zùRá ,ˆÖ¹LYI…Ï1�$`Mk®š„%X­Þó6o½·\8Î=ŸÉ�¶‚âJ«˜¯TÊSQå.ÚüT…‰PòEÙ"_Àe"N*„`Ç¶ŠÆ…¥j›ê1)N«‹*ˆrFAD É’÷›—âŠ!ùmYPÚ3VÁÝ~Hî¨|&»�v5+,NbÆÅøb*gÄ�LröMQCrÁ@Jtüj'ç•Ùõ&?鬰¿ÿKîùTnáM†,Su£@ç\Ôô Á"¤�€0 憭ñm ²ÃU(&A{ ŒuÃàp¬úø]@ríìC¾ÅÜ_¢¶ _²ÛzÛyhØyê”�g0®X/eÝw|z3¬ûNwÈ$ÿùçRÓO“�¹:™,¤LŒýb²k¯(�$Ùr.PºÊŠ‘Í"›EæŽ§Š²ô,D‡’·“ꀹl1zÀ×OôŠ $×NâXfÖCh^8‡ã¹ÏaDí‡CæžÁ4âº5¾�lÆQ[ø“è.wØŸuD8g!§r©¾°”þõûú¯Ó j‘æfÄVlH �‡æº ¬]M›OZy¯CÒª°ä]XÄúºk„šeµÜ.ÙÓý’ýôf"·yûC-ÎÕ·†ßŸú”ñù,”¤1qÂ"”¤sôR'é8y•»6`+´˜„Ë;Jw¢ARÁ%:VII×é$Ðè²=ïðÿã:éhîùTnФŠÚ6Dø x›´õ2&åó ãGP\Šb(ègSnì¼h¨˜vÞl&”Ô,õ¶Žp®j�(_ý]ßUïê¼|yn ¾˜îÛÚ¹Í$ú°0ü`|e endstream endobj 230 0 obj << /Filter [/FlateDecode] /Length 5700 >> stream H‰´WërÛ¶~¾þxFê„€A¶¿$ÅÉøÔ‰3¶Ó“™Ó3Z¢m%é¡é6~·þ;/v>¯R;IU·Äb/ßîb /dœ‘€,7ž^¸Òã"(>� ‘—†ž`…z2‰:”…£I²C:u^9”¼ìlp³±s:òÜ2++1 –æÆQ�$öÆ9m)h½P»�08µ†F�5c -ÊÖîPh¨µkrh„yäìbìÿ©síüòÞyïPúaíDd2%þí-„ëh9‚½ÓÄ¡s#÷»H!Ð.O»Ë6˜ã€�Ò²èÂé8p´ÜãˆC�#£}Œ}ˆC‡†s·èÀè¢Åï 1Ç�Ìò"',¡NÂ(+øä̉"/Š"âr/ x")Ÿ<�}½k7OGì§ÎüJY{Ÿçé.[“›2]o²¼" ›7ð‚0]n^¡®…Æþw~$¥¤"’2õÉaß Ô?:£aâ…zb¬—ˆ˜|@µÕ È‹ =–$ñWdC¦ ^Æd¾zºÁù3 2.=dž)ƒ×09Ÿ;¿ ꊀeÈšˆ�ª¸°$Šc|P²˜’ON$=ªz2ŒY¬òª¼D&/f×nžŽØm—B¾4]x\"§;K¨×袣µÏ¼‡PWøÑÒŸ•ÕËͪÚyZ>’_Aš¸Ô`K¢)ñ/ªr“ß�É|>[­vçE•*Þ)yÎßðw¨KŒ£:†ÒHÄTÀwBô»’Ä[TçÙª(×8â/4VdZ�_*p8`YtyL=2Füó,ݾI¡ÿ3xÉd1;y]×ÅåuQîÌV T꺸ʖ³“d ÄÕã6[¶Ö;ë5ß_Ô2C‰‚’œÌNhø.­ª¬Ìϳ›Í}Uj�/ï²ií–?/Šm�ó8O¯¶Ùë‡Í:»7\l¬îøó]QV­"�7±©c°<Î×�»«b«×|9‚¼¦L.Óû*#h¨ä¬Ló›lªû“éP¶QÀÓG,þ…�� ýM8yCþó߀¬AýpŽ›6Àá§œÐHßʼn'D«•º$ôNŒÎËxزrš…Ûl[YW [µj�k¯³Ò·lÃ8RÓ52DÐA×�½è9q°·Ò8ÒÍ�UШn®Ô %Zò¸·Ú¶…èòЋW-Ob ŠXlûV¬|fèVQ GÐELt›¬– rñ5áP}ñDõ¼ç[ž?Ç2ê“Q"†í–ñ(PwÊT_•ø�4–Bi )¬}êdUxBõZÜ2ë5’ÇêÌ ®ú´%ÔÃ3™5{VTK6ÙT‹nvÕÚ ‡-³;Tåví¸#n¥Ûwb1pª™[Û¬]uû„zbåæPkT²¶›àvâ,j)V½P»44Å£Å�t{ž{˜j[=Þ¡¦®™ˆ>Ⱦ gèÓ×&Ó.ªf,m�è" bÞ�€B›åiwÙFlÒ!Ü‹×Þ˜ÒÓ2²ÒÕÇ4ô çß G­éƲû ”ÞÔ)ê!Ó4póûÔ=k¡ÇIU©)R ZNEìaˆê�ðv‹¢@¿Ý)ÍNcÜõTõ4S†S³Tdª¼©/ %‡pS?ºypÐÊéÕ”0/&¥))ž$¤EgÖ §WfŠÔ)cKrGzÝ}ÖÝFwä†;vÕÕá ´ ‡«"ƃN\Ç‘^ öTÀ¾”Ô ŸŸ‘ýüyFbŒÜSÓóÆ&ÇósÒc^—ÏH�|^ŠUÕS]2|´¡zq÷ʼ@ài‰±ÌŸ EHÔ7îG<×xÕv­fûíêM¼b¬°k¤%±úÂÊ‘(sN;$ » OX«Åô¸S[óVÚÂ:°¹¤‡Û9æ·ûç OÍ%ž(ôxOÉÄ8‰\Ä Û3 1Œè@¤ ®]à€p� «'[Ä=ýÃòä'[5¼2Tˆv*j,‚\CB`xµPÒ iú’«¿íž•¶ÂMŒêõB¥]°0i(x‹„&íFƒ]+íö»1m…Ý¡~·5P¿";ç¡ö,bˆS�´$œ*«> C‘4m[Z\fÏJ[áNökÃð=f m(1³±1ìZÇ�5A5›VØêw[#Òá)�’Ù]3,´†w�ÕвQÊŽ1ÝUúÎ32 N8Å=Šë(ò#O”Ø(£ µŽ¬†}G6·7× B]ÏÅ$àÙaŽ6�1<ÛŽ©†Ë¦¸X";”Fðࣆ…º–#´RZ?iT‘qÕuGeŒ}ªÆxëî)€Û7�j¬I(Q¨R½ Þ]¹ó–Q3*.‚(о"†ÔcŒJõ xºÅù3,â•ã‰ÄÁ³š~¯ˆX$¡j:"Šx ú‘dºE ûHs1!Ò�DKT)^•z´Ûv÷t,`_È™¬7’0úz©I–rªÒßê ì%ÕÕu´ôgeõr³ª6Ež–�äW�&.:Ž p¡N‰Q•›ü†LæóÙjõ°;/ªTñNÉ pþ†¿Cs|Ϩ êQ¦ÚÞì§V /à=Z#n¦Úïìw%‰ÿ¶¨Î³UQ®qö_häªFÕ¹ :4��—±‡Œÿf«Ê1#óòáþ–¼Ióô&+É’SN¿¼GÌæ"Ýn7haw·›UÍy ï}röWº%.aä]åù#æ)q�É~ ±_bÀüj«U¤«Ûo9È×`[f­âëò 굊‘í!Âa:Ë‘äÛžòß‹Ûm¦X´ŠÃ|—Ùçª*³<ßnòM¶_§VaþÈÊ�†Aø'“<¿©2XÊ«‡ÒŸÏœ›ÞøÁgé@8qf^m;ùÂÝ?ÕËýoýûÐgÙížEm–©_D$W™¢Â^­?Ëpß_ª}u#ABc™þ˽ƒ¨MOi˜¿ÚïŸðn©iã!~Ötç÷³ ËÆ°Äd-ì+iàÒµ�ÿã v4 à%Ì'ö§Ž‡OôÁ$ÖŒ€Ï Ü8ýs—º£HÔbSãf6®¦U/@³êƒq©»Q€[#š¿Ž[uºÿýÓéqè,ØÉoÃóäs�˜;yÜ;þïyñw®˜!ôÄ�aé-°á‚÷g˜/þÊ쮿(vwŽï«Í‘Vü‹Ût“Ã`¨S�Ú¯Y^`ŒñÿØÜo0[(…c Uºúô]žŠažÞoV­¸IÆÃâSFή¯ï³jªc@¾8ÙnôdU”^zw‡ ™ä@(«Ã7é)%§%9¾¾FîÀ}¹©´:¦ílÏÊš¿4ŒR;ºv£ú$¿ÇئF²‰ýlæÝ—›û»múh–ŠÅ7’uRáç9Þ.gI” 6bIƒÿ³_nKmcYžàt3UøÂÊ>*ÅE“óÐI\Ð3“®$• cwŒLÉrÒð2s3Ï0W}—›µ$Û�‰�[«¨¡ÃÖÖ>|ßú}|†á!328Ø­ÈàÃ%üñ8øSNð=PÁÛàãgœÂù‡;¼(ýŸ<�›ÁÓ`gØÙü•Ø…§Aþ�ÁÓµ(ÍJfe¿&§ŸÔûÆìIÞØõ—|¿û×½¿~|BçïùŽgÝä´ßΦù†ñV–¾Êq�-i8Gé៽øÅ·8yzš¯+|Åõ ¿/_/%�÷ÁjÙ?Þºo¿ÛbwˆÈ³A˜ ¸ò5Ä7óÜáo¯¸”p» ••P+¯þ¿ííï�Í㨃[¾·ç“vž¼ø3>écò ù³eÎ „T†ÄU-qM‹’Éhv•s& é$&�º±¡0rj¨¸W’ ´N‰µÈ’�ªe ŒNJK.t^�2”0Úäg¸ŽOŒN%K“‚¹jÁI8ÌMœÎü08YœÏÐh�ú"mU989ÒVõ´¥l}4`–I� =š @Z ¯ Ö‚ËšÄEâzqy—.¡„5x‹–‡O„Ö¯!sUÛ\žÌU-sM˲Ùhv•)ÈÖ�p’M¥e£9ɆdC²!Ù¬N6XÐbn “J�tÖ)ŽAsÍÚ‘�[;$�›Ò€- e˜W°v¸±Þx<°ÜY Lr¡ƒƒ©yÁ·ËœTÞ¦rgjAF^X/ ´Q/誵[®ÛÃÙ™�¤I›†$ùEÃê5÷Z¢×¼ðÆ9d—ÂqbÒ2É‹IÒIôDŽ$˜e“¥ù ¤ J›%ª““†uIóë:IZ¦ 1i>&bÒ&1iÚmTeÔ?_g…¡â'¨°„ŠMBeªuÖ/C í·ÊKájE éa ¦ÑÖ+æp—‡ÌyAõÌœ�r�R‹÷�0·DÌÁ+݆í°e{é«|›�ï•3„µ^ÀA Bá…¶ [áö|ÒLæòd®j™kZ¾��ÈF³Û¨LA¶†QC8)F�ºá¡t^Bæ°Z(NZ§�ĺ dØã6ùc‰É§da-!÷ÌIèMäëϪ}YûÜ: ’[Á‘¹$’ÏJåSg¡äŒ=°¥öÞ’|ª-÷¸åC긩Øè¡SÒj¬�öXLBi3p`…0ÚåÔ€ï®,¾¸eæ¤ó¶°UH¬ì™qÌòQeï…RL, ×íáìLPò�JT¯kF ©ìîr¼1®�Àje"ÎÄjx¶a;‹ªæe�� îßo•Bžsž—ÐÂ+Å)¦µr8¥!÷Êx*¤+í,ËÈYÕs“ž‰õžÒ’ã�¬8àÒXîI^$¯µË˘Ü]Rzãyî.ÇË_a’sM»8¹«Zîš0¤#ÒÑì:*s�ͤ$ÊšêZ„L0HM¡à^PzZ«�ÄÚ $È@d 2huR�‚XÈãÞ �Œ ¹wÎyFZ¯€8&Ñ5+H’‚HA¤ RЪĸ±§NØPYÇ!1Í )¨ò R�[A$�5 dNðn 6¥È±©…s+weBƸ€sÖ2§ÔÂà܆΄ý¸qCï²�-tÌi¯`ïH+ ßWÊ8‡P‹”ïZê»k“SqLÅñ”gƒû÷[¥ÀçÆÕ‚:CÊ+•¯U˹T8£¡âÎ:*•«m.C檞¹˜Ô\÷Zb^óÂê:Ç'©«di’¸H\«—̽%�Ò^â‘ÐL)—‹ Ö¨!qU\\öq‹‹´S˜9ICn’(mŒbè!+„!=p`š“×›HÛ2Ä @l‘U5ÌJàÖØâl­(“Ü*™TJ”Cl3xÖM“8í-‹(·QäÞ¹ÄÆ¬]\^ýÞ¤-¸t²ˆ6õó3¢ðȦÝyU¥ÓœãCD¹KiÕPŽÚç�PPÜ"¥j‚¯³zúÔN²ŸvB¯·i]­nÚ¾ê&æÓ®A# ?Õ6ª$NU�S…€K£¤×ì¦ç˲õXƒÓ™š M}ÞýÿëK#Ëe=µ4nv =|¸y2JN»çí«¸ìÖßñ¤ ž¼�}¼{ÑN]ØÑxÎÎ%ýógÝ‹vœ¿ÈŠñ÷¿{ÿ ~èfQ9„2> /q6ºØ;‰:Øç8=‰‹wŒ:“_úµ�Ä¥Í=�ÏÒ¸¸Äo5ö2:�ñ-{Ñëññ[—®u!NE#Ê`R“‰UP ö*ýñÔ�Á빿Åi'ê7ïµÉ´ý�iŠq«{l§<ÄL©�Ãn/ ¢ã3XáÑI+‹ƒƒ(Éâ ×÷ú¡êû�äûf³gìÌÖ²ÆñF“S§¤œˆ$ÙEÃá¨v›½l€Ñ;íó)ññàîÄ} ÅžR),ý¬ãÊ¿9Š¿©½úpÈ«@æÄï ²ðæð,}÷¯esÌ´ &¸LÖpk apÖ¤c2à¡°ÚNPÛü»©`ÞËþÕÕeð6ê}]!_ÆÀFòéèÈGå×á½’Ùìòi…‹�T÷˜w3V¦*ßÈbby:WÒÜž½1U´8:iŰK(̃v’ÄI ƒF®²8_¼¬%ïßëýuïó9Çg†MZÎê7°~ÓàU§ûý~T?O»G­è´û=ŒÚåŒoj:D—•õùÏ…üÙI'­ÝÏñ–]æøêณäãÏB;Š”Ý‹è¤6ž1�;ýt;å?à~kÇÍ8!žm0϶#Ç,Lƒù‚Â.(h·0o´5õ(†œFé×q˜�ôÒT"äfxÏ·8Í÷£zµsxÕÇïjuÓ«òA…V¢žpFÂ/§$Çà‡-0ð½[¾»&Tn òV·àüg£~'û<†ä£öùEg„äÛÛåpð¦žC>˜Ãp"»§3@êæéL½ Ì;L¾ã¥t¾Î¼àxeñ^þý—7þË‹äô—4Ë»ÑÃ3Ï|y×M)ÜÝNÎêõâô~ Û´uâ,‹ó®6Žó–ñg÷c#êõâô6_œ|Æåó¡·sûìNãdìwÿ·ü§8ù“OýšˆïìG¼Þ÷*�úÙ�ÿ%1¦q6M ‡{,xÿö÷ذ•£“¨õN¢Q#z°bwŸíQÞÂÝ¿ïqÆ‚x¦hh¨äZÑ1�¿›À«o÷ÞÓµgn´q÷"6ÒØÍÁp¨¯|VvÞ]ó—_Îà¯í^6¾öo,½µaÁùº›¶¯ºIu€„�¨ß¬� §n/ ¢ã³¸Ù�´–ÅÁA”dqmr†¤it´F­Ÿv­ÀkŸjµ;«,ïãOZÉ·rV\:º> stream H‰ÜW‹RâZýÿ!6òÐðJ€Db^DAÄF9$„$æámï‡ÍÌ�ÍI€´m™ºÕeÏØUVÌ^gïµöë¤ xŒÅÂO1M×Ðcªm›Š6Åb?–ª¦Ë0áþzª³�©º´€ò@ ,׸"æ#×npÀFÇŽ ­•)Åš&xÅ îc¿Q¿F˜Õ‚"ÙŠ®seÜÏE%ÍU6¡¶ÂXªªÙ»tíWcM÷sÝ/ÀTÀXuC~*=þ™–ß)”ü¥ÐXD³ž�«¸G­Ý÷VáeŸbûÐOµÿ~y’cÙúro�{ËûoZù÷õaÁKC…°AÚû¶ãoŸ Äå¢òÿ0¥Ö䯯íá?y[ª"ý¯ïb‚Êœf°T õc¡3¨LgûŒ–�üÚ Lžæ“I}&ë/E¶gû¨Z¿VT‚Ì}&èÇ^#øåBN‰ ù™”×}¤¼~µ´A8]ÿ…Œ±n£Ï€:œØMS™*Ú>ªÞŸù®|o×µuÇ” §;šüåw>º™¾šÂÚ@FŸ@ÿ”Gþòɺä,¡¶×†€½Ã ŶUhBŒu&ê¿ÿe9ÚtˆÝiŠ„Înü±U‚À„õQ }Ý8&ª¨¡MìÆ„´±k?�?è\›ø@ݱUEƒ˜e›úbÓ¿� ׫ù1ýšâa¯d× c«ù —ä­TÅ~Åêðª+dú6ü±N�ó�î M`ÙÐL¼@ÉÖMl T IŸˆ”TÅÀ$ÝýBþ�™pŠ¶ÑšxŒÈ&ÓÉt N ¶*:ªºÉlš‚#«Ïµ'9B™ó6Cw[úwß;›  ÕK`#×u]ª[˳ÿlkøX”hV… 2hnÔŸñk¹—€Þ®µ£›™]¨:Êj ŽêJ_Y©\.“ T˜öX¦ŒÒª¢2Ø8į�mºS," Ôd”ê_‚š.-PO`SSwŒuus>}—AZ3¬å5ƒò7p“޵ ŠáØ>é™%O?&M"ïî‹5¡¼BfÒ;<šŽm ¢¿fB<Û&Ð, m#½"ŠŒYÊßpOÛ4Z‘€¸O±¾8b§7›�ï ±Ä*²bƒ±âŽôzì·²Þ/£:Ц˜BìF76%|;Nˆ†ù¦,C·ùö`²¡$ßÀЂ±Þ¼Zk±>éq@–ýÙa«hµÚº_²÷}›Ç ` Åa)KGÛ2îÎ�ûE âÃû‡=;oêkBÀ¢T¼Àw³Kc›D2íý` ’NdÆ-"A¦7oIšHÒîËc÷‰‘T2—£)‚Þ®³µb?äv‡¬ÿŸ±f¼©´`µýœ]Á’nÊP~_@,u­Û;æ@÷´Á l8ª­ ¥Ë®³a±ªŠÚÜ�vósö¦  m.�§l"²m¾Z=Í Ð½ ]cö¼yÀK½³hôãµL¤™àób9+LµÃšx�Ey$­#êî²B… ÌÝE¹‘=/Ô¿GŒéH´X!§a"› ¥Ó–0¦ñôS|Lž0¥¸a1Ö™:3Åú¡¹Õlnzy[gJYØæ•³²$$“Ñé»PuùÅ£1\ ¶0rÙA"Î.õº…òcÏð2rD!{Ôãæj´w&éÚø§ÎŽèü„îÞ>|g;|²ûqÐ ®0dJ qȬäâaGŒ]È“ƒ°—,qôÔt„ɰGs*£ö nfó3z@ì¤c$¢þ̔Σ½•DÙâ§�:zŠ< U¹zÈ%NçGl;ÒVú@vÂùy —*Rî6ÆÏ²OÅÎDpî:>Â>z'òÐ9)wk¡YQ’ÀÂ}Rðʤ>[E&Ò)@›ÊѨ <ÖdN ŸG&þÝaëíȳËÿ˜)Öf™ƒ0UìV“¢Kü¬QLÑËïg M§¬I†5¥*�/ „ïQjV¥�ŽBº—IË…OT_¢qKÄ!§Ò7Ë•‚ûz˜á«¥P¯Ïç,T—ê*Ó¼þˆ—ºòC�‡†žÛ²F‚ÊÔIÈ-ÉÕ£n57OenqL%Ö­Ù•ëibj)PŠˆ‡øÀt£P®áÑóâAÂéñ·jÖ{ÆËbiýTêU®Vp>^­œ‘÷dµn?�—Ë•8)œOÏÖ~zg¥¢<¿~ô*éFþš\n�¸šO`¸%@ÄÎZ.f½w¹CNxòR-@몾m$oñó.x^ *S§€)vìol§f;諒Él ›BôÍÃ�«6šœ&o„+9<%G¥s!-~g2^ ”F%Q@ÝqÇ9=ÿø¶V»™ vSˆUçœÏ,ÇËÒÌS­~Á>Õ¯cJ¸Q‰±ÉU’M—:òøè±´"²›Êiå¡‹ÇüŒj-*x=)n; À½în˜vEv;”ACµŒ i¡c~:«XtQºk±ô€ì½­ÁÍ¥ÚÝñýí¢’ˆ�ó?+I~¯øƒ0ÛiÈ8Ú0å¼ÀÕï?cë!¸‹{z‚†¦B¦É‹lã}çØ7âñ�Z…Ü€ÄË£ÄAx« ©’&bEÈÑ•hv½…“$.»q/¨�'ÜÜ–—œªuu¶3ë!W¸ïÀ¨ÄõkRŒ$è¶5™Eѱa„£ðúlµ-�…Iô’BlõÙj VºýËÍ G®†�ŒÈLÏúî‚ ãì¬ÇÞ…%ka[�õt®&JÞFÛ^(ÊÖ®×Ò%n3±tAÄ»}Ð:Áœ »$°¬‰ôØ©ÄΞ{Û›æ�ur̦§ˆl¿³ŸŽðbÕš �-…rá¨l{Tã×Ö<;bJ—|AF]´êŽ8OlÛéd·VŒöz±dL©ùíÕ¹¦¨¶DŸ Â6c„¢¶T̶Ùnæðþ·ØDmgîÌwÎùãîMÅUU«ÔlYë3ÔÏäÄü!‘¾ìxYîäpÁsâágÁàBxAãåþ©>©Þ\ž¾ôåI9-èôoùö rÂ+áùÌZ¾Q_Ã_”þªh1Å"-êgÊ�—¬k?ám]AZ¶¬~ßhV sÂ2�C†Yë©g¢¨ßsº“Š5Q i1}Õ/©åûÃ2ÓnÕ5ä¤òêeZÚ·GU¯vªG ©Òt£`!±zäË71£~X–‡´U’í%D=:೤¾qÖëf6ŒH¨±3Àð˜n @´ˆiÑù¤þ*¡?Ò9°UtÈ=Z¨fÿO-Ó¬±ÆûG´Uã•¡T7¯(y1Òmúò�²�D¡W=пÓò\j Lï5MKÄVе C� C½ÂàÀ¨Ó2„C˜åÇPFHaG÷YüxxE!PlUëùb4¤ïeišµÿX®€Ÿ)V—–Y®HË«›Ö°>õÕOˆ[+Kv¦§seÖ¾�Ë?.Ÿ'L£ˆ(¡´\F¾@ÍêH~eãÿC­©Åˆ"êf§Õ€©EY‡)ärôÈ(1ºÝ<å^¶a��"Ö9DÒÁ« ?«öS¼ ®ñåw*©Sˆ€ãÍ „ˆ•©ž½³Êo&SŠ›Ëg—:!-,%~«ÿzK²²_ï×[ƮޜÊ(ë%ïÈ�Kn§ºn™_ß›VÎŒÕ!fº¤›V¤Z“Ë7ìZûð³ZIR5|7ÍfüÑ›ò«]E�g– 0£ ÌŽX Ÿ– ƒÁZ ]ŠlAv.¡¼ÀÛ©Ýžü·Âéý›$}éXíQlå»OÆ�”Ò­åƒoWç7gxÞ̉ªc#á<;K$ÚØ‚%Ç”Æ54+ë¹®"Ùž_�l)0y:Õ³?‚»A�‘«>ØnêRLóE fJÙ7&Œù°™GÜñÔb¿Ã•4•-=D¬ ŸáFA£ÌüdŒÙyîpŸEœä>©âÊï ßœÉļRfuªñö÷5ÍÐ{ßI7j­.ÏzúAoÕÀptá ùþ]Ç+§à®p——ßk~s¾ÒýÏ5ë€ä©ËeÝysÆRÕ^)Hã¹ôLYó¸DæKÙâ‰)2±;ƒ‡ý�«í!à M¦…€qÐŽ�ƒN9?uy/yÌë�½9¡]õ`mò/0�šT/LäŸõe%¼ü\¿¯ª×bˆR½°a¥üæº!X)0ÒÅ�óHtC")/…¼¥Ð ý„^s+A¼˜]Òág˯Ç$7�X9e¨—Í•|OKŽÖÚÊ�4¥1¢Í+çÃÉ:Þ”\�¦Ì„ê:n7CsR¼²· ßdâí`À<@ÙwÛðÒ°�ÑDóU19UÝJRjãnT�Òùiží±W®=Ü‹ûÒããpd^Ñ&òÃ¥.–¨ÍÓⓜôrâ•ó«5wMÕVé ç?ÂÐãaºçÇ…ý s+÷¶j‡yÄbö+Ì’êZe9â³�¯å»9ƒ×i(²§¨N!{± �6Ÿ›�dêla‡"ð „·wJ­¶ò#ƒÕr„úâƒ?3ì®7I°–Æ‰ÝÆJ­Ù1¿ywÄØ1‘>dKÇé ©��óY•Ba¨1Å Tš9Y™·fYÆC]ä]éÉ�/j¬DÎBÜ`ys=Å“Ü^Üm˜û“>}\‹ØT`î£a­ÿ12�£r% €²Dô@H™æÚt‚l"Ú8e¥ÆUP…fkQ™byz¼âóÔªYt|„K4’é§KÚÛRÝvé‹Ï°7‹5ЉíïTª·\QÉÓeš_ǦéŸZ¸ˆCÙÕ×O¾þÒS•晆(R2…]uïË& EêÊsgƒ¹¯L�1³KP´J@œà !vÁ!ì®ô‹f* e.†§@“Þœº#V‹ÿã¼Ê’W²è ØCRà�ÁØ< ɲ°± 1“ 4¤maI)4�úèè-ôzÑ_ý÷þ{½�¾)y�ÁS½"(3ïÍ{Ï=çä^ŒUUõyÚWŒ�E0²-ÅX>ä÷ÑãáYô¨À€„J1¦ØØÄ^6à÷ Óbà QµÏäúZÀ)Tß2'Žª6 9[köä:93xßhó\ý!ºµãwÞKEcZN»¿èå4ÕJ®õ+¶“Üy •˜N0gÌ-ηö1«ü80íÎc‡;ºÖSÍžœ™Êäü’×®—?_âžKPï†èGQ²»Ëï‡�d^LH€ˆV¬²|2b*݇‡øËI¦à ?ñØcçÕ=É ©\ã¦SÙr:ñ¯}K˜´a_À¬Ú¬&ù—Z ³Bè²ùf¡&Ww )}½‚aríR:C¢RQ$¥ÈÂqž­k»=hDù¥Þãå‘ë߯ï˜6§¤\}™—÷ÉaPÖ+œ‹÷Ä�éÉà~OŒÞ ×ÅÆ`ü„=/†¶ñ½Ýù9åkíƒ[m‡˜ôa¹p‘ëuÀ8¦.f«O¡Ú…iß=ñE.‘b“Õá4òr‹¸XbÛ6ålè¿m°ªFÒsÐ õW(R=xpÆÜ„zÅH2E¸J¥�Š1ÍmÓå†ÎH·¦s£ Ùñol„xµ›…kÎz ÊÎæ*»ÜÇ3Á«‹|©p4·øi‡WØ4<©"5ñû0/_àõr N¢o€‚DƒgO\–pe¹aƒÕó™zà®Ã4ò· PÊ©À¥Gƒ¯Ûž¢É¬xdÒ—–ÍFÒ¯»€äf[ÐÁè˜=Éò'%J:�æè~çДع“šEb›åž§Æ©˜•e©í­;±O€2^nY5r úryÿl¼À /3Së0áì)ËO Þ›ÀɃ,™|;Î\º,ǾŽô]¥Â]ݵ.|è>OÖ¶©öK1œ?tž”äùÛ~®(5öÎ|U¤‹`I)ÊsSù{m€^‡"À:ç·ãŸ¿Ý ÈÄþ7èÆC<Ýt 5øõ�V¬Íèc›7¢;|\åª÷æÉ{¥ËÖüÇ*? ¬ŠÙì¥ý&‹_¾šrcV»­T¯ÂÒÙ8ã'…ÒÔé{U†KrrñຌWy<šãbÝÅ6Óå‰ä·Ìèâµz‘ú¦u¿H,Ô}ò®üTùis<%¥> ´?æ„.yå¢ÅW ŒtÓŸÒ@g%æ¦R ¨ƒ{—)[¦9Ù¹¸…Š�9H~^^ßIÞÎ&ÝÞÕ“KÎ.Êù#÷Ê?Ÿ3�YYS/ÝWмe)nÆ*ÀYû�…1ôÞ7þî7ÀGÕø°@(‘¼íônóB¿�©že|ñ¦§¤Ò Òâ®¶û±ÐÜ·ØìœÈè4ëð{fùrÑéÔ÷³Ï©Á#ÀFäÞO£Ð+W׋’óMÉâ³mzûìV`Fð>n¨?^=¥ïÁ`¬?3ãa<7‹œë«—žiî^½ìøNýıðìõÆÎØô%îØà�ØânñÇèx<Ƈ8^¾ãzƒ^lš^È='_ÈÜk\Y ‡½»€’†¹è]ÛsžmC;_9ÌŸ„çߕݳû/kc“�>xY5˜�íaœ+ŸÔâÜîc6†·ëg‰íÂþ1ØÝ’E­Ø)¨ùÝÁEþPÖ‹v°|vš­u{§Ö)¹ã9ûa—i’‹7vî½ìžüí|+ðœCa¦|GWDD7†­ÝBœ` {è¾F9E¢ÿÌ”EÑkb7±DLËîçðÿþñ/ó¿ßCÑŽ®HDÆ-ÛTô G~‰Ž�­¨¢�TË>²$³o¾yÇÆP´¬Û —IÄÑmo•—Ú1*ë#TU,Ñd6Ê+‰¢M,¨óèYu޾é÷-ló&ÑÓ~'æˆ%¶M4ïàã™M6ÖˆN¤!ìÃy×-A3T\QtÙÛy‹-ŽšA7Žm86j –�Må—@3GMlÕ¡?Ç‘‹ª2‰] *1ga¿l^±õÒ> D3LlY°¡áªb¬ÜC}þƒul"âØª¢cdÙ&akå¾8�W7I_QqY—T‡¬U‘Æñ~¯1mbxÛN7êŠï’³¶„Wƒs’´×"‚u{|�kAÃë«[‡ˆØü‰É$¢`W…lŽ‹�'Ö´eÖв& 0#’Ÿ„t±°¬£«ƒ~‚Ñ稿מ¦2Ú›€wþªŸ±û[*]VèÞ² �Rú 6§©o\°:6À¿¤*’ÍüdâeÈ1*W^šâry¥×_Ú=„÷Ò€ï.Î쵘Œûî«ÿ(~@·Q‹Yª†­áŽú=|Tqß^Ÿì’Éó'�Zi›L7ñÈO,ÙÄD¢  º„}Ìü[¬þ!ZìáÊ ŸÒU‘ÀÓby¹θE�²˜5¨ðÃØ9n.¶lEwÛ¸‘Mæ𷙦,Á¿6ËT¦§¬÷Éxå%¹åHl›ŠF‹ÖÅ>†Úœg×Y•Rh k=ý|àµìãnr!RS4Ídù}ݵ>6^•6sÒÅâ­‚ß×ϦDþy\ŸÌT¹W‚ˆ®`ãöÐÑD]PÔq-Ü‚-dA™�¬`Ô²]ÀÛ):Œ¸ª:úëHÄŠ†ZV¤!6u�Êð|Š‹$¨‚XŽŒ æÝbóë ¨‡C £¢ÿèCß§_‘wŽeüùOE¤èþ pîþ�†×ˆ?¸%Ã$SÐ4ô»!ö,TRЬ2ÊBÚŸÿ–†ô‡{ýƒ¬þGµ•žd Y¿Þ±4rx©8ºˆG‚UO|´1H¦blfo@7 J= Éãß¶)è–!˜X÷Adõ¸±ÂÔ&%Ö O4¡¥üÂ+�Ž{“/†�Z×ÀÔ§P+5¢åˆTÚˆn7é0Œee ™ÂJQ™³UçOkw=™†ßâ[à*ÀŠù1S‚%Ù,2þ6þÃÞ´ þ§Ô꾺 ˜oì&6Û7|E*ú  ‚[geò8 ?úy`R°ÞêRIDU±4/—ð…Øžó*L¿{ßÒ±ô$_ZetEDt㘅æ°Ê¢Ò5-á'®90Ý 0 ±"�œ& 321å)ä;z%"ñƒ¬'é~‰3'ì“8¤D&#LɉšWbéLÊSòâh>w×û…)#~ /§ÅѼµê‘ c�Üô{ä©u›,õ fôÖói¬ß§ù¼éd5L?p0쇎 ê'kæš»ùMUŠZ(±»© èý²i} ŽQ±ÞÚ´ÿç¼Ê×Su’èä$ƨQpßwÜÍb5ˆ¸DxsçÁææÅ¦0¸t£ßüqï—¤NsºªºNU™`|N±m«¶£¼±2aÁ:ôÛ„Ÿwü0Äæ©ó1—WÆËçÔ¿®´+Ü’õžÀË #Ϭhîj,&‹ðËj&ÈᦠŠòÿ¨9”hºH΄9ªG1Gâ‹Ô³ðÒï÷/9£Ì6À,J_J¹LŽáx#»t¥©Š¢’+¸1’¢Ý¡Î õÝÈK$œ‘ª=)&)Ú;Ýt¤üóû�lì~ç`Ë#ØIL�ì�˜ÂI‰³_ƒ©�Ê[i'£¸/@c±¼ÇiÓ•¾ág¨‰Q�ê…æE•äe è±®)²îpUˆüÕí©ÈñÖèÏ$�huFÊ*¬[îÌp¤i)«ÿ¶e4‰ýo!ÒYÁEN!—âþàï¦,6kR�¸©(\VAƳ„ì|^r$M_é¿/³@PPÔP›ÿYÍô噫+ DVöZŠƒ©æøu&Q¦op,šþÎÆÈàÀ)·@=í)Äà_‘¸«,”çÐûBÇÂ7pÈ=¼õàß[_€Ý»õèý[£DþÐÇ­&”eÞtêx¶Ì™¨¨s°.8À�„ƒÐÍùYh$ÐL8–Kº×üO�ÿRHõX’Œ†�B../€³´Ë^Pa²qš1Ð࿨ÎTí°â‘ È€íVÍa-â7¤b­üæïÚAm ¬/w2à S™ãð.Æjþ–¦¦Ð‚›£-$É(ƒC-ûáúÊ[•_ºª°š‚Ù­¤î�_‘ö<\³>6\«ªÿ4œ$m7âžÑ`Ø3%Çåv?8u�k*êâ|ã«éÐ¥ñœ(ì¾uçÐÄL�"òž©�á%Í)¤£ƒEVZœéšþ×i”±5ë\¯QwºŠº²)c)Ab´ítçU-_¢ðGnº‚»…#D þqò *ô$gŒHCÙåvWF'Šî’› ª 9¨”bj”­P ÔhÄqz°æbÌhŽJ,+¼Ã a4× Àlk•ëGs¥ƒqHûâv.þ÷?ÚVZœÙÖÀœKØí­Ä_$ š“$ÙÊ„+ŒE�Sc íö;õ•dN›iµ]ë=0 ×§¯Ño»h&M„˜4CQÑOÿ™µ¶Š½}µ€ \,Á?“qù4íêÀáÝõ°ºÊ+ÞBDwŸ1p`ŽØnÀðîê úVq±œ´Ø‚aÒÕ‘•íQQøJ§ïjï–ûMeY4Œë¡ájou8¹ºúF¶g4jðÛÒÃð–`5èJ»Â-Yï ¼¬Î@ñ™16&peÐ/Û^¬DÑ¥­W X{$‡&a*PUàõÔËh9¬‰œ:»¼UíNìù†»Ø�¨Wð(O`9Ø{{)5Sq”Ñý\Y9?IVæ4A™+ÏC#5©H³Ý³*s:ÿHÓ“"X>$x|g» ÿïÿ&ý¡_j4’±²ã¿ÈǾ�ÂË4L…Í@ °Ô#ð'&ší¦#¿†îïO†!) ôbyžª­ëî^Ž+Ï©aþ×Êr½ø’ð…8?áû¸»¹ò�ü:K›o,œÌ �@Wˆ S­Aÿ}ŸŒ°)€¨·Q-rÓ5î-´¿òTýë±o˜ äãwî² ·•@“}-?5ˆþÎZ^“a-V¿ò¤¾µ\åµ(ôîÃÚ"›uš©ò{¹°Ìè$Yôonû¥QC,W>¾}÷��bDÉßµH/óïʳç¡WüÁåw�ð¤ºö½ê¾º„¿-×rŠÇv-¯ø³ ¸÷ãÆr’ëÜ-¯¯<Ð¥ðs_9M„’–¬JÆ—ÞP³[Úp£mßKýÔIÀœÜZAe´æ.NÉZä5㞃_k╜–w®³šªf´wu”é´©p´ïÛO„AZ£?£oK6ˆ$-Šu©áK²g¾Ã„A‹ �ªãpàMÚ*úÝÏŠÈ¢H5÷8^4HáK>ñµžï&¤4iÔÿÈðí&ŠTÝ~¥}wž,ñuD X -U¥ YL€ãî›dfžÂ�?©ê ØEzz]UÒžöªÙ3òrâ+UsË,–ÔûÈF›¸ð>«Ÿ<óIý6)`±²zýñÄt/8•O²š¾É[¤¯÷è)E‰šh�‚jšVIGêèe }9¤Ý‘¦'±çÙ"Œ$‡-,i"<ï{�H!‹A›%üª–hhÒNb¼{¿'¤š7?¤1¤±¥ß[j†Z"|�úG�lfÓC’^W¹˜û'¾m¢H©êS·xDj°XYõÄ’±†t8¡ªò`€&­ÝänYaùŒ$­u“/ *1®ß†ri’V>×Õ}Òìµ_óÞ�ðÞ��Ö'›ØÏ�BÒ„b�î«%Å6Z#‹tò½ßDŒ$ßѤÑ÷"Ånº 4iãÔ~’òI›v�´- u,éù£1¤ªÏþlmRàËíSdÌV«I:h¬XÒ~3>øÂ‘–ÁK~¡Æ)´¯lÈ=˜Mî2HÒ—qNÃ’¾ø„‰b“‚7v@Û¤^C…"†´x½Oª%$é{p0Æ’^y¾¯lãëgœq_4iëyµN{ZA$éxü6±IA^ie¡à[àH›ÔW…-£I«Ïôõ›Þm H¯<ªÚ ¹-ÚiÄT4�Ô]%b’r×zí hˆ´º�”(H:Ô»;1Â�þ¦Foïwëg‚}σ8kŠ?g"»ˆ�Úï©I|’ÂX'*MÞ=Å0VÎG§¾˜&6bS7]¼W1§§}ú©{ýˆ±ò2ÝZ3+lÄf~zøýt‹>KƒLVG[­Cxý�-ÃÊxó¾ú¡õ� ë÷y+b'ÚÇè"‘�>þ�õ*ïKœç¢Ÿ J[�µ€Ž €/[Q@�ÄÄÇ dùþo’nIIÚø'?Ç©w¿çœû†ýo%~ÒÃ/°ð¬-/Ö·:þè÷Y6Öƒ˜Ts7/#è)æ¡7C�a×Áª¤JWÉ�R©÷K?FÕ‡ú¨_}¨]&ÀïRõJ9ñ·R)'›Qüz{’>`4ÝæYÌ(èÔ¯¤¼tÆ6ö%Ûç_J*YnánŒ<¾\Z—ª˜üWxŽ€ ÖÖçÝ|‡€ÛU0­:q�Dà�Cè1Ë-Btxé,èN³£!Ûi°>KÒœZW¸t0”Ç�i .�)Ëé“‹S-ž#ôØL–E;W¤þ-§Âéyªÿ Ó©öA”7Æ�f†�SABnÁE¨&°\I§Hý3œž‰Pý?Ò�fGzO­­4ÝšþL3�"õÏt ÕÿÌáî‹ávNËÕ¥Ûî�íj fy¡¢˜ØzÌ™kw§«b>f¸G?sžçøNçý .‹ÙÇßw‘Žþ�ŽéÖ™�–íôÎêÖ·©™2®Ó?í•‘†ÓÁŬ¬½ñWjl Æ¬gŒ „T�¡”`Y—ø>=E¿ ‰žCœkò†ÕøÏ+˜ û›SIBlç/\£}ÁvÄS…·_}dú»)°§ :àŸ²d<Ó!¦˜¡•®½¸àãqU­ý^#©™1 ¹X“Œ'Ö^èÕÑ�Ží ÀVˆâu/'_çU >à²H+¥Ôµ{PÖ'zH±ZLŒzª_†øî‹Qô-GÑÑcä×QF~�€#?³bD†èé9:èìÐÉm¯þM¶'(t�‹yÕ`ÚCe5™Q,¾þ!´¼ˆú,{.b4S‚Ä1î;î�–“e϶•ÎÉJ½¨ÁoåÝëŽMòA•‡ÅJ1ë.HÞÅ"¡'±Ø�žQlI8°²7{!ðv£ÓÐ0VÈôDd4•¬­Å6îñ lG�Q;- SkW{¼8`Ûs+õÓ…’ZIm¶xSÓ1yw0FqÑ=5ý™wrq¹\Òk¬u>QV˜ºÈP²’õ¬èÃþ§–š¯ßq$$H´nÙ³cs„.¨s®5e‡V'ÚTÝ?Fa&l–NÍ7àŘk’õ …jìyínŒiJï>¹wêrgïžÓß93·›dÀöï¹k—^N¶ Ðz혅IaÆXLëéßÛrÓn'¦”ˆ†ÂÇ>» ÏÈ�Ä@b6bå°x0´Œ2#K½TcF’w]š #»»4�ßlIö{§%ïç+wŽã€ƒÅ@^Ã5‹˜Øš‘2‹šU!-׫ßþÎ4uR¼ê ©‹ýd+ð*Vá9Ìè~ù!wCÊŠÇUÒY!‰.\i7�ƒ<@=ßC®ÂBôÐüx=$��þ¥æÓÉuÿ(ÆÞæ÷LS‚äÓI(œqY\I{Q¾‡GJªº£Uì%~8Zňæ·bÙX´â¦øí8\Óåá&QÕ±+à<Úÿ$Ñ» Z:A7%d®8† lªV ½�´•�h)\kzÉ}ô7T„ÑÉÿ™ÐE³ìÕá<ût¥ÄªÎ$Áq¤éš‚• ×}áiÓ„}µØ�^¡x W i‡¶Ü«&®k�ÈÛ0ÿM§¨MqíÂv´Ëð9±S$c€Œ¿‰£ Š¹FèÍŒçí À´Æï £( ó{ýð¬y»¦Éëâã Ê i#ú¤a¨Âêúhðv-H)º‘ß&ª0ó$_EGZ�s}0%‘ŸœÚR¸ºQOÊoõ#ä·~MÛÚÒs!‘Œ?ùßs�Ú¿¢öøí>Ÿ±¼WœV,”$q%Ábù\q¢Xä‚'ì·¹òó†\ñŒ—ƒQc;۫0N¢³ÊÐ’Nu - «C�'-k©‹ªS€gQ�¹ÜZYUÀïŸÞ9;·Îâ,õáOH„ÚAQÔ:Ÿ6ÛéÃÃwlc¿·å¦÷¾ÀŸ)ÂÃaŒcù¼0.�z(YÁ®EÂ4+¦vNüG£wßa'z”¬b¶¤Çöµçå=à ‹ù�±Ä$jVÌT½‘ÈîI9«ûž»vÙœÉVI+…vÌÚ�0 ÂcŽ»koº�qi“ïK:(º—r&§“¼òÓÔ–Ó˜ˆN—ÓˆÑÀïò2NG4°/.Jb88¢Ý/É¿‚gc"šÅ•Öã…h÷ ÿˆ¶£”Róõ{æàÝ]»89ÂîC;1ÞhàŒ¹ØáÁïh‚t;äæTßm+É×E´ XS„«š\‚ ‹’Â"�7>VXSh'ÅTú8˜«ož‡ ‡¿ãi†›µÇ÷:�_À];aȯ2Þ;@ìþ~0«ãY�f�1µÙ:f�æ-3¥û~{O�bwÍ Øa<í¸K{¦‹+-;¾Ï9j4Ó�Ò°­@ÛË åiwI+ÆZCdŒ½† }OãBÈb� §A-êdÃi°ÅqÓ8õ=eH‘R:œ ¿Ý¹PðÆÀ˜·¾§q¡u%ÆÑ÷FOÕàé1Xll…Å€ñêMò,ì¤Ü­¼vTw6tçBaÔ`|O6¤sa>C\Hzɇ}^:²�Œ7öFë ÖÞé«Ô|3H&ÿ‰ùz<´ˆ‹}ŽÚ¥4·’–?¾C“Õ!J—Ädhl¿í¦Åeï¶~¿0Œy«'P±3ŽN Ì‹�ìå=÷¥Ê¾ø†H˳Pž˜®�œ�O2Çz9Ž´ty8Š;h üîÏšç®ä ¦‘-ÝuÕØ@�YÏØÀdvþåák€«”nË…T–JÂã6Ú1¦dúÜU§.}Á@>†±Ž¢°Œñ 1šïŠ�‚²‰eO2è¥Öùä5ÆXöç5A‚% K h+Ž�­b´EZiލGÆfÿ©ª„¤ªR[€?uƒåªW¿Ò\ýÙ—ÂA‰8~Û3ÀÐtŠLòá1˜P™•�w‘òJÀ#«©‹9Å#KÏ‹÷%rMóHN'ƒÓSmCJ*Ám‰µÒç•2ü éEQŒmøØç•xâƒG“M<ÀIy\Y’2è±Ï+»Ú¹¿ÙNNë‹Õ˜®Tl�‹¥€·rB‚ú…Toª¸ d!ÁnŠpÅ8‘‚$’¦«U:û÷¨±YHS±õ^9YB;mÜA±!Õtx�e¸=öÕ(ÖžŽ¨Ín|§ipw²�¬¤’\QèmEÙРº?CÞDÿ1tïñî™;>šžé¯ÉÐ7K­œ R#zŒP¼†«xÙËå«a�ýiVieåçB5¨99|%t4³Qç •Äî÷µò�l5€—§·æ,nõÀPG” ¼¤^³Wf,là¼tÈ‘ã Ã¹È$Y.„Éò´ tYà@‰,7i²Læ¬éT;°›¡r§Ë€H€‹ôDõá›)¯¥WIÑm‚24¯‰‹,ìt^jiqjT2ïK3tô6ÜiÓ-Æn9׈m”PLuɺì‚=ºÕ}?0Xús°ù¥À$Ø|“Dçí<ÿ(ïdÞüº™®-ÂiRäþ&iMåÔ�xº¿Äs'®¤¯Å@Sù®x[ –u/îâ_¶ �¦ÒiÃNæÐN™ÌÆT¯� Ç ÞÅm{좘Ò$ûIÑNFV}E;{ÛDãòdd'»“¬r,+¸âó9œwKñ¥Ã3–W)0¥é¤±)A5ÓéðåëÞSB+49a™…ídj ï7dx,Sš¢ìòÛÅ…òÕ(”ê‚9‰0Á™ÜOCÛ?/à·Ê„0W‹}›r&¾3‰NÝIe�&~1ff­Ê$HSE5n‰Ø2Mž±Òfàý+¾ @*©û° :�¬tdÕW´Ó›F�p˜�%/�BZ%�Z£åCÁë"éF;¶ˆÂ_ŒƒÂ>&{'èºjª\ÞDü{†ÃÚÓ¹@wƒ+ÆÃÞ4úRÍ{3g֎ƘbNŽp�ñƳ·gãï§Ä¶�Ö †ÐgJ›Úa�a$õŠìl2†”tŶÃŽøjÁ!”S{dl¸À�íÝ”T‚¦{ÆÊÙ6Ö0?øQ›˜ðÛ«9¨‰¨ôÍ[µ§ñ%æo¯A¼½ØÀßÍa¨×0ÑáS¤9šÑÆŠÍë ¥ ÂÓë1»Ú¹¿ÙfSYoÅxΘ¶¢é‘ì3gŸ—Ñ£WŒ²³íþu­ ’f]®Å¤vò0{–òÚgÍïP�UfœÓäí<ÿˆoÝ?�êºð·wÅìC1‹öD¯‡ æ�aCðÛfcH ¡¦ƒ¼—¼1$h@pňË�CYI1•¨wÅ"à>Þ—\(ûsA]Ü$qS¨.Å¿|cÏ«³¦¬åàãÅUžp§²?·“ÇÍk™1×!;Ø•®•ì0E*Ó±ùñÅÕ^ÚhĆT øX((¢#”ˆaé¬ÛËQÄüö²Ðtj(%†Ã…`1�U€æÅ]œùÅ¡ìÁ\꜀¯ø<P²ùHs,–E Êð×»à˜š%%ˆÜ£íF–ù1¬qŒ-ù¦¢q˜Þ^µrw#»šýU†ZP%…ki�ýEcœãpž/'ÏÝÉ’ó Úh $pnzâŽÐtùy˜ú¿��Ý~5gøó¨ßIûà#–j'¿Å²Ÿ¿b€/]Çr‡¹¾¦Ç2Íãb,{ÑþËv^~Ųý×ûXæþÇü«¿<�åšý}«ÐóŽÑÉdŒ‡\O~¢¿ 7‡M«pÒ]ÍçÿÄRyûúí_WîÝ$àªHƒŠ×‡­‚…£ÜŸÇv­ ta&'Sœƒ&l8h|å ‹ý�Ô0Ùý8Õôù¼œ~ ÜÒNã—/9®Sëòìà–ãô ‘ük÷‘S¸ù©\˽�S'¶Ïwê8óžïÔœj:p{XOÌVOë\�ÿH€Ÿq§å_IÞ»Ó6æôÕ0�Ó½ãÿ~bì¦ΜþÎLÙN˽ßiüòÝb9ˆ¹?×Û¬\Àú¸ÐòœN«BpK2×ù⽑à:�=%xðfYNÁTz¹^TUá¸æ�{ô—WˆŸ«W¥ïn£à;x÷y_ÆoOb ç«þXÇN'Ì™"¢`óû£ þw6ETJT‘KªÍ¸€)!ƒm_€­>ž{Z™•ªÚ½nSŠ]\ŒY”=»èåR¬UB:�qCÒô(AÍÅ!Á~JùØeìàîáãÉKbþ+`¿-c„äí1N-ÓäàÔŠ)”.¨ '3¾!NJ°“Nô¡Ç%<ôðÆc“ßÇ{¬�Bl\­ŸŽ³‘òÃXßÕÖ›9ëî$¿¼l^@÷Bª¤þ冤éQ‚²v5/ÖÛuùI '$*<;S<¤?ù ôÒ&_/;++5Ø^j\y¡á ô»Ó4¸¤¾Ûå†:ÀU|y„>UkÊ(2zÝ è*ÍMÍN7¯y>\Ê.§¾Š ô—UP]W½Òô†»\Éú:4‹æ#M—5Šó×i0fâ�b((jßãAÉ©=Q¿`ßõs‹JOÇGRRBÔv2¬Nn7Í€:¹“ßYgu 2nŘ”3EA¬¸KÄJ»CÌÞ1ïœz�–Em(_ÐÄïups5Öòù˜PHî~»Ë¼ö4¾d {ò['2ó¼u™ÒÚÄЮG7�à,t‘]hº‹Òé~¯—žWgM�ôô¯Bå‰Ë-ÃÓ½¬*KžC¦^¥&¾/|ËIȯsÀ“iL¬Ñ稳]…œÎDv_|JÃd”¥³n_:®P%…á(’f]&$•„S)V¥æ*«&ä²q)…Am/+ × &ÁÕ¼�R \òTÒçU ׳ÏE^įT·…Ï.Z¦É„ÿy±LðØ…2áqÙÅ•ˆ]DR“ŸW ìB §jåîF©#Ö(ùóBãôÁ<àÑ[À-Æ¿ÑSŠ’äØjêA½ã½ CˆA)�³,$BaÊ7Œ§õ ÃUDvòh\ QƒVD¾v„½\Š­+íd%® + WW²ûjø ¢ÿk“*) %¯›WM"Ä‚G¶a@jEsëÔ4Ý®vîo‚äØŒÄqãfžNP¿™%ÎJóòµòïŠ7¨+=!ÄǾÖ›9ë zÇÝ–imKN™+ò�Û «̾B¹±u;ˆ/Œ)‘è rt~¯×¼œmcöª•Ö0ôÇs|ÃØÕ=&tP(˜Ð·)»Ê]‚Ê÷‚5¹¨š4é/F“ (·7ûá&Ÿ6IÒÍiq‚tóRƒ^æWœu:ý©I;´r#™÷ƒ gÿ…ªSî!;÷Èœ)‡W•¸²¨À½®$%ãòˆ: ‚ endstream endobj 232 0 obj << /Filter [/FlateDecode] /Length 10233 >> stream H‰¬WëZâ:}‚>—¶Ü„pf¨ ÈŒ¢ x„#ŽŽrÿ“´¡MB’ðOf>Àµ¯kïµU#oÞÄ‹ù›@Z/—F*{›Éþ¸ÉgâÅÎ0å|[(X*zÍiay½‹†™hv™ ƒ¿}_e²Åß/£6h•2Ŷz/ÅÊÆ«v{/WÿSTï{£~¬ªö“ú÷lxoo‚«ª�s(Gg8âK4bÿ¤�«…Çà•I!WíÞÆ Õ€eáüšRÔÍ÷ík£Ö_Çpo{G–·ÆhÐ�SÞ²|5F×I­0‹þ˜+GÃ<¥ã¥é² ÍÎSNÚPíoK©÷Q%d&Úf>�¶`¯Wá@å—Š*Sݧå$0öshqÀÎV\(ÅÃѰ ÄMv™^6±|ƒiRùƳý¢©°VH[·‚ìl£ŠŠº¨zýóÝÞGYNî…Õ—ÄyÓçÝ�¼�ÌÄ1ƒ½Ã£zËG¾0q`c£†ÍÏ`å䣨%E>ky-`ŒÆ£ˆñª?–qæŒGI1sRÿ†ò ÅùѰÐØ4� ÂA]ëºEL“fðñKåí§—Ja]ìÔ�ãDÊ&Z+ ÕÎþ¤EXŸ½êËvXaº †62­§É‹ñ`œ‹'‘ÃwE2�t’»4P­§õ³fÂMt„æ˜ VŒX _‚` Œòý*š�«ƒ¹ß™fŠ�»¦_ƒT¢@“o´å$îº,�ÃB1c¥ñ…°ú’8Öó²*á�¢úà Âzíਕ¤aÇI”"¨�Κ)_‚P­öR/z=öûÆÝ¯^K iØ›mÓ|æÒ� \Qw£¡õt¹� !EB¸_ðvï| (—„ÒsŒKˆŒýâCÃÞlwR�¬€-ž8œ†Å£!¯ú’8’4¤Pˆ-fãLCˆB‘ὤ½VzÈÕÙŒ& 6 –³%´û7:þÕ8dÄ/Œ9ƒà•�”öF¨þ«v2ã´×Ó|ÏBà1›ASQ%„ŽŒÌ`.”¢J,»Óé‚zŒžTƒà(¼û¤"çÁ½-:=¨ù÷ÅéLe½Án1NoöQ=Íen1œ>± âÍ´‹rnŒV픲é"wµ ‚«*sµ ‚Í4QøÊÄ+|ê}? ´,F£ŒQ4|ºNP4ŸµÅ ,Dlnœ„ä„¡ hˆËÎæÆSÙ…±Ô¸[ —ðy§ÄA**ìõ*°÷�« Ýmûû9´Ø¬` V†d2VÌß4¿æ®ì/ŒÑ ß–¾+9#5Ir7­¬0„Æu ŒÂǩ݅ápé CÏ ø”' w†éR÷uMÖÑüØ0ØZ(Ü�\N¦¹;€VBñ?v‡KR+0‚D`(ó“[ö¼.5ü¶/|XvÊõ+þÞ¸ò Ð0åä‰ÄÖ´+iß•¢ñQêö“²`<~ö ÁÒ#:Âw9@—˜Yé»°åà±·pÜüdÚC¸Z.éU8N ÇGõ\/�xßÁç<ÿ'Y$*­2|î“™«\Ø-�Fe ý¯¿Â�t?k}{_,Mu�ó3”ÑíºÔ?’©åi-Lçs^FSÍÓOÝH�u׋Å� ì½ýpí…`£`ê­Åú%y„÷a4þ#ý÷†˜ÉÐìÆè·P¨=ûï‘m4Û{à]/Æ&eTQ=³ÆÅÛ¯[®Qͬ÷ÿá}Å�foØÑÓ_¥[´÷7ãQ yF—¡÷‘73„ÑÓZaþp#­þG�ö(£ŠJ$ø,Í5j\äŒ_£ßBáÖGúÇhïYQù±/–Y¾Ñjâ¥Ã5ª�"'ïžQ ÞJ�¤Èè•Î5ºX¶ ®QÀ—óç£;¢ª£Ü&jû¨ÑòÃë‡Ìïþ¬?>©ß¡9Füò[hþÇêþöE<~G}‡Öd Äüô“�î„y‰|xËMç‹õ‚¿¢ÜEÇ=ŸH­A±rµðx3C+änÞ¾J¥vsÞZ„Rª½Ô‹[JÉ~Ý ´ãŒõÇ ©y™.)ª”SÁËv J-l”÷Ž"ÔÞC“ÔíbÉ»A­+©tÁg«A¹d×…Ÿ§(7Oäf÷)PãÜ<¹2wÏì”° óUÿ[ì%ªÙíÅÖÖ½ÄJ¬`ÅәȘõÔ øß¬öÓrB‹ýZÌЊf㊠�5aÄ¡…$Ĺ1ºNj¨jÀBõ9Y®^øG¥9Q±»Ôœd/È£Zþµš‘[…sRUšÝ•€•,¶YO•Ôî‰ÙNKa§Å½Åö¾Z,ûÄ@Š*›áA¾˜³-2LÏýú\n .ÜŸðØkWàAöÌOªœ�ûŽS™ L!àƒÈw­ëÌš‚M“‚rg2}öyžåçìFÉJ—ruv�‰’=ùöƒe,Žg ÉÅÍ%39��±÷Xö\Ý^Èê¤úxФê)·í¡ÿ»åyëúaUWQÁÏ_«¾Êͯ¾èÇ“Ó5k i);\7ÉÄÉr—‘ã’3ÇNå‚‚¥æ«Æ —ÞÁýÂsêÜ-ž„¢¬Òó~[)õ׺DíúeŠ�»æîõs§%^Á…«Ìn†½÷3c¥ñJÙl¿ŽggÌ„õÚ×iû«2FN´3–~^—l0e…©CÈ\&¶õáßÚÁÇ,ˆ�ªFëC¾fïøšøôtXé 1É] }°³É¥µ§úþÖI÷Ä|Pý²SvýVEúÀÃw%uñ 4ÙÊp•’QXú—M¥Ù£´ ãÂ$u²D…ª�©äj!:[¥nŸ*Éå³°dÍ W)I¦ã-y�¿ý†™¨[r·�€²²mIÊ¥«ì©ÇpmÒfGEª§b¤² ÕÓóòïŠU5‡û IÀ!C1bv‰4Š]Id¬ãKßÉO .Îíwé� VÆœ2Jj�ñ¥ÄÈP¤†È“4ã½<±æØøÒW Hæ‰:LA €Œ T!7´ÊJ,'(—UäTo¶ƒP¸¬|Q?m.U–Kà®ÜÅ)±ˆàºäð…tjÄ䯭�o¶Ç6yåž­¨+Î1³¾–¸s}¯Ü�:© 3„lÝVµ<{™p>ƃtÓÆ8ñ¨�ÎX2°�äÒ …MEÚ©4½Ð2áï�+Û‡/¶’ð -†f÷•ŸÚ/,WŒÑ ßö�*ªÙQ±»TÜf/¦“÷ (7ψ;Ç~€•ÑuRãɉ:°ò4—M 7-À µÊ™‰�û¹œŸs³Cr–ÛÉÛºÀv�ì©mÁ>k�‚�N¾"#Ùav´`ߥ6J©˜¿Qý@(Ÿ°n5 1;¢Ø>Ñ©JÒûEuŸ–p7@!W²¡¹ê‚ªeþ&*Ñ¡Âþlx[ÓUã{t(¨ùh9¹—HQÔÍ߸cVš¸Å¶z¬øÔ\.1äšÜN‹»+}T/ÈÎ[9ù¸'{�XZ"œ‘:¥ág>Í ^tžëÞÂ;T+ÐT®)¬’Ôýb%œùm~òÁÝÊi‹�jVøÇ.óöÝž=³mÞce˜ÅˆE‘ʼnâ�s%Ù8ñ/‰*ÁB±¹¿Α„7Ø&WUL]P`ÉÝÁ8R3µùBm¾î�w«±™#}©(¨ï�•ôK4Ì•¹»ˆøñT¾jé”L—ÀÇ“`WrD„Öäqbÿò¬€ÏòS±X&Ž”“™¸kc|gzðV�ë ‹™¨ËÎJ‚™rÚKáµ®óÀÒ_À}�ïÛà�BµÛöä…âXÙ§#®>VŸÆé;"*\Äc—ÅÎ8$ ‰+×­Ú)ÔC`¡ãÒì»A¾2ñ ŸzŸÆÏ6+V ä]Õih=b4 ­§²8�LR$„±€BNÃ7}np›]Qw£!“bIB|Ž‘`2÷¢xå�l?…VãÝ—†Š¢úâìCC Uÿ`Іü-æ�ç¡ç SØÓ‚ýÏz•ï§ÊÑ'ð!@Q�¶Uë¾àZ—¶Z½¶nW»Ùj}ÿ/ »WÔ{ýþáI˜LÎÌœ9™iÿh,ªE¹{G  ó¡%÷Žªìè£óдt¤r`‰;”Kéy©L¯)y¯]ÎcO%sô]<…Î:Ëeë� ¯.Ï9Ó{¼;„¶�:Ÿ©D’·\þ;¾ƒ9æ¶#†óŸÊe¼‰¬¸Ù×�ccgUÎõÆ‹-¡÷QrÚáò´‘@ŽÖ’Øx æØk!2t²î¤–1ßêˆ\Wäðã¼2«¸ ]»ŒUt¯ü?Êžj¸õâ1¨-�BÀîb®Þí„2A{‹I— (q6”>Ê̱êŽË�CîWž¦|”ô²Ë×O% zÆ¢kOcrà¶Þ8]•jÇ�Øõÿu¯„±ì�IõàÀ¾Ýgöý}ix\"—Nd„�:CÚÂPÊ÷üž0„c#í¸0„Ñ?- qÿ<" �Tp°z÷;ò�¥âÑœT€ÃPæûKò„óïƒû ŠÆ6�ã"È¡aîuϹYÉÃØ–:­¨ÎÒ06“èÜ�êšã]ø$Ï4°˜Ž»Ø”ÙÅŽóh2…ˆp¤å¹šƒ�:Ç)Øngd„gsÐÙÒj‹íŸíŽy7£/Ðx‡›:¶†¯Ý„í N8º‰#嬛5Êì~¿„í±ôÕÝ g“ƒÇ~°±t¼øÄÀà´ vÙ;ã2aWNPúä@©wŠ@Y4 båNœ�js ߯o õµxwrAW¢Ñßzj¢1ÇÑìîcáà£P4‚“lF ^õx1)ìïH‹c z+l‡Ì£·Á~EÖºÞøáI§›˜‘ÓÊq·Ä"Þ ˆá‚x[ø˜ "º¿(ãqö¶A¨88JIº‹Á·‡‘{{K÷Þ,Ú‘ –dÿ-âß[舀?)ÒÆÛç" ÿ¨0l:µ^‚×ІEŸ,êÈx Aóh€7>QÃd�mé÷rÂUä¾× -Wzz•Yµ¯Œ™a]äÀjbºY³EŽÚ)t¥Z¹5Ãh—«:çœêŠs럈sâ-õjMǨ¾›Mýb¹AN­1t{yyùmMñΉŸ@c‚¡Û®šð³ü+×�kX*W¬œé; ´³aë¸c,á˜ÂùÐMΆ*{‘Çl‚¨0Ù´ƒ„Ô‚¡m·d‡Ã�~vEü‡¡=”…»‡¥ ÿ}„1ð'ýh–…D¾�0hðxS…¶�˜»L`à¯ñEaš &ÞV¡®’,E?­L¦ B-÷;΋ë¡[§Ôˆ›¼9‰¡¸üofM~ž2µX'++ÙÐ2L±:OFe ú¢™É�’‰ùû�DL£òS¸Ë6Ž+³�Àâ ¼7+øÙŒ˜õ��g�*߇¢®…ÙHJÇ«ŒÛl*›oó(6ayy�-ò¸‘ÃϾ`ü»óm$ZÞÌ�¶Ì4Ò†?˹lOI#BãŠ�&w ŸÅÝs Î;¡¾œ„cñ"ØÅþ ^oÂá ¶¼ièä!ŸžE÷ ®7*|N® Ê 8H‹Et4Ä0©�N0Ñr4NS³,~ŒóO7ˆ*„:JaKGàçxk±bÓÛô1 k0 ¬&7à Öd;$…²Ä †‰-¤¤Ú¼©%«ÂG‹),(|p  Lxï*Õì› ~è™^³®ÞzøðTîr+0}ÃØLe$K:Å:ƦdõŽpôiéE›-ó_äJ¹ÑÍÂÁ?é›^¥0YææpÓŸ¼�2_N0(Œw(ño`îÄDÅr—Fa|k!^á ’z‹"Äšð‘ú¡œJ ©h»¿è³–êËË�Dª¼'ol&  íjIΩDÞÔ ‰©òãN“D‘Ù(Ví–.§tŒáƒ„™Ì\Ï  ^ä[l†‰E¥âw¾vX)êBÎÒ“ZÆé Ôh®Æª+…,Ì»ØF5k"xµVš�‘…iŠ­—¿&Ý&lÂ0À}”ö °…@¦dh~,é$:>�m]‹ÇH2�)ƒ9µ*ªjjv¶|(5RQ(l/ òJØ3Ðï·sºÔ÷S´CæâRB ¤Gºô|ËËÁÛ¡Ó«È¡¤_ð콈>ö¢�ý?kf �·N‹KE?aRzëÀXöwH½ J& ñó»u‡‰&.ì €6ôÎ>…§¦þKI¦ô»z÷Q �¢:ˆ–á”ÙÝf\v„­¸ˆ¨6 šb‹é£ ¿)ýºM—LçVby¦·­}c0_"ägâÄ*pÓ�u öyóe#ý*³EíÁ‚àÙ ÁnØÂ ]t °†ª<3A€w ¦ðk>2!€Þ8!¸Q÷ 03Ù B8à!Sج�²™.ªzÞ›ê!ñ‚2¿ KAßT¾i- ¤�xfvb÷‰µPÒ!Póƒ!Öcô,pÿì‘LØ�"•$&‡RÉÓÎd†=#�å"Ã÷A¯ýãÇà/92ñQ—xFÃY•Ǽà.ÍiŽs°¥ÛĹHp‘3Ž!g;4¼½&¦™–Û„èqŒs¡ä$ÓÀµßGÙÑÐÈr½àZ)„í•�•|Û6Ö)ß’;8ôå9Æ\šc‚+ÇþÉ„xyŽ1—æXØ3ÇÎ6ÁŸ“ È€•cC¸JÎ.WˆØ?™Î)WÛìbš8Á}§}؇"ö—ÑΩø=`&»L\ ‚#vö1Ω�C>ÀŽlš�.¬ A>§#W¢©»«›PÓW²Ë„tQÀYâN#qܯú4|0jÿRäÂŒ�œly¢yô! œáÃq¶”D÷§»«H²}σwĬ†¯u`ö.RÆý¥øK÷²Â6YËOêßoT´YìH¡4Y<| 4ÿFÿnàÛ´WÙvâºýþ¡À`<Èa´™B€0t˜! C k�§ûí·T–�“î^§ûœ{_¼,—,©TµkïºÝÙ†OxÖ•dŠv^©W±`¢J1‚�*ô%·œ¤Ç‹Qi"ŒjZ¹°?w»W¨ãƒw¢O‹×Ц[ HÖêÛt2£wÖ#êõ(Ý¢„�+Z¡¯, ÄâAr%+�!ѧ†QÕ§\¥ÃÞ^]¶^Uà Á£kRèiâ æRuîìÅþ[ U#þÃ¥ØM½_¬6¡né²ÝÚ:´ëòœôôÒáVüÈñ/oqÚ\Ý�m�I–û7”Iá'!šcRnBjíìŽ�T%ƒ6A‡ŒBÂHœwÓf¾Ë§6¹”Ú  WÎØë|ÁCL1ÕŽú°5œ~º l³nÛt—r�gÉz%O�J„<—žú¸Ÿ}éÂð–+>¬÷IØ~¤;�ã”V©±eÑ07èÄj]r]Ó±!¡5ÙþP?@³`=«¤¿ñ‚�ó_éy=¼z©j•œSÉl/ã¥Ù�)¤—ò¦’L4œÛÖùÚÝÝö[`©i‚úr.\%n’‰r)cެZ•»…JW �¤çVV¼íXÙðb¨’ÙsmvhùOiŒ ba{0é¦<}øá›‚ªhÊ‘6:‰Øï�ÿ_à1ìý/�ïkÎÍwt±ØëW¨ÿ´�KÉn¬,2eŽ?5s¿Öä�?€/øonâw@Qù� ðG uì7!`gŒ^¿t�¼ù 1㿌0¯¢·á/\É¢E1ª7¯mè[ÓþÛY̯>^„S¿ |ƒæ†p*”êr6‰‚º°O1×·ZÄ i%žÜ`÷4kN ¥ïÀzõæÔ×)ÜÃykà)¨€¡kºrÊÈvŽEÄKb™Þ®O^A¤ß†ÚC`fª5KrÔ ´u)§=(œn‡›®HQ©|^ñ³òÓö½�K-ÿh²t•Ä.Dr-•.!±ošˆsÀt/ ‘Žf4i•&È‹ÈSŸæ%BØá<µfÆïÑ—/  (ÆÒ’sE•¤a<<+R}Õÿão1™%Ò¤¿¦�çV¿ªÍw¨ õqüÄ[~”Õš6ËÙ^§AýëÁ=IœÁ§F #p¡Af :RÝÈ4ÛÌɯ±!�ÛuT«Ä#–›^ Ìzcx€�tðä*\õ•zµn_ê“Ñy èöÓ……\1ø»Z•n×ÊZéÀ÷‘5øˆQ'ÏåRA¿ÿ(Ôh�ÂÞ€)Ý,Nñ ž3jàÜìJ} í Mʦn�Ôš~ ǡԇÊê£yˆÙRÅ“ ¶­- Áô"à>à¶—–é¹ò·f†sžàÎÓìļ„¿tÚŽJ*h'G›�¼±‹™‰˜…G|çät%ìÖîï°‘´y}\4øb(/�Ðè×Çi}òªÂô9½ ºÐÝ1]G³£öƒ#ýº§+Â#©Ëc.�èõ]‹–ü(…+Õª6 ¼}G=ÄlµVèO$êŸÌjdìû�‰£ð(¶Ùœµô»Ö:D£·÷¨�Ñ{ªHlh*TƒW÷GrºHö]Á|ž ‰Þ©´5ÁsL)yœ9Ta�©.>¸&ÙkÇ—®�x ;så4�$iÄV£ô›/ȾvÃsgúµä�¾Š.\ƒ‚7¡U9ÕfÍŠ\¢Ø5äÓüé]%å®Notðì˜dîBú‚4é$xÄ��ZU™eÛäÃ!ŠV]Á)¡>ÔšV[Õïs  :ìÛËB¡„&ã'Áæp2¨b$qSK±mMåD¨©åXx4ŸÎKÍÂkŸð’U‹³ %.F«¥çA¿}aiÖ½þo—íª_È2èj>Åk»|'¿¹£u,©F‘±�ÉÂCÿÙÕ+†›hSo¢Íë’‹‡S™ó6ŠN ØÜ˜R‚^¬'ã›ÛÄHzahT(ÚP/«øf’oGXbCä0}»î*°@Ys¨Å/ÃÚù°ý6 ˜i_��g=ÓÝóÌaƒnÖ1¬¢"†1æ‹Í/�Íg)²óÎÙJp°ÖÚúØÝR î@| ¹³>:kñöᡘ˜æ‡òS2\Lt è€$Š]²+äùKƸ‹cÚ‹õ{ª�s`•,»WPÜiå1 z† ûhSƒúYˆóŽ�VÃcfO)oŠ1ÅÊ_‹`]Ñ$3èB³&±o]M±Ÿ‰÷*æt�_xï3SWÕØ¼–ý ö=í(Ýe°Åt ®ϳl,›’ýmvV6(WF#O‡ÿd| ˆÏ¿%ô˜ö�´?^—ïÍ÷çÕóæ›äKùH¾ªiÝÍb[z_.;Ë¿ŽÖöáãm¹9~»øFò·fµšˆYˇíb Ó©‹Ó¸[ÊE¶9C�ñ+y‰b©`=&Ë늿�žY�ê ãkQ:{*Ì+ ÒÅ%ÈI“ň“ôÒ-®$:€ROrŒ…¨6ô’ ²5 šˆßZ¾>Šb£~‡�×熣’œvÊ�àݲ�#‡Õ%©ä‡5Ðç½Û9ª[¤%çúlÝ퀾¿ŽÛGvt îm'õ#Ï —×QN&¡œsm�/+A8IÈåè×+N¼9»¦þ]SC–“óÆ‚“ý Ùûßi§™`ňÒׂ×EžS‘,Mܦ§µEb\@¡J«UÆÓ(!Œ°mu`d÷M(!ØÛËùQ`tÚ‹t(²áE˜êØŠŒC”Q¶Äc÷âè`²ªºâÞK"™¸p2x=ȤE��–Ç`Ê9pÿ Ur2�Ô*ïšÚI@°šSNGNß¼;Lл É³7…Ì‚—"P+¾‹ˆ% ²�d嶆C¦ÐZ¹ÓÚV‡Z%D_êв`÷JÏé9Ä…2@0لжšÄ¦ËB€aW³ùÑ.Э‘A2eæŽHÛ1?ò#c€A]v7�:»`²áÆ,2»äÝV÷å‹ÔrZY>è}Ìúë�£à„ó´âÏÖ£"ýVÔC™3ËYQ¸JÜ$åR.´ìXÕEšs(´¯9ÒѽÒF^'~–^ƒYÔCˆžôš7mþc eÞ%,íç}”lU€·‘Æf>Ö3ɪ±šÏ _Ðy_Dq Úu[¶IrÁ_ìaØ'ìïõHuÞÆš‡CÙzơÅá1Œ9c¾ ëOû úÂn‡.Ú#¡ÔøÚÏÚãV�¿/3´ZB¡¡Õä’¾]ÑGÖ®5Ò~×üy™qëâ|Áž:v˜¹±aî6—Ä;P¨«2°46ždšÎ*ë^îŠ3t—…)pª§@�£àޏú›è–<±Uu¢O+ŒÔ r€ÄLÒ«Ùg¿\r¿?”ÁP"`è¶¾¤Ö'!…ÿ’^­miì@øìXP� Iö‚( r«(ÅŠ"+[± —NÛ/ç·ŸIöêµ¶<}Ü&“0™¼óÎd&ê|øÔì¬X€°ŽÅ²n¶ÈÆí*FJ·Ùœ+=äñƒK¶<×xO1z^Ÿãã/¹~�uà}qâý8¯AxN>Kp¿1×X©Á²é™�MIežMyïËWÞ<±b©åEoôEÅVågd8¥�anôùÔ7‹–µŸúÎÕ?zØ «)Íå©ÿF”³ã¯x™Ãf+|N¹‚\þœ+"¶ŠZ/‰ž«´ûñXÖZ/—mx ¿åžqu¹2}m¿ñÑ+ú…]·á¿û¸”kØ „ÛþõµŠõ3Õh5*P^ºï5«,“gÒããS5ÁFÈ“¥¸ k“çàéUÌ²Ó <ŽWä]ØFñH.t<—¬õÝ>å±ÁbÆv«yS©ÀvÁR$öĘÌ1Q¤»haÆ'r{O-ö€‡Ø¯f¶ì…½Iû,ŒÝ‰p¿¤~?î�þÞûe8í vÍí‘bùë‰ïvɸ�˜œnŒqj¿³fPvhØ9ô¾qÊB<ìZãã~÷!"ñkK6\²ÄA*^ o]€ÝA”…ÁmúðÕƒàʇîÂì ‚åõï@äÎ|äë Ñ}X3Š‚‡ŒcŽK>ò皥J6V¡{ý1œv@8\»±±ù „”åuÔ¡ó*—3ÅÞ "1Ž}FEw¾ Ç*½Å»V|Ά¾õ±Û/ª0–›…Te´ö¢ò/½ÑìÍ?ÁiÈ–/8Ý쿟…²i.ýlùî5âÛùâböLÅ,ô{l(Áûo[a…]Ý'_®žvïƒûº=�¿Ý€ãqù¦ÚzÁ±æÓ†;ŸnÌ1sµ¡ “ÐÆ»œṉîì�Rïk†åqìŠ\}t�ѧ¡|—cãõfÞèöáj#öª0þ,ó±Wì¥ ÓÚÌÝÑò¥Ä>Oªîø/ˆ-Dž©˜®7¼†z+2 ùü5Öá¿´Á«“¯¶¶~ŸtÙóU„v.GçA ãý7 ð"„„a.6±�eKc´!©ŒñrÓliLW¿Mu¾CÆb¨“ÿ*Ä�u(8½ß ?›F·x«ÀëdÖ�®ò ¨ëšWáíð ›«C�˜~OhûÛO=ÞÛB{ØUS#óxúÊ>ow�>Uí-í¾ºŒƒ?oÇÁÉå5œ²³²º·Ûµo$œdÓ¤3-"VoV‘÷³T¢tÙ©2kzrþr^àÍ*C [ÏЛÝ­¿ð¢ÁõèN¾~à.”Q`áf}{èŸRÇþ’o´¸Y‰w[Á“+‡ »àÉ•ò®¿¶�¸•z Q#vJ¥�¡¬Vòvæ øTiS¦;Ž«ƒUÆQÑ,&Ø–$|Òð86k»n“ºŽ;]`³Žø8 Än¶0«þ |†Ì/©fÇV+ç/ lç”¶‘„Í&®vkÜ—pJ‘ì9‡vˆŸ"tYß3o¥oÅ‘Vn&ú–ΘCŽ1Çw®‹p WÆîåæRÎíT»­Ôi|KŸð\cûµö~¶xÔŽîÝGé“ùÑÅÑôFö -\ÇomþJ÷�ÇýzÈz]Ƚî‚Þ5êI!â¹l€‡Q•™ÑB ¢$ô]Ç’=„/wù@?�ۣ•\=˜Ç†] R®ÆGŽc�•Ç |"œ·‘~Ówøè>ŠÙ£Ávqß±g< ž5Ðλ J¹DOYà^©Î]:x‹·fnÿ™ð s¾Ã}î%¹1ÖœÙØ¦:ã„Ø·@ q¥Ãͨm<Ž¡eé~¼Èà”Šv`Kw`Q ÊR‰ñN‚»”z‡L�M�êö÷;°½ø…ß\b;º ³å!¨]0<¥(©Ü¢+;Øa¡ÀlˆxŸ[Àl¡È¦Q�K£îÒ Ëh ’ÄÓ;׫'vr!ÉbÄðdIGÖ&,Ü@ŠJ_V‹wã£aOˆw¬'yž-OH V ÈùЀ…38 ;ãd`Wï9\¬“¶l®Á Y©±-¹ùÑò¿a(U#¤_š/ÌŸ«ãÙýúÉœB�ɹ¹ZÏÙµ_0§õÁ/ÓˆhÿÃð�}Ó‘P]¤ª •Ië†+æÔ‰$Ö§B¤Ÿ:²VÇ�÷«ÇÙt`ý³LÔ9­·kÇbV´÷öaïžkpvÃ’$áû`a_Àâüu~)f-³t`1U¶L³=Î`'Ÿ žÌÚthþ´çç«™õË�ï v¬M¿`òßAôCTÄSñú‹CvHKà;†‚&Æ$±óLpiŒ(üa¸$Òı@UŠÒI‹„ÈH%Š&> ”b”N«Š/›”(ˆRMóeë(C@Š JÒ]‹‚'ÓuDôŒ*Ö*S¤ËØ�vYC &Š'¢rÁ]ÔUD3r`NPšh:ÓìŠÔ4ÒÙÿuÿ2®4«°‹Èª'¢š‚4ª‰šŒÀ,ÙŸg�¦)„)v$Þ-&‘{UW­Ç+ ‹BYÀHuè5ö¡Ðà²4“fH¿�N#…`DS0DÖ<Éè(­+°GA2Õ¨/Hg�ª�s‹‚'R5€ 3,|AªL™ÃÅJ.ظg;s2Ð$�3®„¹JEŠø�çW©'p~ÛU$�T€;à)BmÖyžòð?h2_È&`4ÕUQ§*H½ù®Nd 'ÅÎ$1.Ô v€tÀÃwrCsð`^XƒÇ ¤ƒ‡åà_SL§³Õ`eÎaE|°Ì%„ž).G³L?q·Cbi”…ÿ_?ùõ endstream endobj 233 0 obj << /Filter /FlateDecode /Length 3791 /Length1 7261 >> stream H‰|V xSå~¿s’ô’RH“ô–4=IH�ôBiÚ¤-µ×ô‚)4ÑI[ÚBa:©:±à—鹈(H§uâ¬0e2Ñ ¸±)KçnȈ€f_NKuò<ûóœóß¾ó½ßÿýïûÿ‚Nˆ¨�X7:gåÙ¦ù”Ÿ†¦¶Æö �¨PžoZÐ!AÇ3ˆÉ/aFûÌ6•o³‹ûv¶™?s΢'(Ž-"·ðô§­-�Í_^ü( ^ÄöÎVˆØ¡ä¦z¿†·¶u,¬\ï-åþ ö±vμ¦Æ¬ôÌ%€¶ �¶5.lC‚HÈd{inc[Ë´¹ö�0PœoŸ7¿#Ô�ÀXžo¿¯¥½Hç>D¡‚ÖB …pPðóÈêþšNó7ÿáÕJQ%pQlöÕBºÅ]6¡ ×5…p&”�Ü\ÃõªàŠ`WpQðÞ`U°â“ ³"j?þWK 7B|ÿómt¼Z£ ÉméVa Ãê[愸Áù‡˜7aÞ=ÂÌz”Ù·”y×ÅüYŽÌA?³r5ÖàqfâZæå:¬Çldv=�'ñsfÝ&æÊfY˜ÿϲ¶³v2{v °çEVÄ^™AVÆË8€Wd½†n¼Î<ƒµò&ëä-VÊÛ¬•ì–°VްZÂZù-«åëåCÖÊG8ÎL?Éš +æþÈ,þ„OïÓø3‚èÅœÅ9|†¿àsüÃßñüçñ.à_øÿÆE\ÂW¸Œ¯ñ ®à*Ÿ‹×p7Ї�ˆIAJRQERE“šb(–†Ò0ÒPiIOñ”@‰”DÉd #¥�‰RI"3YÈJÃÉF#h$�";¥SeR�ë�²i å�ƒr)�œä¢|* B‹â*¢Û¨˜J¨”ʨœ*ÈM•TEÕTCãèvòÐxš@wÐDª¥I¬ÚÉTGSh*ÝIw‘³¨¾_‰ÔŒû©EÖy‡¬ò&Yï-|²´ò™ÖùZJ+h%ùi­¦5´Œºè1ZΧÉ3ô"í¥Â'í£t|³dxºUëÝOô¸¯›B]Ýp§¼Îºë§evƒ2$©r–;@ Ü2xÀnæ–˜!UD[Õd¯Õ'ù%ÿ¸f¿T%µ666¹æ‰¿o´@�w¿§xÍ�RŸa°Ùâó²EØ�Böã÷±‡ÙfËØÁ 6Rfx¤€˜Vë�ä tº �R·Ï`6K•�žZo Çm0û|l¥Œ”ë‡g%ÄÁ1«ì܈ì÷Rç ”ðùýý=«9Ðé÷ü¼Ž�~7z¾7@øþ@éÀg"ìQ´UvSg­<Õi5ÂV³ÕÌqúÜŒ•á©óVr¤f_&_”|¹Ó!á_†üã=�=Æ¡1kFð“CksúN nÄåþ äc‚ÿ|Ð%¡‡¯8P¬aÖ›óŠEW±˜—›%X-±BDåårß‘côºX�–ÄyêÆk©³Ï¬¯ï1$eÛ´éÙYåézA“§49ª3‹§•¤jM#H¯-)/ˆ)*‹S06)Á‘_2Üè´'­•7,>A•œ¬Kuy2ÓJò²Â—¼-t‘¾ ë|;ù/�E%c;]Åäȉ×kbÉjÉòr‹…p, á²(£^ïÈqº¾Ê¯¡VGF» X–ÒVYÛ茋ϻÛŸ�n�Nu”oˆšà±¥'Lm*+UÓ;ÆeœZ=L©›ÞÖ÷±RmÌÌ7kOE©²Š¬CN 1ÑIöT§C-öÿ qð{ƒpŒ/ Κ6×Éa%h¬Z�ÊjIË“»m”FQ>)E§3uºz¨V)ô% [t)ò˜ìǺ(”ò:µ¼RØ­×™xaÅ‚‹“üÝ…ÒUcnMFFM®1ÅÑ_W�¬ž^X8½zäÍú›tO~jj¾'ÝîqI’ËcwÖW�U]ïtÕ‡�êØ9¡|¡DÆL¿ÓÎòàójFh¬tÅÀ;™Qý_ö«.6Š* Ÿ¹³´Mk±üô:ØÖ–nÿ,X j+ݦÝ@—¤ˆüDh;Û�m¶»ÍìB©H$úBx° ( DÅ5Á'‰$F|`‹1&Š&¤4DäALj °~çÎl kÁòÀ{ó͹÷ÜsÏ9÷œ{îÎÔ,nuW¶.ο]¯ŠŒŠ¦uµõþ–ÒÒýKÁ‚¦Øfaݪ Ð……ËVæÌ+É|vuÝü¤ùçÜ·¯ò9kÀc�´OJgVÚÏ.Ê–qSö<>#{IÑ¢¥Og6õê¼Ê¹™OÎx,3§´¾äö¥e}ç<û/MI¿QWûQggÖ S®ú;§ålsáu¦ñŽY㉼D¡kD=._DòÕP=–(¤|×5Ì>åI}ÍTÆ”q®Ç€TEne„6‰•‹×h¡ºŸ4q�ÇÉùT°m¦¼_¶™J±wiÿ^tLžÿr¹>‡öñÿ(× Ëß‹¢ž¤_—ø\&~EŒÆ>ã2ÞñÄyÐ+ WAo�þ…\4ò™çP‹qvÑb®EY\�¨ wh>ã¨qÔ(è"¦Jê�é›’òY$Χô!…ªC´R¼$Çœ[Ä7•r­Ëz³iÙĘë¶]3wQÜ ².S)Ÿ¶?MÊ÷ ×´<_ÌÇ�Âu�JåÝ‘b›ã…úP¹®e]�S øØÏ5¼œÔŸJ“ö(-‘‡Z{¨ª�š,J�ZgÎ;Q«÷’§WĪPQ§'×7@O“[= Þ*Sýþ1ðŽÓµã=˜¡")û=ø,ÿ-þ/XþðYöSðÐqŠJ…�\}ßùÌua/Ũ ÔŒÜîQ�ÿ´LÜ-ëä=]%ë)‰aÜSŸ!ŽåæØ€ ð±�ÿw€ƒÀ&`5ð"°h|@=Ð<í˜L?vË€÷€õÀa`è^üÀ) ÓáàpÙ¡?rLd,ø=Cü�:oÚ­ã¡¶ÏSÚO“ umháGíQ{Ô¦nü:­ŒQ?¾Dc”æ¼yÏäÏ%Š/T?A&Þȇ’/à˜›‹‘Ýw¡ÿ±ÓOCÿk§ŸN{éÛ�ñÀ]ÊuË€ë=fÔv/fé£O·¶F+QŸ®a;úäÌîIQÞ¬ÿ.eØk·aÅtÐ-Û,30»cØ_´JkÄ'b�,2©‡zq24|Õ ÕQ¥Ó[^3éÂl„Âù0Ò!¯QxªBoæC “š¢rd€ Ûñ´%×bÖ”³A©�möAß hû!­96 ©%€±)­ëx²ì€³fütFh›\Û/}ˆàÉ}^Ý'íE%—5D`y:{Ú@íäEŒÚi#¹e¬¼Ð§c6$}1£¶‰ý®Á¸>„ a=àÚ‡)ÍóvÔ÷Ùµ.£lg¬GÆëÎÈÇÐcý†Ì”E[1_‘¢•uiNfõ)×L/ò“Z“§ÂÏì3Ñ-91ÈÛã-ȃ%exvcÆÎ}Tæµ7Œü%NàŒOñ;IäþW€oÿh endstream endobj 235 0 obj << /Length 307 /Filter /FlateDecode >> stream xÚ…‘MOÃ0 †ïý>¶‡z¶Ó|í6Ä@›ø¦;'>'1&@ÛïÇKZ¶Cªd»Éë'~‚W 8-èŸ|Ô£kA �öČƃ‹‚ ´OpW^Vµ¥ò*ÅIŠ7)ÎR”ê¡�'´ÑñŽS³Gñj1šCæ,öʃwq§ÔÒX§ó$ÉmU;)§Y-Yzùù Ñaó«˜$àE.ªZ¤[9Ûwz¥§©�Å`£NÐé-$‚ !“¶úPÞ“¥¯çÊP¹]~/×yu›%ºÉ;êŸ÷=m Ö‚€�Å£Õ“«Y<<®ŠÏ‚‘M�NrPçÍ®³[ÍV ÇëâZ¿žßKêž^àûÇH.úüÖŒê;‰Ùkû¶É–æ•P¹yÏ?¦s/$.WlÇ �9 ÚU›?þT†N endstream endobj 241 0 obj << /Length 1904 /Filter /FlateDecode >> stream xÚÝY[sâF~÷¯PåIl�]Jžd�ASIÌÄçƒl« ¤YqÍþú=·Ájf’Ù©©J^¤ÖéÓçò�ït7¶©=k¦6¾ú÷•oS³4ß4ý¾æÆÀvµÕöê·ßMm so5Óp‚�öJš[ÍõÃso´ìê—+Sl]¾oò«o=O³<à œ�–?iV¦,Wó½Àpm_Ë×ÚozÒ»öL}ÞóM=¤aJϘžvïÚ±ú´÷{þ–­ÙŒ‡Æ|lyàŠ¬€zßÖ‡ôŒè9ƒ§¥g"9®?Eãy†éÊ@ØáÂ2�~`)�1™J�.,qtwáÔÖó£­�ôûÚº¶½�aû�ví¸†?pÙæð¨é–ïX¨Ù7ÛVN28§çý1Kòå�&Ÿtê:†=P¦lÏêA*@k¶ž=¯äG¹EÏ>=ß }HÃ6L̲Œ|‘å´ç˜úûâ°ý�.W/EÅãEUþÑ—Ån_6{–‰vhf\ì(˜í²êYžþQ¬ Ëvέÿ-0r¾„ѸØ›Í~õ²|j�§Çww< Lý°ELŒÔ žÈÊ-Mm–MY ¨ÛÇÉ? D»_1ïY¶©«—ªÑÇ×|G»b¿.ª?UÿŸÄ·‹Î# ê'~'»â¹VÀD‡ç¢*,²ðòÈ’ó{òè‹Ö-nXõ8t¨ž÷ÿÁ䋪áæ;l†·Øž›rõ"üù.]÷}Ѳþ\×µó%RØË–;…L¶z©ë�ìi ì§÷®lUÕªØ ¨ý¿¨Î7ÝÊî�‹«_BËq}x»p‰“kÍF*#'ËóK#ØÃîˆF ^ìrm´À0û��`˜4\´LË‘“¾X—{i”ò±¤¶�§/«5úúa_°¤”™}}Ø­ ž-O,«%ð‘gNä�ÄöjG ýµl^X…fa-JêCÃÛz]>˜¦½"ž½A“¦¾Ü‰¿ ª²i qýaW£ù?ʵ’4/ˆõ› žÃÙlHõµ¬žY¼ª«uyM€#:&”4`pл€ËÞñ¬.šŸ”®íÐÝštÿ¥:©Ïýù~}„Æ«z­LSsíUÎfYJ“5ŠOËGΓ ¬ÖÀ¼>žø 7�º)Wíc ·à&›RùQ1 팩¬mç]ø�^m–%Þu CŒO�eÿ 8Á@¸\Ò(8§ë¶ …]õ_˜�*`�_¢¢N´‚ ´Ó#,¨`DPP¡çNªm¨TÊ]´S€¯ë\!«¦µÝ‚«Õv\ƒ¢ ·ËF]5—)àEO€DÚ®]Ó®‚M*ã3ŸåÉóÑRµÜ'šãjÇ4¼à<µ¿øÃ¢œo{íæÁÍç–‡ ô_qX”Ï�οîºÚaè«.sv¾úÞÓ‰ìw¸Ô-Úü¿·Q²?Ã-±7`{ús|�iŠ¡)p°€s¥¨Ag_´€ËSÛe�·$üxkp0®ÅtMÍâZÃ*ÑP@7në¦8~ÀvՈ嵢«œÛÕ,P±—¢¹¯ŸšW,2G(Qç&]Ëp|ëÑý‡bŇ©ÚØ—*Ä«|ÃY*µ;�¯û=ô´à%Ä’:Mâ¬wíº¦ž%·ù{ÜøÃ4‰èjfž"‚ ν‹Gш¥7÷üÎ'¢>Læ÷i<žä,Ÿ$ÓQ”Љp&«†É,OãäÙ"ï� !XþC(ºqöÃÅ¢pvÏ:ѯó4ʲ#áZ·¶$E¸JÞͧ1ÅèXºä“†³<Ž2Ìâ�h͆ÓÅ(ž�å[D«f –óÌ4¾‹se�#Ƈ¬“ä?ï–’[ž»‹Òá&¨?›xç÷]ùPòŽè·q>ܯ�¾©ßbš( ù{Îfh7ÎãábÊü|‘Γ,b-ª(JGq6œ†ñêã OÂxÆZ�6}Gï"�DÙ$œNYJ™¢LÊ ]2­„΂Y$®!ÄŽ|º ︖~ƒ†A0�ÛiÄ2ÎTzŒâ42joXÏ.e&ÖªÐ�Šf6�†ññ+ú5‚bPP¤ûžå ²OâhýB‘‚)XØ•ÏsïBÌ}LE¶ýÁôÌ3j�ìD-ø8Q >ZÔ2/¨³ÒuÃEÝQAPH,‚w¶¸Éò8_ä�“d$1P# J”rÇ£ìgq˜dÙÑN;'ùý¶È"t—&ÎŽP,iÂaë  Ñ9Éxk†óÍb&-Îij&RBš d@Ž,â¦âÊv”îý$‚ÕÄÖ>³ÞÄOªf‹Q Ï€µÃœÇ—¶Aè3k`RHM�È’36°h�§ñ8š #þV‹™âgc„SagÇõ*Z„¡+3ÚxèÎu/wd nùM}ÌLŠ.gpçC¿u¨ë l <ŠE=¤=ä]LµêôìY,˜�)e‹¡ÜÙΉ©ã*¢üÿâùøú/ü„þÝÑ÷[HK®gôûBýÇK¿ÿŠ% endstream endobj 280 0 obj << /Length 1087 /Filter /FlateDecode >> stream xÚíZ]sâ6}çWè?X«oË�I6ÙÉ6$ÈC'Ýa\[¡ž5˜Úf¶í¯¯ˆd‚ ¦@B›üÛXè*çÜst¯1€À—ά�`à!(…ž”PÂiç鑾÷ H} ~¼ŒœÆ)äŒêó ;?w��ërÔùt#< ¡/£gÀ…„ùÀ"�Á(OݾCQ7p0êNWÿUηÑ׎YD6±«|é—Q©¤À%JŸ›¯_¥³BÍŠÜ~Ë„ÖkÒøòy7ÏiVæÄŽK<Ù}è_ n‰9wÍávVdAÝ4Z„EœÎ̧Á,2'ÛóäR‚ÖÓn_ŧÎ×P ú ¸X@» h—ô˜«ÌœEi¸˜êXÁë2†èÉ.t\Î…9ðW{ 9öêL�}�iÐG:-A·Ü{½‹Á/uX1Òœžv§¦…4ª£â!®•Ǻ^I)μ’Ä(¢jLBÎei´ÙìÀÊôÔLäqXÊp‹am�ŋŬ‘Œ®Üa‘ų‰¹þ¬Â4Z^í åïç/ÚG)XV-†•ó0W³^¿žìÌ÷Ï6=O�ùþñ™Ï gwñìû*WŠÔîJæÐSA¾ÈÔr¯°vöW^¨éæÅ„èâ]æ¸X˜¹ú:Uj;ÓR†ÙÚÞTKY],x´LY¼KŠfd%¬gB\ÿLç‰*7ÝHí "-¨A¡r‹Ù@%Fð^9˜w仃zûª‘H((­ªQ–jìéJ# 4²:bü÷@µ4‰ßªðm*dˆ5V¯ dYÜÝÞÿd%5ºÞpL¿æ˜-;§eg¥újMdƒÆÚmìÿ[£hÜw˜n³eA¥«7•ŒŸ—aj<ï{�A�â–�= ‘{bëˆy:��‹yT]RÒêå¿§gei¶Ú9˜h‘䯵žnùu±õ¢”EXlÐ&IK͉•c+Ò~¦æYª<_q“>›cž.²Ð–Ž¿"Dµñ„ÆóD ÿüoèˆ.6ŸÝÝÞGww;Ëu‚÷ì˜iûò °m–îÖµu£eoTÏíŒìÕ(ÐrÚ`å�åx &:è8ž™�tµ¾•MØ–æå¶ÊÔ,TÝ ÏÏ&Û „@ù[/!ÿ¬Š NTT^å¡íÕæÛZ5JýÖm  ¶–Ø[]ßÄ*‰þUnºè¬…{¸Ýæ„'ëû; äl§h/ƒ©$9i æ Ø÷'ŸûÖ`N·ÛœðëOmÆ�ÃëÁGr™ƒ,=¼T¡­“¼#ì R…¶Nr¸ë� õ d~íÍ�úäàžŒò·ôdWKC*U—ÎË_oÈ8«9ÓÃ~¯¯r§¡�Ù;& ø!å“ÿ8Ó#>kMï¶6 †òúD™Œ“ø·#’�IÙ²Ñ̆Áéz´ùÒ×nHyeoË«zC{z$zÆÊ[t«Àÿr!*¯ endstream endobj 301 0 obj << /Length 545 /Filter /FlateDecode >> stream xÚí™Mo›@†ïüŠ=Â�Í~Ì~pmG�ÔCSnnd9°v�lpˆ­¶ÿ¾kÀi $1‰ÔzO³«]fÑ3£w4‚–ˆ  ïΣÖD‘"XK‰”ÖX3@ÉÚ›^”Ú³KD0�4úQÝ\# àv½Bß¼¯i|Õ~ÊeãðêÂû{g!�Æ‘”Å D‰ÆŠ ¤$ÅDR§hê 8ñ1Ã4™Òþ'³�g+“v÷I„TøÙf›yp_><‰¦!‹ÀÇA(„¨�|}'‡~ðO¹¦@Àç²áÔ ‰µ!•X‚h³g5í8 Œø¿6&5‹†‘ìÖ&ßÎûàS÷Q¸¡�›×p'»<©¸¾Ž:¢Ú1îg2†#õ%vÃyS¬7lVš¥;ËòÅþ¬À^¸ma§^]™êÔ”&OL7Šë“îžÃÞ¢ÞÊoî¤ü=Ð+åü å_æIYÀ'„åÙ‘R£%œV=H²ùAJÎó€ßÂ+÷vþéCé<†pDOm'cÁUÃñ‡Ïë2<®†»{SÎVÙÍ_”AÐê´é9ª(¶Ò\Q|�ôª7¸þæ�qwRÝõ7#2~AÑÅE¿ÉùÏ0³áÒ-œt�>Hº…ëgFÂÚIi×ϼYƺ~f<Æg© B®°«ÒÌr'MJÎSXþÙÆ À±PûAEu Dëø<~:ýÖ92û¨&­l<�ÀÒšêá,ë>üåa-Ÿ endstream endobj 313 0 obj << /Length 1417 /Filter /FlateDecode >> stream xÚ­ËŽÓHð>_aqr6vû}„À A°Œ œ`µêØ=‰5~ÉmÏ�¿ßª®êL™]!ÍÉÕÕõ~u9pvNà|¸ ì× ‚øùpõvsõú:O�0÷“" �Í�“~ž¦Nš ?„³©œîz/‡I�+OˆÜ Wo>^È1B„ð£ ($p¼,ò³„ù¿Ü¾ùz#ˆÝ£ÏM7�«0qûj.§ºï+»Š€ußMª›ô‚.ë èÌ�Ü/Ò4²*?‹“3•Àþú:INè¢Ô¢È Y­W^”„®¤ÏÔ÷�…øbžúVNu)›æ€¨À­; ¶{`üÜ‚�D·^E�ûŠá—/™ÝAào{`ŠýàŠnt?�¥"¸ì+†~�hÛV3éã¾.÷dÂ@2v­Ô–! Ö¯A1!¡@xïxì°†~‘ptªzTö‡•H\£&%Kv²ÄàQé¬U导¤_çq„ ˜ØÀÍ—AuŸo™ÜxÈÛ/Œ#á.‚(©δèy¬-¬O¸×sW>ÑbVL�`ú�ƒ)9hÒWã^Q AèŒX9|ýpåüð¢¼p‡¾Ä?M½]�ÏÄTa@’e…ñã÷2@ É@ßþG�ñ¬0¤ŽŽ­Œrìg¯‚`pšÎ£Y*.6¸¸³iÂÛó0ÁE~!ʾLx{8‹—CÝ�_w;迸0qóD‚ºõð$Š.ßÜÞ™¯�$q+5ɺAÕÈÐ*©çÑHÓD>ª�«Ñ”~ÐÚ²à­ÚË•܇BšþŽn°]ÌwèE¬M¥½Úª%×Z =EþG˜´E �Öc~µd\#Á)ŠÌ픪4]cY�‘T!áï¸:™\jÝ—µ4iÁóc=퉃‚¨Ëì!nûö5`k¬[r ÆE~eIìnP^Œó£»õ®îdC(3 |ÄP`YÅ@��Pb›~@íHƒ>âõ Æ³Ñ-Í+oê=;¹»ÜÍ(hŒàÁ`$ŸûÇõ¹à!x5*6ã•å8Z‰s!"(gMGS2†²fL—œ,8é©6é°©•ebY§é8•>Ò�½óàÉà(ñó¾:vüÁù5ŸÉÌEƒ´u¥X>wJäT•,Ñ´{¹SÖ°²™+¥-!£;U*­%Æ#p„£ç×XÜ/NI®[VPò}·kt’ÕC­É´œ]Ïñ½cæ•Ì+鳕ÚJ;«³Gj¦š22tV�]ÅNÔÐghG®eŒÓcgIúæ¼Tcòæ ¦8>Þ‘ÀQ®KV=ð++¨‡ñ–ë*6ëɨ':ðxAš%£>rîÍÈ­RŒæ-ZÛÔzOZc× Dø¹ß�„Ua$θ8�hÄ‹wJ×0@\>Óž!Ì\™úé0(“Ù1ÄzaA¸œn²+ÕSÄ8i°ƒ•´— Óàp}úH9H\3{O‡ô¯K¨ëSúŠ�"²Ä×,ÿw«u(ü" ÞsÓØ�¢‚ü}XΠÜïÚnèvÞɧź<Û§/þ .6ä0õ³> stream xÚ•U]o›0}çWøe<àÚÆ60M“²~­Óšt)}˜Ú*¥‰“zãkTuÚ�ß%6YI³J}òÅ\Î=÷ÜcCÐ tê|Jœƒ¢ÇR(Y"qG…1Ã’¢d�®ÝÃÏ£‹äxêù,Œ\ŠÍ:¹MϘ‰}³œ�“©Çˆ;9º:LÎ&c³;™àp2NŽÇÉ¥w›|qŽç—C�A…GR¢0ŠpÄ8šçÎõ-A x÷ÄzÜd戋 @œ¡Kç›Cl#3Ñ…ÝbÛŠ$¢ Ç”Š®¯¾„¤˜ô}Q ü)!Ľ¼:?M¿o˜õ�'B<† ?Xi¾M”éªyªô<ÍÌC[§+»_._ê4/‹Z×M=Ìhz¨¥·Ì²Ò£Â}ÔÅÊl×�ªê÷n]gœG@‰a³¾�aε/„tÓlC.01¥ÖæA¥óé¢j[µl×sK솖©ú?•b‚B‡„v*‹(D>£˜[Zï<_‚Äe•®53ñRgŠâeL:ÈNÙs)L:Æøù.d܃üojþ–PV0Xl¿Ne^yÔPÓ³•-rór¡;ÔÂŽ­m¶"aêïà$à(†ÂLv…)‡Â4‚ ›š�˜¬½î¬±>C%¼ŠÁ¬áT¼ŽbnsÚzkž­¹&•*Î/zæ4ºêàÓPn˜vÁ^µNhU%nÚ¨�ZºÐ�N3ý;mtY¼ÕC�·E¼ÏCwfþ>œ£¥^™=ß/ò;~(ïÔ³´XÌ2}_4›> stream xÚµZkoÛFý®_1ßšl‘Ἃ €¬Ø‰Q¿¹mº©aÐ2ãh#KE·É¿ßsG#EŽeIÛP ¬!9ÃËÃû¾—£„b‚)á˜ö<“Ñ0%qI9Œ’)§0âZ´-3ë¤cÖ`�ôÌ:,ZÙQ22)°H)Á¤¶˜Q’I§" ÑÆ�Çe¥“Ai¦18,Õ§'‚²ŒCã>]GùHÏÄ£™²O&J.ÒžFT”q„1àÀ3-"] L§×0‘imAwjñ+™vÊv”UxqºËHHS†¡ =‡Iï`3*‚ 81FÑ•ÀŒ%Æ€¨q�p‚™ ‰]’™è€ÓV tšYz9…°ÚáYÎ2¼nwàcb Þßú@t³QÑ]‘9A�ð‚9%°ÆKæ´à†×ÖxÍœS´Æ0çSyË\ ¶xǼ ¾ɼ(åóJXðFà·*HÒ[ÂóÎëŽ šù@ò †ùHƒeA[lÆ]Á³–á °`%­‰,8ZŒO‹ñ"-×¢ðà3äIm䵕IŸ¢!1�}ÑiŒžEïi Ô)¦Å¤O‚¤FZ#$ôL :Ò`ˆÐ�tèL HðG>­ƒz‰@:@Z-"¡E`ÿ4)Ž’ª@×qÜÑÐr)-(xIi€GQw´¤;©¬¤"FÊMGÓ5ÑiMÄBÒ7À”0 vâo«Á©„NÊHGආÕI˜„ï¼|ÉŠ>+^OÎ'¬xÅžMﯦՠNƼÇ-7ÏÙO?užý©½ÃŸÿSÑ£N?vqdèçOa�ôsO?cúÐOC?Cú™,&æë_-.wÞÒOµXšn/Wzþø fðÿÅex þpAòzñ„Ï�h¼'o!Ø[V › "òòe§èÕUI”_•MÅž½ú·‚Ë�rilêG¡~â‡çyݤfϺד«ŠŽF÷Ó¦N—z}ƒÇ“ëM4ÎêÉõý Z9{uÀF뺬¿°È…À’óa3�Ó»²ªËñär:(G%~.{Çüü¼“Q•Ó~V×ëŸ8ü‹@‘3Å«ÏoïöÙ‡r4­:ÅÞ1+N&õm9Â;v™ì§gó¹Ó³cºÐﲦ¾Çyÿ¸œ~¢åcœœ¹«X±ÿ¹yÝoðˆN1(iñä.ß�µWN«ƒÉ¸aÅ»_Þô~ùãÇÞäMU^�†ãêÅÑðæcÓ)öÇ¼Êø†¿ÇÝñt8¿Ð�¤êiÓûXÖÌ œ�Ϋj:¨‡wÄw ôR‰i‘”(ﯚ„í  å+ÝÞÁ3®›�Sö^Ó0±Ãÿ>ÿá%–ÏÜ€CЃCŠæbίÃqS�[ëÒ»�”·Ð‡ý«j\1ù|þ*§½×�â×iyS¥`ø@´ÇUSBKÌè�î!4-«ÍÀa*³z þ_ÙÕS:…ñ•S(ʯž¢øVOÁ'«¸zŠ"¸X=…�§åê)D(=cFу¬KèXý[UOaÞP�… /.AYNîo÷F“Á';ÅÛÉýøº�r--˜su: ©DCTÊ»7i.‚¢ï¤�4÷ŒƒŠŽÊ›)2…™²îíM>CÓ^ÐËÐ<ܳ¢H%/fóåípô…=ëMØÜ(X2Šçy~8ª �åH—’>7ìb=CŒ|Ì�ø Y ¼8 dÚ¨ïBÄ#¤>ü¤Ew<ž4ä»)w'H”ºÏF›G—GŸÇ�Ç8­È£Ì£Êc¦g3=›éÙLÏfz6Ó³™žËô\¦ç2=—é¹LÏez.Ós™žËô\¦ç3=ŸéùLÏgz>Ó󙞟ÑûF‰OKFv4B(žÔ×U�8-.Š7ÅaÑ{/Ó Éªùžy¼Ö 0\¦àZê!/4VuÙ·yÙ‡áÍ}]ñAy—²K™’³6±Ç‘*“cç6Rùaxa%–ÁG ¨ê6Aé¹$ôe+ªZÏ�4kAè¶AØ(8n8‹(3� {‰k1˜¶•Âz à Fx.,.‹õ:aÚ7SkPP†h8•¦Ö�’kYa[¡$ìEr Ü Œ¶Zp¤¬kA¸¶A˜¨xDÀD- IYÏ ß:ç9õN$Æ(3Þq„ʵ BÛši,R)Ô7Ò‘•Ðy$ñ¬UÍо×4*IÝxM'3F“çØCµC’ƒ‚^ ¸Jd#ÞS½†n|TJðeÐS6 hÝié€hN7‰C5§a4ȼ7À°­Ãp–;x-II¿§®µãÂÅ 0\ë0L@ü ¦t*+4Ù‰WP´î3´Ò<"/—Î-µYÕjŸQÞÝUãëágÞm…Š×5}5àÚRƒÙr¯âz{mKõ 7‘ù0ZK}êÈÅz+ÙkÓsIá)“ ²þ›¸� B­td€ò);ùÚãÝk7û\ A��ôñ@Z.‰KÖró”¹Â < ¯&´ÁföÚD±à‰Dm”¾fe )b6óDíBB2: q_%ëÑNnƒ¦u IØ}RNùiðnvƒ„ôxr!,$DÎ>Z·™'z'‚ ¹TJÎ$$aCê©Rò!šÖk()c 8Ò¡d@ª*aSVÊõ¾¶×ºž¸úÒj¸§¼ÜzKîíB2@ãÂÌ�é4B>•¤·›2ŸÇ¡§�Q$ÚPã÷ªu+}Ü®³ùµé·Ôç{ÔºüM?-·'cüΦŸÏM³�›b!7ÅBnŠ…Ü ¹Éæës“-ä&[ÌM¶˜›l1Ó‹™^Ìôb¦3½˜éÅÐfÓm®€Þ¢úI"fèrM«6ëàNB 5ý,}uWž¯��í©ÆÂC4;³^Q�>…n óšâšÞL딓¦� žÃw1/‘ŒË°ÁBwØ\„„RÝ�õE@BÞlfÊN›Cíähï ªýˆ`_Ê�ŠÛ Ù�¾ Oh +K[ £§jþ‡`v!(².Ε6ÍåVbj½îvÊ"Ðv)à 2y;2ÑmÐ]³–ˆ�ÚsÝu0¢`åf¦˜]è®…%y­¾ÎÁ’Ô6¾ÎìBw­w©y—ÕÅÂ�¬SÛ€iÝ×Y2#ÚM…„Ñ*Ë,ì(nôuv<¡OPK¾Î†”ß"Ø�è ¢QXòufä¶ñuv'ú"(m_ø: SŠÁlf¾ÎD m]ø: KÒ[a1»è� ÄiJä µÀñŒ°Vu›ËvýE\KýmrLÛþ¾+9Öb‰62ÎF“G›G—GŸÇ�ÇYRL[[LjS#B@ñ/iG£Ü;M»YéÓåJ)ÜMnïÔååhxu>¶¨™ž¾Ê©”YÞ¶”ûiU·(¢Ð¥Ð§fu„ïð©¡åžÈÞOúçÝ££Ö!H+í΢O#‚ÚFBs'Vcøµß}½ß>‚ä´èsr¢Ô2òzµí�÷.ûçoO^·"}òi�AÚ~kÁ†'úšG‡'?ïõbH Dœ}Ÿ¡^L\í®ÎN�Ï.íï¿mE¤�:5¥È‰ÃLöWƒØ×=>;j_#༽#…�œ\5ŸÈ OöïÓ÷ÐË»´Ü¬»„äÑÇG;ºôÿ±ûkÕZk !µ~©Fî&Ó·0Rn‡A“À$¶Âàx4On@ &mŽZ�ö¤ûöú;úQG«ø}ûñôlËçvÒ[^»Iz«Ö Ãióí6k©~sÒm·V)¤„KþÔ”¶> endstream endobj 342 0 obj << /Length 621 /Filter /FlateDecode >> stream xÚ•”Ínœ0€ïû>‚T¼þÃ6U[)­š(UÔVÍÞ’8»nXŒÀ4ÍÛׯ�.Tm/ØŒg¾™ñÌ�-@àb…¦’Ôoýr±ú¸Y­Ï%XÂ4ãl€@Pr¸ � 6%¸‰>íòƪ6N‘‰ï6_Ž8„H‘$‚@ ä" ö—ugóªÊ­6õ‚õ›£H aÆ9� ÌAp€|û~öãrp¾>OÓ=Ê!•©SÔžbœFy'4CQ©bŠ¢_1I#U™F•Aü¤í.ìÎüyo�5¦ê¼%Œ.�üaÈw`/ª+“—ºÞa^�¨¾nò"&(ztgoâ„a»¼Þªp®kkÂîÙk™~¤Þû¿^W#¦Ô­*¬ñ‡^óŇË$c‚ Æ0s™i6ª}ð±{—ÝÞ}…ŒìN…M8«ªû¶wV5ÝÛP‚ñÒ&�1é¼0($ t ç:7Išò®c¦¾EˆlûV Ñyó4›wsKoZå¿%£d®d„%su¥|*Ù» 1+¾€‚e“‚>ìŸ!‘£ûzíAd�el|Xh›™‡»pÓ˜d�¹��o™¤0ûFWªMº^[µ”˜�QyrbÛ¢!ì‚©sŽ'�Ÿ ñ¢ï÷KæÊÊN‡ÔVUK~ FL Mnw]‘WjE%¤‚ŸŽÚê¥x\a8>ÒÙ¾Ôf¡PÄÝ1!ÿ×ç!!Ì%C]Ÿ8"û„,Í>ô£®ægh4XúoS×òb‚©Q_íµRG¯€Ÿ¿jÜ_~½Þœ]]>íøãß$†¼Ù(Ñõìmæná´~Þ¬þ"˜Ž* endstream endobj 351 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•�»‚@EûýŠ[Bá8À>K4¨â‹í•D)¬ü}W„ŠÊêL²“3{0öbãÅz§ ,9­3ø;$K’ÆÀ¸”tߣ�¶‡üì‹k¼J��Rú±<6>våu�éËÓ1î|% /^" zFÃdµ†±–l*qDÛ1úðV�)sïqs€T)™…ù‰F\O_œ¹p*”ÿ—±“I*Òc«棡åÖ>€ endstream endobj 357 0 obj << /Length 1434 /Filter /FlateDecode >> stream xÚÍWYoÛ8~ϯ°/vk«:,Û °é‘"EÓ�û°È-Q2Q^’ʱè�ßq(_Š7û°‘ôpæ›o’ž“;žóùij_7ˆpˆŸÏ'ï'ïÎçSÇŸ»Q<õ�EæÌ�:ÓY蓉³H�ÛÁ‡[k.‡ã ˜ÂáÝâËžžVI¸¡7P‰çŒ§�{±Ùÿž)‘˜Ý?Îùp<ðEæ»ó(ræn<�†Vßô…FßbèÞ ŽÃ‰?H$gšãذʬ‰Ji€ëGƒ¦ä•æ©Y~Ñ€K%j’«³Ý}l½.DÂ4Œ`%š8KVæ·?=/(øö>´´p¥�¡Ì*˜öQ§Ê†!ÀDÞ¢AiA,‡€ý™$WüêúìûE@‹u]¸ÃqƒÅª% ý÷}7NZÿ·`‚îIÐZÆ/裕BT?ÑZÅ9Ë’Ò‰á ö5‡ZnhÙPWiQr³£äL5’#™VÿÒx ²aëOk¥"sõÁ±¢ tMæVÁ _ ñ·q¨Ç_K}0›Ã8ò§‰â‰Ý©ã9¾#1pðýó‰sÛ }*D•›-ø2ó¹Üñ nž•æ%)4¹Hjз£vn~\^ž}ÿ£oï&pÒÀbQ •”k& ®ù®õª)ŠDÿÏŒX|îzaÓÇ+¦èDZc¬E=„h>v¨çJ³§Óœ›º‹=gæÆ3ϧº =7‚ânq@ñæüt8žz wͤÌøöêzqqõíÎÌ\×5QeÃÖŠÔ�ÆÙ]çŸç†Õ󛃭T ­(Šß cjD9¯¸Ä¼10öÊLÚÌÃÀb%‡²T­2‡>A>m´¼yÁÞ8c×÷& ÄÓ–»ÿWBf³£lTµ’Ék©¸ ¤WDI:2sÛ\[Hµeªª ˜éEš0ÿ. “oM¢Õ¨‡ƒÇ•ÀE[\КÉ÷Ú¶®¸|à{ŒÔR䢲��øÝ+ ®n�TM¹„3æ°S@gnckî9¦&÷L"ת“êš¶‹£=¦ùŠZöåÀ¿uœ«5¯.¯-“åü“/Æ ©RhôºsÝDáÐßMH;ܽöfu˜l]*Ö¯ŽñÑBmûÀSR~Ã÷sÀ²ÛQ¾íÅ’C:šÇÀ!Õ>O_›˜à¼QO˜`³þ±vésúm4äý…¶ÔÿÕ@ÎØÜï:½Äâc.c½'×  à•Ò ³)i!Òö¤hÒÑVþŽvx#•BÉäO.G=Þr7·Mëþþþúêò:¸¿øöáë��Ÿ`NªKx^ Û&Ë´m›Ýíc¯­ÆÀ/œÓGóáÁ<¢_{Â^Kà–ü}°ïoz!Ø樽/Öw½–O‹“‹Æ£ endstream endobj 363 0 obj << /Length 2284 /Filter /FlateDecode >> stream xÚ­YYoÜF~×¯à›¤…Øá1¼Œ8XY±ÉZkÍdC Èž™^óJ“”4 ýø­ê.žCÙ2võ2Íf±Ž¯¾ª>d[Ã2~9z³>úá�!‹|ß5ÖceÌò� r˜oëÔ¸9¹øõüjýöééá‰Ëôï›S×:9¿¾¼Ð�ÿº>?õ¬“_Þž~^ÿvôv}ôב ,Ã6‹…>h C:+#É�n>[F ï~3,æF¡ñ $scå¹Ì[¹0ÎŒë£Yc/#ËXX6zZ äß_ÉË›÷WëË÷ÿ8ÿýó©é[ÖÉ•ESëq³4Úñ¬¢9þØ0ôÖ0#æù+ô'ÒÚD±W¯émÄV¾§_^UÛh-JJ�Š8çÏë»)Ûe?ÏU®–½ß6ÏÚPÃË M•$UW<ÁÓ3ÒpuþáÒÑã¶æ=#UÊkšŽ›åeÊêv³�ZZlfŸ‹%:�“8ËxÚ *…ZÙ²ï¸Úîßÿ”¸mE, CîZï+^üq5‰;ÑOeÕˆ²¨õ‡öŠ~‰¾üŠÓq@Þ @>`žK€Ü˜f*êø.ã¯Ë¼ºy• É“FÜó§­,ÛêŒ1öÒœž' ¯š˜^�KBñ8nÊ\$Ç”ÇãDŠF¤ýD× —ðx˜¾ãMÖÖ»^²Å6ãýc)S.yzLPIšÎÊäK}L¼ZïxÍ—=Ü”2h02Nñ*@:Ëû¢� ÙÅM§Q!ÙEœeäÉÀ®|pCÆJ›¸þBÎW’ßs¬ïC F­Ùæ #)f¶@×wVràÓ�nxL§ŠÄbÿIv"K%/æ�ì>–ª?L×J¬Ò�)°'á²§÷ÓÒè[%.¦5õ£ºwc’‚ót÷]××ùF�Å»ýœb� =ÊÄ�ŒåþÓ1ß»9܆BQ·UUÊ~É{Øñb¡ŽÈð»ößhKàƒª| !Í<†e¾ÞíìúxöT·ÅSµOâ.Jd¼i#ì¶U•,·2ÎóÞÍ l´ñö`µÎÅ#O‘ij¾ý—1òÛ>[\5 £�ü„äaâúš°ÒÊ»‡«|:Ú×gz‚�àňCKkÝrŠ»�å7�êÒ@Ÿ%°šógZ6$ê¬ó Òu¶È�‚D �Ó $uÎ’i©Ãã6k¦ýNÇá9ˆ¢3?_Ðú‚k¡Œwãßf3ìJ^Çw�ݧ‡XO’çå=®ã^cfbê ¶+\ûÍÚÌÛ…ÏB�Êø«SÓv@ðº)«¯¬±Ã‚ÓQ‘KÙÙÍy]C½Ì+ŸIÙBÎ%â�æÝ�9¸éïžu˜C~#\èvâxÝvÔ»ëŽ)žÉ[r >/Øù4Üõ0kÄÏï¿‘^¢‡Seù çÕSQšèËs=êûÒ¬ÕÏ�Œ›F À‚µTîø.¾ rá`8«"9eÑvo±ï~mÝoÉúb›àÙ™±ØM9:JeÙ¾8§=³Ãÿ;³ÑØÊe–Müœp}ìåR)>·…[Ä”˜6¶IQ"¡ Hg…»úrvGðò¤--DSªŠå/ÍÊäøÿÕcù÷þu>�ÏïW�ë~÷‹»‘®/lgŒþ‘v+¯“Rr³b¥Üþ¤\þá�ç�®ÈÀ‚ã3;¤Ë �¾ÛŸ:¸~¦Ø «Ÿº«—4§àÇݤàð“e9úÒI]wE`ÑñÑ¢ ϳ"°¬yõçUÆY²àœç3'²;IAšÖŽÔ®–L7§6ø<6^¿RxÝÍb2Ëv!ä€ù+Šù“ãx¹™¿!³�¹³x¥´äph1ß z‡!)®hx\Ç×å©ÑÄE¢âûûSǃš¬UÅâ„>PÏqslæGî‹psY…�$´×�Nã§`zæ*Rûlåœ6šüšx¨Ý ‹­(°YkÉ”^VYKòx9VÓ…$ËvBÙf‘çÓÉ´¢!ÆKT¹¥ÛÔ�”% áZöüêrš¶Óó|àûoi9FÕ‚P¶?ä*#åŒ�ÝÍš"±:,’¤H}�$ÁàÌ~?f8›qGÑà&NÂJ8ú &Š¥¼Ù¶Ï†¼�RR‹ÃAwÈDZŽÆA‹T}g¨^Ç îêâBµDœÐ-Y½ÂšéM€°bcŒÝgÕ©R%˜œÓùõ†ƒ™‚0 Ã.á� M<7ph_Žï.ôŽÓ\‹œ›¬2ÿØhuê²¾À#‡…"2Ìi�CÑN!.Q½;пK=뉮ô4y`~PoóøQäØAÚ¼ï¼#"W(·ÂÅîNd¢Ùƒ¤¥"‚Âz×ëñW'óžýæ×ͬ;N0哺Š;¯k±í0A_UôÓ–€1؈?t†sµ„.u#:üÕ7À8œ¡3*ô�:ã`ÃgRÉUNõZÿ”Ÿ~­Ÿ*.õ@/¼š,<�p‰‚„€D‹S±Í»åj”Ó]­èRò\¾ŠÜ~üøñöÏ?éø­Ö@tPõ;jlÔàÚBüÕÒû�æð@ôĵSU_WEú›fÚô–þóå òúÿ÷:ü¯iZyÌ÷©¼ü¹Ýÿ!� endstream endobj 372 0 obj << /Length 847 /Filter /FlateDecode >> stream xÚ­UKoÛ0 ¾çWèè�*?äÇn]±6¬kìÐö ØJ,Ô�Ì’d¿~ÔÃŽ�æ2`'QE}$?RíAŸ¿>¬ù(!8�c”¤)Nƒåõâù• ξ ‚Ã,EcY£ˆ†˜F!ÈzZüXçëãzq}G)JqÇ!ZoGŸ±�Iì£u�ž½µ\±ïɶæVÚ·¢1Jâ}·\ùÔÍΞ©ÒY}ß(1\k·öÎh"©œYÍÅ «fû}%r¦DÛ\iM4qÊw µrÉš¢âÒúløp[µvÝŒ�%X%þ,ákD¼^ο®!ehåû8ƒt˜¨E³]†Äk_@½Ú 1I=©ÚÎøY8�Âíúv°ƒ—«0мu)¤=Ë™»¶q·Š¶ás‡£Â$m²ªÃÒXvsÐ11�ó(?è(ÆÒ"?ÆIš xÖÐÆôtnõ¼¢4žޝïÒt‰�â8ŽÀÞø�Š�qUì÷ÖxF �`Hê`<‚ÒSs&ûŽëj»4¥âõ•‹±›£[Åg…Âd°Æÿ/ˆ7/` ¶‡’»š0»ŒÙrЕÎU—å9—r`ȉEÓ<¼tÒåÀ <Øðp•F8Küyå~j/üB\Pæ,H¬¥Ø•ÕñBDA‚}èë!|ž·5Ô F~:4ƒ ÀÈONµ¶Ý[ök™I» e E“÷�ÓÕšš}^Úô¦ÓÏG�ñ¨ãý½„Îâ]ÉYa}©’53À€:à4=¡…BIÓÚlE&Y8ïݪ͗ñÞ ,`V¬!Ÿ œ´oÀ[#ë‘Á ðåCƒRê{÷�=P¦Qµ”3É­ÄªÊ ã8qAë¶}“ë�LT×}®) ÷ æhåï7�÷Á €{ÑÁÛðáݪ⅃õĹ㻞úÝÎ�ÿG`þÙÌú*š7SÊ0µs0LÍZ½ý6í<­2�wÞIÚt¤¬Ùô®ÝKÞÙ‹WLTÒ2Z4òî¦æÅÖÞ¥,uß„ÌÀÔV“�iOL`Ýw–-¢0éÒ!¹`Ë…Éͺ]0ª=k½ŽCÃ^Ã>6˜Ý<Ü»~uµÄ³Ì|Z¿ÿxiÿî¿|»æ»�“I[RlüÝ‘žNn¾%çÿ)£  endstream endobj 376 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•�»‚@ EûýŠ[²…1°OJ`µRY+†JF)¬ü}wxTTV7™dNr/0Q±?XO¹µ á ÍŽØÂåÙa@—TÇâê›ÜeÎ'Šæ,¥â¤hOÕÜÞÛBNšZöá,ê >"�)“·‘è=ùLã1Š®g qv“Ê=¾Óæm­býF+®‚—/×Ü0�‹Èˆ[ß…¤ Ù“¯ŸÖ£ÑåT>¦ endstream endobj 385 0 obj << /Length 1381 /Filter /FlateDecode >> stream xÚµXmo£8þÞ_�îH�c0fu=i¯·­ºº^«6_NÝUÅ‚“ %€xÙëþû¿@%MÓÞI«µc†ÇÏ �Ç3ÅÖÊÂÖå îFD}9•ÃåÉï‹“ùgáȱK+Àˆ3f±ÀE^À¬Eb=Øçë¨lDåÌ(å¶ç|]|á(J‘‹9• Øš1ŠXš÷ç³û¦J󕆸CÄE"=GêxÎ/|ßâ(dÌí=$°Ø”i&f‹t#fçEÞÇÅöSãÌ\âÙ_°�aKˆ^¨àN|¶¬õJT =)£º‰ž7…׿a’.—XT"7Øo¯ôdÙæq“yí0rfžOíÅZÔbüXýÌÅx“2ª:[¹DB:I Áqåäk›çÂD�E•¨�S‰&Dz*bQ×fQò—‘CœåÆúmåK!ßôíM$Ùo×uíOh…Nå2¶·6ðÊM)òëÛèÍíÇ»+j¶�b‡bû{´=�i" ™�ˆr3-–zL óíÇ7ëT…Sr ¸] ¡vΤ0ääîòÄzP·7×·ôñN¬À•ÇÎ?óŠ–‘1Œòäe¤¸‰ï·á¦òÊ J=)1M Ã7y¸¥ÒÇjDÑÃ6Z�à@D&$ÔCòɈ,TÔôl‚2P…dPë1Ú÷<×cÓA�d ÉD¾j§ù…ëY!=ÊäÑ#ÜC4$@L1ú‚±«­ÔC!ïm¾KQùßϳle­˜€ö0°p™þÿÈ“Ð_§°}„I¸‹½_¾âvv§ãàÃ�µ¢M™‰ÁÙ„ÐCfÕŠ cg8ß÷8�€ƒY0ñ÷£hÕ."cRŠ3HYÁ—LdøA€8áÇlP×qvöî£ø#ôC„½>„½ÍPŸyÛ0¿Fžbw[ÿ¦œ¡c~ ê:ª¯–gS iˆ#¯ÌŒrnßp�®!yE�” ˆå§ÎŽV»Ó_i m a(àˆˆ¢ ì´C©?°}ŽÝóõ§Ügˆ2¿³ßZ*B*Ùï¦�§ç2£®Eežìêêyž�ùr¹7D”úÇ;"U6Áž(t{£‹´ªM*ÌÒüµ>´u ¬ÍGù'…ü©y›e�kÝšº©Õk˜fbÂMÊöéÛÝ{ÜäÈÛfÂ?£×{¹§Ìƒóâ+½z.r=c€(1óT]cÜ•Cþã²Îõæμ)eQe/ˆü¿Õ8œÙ¿ÚÍb]‰(©'‚Ç8 Xo}/LìÒåàÊÍ¥z·0º È¢¶ÃºU•æä�ÜWZ0OÒJ@í¨î ‘¿³€!Îß!•¤&¥P…¹d¿£ùð÷^ï†l]¸…}ò.¶7²ÖÕÀãì"¾ö^Ê…8†·©Á÷ÞÅûN$­j¦nµ¹ä ªªáê̇ãÞ „½‰ú}¼†­³©Œ/S1 `^wG‡kÜcïŠùy‘eQYO'pŸú‡ˆÇÀAâê$2л©GUë. í¢Odn€í¾š¬õSÝ|ƒZò�+ª)„ëõo*éé¥D¨’1j³JH7¤vŠ„é91)D¾TVÐ|æqÇ`©W›ŽÒN6í€ó¢Q”vÍ ÀÓr˜œÆ=œ‰š"ø¼ŸùÛ!Ðû­l;V‡&:Î01]fÐ÷Ï/tWàMm›ÇLß@d‡¬çºÅ‚ÉàÏ:ÒP‰ÛW͈õ·Ž«Ú®uˆ�'z%5û»¿X¼Ð˜ŽâzD#yÚ]2u#k*“ûÚ\þÕ@W§d·~†DêòþPÿ:qzx}ÃSÈrM…gb‘åÌÓªµqÐgçß�Îë5œŠù›ÎÕi¡ehàc7~Zœü ³®³ endstream endobj 394 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚ•�¹‚@DóýŠ1`ÜeOBD <`3ŠHJ Œü}WŽˆÈ¨§k¦ºçq<ÁQ²½gÛƒ±p”#á�&!-4lš�ð=Ú(;¨7qb]¤hÒÌgqãëÓ¹œ|^d—üç:_±Â³7¡‚CÀrrÆÀ:G.Q¸¬í8ú°«ÀI¦Ÿñr€Ò’´’a~¡a7Æç7]ej"ÿI\ÏIJ“ 2ò >B,­æ “a?ß endstream endobj 402 0 obj << /Length 1491 /Filter /FlateDecode >> stream xÚ�WmoÛ6þž_¡/d bHê½( tëÒeX— ó€IáÊs“%Ï’šfØ�ß�T,Gº~Hx¤È{yx÷ͽ;�{oθ™ŒQÄáÍÙ÷ó³ó‹,ñDÆâ<Þ|í¥œeIâ%iÄbžyóÒ»ñØ»Níg�”™Ï>Î>Òc”HÉBžIT½ ,‰:ÿ‹®ÿÔõ�ï Þª¢í÷j«êŽ~{h;µ�0âB8¿ˆc/cy’„ÎVÈ’0'[³�û úšæ~Û EÜïú­èZwº¨ôßE§›šÖŠª:ýqÝ×+œµ4í6EGÒª°;– ÆŒûkc¹¯K§Ì�P$4Ë?Ôʾå\VÊê,Ü‘J/÷3Á}tZľvšõ‘ªb·«ôм !X¸ Š=ì e>V•*@�¥þ|£[ZvcÙÔvãr&¹ÿ€rì¯ö 4ãuáŒÒŒe©Ñ^QYÕÍv§+ .ôõLøº£ ÁDûê®Ðuûè�1Ð\AÓï·KL3œcÌ8:ümîz'¢¾Ú©úí5”!R­"Ñ€a×H ‹ªªf ßSbÂòõÕÛkiw¸KNyh3Ï K³Ô Â�‰X’Ù[)ãÑ.ÿ…·Ç ïàÜMÇ X\B’-öêNƒy¿noyÌáOŒ ÝøÏÆ kÎ’,þ6£oT·°ƒm0|‡Ñ�¶MÈA^N:‘|»ÍÎ$wäk¹ø<ƒëWû\9å 3Œpd}n®3—þ^µ}E ‹Ó¡Ì@¦2#“Ç È³]•47|” ›°pP\�ta–ø¯{[�ÎÆ¯ ÕµÕæ´lG¼†gˆ×w ¿©«·4h'�$Ëaš[Ô©hñ~LD©eT±¸,€÷0¤øAžL³û~£W›¡vêG#Ö®åÍcµ‹÷ïß/>|8ª$¬5æâ‘!ܧm.—È@±/Míƒh¨FÃDÊ®m¬0""Ü4""XèkÃB apk×pAáäK±ÝUÚó‹œ{9t™`'‘1t°ü3~í@¯\`KX¬u¥ØŠNŒz�àÐåÄpÄ9öv‚k¬Ó[[^�ÕqÄ8ÏÇlÖª¿zU¯”CÝ¿´ }«ÊçGÅçÚ#•²<å¶Ç�³$±UóÝ,H8÷?aj;¯õ­A½ýDâ (¢v. %µ/iñŸY�JoEÇs'‘ä,‚ÁhŸVK©Œ»«µdu Ø�µwH¾?)d³˜Øòü"‡×1™ w7/&4¦,�2·aò„:¸$xÜØÍ/'“�Éh°WªºéT{Ôz€ ´ëG­êH öž<²ÃBæÙ‰B6¼J fñ³r& ïv´µG"RV�ëö(_]¿zw)-Ïæ)Ã<<,Ï×½"¤¢Láª,õK]éî�¾B¥¶XåO«Jð ª*v¸ÔÛ)è(ñíh?‘)j´ˆè=ÕqGÙâþÏ ½R€éÄíiW¶]7é‘gW¹G˜»^‚è�‹pÇ$ÐK‹¾–pÅ«®²È°{»í³.ÍPkË$ƒN0.þÝÞðÅg]ªr"ôÚa ‰;ª¹§ d�—|ÈË®i*×U¡­æa0ÉÜÞ÷«ƒ^2ê.'n!gácÒÿWH÷¦h¿î�Ö>ÀkòËW_ $F$!¼ì1�o‹;õœHg‚¬n®®ç—W¿~¤cÌò¡åë—Cܶ¤w¯» m3Þ£°FÏÉkœÚÓôšôD�%xó,—öW r/äf˜Áîë½®»öH#~>P5tÒ±’I¦ä¢Sj¡$L5 Œ-Å~n¬1[îˆñP…ÄÑþ{Ûg8�dn³Í»L6£Âú�?ø)�ï7M¥FXX€ÔJµm±0Ö¢�qhåÆI[S/½:¿°¯dÖÈhC¼Ã­ &�á< ÌÙÇ„¬¶àð&ÖkµV€PËgÜÿÙ �mx5%ûxüI”�ŸäË“Šùq~ö/$cCy endstream endobj 409 0 obj << /Length 940 /Filter /FlateDecode >> stream xÚµVI“ã4¾çWèØ©ÂBv/ÔÌÂ��îiÏ� 9¨eÙí Ùî•ϳ%;±³TqàÉ–Þ·¼%&(F}œ|L¾þÑq‘‡}Ç™¡ B–ï`Ó4‘ë[Ø1Q¢íÃ÷?-žƒåzjX®÷0Çê÷—ÕÓÏ«§�jLmòðY­êçq¹Ø|Y/—O�z°ùm,§»àÓdLþœ˜À€ @"Øsäzö,±t²Ý»Oˆà™ï¡C{2Eö|†çö Ö ÚL~��s>A.ö]b6*¼9¶L ¹Ž‰I§Â0èáÕ(™E55|BÈÃö^HÎhÅ閭Oê’«…aH‹<3D&*Añ­`«^Ь¬8 ñ®QƒLËËdøØvæ ìYЬ*Õéj¯c¾Z(¸½mô×MÈ‚åwdy,y1…·ÿQûQ�Ý,Yž¦4 ïseQBãrûþw2'qV!$OŽe�•€ D,DÂ¥ÚåEö#�w´YR‡\‘D@:7·ˆÅQ¼¤G&éßǨþCTeÝ!5Ši’ðPEÚƒz.uxСa8&Ó@‘�3,¡Y ŠÌTK›µ‚3 ¦n¶’‡´!Eo<«Ôæ@e&28ÒŠ >ö=w "ʵuÉÔÌÞ¨ô%á:òa/Ø^3¥:§9cõ5¾a &Ç£L6vÈ:VmUÜO#0ªdcP4%×W­FÑ+*c®6nÕ4îpõ%ßl”MžòJ¤üt~pQmBE\öÖê¤�çáÒ*y—•üM„}ã3ÍK.�F²-O¢¹§=OÚÁë\ðéªZ�hŸñ¿ú9nã™= ÖOœ^K”'I~èU�¿oû+¶†ñR‹$4Øž³WENs-àIRv`dXFc»ˆ‡ó¨ÿ�h#tT{=“,€›Ù™…‰94W�Ô³ûX­¿ôc«o[…tÙ'0E*ݯ¡GJ•ˆ÷ïÎÅ4¥õa§§ûÈ•Ã>¦§²q-Ïþü"™§#÷cú¦úªc8ó°ã ®yC©Ó9þïʺhÞ[²\r£À¹Œ?´Ñúï”kŸ=s¾zþËGÏå'›Ždϱ?-UÓÿ Ä\² endstream endobj 414 0 obj << /Length 1126 /Filter /FlateDecode >> stream xÚ�VMsÛ6½ûW°Ó¨Iá›do‰k{ÜilO¢œÒN– ‹ Ô�TÜô×w�%Y¦"µ'‹Ý‡ÅÛÅbiò”Ðäæ‚ö#áÊOýpsñnz1¹ÎuÂr¢ Í’é"É(ɵNt&ˆÌt2�'ŸÓË¥Yw¶�9ÏS=úsúÛN᜚sB“±æDgÚ?Ü¿@ãOmsëÚ®Ù¬¬ëLWÖn´wyr­T’“BkÑcKÀfˆ}=4­=h–§+ãFŒ¦SázƒÇÁ¬ôÇ�ÆL¥{g†�niq²HUU�@ë¹tO(^7Ò<­L‹ÓØ~'¨~-çvNü¼ožï}9¹|óæ¼ÚA&×M2Rd4°Î$R'cA‰@Û×�?s4Ö”¦ëzµÆ™¿G?+»þЂH­Î´{´O¥ûƒ*ÚÀ¤v9³²°dûXòL,SuÖÍO€�ëØi¤ï»åêr›Sÿíü�ÍA®�_Çe›o’¦¦†ûŸ!þá'|Þ�Û»�Ó~v;¸ô°ò»«›Û»óøxûûôêî×óxF8m>àÀݽøðéýÕÝ9—Ý) 'YK‚/2á­òtfNÚµ�•‹o~!ÒY=·(F¯[ÿŒƽªü2â�Œ¸¿Ø¸Y4p¹+6T`ñ·Y­+»gÿ\vKt¢_€£\{G¹‚z¨8Ü3¸ˆôq©0‚7S9Ñy¯nÜ|“eDú5$DdPJÂsÑk¼ÐíGƒÎ#‘ºÊ$¼Žž±€ÿ€2„3R¨Ñ6PðuÄUjñ)@Ý…pDj >Á*ƒÇVº®Å�½~ÕØnãÙT©›<6Ö|™ô–BÀE% À¬æÑn:´ UÛK+ÓF‘³v7ëh�Y,ýxtT:(ü%«‚ñøRˆÕŠù6 ûß/1w_Ÿ5†ðÊåKV㑜mKÁaj@$ÙÀ�`¤²´]Ö›ÊßQi$dðÎq¶Í`¿í¿�ÒTå?ñ;ô e‘à€ÿ… ß¡—× W��ò"˜(ruTÛ²Ý²Žî”1½â•^ðà�útÎŽÐ'5)Šž†ÃŠrÀY¦ìÄ{ʉT/ÞÓQ8-Ïc1¥XvDÁ0 ˆIÈM�l—õb�û!6^0=ÒÁ“’È©öÄKï×ÖùR*(ÈMÉXú6<°ƒmøV¡{ö"kÝ]�øJ‰s ‰äúdAƒÏâ,þ9t§ÛpbјÙu‡Ù%¹ÿêM,M•�÷ì‹~ØÝœ—ºº‹¥ŽSÒºØpòR*‘>Œ¤GØÇ�>“ßOªgOºñ¾}kQó.ª† &±EmƒÒYÝ4vÖ¡¬[BÙŒfÐýš'Z™°O9èDÖ¶Ùý`ÊëÏlÿûîçLW×ñUR¦­ÝµÉØåЄ%�oqüäÃÍEò9(\ů0,.ý»ßE¥ÖÎv�÷b¿u7Q¸ÿ«A¯½ì©ÞÔÛÿœNŸ 6hWÓ‹[ça� endstream endobj 418 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ•P»Â@ Ûï+<¶!½»ÞcT^¥´aBL X``â÷9 �˜XâHŽìØŒ+ 55ž;�@Ñ9¹ÀhOÖDø¨É�3Ùl9i¤jó‘ö!sôÁf»i>Û¾¸UÝI›kÎö›ª–Iþ£øÛÃWÉ–äô5¶1¸¦0/‡E% endstream endobj 422 0 obj << /Length 605 /Filter /FlateDecode >> stream xÚÍTM�Ó0½÷Wø˜â8þJ‚¬¶+�¸åÜÄÝZ›8!ìòï±;ñnÛ-ˆ §¸3óžß¼ñ” {DÐ݆„/¦Âýçnó¡Ú¤ÛB¢¬À¢”ªö('¸�ÉœažKT5èKtsPìÇ8¡´ˆòø[õé‚çHB)f¤ ž„ DR,óð·OªZ ø›¾ÑW(‚Àt+*p)% LÜ1eÀT&N[vªm!<êï‹›jacÁÿêDÔ©Ùô2/qÚyöÅ´ XäÒs¸ÚÝ0ƒýK§í Ä"Rv½a±W+x´36ÌMOÞì^'ÑÇò�îz›“2÷<Äê’§ËH¤f}9ϺïÓ†.\d¸CkìÃó|§Y+T­ßFOõªf§WŒÚßÅ�ØY£A᪆r\ÐuYÞ7�ñ*opF£“'8Aäñ`êMÛ./ò!êÝa™ÖC¿Œ+îÜÃСËÔj=ìV0 n96~D^Y6F¦û?÷vpCŒYp;aþ?ޱó'P]lps4êŸ.zÆ1ãò/ö\üaÏùë=uïmµùÅä G endstream endobj 427 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•�=‚0†÷þŠw„Á³Ðr-#bÕ�¨L“Dœüû6|LLNï]îòÜ=/HìÅÆ‹õŽ ,åÌ þ •3Y£aò”8�ïÐD塨½»Æ«ÔØÈИî^œê£›ò¼uqë+á¼øˆ$°%I–ÆZ²©Æ£M+Ñ…YI*·ø›=t¦(Ó*ÔoÜÄEÈé¿9ÌÌä?Ä¥éDÒqˆA4áAb¾d~|9> endstream endobj 432 0 obj << /Length 1158 /Filter /FlateDecode >> stream xÚ¥VKo7 ¾ûWÌqÈÊÍ;@n§nãxáî-) yGÞ�7«‹Û+EòÓ̵£É`J†O„iÇÑxƒôÅPÏm± xìhlô#¶i’iñj暺ªxaþO•©ÈÌíû¾õD† ð€:°)Â\D‘(!?>M7 7U†½‘`»m-�;Ý’tÓ›özE²n+V7��ë•¢ÙÞùA:•Vñ”9¦Þ±¿ €o {ÒSMçÆú™áLà ïﺮzb…®;u ¯©ò‚ãA‰RÔ¾ÓnXÅíº}]±.ÃK.)oE ÖM_ûü¼ÃÕ”óÛ/ºiØøîqxzì»!ëN{lÐ5=ûü2Ž ²<.ð©'*…, ”™HÖ’3­L¤Àb¬³$…ƾȄÊKë=Å(³½FRp�(ãì Wb65]±åË=%LPN¶ôjòí>ƾzƒ‹^/(þ°íßâ)4ÿ�›åJÐ|ÿLùÌÛ«öwzجµ,§÷”æBAqƒQÜ`>]}þ�šØë«ÿÐ`¦þ�D Ò�#IÓÐR� Icð¡[×ÐÙG ‰G’ðáÕ€@´“§Šº—·ÕØVšäûÉÞLT‹ôl|If—†«÷†Æ~0G-÷2P§Vƒ*ÌKumj6Æ,îm]9VmÞþLIK1i‹Ô;ÒЛ��16Ù�;똼â,ᆓ 5·U=�ã…ɾ‰éD2³}exž/ßoOJÝʶ[Vå0nî&UØo¨gÉ•œL•s%¯n°MÿÀ‰ ùÿCŸ½™þOŽ¶ÚŽ?Ðëzh÷LÑ´ùdÇÿ]&TÌ VÙÖ¶º~u4}²æ~¨îÓ( /êúðoÆÎ»‡#ô—†»«+Z½‡Ûhg�¸0Ø;îîë©ë#óMÓÿû¡»ñ¹7|½¾ÀQ¸g+ª”ýÔ÷íô?•A x(Üz¦óx�8uWCæ lÅîˆ ÃÖ3�Ögÿ{ˆ { endstream endobj 440 0 obj << /Length 3585 /Filter /FlateDecode >> stream xÚ­ÙrÛFò]_ÁòT1!ƒËo²,'JűÖÒ–]e§X0Q&Gdï×o_ƒƒ�xklÎôôôL÷ô 9«Ç•³úùìåýÙÅë0ZÅv†þêþóÊÛwãU”xvè®îóÕGëê—ËÛûëwçk/Š­Øæßß.ÏǺ¿¾»çù»ëß®/ï®yòûõû»ó?î=»¾?ûóÌ…³œ•»Š;ÃUÇvì©UVž}üÃYå°öë NMâÕa–+øv |ïVwgÿ:s侎í8Ĺ}®\ÏN\7Àë›#B×vÌõc[�¯]Çq¬Û·on½Íí¹§¬´Iw;½Û|>w«n¾ÐmÍ1¯ƒ`"gµöbÛ�Ó»ßêóµïD9å¹sþ’¾$áÌÀúòÉ øçâŽØÊƒ÷nÓ–AiÅ€4Ï‹®¨«TÒæ±/uÕ1VW3tŸ¶²¯;w-¾Hl5úÏ^·�Ω»ôåƒnx¹þÌðnÛè4oeR �‘”ÁÅkß_…vù1²®”²ƒ$ëŸå–3Á í ö Κf\«ÀF«µëÚ ,&HÔ%‰¬]ñÀò£ [ß`ìX gÊñ@ÚEËX »_ë‰æróÅíEñwßè}ÚhÞ“§]Êà¶ãê³®o´9¢Êdz²´“]¥.ëíá‰é s�A¾¸çA ’±¼�^Ä„ª5•Hà�u_)V44§¿Î½®ÔË•ßÇÄed„ƒa”d¿¹îP+€\YT†F*‹|áAÊ/f6±rC;Šá=ßv|1…Oẕ̌>®ƒ ´nPãb°2Ö…ÄY%  ^ˆºà);I\£-U_nŒÜŽõ&LlÏQ7Û¥}‹ÚÄþÂë¶`%ÏAY\W”ÀYùŠ‹-Ø”l©Ú"—õnkŒDÕ@”v¡§lWD€ŒF)ÿ ŽìxÈØ¨R@&}À§Þéî×qh;Q0ö}]î7ß—DØ¡¤†¶ƶá{Þäø`r<,ùÌü¦àê,xý'|Ý´Él”‰P+¦Æb€ø+Õ ùAŸ;ɦFê>QGÝ_ O3QˆïÚŒ¶|š7"MîZ½£ãì¹æ­ÁE{¢žÁ?POßµ*dÊ÷ŽEà 0.6j›¯ lÀ«=ênS¦_ÍÖ ë“m=KØ1ÂïÜù6,uXœºsß›Z?N�¨Q„ÌòT~ìߪØ:œ)xåñ±x½Ñ�`èiüÐ8Y@œºš€•ÛYÎ(ðŽÇzíÆ ÷ 1 úO4:‚¨=Ø6{Þ`ÔG<‰œ[à¦Ô í[ˆ[®Û‘ûˆ[^h{a딲“¦Â…lÖnôsÎ�¿¼!PÖkC阑 •Ê'/Õ�ÄØT(rþw4M¶¥¼á‰‰í÷ûaçç¾Ê:v�hì „6>|Ø|`lã+PaÑÇÄ.«ÆB¨ {®ÄR­sz=WBÀRôF¤Wu!K%Ü®+öè¥)ןÇ«(j ™Ç¥ïš"¶E• ™'$¬œËùUÝ1àKÅ‘�gO[ zÕ0NÑÍù�ë+ ¬£#ó ùeµŒWà¬ÎV NG#à ²<ÿ¯¢zä5ò®ˆ|È=¬Ñ!°$Ù…c�0b·îw9/ ã(Ycg[^*k_Ò=Æ'Ñwë¶|ðþ! !¯+ñÈOE·åÑÛÛËw7Þsž˜WÁÄbÔÊAæÌ’ÙTüJ0Öi[ì$myyÑvp³¾h·&iùÜÔå4;:Š}ÇGÁºÄŒYqXC£>º€À”�”d=Ý>ÿ�Z#�—(Ö¯„ +�Aj2MXƒiR©Ì³‹ËãáRž+N2QRÐ!ÕH L*¢‡ÚH—[ElÈõLÉB¼åA¶-vy£ÑOM²oðM{¢”—Ø¡ïþU$wìbmž§’ŠPO¹%È•j-g²�ÀK›"E._ã©Íhá‡ÎêÁ¦à`r{º$$?È DP!Â0Ò?�‚Õ!¹fßù.ŸJ�I à’aÁn²' oq§D_Ëm&*Ms“†B¿º¸úé'’ñÃò’X)r.Ä5ÎÁ°†LY04NÛxâ Ü…@Ò ùü2¯CS)QabÊ^Ô¨h'ªU®üÍå"Û�c麜»p5-À$úýÞ0…Òè¯È)·@0Q¯‘./KR{ÄCq]]œ” m––Èéª èTi)H¹Þ늻*‰ —n˜V�;¹‡'=™á,ÿ„þ#JV—ë¥çÚ;�p@�_ �’ȵJ�r¸£PìM" ,þüû¿1~γ»¾¤x°E\ëöç\ñ\…N•säAÝÓ!صÌ�03ÖBÖ¸Æ N�ñ¸Ù=o^¾ Ý"¥%‰—»öB1Ó0‚»S±H㛊×Nx›P2AÜÝòœüdˆ6Ø7ds!v‡¸ˆ&£leÝðëæô0ŽôqêÑÀëQ脽èÐø>È.B†(�˜=.v�È‘ „’À´�ÔéI%Ì¥ÂD | ;8˜Ié(jÅ@'lá¤6ÆÀ¾Â„ATG[ó®Î\Fl_-vªšÕU—•ÜK¶Á©Y×§»¿áÇðATMVr èAÅ ‰²Lz`â¿(¬¡“+:ãÃ8¬Îÿ–C†’CÞŸ‡p÷ö ¿¾Gü¶]ÓgÝ�d•’n�oœÔӶЇúû-ø¤7·x‚² þ\ÊA\ê”;Ó¶�§Lî�@ãE•\ÔôLÆfÐòDÔÔyŸqÿÒ ­KÒ ƒÉYš`Ò`^–�‰ôæFC¤Ç3Êý®ÈŠŽ ÏôùÈóg=uLh¯œƒ÷çâeº¶KñnÚI6…\lAÁÙÎÚ»¨0m[<»¢“&.± Ôµ•Â)’C…nÚ1�í:‘8Šíç *™ž=FÏÊiû­Ê¶M]Õ½š³Éi6Ç_÷"Ø­é&ÕÍ × Éy©`¸¤%|+€=Èmyã=‹Ј XÍ´œ–²¸€Laö•¤Q-�YÀ@¡Ñm_2¹`È.°ƒVñ:FåV› ne0(1`\ÞÞ0µ™£È`ùß¹†ËîL͸TaØ_L8L™á©ˆš2"ü&Ó2Ô”µ2åæç) ã 7ó7”w3†Èc•º³mPÈÝ«h–ê*£�0htV7¹ˆ�tqÁ×IIáУKyDÊÊ !€¥–�¡¢INkÇ›�ôpNåù´‘ ð‰€pzȵH†Ê0nãh³pâ‹ÉÁËðKK÷$4a'’ÆŒÄFåŽÙ$"� AšìS•%ËK)ƒÀCa#a'ÄH�ÆUI ¨’(‡VazìÝ"gI�DI̶åÅgRVÝÐG@fªíR(˜Úáœ%Kgóö¥‡#ù|èrV�ó)qÔ»B¾:©Ð·î¸&Ctc€8æ* 7S† àŒûY¹àÏÆˆEn2ßÍ¥mº™›¡œ‡ßÙÒ¶o´|öÔö[Ûér‰MäMzÓ¦KÌöÆiÇÐN.ÁW‰¿‚[’LX­©Ë��yÓØ ÷ǶŒ„²ô½b¾ç!&·ä�Ö\!MóVÒö…ãXî'¡­‚¡C ®è8ˆû�íCÇ!Ý!e wÊwíð°E@Çõ‡é¶áûÈ–âh¢ˆ^Ͼ´ãªèááo84CJÝq­k¢(e¬wù·\ð7Η"i À�†FއÉ/ÅâÕA:¿ó£�Â>J“†z º?š¥�•‘…BZ¶-°ï‹ë”Fá@œ8¬JêÁ¥¨ë›ˆ-QÜ÷Ô�@TùLŠHRí§�Ú,iCÚ़ò,ïËÉ}{ÆðÅ"ÿ97·†«J6‚ø‹ž^*¡(sõJæyºš ܈ˆàÔµ¾áÙL«¨;MZEÑÀ*çå¯çÑ´&Ácéí"‹#ŒÅ»É'cs„yÚT2Æ(.÷/§µ4ALüÚ)Ñ)ßÎ…d|ÂhäãI8f£a,>q(qã¡ÄÝ�[ ~aLÁ¯1±Æ†"Ï�RcÙ%¦†¬¤!5gÿ;ìŠ)_G©K? “wÁk9ßqékÓØ˜‘ˆâÓO»�Ó½ž’‘O"üW“%ΛaÝ /¥Ær¼håSä°/–®ÿì—!‡›ôÊÞ�¬«¬0+®¹+Yuë—éð÷·Xq.L\½åú֚ˌb†@ÌždÒƒcßñlÉañ Ð^SÜ Š­ß@NÕä«ÎKÓ�û½©·TËòÕVBA 9…ùm«w‚óª�O§<½Ë¶e‘›Å¡IO¥wÅWž¾ç¿MY4‹›êÿÁÌmSgò·3¦Ê�HnªN–ÞO?ß¶ÛZ¬Ð쪣ӿy)©|i%qü~u‡’z>ùúTï„vèúæû×~îK¾©,×I\o±éúêíÍ Þà:68Æè"‰âµ¿•·bn´N6ɬ7°ô7uAdÇÞ�üEÝñ_þ %Øa(áÆ‡ÿV—- endstream endobj 447 0 obj << /Length 1021 /Filter /FlateDecode >> stream xÚ•VÛŽÛ6}÷Wè‹ Ä\Š’(1( ¤í¦Ø éº�ƒ>lC‘¸¶PYRuÉ"ßr([Z7AŸHçv†sFâÞÁãÞo«Ÿw«›×2ñR¦¤ ½Ý£—p–Jé%J0x»Â{ðS–¬7"Iým§Ûn-¸ßäºïËú`ÅÍ£]ûf4·¹¶ç�œ‹J÷ëO»7«ÛÝêŸU1¹L1Ò”¥"òòÓêá÷ ¸{ãqªÔ{2š'/ŠCG!ì+ïýê�§¼91nq!©ôÁTÄ—0dÀø GÀ9' A| DA@àÖs .ƒ›×q|Q6îm˜I.m¨ûí«?ïÄzòÄϪªAoO=ž¥?4V^ÖýÐAB±?žt=ØË33Yéªa2˜î]"`ÃÖ›H(w,{{÷¸¹¯³aìH¹¤xc¯ÇÊÊžŽº¶Ò£Î ÝÍÝšCÞÔCV’Ö}«ëw[Žƒ€)@mæMaâ@Õ:»:ßéwWhŒQÛ©Ÿud;L5cM{Šjö�ÎT¦|˜ ‡‘¿[ØŠ“#Ü(X>ÕDÍj†/@ Kßœ(|ßê¼Ì*: ºí¯A=fØÕ_Ö"ö©³ñ qýìÎÙߨ‚ø­Øn:w}¤Íâɳ¡lês—ºîÏÙZãlø¶,!Ší“…Þ® ËÄ·VåáHmÓ—˜s¸E”$¾ìŽº'‡¶6Ög§_Θ€´‹¢±$ ­mÀæ:›8–þ«^§X ±µr$™¦JUšv1!ûó@éúáÙ½@_ÍlîNãh>Šló\æuf³â^ÂTÂdsÀR…€JX@?”u^�X` äÇ~(Êz`ÇŸ\á‹d|Uµi³®7msjž*?/Œ"k´ßï·÷ï¶b÷û/o?üz çoÍ›�Kñ»5ßb7ùÄG¨†Œ¨ô2<—„T"#*‡ãR5;‘âœÝxwÁnT0Ïâ±³ ȆÊÿ€ûê«UÈ¡e¥;Òoø2_Ê‚beµÕkZìMS,ì±X/iÈšAp¿hˆú–÷ Ávµ²�<æöÝfl(skuˆ¢ÎT[é!Ï­Äå²üËL«×iPòdO©œÇ�shëvéqÃ4±(s�eηӼ2™&Yßfž;²A¦º|¦o_o4‘*+ 3p&âùü²Ï¨™¸7QL ÊH\íÁ»Zpñµ›Í€ƒ®!]D=M³©aOý;÷a5ÉÖËQ6avÀ ¡!/)$ÒE*ãÿ‡Ér3ûÌõ»’„%\9í%nx�9èð?ˆm ÿÐÄ÷ù%t7ûˆL—q®ýSÅ ÌïÿóGõü0"íšLJ¢Z –‘ÿ 8¤ endstream endobj 339 0 obj << /Type /ObjStm /N 100 /First 868 /Length 1853 /Filter /FlateDecode >> stream xÚÍZÛn7}×Wð±}¡8Ã^€ €sq4n�$’�¡Ë*5šJ�ãéß÷ÌJ1dK±WÒ"éCL®vHž™9œrcqÁE®NÄE!GJh£c�Žªãšñ–ÛWÑDŠ¢MN0"Jv’#Úà”ò jp‰!£ì2'ü^]Θ]“+Œq˜²ªµâ(”‚NqÄœc-ÎXÁ:‘LDÑÑ:ˆ‰‰Ø$Ø2¥à(`¥ì¨àHâ8¨½"Ç€s1{bÄÌÀÉ’ìU€n! bVt æÉ�lžŒyr„BÅ:ëq…סÚ+³†Æbaû… “u’M‘lsV“3{Eû“íæÃ˜jÖ,¯ ò˜R‚Ù°ª²y+ø°¼B� çpDøB´Ú†7e*ä*V¬¯°Œ¢5²ulÒçp´ùŠÓí„ð‹D{•ÑÉu „ÑjÞ$rš`3�´˜%+Zø;ŸZ ”;m—„ R ƒ]]"²Ñ �d° D 40û¤H@k­†m’ã¸" Œ`â¤`–pq)µÔRtl)˜+eÑ–l©ÀÝø9kƒbPf2 ʒЬ !< Ö&ƒ�\Ž-z´j“a’ÖÊ1 #˜ÚfÅŽ°='@£`PÙbL†¿å¥Á´\Lg¨§,Æç*¶¡@ûPxðàÁ`øÄ�E,ÜK7|óöO€öþ×LÞØ1ÿüáûÁÇ­ìñb~å||Fíƒa›@)Šâì®T¼ÂŸœÙ’¨rõDrG­U^¹á³Åë…ƒMzñü·_Ÿÿöìg3O/ ¸O1^ƒˆ1ûŠ,}ˆ‹ù´ùrþê�““£—oס´NOÝwóºì}»y‹¬&õŠ„Òe'}+*îK³7h–èPšÕ%ÍRXµ¹WºQõ9XÍ„¸†”D ›ÂÒ¤ÑWN[=ýqñÏG>?ÿp1>/õG: Å ˜^Éç–ðê-ó£>óPú~$ç#™4S.!ŒeRe2f”E±‘Q×i…1÷‡µŠGZGÞöÅÊ^0a›ÕNß@�扈™·òýÍ„�J2]' ˆ¥ÃFÞ¬r8p¤Ú'áÍ|¨)#{”¨þÉJËè¹j×èj>É´«OnXþFï!Ãå´iy90Ugý©ºè†"%î¤HÙ P.ËØ™W±´¬bi¡U˽ÆÔ >áƒó”gN,>(ò€e϶G²OW—Ÿ'W§¿Ÿœ"L¼lÞ_,æççó٢ǤªWœq¿ÂŠ!V¼Ö*n]®jØtTf“¦–w�§“¤µŒp´Ox<Ê¥öi#…¶¹F]“'Ö=P÷‡‰RiSSÉÞn X«Ç9ÛUIAÿ§v\ƽ¬¾½QäV¸¾¨¯º§ -@é^Ö­ËÞWÖm‘µ²®–n²Hiž¤”�(€ÒîåâÚñêV4_;…í«lÁÊûÁ5åküþÑ\ÂFA`L‡Eóº´º]o-ÛUt¯½ «O Ž¢yÎÛ½@ÆILón×”få¸[ãlÝ"«šq¨?T–+û”K7Yä�*ñnYõAIƒ‘<º� y¥Þ"Fõ¥|²ûï÷BS¾~Ç\ßåÀëÜ«;poMVPÝ%Åñ–Jé4±ÆâµÆ»e©&¯dÿÕ!ù-ß6·Í›qñNY¦è­À¹Ûñ?p‹·Š×µSûÞüØÌ²oøky) endstream endobj 456 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚ•�½Â0 „÷<Å�í@p“&qÇ‚¨ªÐH U'*XèÀÄëõgêÄt>ÙºóGx�p» ¶ëÀ²°V#<¡-I�1\¡¤Íz´ÉþT^‚¿¥å8a9i]¦%Á7aò7_û²ñ“9û{“v¡>ˆ�Èb!ƒ#ÉÖÂ1KV9ƒh;BwbkÁøŽ—r£¥ÉuœßhÄUÐüLãbä?‰kò9)7ÒFÁ�Kk„ùÉ“A¬ endstream endobj 460 0 obj << /Length 1272 /Filter /FlateDecode >> stream xÚµXooÚ8~ßO‘'­½Íi„ÀtœÄØ`½õZÔÒÓ¤^µ3‰ ¾&vä8t=ñáÏŽí@B ­ÔöMìÄ~~ÏïßcSÇŠ,Çš9æi»žÊÇäèÓìètÜëZ­žíõ»-k¶°|Çîu»V×÷ì–ëZ³Ðº=¦)"!þy\·w<<¹›ýQ*P\×n;=W¢8è¶l§­.§Ã«3Wm?»¸ž ÏÏ@œ:Wý<÷Ë·û¾Ó2ØŽíµ; {LÙ‰xáGˆ †5Á$ã0Ž!Ç”lÞ°<�/2õ&CH æ(¦¶d$ÁE0ún_��(Yà(g[8t¡žÚ'³I„ÍÓ›~mþ+—ú‚¼§“J`+È1‚»Ò"x� –µÂ7"ÁN"Ï%ОÜÈl@^ÏÓ;sÇQ„t8µÒ‚àF¡¬T·c·Ûµ>»¦I™’Eœ æØ4"+Ì(IJoV©º «q’¤…ù2�×ø1¾¼úñéæìüs M¯+×T(H -ú ‰Ø‘]õó‘æ:*B[ZX]áL¨}×3*Åh¢›ÓTº>Rb´2'mm�ÉšÞ0še¦I‚±ºM> stream xÚ¥YÛrÛ6}÷WðÍvk2Ô…º´i¦¶¥Î8�;3�i;5DBj`R®þ¾K t“T//vÏž³»�Boç…ÞÛ“«û“ëÙÜ[ËÙlâÝo½ÉrL–‘7_ŽƒÙÈ»O¼ßÎV?]ÞÞ¿ùxî�狳ˠùþp{ùñzÜŒ¯¾»¿¼¹9ÿãþÝÉ›û“¿OF°zè�¼y,f3o¾X‹ñÔ‹³“ßþ½ž½óBØgá=ÕofÞ4šÑtãÔ»;ùå$ìZ¸ ½y°œ‡£ÊÂÑd,F`ál„ÊÄ5ãGôÜŸ…áY̲œ¤˜7WÛí„2y¯Øcy‡3Z`š4W›’¤Iå…çGó`²ˆ<LgQ³ÇÍëõÍåÛ»?×>þyõéúæuýf÷ÅióbJèã×î~ÑŒq° š‘ó2%›fœþª‘mó}demEhXºG¹Låˆ,M !Ô|QFE�h‚x¢7ÀqÁø±¹´vî#ý½¹¾z•H¡b˜R°æ;Gº£á1püRð:¨H3ýôecÃñÕ`ŒW«z‰ðlå¢\e—cíUM�s2šÛ¡+É*˜Ú.W3¾‚õà3(0ÀÞÿKЍ%Ź?]ô-øìÈ÷}·"hÅàöVB9žÂË¿‡Qøaó˜N.FÍ««o¿•pœsc!Øó�_¿$4NË;``»#{ŒÌ¿R‰}†Ô¸úõ×s?ªÐŽþ'‹#=µ‹àÀü“åÆëù\nldãêî—±îJé3V4GIù™ÚðŒ«®,ÿ³¼8Ù¨Âà`›ûzJ“Aœ­#¾ "ØÂAÉ/›©ŸÖúQÃmR[sì€9' ¶ôï‰Õ»RÏ7’}1£[²+9>•ËpsÙ=Ns¤0_Û•®­”€Ô}pvÇQ&o?‘b? Š2,^¤,F�g:ßwq¹M1RxŽCU+v,/E™WÏ1ãØÏÆw¯ôšã´*Ò¥ëÊŽ4­wmæVwx×fh+ ï‰¤ß }ôËó š(Ö°üÈÉn/-­rتÍ]£årz¡‡Q;œµÃ¥Ž�·ípÔÇípÚa±>'áþ¬}eÞípÙŒÖK¤ïضxB\^­Y Q«À¹PpÅ °£i0™Î̈UH‘@˜lÊs¶U&ª¹E^جQ4­î°Rbš±„lI,mª5¥LéPW;�cž‘¢À‰•·©ÔF†RfŽ}8;¢´8j^@v‰­;î>ø” I ŠÖaã±6–Càœ@åApÎî €¤ B�¸Å\™„„OÄ…CÆOWHƒÊ)�Å#èÛ©Ä+$HÜÊE ¨ïõ½Ï Y® lÓã……©€d”é]úû¼Ðyì{•ê»CâÚÂSµ+Õ¡ÀÁ½âE¿ÕQ“+Ú!ÌQüˆv¸�•êlYš²§J}|²*?%¸@ÎÎê:™|ØaŠ9‰¥‹Ûyÿáã›Ë×ïßœÚÙš%J¥óÞF"Çq%&»�ððŽeØx utf÷�‡Ìž­E΄ieH`²<ŦòRG ÍÊ]Œ ¡PëÄe5 »ý †Ðô"–‚;¶&äu^Á…Rc#g ¸ƒ6•è˜r­Ürd \5PJÓ£±Ô8eå{Æu¬�eB¶�¥oþä N¬\Ùhr”Î3¡¦TëßšX?˜óÅØëÜ�ä’ïA|mDWŒµ‰ßµuPÕQÕÃÁ Múñ›½Œt¡ƒÕëf:CÄœäŠ/�õ³¼°Z…]‰Õ±z…ªIW WZbaÊÇHÒéª1c¥ÒÏQÀ ç‚¢‰jõn¥PJOJ®«cÓ…Ö�T�¾.ôWG y¼í[c•c1rbƒD æS“±Å{ç1¥§,�úÌUÖfH17SÅf1Ï4�‚}'è PHŽTãÔƒ¸L>R"éÓ@¹& Y][TÛØ% ŒÈ#Ik‹Rœ*X�KÃú¬¨¥ÆKj"Þ¦ª²M *r‚`msQ=§ç»­˜®OÈJ«.åJÊv§nŒÍt yÙi`�ŽÛ2UÁ&Teª­ó”`H];½tG¬•î‡[GE'�aK§Ràg“²ö´²¶8æÐ¦ÊÈj¨ä§€ˆ�þ ‰!…kX1­TœØ]éƒï×+øÕÆ?˜kLUSG0uÚj"5ï Ã€ØuÎeZSŸDg5,ì5]Ù\æmÝh¢qQY�Å:LÎ’ }{u˜µ!°Èú-ˆãƒæ*´0­DqL* «Àé¸*·ª. ;À¨ÁídŠgXdÿŽF5ÊTÕf”´%j›:j*¥*ÜQJ0ïQ È¢CœjOÐ;-Ý•ïÙÓ@e‹ëÞUñ±êQžöÌán·àIfçPmêÊ›d»&eû-bï·=”$\—ÐNÓÓKufs*ÚuŽ­Òû¤Ûè£À}Àéÿ€Lñ?ꨆë0è:j“@÷ӥЌoÓlE®^FuÕѶ¿ŒÐ™TºùU8¬mJ=Õ§2jÉéãüâ¹tÑå8c«Â‰VuÐE-ýoŒëÏ�h@«õíôÿt’+M£`_ÍOc{ãþ A7 endstream endobj 470 0 obj << /Length 1839 /Filter /FlateDecode >> stream xÚ•Y]³Ó6}¿¿Âo�Nbœï„€ Cé´7m§C™A±•X\Û2²œ�ßu¤•mIp_âëi÷ìÙݳvƒ(x}÷ån ¿Q0 ÖQ¸Y­‚õfnf‹ Îï>|Œ‚®½ ¢p¾Ýçë�y°XÎÃåbÇYp÷Ç]¤×z±»{òjëp»Ž¦Áîl–ál: ÖËi¸Ü®‚]|x´KéãÉ*ŠX¦�>ż8°c-hHâ‘:÷_´Œ¸p®³bW¦ê<«Ôo]ÑDI®~cA‰¤�?îÞ“é"œ/VÁd.V eC» ÞmQ¿Dý”‚ÉõZ$ËpýO¤–¼yx>žLgpæ_^«K57yÜa‡«1‘2c©Ì¸à³gRHË�”G Ó×A�´ ¢qÐÚo„x°âØs¨ gªŸ>QQ1^tÍѨðƒëds8Ý„ÛÙÖŠbÅò2£•DG.–a¢yQ9ñ„¾Ø“&.�Æ“Nm=sñ€ºK©ÞgÚ!¯�©_Í›.Ð/[Þšóúý_êòKž˜ªv/¡ª‘ÜÒÈ{#¤†Á–6WÔf˜I‘ç0à6!ŸXÒ‹ý@ñ¾—«`;c�aÔþb¿–À3m[³¬ [cMÈU¹pª¤WÊØÃ·ÄŸé^7ØÝðÁ¢Ã÷ë×é®F;²Ó&¬`’aLN$«©õD'(P* ÏȆLCQØ›�CJ7c¼3*˜è熘qÚç€sŒÖ¯�LqãÁ íqr#� VïÌ<Ùâ„úåËgñv«�_½{þúþÙD{õîÍ ø'+y3ò�m¸&³(œÏt~üt½¢^ÎMÃùVÃôžc;ÿFìvRù‘zútlÅ#çh“æým8�m|IoV}…küVg’•¨4Ÿ‹8e Õõ…Ów‚oÕ…a6~§Êµœ…œÇ’€¼Ö·:زßI'¾I‚`*6Cî¸_[ËŒÄî¼;4¸ Í”`7#`}Ó±çõñ¹°f{@Ix;Ëê1Ó¤�\Pïüp1ÿ›`7m¬‰êܾ×îßÈd¶zmÒ)FHsëΦÛ�UæëÈ/;÷cËrBNýÀ§–ë'–Õ:’®VóæËˆ±˜oáÎpµÒŸXfs{çÿGd  endstream endobj 474 0 obj << /Length 2120 /Filter /FlateDecode >> stream xÚ½YmsÛ6þî_ÁñtÆÉÔ¢õþr7ùà:NãNš¸¶î.™¶SC$$¡& –%knî¿wIbAåËùƒE‘°xv÷Ùg¡¾·ñúÞ�g?,Ï®ÞMgÞÜ_L§#o¹öF‹‘?ZL¼ÙbèOÞ2ô~}uóþú~yûðº7œÍ_]ûÕç§û뇻au}÷ñqyýáÃëß—?�Ý.Ïþ:Àì}oàÍúþ|:õfó¹?޽ >ûõ÷¾³Ÿ¼>¬3÷öå›±7žŒüÉxב÷xöËY¿iá¢ïÍüŬ?(,Ä9§¿�Ê-}Ý›öû¯žž¬Ù&ÏèEuCK%Ø<º“\ò˜H�(:T·‚- žEu½æYuQ,»“z <�TË žg�Z9ࡺbI=¦¼YFɳÞ'²ÃZ&Ì)Hš7ž|ÿ7³ÜÂë £Æ•Q8ÇsÂ÷8�ºEª�óß_/ߟW_V9‹B¿œg0öGã©×@8 Õlÿark NxÒûñã¿”91y¦—ÊFinB�5Eø8‚§,¢>) žÉ†Z�󤂼‡f5€'Y°e@è”uÒ°R²¸Ën§i!º×k‰Öx^]lÉŽºO„„ø¡áÉûªLmlBA˜ Ú-2ˆ(ITŒ¬(LåŠFØ€ '–l¬EIÂÁ¬¬½p·ç?)à~&Á§Çêòsõ1èû+>#¢Ñ!i,.-ì¢æ 2 /«al•‘ŒQQO×r¹™¾Ð —dáËuíyöŒØVŸqI–b U©Q‡”Š^Ï‘çk"UNjmxÏó„íh&H„™Ã’Òö^o¥2[¤4`냆ß4ã©W¯¼ÈSÉx"Ìô°XFí\%M†ù*q¯ÈX*æ¬{d­öRU�f4Íx@…àÆþöì 0 „ó�òþpä/f¸øWšÌª‰onÞœo‚ úRš£r4Ÿ¶n¾Ì§LÇ­Ûi¸îMÇÊ¿ FãÒ ÉÌÍ'l7Ÿ?ƒßÿÿ1ÀDêæþ¾¹ù[õ6˜T=ÑVÁ“2à§S1^˜ˆ–ün0*$qu±ÉIFI5åpt&s$·"-t(ò\¦9ººD榠̈́íÊÁ˜Dh¬\–‘#÷–ÖDÁyeWˆŒ H%á@:z‹µˆXÊ/Ð>®6ÉÖ.6GØ€WbáãM7ÜUìNêúHbꪼoZ�äúƒ2¤k;»l±¾ª)Æ7á.0Bc�ê[ž„4묠OW¹È®"Âç ×5< ¢kâši²­&«ŒlŒT¯ãh*¤�/*Œ,*Ã" ˜�oì²�4�Óš½¨°ª PÒ2Ë£štÃvEd´#¦%º4œMž|êõªÅßÜ?ܾ»ûŒ[܃êõê2½�Xžõ¦Úû'+Á£\6ðU‰ Õ]‰¿´j¨Ÿ )°�¤ÇA¤ I{ЬêUk°  :W�×DHJá_"#0îÖ&»˜°¤Dˆã¾(ª¿å“^½<&Ã@a¹h¤éK"Ú%RG¡VT gÍ>À!›ŒÄ6FZáøŽ}¿åA` gé��p‰$-/É�¾µjlðå&�HÖ4¿;¼îpé0d…!—|©—Á(Ì“\ä$r69�q²KBrv‹{CEìYKš,óæí݃å}#B¶†ÆCÇáŽD9µû9ÈhúJŒÚn�ª‰$Ê׎`~È;èT9ïmi”^ØÚw‚�“¶DæŒÍ6|‚J+ZöZ w¯€ç­®(Ö9ŠÎ¡ ÍHtyL“ªºÕî’uè[Ô/ôbQj5µÐ:Ä–ÉOßý· Ûÿa: Þ�ýŽVÜ’ÞjBÖL®ü²×yC Nii¡–sš‰¨c¼�Ò%iêúºEÑUCk8#b“¨â�@v,¤Gzñ%šsÜ\ʳ²'R« >ühî°]вéð’“+wekÀ³L¯aÍè ç*íÅ÷š)å[P-ƒ«…‰%+¹+gWÏ)Z\ó(â{b ˜A+iE\±[ýÎ(»†µx²I ¢>Þ¯¡ÀèRqJŸ!$–„@Õlè‰ÎÚ3¹-¶�ÈÚZs¬SaÆÊîò„¨[³ Ã.¦°ºÎâ�v¦Ë´ÈXœ�iWšðjú Z¬NmR†2RGë¸æ�žä…ÄÐrw*j—ü¨tʼn€‰PRWzúg[Îí:¨Ç™ž²Ë€¹¶Ú–U6ÑM� ¬#œr¯:µ&Y}ê•Ú%©s]ÅyÚ)�“'C�9Òµ�¦Ão*µÜ.cÆÞ*Ô@ˆš=§Ãÿx®¡ÛPã¼·š?‘,ëLJÝýjÝU:¿ q<£ÅXI!3´­¦;twýLë–ÀÌÌáJ—þ2‡#µgô¯Þ u«ä:äQcô!ï ¯óùQ�‘,ÄÓ‚ú€:¤�#tRÊlå`“iJô\bø½QGŸ¤0ö‹AQwí�3¼ˆÅLÚôhŸûR _}Ç2Bl‰FÇ:›¬ãŸâžó´‰ªÆÈØ©îQ37Ï+œç÷·^Ú:±…„am¸6qUÎÚZ­Úµ??°Uq*rã‹¢l„ßHùõ1ÌÛÛÇe­Õ1"›ŒÝEö_%ñò‹šÿ4â.Î9©:_6:2^¶›±ÍEÿ.¾)ç‘‚MŒ¬4o�ûµò×Düä”uzNíÅÚÇêV*ÖAV'e˜1¼Œ¨X5,Ÿ’na Ê'¼tÀƒ?)ÕÖ­ÊI­ÓÄoÄŸ#ý˜9mQV±?¤ о rÜÔ \“ŸFÇãÐûV±<­Þ90éüñ°(ceRëO]¿ÅNfþ|ø-¿Ä¶#V3�'þ>J£†c{á¿Msn endstream endobj 478 0 obj << /Length 1707 /Filter /FlateDecode >> stream xÚµXmsâ6þž_á¹/ÜÍ`Ç$@B¯t†r�K;—Ð@ÚÜ\;‰°e¬‰-QK¡¿¾2ÒÊï—»ë•/FH»Ï>ûìJ®µ±\ëâè|ºVÏ:s�óáÐ:;?wÎOú–}ú˵|ùÛ/–뜎έÝaflõ§Î *Ç‘µ<úíÈÕký¼::ž�\ëÌ�¹=k˜5=g0Z+ßúôúz+£(zc]÷õ#‘&˜¿ùk%·±ì‘ÓöÕÄqõs˜Óë;§ý¡e÷Î�ÑÉHͼ Ôb"Äj°EÞ#Úè/<ÝnY"¸úFDW ö,UQ¤HØ&A±þ�`ê¹Ö¿ÊŠ"ì,²Á¤Ìö�²hGD¨æÂâøY$ÇyVc–€‘AþŽwˆþ™¢kcÖ{õÜ�'B7jüà1��²“#QG” ×±mí¤­ì/nfóË»NÙ®Â4eâxy;Ϧ9­ÑX²¸ß´åHLsK]¹¦ha{>›¬nof`ÊÁê<m˜@Ð!Þ…8Ѧè%!~>ñ�à D¬ÄÌ-J„~ßB/§âUˆµ—±q7âì‹Ȉc/&Ó_'ÿë>éiE+4D{Æe(Dhh‘Gýׇ MmÄ«Á~Ö/þtno�Ûwêñ‡„�íÔx¹çÇrzÏyc÷Nä›U#ónf“wÀ#²4ò5LE ÝW¹Ð�_ü2F�ä‘h俆¥$ ö؆’0o§ò0(39ßÇÆË u[RÕÈOÊS)*û:¿5† ª›êE©�+HEd� D�ÈÐ=,FBf€ÜM[µNµC$™TOŸaN;R3ëhÖ´ŽFÍÛR¼d,Ÿmm<¿»¼)»�CÙlå)M‡ôá[ì‘`_ψÉdÏvýzÍbA€«i€Ö$"b_ÞÛø©¾†û'œ¬Y–6õÂÏØKóLÍyˆÑ#`·#Q…Òm^ÈR^qAÇ6I)Í+…sœ›ZÇØ¤—|¡ÂNRIÈZ,x (�DŠ˜PƒŠ²TlSa´‹xa…3ë¦De¶„ø>¦à9”Ójøû¸×ykŽð·xëþ_ÝÕþŸ\t;¦Êùº�ʼnxi„ }8HÌuQímÔµ6åý¾½ë~Î÷)�>ÞJà´ Pt(Ó³&WËËÚ|™‰p /tnW·­™1�¶¬oÚ°nY³`b¦ð±¬/>öË!«ëTÀ¢ˆí oJ*EhS+•øFª«BÜýÏðúá°àÉ©3ê•#P¤«úãtüÊóÔØžè—ö»û»ëÅìê~y}{3��®ûJ¡×°¤)$¨/­íš,yì–p5ͪ½N D~MèA~Ë*u12MÃ�C΋T»^Î�{5çÑAޝ’tØïæ=ŒÉ4ž‡¥Ö•½ÌP™‘yÚˆ&;>!�Üøqç…(qŸ´,„™ÈgEµØ÷¸Ž2_ZÒ÷Û¦6hÜúi Þ*?›36(j^,¸Xj=uð‹žË~µ5ZŸ=8eÔ®\ùX²Rvø|qcà$¥Z#/4ók·Yuôò�l{áòøs«Î“]¨0<�ë!*‰�i…z_½ú*ì󹛦{Žb|"�Rزp¼x .#¯Ìœ!ZOªÛ„d W ÁEçù� Êé )±Iåì TåàÈØuÍE.¯ÔŒ‰<¿fÀúãÕÇEùnÇùCL²]Ž2·(pC•]V„ʘ­ŽMŠŸ»ÀS8´ HžÒ>®?c£YT7/~BÄkš”Ä­ 4]ÜÚÓë‹ÉÕG{ùq¹š}hU›Â˜žYF,DFq­Uäk” šëëÙª~>8sÎO¾æ.üp><³¤ÁÃáiv>�JÒ?É™Îp¨ïÀOÕ�ÿJ›]¥ endstream endobj 482 0 obj << /Length 1617 /Filter /FlateDecode >> stream xÚ¥XÛnÛ8}÷W}q ÄòýVÀY¯Óº šlâ»è -Ñ6šTIÊŽ÷ë—’HZ"i7Eóɇ3gΜª¬ƒVð¡öÇ¢Ö¼ ƒQ8 ºÁbtÇݰ;îÃq'´ƒE|{;ýxy»˜Ý½kt†£·—añÿæöònÞ)®ç_î—××ï¾/>Õf‹Ú�Z[Zoí`Ø GƒA0�ÂQ§DÛÚ·ï­ –Ï>-¹Ï(Øçonƒ^¿ö{]y�ƒûÚ_µVÙÃq+†ãa«�y8î…á´Ùo‡ýñ ððæ>Û[.hŒÃÞ Wüøyv÷evÝPÏ䓾|ÒhËX;ãâ�{ß5­Ö[±Q+„ÕÕSDÉ ­Cž.ëêeÖÛ å-õŠÀ)äÅ5]ÿ!ˆ6Ú2ıĮݑ7óUáS»v{ƒÂë~á“»/â¤.Ô%‰pÃXßi�Ú6Ñ3Xà ãç©7Š›˜Âܶ‹�zA‹ÿÏ„î­ð·28D4„‡†¹%Té¹Âã@Óâ0µîq™"#²~,î#ºMd4Ô”bnÁ1 {£xO®»°,ó Mq|ß”Û9§‰@TõÔhÀÖPLÿÜÎêU8Ä0Öê,îjÎù� ¸5¯Š«=ÂØtÂhœFPÇCì/€¹DT]}”a*@A µ*Ć&@­^C�{ÜÑÆNáš` äk*î­V�AíÖŠÑ­…[žvÅIµôD&‹ëFhu8q¡|³¡\¼©š,îþmõ[(„¡°Nû~ƒt�5ÚIF× l¹?› ¸“!§cåèRÙb)‘>´õZ±1lË|.¸j{…Ú&9^¼þ'\� î‰}býýw8T?ÄÅ~®º:(±JT¥Â#†Á-ƒ2©I§˜c\‰Ñ\…ø }9Ò?ð ”Ø—vÓ‹1Ö¹2*Õ’£ôAøóhw2@ʽú£gÝ+¦Óú…ÞZŠ"|Ìúˆþ íVÂà ½3íÊþILé³÷íÝìjþw3´é‰Tr‘о .x¹¸ak›PD¯¶¨ÛØ ³KÖ¤Ð�ȪUîôæËÕüÃãý|¡U’b”l�hh¸«d2õ‰iŽÂ­Å×<.&gIè‰ýR—#²ÈÞw„ªý�¦Ùy–g‰rTò¼ å‚”E�ˆ)ñC1³ÉäÕUþPeª )Î6³Ç‡×W©ªšÉñq�n•+¬�ô&€s{È(!­9ö‘j¢qº…•A†ëQä`”Ö�1«"^írœõµÚ›ìê5O£” ºEÿiç}sŸ|™ûz”%!Æí¥!5fHÔÔfñqRNí(Š�ÑŽQiù|…ƒŽtvë&ÒO}9;l $rüÒ³fÊ ŒO—w““Ä+]ðl ßç^tºá¸]%nØ´R5�Nš)gͬÚq§¹D¤¹Ž¢‚ežõ�ƒ·¥ Ÿ�éÒ€5ÙiøSÃH`™úÆÓl°H‰L'¯Ê$ò5*iÌPë¡ÜûLfÓƒW>¾©:"%²_âÃ…M £ A?ÒÒ¼o)ž2[½Œ6œ]_×u™eØ%�†ËTÐ,ºŠÖ:ÿ_‰@Ø)²µK��^4ún?)�íúýÌuÀhJâ“t*G2Éɳ\ _Ö­Ë<ÿÚSÌs*eNvºCý|^û‰ž;ÆŒèšH ²iº¢Ó½©ÅâlcÍcÒ˜`Tåc£�uHœœÐhR ¼ ̆Xˆ“º¯Ë76õrjJÜJÙÕþ“Jea‡ªŽšìôwod%œlù–“‹jÀÞìAL¤X2á¥xAŸ2.GÈß ÌGZ*ÖãÀc�Ýëüüüè�¼(Ä…véqÒÒ^ãlÂóù–i£GÕˆ>ì8z&h¢LÊŽ/ÌQ Û'𧪯rÈ#A˜SÝeë%Ödˆr’@~<Ò©â,-¤hs¹gÝ7:7ô˜(•¥*ª’™:‘>…žéË®cEÏøå È�.�ìè2¹š_ÏNÅ6#¥©Ü EÙÚ÷–V›­9ØÙ d–ò³¬¿*¤Øèg:…™Kž`1Êhq{vöÆÿ“�î endstream endobj 486 0 obj << /Length 708 /Filter /FlateDecode >> stream xÚ•UMoÛ0 ½çWè–vˆU;ñg�¶u: Ö¥§®@YN„Ê’«�fý÷“#Éhœ4ÀN¦Mùññ‘c°1ø6yž$öƒ1,óe Ëy p;¹ˆAm}ßA U ¶»“-H³ÌÒ…µø=ù5‰=Ö§åäâkƒVEœ€e3`f ̪,kpöEXð†®#Œð†LÏ–6ˆ*˜æi8òÙ}ž/`•8Wæ\Eê<Êãø¬Ò=b5”‘+8ÜÁD')a5¯φ}<~¤,ßwfÁù|@Îÿw-!.´3:I¹7[¢ZÏ]¡WÊ×ÎÞn(Þ8ÓRÆOþ’Ä+2mQMày”Ì­½GÈ)ÓuÒFòŒB²EÞFwFÏÜ‹$5•{ŽÔ?µÏãñ¢&/Ü06uþÄYŒø«{!RÚ ª·Ÿé–JæÊ§¦6bË-hr²NJbËòêúæö½®ø!ÄÓ¨)ôÆÇè~²t¦Aya$ö.,joQîžN !}Š6d�ûN+çë±nqg$ñ*aЈ&²¥œJH ƒŒ-Ò÷NJa‹Û理¸SdàîÑÕHÊ•¶‘l@ÁCŸö°.rRä°Z6´zŸâ‡�'…E9o>Û>÷�7�?‘íƒËK—LR&°Hª=Ù†Jµ"tºÕ Q¦f�&f¦z_XþþÑõqB“¿ØЊ‘Q4V÷HÞÊ 1˜À»7u²\DX¤ß¹Àø{õ¹5|TŽ¡}ÞÞ^ƒ•ÑaxDf§Û1&Ó�ø^ýy*­q'#¦üU€0&�f¨%oŠ2Ýz[Zæ©EÃf{u #ÕKqä~éEº騺M³ËjXE_–‡›-+ìbûŸ½¶Ûgy¬By¾è÷Y–¤0]Tö$Ìs¿ÏæÅ8ò?í&ö# endstream endobj 491 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•�»‚@EûýŠ[Báºì{ËÕ Bˆ"lG¨$ÚHaåï»áQQYÝ›Ìä̆ÎäÈþ¤ ,uZ „'„T8ã8Õ€.9^|ò&ÝqcOç¼Õ¾)øÜ‹k|U¥}(Iȇd‘Î�Á0jµ†±–Z.ñI×3 qV‚Å;ßis„T‚*)b£%w–×Ü0•‰Èˆ[×…$Õ1&Un'‰õj”ù'ö>¨ endstream endobj 501 0 obj << /Length 694 /Filter /FlateDecode >> stream xÚÅUÉnÛ0½û+ô"Ä�×¢(� qТh Ç·¤T‰¶h1(èç—éM‘ôÐäDJœyóæÍpˆÀ p?CûÖm»å~v³œ]Í%XB¦8ËJÎ"ƒeƒëíVWYþ'Œ‘ÁMøkùuÔ£c$I‡‚@Ä)Ä;€Û¤MœóCkvi»3Ú}ÞÖé®ÔU›´y]�àŽÓvœ T3­£+}´ˆÃ#„‚?¯_ÈóB¯-üs^­BÌ‚ú”‰Û/ô*�6ºJµcáã^Í*Îc(+î-7yc„ šÖØ�,pˆý�Úh˜…ÛtbÔÖ–° tI÷'ûÕv{Ó³n:ʰ#u5W(Ë…pÏ…p«‡¯Ñ‡¼J‹]¦�eŒO,Y …’Ö¡7ü4‚%  joPo““gs­†›TŒdŒì½>OuFP0Õ»DXbˆ”¥�ˆaoÌs]dÍ™þuÀ )Îx"„�ù‚Lj1¤›Äxúô„>‘Ù?!{g00B·Y¼- ñÞ­¼«²y^èïI©GyÛ~a�Y1"C"éeª»ªÉוÎ&˜X«®/º ßòJãñˆèÄ"—c±w,ÁCkÁ#Š‚öí+qŒâàÍjò"ê :¯ÜAwN® ˜‡‘y«ÛÄê˜ùù¬›ÔäÛãtžž‹1¤”¾Ç\|%aäRåê˜+ñ¹ögò!š–s2ñü ejß”ñΧâX ;€- ²ÖÞfü%ûøqr *dû bÎÎéV�“ÓyåÖv㤵±uÚÖöÙ¯Ö¾tõΤþØR&…߯L]½‹º9ømMˆQ�¬ËdªZgzRbûRœê¹/×ázô»¤ÈË«x¹a kïÈV×]ù[› aºÌMã»ùè÷¯" &ÄÝröDXé endstream endobj 545 0 obj << /Length 1317 /Filter /FlateDecode >> stream xÚÍXÛnã6}÷Wè‹4 I‰”'ÞÍb»¶ƒ>d�"Ó¶P]\]ìßw(RŽïvRÇÛ‡D25äÌœ9s‘°11°ñ©u5l�w¸kxÈçÜ6†cÃÆaê®O'Æpd<šíÏ—½áMß:£®g^!u½¶l^Z>6‡òߥZ ûÅæC{øÐ¿Ñ‚ÝöÃÝͽ–’ò·Ý{ëûðKëfØú»EÀlÃÅÈãÜp=yÔ1¤õø#xöÅÀÈö=㥖L ‡Ùˆ96ÜÇÆ õG kg0¢LÞÊ‹vÍã ®58A¸qí D‘m�Œ±Y¥E4IÅ §žÙí]öoéS_L¢,}ŠÒ±E˜™]\$7éèk” Z;Ñh?ï0¶  g”’Lé‰A^Á‘Z%Ï"W¿³±º–S-E©ïæ›Æy–¬ˆ…qVDéDý˜åòÔ`’ʦ%$V`ËlŠÏYDÀÑ„–kNƒ\žrÞ±Çm”ËmއˆíÃîz×7Œm%´ 1xÌ™­ø JÐpF¸Yv¢X܉؅äcˆp¶Œg*7mÆ/Ìò\³,Íá)²*õc°œÆÛaÍf"=¬ìmÄzFò‹| ¿$ùA;.ü¿`ñssmR9q‘ïë‚2löŒ²°JDZ%8¦O¶llfysxThv–ÒQfV¡¶åEbè§‘ ¥±¬1Ûl¡::Ž3¹õen«"ûÅxáÈõ\ÀŒÖW•Ï”²%)U”ó‰®Î}Ø÷™È‹@™ѧü5jR½ìÈ"ætù¤u¦Š|BX�Ý�5¶�¸ÍÂPM–^÷®·ÆÅœA™+Äà¾/ÆP¸D.ÒPìcЇ\—7Á’1°¹¿›Ë dPEÔà ŽÕb㨠!3Z)Ò\ƒTIv�1w=µ¦Pú~øxö—l�B=ªã'啌^ü1Ó«R‘\Y)iµÁº¤I1ÉÝB"­™CÆH6Ô$ÈgÕq•†µÅ   ñ­Ëg4 Œ*èoµãß0Ãð·\™š��¦ù³ædU4„-³:Æûù•S�DA¬r^/,Û‰T3òñBÇZÉÌ_¢4Œ«‘н�,HÂ@အûÖoÎr‘ëÌ›ß,Kf‹äÏÐtá„À˜â:ͦ߷•M‚‘Ë|®’Á…^G dƒƒWçæµhÞ‰D<*Vòtùº2Î×Ö@¨ã>É‚…¯�Qò1œ7Ï‘¾“\§’ëÉB Ê2�žåzUŠbW¦ ©Š}ÄloK‘Ñ%%œP56 �¬À¶Õ¡cyW´»€ÞyÝJ 8mž7æÖœÙ 1 ”˜8øn£ë6fËN¶3¡Ô¯wõù¡Xke£•îÖÊ÷èã¢ÓôO ‹žâO��/ ¯>B¡&žrm俽)/µÉºìÝF]×LÔŽ¡E £×w-@Aa{²ø9Ëâ=|Šv6“�äÇmzBe=Ý'þ± mÃuÕ·ã(éD0ȯ8dÜ㟠Õ_ƒwh>ŠÓ÷ÙŸrÐ ¢òʪd8ÍE°¥ëWY7Á;:�¦¾U‹³àGê@ó8‰Smxÿ fÅ)8ø�–Ñ{}ÚSÄá‚‹'™OVrÙîõ¶k¹ÿ>ã®EýTq)à éïÈéûà–†®QðÇéA»ú¾AÅž*…È?åY5;dT9ÀØù‡�Ýtƒ4*Y‰YüáiëX–QÄ[!ÚôÍ—¹È£oùâ»þÙZŸä0Ä› ÑÆK€âܯ‰ endstream endobj 582 0 obj << /Length 902 /Filter /FlateDecode >> stream xÚÅ—YsÛ Çßõ)x”fjH ©�=Ücz¤‰ßÒN†ÈØÑTW‘ÜN¾}—CŽ•4iìIÚ�ð²Àþ,‹DÐô&x±Žæ"EÎ…ˆÑb…R‚3!Pš3,(Z,ÑYø³hÆÒ,<þüñ˜�Ÿ¨uÙ6çe³Š [×u:èM1¸ö‰ZE”„J«¦PÑ·Åûàõ"øPX‘ º]!ËpÆTÔÁÙ7‚–Ð÷çúe=k”ðó$†v…Nƒ/ñQ̸iš‡×� D Ny.vEŠÉŽ L£%„„¯Ô ËJ-!^–Á¿¾Ðe7€*í¸ÌÑœó2ÍbX’øù—eÍb‘‡ý a^Z±ÈÀÐjå;eU9£á/ðe<¬¥]κŒOÙ8ÏÏ�j>;›¶°ŸÁŸœ†UùÝ W®k¸TÎßùxãUç­f!c)Z Átm³,›µ¸Ýè»Ue¡Bô8š *@–Ý2£–Rœ«vµiŠ@fõÚoèÉ›�Ù�/†âÔÀŘ˔w^øW üè„ñ8Ðh7� åž›Þî´Ÿa_ a†¥µYö¦5ao ¿ÊáÒµ–r�®µÒmíZÞ0�»ˆ&Iu3£G]4¿N&æ“i^ªj̤¶ØÔªä­\úÃìwf–�|›«E”†—R›ÙŽæq‚rÆlLI†iœÃh; øÄÎi2wŠ x{Ÿ[´ÏŸ×/u9”…¬>ÉZÝwfœc*ø4ÜÆ ²XÛÕ„²éð›XxØvgòY{ú)œ 3#ùsJ'•+†Š•ÆS©¯ÔJnªáÂFŸÛÓq›e ’þ�Òt²E”d¡ŸïN^”CèÙ”×RÙó0N5f¡Ïl{~M«lÆ\÷†{Ç•„#s Íø¦Úëf9‡ÒûH™¶…s£ÊÙÒà«Ü¶x¨›ÕàztÕöÛq�6·—\×òá8Ó]œ‰Ç¹iúrÝŒ·Ì=@>@ ¦{\=¦fû#fBÝÔJßÁÅ×½¯�×ãž‚Á$¥ø! ØÓ0¨ä <€‹¶­îÿVö/Ûª’]¯öÐ?Þ{cµ˜–Þbœp·88Ç~¨z¸©Lñt?u]Dixõî!¯WS×™Jx5–ÈÇ×—¢ïX—?�Y�¹‘Njçëýψ¹Oø$mó}„ÏKm„÷ÃS(÷•ë@á>€?}xð¾;öùì¸ý‘Äi‚¸xož_Lo®ü˜�d° endstream endobj 453 0 obj << /Type /ObjStm /N 100 /First 883 /Length 2647 /Filter /FlateDecode >> stream xÚÅZß�· ~ß¿B�íˬHŠòn4ˆáä¡­a3Mj4½3Îg ýïûqo’\²ÎyÇ·[>kfGâ|¤(ò£4)Yˆ¡hH ÿj0 Ic a´¨d´˜#kàŒnªAÔû•�2~×4¦]Ò)SÈø+5”Á™C�ä„!¥ î5§\BÍ~ŸÅè²*.JÁ‹©”]ʈ}‹à �IªÿÂ�’xçH#äà}”ý…ÀLÙßh®A²a¸‘ÿÕ,Ë.äT�+�£`¸%\@Xª10A×T]ïäÃ+.ðR�x$ &�¬6¨•]« ãX±]ª9Ht3Õ�paA’d ç ™9Žäì?à¢P !åÎŒ¸@¼L,Q€T1Ó�B/© Gˆ¯P^Ýb‘4`D̃F(HÑßì®>©ìrÉí ôJø¥`Ε\A‰;%à ò>Àª„Çn…Å4cV³¯ær09 žC‹Ìþœ%äýQ YÍÑ�K‘�r¹ªK-¡Pf† ÞŸ#XTà|&SÌE1L�Âó,ÂG“bn?•̧ZÅ=‡�ÆD_T‚U‡*n³Ã¨ª`ò5EX2ÔÍX\KL\5W¦©5áL_«¹¡Ì}Pxç Ü½»»#Ac%ö+—îK#2†‰ùS·m=\`ÎÔ×K¼N!Wð1uŒ>{š\Hæ²{òd·ÿ*¼H€Ãó°ÿû?þ ; ‡°HC…_½ûñÇ—»Ï>{oß}K¡!Âè§ôͪ4>©¯z˧aÀ¤'Ê�è kþ¦ïÓë«ÛðäIØ?E4`˜è0ê©ÁÉá w77Œy¾»Áâøƒß@ÄþÙÍuû®ß†aÿì«§aÿ}ÿé6ü"ýûÿ¾éx0þÐwû/ñ¦~uûqè€m·Þß^¿»iýí!‚~ú¦Ï¯Ç/® /"~Ъð«/ñ¶ñ"°¤îºßÓWõ´¹|¯¾«HŽÇŠØ&E~¯H=Ý)ï÷ý�S¾§¯jþC‡ø�œaÚóñ´çôHkåÇLûY´*Ç>�ë¹nÕêž"gñì’Ž´*üH­Š|ò¹²c­òcµ*Ÿz®Œ�´²øH­�5?ñ\Ùq´°mÑÂìH+ýÔsUéX«úH­jüÿ§>�ÇŠÔ�RdÿùÕÕ5$¾8pz‡ä”þ®ÕµÍk[Öö0ò÷rvûïÞM·‡û¿½¾ú÷nÿÅõÍÜoHâËý_÷_ï¿|A‡ÇÞ 4ê›�°†RŒ˜šúmPl¡Ûç£}ö¹þþ:Àäz{{ó®Ý~ûìóç_ó«WÏû¯¯¯^½z}µ\¿G‘ež�²ºäÄ•#õz*½4YZþ³›ü<ÀE† âš;dd¥,^m3ðR—Qǹ˜€¹Å…£Um)•™JJÓ€%Ì/À�Ô+›‘ç:ö:1Ķ¥%# kµ×ÄmY(�ùê+’Á @±Éà$^obÝe*›‘/½¶¥YžtÌ‘–¦3ðó"9Íûlžt(^'Y1@4"ò1ÈgðßIP„ç¾DXÆ€¼¡‚/€\xð-‹_�'bª›‘Ç8ÚÒ µel­LKu§b‰m¾�áÕ·N%ä¿éûBþ¾¾šË`QÎÞ7%¢�ÔU¨ INS�¥…ói}½øÔ³uÆ  &¥”µr’\b4À HUˆE?9¥2ú£êxÿTÈ—ÛÏ7îÁùQ9÷NÖýœëû�ʹ¾/å�|[ê®ÕµÍk[ÖÖÖö®4ñ ©»–Ö–×v•Ç«<^åñ*�Wy¼ÊãUž¬òd•'«^uˆu~ ¨?ûö›gÇ Jm2sÕ©çZÊT±«Ú|Nî’`]8›ÀÚìÛ’XjîÜxÑPjÚ ¼.qæ‘gµž{×Î2ñD=Ž4§>5ºp®H›ùWàP$sÝ �T{ÎE¥¹sX˜SGÕ4•|Oaðs?†¨e )EXËVàÖ�øµ�pqæ‘ s·XUæâ\æ�6ò㎕<"zÄJ›]%ÁK–hÓ´X7Î¥ÏSiSÇ�#•ó犄y7ô¨¼ymÂ;ÊÛ΄`]@ 9imÅ#ë“-çýFg. yÞœäRõ%ݳű$b°Ü¾R§RáPl™Ê$vÎu ”ÕQ®¨9ÁÍQÍ=„úk#J‘¼ÂQP õ´P7N6JÐxFà”ýD’‡Ã iq2„ª®ÚæuÉKYd¦¹U¡C½ˆå–gëbSÍÓ€+²¶zÝŒ,Ž ”Ç.[q§ À�;¼cBÙŒÿÆÊµK,�¦å¬ñäg܈ب–}•zÙ�©rÙN–q1�ãØ•º .¤)¾˜ä%]7£bOôÎ@XXPzÆÍñ$E+YK´ ÙrÎ}nb"f tºpÒ!û!¹WžÅüLKÓ6g¤øf¨êI²ØØàææÛ,Hn–¬´ 5ôójÊpýL¨š¶§úy‘°Î}iˆ†K›F±þ�Yê|~ÜT %¾Z?w¦Šº[x³‹×ÞšŽK6§Q#|v₈v{O¡RŠ^ &Fß«€ËovN#)"Šæû¸ôD¡1‚òL­^ zì†ôþê_f�CÚNùFÒŽœÓz‹sïq#Hî2öe¹pEίrðpg³”áñy3 '.–cŸ:2fìþ’çyšdJ<^ kÒ¼þBHû¾±M¨ƒÒö`h±¡n™,/ (´DPØ)%‚Ó€£Ö=|ò“á"®€x=±9ýX©qIÕÚb¹O [6ÖyQYÔ­¹”³³B¢<ä•…û˜rdýM¤°N U‘Z.ˆ†£;*Í(Ós/y<'Èê WЬvØ}ô¶FQÆK*-¡)u‚cË´L¢#GÄ9¿­£oÑVÿŠkàØháìÛŒ-“M(hiÕ“ÅË eñ¨^ÏÚQG¹¢ÆÊXý€±§™ê,Q¤ÌÔç’cÃåÔ¬So•ôü‡ðÿjÌ“dŠþµ{�¼ÙI¬õ©¡^šS¢„:SË\sD€)�v� }‹ƒ÷G5‰k¨Ñ]}sÊ‘9+èöl*ÚËÜ@¨àÔ(}@­èüæö£ˇê‰"C8Ù\í¤Ž¤=ÏÜØ`óË8I’’ë’Kο?„HéôCˆû}?tq¿¯o}ûYk/�’OLuðo÷ì+¬XI9€ç¾|ŠàŒª2Ê´c?84ó!‡Hvš`¬råÓ̦äÀOìuˆ§é–@Ë-é#?Ä»w ðÇç{ÔpüM‰nü¦äø¨aÕéåy·½‹Ïýºí]øàÅÙöþ–Y}‘ endstream endobj 597 0 obj << /Length 659 /Filter /FlateDecode >> stream xÚµ–ßoÚ0ÇßóWøÑ‘†ë8‰cúŒ®­V``´‡®ªÒÄ@4HX~¬Ú?'v¡lj¦ $.6çïùs±�Ã` 0ød ¹quC=ÀPŸRð°1E˜xÀëD-ÀCðG·ƒÏÍñ"e?š†³�!/¿jvÁç&Áp9âËùX;NGˇñD{•þwÓ‰ùÄï�17~–Üð0b”�1Ĉ‚�ñø„A(»Ù}^+Ïp\¹Ž-Ÿ·`a|1°†Áˆ¸åci4£Ghuj!\£ ‘ ›= c _’d+wMœMfäy.ÖQ?GñÊ´\˜\_ïnýìnUí¾{uãºGQ0èÙÙŽ§ä©”va!T2¢•²~Ü[¿ÈjŸLÙ}*2ç*XƒíL†t0òê�šÉjÃôÙÏòYý,§ü\t¨ÌVê'JüRĤ ñ$ùjÚúQÞlœ”ú¯U¥lw˜¬�i·Â,v|“ ?̺Ã4- ÿÈ^êm:m0§i9E*Âî.g’*ÁKºmç",‚\ÎwöÓƒâ¥iÀÅÆïæí)“)¹K]B¯ Ú2Σ÷¡Ñ÷ Jî šªŠm]è¹iÉþ® ÒHÖá+¥Õ®»9×ò¹žìøÚ4|o»V­ä¸ˆR}…lrø7§×¼– endstream endobj 622 0 obj << /Length 1371 /Filter /FlateDecode >> stream xÚÕXYoÛF~ׯ Ð ¨6{ò0Š jÛµ”''0hj% ¡H•¤`äßg†³¤HIvâ¦iP��ó›SäÞÒãÞùèÍlôê,½ˆÅA ¼Ù 9‹‚À cÉáÍæÞ­ÿ†©ñD†‘}õîZÞ½ŸžÞÜÝØåªÈïVùb,¹_Ðù´.·iM÷7v1Ü·¥ÍS;þ8{;:��þ PË=Ñ©‰"Ií¥ëÑíGîÍáì­Ç™Š#ﱡ\{Ú(f´‚ûÌ›Žþqg:gÒà-^œ#QpÄ‘@0¾óDâG{öüVR�Ü’§Ó]x°ómfïêÏK|5‚ Ê {èã''k:I³±Ž|'¬óæÕ™1=©¡"¦ÂÀ,Á M«”$Â�AÍÝ*woÜ‹!aš%ÛÊ©€¶ç ÷&ʰ@éXb<œs¿q )  ‰�OÈg€JF-8WGp ꯡTƒ‚‰üúl•ÙËdýIX¾ Øzü¯z¿!æ_V'_Rº“®„"€Ì™2Üï~Î,tW°©½»¦{êOß]£Oî0¢Áõ½)]þ\ö#X­¤»ø[çÕñZ0.‡„Ë�×ÃVä– ¹Û¯v‹›C¢ûðÿh\» üduûPd`w•/ùLtøeËÀÔÐ*Jn¥€æ/iâ¾Ö endstream endobj 646 0 obj << /Length 993 /Filter /FlateDecode >> stream xÚÍWKsÛ6¾ëWàHÎÔ0 é›íH©3�íJÔÉÎh’8áC¥¨ñôßwñ %*rSǮۃ Ø]ì~ûí"h…ú8ºŠGç GB0/#  ¢Xx(ÎЃsýëå}<žºg4�+lÆ®OœK7"N¬þ]šÕYN‹˜‘9‰ùÜmec2ùH­´Ÿ°ÑÈèü¢ô‰SäßþÒlµkiTª¤´Kµ5’Ö 8³©«,¯VÖázפV¡È+p¼‡l3Æ ,»±ÜUé$*sÍʦpúq¤àð<qaàHÛtfq€s肘jolÜ�„øó£Íœ4© …¾J3™™µµJµf ‡ÙzXxÊÛµ™eI›˜Ù²©K3³ C_±ñhÀ©cBA°>Å„³=—¨åÒ$—EG¤:Ý•²j“ï¨tÂú³ÄÒÆ{ª¦nଓFY;Ÿ0E FµO~ˆ=�¶Ö|˜Ø ÆE's÷ùž.æ³ñtar³P¤ê‹‹r\e¨‰[E ¿©‚3α'¸u™Öum½ìRdŽé§’ÖѯK«<ÎÓ^»¨·½Þ¦q=â$«2y.cL}2,~Ú§lWmóUÕ•ÿ�Pù *Ä{AcPe®”¿»ò«®çSà¨è›­¥î^ï_‚ý4ôŸÁ_ D‘¼ ‡ øï]a³6QMG8íOZW:ŒDNQ§öQ_Ýõ¢.khå> œ[)³­ÙU]”Ó_ÕwO<õÑßKZrmEÚ?72…´h¼µ˜Î‡š­d%mûLŸ»´äÝýåô†b¡}<ºöFΓJjm¬Ó�Û^Ô®"Nç%é/! ÏëšM½‘ÕÛÕy�í ò¿è9o‹‡x-ÿmëy5‡XïÝzöϱ7ºß“þ�fq=|«Â§y«v5J}xêwÏfk)<– ìýù�<VbwM3Réh»ÃO¤Ï˜.ŠZ©>õ‰4ábØ�<�ƒ0 Q‘åð#¥|ø¢;Õò8Φ.7t¡€Y®7ìÎë#Cf<õ‰ ·üBúþgžµäs,„å óÀÁoá• endstream endobj 665 0 obj << /Length 949 /Filter /FlateDecode >> stream xÚµVÛnÛ8}ÏWØ X1$%Þ€¢@Ú4A(¤~K A•h[¨#½»Ý¯ß¡HI¶|i�¶O¤ÄáðÌ™™Câ`ààþ ÷#¢ÌNípõfvu}'y@$bŠ“`6F’ó€ ŽaÁ¬ žÂ›ÍF×eõoS*÷ÑçÙ_G�JQ‚%µ^p3…ÒÔí¿«VÚí½]Û]›ÜTëúˆŸã0Fбˆ:ï\ ”8ïo‰b‚1×›¼©hÖèxϪz®ÑÒ�=¢xÔóH„ºÑu¡ˆ3Çb$€l’¢„)wîmnrçï“i¶…Ù6ºÝ÷æÇë;Ɖç‰uC€Y)‚˜Ä,[Ö×3¥looð3ÆÃÖ4 Á½_Æ kc'��!2üøpóøžf�à†è ä(¢™”€ s%,2H UI“1.²Ù²j£îˆ],þÇÚ†ÜÍóÕÊMúsÁ–²ðÅ%º[éGÕÍ]ªZ›'tª¬v2' a ƒD)Ó?À­69d¹ôŦۢ©6c©�í…î¬1K�lÊMè�lý#É SË �šúîùdr #Å¡é€AÔ³ˆPnµûú`—íJÀ�˜¤'É» ög¥ âDôdPOÅfý²¡ÙªúrAùOb±õ-}X ÏÓ•G_¬¡›«Ú¯˜¥ÿ]êbqvà—×óIµ<|üðàKa¾­ ³W ×w  àоýv[æ�ª.VÛR;Ë„ìX² %aCgøêˆ/�DªzƒÖ”¥žO‡žR�$%½áë#ž€mAQ‚c¿\U›÷½þÀ2 úÉ}b£T†ß6H¸\ÀÈy3ίKñßHº*},é.+ øác�KNèÝ \bØæEÐ+à2¯ËÕ%úKh.ż¼ø«k¨Ê_¬ì»\œ–õ®?²›¶­¨ûaLÞò3쬟PMA׸ S®'±¤HÉÁƉ‰÷íùçÐû­¿ Še¯b…)²þª¨êÅL$ ?>²�;¦ AœQ¨JŠ˜`çùr±9åÌÛ¯ûÙ=ÅÖm»×&«u[ÿÉÌÁîûÜ`ó¢8rSPà…º?û…Ó¹]XYu­›|¸¾X@ß& R ¯ ûFÒÍ9q&VFœ õ+Õw^Õ6k:;ûˆžãŽ,«ÜÛ—¬¿Ÿ/%ÊŠ5t“ÉÏwA�ë}]™ßh(iáJúˆR�Ì‹ä'•jdÚ¾Y]¯Ð¬C¯›vú`¹¤4ßÍ®þ˜_át endstream endobj 593 0 obj << /Type /ObjStm /N 100 /First 873 /Length 2102 /Filter /FlateDecode >> stream xÚÍYÛnÇ}߯èÇäe¶«ª«º Èv˜ˆa‚R€$„@ÌÕ¢pŠœ¿Ï©áȦ¤gL­ <�3³[sºn}út¯ 1P”�.9”4×@BA >ÊŠg LÏØRPµ 0Õ‚«2žs�j;-(Ï%$¼«ŽÅެ »RƒÞ3 †?­1ähxæ�ïU ¹b<ŒQ¤î´2ÜŽI¨ŽSb¨ŽS ®^¬%¾©ð˜ _™âþYDT1ìH’âÂM¬å@IŸ0n²;ex…<�¿¡@£ˆO�SO ãXÄÙò�(#FC TDvš�ShÈUvðV5÷§ŽÔœp£x‘rD†�™�s­øJŠ»Q«{ˆØrÙÁ¦ /† %Â#  Ȕ‚$Á ¤A y2B] Ý';Åè7¨üÀX(´ ŽÆ µbdC½ôYð‰†¤0T8—¼&Æ’‡¢/™Â1 y‰$^2ÆKE2®(:{A7™w&1¤ _ ½”*2aŒø#2j¨‡{8›}¬„dÁÜÆó<ãA3%òñ0(Í=ˆÆ0ñæCçZòÚ³á7æoy…�“¹TÈ: yÄâãyÆ<B³™x"üŸz´%Ù±Ü1¤Hþ‡'�ý`ò¯ÐëáÍhÞpÙ«Œ™`•|ЂÖFãû�àîÙ³Ýþûp©(o aÿ÷ü¦MÁ[%RSQÿë»7o^í¾ùæ¨m޳mÎÔDø·É¸(õS¬×þd¶TKãó�×pÙæ/êÖ ?5e“fž² ¹C¶·àb&5õzÔVE@_¥BM’M¸ÉR#y%Áœ­A7£ƒš¸æÃ‚+U›šÊ:.&¦~B¢·UY87Ns�GT³Ñ ´­%Xkv[FykÆ57yÍ‹˜jlr^iFéH|Í‚u[툹pÁãÀ„Ú‘½çÛ³Ãõmxö,ìϰœ0ò5¿uæK"øêþ´Éh©û°�€]üûó›Cÿb¼ —aþýYØ¿¹ ¿¢¿üïÛ_´?�»ýwi¼¾}‚›±vû‹ñÝáî¦ßÍ‹ÈüÑ�ãðºýöðK¸ŒÁWRmP¿P ¾Âhí ÐÜe6oµí|ôÐv��ÚRÑ –&SÚL„­Øz�;7kc¼ +Eú»tªÆ|±M¸P é0+êQ+H†6§ÊM4ZK8ݕđ¼ Ô\-¯#P"Þåc¼xj«)YÖr B„°cÌpJÛš�3ƒ Êã¶Iݘ]R5q­ ¿ÒLm\Ò<ÞÅXr"æ6´#ò¶  /y­‰�h!ÖߢDF8 ;¥§¹�Url&i¤:mí§¢R2µlc’¿€ûU¥üæ=¢aµ§yßšÕ¨E™¬ÍØ­‘l”ó4 iäz±ó uê§AÌ`sõªÜ${gŽÙ¦4€+ã$I:K½i¢ÎÊ8Y´øÚÞÀ9h¦ÔDè—ìšù‰]“x°8¶p<òÔµuè©S ÖïsmÛñ¡ó�F~¶uCò�íʆä[&Ä…p1£·£šu óËO– �ýhp °ùzTV¢c(�êç©Ø’ð¶LøŽ$UZÇM~ ‡U%WÞìå8²Ï>f+PÖ)Ú6Ûž¶Ùºhö3º-¶��h9Ýþ}V#ÒûoÈ·<Ÿ%À“}"ÀSú<îG«³p^bóƒÕ è{]ˆÝ|ã:u‘…LWÿ_ËBQjü×Á¢’•¡ü+Ä5Asƒú$}méOÐGÉ"€wØBæeäߟÑ�YuéÏM¬úÐv�U�ÙBgciÝdk†ðäd¦ïq±É„Ôß6ªXÜVB[NqUüœ`[ÔO¥¬ãú)n‚kZ6ûGbYŽàh)r|!: ™Þ¨®/ ‘ ÅÇyŽ3RlGN¥>ö•ˆ‘ãªy0rœ™¿úɬ™~Âß&ŸÉߺ€èr¢e¹.¼nË�Š-*Ƨäw‚Dÿ°¢Þ" $(›eñWÒ¯F“¤Üø¡~0é?Šª€òÜ X*ãÉ7¯»y©)íhPÔ4–”úv %ZW¤v9šõ„¾’Ì4ä>G?� ˆ¥opV·øšúqÀĈö‹©ï°VS[º:ä6v§Ü´€(êüymlžÝâ?}ƒkbÞæªö¥•,¬�ÈÐEéËÐKÄv\Rô½«ÿõè± endstream endobj 679 0 obj << /Length 1264 /Filter /FlateDecode >> stream xÚ­WKs£8¾ûWp„ªEÑ„8f2yMmb¯—=eR.²M­Á“Éþúm!acg2™\,Z꯻¿~€­……­ëѧhtvÅK �sfEs‹ñêYAH'V”ZöÅÍù$ºœ:. „}�ôzuûç¥Þ}_üswy9!¶ÏÕOt;¾w£/£ËhômD@¶ˆ`$8·!�I>zxÄV ï¾X±PXÏ­dny>C¾Ç`¿²þý5Â-FÔW[µì‚[£À¹ß©àá-xDq\‚1¶?Ë:ÎV2ÜpË*)³M�­‹m§æìÊ÷÷<‚-—Q„…¹/Zf•¶û+Æt%õ>YpuaÞÔKó8•É*.‚íX©1¯×s½Æ«•ÞLÆwª·ó¦H´(ñm¤qõÌ>´ày±`g-5ÖFŽ'ì—�LåܼNš\Ð�ÉGTœt@«bëÒz_Áw‡zö:KÕÝgW̳B¸„êÐø(àÜÕÞ®cZ¨G¾a�62ãÉùô–Φrhg˸HÁÙ¯ÄÉaëM{ª‹ÊZ¯Y >Èæ/úßx#‹»‰Þ—­.ãz—yø�Pl›ƒ±{°Ñomlå*¶ÍªÎ6ŒCB}Ú˜·—‡;×3ãø+C”�-Û†vÍVCËÑÙyUe‹­틯ØÇŽëù܈ l<`¥ q0¤Áì€ ~'´YçºÕ .ÿCéã DHw²ª5ÀÄ ì%dá%,DdÇʤNfU]fÅâ”ß~<¢Å" ¶Cï“WIɰVÐò¢”q­Ü'� ÏnŠì[cåñf ôŸ'Y?+’IY4bï~ð0<°Ðû¶º¡=ÐäAiô¶^‡j-ºbŽ,&k&9Ć@º©T…®�é1õT z"LCÝ~ˆØ.B*Ã8¶?mýÉõ¬R/. –z ´sU)¦“L¯GÖC{h26cGaÀDËjÂ]„Iå‹tøÝln‚é�s3+0~¨øò±ÖÖ endstream endobj 708 0 obj << /Length 1471 /Filter /FlateDecode >> stream xÚíX[oÛ6~÷¯Ú¨’"E©lI]¤Cš,ñ[ŠÌÄÂlÉ“åý÷;¼É’,;na Ð'Ó¼�s¾ó� …½{Ÿ¿OgãPxŠÃ0ð&ÏžÀ( COÄ…ě̼{ÿÑ¿*–+:-åKVäÓ,RìhnÇÙBšÑ­|ìËRæ©>N¾ >MHÄ©%DŠ(óÒåàþ{3XûâaÄ‘÷ªw.=ÆÄYã…w7øs€­ÖQ®†êÇÚ…=6„á­ÁmÃÁûÿ )ó‹l ÓÈ¿¹¾º¡ÓË<«¬qk3ÿ€9ŽûÈ©y¢ír ��9oÈÇÞ(À(ÆV´ºØ “,fp}óÛí%¥¥L*93sN4á>R·«kA1\­¯™Ì¾Qägùº*Áîo–2¯ŠRMÇþ:M´â‘“s;rôñt±™I³ácº�öØkVÍÍt¾´åöЋòh)Wk³^9],t_/'ÓÍ&›Msµo³¼5¶(X]sž7yZÁ&c| *[ÓGcÖXÑo,LƒöäL*rmƒYXÛ£N‚]yRtý¶—å/¯8#WÎ%ÛœS:ÜÓÄ#Å„pëy"ÂY#r4ávB.4¡CëС&tD3r0Œ¡�SG� Œd˜XšqZäU’åz…ú Ò¯!W3™.’R™œX”Ô!íq5¨aO+»ô:ÏÒ¹Îa›£¬ (Ïp¹½ŒúFñ¯W2¿º1ã.Í&+”/6=Ü~x÷#AË-µçl^ˆbDÊzÆâ1‡íÚṵ́݅»BÄ#êöŒÌ†ˆÙ!Ú¼¼ÝúHYÕò(¦9iµY;¢T…ù]AåûÚ’ý²r¬´œ~²µ7Nˆ OÅX»¿Jﬗj2[–ïv÷5_BèúFÏfØ6l7þ:ÇØ‹DZ&ÒÒmdÐ{_g—Xÿ®X%eÖä=pþ]_6¨Ï?’†(Š‚uä/=:$Xì6¬«ÙSQ, ¶Þºê×½�‘à±>Jr0î�8D9·ý"©°€#Ȧ„ôÓkOØ’‰HXÄ„e/¥¼K2%§‡½iÄdî®bQŠá0J1J�°–¡B­•Tâ–*v¢Pë±ÎžjÐÇr³â~û»M±Mà£þ"ûKÑWš%]d¶{ìä·•�U‚ÔoZ” Ìª€ÄELh‹M™Ú��ꥋ7Hº¸8B�æq§"ýHðŒœþèÞM&Þ]þpi¦;(“ Uµ*‹å�ü€Ž¡{#AfXÔŒ‚å*IK]®NNñ÷®vFü|r>ŽO'×€¹Ÿ¾Þµõx#~­>M‹>åPd¡�(m&>±YÒ6AÇ„í…ÔÄI6`Ù¢º›'µ»¦šé}ªiÞR±Ó©¡Y *äGH%§{—B$¶YÈÁßïØqݯ�Ø¥ÐÿsÝÿWjÓZÙ¡/+¨Œ�ÚÚµš»—Ýà ýLJ4Moî)PY£"RxçÁDÝIá §Qb(ÞvRe7áu’݈Ɣǖã€}.¥Ô¦Ý*º4å_Éå“,×û�Ý{í �=fâ¨ÈñPAŠitT8wIbº›¦†pô¾]{Ìïè,5ôCeæ²R;%M†D5—+I›mçBÑ/c7Ø;ßÒ©^#ÆÄqDü/á5¬;)š–ÈûÀ+ÛÿGX©¡êÃIÑr—îÅkÝ•ºEìpU!¢€D«*�£ûàB“ܼèàõp!×i™­Mç1ß“Þ~í“Æ×•ŸOýŸOýîkEuzG<õµb]v†aý4–Çt_ðâdêÁ oPfÝqW%úIçןDÇCÆ}«½™¹ríÅæ—„ü‘q7‹ã–ô¾/Ï\ `Ëw|wÞýJÎá¡Ì‚v‚áÖò@t%ÿ CÉË3 endstream endobj 729 0 obj << /Length 1471 /Filter /FlateDecode >> stream xÚµX[oÛ6~÷¯° ¨YRÔuo�›¬é–ËwÀ�†,ÑŽVYt))Yöëwx‘,ù¬FõbÒy.ß¹|¤°µ¶°õëä—ùäíeZŠƒ€Zó•Eƒ×³ÂØE±æ™õhÏ>¼»›_Ü;S7ŒìÒãåÕïzöþvöéúâfîÄØ~'æW·7ΗùÇÉÅ|òmB@¶ˆb�FŠ@Aº™<~ÁVï>ZÑ8²^ÔÊ�åùù…ya=Lþ˜`c-F®/§r0¶G�E0 ý8�Æ·*‚pg<¢Èu¦cl_'©pˆos0ÜÃÙgŒÝ2¯s^š'UL,Ö‚7Û±4HôóÕH‚S^ɶbcÕT Ñ­ŸK²j$š²ÎY¦7ú~�r¦$@! �;bDü¸Û©‰~îÛü«¿¬¬4 òb���…h„î#5´xQ:¡ d+’ýÎ/²_·ì‡�qÐÓÙ‘1ÓZµë¶õ=ä´Eõ rïD³¨¥iC¢gd h»Öþ|5×cUsÑ>z2 4‡½ƒ6ýàÙq}Åöæ}R'f7Îø6Xt*0h€ñú`¸g�qÏÖ‡ó@8!á»-§gYþ�:ÛºÕ�DC'20úE·‹¯ôhb¨bÍ…þó"�ã:¦_ÑU¯Sèñ5°àyÕæÀ.›2ã˜ëu• ëÙ<Ï´†´NjY4®úU¹ê¼?c;SÏ´wf „Tz¯bJ0í)&!A~´Qí„?‚îÈ·¿¼9’ž‡|ß;šÂ9#™i®žÃ.WAc„½¨ÝçvzÌža·³Ftîd`£1Šv–€ïdï/oGbm®I÷‡Iá>„ýhˆ¾¡Í•Ì2µ$ÀЬÇ)…T“—‘¢¨õGæ®^³o„Y}5NÄâØæË¿áD¢¥¾äõ“žé¾%g’Ïôl%øf§]M†ÎÀ Óó°}E#%ŸXep¦ˆH&'!(ä4-òº­ŸÍ¶x5¥¦ìÖì–¥¹„$MôAsøz+øZÖ§�?ÉÆTñR–+XXWûr™Ä矼Ó�9µFRè¿$ÒFÞ+�IÑ]éŽÁó½3cM©�Ë0ÃØT,Ó³¬é(—ÈûoRäÿ–Ïd»’£F&–T�`²gèÕkU³ ʇ]™å‰Ù΄�QêÚ~Ð4’ A`®4ÚWü�TL endstream endobj 741 0 obj << /Length 1933 /Filter /FlateDecode >> stream xÚÍZYoÛF~ׯ`ó$Õfï#@ ¤i$@ÒÔÖ›´´²ÕêpHª…ÿ}g¹ËSÔ�} )r93;Ç7߬ƒ£ûGo¿ŽÏßHid¤dÑx)Œ´”‘2I�§ÑÍð5bñˆ*=|\/émjïçëÕí|5‹)®Ñƒùf¾°þîÊÎb‚‡6µ«‰�¿Œß~¾hÄ©4h�4åÑd9¸ù‚£)¼{aÄŒŽþ-V.#.œÁý"ºü9ÀÁjŒ¨p·îö eÏ$ìA¿‰O1åÃ$M–6·iLÈ0+,+EöZ(8"z¿�QÆ+"ÂRDÒpD±Ø'G ¥dáw£»!ÄmTGŠ  õÛ™ä“ë<�GD ç«ûm'Açú\Àk „B\Ý2àUpv?4 ŒJ¿[…wÛ(Ô|ƘùU-“82š–kþvyhÝ?O/ÿ‰AM²ØØÑ#\ë�äJûM¯è/}²ÂôÑÏP<’R Ç¥Ÿ‚GŠ{@íbêÌ3ïÙÇ$ÍlxvçLÚg®Ö¹Ó�¨ó3шdÊÄßø�8õ=¹{á)ÄÂÓùòqa—v•'9”5X%˜€j´,›߸ÂvK+„O«Ð:‰ Wù·I>[̳ÜÛ@|zÀ3ÈßqL~øïV’ÇýÞ+°.k'9x¯µ¹¥šMæ%�„ëÂ&å£É6V(%ûáem?!!aIk#™�¢ÁÍ• q¨¨G�†ã§GÛñPXaéÏ=ÒbB• ²l²è‘B%ª–$«iŸM®f*=v‡† ©òÍ9ï 4¸ á(ŸXF"mDÛ÷µ÷ Þc¬•Û†B™ÃŽò€·ª]ã“ ä»dŠÉ°È'øY„ôQEJ�¼¬‘NX‡tb´Œ@Fù°Ç¯š"¢ÌáøhCêMeAõ¶< Eêqru}GoK¿¸™»®ÉÎûr“)Dxå³g3hÉ+èx/ó•ý¸&áJŸõh%B NT�[-EPX}FCÙê«NÆò²Æª Ò‚ì7#dëÎÆŠ¡Ÿù‘¶Ît3'ß­|Rìi¬çÐÛX[Ô�æÂ|8Uâ/! æSÿs}÷—�ä;Cu²‰Û¡RÐ3CUË ‚�"ãD¢'†2-y”ù:Ëø§s×ÑZ4¯¼v+˜‚ÿ¡Þ4Â< Û«€ÐKÜm�qî&µ_7óÔ† $yÙ£BW.Kô38³6à<’Þ×\½D7Å¢O|øDo¯jN]¥]ikA( ÊÒ`CfsÔ×_-!7ÀÜÔß.íòΦÁªõÌW« i·§5k Ëd(ÂF¶°9Ø<µöW\ú«„DÀ6îñ6Yd¶÷­wÈÇõm6y°Ó ´$À6Jb˜´wünÖƒ„ q¥¶ûÌË êî³>$ ¥ú(HVg„îÅ‹åÇÍòº¡¦Èⳇ$ë«éв’fà�ûªj˜¿ô™ +j¾Œƒ§Ì.Xè <5I¡|&Éâ{zêu(œBÑGèT}þZ&nùSœçj¬p™ÝáÅâçO/CúFÖ’ŠŒÐ£xŒ¯ª¦^­ ĸÐȇëw©ÎRk‹=]U•ÛX(êÌ—Å:‡Þ­›H¸UM"[Þ¡UÕµf ó ×ÛCÁ¬‰‰0ˆÈíJ®e¶öÎ ´ˆÆL8Ó Á5Á)C�j Áa|sšl%u vXÅ�§‹£-œiaUYôûCà¢={Èç@Fø¡cˆd„M¤ê›pH¬KÎw,9O/ié·5oªÄø’¡¸š˜î¤�'›¸(�€ÕEL„;6£Nb3G2`oˆJÓD�ˆHA &±K{J[a®ç¢º´Ûº ²«]œÅMí,Ù,òk ò8æÚ ?ô:O‹ó˜}C ­é¾‡ ßZânój0k# ¡�«¸ú¶k„,&°>ûa˜Òòh¬á|KukÀ›utáx˜‡v vÄ"ØRT3a˜›Veâ†ÆÑ9aøÞxÃ4†B»n˜�H�¼¾˜öwÂ�ÒHró"Ô” Uûü²•Ez¤Rf‘Êz*þŒyÈ0†‹ÀÆúˆnÔÃ9GÀ"xç°ªÖN°;o÷½`×Ú~vÇåQþúsž¼‹íD l¿„ƒ€È`è7ä{ŽfŒºƒQæ]|eóMÚ!ÅÇOd­£fß•av(O.wpŒƒÑ f–VÄ‚ç™ô¢gË‚Uü¶`yºÕ[ás"”Ö¡¥“ÁÌwK"]lÍE`É/K¼ððtpÔMp?¯ ‰Å)ÑIä+Ä:ÜDdíf¾P|’TãrÖøf\ p‘QÇÃ¥›% <\’ƒpYž“� ˜{ÐJ\ÓSþ4¿ý � åâþh,Ã@ÉLWóI±ê endstream endobj 672 0 obj << /Type /ObjStm /N 100 /First 884 /Length 2360 /Filter /FlateDecode >> stream xÚÍZÛn¹}Ÿ¯àcòÂ!«X¬"`,°»†“YÄXû!‰a}›�G2dØü}Nõ´ÉË-y, �À¾T³‹U§.=µ¦�B­9dõ‘k�ŒkÄADðOAZù†Z÷1š†Ì9(þ™RP•Mf –î[°êr-´T1rh‚yÕBN†ʘŒ2f)˜¥\Á�TXL„Ë8жÉxc6ò§pËæw[s€ 2Þ˜ V£@É1jÆ�¹°r¤%ù� ®Ô€—·MI~à@!Gœ2`êWLq•¤øôóù_ßœþ{³ýéì|œÎ_¹c¦×Û?oÿ²ýùUžO6Û_§á"¼‚ÍEÅZ­E·×’#™O+„~ Ož„í‹°ýÓÙ˳°}þðîì?ïèääí›þÄþuÒ ¬¦¼ÓÚÃäI›v4Ô� 'Ýî�á‡6ø;R*Ñ�]-18d‹ g™�¯A𧉗Îtœd×ó”KßO;ØÇnH»2©(´÷Ôˆ} ¤Í-Í�먵À-û©¤)CO]MVð?Õ^²]¹õixUá))ü¶ÿÇ?áIѪ{DŽM[8ýðöíëÏÉjšeUsLð«5²¢s©Ç—¥í¬ÃP*E§Ð5²0‘È+çeK‘AÖkdIR—¬AG�9Ü�}vvz1›Á3sæ—ýSÏ@…¶ØŸx(È—'x™ü™Êrù ®2¨f‚"�‡ŸàMÛççgË 6¶ÏŸ> Û—ÓïáõM3Þý6m¶?ÐtzñVÛüq7æ÷g·éýÁæK¿Lã›î§³ßÃlþpðH\Ö°Ã~Þ�cŠP™öâ³½ÇËÝo’ÇèyÔýøú8'0vA ’L±�^…$:· 1®Û—+Ã4"º¥¾ ­ÀçyYômÔ.õt&‘¯‘mˆûž>6Š)ÕUó­Øùux†myݼ ²ˆLw•,%àåu²È£'ñ«ìa?|†£¯±êm„}ƒ‰sòŒ—q9L®Wôíé}ýÆÖd3¶§Ò_ÉØ{|^¡ì». nËØöcK˸È5ZÆ…ñÛÂøM–q™§é2.óµý|^“ìǼŒ´Œ¼ŒeÁU—s9f$)HÒ�²£Ò!¤#tI*3ÌN’Þû‹óÃÅó¿ýòÔ÷ëôÛ›³Ó““7§»³cÇ  ±xÐÈÈ•¼�#ð�¶ï %-Œ¨\Á*&±»Ö ίš#ÅØÙn˜š%6éÇ¡J³Î¬õõ�Z;bPså1JF Ž&ðk�0Uä é97eföü| î&p!ÂzHCô3{¬ª$ð+¸´@u%)åu|ÉÕÊ�PVû²Ê�JŸSi½šum7 šÇ :®T°ŠŒÊ— ùä%½xò˜ï„ºqo½îƼ�|ˆ¥i—'ê4ù í ö:©yù‹º&y‹ ¤Ý uµÔiÉ4µ±º]7†�°ízíÙò7@�LÒÛJ”½2öU`¼›�´–�òP¸»œÒ8hKÜw©NZ;=&h¤†ˆ$ž" ê7‹â-@”�(©39A¡{‰š½ÝV¾ õCðÚ¥2Ùbsxð:õögiQ¸ÞI™L6Ø8rx»©vmHZw­¥©ã:Ô#*³T°p¾BÍ VžûcŸGýʬì0@¼Pl@Å&ˆ¸ÝM™c2©ƒržª�®àRÅ:0Á0&pLD€Ã£ÆÕ+Ô%¡*g¹ê$ÜK]ÀIyö+oë1ò¹ê’™JWóˆ¬Xe7ìÊØ’t4öL]î刺–ï§+Ô\xÏ÷@ý€aâR× ™$JBñHþõ%#“Ìw‹Ò!o7«Y )DªÃöã~áŽ6 刺®Œ fW¨‘úÄ‚ü÷>¨.º]V8™löÂË ÇМõûV8y‚ØU�“‘&äJß»ÀYP]Ö7·¡:Fð4¼ò/…k;a7d¿Ð »![À ’›÷ "ɪy«)TPWÉ‚(b=Ð"?$ ·‰þAs�,Ç\Öáõ¤¨è°’õnä¿¶ô™ÖÎm ü›½¡ÿ÷�îÛ¢Oøþqò«ÚAþ!vn·ÐÒ†¡¥ CK›ˆê1Û0{6 X<7››ä�ÊL¬íÑÃnjjW  <[ç¢ø³ $ýFIîì.0nì•w;`]¹Öhé±–2Ð$µÀ5nVþΡÍïcÝýŠ˜à?VT7ð턢˸âß¿Y�ãDFë?™Ü�ýR 8$+È!]Vü»Ò�Ï®‡d L¥OÖëÑâ=+õ–iÝÄžàU¹]vþ²ç¦Pýd^51#®²nuÈ�±ºu&ß�,÷—]oÆ·ëaðF€¼ùY䯓kq𾡯äOB·»„>-úqè[ðé²ÿÏCqÙÿX„�»:µ�ÿL@é»åãÄâ=Üù%� l\š„šÅÌr7X¨%yûN<šp—QÓŒÊÿÒ! êvXîñ�K㹯êŸãpM^ç»/S‘*SiÀ.å1%ízTÕZÛ®jý„�KZÏÇ×e/¹ÐCÆ¡Dø�¬z½)«d‹lß: EZ¬\WÉRSÄ�•²`¬|¨ 8 ›ÙYóšìÿð€xD endstream endobj 762 0 obj << /Length 1403 /Filter /FlateDecode >> stream xÚÍXÛnÛ8}÷WبY’âMÀb�4MÚMíuݧ40›vȲג»è~ýEÊÖ-Nœfy‰h…š93sf8Cì-=ì}è½›ôÞ^ é) x“…‰ež )ě̽ÿüãÙhr1î¨Tþ9²ÏË«Ïvõ~xþíúâˤbÿÌü™\ ¿ôo'Ÿz“Þ_=š°G<‰‘“J! f«ÞÍ-öæð¿OFA¨¼¿‹�+�ñqÀ:ñ¾öþìa‡#ÊÍÒ<v%*ØK  sn±�ú”ùÑ6Zé\oû„øY�¬Ù‰�3DÔq€ Ñ€íVD„÷$£Ê#2`7A!À´"¬5ªbMˆ(ˆâj­Éf÷z¾Kô¤O(öntÛÍ„Ęz.øu€@¸D‚ò:†É½¶qoƒ)^çkû¼s¿gë´ÿÿѧ܇ ös=Gm䜂ægàn� ˜xf2=‰§Ò”`$Eh�:Öùn›Ö¹Y>A¡An ˆB˜9’g9ø•p?N—Öç[½ÙêL§y”ÇàþâÝzáâópü í5ôtBQH7ÊN; …±å1ÐŽ1ö7ëÕ†Nw™ÞN“ø݃ •"N´]�õ¢/�:�éš© ±7€X”Œ‹3 ù;Æ49ð*�â4kX5׳$‚LÇ~a{V7>J» ¯GÔ.»tf·‚ ^¾½ ± ‘…C ¢Ô•Ãßât–ìæÚî He'. Ávãï²$’,,7dù|®à§¶$&�Â¤ÜøG‡$pyˆ¡`a³áåÁÅiþTp�¼‚ó°–c„‰;é3eˆNxõ‰@RÉz4¾SÊkßz7Î…Ÿ[¹6ÄEñYÇsg «zE!Y$±•†qङb°]ºª0na‘ˆÉýgÃÑÙøŠNÇz <šÞGé<©üï(Ȱ�ë!©é/÷¬ìrÌÁAµÓ›ÀÉ%ƒºƒ‚ W,M®ú:ÕÛʰ+Õ¦@ÿl$¤V¾Ý­ ˆ@Õ>’¬ÄÐ*� ÁŽ%‹ÿ1I¦§ùN†}TJ›�Óo_/ÆÓ:Ÿ¦&�w«é¶ðoÖ”l+Çe”aMê{°! ôÇÑUYò$lWiœÿ:¨Gˆ u.Ëû…êÙ}´í¢0ä¿ ~‘ÂÖ,ãíõ&rÇ �ºS;3§ÈÉx­ˆ|š™§8ÿ2N£ÄQé?óû)€ ^�ábñ²c˜¾ o¼ƒÔ|I%�[u»‘`ÔÔ6EšÖH'†ÂÃÛ 9‰ÀÓ7û¦Å&³²ÉlWùlZián`¡¸Û‘Pà(²ôå=u‘Î_ÂOæ,Àü ~¢]~ê2Ú\¡^®„ÀtZ±ç,Ëâeçy]ì%'Û¯RÏ·¿äIÈö< Ž'fŒö— ÆÆâÕªh“<Þ”LÈËá¢ê‡�91¸�ó{Ùb¿tdƒ}d÷Á,4TO·â…©SýƒxRµ–PSE› ðÎre‰7ö“š%0R‘}©)+ œÁð¿ï`ëJ‚‘#Ý�X©9Z�XUºÞÆÙÑ$¤¹ØT5œ Y_AQÞ¨wοÕ"a憣¬)¦ð¤¥ŒJí°ôE�Þ6r3KŸrÚ¾³u’Ì%�pì´G@Uñ¿ë&@‘ endstream endobj 781 0 obj << /Length 1023 /Filter /FlateDecode >> stream xÚÍXÛnÛ8}÷WØ X³¼“zÌn“"I]ïSŒ-;lÚ•Ôè×ïH¢eÉR_`Ÿt!5sfÎÌáØ-AŸ�n”FGJq4ž#M°Q éˆaEÑx†‚¿±‡L›`³^mØäG§“eò„Ÿ«·7É2®îFñ<¤$ˆÓØMãðqüyp=|PpE­Mƒ hº<<4ƒµÏˆ`ô«Ü¹BBr,‡û%ú:ø2 .ÁL·ÅŃ7ª¼ðRVèïC&›ÚUœÇiHi�•ȶ&{J�©9 Ð`ÆE °a‚b¢$Ò‚a(Ø€ÝG³2QEcÑ Ë˜’@«¢©(x¶n¶ìÉ0• aÎõO;ïTj¬˜l»?{ª=‚ò~=¯®ùv1Ëm òxV½IãE²v¸‹X2ðxÞ.g‚BU©ËHcVš]D% k�4çP¤¦ÊÚ4ŸN²RBe�¸ÅÞÎÐÏ[ÁÕ–˜ˆòÅtír›¸ú¹¦°"¬ºŸÙܾLÝÉ�»Ô� ¡ù™Ôíl-N±q¤˜(…%j%Ä�UÈ!!$øY(Ë:)Jœ™àþîŸ{6¹vþñ‘z@*¿ðï×ëÑdTfµÑ¾nP.¡rÁ%ƒD‘"²ÒÛ7Bxµ‰ÞVö 鄽 $hˆV;‹’¶Ôo¯v€n(rZn£¶Ëå¶‘m¾W(O’k뀭.Å9á (†P˜ÛÚ(ÒÕ…6{qÀ&0c狺¢3#/E$¦œ¾…ª+b°¦æU?Ó{¯:´Ü¿“ªŸŽ·K8âì"i(lHÎßA$$“EQSøm¸Iœ]&¿Ã¡ â}‘ØíWF¼Ú§¤Ý [àìq¶ÇZ£ÙìÌnŠv‘$Àá� ÜúnNüW‰+{¶Éq§áÿؤÅ�g+»› ëÏýîØÍŽkjA ±h3ƒÂgަÒ¤ij(Í´G0U„uÄ»‚Ùf«©—Ÿâ|²ÞØ4a“Ÿ^@ªãîR†Za-UQã…jç? ”�Ûgæîþjtë©OÀ]šíİwâíæ�C!KÕðåÚJøVÆ0Œ×Cj0¾ˆºÃ«T½E |²Öi)tÄ­Kò7í„Â`ò?ë…ò„<·Ô�ìÝÍço“<_«“Ì>…ŒË£3wtP͘ô¡˜Ü›†tíÞ-¢Mæ@Håäw•eÉ¢žü.˜5‡Q3"ªÞpö ŠSm?yI|Û^x„©ª±ø_9 àÅÈà±Ç ü˜Ô†=� VÌ£ªÝäEŽ2 ,k�›�©Ò¯ºzXÙWbÛÝí“â�_(áð7ì”1º¶H*@5£"+JùtßóX° endstream endobj 806 0 obj << /Length 1503 /Filter /FlateDecode >> stream xÚÝX[oÛ6~÷¯Ö˜Y’"E d©“º[“ÌqžšÂPd&fKž$/è~ýÅ#Ùò-—öi/&Å˹}çFSïÁ£Þyï·IïýY¨¹ð„ ˆÌçÞuïÏEi)áÒN퀲ëpCö†C¢Kéd¿êsáÇE¼0•)úŒùe-YCr¯„R¦� ¨ D+à Fh(=%8¡ åpš‘Ät$œ6zC-a;R€àN›e¾XòécœÍæf×ÂL2"„~+wøZsgR‘�Ë.û±©V€.ý¬tØW�ÆMP¦z~ߨŸ['2ÓçÔšsŸ…yHKÀÄÌÖßyFvµ’¤zƒN»¸ ž~°<"¡âß,£!QÊSAެ�e“*™–˜ŒI?ÍŽ`û6öc»)Á‰ƒaSˆz!ɳ*N³ö»ÅÓææ³¸ŠC÷j‘w¡Bo„nMƒ*ñ/L8¡é(&œS"H@"0"¥Ô/Óûí›i†âÚ¿ºü|ŧ7×ÃñôÜTÓ¬¯üÕbêLYº#·TÒþ@ÈÐÿÇæ®<… µ°ë¬“»¶P¥Þð ){6V³>£ÀöÎ`ˆæ÷nL³ýÕÂdU72Ë>¬×[NWÍiRÓÕ»÷-yùe×"À‰x>wk—W'ã$…‰Ÿúz2_ÍŒ;pK)Ÿ¼ö”V�n9[ ¡ /=X] ³,Ý~ÕÈâ =ºM¦«U:›¢Îc§‹µqcÏmuîWYRµž�€È¨ú ÂÿËíKÌsN¦H ƒÆ?R«©T;—M%Å� £Ã×Ì$ó>ƒFÕê7¦‚ ;LZÛ'Uéè==¦É£Ûl»/˜[mšþKú‹51йYåÝJ2)v“‘­ Å–ÒñyÏûñ4±j½? /$‘ ´µ…‚ÈHÂùÚ·TP> stream xÚ­XYsÛF ~ׯàL_¨™h³7ɾµ‰�q:9j+'ã¡©•ÄV$UIÝ__ìÁS²"§~Dî‹À,±·ñ°÷föëröòR^ˆ")™·\{F¡”^Q$‰·\y·þ+$æ „þ¾Èöô®©TyWªMZäwi¾žSìhkW\¦;e¥kµžì«R剚Y¾�],gϘÅéÌ„! )÷’lvû{+x÷ÖÈE¡÷ͬÌ<.œ�¼ónf¿Ï°;:FThQÿ8GBéŒÉ¡'’ ܺrÙäI ¯Ì‰:Uî÷å¥(ˆDAx ÊáŒvÿgJÅh«w»Bú_çTøEºrï´‡åÆ¹zmViL’:¹©Ëù‚?Í7ô9'€”†ò �d€äT»Þ÷ œÀ¡k m²�Ëù…· „ÒÿòâÔ)ÿã‡wéݧ›‹ë»ë>ж_^2îE5h2N‘^Y 0fzù2Ž¢�´kÊ‘cà;·`\"¡]Š"ñ,¯K¥ŒƒÜk@wt†w*»WeõÆ�ªþAÌh™#ÃgÅŒF yä0#§1›&�1>:¢ ( Øô„G@˜:@<àí6à psúåœ'<ì$çs`^ƒÎczʱÙµELùaHDŒ§ Þq"pfŒ±ÿZÕ1ðÙ ¤!ü«’2Ýkö˜Ä| †´&(lõ-·iû¹ÔØRCŽ\踀êܽY;R²ÿV:i“D è3¶de^ÄùÊ •CµIêÊêû¶M“­}¹…eÖŒôÛÕl!ü¬W…ä¬i2·OVJŸ0WΈŴšƒôxÉ1ÆÚ8¹äbžÔšÌæ‰HôÙű[…«$aÇ+‹#²à�¥$&&�­ðʬü^-êÜ`€�v˜GWVª û[ÕE©Ü£­ªŒà ¢�à8Œý«ÚîJâÜ ÷N� ñ®µó-­·VŠÝú[»­º}>œà´ƒ}ƒBÐ>¤ŠÛ.pǦ©†qÚR øÐ‚û:®Õ9-’Rdø;D˜»Œ¿©uwâØ¯ Pž¶07ü²w͋؊ ?§Z�©i±RW¬ïâ¤ÔÉZ´Õj²9uu¥ŸI“)¨»ƒ þ.0ƒz6&;†ø©-kâÕò•ã«‹7WÞß-?üvñþfúÎælgêqÙÛ‡`é¼Qís9ì@c½Ì�ÿ"Ÿ> RÆ=NË95‹>7j¬CMY«¶ÒGçàˆÊ®�ѦLጠ;¥æ©ÀqçÂeOÙÿ$1Ðß�ã7㎱`)à°úû„7½˜²oúzÝõ}‚Ùp¸ Ñnîè ˜!R¸!rMçB<žö6pdÎ dNG¡ñ©„©8œ…z¥#YdÐëtNð»CÌ‚Á0E£`œ¬?J·Z›kÐsôh+'Z',8s¬t«‹û?UR[Õ¶¹hi×±•J¯¬´.‹¬?‚Æ^A' pà_­GÕ9l± øgU¨ÊJyÑŽ–0þí¬ìšHƲª½JR�KbêãÅäõ¾,6zÔ±óNfÆ÷…k"ÕT¯Òøü“v¶WNA­ îm�´.\›ñNý|"`燃NedgŒ·3> stream xÚµXÛrÛ6}×W°~"g*w‚™ÉCšÚ©3µã:Ì““ÉÐì°Õ-$ÝNþ¾‹ )B¤Kn_L˜‹³»ç,ˆ£ûGo'¿ä“g2�ʤdQ~1™"By”fIåóè&~óÛë«üô:™ÒTÅo�{ž�ÿ~êF¿¾óñâô2O2¿6òó÷—ÉçüÝä4Ÿ|›Ø G$J1RRF©RHÁ³åäæ3ŽæðÛ»#–©è;sqÁ�à Æ‹èÃä� öÞbD…š‡÷]Éžïí\Âù~•PU±Ô�®BâÚzÖšõPpDÔ~¢ŒwöL„¥ˆdÆÅbŸ ‰ ¥©ô&ÜiTï4„˜ƒª(å"AÝqfÍìCS%S"âru?™‚8WÇ:¨õ)’uàÀëdÊ”Œëžð ÜÍWíw ÃñfQ/‹Æ½Ž•¾Øòï=q_X~êÏ#Öb"m'Ôõl1b…JÔM)Vó1ŸLÍtûèGÌ0”‘.ÿhÎùX ‚P.±2‰T&Bì·è1êÑc,Hƒ¡£P&$cOÂÈ;ÝBã’ ì›dJHló þµ¡…ý½)›R`¯î¥V>�!#°Ñ¾ÁUQDÒìÇñQÙªö[íQ©~'S' ;Ê£-Ýä~î±-Çr“�f󳓻Hïå¢\éË5ñOz2²+q’nÓc )‚Âì#e «ÆÆòyªR‚ìwÃgë£ÂŠAÏ é‘ ŽÎT?'ÏW.)öëqŒ kàÀ–ÒL˜oµ{îá³ œ»×·êYóh¨vq*0!=2T[T°ClØèIÎQJHÛèA�¯ë˜^I ú¼ö¹[§æÜ78>^LÌÐ’œTúÛCYi…¢iEÊËr[£Ÿ°ÀµÖÞIuï±¹~;‰n줫÷WôËǧ×_®mî})ûÉ×:lÛ AüŽ•w¤Ö tѳÅùÝ;¤ˆ§é�{_A‡P¹­ÇxR Ó®µVÇžçåËåÇn«Kà¥�Úå_‹z,ãü�zåžØT˜ ;Ù15õ•Qè‡t~”ùK ‚bC†16æy¼¶õDU|Wimýßúi˜B»¾ÐËÛöâ`çšà:¼‚{Q`¼ƒq0¨î õ…ñXëK0ë'=œE†a<Œ ° 8 ×ôB õQhÐfÄ®³«Î.`'½SK½´òo;>KGwƒ: È´]@ÖÔ'ÄòD“Ryô-N`ŒcÏR® ‘ ø/Ô†g )S›#U›À�< U„ªY‡"dÊcþhgp¸�ƒX©z–ÚL‘ƒÔæi*Ãáþhº«‹0Ï" 5V#€fI V�”·„¦hÛûn«;Ü Š»»[lÖËM�Šò„+ÓÜR¸ùÛûö>"z,þ85]ײ )$tG%i»ê9ƒV•@/ ¬³�^=Ã^–顪§ÇMÝÏÊ®­÷­ïªML¯;—ħ1Êñß…X*�Èè³…™[$SÏd X`>Õa*ˆµˆ=J)Gz0J)�;”²¼]N þ’9ÜëaøÀeÙ³X†ÁíTñÿ±¥ep©¢vˆ^ëæ¡ZÕ‡6²>Á':— \RÛ/>{¥Û¿li¯Î¦HÑC¾æ¿9·Dk„Ò >ç»ÿ 5|P+ endstream endobj 748 0 obj << /Type /ObjStm /N 100 /First 891 /Length 2397 /Filter /FlateDecode >> stream xÚÍZko» ý¾¿BÛ/³¢HI$\à>š¶@/$)Ð6ó¼ šÚ�ã·ÿ¾‡³³n?2¶×¹âhf‡#Ry(M•b¨lA8ÔB!Q UpKjŽ![EK¡VüžS°œÑr bÁ…b›ø•ÄÒ¦æ¨Tt™k ïDCŠÉ{±�RD7…CbÍ�Æ“d�ª_TG !e‡P2.JÄ#\”(ªx½x‡¥àÂ.jH•1 ¢Ãª´`,MV ¬Å…cHFÆcŽ´j L <µÓ¦âuN§3doUKô·W`�ZñH Ch œCàMÎêC ÃâšÂV\ª÷¬�««SýXªZ`�x½úÔQôμÕ"¬Ž™PÂE2¼eDÜøÐV » ©V6Ä|PËÃ[±†Ì>;°~fó_4dñy…y³@�r†Á är†ºnˆ\0×J�)%mÆÊÓ¤˜×ì.àp³¨˜¯l-®Pq„5†TStJ½s½b(ŠGñkô7atM@ɰŸFw!Œå¸ýÍj*UWÉ©¿à�ð'ðWM´°ãÁ_©º!JÑu XCÝA”ðÈ © 7ƒÜ"ê0¡€š$< ZdàeÆEõž5‘n4E\ÀãÃ~ÊL|šØW,¡pAsQ(`þŸrÅÌ«èÔÌU�£˜a})† cÞ<{¶ÙþÞTÀ‰áeØþýÿ„�zŒÜ`%œ|zÿþíæ»ïfÑç§'çáÙ³°}înøóKÏÝ a®å^†Áö7˜âćžz¹�£1~Xž�;örC˜�‚å°<Âr(‡GЄ˾ Ú¾8;í_�çáMؾøéyؾ=`_ÿ÷Èí/ãfû#€�'ç±gЛíËñãé§³~ü8/Ïù§ŸÇá]ûÃé¯á�ÿ�-7 ‹H…µ·­=CLu/þýÉÉ)z|3‡*‡ä~ºoiiÓÒòÒÊÒæ¥-K[—V—vßßšÌãm¶¯>uçóý_Þ�ü{³ýáôlÏfÄñíöOÛ?o|Có�ëØÃ8”&ˇb±VRæ&bRrŠM©®Ù÷óœ¾ Û?ž¾> pˆß}8ýχ´Û}ú8žívïßu;ý×®Õv,#âóˆзÑȱtÊÖa©æÁ~ï“rÈLÍ>ÄðX©!, ‘ˆße=ä1ÓØ×A³™Õ®X×õC+¬Cß–í!'�5Éš‚”Øš¤´WÁîyÊ%Ž£i'H(Cî°x[†¡‰9×þˆ�sD  ÖUÏc�"èÎ*d^¹0w#PSßw©-Qcé2Õ¾•ã[™ Á >LÆ�'‚YJwp ª©—ˆm_R‡¥WGêˆÚnš¦œí «ÎËd¢‰q¯B®´²UžjË@2 Ã�Ó8TÇ‘Lû¤�aåZ›ìdêÙU¸ƒ_D¬¸dÉ�SÄŒÆl¯‚D½ƒ'ËH6LmG] ž…¨Ü“öÁ­ÍíÀGŽÊ3Ýe$su:�d^h¯B©ë!#@Ø”úÔ¶1w¹‡ÜSîm” N^#}Ù U¡ÿªb3¡m Œû£úRv!_E‘³A VÉVèH«DAÀxö*YÁb7”kdÁIY©ZYÝo¢Ô€¿]–`ëdA“R¬÷—}i¾™'_¢Ó7ÑäËtú¾¤Yé i®vÒü™ù4®_!zµ<© ²‘ÖÉÆÒ”²N6[E<^'ŠEŠBõVQ.Ú8¯Ï)7(£×õ±Jã:30Õuªy24þЬ %÷³Ä+;†}=ëÞ*‹ú¸1”´‚ŽWuœX` ýJÇjȘžŽ„Òª~QL7ÉÒ£·GXsNÄ¿Xs¾ò°BÕö¦ð=‰¹Ð´¥Pµ¥Pµ¥Pµ¥Pµ|ÌBTPÅòm)k@Z÷k"º_¢Þ¸¡ªûx~ö©?ñן_ %ÿíÕ^îv/Ç_Þ�žìvïN¦Óã1AT¦îIºìó¯óÉ›jäoM�ٌӸœpO|+¸K$æì3X3›¦¢CÛ–®ï:±‘Qo«µ9öàè dýˆ µ$'_É ·ˆiÞúVVpF£ßÖ°„@ G¬mTÐhC0sä\øi›5!£¡d'Þ§—” �’|ÿ»Y³?rºñ4NC+†šÒR7¡VÓh£v¥+ãXëq=¢ ’ÁyÕ÷ÕÙ“�o\7’ë=��µL2ÀØ…&wEú’…º¢ãTb‰ñ fî[ÝkyÇ%Ù¯ðŽke#ªŒU’Ù—væu²áµévYn2Y8F”up…­ñã‡5² 1;É:YOж]ÍøÌÌ7R㛸õ}Svº²·ì[÷LÙ˱-{ĶìÛ~�ØO8ö--íÞ:~¼±¿ç%å/÷T–¶.­.íq÷œ‰AÝ],RöÉ÷ap·TNO:¶2\PüTkÁ. �ŸDÞ‚ýÛ¥¬ƒa½Ò„/¤BMõ,ÆúÑ{ØuJ]Û·eÁ2 ±Ž`-L­ÒN\e:ôT�ú±LÐY©‰ó)Ü�п�YAGÈOD#æZ<¼£.Ão-݇b�-u©eÚ�F)$çÍÑD'|êŽh×ÊMMÐÙÒÞ]ïýõ8AÁRóãÌCEPDàô*‚’<ðEEPɬ”§QÀ*‚ÛÀ=•ðº7«Bšæ¹h×LþUHw}ÒÈÉ|¨pÀÎi_7Üý›æ…„¤•@9S(ß¾ño\”Ÿ¶G˜oƘăú‹üC�ùä!³©$O»SÐì™¶ú*‚/ׯ�ÿ ®�ºì‘ó±sè´þ á’ì¡D™ÊÖÉßkŒi•¬4tÍ.ßµ²ˆú×Ö(”ÿС–u²È–¤Ç—õƒ¦y�,yÍVî/»¦NºyÓrÝÂ¥Jë¾…ç+…óà %ÿ$j.d8³�™w ¡qA<-óGv±¡$¡ääÅÁoô“ Ú @Á�Ûª€ p¼W�²k% %Žà­èDÕ†~>©Eü쫵íøeø9”ÏkÂÏ粇�‚XïŸE­‘ÍZáò¼JV4^{pp­,ò·Ÿ¼“/ÝÖŸ ü ¨5 endstream endobj 900 0 obj << /Length 733 /Filter /FlateDecode >> stream xÚí˜]sš@†ïý{ 3•,ËGà2±jmu�L/2f#«î��µMú뻈IŒ_Yº3�\Á…¾ïËÃÙåì�` è6àæUCVq[\º�k¿qÑql€�f@.¡æØ6¿Xš©ÛÀÁ½Ò‹C¢êºò¨þð¿nI^t, 8škÛF!AÓ‚tQùß–ß ·ÃÀ|k÷G…Ð]ÍåöM]×\Ç)–&ó™Ò$hü˜2Iþ‹¹?Ës9þƒ,$ å˜{$\ŒW®Ó~ó 7p�,ÇÔLk-NÑ'ÉBq3*Å›àˆ,_‚Œ ,5kjJ…ŒÆ3^…‘š� :߆X=ý±«ïh ™Í+°Úäÿœú u�V1SèfÉ"ݽÝêžk¿©+09¨’ÂúÜçm)ÌpFä�™JDÄ&<öÁ·»6 U4¡×JŽ‚ï�5Î;Y¾û«‘AgÊl•ÎÛ 6wíJÕБj;k$IŸe'/­­ÈësÁrÉ^å9�Ö¼¦šûwŒkþ\±Èx´ÒÕWzï™IìPÛUóü½LÆ—L¥Ltaç�qDÿ¨‘¡KX•·¿¿†óŸkµ¹uzjû�¿"ÛŒw endstream endobj 991 0 obj << /Length 1041 /Filter /FlateDecode >> stream xÚÅZ]“šH}çWô£TeHÓ4_�ÉÄqÍ&:Q¦v«¦R‘V©t“J~}ZpfDDº›vò¤Uʹç~ô¹÷¶B°Œ”÷žòöβ�£¹–eo °kkºÀv‘féÀ Áã`<ù0üWýê}T†žò¿¢ÓG!Ð� 5Dz€í8šƒ0X$ÊãWBúÙG5ÃuÀ�ò› À¦¡™Ø ïc0W¾(ðؼi™w¡f»ÚÒ5ød~»I¶È�£o*†mý¦dRQÈV.³‘o�í ëðyeÜè®æ"“¾"M§Ž•�÷ÓÏ÷È‘ÂOUv‰Ÿ‘U´Ióý³ ö„ó $6Û Sots!ÿ»ŠÌÉrʦIÆ•Ažól—“ŒëÌî�Ó¨èðC¢içÔt{^Ý+çuº\vÓµB>M_/à5ó2Ö~”.U6]±„uàs�Jn碈A< ÒªŸ¯õÏä)¹»¸˜¯Ÿ]ºòTÁÁÏm_øaÞE1éAÔyAú¥DïOhƒzÂüä·›8¶y_¿J¤í>?Ç© VÖý!•¥zé�|ey! öÈùñ²?µO?3Ô‰:Ùü³„ *±Ž¼œìo�‘ Ìûóšf!ÉHØhFÂÝ¢  Õß¿½vÈ ô�Qoì9)Ë{zV 8³vðš/Ö4â1‘†Wì›–hÁª±Æew_™¤Ö`¥Ç¤¸h´G�²Ín+àgw‹.h6:¦“¬ÞÌÙÆ#‡™ÈSq´Pq¯K¥6'>̇3ÿ]žG«Ô_i“?4?•Dø—>:ˆ�Ç-‘G3?œ³¥qa¶Ö0Ó”¥ Â8œÃ–­“˜GÙúzÉ©“¸['«Úp´«øOÔòùÁgdêše;Àr¡¦»fã4ˆ(nUs]sMShm5[ŽÃâôþÝlüÜ *¸X8B¬YVA@«qkCT:Rüð‹ ÿO"×3Ú+ ¶åŠGü±D ß_4jK¨éÚÝuvëÝú”¶ïMÿNæœ]ü¤ Åb^½žû‰ß´5ñüÀßü_Á ›šeê×—jø7ç$Ë! endstream endobj 902 0 obj << /Type /ObjStm /N 100 /First 924 /Length 2724 /Filter /FlateDecode >> stream xÚ½[]¯· }ß_¡ÇöE+~ˆ#@Ãm�0?´5ü�:EÐàÞÀ@úï{8Ë�ux] »z¸Ðì^ ç IQ¤xvº—V¦xéc–©­ "Œñ§øãâc`”BDmû’Ÿ¦öB2 V¨·¸w2¥ÃÔYhŒ¸Û yÃœÞ 7ÁœN…i@xçÂÒ0§K�¼˜£…»9.záÑVxJÇÅ(ì6³Ï"Ôâv/ÂÖŠˆáv£"Š—™ÆELp»I@ÜnZd:žŽÚo�”pÇ´Q”]ÓfQe¼)h‡Ô9ZQs<pu21¸¨ãÉsHéÍñ¼dgÆ[Œ^ºæ„FºzÜ>J7æÃ„ZûÀ;ÍÏ ³kŒ9“Š0'ã‰9S Ts´X‡¶&¾5›1ÇŠMŠ9£˜ë8„¬ÑfÈñ28̆ »9•¡a Ö€o›³k�w:þZÎ1�`qÍòàÇ·Bq{\@¯¤“GqX“µ8�‹^z)aiÇkàs†…@|ˆ:Pk<'‚¡E`j €NŒ+…�àg­C‘Np´fx¬ã�©MŽypµæÐ¥| _B<”EÄóð ’NÇ'"… �ñ :0ã4àˆ@�«P¹s8s£˜‡g0Á•††8ØÊá pu t¼qט‡g° ¼T@<ñ^.x|óàu$m„bð áЃà"XW.±b¾µáÊBo2bae8þHÂ×k‘´5=<{v8¾ú÷/åøò‡>Žß>=~xxüðêlX´ßŽß=¼úøîíÃûÍRÛWyøñ§¾yúµ¼Ž9Ý{åm•R�þæIï ä4ýëÇÇ'H|½…|³…€ÓH9rŽ’£æØs´GŽ3Ç”×S^Oy=åõ”×S^Oy=åõ”×S^Oy–ò,åYʳ”g)ÏRž¥×ZC:<ëÙ¨*�ÅÖª™îÙ£.¶ù¦�ÝpÍ[£�jÈ�wkЬLs‘9R¨,«uß5� ¾²òÚ˜Íæ˜r1`³Å ¤×�Re¡ß[Œ�hw Œ$ëj*q4G�Jý ‚yεTâ. L꿤¡Èy¯í^|âH®.~IÈöeöÅ °�O¾ø% ïªÍׂpÔÍýâ—„d_EÖbÀÕç¾Õ>Ö@Pj5RÎåŸb]**ý/—÷‘åßâKåß=@œË¿ÄË¿{€Èòï â‹åß]@ ÜS¥ $Y�eª5(r�s]F-5(²¬¦×³ÝAHlt|bdY­_3Ç «q�¥w„ǧ×pÐÀ4PþÑš¤êl '»5IVó¾ÖjH+ù«tP¥6[CgCœ­¡Hôˆ|±5XQÿÑÅHôHe±5.1.ñ2ÀPï‹­Ñ¢ÒÐÝPÙXe�“"dXµ6wE²MÔ�k!P@4ÇR‚d“©¯Q„ 줧r¯GOÛ÷°"Œ¥rõlÄnÂ8TãÍ¢Ò‚g8’Ê(Œ ëõJ5®í– ûƒm5gìâM¡&EýÁkNd¢¸¡¨ƒî¶BxDŒåÚØ "sôC¢ìÝú¶Ø.¢�ÄËu,ÆÐg�^ÏŽ)VŸ«Œ�2âï�Ò;Bqzh4£!^çšx«“Ù ‹Öh&fx$|&^ 12ŽÈÎ>ʺzâ)´S˜rÔÂt:Ê�ríl¦ß>Vƨýα’0^ßÂï+©GóØ÷XIÆ×·O½qAÑDg˜…NY]óh›#~ù¢䮉™Ô¸h‚ôúþ©t{Ãá ´cp¸©øÿ áyy=ýÔY>þõo/çúLCÊ8¼<~üùç7Ÿ›»Ei+fX¤sü÷ÜO�¶ç¿@ø:õ¢�/"¦É©±�‰Ç—ïžÞ~ÿ€w)Ç—Ï_”㫇_?ü¶Sý[®Ã©ïý)×ÁO­ñÿƒëà'HÁa9�=GËñüÿ™ãI A^9�”#ç(9¦¼|ÿ ¬œÆ”G)�R§c½"ÿë(E–õªÍªY°á �M|±£G _[Y�eµJe”HøŒúHWq(â4Y ¶©JA�#vdÏð†ÚtùÁŽ -ï§øL½^Õ/×±íÙŠ½|ãóGÃ#ˆoÉyU¿é–§ �Ø 3ŠZ@¢Úiƒ¢c«Fú¯A´ŠÕ /m(›”ñyy!!~D¡H%û¶>£#L°Ñ5ÆÙ­¢Å9"ªrÝŠ ¯-šQ-–é*k ª xBês vÓ†"P<âøXe�^{œnªñë’ DréBÇ2k8Ö@8†ß̨Æ/Qakö…^©ÈnE£QÍ›W*LéAãXf �ꪈ HnUb…(­Sçšn\<ºu¾â\»oÏÖ”®C|1BVGãE°É¢¾ä9d³Ç~9Î![Ú—Z‚wø9r}ì—¼ÿœ�'2ª¶è‡;ˆX¨íò;6(h.:æ>ןÌ£/õg0DÍtmÌ-âã¼€@|õ”J÷0ñ—º0\ endstream endobj 1005 0 obj << /Length1 1416 /Length2 6052 /Length3 0 /Length 7019 /Filter /FlateDecode >> stream xÚ�wT“ÛÒ6Ò„ RE:Q�CHè½÷*¥† ”$$‘Š ½IïU©*½ƒH‘* H¥ƒ)*J/_PϽ÷Üÿ_ëûVÖJÞ™yföÌÞϳ×Λw�øí‘v05$ËI•uu5Á $, 89�áXWØß~§) ��#Rÿ�PFà X¼O‚Åu‘ ÖW X“‹K�@@!Hòo -T�xÀí�º@-$†p*#QÞh¸£¿Îß�@n(,))~çW:PÑ ††C! .ësï…¸��P8 ëý�Ü2NX,JJPÐÓÓSâ†@¢åxî=áX' ! C{Àì�#õ n°?£ 8�ÆNpÌï€Òë AÀx‡+ C`ð)ö04¿:ÐHS¨�‚!~ƒu~îÿl,þW¹?Ù…àˆ_É(醂 ¼áG ÜÔWÓÀzaï!û ăÄçC< pWˆð«uPMÑÁOøg>  Ga1¸ëÅŒ‚eðÛ¬Š°WFº¹ÁX à¢?8Åï»·àŸÃuA =>[p„½ÃÅöP‚&¸û˜¦Ê Þø·Ï†Š‚$Ä…%D�0w Ì ê$x±€±7 ö+¾pãgðóA!Q@ü0?¸ ÿðÁ@<`@,úÌÏç?ÿ´`0ÐÅí`ŽpàßÕñn˜Ãoþh¸Ð„§ºøüëÉ Ï0{$ÂÕûßð_G,htOí®’)ߟ‘ÿTRBz}ø……€üB¢ $"Ç?øý³Î]üOÿ‘«‰p@/Š]ô‹ß¨¿{öøCî? áþ³˜O]�ûßL·‰‚ ø/ðÿ™ï¿Rþ4¿¨ò¿2ý¿;R{àêú+ÎýðÿÄ!npWï??»Úš#»]ÜÄùþ¥ñDŸ–[”�OÌR”ؤŠÑÝwY£¨ÚÉåí»�8)}ÿªîü˜èÉEW¢&®Ò¢×Ú^Y’¥CÏ"iúå“!¶É®ÏxEt—á¯ÜOn±AKÑ–©z·´eZ� žT ½ý}3Ô]¬Q�Z�V¾s„b©U¥ûXTD.W˜Î<½ö3·Øc3ƒÆÇN�VaÓ¾ûÅ8‘³§;­­J\SîQˆšhÜBÍŒoFÁ“ã-°à›ZhzU´2ÎÓmqß·ÂkÑJ§× YèW†kqýºð�úq4R Èžól£-28†A 9âVÙôRWø[)aœ=A‰^Þ‹ãÝ@ú·=Èa€GI`ôñ&ît“0¨@ÕâHžß½.m:Úæ(Öû´›‚PnòÎù¹æTý-7EÐà©¡pýD/]ŸO+ßSúæeIêÅøƒ•aݤe}J'?~ÚiîÇWÑô­'ÄF·(.ì6åFñŒU1�½ÒR"H& ùìsÖæ®°#3ÓN–ì5v‹Vös»s¤ÍõïJ,¦óÇ=�.×o›ÝbÿÊH¸\Ÿ�ùz²½Ž¼¯†Ñ�ç N*àܲÚnòŒÖ{Y6¦!·§â·÷�l:;¾û^òµ–¯µU`çûåAŽ%×HÛÀv­MYZÏ!¾¶­N1Åvy:<ïmA-¸@ÎIß«Í Ä½´iNŒF !O¹HúÑ ÎøG7&¬��“ @7³«Ît}g a¸³ÐÆjS¨¨á%Äù¦Ä'›Á$y÷¦g*…=žÇÇÆºäÝ±Ž¶KÈøŽh"ƒP „ˆØ(‘.mÐ’ÐÌœô ƒ·øF¦¨Ç.Q~1««êG!³TN²^DµzÉõ;|Ш9¶`·2VÝïpÎ0ì‹ôä;¡X^¦ßf¤QͺJ,ãÌgPÕ»¹™Ù7MfíëoÖHÛ‹<Í7.¤œ•º³tìAwªË;3!͇¾~Ù<º‚wÕx£À`lÞ³[âÞc'¶ŽÑïi™èy�ßç¨MùØ¿lq ýô5¯Ì'Bgt“+¼½Ðož-¹Ô_´p|ð­n^N>�vj¹Ö8ïcò›¡gÆØ¢ Œ-Ö´Ü&�h^ceé` ÷>ùÚxÍ/8/ »:eþ4¨ù–xÀ¶;6xÁáØ¯�fu$‰§2T‚ØÈpÌ<Ùû�L¦VÈ9Yߺe1¨™Š³ýJ¬IvsÈ‚�ÜxŒ`^iÅ3e7äü hˆ³Ôï jú†ýg'z¹HšÈËÖž*Eß`»ö׺ˆ6 pû{#Ö muòd¨+pai–ê@¥î&EVØÉ [ïîÞ¢‘[eÚÐõU`Wî盟ÆÈÙ^ÚÆ7ÇÞ“·Q´¤é&C,�¢€ê€lQ¡ûÂR Ù Ì}2÷ÔG|À‡çPSMÆJ"1n´î­Ãlˆ}@@Ðìs½ÍP!+(²¸/²s.»Åú�þÒÃ{ºÂÉš·CC{²Ê×r÷ã½OÚ:&ÝÍ|á;¼u]‘¢~Ï %‹nTæÞƒ´ÔR_ƒÝ[Ïð‹#{&ä§úfcZI?ô2úòô `±X»ÿ@hÛE)!¼çÌõ›œgœù†Ì'�{1•=Ä^4¯hý–Õø92oeÚÑÝä®Ã¹¨Úa¥kz¯­;4ve»P,ë1î‹”�‘Š¥ïÎ×Ìœ;+òfÚ:ކ<¯ª&ç.ú,=XipÕ„=Xe·öVAú°S™@¶Î¥fÁxú3ä(î¨H~ˆ!Mù5­¥Ùf·<ä2õ¨ƒ>™ÙÜ;Â¥’Ü’G ÙƒøÁ„r® ѽ+oFKŽêÞ$¬âŸ×¹gzÿ¹Ýó‹AЃAgz9Õq—ê€ê›æÝí:q­õ‡OzãMR+÷3—€ºa®ÇÆ,}ˆÑ3ïÌ.˜IOÏùOLˆ"ñLV$2D˜}È׊Xa•¾¼ÊŒk œÕ+çJfJRoV¨ ”$”îѼ´1¬†Kâ(j 0ù(¨MHäúÁAÌË}!�•ÜPíéWõHCC°†—óxÚ.Ù%±âç½*o¤×»zçòo©^ùÕF¯Òˆ,½ëx7ä›sL×iÕ3²‘ò±÷1»@Bò,èq3ƒiU4©4yg-e uiè…Çx8[~<+§Jt^^¯ÏMÒfÉÿf4#[ΦV'@ƒ‡m°WÇj ºŸÿИÁNÇOPnHÔ…æ Ã�¬�çSý3qzÑŸá·™¥’?ÜyjbC¯sW>¾®·ÿ†žrùª‘îþ{øÖû«SrÉר{†ÂW®¬üæýà|Û¬3[eCb-Šc{Ìw;çfƒZä|ÿ`dãÓú”N¢´ÍC€½AŠ–&G}sJç½>î� ôn†îk´ùZ þTD’wR^ˆÕ|ºa>Îó÷R¼Ü|Æbt‡D+DF±3¡8Þ=ïíÊýhIçRÓ0öe;Ñ–IÍ·/käíŒ/ÜFyéOâŒé$ã¦U› Íôù§R&:¢)+5ÖQ« × ¤l·È,q§¯©GÇØ‚U�MI|²Á;àÁ ãªdS�ÓQQo3m_\ÀèÎRêwß©zìåg%ûõSÙrܤðT»ñ„–˪EukÝÙ{aÛS�¼3drE×Ôìyæ¾ÀgÚ{üصô´õʲj!\öûñÁ…a#1,¸ÎµkÖö¥]Æj$An3�æ&ý« Oöýô�q•ê5#ìÕB¨è—·Ê‹ Q��Ý¢T½^:*oÛÓ"ëžvë±¾3$êD}ÍrèñZRáNy4ˆÈ«žšÈš†ÏÄ<y�¹Ú9ÙôéX=GVIĶ£jñŒŸ¨ô´áËÞµµ ’@Ü«”•Xt9 åÆÂ(G¡Òs BÁȸÏR�Jô{À‰¹\êÌ9£Càb +Œm a7Ù7£9‘»Š^$w¾˜{ý»Rõ)?µKË˦œž—ÂÅÝ“—ÚlånQ³ s6Š­~h¿ß<ÖNCv‡ÃFî6®bATÓƒòø^þ=‚‚Ô|&QñTÂM7¹÷9‹Ø¾UOúÖrº?éHBI+j¾e?õz#£²zѵ€D½w¹•�»æ}¥�Ú—¿‰Qµ+ÎŒ÷ÚÚ.·:K RÞ ¸_p~fRÄÉ{,Ælùq§^iu1q*^¦cån4ŠÈ¹, ½gݳÂ/™ƒ—h=Ïiø9|eRØ=ð³v¯9Û9Äï)Àò5VCyãòVÿ[º @eqø²ŸÜëZº’NT*󤂹ucøÔ÷µ€O*´2Ìõô8?œ»˜~ê¡2Yß··,�,“÷ÏP@®T�bÊZÕç j1n<ó7æ „IJ±ó†+ðLW§—ËÍSåt©ÉõÏ6Cü/ý\üuF>-}}u@]¶Ëú…ÓÇ —ŠÌ&8¹„ÝXü¡ÆúÆ¡—ú¹@|(å&ƒþAhÆý¨oÎKjtÆ3-ï®Þá€l1NWc’jó >Zº@]ÀÈ*¾Õ‡daƒ«óĪav[Qw”ËÝw:¹BOÍi75ó3{ÆÓˆÑ¯,§ë_?zsþéĆ´õHXlFÛß@É/¯Èrx¯*t|Ç…ôiÐPŸb;÷¤•î2ãjJr*ºý™8ëÀ²‘÷úÉU®³Ãï¼eYvK¬q¢ªÑ�Œ8޳GЯs £HTì+Åï„NÅh EÈ«p[­·‰g.Q-MƒêªNã\kò׃B€ù´ å̶ÉÙK ’Q7Ó�– :‰ãT+C,ÅJ\[Å_L¼&Ò¡üª#L+!‰È—ÆvŸfÛD—+Ú~¾Jj•{ñEÛË]¸³pá� ¶˜µ,s=î�ïˆÙÎpPþ ìªj¼BEs’À–�õº¦P*—›UC®¶6uwp¶f\ºâàcï‡'Á~nfYëü?êt‡p[Œ�_\Nôäi'¦Q�Î&Ó"H˜š³¤ÞL©Ÿ úúEªë·¨9'Ku[»Kû6‰‚Œî¹í>kaÚ ÷ŒÚñ½­¥e’[/Î=Ú¢÷œÏ¨ bäÓr�gYÇVEJ0R­V½ÌÒBå!¯ªå]Ûj«¡t4Ëgw voÂÈò§7ø±àÇ™{ãídB“gN]NW|æI×G’�™Cy´Á±o{ˆ–¾J¨sRG †ZÞlö4èþ�K>Fœ¾æ€l2‹Þ|ž�Ó JŽü4¥r3¥ÞY…|ì¶„ô•‡O¶kÏw0Ĭ¹Ö•²ŽÊߟÆ×ÎÊ­m~À]–ޱ±JlAûãÿj$VDbRt)?Ww|Ü”vô†YŠòHIV’cïò�ÞMŽLÞ±ø½ã>'4åÞÍ rvX©ôÚÀµ€Q³n�{ÿõ3�jÚâ9AÁœx¹¾0Æ ^iúÜýJü`cÅ‹¤2ª ÔgǽKžÞVó–Y3!w·ogò9 µë�÷¥}ööŒ›DQ…¶ç¾Ž-Ö{º5Nµ@Úê²¹Ðe¿àÕ¡é¤*ÛT^h•`…'´û]mþ¦ùèäk¦Ð,cùí«…aÄégÝä•©€÷ ЧÞM&†�. Dqø7’ºþæoÛBƒ}[ÌïŽç™¾êæ^ÇÍ�l¸ùx¼zÜ©‡åÍü‘¥"PI¯dJ °‘ƺŒÏñgfoˆ°rד¨•m¥3^9œýZÍt‰HQ?—»<óÆ¡Š“{æ5¤2­qKˆ‹$�I¡½å_a·´+|Sö�êŽÁzR*÷¦ŠŒt�seWÃñü¤æÊ‘†Žõiýü‰b­c¨zâ[=£ÞHh�ÐøÏæh�ÐÙ%ñ÷Ê�­••ò£Ö*édgÑq#¶)ÛtY®îeÜBV³méz0ælíµ$P ëùâQ8åà…uLÚö5ºëÔ¶wý�ÎÙeµgÏåU�Vµ™33¹jøv"òÑ–B䢽&P­›Ÿî™<)u"©ã%´ÍCŸ(R”%šHôôv#ãxQ˜+,GWU ÷]]Ší|;ƒÒ†ñшœ„!ïáÐ úàÉz?¶—kÚëµM�ƒn¿�`ZŒÎIF©JµzögçŒÐ«Bi(s;K;e5÷Ö#еzm¿¿I2ç1ôÚšKX�#êò"˜r*¹MÖ¬¢Á¸‘; ê#„Öùw4Ñk^Y mÜ ,”r'¦ïésòÖž­=S“–¹wžû.ä§§ïö‹†yòqjÚ]cAtÛi{Å–b—ÝFKo~íɲk)§+n”ñÇ|NT¹«¬'¢mY?»½*¯zû‡!bô ùÖÆ¢ËíÙÜÝ£¼c_- žó] KbfR:¿;I£&ò*2<)[V™§ß’_~O(ý4·®þ®—º#‘„ !ØcMSwÑ;Š C‚^DP—Õ·²¡ív®¬­S !I<ö*í�„K?ü驌ÝQrVnÓ%ÀR.C8›´ìÕLbõé‡qTâFhWh5G„ËÞò[…%²º¢´(ˆn@øë”t·û«a¾'i»vŸØÒ)®`uÂ$Fª@©ýá¾Ãc­úl<óîïV¨Ô’±ä)ú¹„ù²^Õ…ÍÝ$QSW?Ù¬vËž'R�ò¥VŒêK®„*ú 2<±¤Xô¶¦¼#ëeÝñ„äelûü1}²0g¥©% ùùàÏ+*$/câY,ïz«$M¶]v3+²¹�`9Oñõä¡Ö´] ,ë„C ¾�Ì+~­lcÔ-á>E®Uo…W_é?�=$% !lOA îÇbG˜(¼(’wöøéyÅë·4†m dvÀý€¦ ãK5Ó.ïESíÍ1Ç)�«‚ì]ÌPâ+îÞ†£2½l‹^²»üYáÄ?Õ‡éü*ï5}ÃAÓÇw+†ùyà„?ÜL'æ¹Ku2R–Ì£ž]:CÉ VQ¶q�ÕŒýT­~´?™/6âdáÒmôŽÉ¿§\�Dnw´ÔXÃG®èy];pð ÈRŸEž¯*¶Ìêj†“!9;Ôí·a²2O÷ÿ+Í£‚õDÞÀà¼ò.§`1éaEš/%T‡Š8x·Ö˜˜:÷ο�šš0ëœYç˜)T|¼°L�ï~û@®RtÕ|dÛ†l#/×` ±ø ÿ‡aq·ÓFzÚ\“_K°_¯g¯î~Õè¤uÒPÔ‘Çò”Û9æÜn…—^ÖÍ|:š¢é¹6lUÖ¾ÅȘ6{”ö‚G“ž°ó²Çª1m§ò—tN×Q?Ä!Eƒú g^ÔØ—Q©>L<éçê¤{ô‘´§¸àð¡N“€<¨v–ÿýÒ”‘­ò‚Gâî0ãŒúb»B  [Ý07Z‰56Ó· eý." ïÅá•àõ™úÇãCóFƼÒG mu:›o š›�È]\‘YÐ÷Á¸T/©Y ß6qªvMKÛÏ cbÏÏÏ0îaÆ¥­N�ÄÐSÛ:‰\Rf÷"»ZÒã�KŽÏ êtìå¢#µ/g^U8~oùÍHOJâI>ý_ŽÄëEód&òs<Ëã†vœ#'SÈ膀´5¹H±«K]½þ»v¦ÌXÎHIœò¤'ÀµŸj«gÄÒŸÑ�ï:‡G'2E¥0}Ê1tžìÌ;ðh#o Â~峊½Æ»5¸_ŽË+w: š<´ä*êæ k?_ÿé.PÕÈÚ6û®0ìF×Páf¯k’©—ðžqöó+ûœ:v8&R;#ÜX­ R*î½Ñ+„𠸧ï]Ý÷'Qו™ e™\oáuF«Ã<.ëùølrNñ[D/åð§ñå6Ñ X¦Kœ”aªQ¹®_]ÞÈ’pëq@@äu£†U†¬¤�²kˆØ#Œ$™Õ„`§X÷¼ø©cKptzy錔–åø AIBûζt36â ¸|²Eé[ý³ðîÏ�>¡vî圱ý5GD-?\TÊu¶¼ Z$™É"ŸÝqr›Úç�,ú8jLÄË­„ò®Å…K;J´2pœrÝ·»‡©¸\s~­¥ØË© a~ÅѲ$:©cNLJ”‘–à j³�ux™L>¦µ Í‹³âŸyíÍÏ->”‘j©èÅ�ynþ¤À¤c>áyR†ìX PHiød”{ëäG‹ %ŸÅºø¬ÍíQ�xz õqKʽø®ý¥w‡–ûÇŸÖ;V>|³F‘‘àúÙz`G¤®ÿaž¯…¸¸�\³èx®¨æ•Âm‰è®ñËI6.ðrûÂø‘vèõ …kzÃ7ÙŒãÝ(IÉùþÚ(›^ endstream endobj 1007 0 obj << /Length1 1397 /Length2 5932 /Length3 0 /Length 6894 /Filter /FlateDecode >> stream xÚ�tT”ïö.)ˆ"]2ÄÐ1Cwƒt§ä0 0Ä 14ˆ Ý‚"HwJH‡4"­„„”¤Hóãœóÿ�{׺wÍZß|{ïgïwïw?ÏdÔÑ瑳EÚÀ”‘˜$PÐÔT€@¼ ?hG9Ãþº €F0w8!þ¿ î0 íS„ Ð8M$ æé ÀÂâ`qÀ‰ý ˆt(B¼à¶M^€ó * ]}Ýáö(ô1ÿz°C9`11îßé9˜; A4!(˜ úD(Ä �„Âa(ß”`—t@¡\Åùø¼½½y!.¼Hw{in€7åЃyÀܽ`¶€_´ .°?“ñp�?~}¤Êâ Îp( á�ÎðDØÂÜèÃúªmWâXã€ð÷n`^ð¿ËýÍþUŽø� �B‘.®„/a°ƒ;ÃÚʼ(7‚°ý„8{ Ñù/ÜbƒüîP–Ó@ÐþÏêwEyðzÀ��È÷« ú–•¶ HåAð«?E¸; оv_¾?›uB ½þ ;8ÂÖî×¶ž®|†¸›'LUñ/í"ø�φ�DEDù07ÌêÀ÷«¼�¯+ìwüË�ž Ðßé °C „ÛÁÐþ/åî ôÿß�Z`0ÀEl`öpÁª£Ý0»?6zùîp€Í=0ôë÷ï7 4½l‘gßÿÀï—ÏHWÁ@ߘëÏÄÿŽÉË#}þ<`¿‹€"è—ÀVÑ�ÀÿvúOª* ƒþt‹¾¦uìõ—ìÅÁøg1-$šµ0ûHnAÑðÿ7Õ§üßþ«Êÿ‹äÿÝ�²§³óï0ûïøÿ†¸À�}ÿФõD¡ ‰DËñßPcØÑjÂláž.ÿUEAÐB�CØ£ÉÌä þñÃ=”á>0[8 êð‡2ü†¿¤æ GÀt�ð_ßtô_1´¾ Nè—B´ØP¿×øË†¡åôÏ>”P¤í/Ýñ  îî_ôêÑ–ÀŒ¨-Ìç7³|¼$ �@ϰCºüZ³ €�…ôv@"�þ,'øÇPOwwt¿©�nà_öo¡Ã`>0(Áì*êXÚrZ%Gëͳ6*‰»—vjÂÏ3šg‰�êUš°ZNÒÏÊœS/Qží+[:¶kÉ»�¾ú2}ä¿ZËPç+xÂàüÍžÁ&qêæs2Ùÿ'Óq#FŽqŠüñB÷^ ú˜{·elí{õ�Äl5Ý3ÉÞ¬dEÊ"ja-ZmUE™tbF;+z¨&›~ƒ5¡c*¶ì—„§_cÍ£Rµ^2©K¶�$yWÞ[êì_ é¡ïŒ Vó YÛg G‘(IôÓ) âU-ä]fzm¿¼ïoó�T^…Ãl‚#¹(q-£×x'(¢rÐe=nÝó�D×Çí’ËL¹Ï¡uôÂÄ®™ÖºÃï×¾×V/¨3Ü RaßjI¨Ø—}õ`'ïP¥DWéÜSJ0\¡“Ò?G€Å�_Þžfð3ä�g,›¬$Xn¢ïÃÌß!^ØcÝ5a´}nVò8¦Û>ùsÕÄY~tªýö£k[J™º@Nª(ùK§�Eý@é'ã CаažH¹\MÍ™æ<Ñ[VqdM|bb:¸Yz wœìÞTóÛZ„Ý.»Z,W2쥽ê±§|l÷™!k›óÜñ'YùÙ3Â×Q�­›Ù�žyÈ~cÇ™hªòö[q}d›ÿf±t‡ÇäLQ^¶Xí—Ÿc©ºlÏ�]y–±wÆŠë£ØÊï¯a»½2 ¿=©ñCþ0¬ /~`ìL¾×*Áý>OC²GÇ @1)Eý 2|äìH Ð[ü­ÓD„AG/Oœícé¹äbWT’TJ;‘²ÍÑr™`6~†VŸ¿ê`dF1ø]Ïü® ¥il…êB W5Yá"€,£«ÇŠ,k ²-+1OZ¿è¯ØèáÀ|“Køš{ûî-»V­ÜÃö¼�7CbøëØ—6Æ~L—�ŽÄ*ûEYêâ½%§aź^ó¢;½ä³JæÇò¿ ˜{R¼;ô¹!*œ„—­Û: )1Bøt·ýÆœCò`ù~t@‰À¡"ޏàŠÑEU·7˼[–N¶´¡ks3+¢0¨TTjO§ðÝ�ßý3½îÔêGùnè¹}Ú„Ô«¤jÙ¯æ÷ãí-7£tJ‚GŨÖù_Îa.2Ê}œ;©ƒ©¦`ˆbz 9Ð qZk-Ò\$J>póŸY}öä°0>x—/%’î>9Nb(Ù õ‹«mÑßÁ­¦¹÷†9×·¹2ú^̉—·†åš‘É`\’d ¸HH.jòÍMÙCžíì"2 ÒÅ�½†ë˜nÊjˆ9Ór&t[6ã.‹'½ë_æ0š¢b$jñf”uÈ„Uj4ñâ\>2¹Óõ²u»ÞQ0+ìÏ|elÁ”k“ ŽÎ„j]F«^ñy¾¿¢[ĸ�&ªmÊ`:yÛÒœi6’|�­QxŠ]g:2ÐÁØN¬ÁÛF¤´ ³ÊUxÕï=Rešcrug!jYíŒ`6¾ì¦ˆØ¾:žî­È5â$¥É´äy¤â`‘xv©Ùm;ÆZåm‡|ºZÿ¨ÖÊ'ý­vnýÇÓ‡H£äe |ZÔÏú™d_xK8©þeß¾?»ã¯ºžiì�öKrfÏðï/šº¾>/HEè�~šzÙ£{ë³Ýþi#û?4çž1m+¿V×�…FŠ€ÿÊSS~÷­aWeýŽJ»Â»X?s'Ù‰ +‹„lÃ$ø›Yè(©ºH°ÈÝ(È-?Zc|Â5ªó±âYÁYLu5ï�Ë¿‰‹?û°o'ÜÿÉ©‡ø£RuœñòÜ6Va3xÔgçq†H?À6é{ãE"S•Ÿ/[~�ö£y›j_PË;žªeY%Èãó\[=€—¦KM%8’.Ìëø3LŽSrµŸ#ílÿ�õzÖ»ª`/2l2 \HÁ˜–#765$?øü0rdZ8Ý+ð˜¬@�_>Rš«·hbøÈ­ xðø«dy¹Ïˆ õ ²{4ǹ²ý…ތ֭é,JêoõÝ*W\�@ž‚äðÔw'FYîD1Å9Æœ¶8ˆbTæ§òåu*EÇ0ð=vFë¶û5Õ|‘‚°º<ñ�—¤X³¹ÿE%K¼š~zq¢–Cîòe%á{ÛÙ¾—X©'ý& ÜQ|,¤ ûNT­wÇÄ”…F{€´rkK!_"ÚƒD ›–&ª]‰Öds–K#P7w¸&ã ã£J·}µ$|ÇM™6ÊÊœ†`¬oý‘?dà¦Ú¦ÀÂY-J$rå~Ê0ÔDÓ@!Lf”'Û¨yé’ܦßÒ¨ÃÖØ áå�1{4jô:Ú)Ú¯ä�äYï·ŒmÜn¸„ˆ|>cùRÌzHË‘-jóbÙ¼mŒ’g´Õ$ïnUWŸÆÎa¬Ó›:3ϽÇs"¶M‘!AVŒÙ§K@ìÝ©t¬”\¶ÃžpAÑp§MKÐíˇèH <ž”}!‰P}”nHŠýéTfçá‚-¥ö{�ͤ{Ä“šó:Ë8Òh±ÓFXˆæG$óõRBùý®ÕÉÃ-®R�uñ’õP,ÐKCCJìÖ¾0:Þ¦¤è€y9ËfE¦¢öÙP�G¨ dÑô}"�hSgL=o"¬w‡UA:dÕ0xUU<¿ÚBBßÕ µÛã 5«_Ž'ÞhŒ+Ù=)M,ŽŽÚ0ØäOˆOî…Ï­e’‚kŸ ïUœŠ ëU}”ÉÜùäåæy‡,@®aºÉ¯¹Ok]±ŠLˆœÖ’¬èâdDµ)ëáë—s°*ü§Ö)•ÓicTYïá7Ñ!âùôÇ­ó~ÂØÑBíÏ×c‹ñGJ>4Ha9fOë÷ï‹ï¾KþQs”jÍšQ q§µÍVÑÁŸ|ë}Z`ôóJ÷ëAˆ³îÀÝã~•Ù2¿(i ʱ9’RŠYyâ!ýz4¹ó¤è1”.fuôhg†ù�Mz̹kµ;µ½@¨ã­ÔlÁd’í)Ys+=É´O_ñŒ› ®‚¦”cÃÚ0ædnåšñ3¼äâѹÃpñcsGc^LyýÁ{ì;£Ïñ?óÚß L‚Ú«8j?páÙóà ÍR ÍVsF¹,²'%Þj3íyfh91 MÀÕ‘¯ö@Ù6™j ØV]J?¼!.ÕÿÍ^I3f£ÚóF7ÉÕ(˜Â•UÄLÌmžD©úýê²Þ('A“ßÒ“pèdÇ`(¿\~rPm7Ë·¢œà^r†ÿœXÏÈëò™åñÎ~Åm̓သbžç®3>w¯ö°K‰ã²ð‚dØð6bìÛýf(œkŠ’#N÷·¸_¯ÑŽÖ27¼l’{« \žžbêò*ÌòÎŽl,/iÁŒÇTsâž4­£ÝÌ´Éë‰� ÷^UyR5o~Ò¥ˆŸðUHh©0ö˜¥øJØ]µÂU¬j@K¢<òDm· 6tDü-Ž•§ÆbôzÌ HYs»g�b7ÅË™ù„Mø ãNL­èir ¡Êb›\ÈŒHÆ‹*øt$‰ÌÎghxu-’Ï—ÚÎbŸ`KúÓÍrÍ:é0ø¼¦ ƒdý1[mV ¶õ‘À5Nçæá$ûú*¸tjžáqצߤž£œ÷©gD”¥5Xå–³‡;NT’ÇróË‹§dÏôµ3?h“çnÉ>+o�©G»êKBïÞUî-ÆKé~Êm©¬ü$P�÷ôƒ,ý  ñâ¸íùWE,'jî`Ð~ygF½*dJ'§”:ú¬’ŽîY¸«Îg]÷z….xYzÿŒ“…›ücÖü§d‘W¯ž›7蛲5 ½ßºè›SÈöËJ€Iî±7}&ïÀ¥ópÊÍû†<À«c =�‘!ó O]Qª^¯Ü¬³{%éÕI£š4ëS”|ÈÁm*}èËéècêƒ�ABŠÁk.І)-“›êA`M§÷û3ø:'ø@>g’Ô6ncÚ5´õ‚2(yÙகCÇ¢C5æAœÓajD{ËÂ3ú· õÕ΀ã%‡Õ‰ Ôº—VŸºs7a¯ÊË4é$Æ:8#pRKV!Ä?cÒ'ê~9´i!¼æT¢ÄJÁ~aâz÷Ù|Ÿí-kã¯uϬ7qÌ'bØÞ_oí¶2®(×}O·«•oœ²› ëY(dçÀ¨­LgÒ�[ÚŒËRõºq%Yê4Ë}Xõd(é \ ÕÈŽƒëøtN…S-Âd­77i•]�"èm~ˆqL—Y€¿í¯¹(Ê ÈY£Ç}º ä)½® Ñ›ú2d5–«ã׫;ì´¶ˆãvkR“Ã% h³Ü ØúIXc�‡U‚a¶XÝÎ-¹ï£õBÎHQÇ¡[/W•@b0+: Ù�|9ŠOX"O¥4Õ¶f­ÀÕ‹¿—Áï¥uÿ½³ò— C¶ÆU߀õA%Œ7'¤³´—ôÕ¦ÊÈ×Ö]®Ñ„Q/€-Çk~óŠ„m˜yËÒv–ž?Âê0÷¯iÞVäqÕ�Œo û˜þA�î¦_—ÕðnÞj?Å-¾»MŸ$|ó^¼¹ê‡Ñø)k¤ùŸoÄjì�ÙWhÍe½Ë§¼@àR‘ã´ªS�0oµ•žOYµ‹“F=´¬æÀ]Ñ'¹/Úß2øˆ¹¸NÎ�£zK’¦Â|Š2†zÝü kÒ\оWóÉ5�V=Uw+z… °þ&¨ïŠFP,Ž¥õS¹ ¾âÈÔ×�ƒ}pCâÀL"¥(­©jür’d×[iéàlé“ÑEï‡~µ (¢‘Ÿ½Gxç«Ú< \pVç[¨pTËLÍèuØmZªŠIîÈÀõƒÉ¥s³±U_ú¾ì¹b®ö$\7�ú�ÕàÍž«…ñéVTyÔkTFrbA Ó=>T(ŸfprùÔý!ïws?Î`ô"\¶8tÆ �sذ �õEÊÌB­FsÏ ,æ[�>9Hñ䆰_ZõY–Ä2ˆ[û�ÈÜÈ·^àMã±æ4cÞZ[8>™¼¾=+¦ÒãfÈxƳ‰N…׫+;ŠkÈo)�|?¤#¢:'j{ °ÎÛ¼åˆi$ð5筩˳'sS´†õBƒ6f¡\‰ô1Lœ€~DÎéFkP�r÷m±ÖÅ>U³TÛí4–):D”¶�•Cun+I6©ìul>� »T‘™  [C�Û£žƒk +¾g³…Û2sLžÉM»ao[ó$dcë•£ŸfÖ³£S¢˜l„Ùµâom�Xá'´Ë4@N P)ÙnÞµ� ˜¢!£$¤ÝI”W"¯óÃ÷Æè;t�3¾˜JW`ÿF�sÑë›ùÛœžLTšÃgÂiÜ«—´Qd½_òu¥íŽõH Ðt~רØí-œ#ª#�ôÇ÷ bèÅ*tLÀ`ï\/.M¦|ËÜÜõ†ðR?³FÖúk…àpœPÃö=íIß~£HH–g[¡<·a å�L �`”íçœçÍr§ó�KâUú‡ú¹w¼Ø°¢ egíwÀ|â=Æ•\¶—[øÞW>0/úÎÊH$¹ŒbƹÅ||ðSgߵ܆G%Ù*6Øçp¨®íšL4$rŸ›9ÃüðaÅð Xˆ bmAŠ™‡h£"¤›ƒöaîf#¡9¬øôÍÏI«y?šHhƒÇJBÄ‹—×LYãÕäk'¤É×%:¡¼ŽOêÖ‚ý¿_ª¾�œÄ»2Ó%C¥á:óÚ8¦)$–®5°Š¼²[ò>u²¾Ü‚£Ìœœ-:¦ü·KV²Ò+úŸŒžø®ØÏH—Ÿ²œš•§Ü7IöWo¢È÷eÔ+¼®ÕCþ×¹ÓÍŽ_2Ó¯7É#˜�þ ÛþXGö½%:TMð)‰û9šLV’X¼*Z†Êi3Éc‘==‘/@Zé\|ÎM÷¿êí”»µ™�MÔìex��Xo{÷\î—è*ZPet?–}ÌþœéúÑÄ•a¹PçKu&Ì !Eƒë#xjš'�;c¸³2·ã¾de� •®��Â×–&âwŽ2��Ÿ¼xç6Ô8{=¾ƒÈ¹—L@»ÕÖØ9”´mï±ÛqcÁ£&nnt 6ë�OKy€ŽAÑ4Íý6ûd9Û÷î‘öeß#R¬ÑÛ‰Rðî,¶…Xà›‹܃ ;áü'“¥‰r¤åoò[FÏî>ÈÆAøÉh¤àéJ‡ß}ô4²C_ss¥òýôL´—®—É)Ý^Ac2�àãÌSÑXòë„cÎdÌ™[¹xbÉòO4[M‚;‚¶&ÊçªúO¶JÔÍAÖÛEfõoIGæ²?Ðá×hU.~J…9®ð*~ºïYHx‡_[7tB�}ìÕO³e.ª;CšYì2uîo&Õw?ÃßÛãÜ¥ «÷n·~OÛÞ½u]¬hÁ�Îlùº”j©$¾«éb¢/Bׇ�aÈZAGºö¤0{G¸Þaõ´ËîibÔY+�¬Ko­'̬ª›( ÄkRi¿)»ÿzã[‘“®Ê„©QËŽîy{,Ä`ÐFsM³±\-ЕÞ5¨ïÞ»m..º|Jø¦þj»¾ã¹¬ØTºùg{²#‘ùTµÈó=é)Ê—Ò´Xá�/† Љi{3Õõ“ñ²~38n“üfΪcSÚ'SÅü�~:uò[óœ Öºö¡Œû¿˜B|N²R\�ëÇXtØî4XeÙ1ÑŒNüØWhº5^N K®‘º¬»£ŽÎݺ”2§vã¦_X?©5èV§ÕáÓ §U�JHs×ÍÉðeòi1åç“/†¯H§ºç·gáÄ`Ô¶M4·L [~�ûžVMT­£ ÇÀ¾O·ÍéÒ;°êð#Qââü¸øDf�ÿçSÊŽŠ/ùävâ8ô @ �¸­ìÁÊ¢G”6Ôöƒév ‘\Ç3Ã[Ù•7ä°/Jf%}P2þOsHoÉ~NSÒp«µ³RoÖ4Û�åe& _)WðÒ’¶£¨²½ý×aà!£A£ó½<ã.Eî¤ôÅÅ“2ÉRbon}�ÿ¹ÊX�4£Wµ\ÆÓÑØdý™NˆÕuÿµ…¹vù#ýVoͳ΄v×í³ìí«‚aXÉD Ìt;1Ó�oœdÊ�5³¯9Ÿ-äXìŒüð}§ÖÅæo�¹ü?¯—\- endstream endobj 1009 0 obj << /Length1 1403 /Length2 6103 /Length3 0 /Length 7066 /Filter /FlateDecode >> stream xÚ�xTTíÚ6Ò ÝÍ€t-ÝÝ]’Ãà 2Cƒ¤”tI#H‡€„4JJ—”(HI‡€€ ò�¾¾çœ÷üÿZß·f­=û¹ïë®ç¹®=³6;‹�1¿¢Ü¬‡!ù…€Re]cK! …ñÙÙM H(øo;>»Ø �äþ¡ìv@¢l*HPhyCB"!q)! )  Jþ „{IT| N]€Fà³+Ã=ý½ .®HT�¿o\ n€�¤¤ßïp€¢Ø r€t�®`TE�` AÀHÿ¤à’qE"=¥}}}<p/9n>€/é 0#À^>`'À¯‘zà?£ à³L\!ˆ¿Æpg¤¯ƒ€2@! 0 � ñ†9�½¨êcM€¾'öXç/àÏæ„„þ•îOô¯DØï`îáéó‡À\Î( ¯¦#€ôCò`N¿€Pïàã�:8¢¿[w¨)Pþ™ò‚x"ô׌‚¿Ò ¶Yæ¤ ÷ðÃ�ü_ý©@¼À Ô¾û þ9\wÜø÷Êsrþ5†“·§ ) òЬ©òƒ2áÿÛæFÄ€’ââbBðCØä*ø«€‰¿'ø·ó·5Cp 'ÜàŒ q£¾ð>`ÒËøŸŽ®ð…„Nàv�Àðÿ�e;ÿµF�¿Ä` DÑOüõù×� ŠaNpÔÿßðßG,¨§¤d®lÎûgä9•”à~€@~aI¿¤8 $$$��ÿ3��äOÿ« s†$ÿjµO·ìó‡\ øg.=8й`׿‰þ(¡.Bÿgºÿùÿ±üW–ÿ•èÿÝ‘š7úÛÏõàÿñ;x@ þ(æz#Q*Ð…£´ûo¨9ø/éê‚� ÞÿíÕD: Ô sA1š_HT(ú—‚Pƒø�� H�ë_¬ùËnúKoP lG@~=aPQ@àùP"¹£ž"5»À( ý³®* wú%6a1q€ƒ——ƒ?>ê¬Q+1@ J•N`¿ßd ÀàHT5c0Àî…ÿë`E‚ÔÌ„;ê\9Û…€âAG¯ß†Ty{y¡ä÷›¨vþ^ÿÖ:ìá/ÍÃAÒ‘n/#;¯êé}ù·Æ±W׺c“-bÄ� Ï]uprÔg*Ù;ÕÒŒ>5X¬Œšž¢ç9ºšð{ð&/l%S£‰¦:°¡tÂ_4üíì� ˜É Nç2)ñ4vƒô8Å�‘ØÞÓš3Í|þú±D¯Èö‹Ï%7݈m+É}€ ì‚„%“™ Xн�þÄ’…m 9bù€$‘ÌË:ËÛDÓtòý $ñR©3žö›ÿ†uböÈÇ�o󞊜k÷Õ‰×F‘ÓRh±Œ¦ÑR¦äi½B q(‰](Wf$³Ò–zDq¬`ØK¬ü˜-ìHñnvÑS»«ÿh¬Å».6/[лrÊ`·™kòM��¦55Ö•¯þ)›{�ÚÅHÖq�´°“Š €Ýؽ|«; /¯¸´ÔAß�ó(BÄöóÍ•}BNŠ�°M†,ôþЧçJâP&ÏQgó÷×2r:vrM =·5ïÑ{|_Ÿ@ª-˜Ó`ç;­o;Gz£OàlGŒ”3aÉ]9ûý{)¯4Å.Þ‘šñ¨Š#´à=vÜII³!F…˜ÝêÒV ’‹S¬If"ÄE&¤ &:ÛhYzx–R�CgIˆÈÝ�*_¼¯{&Þ*›q?øhyê䎊áAIÃÆ]ÃÞoX¶ÉŽ^'‚¸¶Ú…ÝV®öåzœZHÑdHË~òõŽ’åL؉ÄüJ¡ÒOÓ;òŠG �~$~Ý>o>.´PlŒ±‚Ʀ÷Ì„lØ=cì²LdÈz=uÐ×Å™±í§Ñüýó„ÜqD]jˆ5²ZÝ’$Ö®üq�2ÖÔzÐA§ó¼׫w̹åü��õ¥´èf˜§íN³Þ±ç�ª‡J*2bÎÅÇ’"µº¡’�˜1f!*„_ï“:L5‡ ÏÃÐ\�[ð7¡òÚ琢÷­Ùž´Æ‘6~W÷<¹ècøHÞÞÀ ¨5ºÄ( W»ÿÃÇ@äÃ'A }ñ·þŠðž†£GûÛ6æéUÂuÛ°c,EWËÏ¢ZI‹-“æÆŠ- TOtn„7ì„ÛîÖ¶UÂ52ñ…¨ýfh)†÷8{:½iƒ:à„WßÍõ˜�rTÓO˳ےfÑÏp¤odA™Õn©„è�¢¹ ½`R+püRV;Ì %T¾²”•.÷ráF2ø8ÏÁ#x�'iòt÷™ƒ/¡ò ž•Ö£ZÛ£šÏ6UQ›$ï å‘ÚUúÃ3‰,šwã_ξü±MóÕˆô§rÖ\:»gìKÖ�·×½*$ÏX9ùì]Ógy�A_¿;ˆl©U@12ºÏîûaÖÐã”Ì S5Ì+zk×¥YÞ›­Lý$Tn¡ˆ0ƒ7>]öi/8H•ïmLg–NÏk�ý Ç9¸Q^Ýý€µú[KFõ´Ñ!–�‘rÆb)fž¡Š+>-Ѭ‚_ÁÕhq—;U‚£3t[QóÊÀ½ª1Ûw)‡¼ÌIsX#À� t)á÷#™)n8ìÀxÄÔ@³Ñ9P{¢rA÷˜àhܲ®³èPðÀçMÒ¤uQÛ�E¦Vvý"…ýl�ˆ¨42™ÎD­ç£Ë!>)s|ƒlM¬®¦åºòç�ûòkiž<ó‘>D Ô²ËBˆà uâ4…½T1Û‘ŒX“­ÆûÎíQ:òèˆ6}îÈ& Äìçv¢Çx‘ê%ßS�ž“Ÿ�9ïFOÙ’ª¸~8—Ù,ÌÎ^WÊÝ›þþzp©!ìÌ©|濲^o7ôbö…‚ ˆé~ZŒNâ!gíç;Ú1×¢îú²Ô‡?«æM© | àªOV¨?»£¿Ëæ!’À}ˆaýžûàòû«‰Å�ÙðŽpÛ¶Wñ[g§6¤÷¡I›¯m‘‘o“××m¹sXL¶úCÏÐ×jŽ–¦רºŒY‹¤“v2®½mÑŒcñÅN³Å•dI—‹}`ËÙ&¸µÙI “�¬�§/+Ém±ÇùC‚c¦‡ g3yŸ0ä@ˆîÜT‚&‹L’îþ¤‰TÍ©þžÒt*à €47ÚC¡¼)©£H›š�¹ŽêÊò¬ìáAà�¥¾,; ™ãâ £¥F;lŸ_µIÝv½ãîJT½·¸SêÄYÓ·ÕCÏßÖBðVM�~Àþ%18z©‡>~ñ5�Çèã:«kºþb¢û“¯Ï—@£gÍ“pŠ%ôš¸\�ÒwíÚÎÏZ ¸³¾â<,à]XYúg Œw”æÞÁ'·Ó‹¿±çWhÄ’™aßÐsžçM6L]T"�+†Kˆ�ä?6XPb’sEXF<î¿t×3o¶|}¨¶(³£ܘ¹ë޸܇³jtÈõ~nÒVx‘�ˆ®x}sàÙ�?A¼ òˆ€Ï¾=¨¥5Üj§¬�,òÏ'JKzïÃLvÌû(¹¤�©?]µ”øîåFªîàþ‚`í#Õ>rñ1Ƶ8'jÉ@¹i×Gïh›U]<˜ ì€ð§°À¦Y¨H‘:ùu|:oÐv=×f›ÙÜ—Õ8õЍD¸¶3½9EÀŠW¡Ý¡ìuÖ@Î*ÑÑ( ]@WM_FCÔ1m€à‡Æ–¥€�>«È ¶X•;Lƒ¢üÄßÖ€ª‡ž-qtVÆß[χ֢kpcß®Ñ.¶*n¦·½éBB»&4nЬÑLÂüºÅŒ� byšž�Á•IeÎeÝh¾îï£i˜®4„¸%p+’ ¬ S}Çál@ÆÅŸaMÕ}fò�2²Ø€³íûƒA=¥rN·nþ&9 a}ÍfCŸŸ®Ñ>,sQ¡M9K9^|ÝžsG2«cË$Fy%D°ù¨=e + «ÎÈsøT2~ÐkrNóIÜ­ÎôPû‚ÜÏ­¨]�{üŠ×Q¨~þå‚>Í\¨ŠÎ±¡†HØe‹? ~ÞyÚÅ)3eÙµŠ æ?¼"Š/”‹çQ»÷Ô)úK <13ÐF¹JŽí'†^€ ËT Ïsx;Ú,–[Ü;~½a‡ã¥ãµðÓûIÚ¾†.<óx„lɉÂæãbò'z÷tÌb�¿½½¾ò ¤€:LÚ°S°–Ù'wTÚ½0|a¡Ûô|}1�È4‚ƒƒHEó°ˆHÂ`˜Áýå3C±IÑ!ZÙ…“�va±{uõXœÛÇ�êb\z0€ºJýãóÃØWIû•憻쑳4Z/Û-JèŠ{E�šþÀþî瘳÷b¬Óî•0F¨ÜS}žêéY§ÆS]ñµa%ËçØKÖi&»[B:ƒá,ÁSG`!õµ{[n¨3GŠg|E‡Ñ}<�²O2•Ã!ÕMš—1�²�Ç=õ^1Õ¥¯^›g/ÌB»}Ù¬…3`ÉêlL‘ñ=7ìèbònãœIg:i_vò²ÎÄ*‘Öþñé®­ ¤âƺìD !“ÿ¡U¸—å ÅŠiô÷ \´Ì{ØßÄÌ"÷�§Mãö„_^ÏÉÞÆç þÏôŠéôaï r$¿”3%on¥ñà3òºx*†òÕó½‘ r«#U—Èý:G�zœY×üt‘�$D`WP­‚ž~¸mXœ‰4Ê[k�C`eð¸ÒÑö„>oÎ{xžiEÛêÖ3ÃníNögBDÊ× )w{”˜Ìα�Hª·S%»Éâ?±‘TïäúbÕÙ‹‰\–ª¹Ìö4Šæ+eïlæ(VT“­u=|9y2J̼úzeZ´'Ž)º$yêHè…�3Í;¼š3¾yã�Bñó�N,†g^%åÖ)ßøØ"èlnø‘@}Þâw©Îv[HYº7)\Ô6qw,ýUõ‡ÉnµñìtP}CNJ¸,Mígê;Ì<£]U؂۾Øý±F÷Û¹––žä‚Z»úô84=ž||.gÁòÖ#üeDaJEd~Ë:c¦¬±s•ÿ�;õ\ –ŒÿUžž7¡C:Î^iE×€@Ùà1:R¯©´?*ü’¤Õ]QÓ&š›Z÷Š8¤Å¸øó­e欙.<;;iŽ£‚Ç6‘q(…ó¤€F¼NsÍñj8Hfub äée7Ó4Ýa=ÙíÞRo:ˆ¨6´E¦è‘?§ÇB&Ût7LÒ“Å®½Ü°óý×MÎ2½\õ¦ã5¬,9"ô�Šñ×n6Md°3 9­¢ù%•ÃPY½«Çwºa„Œ �©-¹äX—îóì<éw¯ð¹‚¯Ç]¡}„žÅjlô&©ø®·]Ù”„tÑ'Sî;= TM¥)í{â¶D»–M*ÀFi¶¶íJ‡Ì»pgswg³ݯ£Ä<9·}¯#éPÆ4ÏT8=û!’ñÔ“jX÷,Íðsv,¦ãZ¥ çÙ�æ³g &i»Õ¦ïcÚýœS$Mí�퓾ù-öÐN ä�–™ë)Àó8ݰ†HŒMR5íç=ÿÂÉCuóÐ"Ôäì)C?ï~*ˆ+_)ìAË]0:é|ÞVw˜±¶^|å�k£Îžý}`=I9K§!Sž �±ê×vî¼­TÍ[3çõäXuõØ9ýÞE_›!Áð9Ûw¶—²tŸÂòä÷œD@Ü$6"Ut™D{s shì<ºÁ }tÙ»¥ÒÊNÏײ°†½<»hë…(Ün ÕHéHzb@�ŒÈŒCuÎËuå™ížÜ˜µÜØ?óì˜sH‹¹æ¸Ú¾ç–6ßÕÕmÇonŒ$|8èÃÑR7r©¼º%¢‡Ö¢c…hô51ðL¡Bt¶OÖ_<áåϯ­,2}ò´Aí«é•k‡öDTouçŒe7X‚\XÍ•q� q¢§ÏÑi’vqÇ‘|CÆe©ÉŸµñõHÚ~Žrû³â®†TÓ‹gk–ŒŽBiÍëC�­¾CF¶–Ó9´D|øÏØÔ*Þej¨,�šÑÉ{žâøO?m£0XaW“íïTŠÆ¾Xº(R×^4pm|¤×dÝŠ©9b·ªŒ{bB°2㌷�'3›™vÇ^õ«¬*4¯ÅÙy³ö‘Í>Ø›8ç}ȃŠPÒu=awçb‡3¸·–„H~É^Ó©ÏÚ^Ïyˆö²y`žî슈üBRB¥î©Í7)sZi RæäÇ$YXëÒX‘JÌ©x±åäIkšÒò…,&%1�»¯T¦6›/"Re§-â~Þ½Ikzꪋ”ó—­‹âÙsTÆè~dKØ… Wôj(‚r¶\ ”e\ŸÝyp~¹X8Ì †¾Qd�Æ!�D£_x«Hk»ˆ¾?›N`’~åÍͺÛ(ýýƒqFf¯O×èÉõWåG�ò=Z‚©j¬â¦õ@¹mlôsÞÚ†³‘@ZÖ‘ÙêiÙý°/ˆÝ•Ã?¸–ÍÚB˘ﵸþG�à'¡ÈýÑ1Ò“b³õÑÊFÞÒÒW5µ¯¯%âMá9/æ+ý··FúÓpL ã•Ůս\ÖM±ûIÄÆØ’¢ŸÆsÕ'5÷Äá>Êø¨^µ¹x¿àéaQ¶®ÏÖ*—5²»©XU`‹öŠHìÔ(«íÖô7—‡?%� Ϊƒ\Òž¬²?GœA ¹îêˆÃ9åÑý°�8<ýo_öíÉFpË=S³[W+4Å©•3µo”1}ëó=(pª?Œ¿c{aøƒiZYç¼ø,¥•Ê/ËïSwãcµÖ•\,ÂG¬‘›ªirãQA-Òö˜Ä>?د˜ß×™X‚æ±mŽÃÁèq¬êOMéÜV«±#ýãN�>~sRÞN†)TÞVþv/MœXÓªž;òn¿Ñ�²Y„Öù}â÷=Ý·x©LÒ£¢Í¤�Cû&Ú9—ËEÁׯ¹Ì,{´×z/äÑ~¼�Ú·]&[bEŸ¼¡uý\Ÿ™:†á;>øß·LZW¾�—>R8޻Ƚc�à?™:dž ªYvŸ{êd¤x`Ï5ðX!0YËß\®ç$fSî{Jݶ¿Âç�Û6ӵ︿_)ôiH�3Odü•%*¡,~Ií'X •ÑïŽ3pù�Š0—»¼7÷ õŽ£fÍ ¹äô> ¢d‘[ùlJ îë|n;÷"�†{.›?ð•~R[½þüwa£ŠÞ&b¿·;û¸Ì1†¸ç¾J.S)ë�7Æ7¹¬ UÐ\Ç“‹é¶†,Mÿ¹ª XoF÷b=½*Üu ^)`+ô‚9^?ÉÈ‚ö�Ä"�/?÷³3†rïz ]­,½®b¥nöÆÏR§Š]ñö/Õ#Ê­N9ép)ÚÊ¿f}ÚvŒ1|Iw~Ro %+t¸$ÓÒàøÐ¢‘¬„®?b ×x GQ¹}½qI¥º‡Ã·6ž!•Õ¥†“sSð‡i�†Ì>•HÍЙ. O·Ê Å,¼Mc%î14o¡óu:E”G?àG»¨õÌ ”^mÉq½úaqq’<é`Ov_‚,Ý’&»éâêíÉŸ¢lDsU-.C0Oþz,.{�ÐÆ!ФdzýÒ¤½0-™|;Þ"/kÂ4C÷‰uÇcÀTãrç™WÕ©�ÓG=?dÿ&—+ŸÊJ~.E¯]EïŽþ¸ÿòµ,{ÞÝ%sy8¦“thõ †Ž´·ÕŠùš}öî¤ Wç0_¿\Ú£ˆ�N±žþ„²YþwÓPrŒzÿüŸYß ®ŒÉ°h­¾í¦.gˆUÒ0�Ù—e©fnb¶æ^­‚ ø'[°Î”Íõ믋fÐ]ÝÄí·Ð² ÞttKN‡\çqÜìŒ{HÌzÝŠ –]€¸E£ß7MêÕ=šïÅa]»´N«_­ìuñ"ycRvãy"U<’ “VýÂêfY 7™&óý˜ù5úõêQ!«9Œ¢…ͪú¶] Î]º­A­—¶�×[ª�Ì ¹\RÚ[³:9^öÝëÍfܽí!É&rQÙ8¾çþ²kº/ýÓ~•òR@¾¡ß™©çŽV¼Þ"pŠ9'ò;sΡ˜^W‹ œS�z&·›[Øà2¿A9Àc�ç¹>f;Å#:’÷c¹rr7ÚÄ%äŽU ^G—ÌÝÛV‚ë)ÂÁÞìù4ÙI^ÜWØ:‹ÓóGv³½U*(gÝÈ}U\â ßÍ*BZVWüè“·U3âгm¤­¹ßþ”ÙŒÕq�@!ÇDEr5€WJ ÏT�uZùrGú¼Ì•” ñšzؼÀ5� •,µZ!áBê»[ endstream endobj 1011 0 obj << /Length1 1399 /Length2 6072 /Length3 0 /Length 7039 /Filter /FlateDecode >> stream xÚ�tT”ïö.Ý(�¤ƒÂ04Hw·t8  1ÃÐÝHIH—Hª4"Ý ¢Ò%Ý‚„ÿ1Î9ÿß¹w­{׬õÍ÷>ûÙûÝû}ŸçccÑÑ瑵AXC•pˆ—O ¯©o"àãàåãã'bc3€¡œ a"6C(Ò †€‹ÿ/‚< F¡10 ÍÓDÀjîN�$,çãðóñ‰ý‹ˆ@ŠÀ0€&/@ ‡º±É#\¼‘0;{z›½8 œ�˜˜ÈÃßéYg(Ú`”=Ô½#ìÐG@`P”÷?JpHØ£P.â@ §§'/ØÙ��´“â|ð„¡ìzP7(Òjø50@ ì ý3/ÀÀæö×GØ¢<ÁH( 8Á P¸:ÃnEЛôU5Ú.Pø²ÆÂCÀß³€xAÿ.÷7ûW!üw2A8»€áÞ0¸Àæh+ið¢¼P`¸Í/"ØÉ �Î{€aN`k4áwç`€’¬.Œðïxn$ÌåÆësú5"ðWô)+ÂmäÎÎP8Ê�èW 0$‚>voàŸ›u„#<á¾¶0¸�í¯!lÜ]€�á0Ww¨ªÂ_ "úfE„øÄ„…EPWÔ büUÞÀÛú;ú£'ð÷uA¸lÑC@ýa¶Pô‘¯Ø @!Ý¡þ¾ÿ;ðϰ�APk¨ NôŸêhjûg�¾|$Ì `ƇÖÀ÷ë÷ï7 ´¼lp'ïÿÐß/ÐTÞXÝD™ûÏÄÿŽÉÉ!¼¾< !�˜âG?DDùþÿ,£†ýmƒï?¹ªp[@ìO·ècúWÇÀñל€ÖÒB U püGäæ|B|ôôÿ-õß)ÿ7…ÿªòÿù7¤äîäô;Ìñ;þ„ÁÎ0'ï¿´hÝQhh"Ð6€ÿ7ÕúÇ´šP˜»óGUQ`´dávh1ó€yùÿà07%˜ÔF†‚Øÿ‘Ìüñ/«9ÁàP„ì×·�ÅÇ÷_1´¿ Žèï‡Z—¿CP´}þ¹¯"‚°ùå3~!a‰{ñ¡åÄ/$ð¡ iõú­d�Ž@¡Sèý¶$ѯkàÑYO'¨-êWè7 ñ€Ö`ˆ£›ØÍþ7ü�]!îH$Ú}¿Å�né_ëßV‡B½ ¢/ÓÈ£0‡š°æó*YOž¯#x‹Ë­OLz¢„PìŸ^øÚkàg*O¸Ê=±)¿3”¦óùUÄø´×þù¨—yGvðBªJ C±gUî�'àâ[‡”ÙAo7&’öt•ü Q—éö3³ÉFÓ?ÃE:6*Ö ¯ZÝ6LÅv΀âïd,© ¨8ÙÜÖ¬ÖeÔ ‰9Y<Ò,ÝÝ@õñØV ,þL®9–îÂ{Õ,>cp~¾?»·'Màø¥zW¥py%•�KîPRub¶Zƒ»œÐwùW) ÷芜#ذ�k¦@ŒŒ¬ñÝt|΀F‡!YXfRû¶ÚX]Sóø0?{¿ËOo¼l’#·š‘)Ú`,p¿¬œ²å]2˜ØºÞzôT¹îëâ§�Ñ ° kN´~ßá�¡½Nù¼ã×C•[ZÚ—ÑK .M’°Q‹»ºB ã¦3ú³5$~ºÂóÐØÂ�ößÖÍåéžQPÜ‘¿çtd¼þ)Sùhg3xZÎ @þŸqÇ( ·ò†â†Ù²¦Õ¥ŠæqÔP—ð+nå²õŒKu½âò¶À܃!KÄœàZÝÖèà ’Xå*ý%¾9ókKàÜ·ÇJ ô/5²@üˆGü �÷RQ"¼ë{rÖ­z±XÕ¾ __)bÖëSuóÖ‰ÑâR Îãð=ß3D)�KÐ߯ßÊšMf~n*qðiñq]g~H£Š—RT?2S@ã³]éµ|Mˆi�ÎóCKåm2Íà¸Dš\ž«(†l>ãçt) «n:åáõƒí*÷ôã¬éŽ�o ÊÄwµ‹“@V—Ýð·ž9äXÔ]}ù û;êÉÞ‘*9Ó!æÞx¼è%µæUâÓÛœ*µç§®à†tévìÎGŸïÆ';¼ÃªyYÎ"ú4ƒ¼³á‡RŠ@)ƒ%'2q•[WÞ,U5ˆÂ}sX1dì!9Ý”3ŒâJ‡4t3“õ­,ãÕµ^¿´¸Xž1æ�ØËvÛúåE£çòùkH ‘,êH¨àëš«ó}mq5¼ù¤œÈnÈ©é‡ÑÀú™VA•f�žCC3ºM°Hß‚�-4Uc*n¶º‰ßÊËnaYªñÑoÁŠPD²Û Ê_ì~à|g*¤ç#a“Q~-d­®ÓöjÖv�YV{.ñ‰¬¿Ïä�IÇœð‹¹0/­¹ê¾Ü�™áTˆ‡Ù†eÄQ8ïñ=¬‹kŽäëÂýŒ›¬éƒG™`rV�Ë–Ó¿8 Á4¯¥ÓÅ’›!Œ×D%aä¯8ŠãÒŸƒe {zópaûÏ™¦t¶>>ÇÒÑêƒ ÄT_è.Y£L.êÕÀh×ãÁa²¶ç8±ë#Çû¼ß@¶GmgïÃHs’Ô¨äÈ'=¾{,}Eæ¯p Ì`$ ë7•4LKM)^y½*Ò (õõ3{‚v]úW‚´ÇuWŠßš¿ŽŠÀK.H¯UìžÜä¦ÄùVMIs�iŠx™2NòÏ�Ê2õˆÕ!ÅU‡Ú‚y¤}[�ß;ã&4~äº%Bàªì~÷ˆø'—œ#‘‡*BT@SXBÖ�Ñir7÷âªE¼†§vG~ª„¿�;Ñ#Ö˜ÃÞžG/7.>àIBdPÐm¿Gß‹ûê_QHDcÉa%Ózâ…¥ß*LÚv|‹í9K9hrí|ÑäÁ¡B!ÍÝD:é©•[õBo½"ðܸq8 èF®á{5ÛŠÀg–”CÆîޏP� Ã@ YC²Ñ/ÑÎ9‹í¼ fþg«"W¤3Mq x\ "†…nyyMR€êUq±•þA ƒÙ´ß?+Ü~:°—÷}uÆp³Ü÷zg– |«»mx—eÚXLXñ�ÄsÊv§3;ç~¼Z+Ùˆ¾'� ‹ÀhÝî^ÙòÈ{Æ7K¹µ£8Ãcµái†�Ûj©_]†Æ?.7í ›7ËRûØ¢«NG›Ë¥‘&Z¹^;Y@'ÃW•ÚOýãzfÖ߯¿J©ú‰ÁòWǃÊg©üé9YMŸâz#ËïGßfÎØò²îyj,Cøf ŽðÍ�š¤é]Ÿyü0†%T‡;²æôSTÁðq%ñÈ?_þ�££¸çv;‡�@êþz¦æ°±p¹â0 y¢Ê‰Á»„ûœ—Ñ tÀñ>‰¾:JOŒDÇ´TQ5v\6ЧI…ú€3Ò×ûáøZMæ�¹[[õbéMIŒY“¥¯&6_„¤obLÆÌÓP–»åáˆÙ#\s’ Á÷W~€©`dŸúX®Sh±Ùˆ ®í÷¹˜¦Yø¯çß`èg|½WF饯y\¬Z±‰œ®ïa�Òíb¿µV~ÚD\z�º³Z,àÄ>(‡N?"ñx“#y çÏŒ2j“>4¦]NPÚc œ±¹»™U[¦Ä2&³x@�ïï_íªHs{„!¥ÌÛº0l´Ä»ôqkUÿÞ+¬äÔ¡½nbì¢Éæ€ö©¿«¾JaJ5Fñø²n 4hxÎØœ4.¸Àn™¤œŸC*¯›Å̬~ 0:œ"¡Ç°‘è"«ˆT(€Ñ¢Ì­"ªŠnBÛ€¯ò¢‡‹ã÷oågòƒ9òð ùg𵄤N4Îmh‡Ü3µDÂqÄØúžù ^Kè?./p²bnª~L[á!FК&9ä°)’&Šÿ‘%£�Á*^ccaßͯL O°Í›vºÜ² ý©©—ųõ�ï•Ò‹‰:ã�ÉweÏñ÷ý.<+®¸ë5æZcÜ ÏrIYW©+óGr_z†ÉêH¹ÆtÜ6Ä϶ ;RZßx;&l¼0~R‚Ó›mÌÔ\SÈ雿jíns�ȺÁ·¦š Yî ç4•þÀ²cLºfág8èü׺ÌdÎ/y;a³ìM§Khâú72'ÓwÖå’ŠÍw] ï ͱÉWe¶u}¸uDfð U÷�Ë•„_°Iƒ=É¿0CÈppÅŠêåËúªŒ‹ÉL}b¹c:•úp­®Ä;Áý¬9iûñ÷¢)y%…¢¯‘·š N˜~QZ>„¹Ó»Ì1Ì<µ]ÓžmRÚOî=艺çr!™GG¹ºÖèíÃòb2“Dª‹qáøÝÑ*;bγð˜"ž/p€úŽ;¹¼pºuJMãòݧáö;à3LÜH—÷t•¤mKiÄL,5ѧéÕÀŸ°FÇm×ÎÇi7ükEcù{ïÚº]ßõSDUÆ(—†d(· ‘áJÈ6žî|R}£å¼`T³òÒ<ôRï“l~Åõº)M™ùOø|?”œ…ý¸“"j§þ)Ûs˜BÓUз˜£¡ïY¾“HÖõ¸ãÛå³1ÙBÁQÒCÓ›ôj&ipÙBli‚gÜBÞìøu±Ë8* ÷¬xŒ>/c.�>âŽ�<ßïT“ÒKÙT×øõ…rÃ…[orI›ƒ×î ~™)IƒTI£:·?ñ�Zià=½-˜ƒÉEÆ}ͤ)«»¿ÍÇÀ�í7›ßÄðºÞB•Æx9döÍÆÇ’…l.Âç=V8z‹O Lذ괄V"…w'­v[‹mS°Ë"‘ft.ú* ¹îÑáqBC·Ê7AÝ…ígå›4ºÀo¨KèT÷$Àt.A(ŽÏ´a)äDdÉͯ˜ÓT#45“Db•è‚Ñ[—çsLøŽÖ~ûˆ±´[‹¤<7™ryœ´ËqJ>}ž¹L톱z‹˜dSÃŽqIkDûJsÛœ¿¶9‡ŽpÅŽyˆ["É¿[zÕÁ¯˜àÑJ¶¶Ï]Æö:Ëçö=½+í1E‰#Ÿ›X…ÓE£•줭¨E¿_úžœºÛöb›L\ñ jÃg–›_�<Á[–…u8¼›dÓ5빌¾©!©�¶Û1ð�Šu xæˆR¦šõœŠ¢<æ×~#@xLW´i{'ɘîí[ÍÓÅÅx‰ŠÚ…˜eAäñ¥µÄ‘ ±:³¸ÉoBbT0­=búxxZù~’roŠD¨SVóú~×â¬Êú˜úö�Ëé5Ie�˜&Wø£iÁ£¯µ3õA«çc¯5?â05¿0¶º"«Q¯)ÒvÉ,jÏ—’FÈí°õ~+ýQ`±mʲ@ýyæÀã*ðE.9NU°zŒ �Ž3¾õÖ¶Ùâ_ÖWæ§9ðŽ•ªp-ãÀ�_8£ÄÃ�`âplÅ•ûvmـЛø¾·0l ¨f”äŸ'©9ÞÄÞcs$Ô¬]ò�¯w ýŒq‡1¬ìcà†� Ô³!–Qú‚©ù,ë‹¶ß»šGkÁ­©í}KÞJ³»Û Ãפ‡ZÀO ÇöÅÆ!;NöžÉôšõ+ �–ÔL9ƒ–}ߎ�¡X*/ÚÓ±61ÁáŸeœßc1ýÜïØ&ÅC#É€ÿBu€Rm�GO–KG¦�Žíéaýçàl×´Ž4¹àíÕ«Ï«ðô¶„ŠGF?‹�eÙבµçÔCŠ$„=â’î4û „몋§|­)ÕÁ?·äïöf¯ùÌôµm¾™;Œ�éâóXÕ£7{ÒXÇûól¦‡3Ž»IÜïòÙ+8cp*Š †Á-Þ{ TàNä§Ÿ›ÿÔ¤Ÿödë‹R©Ë×AYÑÒH%æµH0G¡�‚æÄ—)CžšJ®ó WªÑj³íè.Ë1Ò¨OQdkÍÀ/Þ´´Ý‰¤³ ’ªaU&¥p å Ó‘zF…°W;Üý�ª^‘—ŸW““ž¶Ærh,²bÇËF« l˜d½¾ÇÎËÊdâûÝáÐR9.?sÉÞF¿r«$ü½bGµŒ¡YA3ûH§éiÎóŽsá¦ä“ Þ±d CNÎÁf®( íÐØ¸GT F‚íŒ Iq^2¦3vÍ8jª-ìé'xh©Ht\kÌOÞ³ÛÅÌœ4>VYáw~tH•¶ÔŠÿôNÒ ‡mCUßÒÏ+Ýx¹èž¦<¬‡ij•m\C^dR1ØÕ®Rª'I0_“µ¼¼Ù~Ü]®�dÚüÊÍs~ðE” ée{l„­'-¢£KÚüUð*ã­n ¡æ…pHaËæ)Œð;¡µS–8Ò+oµèÔ`”ž?+ã'€oõ×O×lqsŽ?‘•Ví’¬'ž>È£ò[jHѺGy@Òà§£Nz{¬AÍõå"5þ+�$xcÝ+Ù ,¦wIPá)Ø�s =½34lYôzèáFÂLÊ:’TœÈyy:ö6;ÅÛkþ“g£ZyäˆÄ±�… [ȃló[.Õû/m”Z……:=¦5êŽ?-=±¿Cp�óËrû ,—_¨ Ùˆl¢O™Žòbš�åêÂ;AA>t¼��—1ONå/ó®;5muÅèÈ­ý5Ø¥ Cpýc‚½B-1›kƒ­«ÀñŸ±Ç3øv µUÄc,cÔò;¢IÚDÇ=S# Cv¨$§/Jî’bžuª½öë ë&kø&×íwqùþGfÑs²dÒ®“âÊ4è¶ÚÜF#7mÎ�H\ˆS‚i¾æÄ·¢™ZYÁƒd�l—ªì\ÍÑW�õÚ«R»ñƒlw£ðg¹›R[cA_SÚú¸šÒaf=ßO=Œã‚µvKn5`…Î)‰îrÕäS-±Ij–38cE´›•Œä[`‰4¨„„·&ûñÞ0BŸ—S ‰ÉŠ«H,sA”¢Ô'jUþ&ÑùZRÛÏÓß"5ˆÏä“ï�ÛgyÊ}#¸ÝóÆ&9öÙï¼Î7£ßà«P¾.bž¿u¯u'GZ§dÃõ!,w–—gh¬ì«…SMoÛÀq¹hþ�`&5յĨÖ�rÉx·ŒAÛQóèPÙá©e’+³‚!7=®««›ƒßóFnulÚ�B¿,t–YO²p–Pðç–é¶ˆÎæ0ëÑÇ|=øÖ¯`#o<‘ET§Ô³­â3òŠªp‰`¤`?2ðÔ6ªšMGM—¼l6”1ùKŸé,æÓ Rz>úŸ9Y+úc@*¡ç7ŒÛôDFä²÷óm¦6ªÍ×,¥ !â]͉ú'SezX[×G8{[±û¬ñ(ÿ# f"ÜK@Tñ(žwƒ‰”-oêaYÒÑ+½¾•ð2ª÷w^ú¿¦æ&KЩ8rPä-*®-™:7~G÷¢lÈNT]™ÊjŸ¯–%xqâSlú“KЫ“i·ûõfG-áÎç£á—gä¦C~ãHú†»Çk)' #Ï"F-ל¯Ê qîü'„×Ï÷o\Í'øt“¨ÖÚJ«Õ3ÍÓû™Ýž½nŒKË]Ï@ƒ‘SÁG®Ô=­:ñ)#Â#˜PèÇ¢]±«‰9ö­29ö¹¡�ºÜ>˜ß !îUO;Ôµ?u")ùÜs“\ÌœcVÒÔA÷t3�×ÒâOÍÈëVò¦ˆiÉr:[YêFú¬úzÈHmxõÔzB<ž:�ëËu¼ïõ¢žðÙ/õhO¥­])Øï=û¥ \:¾ñz²ßæ(ølëK«ºÕJNû…ÏRù¬ã;ß�õ ‚GA<;ÝØÅ¯lgÒ‰á£m*é �c ¤à:BëÅ3éUf§H¸]ªøQ…±û=ŠG¶Súc†+%ScºØÜYŽ÷ÇÆ|�=oÝØeÞÕnõ^Y /‹ß- _Q�î: ‘ÝŠ‹&¥�¯›Âè©à}yPqFk‰{˜j”yÕ3´wélâ(ã³hAU*6t»‡èÜýÜÌK¶-�‘œê€a¨î¾y)N'—¬ÕÓ–—ïú{šŠÑÝݯ‚%VÊžLS"H™£Ö϶ciÆÊô~Lò^êòì¹êKªïT%‹bP|x1Ǭß~ŽA´û"F³Š$«eúL�ÓÈ!‚¹ý™ü{¬"þ«G¦õìád]�{n0¦J7›HM²8Jò-C¬9üó!Am·Åik¸ß÷ÊÜy&.à$냻Íù¬*ßLjcSìdO·^Ò®ƒyLT<”0—IFåùü©×Š[%Ù}> stream xÚ¬¸eT\]—.Š;w)ÜÝÝÝÝ‚S@áÜÝ=¸kpwww‚Ü%8ÁnÞï;Ý}FßsÿœÛ?jŒ½¦s|?�£;ëö¥îM^ú’Óö¢mQurÓ1–!gœkÇx_/)ì@éq±hîN©ª–¾ÁÍt²;Ã]?Ñ�»`R<:¢ø™}oˆÇêBmC¯+:;§J>yz¤îý Ý@@ŸOÉo‚ã—zFšâêiì|ßhöýÇ�ûÛ.¿j0j$ÓyJ[Œï˜+ɵî°h³7”èHDwa‹5.eƼªî�k…z6ÛxIAÉŠT3íÌ@Ëïi€Ñõ|<%'í¯ÖFgLƒSh†l¸VKA®ÍÃ8!�ò�hŽ}ûfñ¾•(®½`bò!‘ÁÃßd2f|n±¶¹þ}ëàµpßL¥2à‹ï*ØDoïœ7ØMŽÁû€<¥¬�åSÒõÍ;>½¹ ´KÌÕò Ï„›ô  ðaÊ@N§î¯ˆæ Ö�óÈO|ÈaL.°¹-ñŒôT›ô´Ï®ÎVÿþK#b±àLyZ.¿г\#ÕI!Žœy\1úõhë�=œ|r@�sºðÊr†¤ÈCZMj8W[÷å›Ñÿ®‚”ËT¨¾·Z$s�=J³KééPžË%ÑÞ«äMQc1µë£I¶Uü8¢Ý!©sÃ�Ò1͉ﬗ‚ƒç]¯@õ¾§ø“è3û ÌâÊfç³³D+¿jé7f$}Ö_/åiP¨ËS–~e¾ˆ4VøÍG�Uh\ÑIJºJ9�þÊÅC~¿ÌT'¥ñïûÓ¬«…TE ýêVQ[Â~ÈK[¨ÚZÅü"ƒvÖ5H>€ƒ§7ȇ|3O®Å}óûtì¶9ù`@VýÌ6‰ÊÒ·(;®=xz‹ i£+¡·…GVðÁd+‰°¬§�{b¨i[Q¡Õš*�}œ¢ïãE@bOù½ÅDñÓ?ôÎ †Zù¾ö&JêY+°î1QÂLÜÓ ‡Ñ›ó�­_éöØ6O(ŠG9'¨c-¼þ}'pßOHC!S¶B{»3…ƒ¾ûGŽŒÚÎ4¨´KÞùëžU‡— 3&æ–M¬S»—:ÍûX~�CÚ'}‘Ô}O­£†C’“ð¶±bfˆo~ûÆðoüpWÂK¨ÐÚƒ‘·„ û8µjIU„ˆR/‚4(TV?.åÀš0|€SZûØÑ4í!3iU‚‰:œ&çîÕL[Ñ~(ù{}¢á^N hNÉ,;Š#$eð�Ð`�*XÓ€ uH‹„¤“ íÛihâG>¾O³‹�±y<ÏÞ‚nÕaýdu†Éµkô ³Š¯-'yÜbïØ¼±ßñ½SªÝ·c…Zß6`¹Eç9¿©$¡ÿú½ä`ݽ’̈F{Ig›$ˆ–!ߟW¦•êtqÓ�¯ 7d(Ê ´VôZ“÷™ ²JZäén˜F\ñúCL^u-mO=J~A¼ÇÞÈzxèXô%�&äæ|õUõá�û‰gÁî—×UÕàÙ½³ëÂØÅÕ(ä{ùúV @&;’gå ¢j®£y;—k ƒ3s:Òˆy ²GÞJJÛ¬{ø‰^ ¡¤k‹$Å.Pv)–†¡<4ö!�H¶±Ë£Ê»gëM9# _�&¬ùCm¡Câ7ökQ÷:îàq5ñ°ŽÍEéàöüg0vã/'}¤ö(W-­þÉ´ôvC°X$Ôœ÷!£šÚ¹<ääT¬±& ¡1û?Íåyƒâr‹õ /Ùº‘Ó,Å"J·Ð|F¯ÖüÔô aösýH5º»¡UðIú±ßžŠËµLv£v´½¼î D‹Ø[3Ä’¶fÞCßf#»`=êï%*ë7s¦@C… ’FöÍáæbýg-C$xØý‚œµ\q¥ò0$Ó O·�¶v¤ïCæ.é_?ýÔ+vÌ?\8(Îc�_•ÓŒûÁRysîyî¥_Pœ¦ÿ0Ê‹ “¤Žèä2•¾b‹5Ðv>™^"[øgXu¯¿¡„GØ–ÜÕYÝÇ:¾¦^£Q» ÎRB!úúÑ?6c?ÒùڞɾÜþ#G ¾èò&ÍNÎ_E­Ýyy•«‚Ëòž9ëM¹rÎчø»�:´A¨GõÆcJØQ�«×|´Ž0{ô¥2÷KÍ\‘~`!¶ÌöÏc¶[aªß(k*ÇíGO-<õ"÷aK%â-m ®)<¾;�Qì¼JL`I¥ÂA®Ò‚.žáÆâÄ?\~_×å-(ÈCu9mßãÎM’ñ-43~ôÕ°]+!ž™¶ya?®C»2 Òï6™¦’us$Z 9Ül»{²ˆY³I9šÌȞαcé÷& 5šçÒ¡½>xsò,ËŠy“‚ ‹ã=Óÿèó{â%‚`«ÚbqŸkòJ¯šh9äË]]’q5§uë¡]Bù$0‰ 2#Vh¯¯ãgö,ªÛ4�UXbѽ Ä“©lì¹tã oú¸û1Qfô“˜xfP:FõY¯tnKôÚý›.·~ZeBí”DI¿ûÖõ3ŒRä̉OÔhŒò°AŽEÄ0K5T”1w¡q‘´DSõyèvèj¾v…³RO÷}!8çͨ€ìô˜" ÈkĄ݋ú FŸ‡ Ü8yI8˜xMD¨‘EÐÛ5B0`(#FÍZ?"I²3•_¼óÀí"¡¤³¤vÌÊ­Š?Ö÷ó·oEBmàŸ06V«8k¢mÚMú¢œ,MÛ&€!b£Ë–VœîOÜ—ýÔso—/ÓûÕ,ߤNfWç_�ØÑƒ :#á¨Mêd:½ì‰"1Ã~¿ÈpðnÀó VgâÜZ55ÀWÃ7ê°}d³O|žµÎLgU¥‰YW¡OÑz˜þ¦,CI´/xQ³Q=•UÎ]9å¶ÄzÈ�¢¬¨?)¯ÙÑ™‹qé¿™üHù‚›ZÇ`õ@£é°v ¥ ¿ºwüž�§’¯gˆÄtµPÆe^ãŽï ~Q€ª«:½¢©Þ;Ï­ µÕMmšµ€ÿlݺ¿6KØ9–IäV£ÖEtùߘ`ácUq�¢†ŒH_8‰Ôäú”¾g%­Ì¿PöéÍ]O‰dPÓF¦Wýr&Å£ØQU�žŸInéñP{–éàç°ÉÊŒÐðÑ…Uε.ÖzÛ/´F ŠùË)�<®°àŒ“4}¦ï‰uKž÷YA90 °y`Q�¢×?©Z—è™gn€ØÔ+Ÿm¼²€æÿè½6¦sŒAœr·ýÊ'pì�×#ž=÷`(¸6ûÍü€ ¶6È~íU´þ.:WãS³c÷<ûøiüÏÛ'q~éæÊÇ57¨xv²NðêÔéîØû^±~â‘Ê´;›^‹ºc_áìˆë5’iFC” ?>?MÐí¶Gœ(W+hù[ðµoý LR+gë<•Áαn…ß|Sëµ6ŸÌÉyó/ àò”ˆfõ¶ù¬Çô>¨¶�í@¡{ÁjÁ²� LEže¢«ÎÁÒ¹p�–. QiV6�ø(˜æŸ£Ìœ¨¸0SË–c3y©MØü çÏàÝ¥ßj’MÑÉÇòP ´~‰!8$±f r}¥žÄg¢Ü’Xv›)Ȭ¾±£±7=qÔCuX"ßNŽÄ¶„ÈkW6G+÷±?/üj|çȯ³¥kŸiZ­Æ^ßHxYZáN�só@oNÒ+Ï0ò¥ÆZÅ´òÜ´õ¾H"¢ÐnÂoŠ3<�™ ŠÓWZgp–ߟ”Ã�i Qñ¶D¿ç¶ò«ZÛ˜9ÍîPÆãëßrð§JG©Ø©pQCIZ#êåWIœ{@õZï'a'—Õ3Ì΄:.d}=W]Ð.KÕŽ)a,º v£F— BŠ¥·ØõÏ!Ф"�,ìyqë Gýžb"¸jÍ>´Ó]v_¶Ö^-ûK¹†Q2)€Û̸\þ.¯’t ÀöØÑi,bybC�X/FóÚfe(©Ñsæ83÷Å?HÐ\G×û.!çº×ºªb«^ækEù}Ô[•ÏŠ¿a1ÈÁ%¡j�Ô®^‰DˆÌ¢�YÙþjƒwHH�‰;[×�qú¹N©ð»¥�w³p©*ôž‘T~ÿ|­X@Ú·ó.…ŽêZÙŠÐfXùŽE#Ï£ÞR­ï®4w˜n“Íq{§™Å®“–˪]™Ð +㶪Úq)¶�óÆ’w€˜œs\©¢�uÇ–²˜¥e.7nÊÉ.{)ŒŒ/¯<¥ ,®Îi®üߨ'»ØxeÎ"îÑN(î… ¿ÿ2®®jþÂÐ=eÑ÷'…f8·`fP´=Mž�ªâ㬌t Öø îÏ“4½“Z-Ð`wZ÷\�zýê>?ñ» ¨%%I9«$.B¶ªy£ÀiwIiÜÏœ¦ßHšìžãAµÖ ›Õ–GðrÃDEÊ‹@ ÃÇ©TÇÙü«P£xìñZ¡ÏO®Ež á%¦‚*]:Oúâ¼&å—­¢ ©F~Çöò`m³::‰¬¤¶›lbomá#ã·.µ…,9üg µ¿.U7ÈË¿‹Ûr–·3£$§Õœ³M«½gtö`“(�td…Êdtwç=eQ"þ íj\jÇmôÏ"@ ÝE”# NâU*~Þe,$Æ3”N�×1¼ð•¯Œic6DØ!ðPa?š¬K+ä>t\9Gïì8 û™ 9!Š$ˆ=/~¤>¢ìÙÞûp>y®‰aœ?¸ÔLšhë;°SpELýeHˆ_RY ‹«\#Æt,úÿ9¨ž¢ <2G]ËÕØU5zcè¹JÒhóD;ÕT.,¦ˆMáê¨1%d)Øviǹî×ý0lKùØQ·\¥H)z8õò3Z<»Ov~µkÈžZgÚÎ~®y;RÑ\µv§±`áµ� TÇ…”‡•ð©Ð{ëÿ&7Þ Þ[øþ*-Fó‚õAX�>wƾxoUÚ ôcªTÜñU´ˆŽaéLU4°kpÙè©.ÉüÅ’†hn'~Ü!ƒ“%!ÄÜ·ªa ÇVø”Bܬn‚ÑV°¶Y~åè¢=øêåx‰Ž\EË7'ÿ÷�TLº#CÌ ¦�×cvœË 9'⤹ØÇÙ|†Úú9%ð›UK É;RiMH˜ÜR·6AéGG²Ša'ú×ôIÍ ÚwdÃ( µ/eÝ £hû�p¡4äA¯¸{¬^�&k·A°–DÎvß-}-Z‚G¿‚‘·I:¨ðzÄì|$¨÷¡ë`dÙ6'a0f‡ ;¨D¬Ç·ó‘ÐEbß-v‹|m=bå6ü©{{RºiØÞ¢Ëƒ÷­‘ƒyÿ‚µ¾Û‰Ft Tß{©!ÚHCa_ôçW½¬ðítä=ð–òZc³ã´Ðr^\`ˆgP2Èÿ›dÍȦq2õ“¥ÿ�VòH –H9 Šôxù oF%£k¨�µÀòªR"Í5²È¶ÄPl¿j¿JýâÊÅu1& ¦¼ ôø“ÙþP:ƒðÎE¥—»£ø”Km{‹Âž§¡Pl/ò3—Mçu¬–æjâ@dGÌþôÒMÞSGQj1UZaØÀ¹œÀÔ½„/�›Ìò7�Û,ìP�óq’Êà(Ý_:y|噺—*I´oÝò°§O¤B§^¾ñg긥xÏ'r+D¦Ì€p±­êÜ™—i£’¦¦¬Û¼o:õi x½mDÒ¯îgŽR¼Fnj‰T,/+™x…îï‡É”;.7/ ¶Û©² \™FIk~„±«5ø�’omtzªÝó¶^V@n5X:Ʊ#è�a»pâÚ:Þ�1Éð„$wA·jŽÆÈkΪÂ(-„˜ø¨‘(·†q†îekßøE0ðÌ")H͉Bã,“àž?èV y‚ácª_™‰''Ëè9`°Ø¸z…c¤ñVs Œëº™�•¬6~æZÂi$cœjZòFLÜ誆�`½*”…�Q É¯t ¬n4R½…UöνM¸Ý¿E’Ä 08ö°[,B7•&õÅïàê*/UÚ{ bS|¼ö!PõJJiÂ$�Ð73m§¾«X&—åÏy ö¶ˆˆ9·Ý…$ËÚiûu¿ŸHOôzóÄŽ–Àéxu¿˜¼a»‡�bÌNæå¿,ñ½!Qºlb4ño\­Y¡F:³0>ç^�5±-êé± —vHÆš;ŽDWCÏýy¹^´|CúZÇì«Ä“Wٯɹz·Û¤¶dã—‡8`aå—¡©ŠÞ~­ÐœI÷Ÿâ¶í&†ÐB?>D&¸H¡J�‹i¯Sçüý»å/2Ç;Žº—Ï16Øñ{jûíŒ÷\À'·¦qÉEfÈ7)z,¸íØØ>=„ @Çbz‹«Ã Ûô]H)¯~³J�¤IA‚*Ñ3u•Ïw ì'N¥Ð.Ê'ýðpN"&óRq@Ú ×1J´NõîL(Ñ!Ïë²?ñC‚x—èçÎÙêŠ�kKºnÁv ýøWôŽèlæoöõ:`g~æÓÆÉñðZõuYéPé7z¡Æ<#·üZ‘:ùW«EsV}/’¬‘…!×F°S– ße›r]K0/QVK9cQ½~0âàíéŸÁ'�^ âí\wÈ.yZzÇRHž$†!±©|¶]»¢fÁ°+…oßÓ™ ¸1?0zµFö>÷ÙqýĹPb¡-ÜÇK] ‘%÷;‰‹ÈV ˜À”C_û¾UJÏeªnv=Áý’xÿs<õ§–*îö�@k˜‘åø�›¤EìéwIWB [ìÄ2kîë'˜ M"ùwí"®`9žß[ü¾8VIß;2k—‰ ö í¸}øôš x®[bŽñ-˜îrèÃdÇ¡”]ôdœaÇ‚þ¢?¤>®ÏDq�‡©)¦çlCÞD™Ëûü羌)³¥-±<&T­í í>x�ÁÍS`ÎÆ¯?¨�˜�Þ‹x L—t�§�Ô BÍ0Ýߔݡ­®ÒÊ­;LÚeÖù¶øp.3�—¾‰‡u_ÇÓ”ø/,ez-©ÈO–q ;½RÚf=êcîyN–<‡½C˜&¸�=SáR@$ö„œvs `Bf�d;.™*!RSq{×g•,7&y¢TÐÜ•0{t'•ä"/¯ÐŽ=üËiyôá¶ ŠAL ¦ß%`Œ·­VÍ·|½óÊ¿Z�v´6&ýgôvrägû©¼¥›ñÇ*¡°Æ_Òo„µ¸ý2/�U‚DQtŒlå¤üIœlIG×÷Á˧ª@—WªûÉnb F“Á Uàpcw?�·Ï=ØJª':–özü4çÛ™�ýÙ;bÓ?Þ} mío#¾1à²A°;r…üƒGƒV±”Yû¹oÎbrÑ©8ÿÓÜ([Cªe+«_ žuqV]$!ÁÅb*Ù½V¢ [Ó›UŠj»–ì Ró£ð‡rC -Ë <Òh=±bI´×òýÖ¶o–yzâv§‘Â$ô¢žðŽ"ÿ¬‚zb%g‡œôd© À¯‰½ Oã1ì‹ÃOÑaªÞvãV†çÆN4pXñº¹7«ò¥'‹*ª6\¾ â>\ˆq ù"‹d[#ITçSÛ›Cú¢i VpOOcæmÏÀÝ7ýV§ ª·ÃðÛçÖ]üTì£*á›(6:6ýkìú]UÓco¤ß½©)¾pNœ²GN ç¯z:Àlí@ˆZ¤:0šîeã‹…§ò�ˆ6u®Lú¥'Ÿo ì#ãÉÑÞn=dD“z8såáÍ=ݧ)€‘7íÔK|£RÖ:YÁ”O·³@xÞe‰'àö'u×½9¢žbX¿µ!îY³·Rmðç‚ü^ú¤ó¤ÌÅ\À­—iLI¤…{Èj.½Ó·þÓ§äS“žüýVß'fÜŽÐÕ�±.g<öif§CÔ=Ÿ eÉ2ÎHÑÂ>X_5z¶²/vïeËr7n?!¨7,ÖÛJ”24¸}w ¨À ²ÇRÀ/wOŠ>§·7†æÙ€ñ;ƒ`+ ˜wØž™; ÈÔbˆÜuÐG� LÔ~õ†·qǤ¡Heç·Þ6|pu¨ÀA~&4OI‚wyq¿j5ü6npAh¼ÖÚ’"4¼+;ÏtmöT{m‹GȤ¹…'á°uA69¥ÓñØšÀŽÎ·™é�ù±D÷!ýË^¿dº¹F¨µS<78$¶¨ä¿}ÃÌ”ñ­i>2µß„¤€îkðˆ¡vÿÍv…¶MJ7ºMöÕïø©AE¾ÔœqÂÔh;0ކAãö瘂^'—?ŠcØ÷DÂH\uJ'—¸.˜aÐ3,f¹Ý‚¥¬ù”Ö2—;µmš×ø30¬)šŽdÎ’d4s“TIÚŠ6çèc(ƒ;^· Cù¡|‰�;íEUiŽç]UFw?â1ð-YËl6a®(ð| ¼öÐ9CiFi`ã÷ø§%pqÿ’Ô÷¨_­ÆÉ—´ ™×åt‘38Ìk�ì›rìÝÒCbî˜A!�DÈèp1Qíe6Ÿ!l½BT¶~.�ƒÑ¦€z-D–•In±ûŽØŇü¡ ÖcÝÌÈ#—öÐ`eˆ¨6^š¨~§fF¡o2Ç]ˆBye=óòµ‡µ”¬}Ò¥%MYbÛÕ8øL~Ug-5Ü%x¼¼Öà!^3¤Û�Ý©þÑ [ ëìÕˆ š£÷µ¢Sw¨G ´Ñã-«l,&5˜äOP#Â� Ùãx!$c5XôY´©Íï ÷ŸªŠgh~|ò†w¢»å�ÖéyŸ€½�ÐáËPëF®‚îÍ j‡KqôÙ³äûTÛ�fL¬ŸÓÛÛaZl‘YðöÔ€ûýÊ9ç·ßN~É\ЧµŸï£È§6ðúŠ´hÊ[l†¶×t¿‚ÌR¿ìöýe[9´&ƒÿC†²81 ÚÓÐ~²2QÀêþ®Àˆ�Gážä³ö¥›V5õÐ|Ä Ø“ðkµ�­M]`"’ýX*JN§šüW‚˜?j´#ÙÑ­uAŽÞô03´¢…׉6ÖLµ-ªs eÙm2r-B/×õÓç_}NÄ |Ovgv>*Ž}Ü=Á�<Å=™]$Þ/è0(.=°WWK†Uf?LÌ䪡’ešVS�[iÓ|!mKDXWœ&.§†s¨ÐÙ­á)D.á…/t ‰ÅÏŠÍñŸè!Á‘#½˜“Çq³.DìPå£vAG–È_lØ8d$ñh|«h°²›æRX¡üX�\ŽÊ(©föÀRÏ঻cŒú×äïâ@Q(¤Ù_²ç>­¼cùÍ;—¿l¿^uLÒÀÆ™qå©íI9 øÂ‹$þ<_T�;‘“¿’�o£Ø¸Ñ�ƒò•Ž_’™}‰Ûg™º×ë[i¼~¤pÕ‰Y œÒÞñ\f K\v¬'Û_›¨ŽÌ{Vd ôï½[ûN¥¨G¨rvQ¤Ž±B…iV> I,DÃñÜgù8“…oz�È?1¡Žx‹¶ £¡oêH¼ìþ–öÖÉ#†cw¦„ŠR1éˆîƒÕ§{TžýƒB²#ÕrcCŽ ŽM†bH^g–Ê‚MªãmÙg³füqÚ·I9ïs G‚û†éáùºÚv©BÞ‹Å öûÎЈ‹Ô‹ÕØ�Dµ…–öЮ pvo†�þ«¬.Õ-[tó˜©o#TpÒµ— S>ü§zrIŸAò¢çÑ vé‡cÂ�»Èn‹âêx�ªÔ(/Ž4÷D1-w½uvÑdl‹¹‡4�ÈLŒ‘/sïø™R×aÆw3|)öQ‡ v]nYWA6‡lÜ¿ÒCü–ÂþI?x`7K‰ž2ÇEj†¯1'Ñ SÜ{šžô«”Q&Xç¬Çk¥·e×Y0ž!{ ƒ#ïá—_!EŒ˦<çK÷s-c ä“-v!r´„†ƒ�åúsÄz;còðûLQÙOÇ»²Và±æñuæW¡Õ+s»7Ž'‚… –øú7¼[p �êüp¸}cñ\–Gœü«EÝ(—äÚÈÏΊ ºÜÙ/7‹Q*&Íñ� ;‹�Z1Ö¾¬U,y¨TOAª6ß–d½Ôf£–†õ2o$#áÒ43¼�½ÄÜ ç·#C‹¥›ã81™6Ðr†@˜#v�óý'&b¨2“�À„\9¸d9´· ®ÿ-„‡DN«y¹0ì™Ò6÷~P³l'‡ÀÓT’Ã-"ú³‚�PÇAãâµS®øÛfŒQåeíÅs¾æ.ãa¶±Ì�Aœ#œëáI|¦Û�Š´ìýÃ# wéѹ¾š†U!"Û(™åPÜîYÃbZQ^ãçàŒ—ü‰½œå/ % Œœ¯‘9B yÖÆ „§äÄž°ÎaqÓU%tï8º»M jº…Då ´±4'ý¿¬V*ìµÐîÕÒfSm.™ÁÒý)üD׃„¶ ' M³P bAª—p:ÙÇN-âꩾj«œ.-¢}5€•Ìò³µ°R•8SX¢JÔã åÛ•¨Ò;3K-œ,a>A1ÀÓT—&Çô²iÔf›º…=)”‹¹ö€-u\_A?X ¹t8-¯ýøçqØó’Fvd.KxÎÁUpDú1PŽ[9¶ øÊ: 4ªäÑ&d‚eYPN«ç&d¬ßkî4窣ù·›T#n9Æpµ¥VD—qáÂG° Çu*k¼ˆ¯3ß*“šÀ]þYIì0ô¾âvmÈú¶Í"@!!Yë]§ÁNøß\Я§ýoWß c«Ò²–ë,º™:k&a%€WY/b˜S*] M ]F†¦…Û/‹rº¾ Ôó‚R¯× .8aŠÙ£ç3Ç>%ÜÄ"f]cW UÆÏŠX6sÐßÚÛ¾½Òl÷YøŠãk–OúF¾Èßß%H§Wêêö²í’Å!„~¯…�õÙÄöÆ4Ôö°$‰õ–{2Š+¨,˜=öXNd !K‡ry<“f_�¼a¨`ÅG˜1–)—•WW�ó‚ÈÝmðUÞÏIIPbJA«–-U™#—’ò°8ÃSn=o#à‡\[?eilJX¡¬#ú±!]àJ£†dÞ‡ô2ÐFÇ>1ô(‘-à4Emà¦?[íèŸia¿Žž—æ,"þ#ì?N}OŒ ’ªÐù­B?ߊnO:|Y‚wb¢ôÆÊ(‘t6\䈬å3… Ró#A•&fݾÐöY9È{6씪,2˜ü%¤Ìè¬Ä+Öˆöé­tò)šÐuÊÜ5[ZnásÊs Piíè’oa{ê¹['¸‚‡»c¬ÂŸ29# îŠZÅR N<ÍeSiW^à2rw€�ORÝ Cp€W¼žVóŒŸ(Û?!é•Á uxo–ñ‹]¡ÕùB:ÖÁëß×Ly{„Yø¥Ip™F½’¹âV¨(J¬æ|ƒop4À­Ñ¯Ÿ×ucEX«9 ‘?a¡ä뼋žJ ±.»á$�¶^ü~„h3AÇ5Ñ$ž]Ð[7– �R�Ô/ÔPc&—(Kw/>=+ºÑ_ŒCc´#Ô“BÌŽëÜ•û~Ï�bË4"\6“e B|p/‹i9@Áø³töë£ÍGK­‡y²_ذŽÖˆì*å¸;³tW¬)òùã(.:Ã8¤ú¡<³öåìö»òϱýõ¢Q†Éivu_Âö¾OÚ°J%üÑÊ�¾@ÉÍ=äŸK«oÍ „z^&7/Û!²BxVްZ*oçúñx´…¼ºÆ„d� ¦ñævD Emò†ÅøÕÈnKaÌŠxªÆœ\Ç|#u¸äVÄ!?×Z=$®óÚí‘ÇìÏ£Öß�Ø”ÜÂ1IÅèn�zé�X£“mµ:­ak}‘¶å),Qw'è,šœèé¾\�€"Wþ¢¡#àQ•ˆõYêúËA¿ÖM¿-ìŒå±~¶ˆ*"/»x&öÔ™ÕoâÎÈz£Ulö>Gœº½\î”›ù˜i‘²á)7ÒLÝ ìí=v`@½p9; öæg1M‘¨ aš³0`ÖýF;õK0uä SŒ':§ÐæñúôÈíµûRÇÑM¸Q¯«ÎÞìÛ1ßö*ìÆýjüoåÄ1Ìd:pùÒ*"a>ã&UZç¶�ÖôÌë],ÇÉs¿éÍWu22€H;/\^U CpàÎu‡5ïlZˆ>M‡UM-…®HrùÌ>µµ«1hãPÀ—s\àªåÌ?Ôõõ'Öùš=¬ µÃeû}D­!Mà*a˜±»ù ¸�VŒœÚIÄØãë�êx¬]²�ø «˜â¯rËf}êØ/±¢â.Tñ�È‚Z zßHÏN^,S�Gõó[‘/8T_r´Üè`ú¯=>¦Àjª3e3T†¸ƒ•ž„^ÌxW.zX«–ÑLO >I7meÃ=*_ ›Œ®8°˜mPxÂSí|G(¥C‹Í[¼�"|`¤°�x‰fÀD4»ïMkYH`zMS{öô›�™#®ª–b€Ú-)Ž ÏVˆÕoœ¿®«î¯è¡6zj?šzûƒ²'èpüœž³ó�ÅO†X5œúÕw{M¬ÔãÅzàž#…XµÜ±ð×öuÖì°ØÎRSOŽÃ¼Æ »æHf·8Ðå¦I1è[dŽ»£Qß’Û�èןü^¥k¹ü XHÅ�èd¿ÿh„›�õ•zdT½ƒÓ†í„A©zåi©‘�UUÜ'Â#ßN5dt·ÂÉêrxo}Wº™´á]×l…/æ#u3�Š¥‘r¥Š–ÔŒ<2¶ÌœaÔ~õŠâñï ”%Ó¹#aFñsÛ:Ì�?¢û§h <½Ü syU"TD¿K¶üžAä;BKiã^Ÿ(ÔÙ!¦/7-y&'½³g^‰T›ÑñûÍÆ¹ÅžõÐÌÕˆjR¬Š@5ÚÑLÂÁÝ~õ»úÔHº,ؘ˜HCxÅ>‡^=è„¶Ñ´¿¬”ùÒžC�4•W _xÍù=§1’‘<§‘Q1З ÁG6§]"Òÿ%n'jryŽÆuóg1ÙQïôåŒè §„ñGAÂÕXä’ x…e~ _#-W(GÕ�ø$OîªÛŠlýE\¥dŒ»|X·nùfyŒ�Øvß‚[éÈ}$ õ9Œ¸t#—®f�óØaÂgS 쥎ú›F¦´ûMuͺïÕZïϱš�©ü�l±L†;_[1[«T=éj#[:ýž¶CÒŠ´ÞàÇßY“‚_UQa³¡ dfâ/éh:܄ƂD�fØ�ýxtŽlSèk°“¿÷!¨Á²«v´1.9;¶ÉKA�!ECsÛ¾¿^Æ’ÀC²œÍQWÚŸ@‡à¿?kÄ= pᮨÙ¿ SÕº÷¯âNã6”î¡ZøàëˆÃvÄÖÎpÞæb }³aêá·2ç±Ò4�¯…‰†"î†ð·ÓBÚž&ˆX•ò}¼Ûì.ÇhÆÜtGsÝ"ÿ'@CÃl¶™Ã©®ËJÙÀ º° �}Ð.%a¶µöfŒáq¡÷å3w»uä ÁrYOAk iÉëª;Ür:1$¦kœ­‘ß4дwç·±·<ŽKΙº kg©¤À 'Ög»ðØúÊÜø�¿°óÍô�Ù†FMl—ÓæÚ×W“bÌ“ˆ»Xjh«+&ÜÑÃpЋ§Ñž%ÍpþJ ß�µÊ“g�ÌÚ–­ fì l§…³ÖÉݾí|]¿}ƒ6ƒ“pE&- '› õb±Æ÷×ûcx wÉÖ�ŽÀ©q›Ù°ýT4E+I«•»m(³"HƒNôõ Î) /¯¸¨Aî€}íÝ‘š5ßñ¯ñüpÊ¥½e„ýVŒc„‘ÀŸ¥,3�­7­„A%Ìõ™óqýaA-ûé&fTD½Aªª!F¦à¦™zÉk‹)|ùùìX­•Â},7 µ'Ô€9Ö ÉqWÍ<} "%±¾ë=;U‡§ %(~Ü~3»÷í÷kkõ×™�þ›�—Nj”ÊYŒ«×ÝOpê9º<¥†ÝU!¡‰uqÄV—n+Ž/vG;ö'CÐrEÄIž`õfÕ?AñºÁ3{˜ø,ÞÑQΙ?×JÒ� OJÕ^"ab%y“ÖV÷ëæÏì› wù>dµlò”§é��éâÝqBÇ `ÔWzÈ%;Š×‡X»óbùF¢«)7fz ¾Óä�é{¯û( Ýž×çœÇ>A¯™´FÉv‰ø¸Aºjì[—á(f«[e _-p<ýùþ°tw û­‰ kž jçdŠ´;ázŘi;@å sá»ß#wFUnÜà@ï ꫜnkç,¯G#öÐJ’~ÉóºdÈâ^FéH ó{1óS¿’G©>«bØœú�Çsýø »+:ªR±'±Fá^EXOp?"2ÄŽÓzèRjæñ`4å¬OÐ�R_L0¨àÅ‚7qû@¬__ÀNÁ}©È.ÎB`}¡bšÂ“vò�ïÓ® -²SÈx:ž9… ÞÝ# ~³úG’¯²&s›‹™áâ�ï¢qýBz-17õžr\½™l=€�z„�‚ЂšÏ'µ/D„/º®­<¢¦"«]ÎÚ¢Ó¾0–¤¤»Î,³æ¦µUR¯µi}ø£‡†u$Š‘öÏ_#ðM¼}Ò*oDžñlP~}¨¼Ñ`Õ»õ‚ý¶°<Œá2ÞãsT¹�$TWN–•Ð7<Åߤyß$k§xràL`ÕwÉøè°¿Mþ`ÛñËbDKI„`^q@Å#»€ÌüÄp{¾à�P¦8ÅHÈÈΛn5Ïó�9Gä)Ÿú³g½½§ú…1¬�‚g{ßíÐk³õ}Ñ[}¡¦§l/˜e247û‡#µV‡ïÉ…UgúÒùíæ­p-¾³Œ‰®Ú߯t2¶²á”>¼cX)TÝÅ|Ø7Ðú%ÓhEÇÑè;s3H¡ß�º°Å2ê·êâ§7ž¼tó¨ Š:µ›¾Š9goÙ"£œìÌ�8‰üA©¨®)"—墑ÍaM)¥H˜Ã_|ýPî8 "k«ÙX×m¼f�‘µYÊä.àzäEà€æl¦‚…Ößûnº4c¬¾Ódr†Š÷`½%“&ޝæ .·ntÂFÃñŽ*δ¯³S“�I”QAo< Ðmfž-Ëåß &Ÿ€²”J * lþä»Îðe�_bíB+ÅRBP‹´ŽÕYV=j"¶²›òä¢ûh‰ÈÃî]!p¦‘ÔT} „b]Óˆ€Ä¹0jÞ¤Ëì}’L…`FÓö>O�¸žë«Hùúä SOÌ:pÞ3¾A¨¯º8·PzÜc£ýÞ°""ôÁ˳É%#c8�ÈŠQƒ;…+éNü–(¶fz¨ »ÎR–Ç ßÍšÛLáx(IC>ë&ôõ¶GïF)`If/¹Ç óàxÍÞäP¾¦seÍ`¦ž„TÞ¿{€«8£%ÜÑ'W¶Þ¿X$5UÔ¨$ü8Ÿ#=�c%ÈÎlýÍ߯¾^Œdí}] ý élÝÅ ëwˆ²ˆؑڽ…{�=¤òŠ:mçöëŠKT[}Ž)ó5”·å†-�YñT…òèÚaq™Hª&Dýj#pGâfL>hf>k˜“uéTXQ’µâ…ö`­¶¨.!¼iNF ¨|1• Ÿ§ç¢x´À<Ø’Ú¿7{í ÆõÉ%�zå*¬RŒ1©\㬤¥jpu·„à�ãuK0$ló}|%÷fæE«û7Ý¦ã˜Ø�¼‚)k4º±�D§Þ)+k._u–gž°Ò3¬Æ¬â®L|KHEÇk- ¸Tÿª¼’Õ›únPù¬¾®ÎÄEñGÜìp84 ÁÔ˜+e@ ¤8JµåÞLfî,%uœ#Ó[¬ÂÇ¢ë�lÜ[¢¿(kѹ?‘dùOF¤A�.âX.m©»önú!�1?�ø8Ñ ƒ7»Ùê={)çN'I}­t<�D•D wä¨Mï#ŒÌnÒ/«e?ô›¨ ¹Oô&°o ë+óè3?ZΞ�7”Þ-a`'?l6«”mÓû:Ù$ÑyîË‘qÊ`î&«âϬ!Œ¶¯ÕD·›ßx‰ ©ámm4½t¹§&�Ã8Á™ÿÿ¢s„2+¦ÔvoÆN}ç¢(‘êž07•nMwÿÛ/Å´I†JcShÈh,Vh·dcx”R¡ >§þ¤îì^oš³ L‚^•²«Íü” ¤E » H$¾®&ÈÛðuJ݆ ™†qéi§ýœ«%h¸#‹" ±é? lãùà|Ià®@"†9öØ“jl¥¸aJÜ)%K,—{¢ÚvÊ+áÐsb-iØ™´Y¦ÒŠÇ“;ì–Û¨ž?�ŸµÐÇ%ß0¬ø±/­[8H¼}2˜¦JšPCFsvCpÛj=ÕŸh£x,g½_8A‹ð7�´H°¥ \ç?ÅXe”$ÊÊPéHkµ/5úb&È÷^$[×,sÇtG_÷\×Msš‡Åêýi$¢R­á ½†ôJŠÎ½9Âz‡è•š°û{qϳɲØÁÀ/U=\VûÏ7ì;—#_]ˆT×Mbh çÈ�P¯œ,ºc…¦(>x¿EмãâÁý?È 7öÎwÏ…M%ˆÎmíQžH¾‘ÕQŠ�Ä^EW'LCKÓW˜¹¤­A(ú-õtW’·x™¡˜(r߆f˜ÔŠg½ýu`ÝV<§�ýäè>b¨Ò‰ƒðÎ:²€ãÉN~êëAûYÄ-÷=8ŽÄ]‚טÀáLyhˆË‡Å⥟ãLXb½ �Z‰š=ªîÓZ™áŽrZ™-]›x ˆÊ”½t ™2×…Ë®³`{©)±|b‡þWfn7¤Èåë7|ËΟ´2×§$Êfý�ŒCc,´Ùä×çϰø]B¢};Ç÷ù+§¤øu Ó”úË^Ž•æÃ£žzcÊ3`xà´´­Ld©º¬»µ¸,†æ}¸Ðên_m˜Œsúõÿ>Ñ8“‚³H×%’¾!Õs#¼Öm•TQ[Íðq54Ë…|–]í’›Ìסo!;¤2w²L4�;視‘‡^Z”ðíÞ„>ôí¬Q hÒu«ÅbÏÇg3™ÍAxÚú§t_¿X‚riEF7¿"½×ð:j² %ÉÛJº­³gY°J¦€lV¦= `L\Û¹ÞÕúsÔ ÿ2¥×}|'}ôñhU,�”1ªÌì´ZTØÉF‚u;ôWºäD“µ!ƒé`E¹ä@Kóë?{ ÖjŠ›ó/-0¯è”0ÚCçu^ð‡PHôÜ|ù‡ð<'Ž�šêOû'|ýþo ©€+‹"Ú•öfÆü.G-uÅ£\h�Ólðä—ux—ÚŠ5ÜÊ.¬3˜ó·!»ëÄ$œT©‚~Þ¡l¯ôÚÇ hÜÊZ+†øMkEäI¸{q¸8‡BÀ½áM˜ô»e65BIR•8¤Géï–s(Êædõœë˜±~B ’�0‡³3¡Õø2³“«^ñP-môUkÔÜ „€yÌÑr…%¸Na™ÞµíÖæ>Ð�ªqm7êÁ�ŒòÇ_{›ä]ÓV¿f.º(ö&ÇRã’à 8íät¯&±8ÇçúW“·•ß­¬BÎáâך¯»\MU€Ä8—’NŸbY ÉùôäA°¹î]¶ã&© ç´MµóSÒU÷tÃgù¹k¢!¨Ç·1x³9wJFOÒ»,Vy•Ôµ„÷ "ÃáŽzGì_ÜØ#߆s£íÂbn@°iªW•ÀM·f”ÁK¦qÒÚ0œ¨åŠ&ÆÁÏòhxÛwûœŸšþQo}“‹¹™E9îÖ°ŠVä�nËÒÛäŽ7ÜT· *¤ 6ö½dØŠ2Éu±öku5^’‡œ«MÎkƒn2e) Vã&ç’¸B £ñ^,åDYSgÂýV²NáñXÜ´Š¿_°Íäh|ùYøÀ!”UåÁÞÝ$•Ü28i,/±ùSq¬úpéAzßh�]6®HLEÈŒúâÎÀÄ�r¾öq3Ÿ�ÌTÞãÑ<-î—wsÛ5‡/à€-fŸ„,‰ßôè;dßY�«o0Lƒƒš‡H€˜NèwDUÂ!ž7y 4‰ ¿xýf*mû¡.Æuý…_—v“£ñ1貫 |;·åE„»\qOÇ="_ë-’ ’Uò|§Kɼ~­ì2KÕež %ý΄hû¦*žalÙ�ø´8@0Èîý•uÙx•­„âlîGaªõ"!®Ðo@‚ò¡„á_Z »û25½Î;“¡=³D¹A;Mã Ȩ/,£P/³ÇxvX“ùü{€ù8sÄÕ�[hŒùN�]±Ïã¿÷*åD�GÔÎÕ0x©¸³˜X‚=©©ÔT6ùÿLw—½®ì÷bùÐì@�_ „ùqŒ½:I*r|¸�$ôå`ÔvE¸§e=ÃC@¬ö šO¹.‘Š�ülÄR’©º#!“làãGU+r¨ï›¿©ÿC“ý=|.øƒÛ•éÀ±©Ù_|í+“ ÂOL·þ)G~û‡‘Ò îKgI6ù‡GvðÎÂêÈ6ÅßÙâVê„pŸE Š!Ûl-N{@J’¯õÄ8M w;õŠ4·"ç¯#$Ñ•+ªl�\p¼J{á? ØÈ°<‚êS;K!˜Ö>vÒ¤°„¨ìÑÖ½BCciþÙDu‚†iz`ÕÇH|RØô ½:Œ¤sLžžL4QŸ¢Ü®lÝœàú¯#líû@°¢;^I:™ Ù»l ¢ëÖD¢?8âN-;#“!aŽtÜ–”¡Ÿ!Mq[NFGö�œ£~ž6¾ž�¯vB9ŸF¢Ž—õA#ÁØŸ9OØÏ/â�Í6=øþC7Ó´Ÿ€Èqpîòn"зxñR"ÛÄÔjí§˜Y­º¢|=Ÿ˜yã)ÕK�gc~áX’ô¿Bô Hª˜¼sûû´¹¡ œcdR ÜR�T9Dl³k- ô= VPû> stream xÚ­weTÚ’5îNpkÜÝÝ�àîÒ 4�Æ-¸$¸÷àÜ]‚»»· ÁB°�{ß¼y³Þ7¿fæG¯Õ§ªÎ®]µëÔꦥT×b•:Z‚ä!n¬œlBU°ƒ¥»«–D…UÊÑx3ò¢ÐÒJ»€,ÜÀŽ 7�@È€¬\\NAAAZ€´£“· ØÆÖ À £©ÇÈÌÌò/Ë_!KïzÞnº‚m º·/ {G'Äí â|Q ¸Ù‚Ö`{@ZMÝ@QUÀ ¯ª�A@.öuwK{°@l‚¸‚ÖŽ.ûVŽ ø¯Ò\ÙÞ°$]W'�øíÈË äô—‹àrq»º¾}€]6.··¸9À+{wà_ÞìÖŽrrq|‹pxó½�©;ºº¹Z¹€�ÜoYÕeäþÁÓÍÖÂí¯Ü®à77ÀÑú-èhåþWIûÞ`Þ¼n`ˆ+À äåöW.Kvu²·ð~Ëýæäþ›†»+bó/,��… Ðäêúó†ýWwþU'à¿Toáädïý÷mÇ¿£þ“ØÍdo͆ÂÉõ–ÓÊí-· ‚Âþ× (B¬œÿ°Ý�þéó¹üÝ †¿f†ñ�„Ðbï ‚¬QØUÝÞRþg*³ý߉ü ñÿ‰Àÿ'òþïÄýw�þË#þ߾燖s··Wµpx€,ÀÛ†q¨þÚ1ÿ_¬…ØÞû¿‰þ÷@=Ð?þw Šnom�„ؼIÁÁÆñ#ØU쪃ݬlÖöo=úÛ®‚\ìÁЛ–·ÀÊÉËûo>m[°ÕÈ_MçüÛ‚ÿ�ù›<óf×–y¯§¯ÅüïÛôï(õ7ÕÝ´½�ÞˆýGï�ÿyø CJÊÑ àÃÊÉÏ `åæà{lÜAA¿ÿ&ßß@œÿ:¿·ps{ŒÞŠæàü»ôÿøüëdòo0²+Gà_s¢åf¾�Öþr[¹»¸¼)ú÷k+ùŸç¿‡òY¡¬,:Z ‡Ú¥e¦»ÕäŽËõõpÂ~r*©×.̬rìH ߬0ªþÄÖ0)ôÒê½pâô¼§Ä´?܃oOß�:ÿJêGÍØ›�½A×ÎϼÌnZ‚ž~ªís1¯²gÈÇ¡»ÿc\CÓ´ø �l²�Ûéâž1�Ú#?ðÍ�†¿Uj]^VNMÁÉ)Ý—£û;úþ‘¡Á�î+øÞ=æœ8dZa ÿäÊ$7os—›z«gOÖ*¡ì/Ÿ&(­ú†ØªiP{hàö%I$ÈlÏMÒD¹·"­šVý祉�•¸&ÉjMÜp›B;GXF»ÆMžZRD“…<�¥–ìÁü”÷Iâ 6ŸhIxäûEbî¥"€v›S°6¾!1.(¯³<´9Iþvý\éÜÔGO¨¤È6:úUò¨DOm>Æ_/~;¼¼Ï¹äu4Ñ›GeŔɶµ²xõ@[Ö�Ñ_©k_Kû:¶pô�ãä~úW_ÜšÉ&¾}ïçQï(%å“ך—A`J›0•Åj.HÔn ËfÎÅy¸Ï’Îþ�Í›µAãä+püÉ÷è) |ОR>qóÊ~7Ò<ŠrL¡: ƒZ37E?æ½"çÞgì[lC”�Œ«êt�Þš”!éˆ'}EôŽòŒŒ™á�‚óùb²ƒ�è1Ï.Ì<ÉÒù¯B!ëÏì£VŸK÷|ŠL#Ö Ð†±^ê|l©#šî‡z‚¶`‘ŠHóÆjñÐ:|û7£N¶{µwpÔ¹µb«¡zEu– £Æ…s¿SjÊ„ÁepF(ë´ ¢÷PǨÁ˜ ¾ƒw¯ì…yv‘§Ñm*53|«ˆâ½ÃmØŠ+¤RìrÄR9“Í#p\Ð6+¹’â*¾cQPtÝ þÂÐ7ãE(óµ–ww²z•xú‘�|bˆ湺œ$ìJø¡×ö¡ kÄ ¿ïu»™¦ü‚,T¿Œ‡ÁþIvÄœd¶ˆ³”‚Gí ËNÜ�¸ØGÄùôÐBªÑ?ûmϲ"<}'1=˜|£66-lÌ?Vh»k•g|Z*R _*‰`²cÿBùôþNõçhxnVšõ'•D3—±C‰lô,Dž£¿j¢1v÷±Ú~Ö½�®}”­SêÔ •TÿRZ�b 1wÔwÌ�2¼ir°}Í 1‡oÑ™±÷ãEn {‰–ÞF¾¿úšZ¢õõ¸o2Ó"¡-�”bHB;)¥Ü£º¢¶ÑsM‘h`ÕÓ9÷ÍB_ÊÁ…�>˜Q&"Ù¥s)eV¡¶²Í´72­‚«ÂW÷4>]‡¥*]‡#È·v¿¸íd�_bãP"ÄQ`ÿBÅùXôãœÌÄŽÒ«!;0uƒ]ÚèWï)u±Ø˜2ý~œ8ƒŸæ¹&¥®Q=Æ“ ­hm€óO®ÅíÀN‰Œ†¦âcVS‰TeôßPÈ7+qÇGß~®ñ8ƺ'‘bGT5}º¹d)-¶ïöó)Ï ªeQ`Äo¸-òj" w¤F�Æ›Ž:žãÖªèN,w` t€éfLˆ‚\:Kßeaaoó?x ýINaKxÆ¢ÎîòB¾ ‘(ϰ؜ý±iÙr¶#±6³µ”ñý¸| ‚o@­D'Á7í#W�œë¯'ùéÀNŸü'Ez‹¢]îÔ7\EÖqÊnR4²y®GM~hD€+F®F³yð…ªËì¯Óª�Pg=?ʨ7ú/K â<¬‚B;%l5Xæ<ÆeÀG¹ö‘VA�íÆ‘òŠ}W¥ôÞºi¿>líìQŽOU.ØJK'�õÔXm4÷àý Çt•‡êD� ŒÈ–óšX?ôȼ Îž¤ÉÆÕFEÖVŽÁbÝ_²|sÖŒÃÀ1±uSúËð‡Jx(Û——è½õW׋ÍÂóNp}¢œœ”…S?ÇCÔÎj#TµBSÓ­oR^ŠÆ®Öød+FŠŽ_à.u�qQúÁE‚¹Õ• šˆ_¥•�C"¥ËY„¶ Àðôþ=Ž#¤²|Þƒ Îøn)ãèìŒ~ÓÎ5Ä0®äzáÞ�ø¯Ëò¶Æ6�jاPÕó‡GÙÆñXÒ´(HÖº(Téû£nĨ«!‘ß‘,í€ÂÑ03�ΰ=QÑ?$-Ë&Òglž�×n…¿ç~U©ÐDeK¸øÈ¨9Â7lʱû“í¸Ò;“¾™•]x.0G2Q_>#„“Þù¥þªÌ¥G ;¾3G�±i(ý”v÷8Œ'oT)è}°êÞ¨VÈài´½l8UÄ“æµf5^Ý“Ó6ê}¨€�»‚¹âSÌ€á.ôC7ÃYÜÍSÐâ2)zHmÇ»Àù¤–‰³:­|ŽÇdôÛgÒçë–š»<ü(èòâxqª>SHÙì¦SKû—ñ‰#ÉÙVê†4ßñçÞ~¨ý¹%Ò;‰|hÁä¢ôÎLàH²ãelú\ EÆÄ1½w•êÌ�E©‰†õZRF�×[Ðãú¾nV¢Ã-=ëH©íÞ¶nÎÔÓH‹œ�IA¬*{bÏ;†oñŠeÇRhŠí1ßxgKŽC? eÅ´&vš¬˜­£Åý:œn»èŸŒÛíûøØG'üðök1‰?% '@”YK°/ÙÕêP]Ëíÿ:Àm£7{ò Í¡ýŒÂ«8­·*2d6aø.¥ÅM|u\Åì8vÝqõâþ„a¹b󳆈ð¨-씲¼®?émEÓ›àA/Ef¤ÎzªÞ,<Ã2êXgÂ�wµ[ÓÔ¦TP#0T#=Sæšë?éãÝêá®áfq�Ã(ô¨�/PÓj{ÚC)×#úΦôùTCXúºî—¡iq¨¾‡^Jív_û´€YgÓ¨JZAü÷#NVXÖýpÏÅ9æTñaÜ�ƒ}•ØÒªr‚Tú9n³ÏÖÌs„t˜œŠŸó²&tU¡ˆ`ÏGÐp+ºÓ‚ÞMp£MøçnJí–)(ë¢-÷~\Å8(yÀ(ˆ®þ(ß=R :¾¦T¨}íÁJ„GV$‘zOÿDäT±ÿÍ;�¯¼ß^)mJźž�ÍuËEš\«‚‚OÃÞ.“µÎ_àgi*o�Uv®Äk!KO£E>§Aš>å¶´ Þ>V(ôáO|®wó5ûתôuFL(&ÌpW^ò”ÐÊ®‰ED+<ƒ¡8Ýð$|”¹@Ñfij­r´%ÎV¥d–C¢¦;Â(ZF8°÷Ô"Ýïe­ýjZs%èÄ@œÉ^)ÞÆîì‹v±A(ß̦?Þ^ê™ÓT»7ç©aSͳkiÿveÇØLFf¿záí²“¨V^qq>ߋߞ\Murt_ 9)é"zwRzˆù˜Œ¹Ûo•C-Õ¨];Yh�dl¹=.E‹¨ «\;ƒvÍ0]ˆ³E�…'+?-ãÁ!õ øòÄP`ò雕–c@¹"ÚúÜÄ.·³qã(°¦tR¨ûmJœ‰ÝõxàvÉ/ý¼`Ï }ÜèúÂVÄ¢†\�„}­ƒ—pä±Þfhâ½>Óp=T`ñ67塀¨²äˆå£é·Þ2R¬Ýš“ÑäÎy¥0Þ?Ø;ÔVü ‘NVe³1!vºv"êÝfJ“ØìÅ9ÅpŽ9Öä“÷3/Û;'´ÓÐJÝ×TÌM­,~í{wZÄÍrÏ çñÜoÖ$µ’”6¬– -ÅbJ§;9æMÒ‘2 Z‘4o5êá/ Mµ±WÛÏkÝð‘=vˆ'�¶Ä²èÕºÄ)*Z"øn¿pzr0é h<ÏÕÈDrÐp-¬Š�ç½TšÓùÜña�Îú/L+,ÙYXÚLÎLiŠØ ÇÖ't£ÖÏç‘�ô×U�†ŸÖÓRxµ;cZ‹çîòYĘñqp”žÖ<�\9ÆÇ~ÑÜd-œÖx+HgÇ~T|.D)¥HuùœQº¬C“|È®T!ÜÙ¯0>Êî�8§õºØô1�Sä º¿€8î—@›à†}³ª–$&É ÞÖs›†` ú9öÁ“%Kz Q¥Äf|ãÑĉVC?8HÍÓœ�|Ë­Cïþ„;yBòZ±¤êì9»s$n1Ü®ì9Ø™rŸö÷‚OÃx‘é�ÌËLö°Ð™2˰sÁ^z¶÷ü”·D»åì�1B˜"à+/ó7ιˆ¤Ê¶[Qy/syÄV!Ù¥Ðd`†¯¹ÃØù!§�“›…{ZÖšè΢dñ1YZ#ý�Ó×Û'C_àÍt=²¢ ¥‘ñoLù¦›á× ”‰±] l;1äã˜212éXÀÐÔ–B/ñ<û®°ŠÞMÓ÷‹Êm:ªéÝ/õbð£>tº¨ÁGÛè&ã‹k1^ ÅéÄ»DsBÒÞú©OUËg’†àdežÁ,仺¢g}X?jx=˜eúø£¯¼Ü$=|J ‰&Ðø•ØyÌ÷`¦~Ë6F¶‰´øLökÇ¡�ÎBh0L$áÜ_躦~JSÈ8:/–ú|—± ¦Sc˜r¶l£R Â)Ÿ Gµaò�2« +ÂqÀ¬vΗC¬©…ÀZnäÙc¹xéo°%Çç(!ôè Ìèi~»bÇ/êÊ€GE?„›ˆÝƒÆäˆ»tŽôBZÁŒ¦ù „dPéɵR-r€»¹ÅÖ6­õ G–‰U§PzÙÿ·x¥Ë>팤óŸDÔŸp”T™¬ÙŸ´“Š( NW xÁJÆç¡µÏ­ò&ZŠXUKÈâæÆ\6­™AôÐËDR¿ß Ê ©q‘[âáÁðíéo)côíG\î£Uˆ®H–1 xðb%Ih­VèÖ"¢ pQ!jÎÀý!_^Í3ˆ,5!–ØÒúüƒO /¬åErúLâàÊ…2F�KxŸ>ÔH"ÜoPaê1íhû3Ãû@PŒ³§Î�…ù÷ÈÇâgå—[ò%¿¶/dmÝ6à éaè­Þúð2¡ ²Ò%QÊ"F‹Ì�‡@ àÙ`6�QÅDŒ›8ÕQ�˜3(»X’,�h°`;Ã0ÌžÑûÏ/‚ê‹^,Sé—-Šœîÿþ®C6²CÖ/Õ3Ã;V†¦R‘õb4G¸ï»/4!§mãô�‹µ¡áßÙ¿q§ö©1ÿRˆ¡ R}½n=<È)<ÀJ “câ<©Õn.¡Þ94Êš¬´ …íöL=×QͧàýRÓKÞ6Çßµ€î™&}oq0ÞàæÉèyϵðIÝ/ÿ"ë36(E÷R͉šÖÛÉJçˆWÜÈ¥£´ó­5¶L±tïzœ�jʺúp¡sL¬Q_Þ�£€´—¨HŠ%"ƒ¶ ½‰�sY·y­.éºC^« ÅÇ®¼xœ³í3*'^$hAi–e*~{rÆÅOꇿ¶�sF•ûXïFomk@²â½(õ,¿dã[iÜ 5µs=koúÕ þS©¸‚^! [ñ®w:çç!Ö‰sò�š¦Wëy<÷x´ÁK0Ÿ€I*ëË–…f•ŒíjâK“ÂϦ';Eˆ¯'�š¡¡ÿs2FÐ¥qAÒ )ƒRßáùÁŒjw @¦‰yG†râjáªý7L`%KE‘ؽ<•&4öP«8o"ÑÚ¶©e£´�¤’`Íy!òů)>ä�>5ã;¨×H?åM’©~1fx*ÉÁeÆK½�Gœsw¨÷fZÖç/–¼ƒQІ"zö|¾ZT9'tˉ%Ú”Z¶®!«\ž�gÚ±×0Ëœo‰ ?u ´—ècOw­—h5”û‹c~ÅrKyGÏ�xÞ\DïGpÌ�Ö�Å•h³º@�z¶–Dê÷@�†uîlÝ#Öð`¦äíÝ›¨(›‰ŠÄ=ýåë¶Œàn 5‡ ƒX‹üŒÂ®0¥{˜j"ñ­ØLØ?Þ€½„  ]¨Ú-cýIΧ »£+‘4¦Ýä;—¡×DÉVko¾![ ‘ëÌW|u@f_#up% n¼Øˆ`·’ߢZ²",p_Nßÿý‡~wÆç:™›cýE•BVäêC;³ô�¾ƒÊÚh¢:ÿiJ# 6#›'NÃN˜î]n”ùe¬Ì5÷t¾�HˆA¥£ùWÒXݲqÇ•á *’•nîÌ ÛÔДµêïôá¼²Z í?Þ«Þb€WPˆø¹Î>ðËÆ£_ÖôÂ�Ä8Û›Mn�Õï"9ÉF]G{™àü–î‰?üоÇ;²¨Z|Õ&(Dxç2xa3)m¸ÂçÉk Ín(JSÜþ*g±!Špvz$`sy…¡�,J·‡sz2ùîc›€¸\x>c[™QîRoêud {[mŸê/&–éçïe�ÚÂ�°”Ï¤ÚøEï-|LGÓÈÕ�1ÆÚ9(¤ËT͸¦ÒZ°&•ö©ü›o´áQ@Œ³uÍN¤€#ìÞU8íÖãO:êIT[m}'aïu¢0å:sÔqª ä˜îSmŽöÖè>£L—ê�çÄÈ ˆëè$üíÌbI‚°ÕR 7GDÉNƒˆÃð¸¸�¦¿Ë=5�É” !†ú �º>Bcdæ–±äD§N¨8ç÷ɧ0&`8Œ¶ Ò&&£ãq†kh>Ìðo63IîŸç¼7bÛ°}" kyþÀ¡Üà 1Qì˱i-<ôN¨Ô›¶ZÞRÊb2UM.t¸•Á¼Þ€®½¼ž9óôÈœ ™m#¦óÎÐi¦w¡Ó¢rÎI2Ê'”\}­.*»Š+ëšÁ¯=ëÒz¦ ˜änÑ&Rk$Gnx>cÜ^S=ÁÒWŒ/Ô](·ŸIûi`ó^¦°€0£ýüOa²RRÃÎ;Zß»}…emŸ®ã\íð{œ®%/V½¼ê»1ñþÌWùø§,‹¼_‰Ë½ i¤œ‹áÄQ.h)\ææÎàØ4c}’Wèk •FâG_ �Q(9Žôz09Ó_–_�að$m¨0;Å6�‹AߦFlhBH²¹=­9ÒOX¦O@ÃíþÈ`þSfÉ­�C­Õ�2¿)^3b"Ã9À…rØÐc2ûuFæÜWJt¯ÌúÀ÷ÝjË㺪=Çz´y5@+·9�~èi ÿwÜ‚MÉàcôg±XózëÚ§ß`˜˜Ì"M~q:C4·ó¶öÞ­GP¹¼Ú×ιñÔ= ÁP|ñ‘Cz{öŠ·l<¬KžSžöIž6ŒA¥JîyËx1æ6¿U4À=ì™ÔùÄf¢ÞÉãÇIÕ C�´H‡$õȼ†Yžœ/*Ê OÅ gÌô‰ô HÛØ'6ÇJüûI?TZm&¼Ãéy„ÖnQœRÂáp”õ°©²:®t<•[E‚p)K/@¶¸´a¨"h}´rþ¬zfbR[Dÿ=D͆„±ñæ Ùf!C ’S­kù=Öéó•z¶ÐÐ +�MßWã>KÑúu‚ý6ADZDò U�¬a,ÒXìx‡¤Z:‚ õSCM´åºP•1kB«E.¿9˰3:knó¬±"²ØçY:<,£_ó`ZYM—Yêâ#WkÚîÔ3Ù‡‹ÆÚ”w“wàÖÒîL/È]üŸŒþ•Õhr�æF4W1<Ãj…ø,NqÐ÷I‰/;W¥cTÑF5Fƒ£ Ýz7/þ›ïÙ!—ÓÊþ[ø§áŠ,tšÁO|6Ë'Îï<øySža÷}HKwsË’û§Ô�Þ& ± è „6^ÂS®ušE6¼æUßH—dîüäûQ{r')(¥ÃdåwÃÊw 8ÞG*÷Ý b1Q|æ ü™ÉϼêbVgªá‚)ò"xR ²:ÁØÈ-t¿„N~ 9—ñØ`�ŽŽ‡_àôðÂfD~eq΂¼·î²t× 3…¨Z0|{ê \0Ô>®)ÆU›öEt®”ì-ÒÞ�êˆ-¸ñ€Ónœ´uËUù¢£*éÏð=t>ÓgË1±Þ’Ö„Hp“Ì$ÙÂ~EøË¼¶Aµ´€Šu¡BÌÉ’7NñŽWÿ É.†Ê?—Ó—øÉÑdï.šâB™éû—ƃ-Wó&úÄHºVz…×zÀzÂÍ�"­w7¹/gSÔhMÐåViÜÔ2c§PÎ5—hs"¬Ìƒ—Ê"A(&ö@!ŽZë�¬ïÖßÁ9¹—�Ûè”룰óú]X**4Õ,Òq(3øsO¦§Ó†¦H_ƒéÜòÒlË^+öcx–@$ÐçÑoÓ;äãTl´¼§ˆ'“�'£‡ 1ˆO#mgÛóÍ߯$¢õ4OEŸ‘öE Â™9—æŠø§¤bÇoêYI¿âݺ(³�—}¸›Á�H#.Wkì¿öÜÒã?�÷1žíê96»ø@t‰"*ôc 7_y¬h/N~êË(øl‹9KH^òc»sǸ0 w¬‘3eofuÜÇÂÊi/Š{Ô:™¢d©Ž‘-s�óñôÚV=ù.ËL—ˆ—¤_Vv…ÿ`<ò³7²WƒÉÒ6°’ü¡õ‘€p—3þÃ`Øo��ž÷�Ò.I&¸nÄJü\.³`gc„äÓ{­0ä‹þ›W­OM!×ÕBF ñº÷¡Í‹Ç_-·ôyä�Ï I ÊõÛWKžä„ý •_ƼUMR•héWN” Jt…D½ dOd�Ky½y£ aZtÙÚùž€–×ÂH(�ÜÙ~¯ÞžÌœ†E«×ikÙ�ÄI¤„&‰ðm“{畵í±´|ÙR[Ÿ•kQ".²‘-�ŸËÅD±eÙ»¸ào2xjÏÜTù5FŸ!³ßá'9í4uø�7h¡iÙ.ÆX³ÔÁðh”5‰Ax�Y!‚£}”ö4ßö´ØÄ¦ŠÒ`Sªß)4çù›õo$ß…»@¹æç-¥é´:ßvH`ÝH¡n–¦« žø ³/µ)ÈLÒ\ˆ°/vxŸYµ^÷|, =l,äÜóÊÍ×z_;$©@ P¥Î °ÇÀ5Âä–×…y2CúZã9ë¥ü â9ºK"@°G¤ä«ø°ó.:þüù‘_’°YS$£$—$РM–LynD½˜¸Çýá‡Þx GÏçJîbJ¤Z©,Vw¾ÐŠNËÒk<µÎê¢[*Âè(Œ'Ü\�Ï¥ ¥–ƒ–‚vÑ0§ÇHüSfZÝ&œ_#ËW[þŒw `úÕȉ�WÈÖQ¬Ö�GDëø}öÉÀÍcóÙŸKç>¤œ6FŽš•-*rÉÖkÕ®ýÕ^š; æØ~ÒoK¶_q:ìN òô‚Ï'—rO¶‹Ú�%ü-ŸáMhÌN9MÆÞ¾P3 Ž™Úïìµv;àË÷àÜïh^"u¥ j¯»òv«µ·ø�Ñ%íZšÊêüiDtBßæ7Õï‹Èý¸~ øÒLyH·~3šóVyÄqnç¿öŸhÖì vÓE;‹´vðh¦9v­Ò½¿/�ë˶—öD�Ò‚tù ~ °þ$ÒÊž´ž<Õâ�øQŽ2W\»!–4qÈN"$æè?‰’3ð376œýSw¨A…Õ‰G%„øj²Ëò³}Ìã°"'Ò1cÆÌö“T"¦TϦ[\è3¡t¢éÄŒT–Ë8¿E/1ùJ!›õŒuàCKæRzȽ¢ÂdAŸ~ìÙê­G™ R°ªcî ݃Fc¸SúuÖšƒ,È<ºI‰w6¯7B¿ƒPºÃ]$Z¡ÍÛû0v…à^n*î.Ô±YžÏÛS*q°i‡êÎOCcÅÌvVw€!Öûv¾o‘@2EdsF:�œ`«Ÿìbp™Nçmüfƶîç“ñ$ÖQ ^Ÿ©0W 763$iãÚ_2Ž3”Rd/èò`YŒŠ3+¿âKåS[žH$ˬ VńؾÜJóîj¸t Þèç=‡X¡¥Ë‰ü„?.5,�h©÷Ýk ²6löŸzŸõØ-7ŽBÅÜRKá�Ï(n+¼¢ê²Y$þòƒeÓpü§¸b‹I¨Ô3¶þ&Íç£ùœm¬Ó�þ•o͵ó7f›E¥NìsÏ—ò~íͭͯšC·Ôó£‹ô7NÃÂç·܉,>™sìåýa�q×j‚xó!ìÙ$ Ë“HŒ“7롊 io´�…PcÚ…%c«†k}lÄA~Cº0-wðºä sÒ¤©b‡W±Á6>o†vü '“ïS’‘t(qE‡ÒQˆ¡Ào�C÷¾Éöþ¼Ë#aWÒ�ú[Å3�q‚�Ù bYèfv° Õ¼†À»D^¼Æüñ‰0h‰~[ ¥,~¤ÏÞf>QÁUƒ^%ØÌîTõðhf‡æ Œ¢›§.Ñõf�kÕ覔ݟ­Ÿ8û~µhc2/��UAÃXf¹Îm7×?BÛ•~:2¤ìIËf@ö×)ûã3íHuÞÇ@þ¾è^{ä·î”}Ñ:¸WlÜ;U¨” Ö‡‡ƒÖWá¹çûhT6ýùOjJfmrMïÅ+NÎ<{žnåŒr¯ ÊÆ51MtÑ_²¤¼ÓÎYüldÚðu¤­új¶Üµì–g¼nþ¯kgž8 ˜޳˜û%RµÒÂ%ùª.o,µ*›)„itò�½¯ ë@dÊ4Âò�yÛ+y;™³Ê áÇÑäšÖ'ï_ÌŠ1ã~þ>AÌ­¯©ÀTÃ\y>¢;îìБ_ÄY]�Ï ¸ýe–Ñ\ÎÞ¤ËʇiÙ|Ï»CÒov»Zô]‰\g�‡Æ|â«ÿÃWa·g¢ç=ä�còKx‡°ÑÚ?¤ø�VR>|žšÓ…Ä(©z�‘�* ý¦*g& ªñ'ô‹~¼ ôV¤à�š’/¿)â?‘=ø‹ƒ ]B0×.•‹ qIØ6©c…§Óph(ÖeäΛ1VŸd•8Þ~è�À `+Å$œÂ0=_7Ú3«ŽÍí ŃœÃ] .èôVR¶Ð¨ª­/gŽ+&¤3É®Vh!¿fg¶ãá™%W"%Ó^Ø>ua^b$'®ÓÒKCñchŽV¨&Â9ß…1„ÚÛ TË¥¿$I^ê¼×›¸ö"Kð¤üþSa>a[ø»Šk‚sÝãDÜæ;gb˜úή†…ƃ|bĆ(-ò´€?Ù°ºôÎöc¨·•âôžï›Tb5cÁG{´Šp®ä!¾QÞ”IýcH—Çð™¶dX*ÕæF½p‡ÄÌ‚‡Xä¼ÝûñxÁÇe•ïÄ™Acº"SuHz±�àÂDJ Gì™ P•É|÷Û|nÖ ßwò˜t³¾ÉJñ> ÇãßñIš«±FÐ3Þï Ð/òµ)Qî5ÌxÒ¦² ÇÞ”¹�)µÒÜîÒ¹zþÉǃ×|ÉÝTñ‹€… -? gÖ‡?2)óË•0°UÍ¥¨<^‡|"RÿäL^|�˱Ÿ| 邯÷Ø+Wå8¼ÙQUwôMåE�»cªõÒŒ®R‡xSs憩;ÊåûÈ¥xç·˜�ghâG#»ˆ°*Ò Ç¢+¹�4·÷E“Æ·÷4[õ¾l¯ºb£dIè¿ê¯ŠSþ±ËÐ`�?;y¶â^b#o}ÍsQ‹Žù¨Õ>ò¾�»§±Åë+Ó¡”Ë2•稶G ò“ì� ¾`V¢â‹’¨6”ðÚq …=õÃã'�AzÂR‘õT?øü/›[¿Y¿>@Õ3CÙ-±ƒÐ¤2.i.L-¢øW¯:Œ�û0Y+·bÐÐ]ÙÐõW[9ø]ú´ZFyüÍV˜HL˪r;]ZSž±&:®yðöçò‚Î�Ñj÷M!Øx‡º�b‹òi^L7’¾¢`}ÂÞíŒ{É`õŠÞØØ³ÍžºaÅL=ã}QÞ÷¿á0Ö˜Ð#‘}Wd]l &‚cPÙÒUj4/²cÞ¯Tnh™ß¯­ÁŒ× ~ïv/ظ>Âᯚ Ë_¬~ð²ó ËÍ­Èe„úþ Ñ‹ IÀ×Ì©l=­?n³!Õ[gex7ˆ<‡þBÊ×rÕ “‹eÒNBT%6]KuñvŽ&Ζ_mH= ÆÔ؇âBMZ7ŸŒµº‡)Ñ®J^3Lñ6½D>˜•~UM8{9–u½²9$<¬­i¾= 9ûu3@Ø„6U;‡ î±*ëJu£!ZÈÈüØ–vÊ?Æó™ Ž-þ]”˜à¼ìÞwôjÔPBÙ>û™çße‹`:~¯ü ñ/¯‹´ï;ê7€ �4 ±µò’)k'FÌfwˆ·Nµƒ–†£ÓLž›ê•ò`õôí²¦_C,Ó"‘�|Pƒ.qË’Ùéä5;ì´„–�­êH¨Yy>~ê*Zn>`%aö›–±½JõÆW�Ú?gV‘ßõÌšŸ©Ü—ö…?`ÿâhuÅ�ÛFWÝYÍ¢«Ô7Pâ˜ÁˆñÐ×ÉÒ x#éË2ÝahB.4f ¹[¦žcÖž.ô¹ãëÉõ_ÓÓø A¯a¥V´(œ±“�žÍŠBza/â@ *ìÔ-R0ƒ  žÑ|5A÷1òª¬ô) óQZÈ©¸¤Ïâò�p=7Ì‚d¨MV*p§²7–X†K“8/ã0lȌʩJ IýÍ•r:žºŽr“ƒö�b1š+çàÞGe‘ÄW‹.K‹ðÒhBàÅb”v)b ?uÁå ß8þ:ø©Üã°+!"z�9 qG[‰¼|É:]MRüÓ8ôBΧÇ%›p‚œ¿=Aç3¼ÅÌIr?úÁ…‡dìªïà»QçÏÝXÄ �Dž0:ZWá‘<°‚„=*þV÷ zÅ ÍŒ%ÍY¢OM ZŒP¦FtM1l½}ZãžÜWú£5£¯!½“­s2ŸgÀÕh¸Üu§ŽÄ<´û³žáWx‡b—‹ŽÝ8•åAA‘¶ÉÕ�}µyýh;}k¬»©zDkåhJ'½óh=0é�Ò-¯i×™aÆ€–à">†¤Ñ»LÜì$µ&ô9O¨á¢ ”Û)XŸ5n;"L/âYšOÝ ÿ�±róÅÉ6ß�ñ‡^‹ÚÍÏ!¯>ê\³ŠÊorÔÁ´n¤§ÿÖ#} endstream endobj 1017 0 obj << /Length1 1625 /Length2 11761 /Length3 0 /Length 12600 /Filter /FlateDecode >> stream xÚ­weT\m—%ÜÝ www î®EáPxpw'�`ÁÝ‚»{.ÁÝÝ%dÈûMwÏú¦Íô�Zë>gŸgŸ}äž»Šš\UƒYÜl’;º1³³° ”mÌÝ]5Ì™%Àö’`G À;À�HM-é2s³;J™¹�: €àà°óóó#R$ÁN^.6VÖn:-uzFF¦ÿ²üu˜{ýò~ÓÕÆÊ@óþà²;9€ÝÞ)þŸ/j€@7kÀÒÆ�TQÕ“W–ÐÉ*kdAŽ 3{€ª»¹½  h9º‚è–`€ý¿à{–6Sseyçw˜\�@@›÷k O Èé/Äp¹8ظº¾?l\V.fŽnï5pl�öî¼Û-Áÿrr¿{8¼cïdª`W7W ‹�“à=ªª”Ì¿tºY›¹ý�íjóÀ–ïž` ûß”þÁÞiÞQ73GW€ÈÓío,sÀÂÆÕÉÞÌë=ö;™“‹Í?2Ü]m­þKÀdeæbaru}§yçþ[�ÿÊðdoæädïõÏmð?^ÿ©ÁÆÍdoÉ‚ÈÎñèöÛÊÆ‘õï°È;Z‚ìlÿ²[¸;ýærù§@tg†þ]„™ØÑÞ `²DdU»½‡Ðý¿u™å®Éÿ-þiðÿH{ÿÿšûï=ú?^âÿß÷ùß©eÜíí•ÍÞà_Kð¾e\Š€¿{ðwÑülñÝ2s°±÷úoîý»£è_ZÿÒý;&ïfö^qG«÷¦°±°ýËhã*cã ²PµqZ,Íìß«õ�]ë]‰‹½�#轫ÿÀÌÎÆöo˜¦µ ÐÎñoù¹ÿ�Þå¿)oÔ?ºYµôµU%$ÿ»Ýú�§êû ¸iz9½‹ûß¹(�-þóð—GBì ðafçä0s²ñøÞ×.?/·ßòöÿ:+™¹¹Øx Þófcÿ'ûÿýû¯“Ñ¿ÑH;Á‡FÃÍÌÑâ}ÎþÓ𺻸¼·÷ŸWÿ=ëÿ8ÿ3ñ �'ˆ¸4 †Ú¦e¦»Õàå �Iôõ°C…9•Ôkæ~w¤EnòW˜>W‡±4L¼¶zý:vzÙýȰ÷£מ¶û+è<�Ø�’¾7c�¦�—q/˜Õ¸%ýD'ÖçbNqFŸ‡M{okLMݸøùÉD;§ üÅ} ¥G~ 6Õ½ª?0µ.§½³¦àø„&ùðážv`dxh°û ¶w—ˆ1;�ZÐ ÏÿË1yŠ›—©Ëm=ðöɃGáæw\pÖSÓc•õsÓ³ÀZi n ›¯�Ý!‘}e  ÈÃì‹@>º!Ö=}.V•ÞWÊ�˜úÔíC1&¥�ø´™þ�éSç�ìâ÷c2Q!¹q¢Ú³�;³Â´Úø^ëVegkÇA™P8&¾§yJ  ‹³K¼åmõ€a~Ö/k*jOŠiÞ¤ÖË+È ßì$áYcìŠ@KKì�`ã\1T¦ó>¤t�ùí²· }*ûÒ|週�²n?0‚ÀZÜr`VAo÷=ûלl©S»þ®PEöé¼ ¦OüQ �ÐçÒöô´²”ÝÝ*Ý€—»w†6Ó…'`.ëFø;Œ jXÏå™4£8k‰p´‹^‰VrF-J´3ư0tîÌ­éN½=—ù«CÐÏ4¤G¨»� YU[›µæ`ýÚYðø%[×ÝÊ}°Öåk§W- IhpºbqnÇøËQ �•ͽ²ƒ{ )æ\7Gßij#÷"MÃÔ�òÌháW62Ú¿±w•q7Xv{Íl3—Yá•oh:Ú}§’¸Ãýú€^“鬛 }jé!ß’Ï亡†œO÷ªA„Á~F_ÞǪu®Þï­µ«ìÃÒA�—¶<`øéHÑ8‡òZÝ–ù�¹UÆn]md9¯’õ{ÐÉ­ñ¥¦€ï§Œ*”M=Øû&{ðŽu°æJO£Ï$/M™Ëuiˆ°÷m½·»sZLiGó¥Á¸çƒpJÌ#ëÂ…°:>žÂ ÷ZZæídêŒ9“¯ß9F”´Ø7 •e7æ�•_˜ßH˜Æ³[ÛNWÈr¤)†[Æ$¿pëpË5�jP�¹upÒýVÄò%×ué\ØFÚ}Äï—S88ÔÿŽÜ”êd-æºUÔ�2w‡5°Zi ø/ß\$.Jù§Bm~dvt–¶„9DX³Y·Š5ØË2–¤ †�£¯‡›�ÉÊüÓé£Ý9…ƒÒx'“,�©PPš‘±ÀÈ úÔ´qf1£’NZ¯p@ÎÈýü›¬ä4!dð[¾~5ÂrºG*[/øiÛQ#žQØ+eÝ yޱ c½•�âðø ¶ŸÖ‰‹’û�.zÃ\'�m|l2ØQ™^> öŽU"Pî²¼aº1rÆŒ åÒØˆ™ +ÝPͪ5Ãd×gº¸�F5ö±…Í£lú…õÃ9L!?%žÂ`o"ƒ€÷„å„ÿº ¨MbñîÖ‡aD'nÍ4³Ò¦_N!¢ÁS—9þ(ü‘ŠáÔ£•ÜŽÐh/dÇ­1w,?�ÃÞz(`ÜdÄù"È-êõOúM>󱩴Ö«V‡FßþŒ:9¨ Áak¨8ðìþJàíËägßÄb—ÌÚ³ÆrVTÏŠÇ}²¤àa./ îíÏA6â‘¿åÎ vrn€"Ïœ‚ýè<÷in`×ÃÂTV��ÊÔ’Óv¬êö܈/W•Œ±×â‘�Ü´Àk‹9õc«Q° ¥ön�µbóð!»§VÐŽ‚6å pàYÒ³Z8¢êzð êÑr1-Ã{ؘAeÉ�͸¹“M­AÂÁ øè¼®dE7ÛÇÌgÃuô*Ñî,H >&uÒÖ9ø½ÆÅj7}»vð€>t·~.'ˆÝÖír¬•Eò•”'À´-@ô3zw4Lº:qzSSëÓ¨4½–¿ Á²»qo¡ÄóA«ð‰¿,دËÜ(w{Z�$áËöµ^ñœíˆbOêIAœ°ÉL+9^ËÜ=§æ¿ÁÌ9-™w>}ÆR…N.36@Q ¯Ã‚ÊrMnÇ:Tóîžvm•Szc_áµå…èçÙÁC#ª.î1�'ìºË’82©„¹&›ÐO”½”ZÓ¡´0þAð×— '#*¦ËQgÉy)a _å>K.‹å É‹³ÊbÑY âc �º%>¤Šþöh–få�L!ÊNlD&„ÐßGMÚà]ÈEırùýÛ°@$% ;–Q3wo…2HâKMG^NJN.à T�p¿ Óãu*ïµ÷U¶<á�§ÍåÄV^„úÁ|Ìzu"v‰8>MEPÓ&~mFûÆèì©]�kBòlu+Êö±�Ûí/ÒK3šiü'ÌîX¼ŸÁ!)ß´¶Ñ†¯`;dô7ð²4áJVÑ5�tÇÛ8á:h˧$usbƒ†‡C¸ÄGÎ"Uù0(ZÂV¶¶tŽÔOô÷û’g‚ Žžëõ}= Ë"ç=7ù}Šq·‹`\…V¸ò&}ùô*·W�̶H'¤Þ<Âù�ë÷æd¡„-xöÎ5M¿·ÂÌ‹[¾!B¾ }5£éA±j÷”›Ú°ç$há&¿Mx¸Ã5 •KƒU~ �vˆm9 {Y¢G„o¸QÌÀÅçÔ±Cd«é'wnkÑóËÎ…`Ž«N«);%·Ú=�ÜΉ•K�ú D É4åTnûG' éÖÝ#n 1A cDõÂýxùv™ Ib‚:¡®! wš° ªAÁ©Ö� 8O›g=’{«Y�Ðó‚÷éH¹H°ÑĆ\Àx„|,Õn‹s-Ñ']ËrLJK9~àîú:äyÏe+Í×,²¨“ ¿ðM«}͉a±ü¢\ZÄ‹Ç>›ˆØä´‰LçgÔCûÝÉßzO {LTC¹-È¥VÊCý¶Ê…Tˆ[iv)/7»é]ê†�8¼¡u–³.wæŒIôÓÅûEÉeMIpqXe´¢»ªÍ/QyÝ ûÊ#È8fð(á!¹…€ðÛ©•U$kD¤(HönÊ^!wOªþ\xd ½$ü¶}¬+ªßfÇNúÓ´4…ÑxS}�Hy[egZ<›Ev:D°8X5ì})œ·;Ñ+ââ‹vx ÙaC'•TMS (Æ–D4wÎ9ûÙ|H@ü24e5ӜӼ˜ðàƒ›Ÿ<‰yñâˆþ8ºÀñpS‚ÿ¶›| ,¯”¹ä^ØÍŽ úñòjï^ÀÙ%kö3C_ÄÖUÔc¡–�gÉWÖ1lî> õd5Ò ôž�jrÝ^;Ujg&È^¬HrÑžn†]ü…äª3y’)ȹü÷½É� ‚ÀE‡�ʾÿG9u4„H–™oÅñeÄ»mD©¥ô ‰Ý—gŸJB|{>Þ4·=¶B^áÏðžo÷DªQ�OL%¿Áè9qûÍÎ<Å$±8©`âëdt便 ç«Ò-fl"¬¿ª…­B¯ý4ñ+Eú5Šm#)$áßÝ«huŠyZ¬j…¶šŒØ—у|#•©¾uõ¹\–»f%Ù§o@±ìÖaiõ+›9{-)ìÍõKþ5ÒëüÜeCEw“9u(ù«iÔd�£=¸\Õ4y•Šo”^ä:p᱿͉ۘàBvGN?œÇSõ¼÷öN®)»SHz5‚�$ºp ­ú[M¨’Æ`“¸# ðIZ>nùºBК��·…—…Ô(Õž³°·õŸŠSÅ�ÇåëԼόVÄùþ‑¶ÃÙ.rh3+3t®%¢K§-&%ìýöœ�¯%Ñ5 ”8øÛœ× ®´ÚÛN­Åpšc¬ü¾/VÄë¸'d¾W!i™´2¾®ªð`Ô{]W~8®5uµƒ?6þé¢qVÁŠÓ¾Û&_ͶËl§ÂÈç8Ü(æ�Eó˜^ä¸1/~h¨â “¿>vÞ­ÂÒ²”Z™ìD;„œ„ϵT3A—°cÈÁ¬ì.NÎàA­NN=™ò©O¼ù>ÅÊù*×m=dŠÊM¦(ì\5'_ÚC¼Hÿ•:/Öˆ©A2cõ¨ÍZì:Ò02}-jáÈÖÉ% ”jòªO/ÎÍ!E®aK·ëí}Í-*ÅŸŠ’gæÆ§ÒêÏÿÑ4H.³—¦öÉ™_pG7÷x�fã!F#�=ˆ~VÓƒóƒVÇß9Ö꿎z¦¥¢Ÿ¹h‡ ð¼D^½°Çâ1ˆ/Í£ÆS©h” Œ]ýD¤®@ߌGr„ Rï+³‡pò±äï™›_ºªùx¡ýÑDnWÐÌ«¨-«½4K_~<�RIÆpb�ÿܸ%¬¹{È9—tô*¼®îé�O2Ìžeg`NKcV•ºî?l$`ˆÄÈ&ùG9¥²p™6¨åŸŽ;¥U‚¥ô‰qN~¼¦—‚žmV¸ïš”ç,ë¾ä�Ÿ4}Yõt¤ík‡õ:ֆĚcÀ1¢¬_÷Ÿk?]ÝØ¢KÜ<ç“UöèS;9` •¤ xVWÎ埦gŸ(jåŸ,ESvÜÊ p£­CÙLÔÅ‘”•añ%wH"Òhü&¶&uÜ×TÑÈfNH‰ºÄ§GŸåãŸ3áG H¿ÜýÎsök/)Ï;v ÓͤÕûIž€j=õ62& C$;\áqŽWn™UXPý��±ªršeuóú¹Ñ¼NPñ’ômÄ»®ˆ˜Þ-Iž�«¨ÓÂ`ŒµÄa•|ª$I•{´…òrò-à«‚ ºaÂm_~åœòSØ3jFdSWº%#R3ŒrÙzBytæ€[Žíhb_�òdnô£³ùÄý¦ñÂ&œ$õ “ÓU8‹~ †ÓµB)½d c6Û9Àßþ:Ç !–�¯·—gŒ–˜_6ÒÌJQ©M–x 16ÛÛðøˆÿYò¼ÙÇðkk6wž1½À&|üVE;Ùø#ø#KOóçXZC/újS‡B˜G•Ü»û†më¯[Ir ¿t�+8œ´Z¾C+69I\ëÿv©E4ÌÐßÉ#UùÄŽÛ.¾gd5GDmÁcmÆ® .–o�O•ƒúÃáíšjÝ<�$±Yi¼z Âù¬öRQnÒ#ìÊ´ßDïâJž<Uî& yœ ù;ôS–ôPzòio¿‡�þ´xŸ:~£9«Oê&b3\Y%TS’Aƒßa:úÞ¾95{ïÒdqÀvcÑa ­ŒÅ‰=ªFÁ´=)C¼É�f×< ë;_LÜ$(íqøž9Eã†ÔŠ?äÉ7²}™… òcÅ�·7U3C<Û;y©íT‡ÇöbÔN|EºƒR®žûÔ±ïwœ˜¾O=#8\T ¶>ˆ%ýF‘4Ʋ<ë4Œ¥Lã=3Y¡úXÆRš¿Ø[nñTé¥>ò»#²­J¸Ãm’) Ùã©ð„Ë5q Eräóž“;¿TÒ®XY¥•ó³\Qolv³×bÖ È Œ™}Ü?~#ò#˜H•òúG4;‡ ¾àË-þì€ãf-Í·ž¤Ìà:5Çð+Å KI)áå{(©ë*'ƒ ±'¬œsi,jª~¢ýõ«_1pä�H£­ð@ò7åxnYÁ)hð2R°+LÑ%më¾�’q1¥kÆ£†½= >+5U,ivß‘¸‡Ñ€LòrõyG&—bè[µZq ¶Ø$~zºØäП»ÛÝâ+ZöÞGF©ÌR!5I¸4Ÿ�È3‘­9’$|4XÅÆ‹1ØšÃêíÔ}ÚYÖ‡±ZKh×[&ôø0�¹*0—æ,aíjþ¬£Üœ‰- Ð§¦/Sðü¦¬÷y§Ø·ŽD7qˆi.j^�Óô,ü �M�ú$·Ã¯Ù";Ô€�B[(B" ÝöAñµŸ³ãEA°Bª-üµ{¬{'`~§%uăöšÒÁ&™&{•Ù$XÒ¡{§ÞÏk“Î$Bo´o&Ï/¢Àˆsɼ8]íåéŠ9¼K·6k¸–@™ÁøJ¤pWú:αs M[¼ŠÝ•» ÿ\ÆzQ³I�W¯ŒÐ²QÛ~1ïÙÓ¹/¿Œ`Â:¯9¬ØÏT�‰eBvSZF÷ÍÁØtÙÒ— ~©¨a�Îp ò3G—ªÁGQlí%9/V½ÎAua·ªø}îî3I¶žS+ˆËø¦ßu<]úaÄ4¶FÌòƸàlVê?Æ ƒÓÞÑ‘G½˜S9œµDŸ€8Ð'cᇠÉ<¾D‚~eLñÔ±võJø4¾õ;sÁ?<7BEQé/rÝ”ÀXQgEÛ”4W?(ÅÔ ¼ò¢†Ü2*2XC×½¼ëK<bÃÔòùßOaÚôOFçU_1r? {#&�“|êÇÆqÉÄúÑa„‘³lEƒSÌ1G¯òjæ.;uc[yõ^ƒ‹0dtRªÑ#Ô•QŒ�ì¹ù°æ)OðË®œJaCÞæó…≮’ö¸=ù†ÙÏÔ¬¾Ùýdê_ÈŒ‰ÅÊ% ±aÒù WVf¾üDýÐ%{ÒIÝ‘7ŽïHòvýE=¦_‹2sàI�õñl\¹dñYŸôtŸ9Ÿd^â£+jìãnºÏd®Âž6 š­Úý§mBZA¯sL;reŽÙÒ÷¤?¦Âê„X”]NElV{ørS =‰J ©O>·´^5Ú›P·’‘pކ�ßvÐÅšIf'‹#âl Tè§�DPǔͮ|ÚÀh幸8°D'ÀhêW´£-�Bºp2¦Êl7»OõVfåí¾/ wu¾Á(Aï ¡Ý°lýÒ×Ëàþ‚<9Í»€|Ð3üq:†…{I»ÂB9�ZÔ.*t±ê°�ŠÂÏ{dP euúKÁ:þÖ ¬[.‹l“®ÃˆÐE•SðsŠu¤/C˜£7Í�%Bû—ä? ¥P!Õ¾ ¶Ú‘;”eL^ŸQ÷ž´%nR©X ÃènH®PIöh%>3ѺŸ_±ýá+ù»OÏ¡e,Û3N©«KŽ$@‰¢"n”nóO]Eæá¿GT¥½#?Hù¬­ª¹ÀŽzŠÝ¼¸&lNL€ mžþêýø5ËP[8ý‰eJHÖÂçÒý iÈÐuw—?MþðÈSÏU_4žä)bU1Ù„ Ï�bT§ ¹�.™o `#I�îè3vöÀ6Í!Þ�f#¡ºÅÉ9Еbú­›Â—ã®_ê}ë’;èÌ#…æObô™Ã¶rS_Ze¾µ4f©¶Â8Áìó½ë]å»gƒÕ�^¤Á7D¢n Ýï ÈœO%‡•ÊÕdì/tQìþË¡~º!¼?s> §¿…_s>:túU¯Gÿ¤Ê¾©|Ìï:߇/Z†~UÝ<Œ!¬.F%;dñø¡FEF¿#Sò›|Býø{¬Â ¬5ß8%w99Ú«%ÞmnN;Ü ›_ÉóÔò:EZß5ô«U.Y%,ñªãUàóòÛ6“›� ת±Ùt›îžO½{0½®kØšÂÊæÉS�Üw Jíæ¸,¹`˜oß*�¶?2éœÍpÀ cÆ eX7ôóñ.v3V6©Û‚ýãñ¥#*W }H½ð¤,Ñ ’ÕhX"ì`J–YµO4ÓúѼ¾g0Æò.ئ>–ÄcȈ«Î&î¹( ½žî”ê©ÁÊ€Ûï¥[B‰`д�"ærm“¶zõö¨j¸B‘ëk3ñ85¸ê¾_BlÏÝÞËÓ§@ØÏýYõi¸µj1쉩DžŽGílz)IjôLòÌÓùMòi¨h‘ç19Òµxë{ê#äŽÌ^ì4J•š�ÁÝQ� ¶¸Ô„€\Ëwóq¯×kÆœÌi~Ú'¥­ä”úÓ.I/þ¬ã‚�ŽÆABªþà:Avþï¬(�ñ7Æéý£6¤û[-4ØODyÃ[¥v¾"‚° «Bº%�f¶é¼¾,;3©MZ½S+zSì\Æ^B>p´€ù½. ·Eÿs›ýzÁ°ÊT��â¯Á$Gùnv½Ïðç³/“ËtñÄà|ÆŠqGfÙ¶×k#’ù,-cr¹ŽÊ #Ú‚(ÐñŠ3Zr𱤬¾¹lߢˆáñ 2“÷—ňógsµz1C5Lrm_ÔquµObý7‰’°‰¸5•Z”TkA#(qÚC޾¢c笥·V 'LŸYˆF§Nüõ¶®šìG ZT£�ÄøRÓCNAlTZŽ{CÓÉ«ùLyi“©¢€z k~Ïîè ÞP,™)p'W~&>´ÔÁG‰pp+EŠà6‡3µï"É ;ŠiØ ¿_¼]Ó½£€„g-·]ȹ:é¾ìñž|r¹Õ«ªj¤‡±9ÜD¾ ©•Þg¯ØÕ›êuó|¹f­æ›–ß•ÛTø—Z.>?__gÍâ÷œw™•¶ÓÉUÖ³ ÔªÅ>ä+UNÆâp$Ä^¦qL«˜AÃOórãã“i�ð"ØÜnÖ–‹›«Ê­¤Tò‡/sýÃÜ¥–©h$ «t“Ö|ByH—Q�…Õõ°"£(IbKìËôŒîªÌ’]öVÈÆB€€JìqîÈú9�…ƒÝÒÒXßÈÒR8dî…®$Ú²aÅu†‚ äŒúÑóš­»~ÏxÙøEñ¨¤šVò‚{b Ó‰uq¾ÓFm—‘þuùJÜ[q Q1eY…¯ÆÎKË;!¥"3„àWJŽ›0Í)Ãõ$yL�>0ªbŠ4R)ç›:ÈJOxHùc"í}ÞàÒDü/ÄW¨: gYå^Û¾� Z2V“Õ¦ËÝa3ãÐ육;FAk�ëòòÍþ(Þ2ì­·hÈà6Ÿý•Nj%ÅsBL³7§O&؆'•PÙŒ‚ÎK3ôú˜™‹Q…‡$46 EBh˜Ïê8«HÕêô¬IµõìzäÓ'±ÝÙuò?û›™©óhQó°xàÓÙ-iWœMûa1V¡êaL—!+;‰h½S²\ˆ+á&jª‘k„³è�Æ!'Ø/%ÌÙx}F[!¬É )E-Ó¨ë¥¨É v%_eMŸ²ç:ÝÚéyDƒ†pTº.Œ¡V�8Žþ“ö…£°P?ÍY—¡­Ë½ ÷$}ôœ}BbcŸÐî÷5î÷D‹XrL¬;4¾˜Ñ ÆS1KÁ¹¾ÐFÅRWÐG‘'$�/#Byi0TsBÌ÷�]®ÐåÉæn³ðÌ!(-fö5ýj3æ;ÕÉÔK?'øtüØ8õ �Ÿ‡ƒÊ‰’P…ÕÇôVú-Չȷþtók�zæˆé—É£Ÿ7ú‘âx¥çàFÀd’­‡°È rß�Bàíã`ÙÖg>'�…ؤ|%x>Óâ–D€—§ÁÚÀw¿†‹â‡g¾ÜK¿3üÅøÛk­è�Š ÿ:‹§BC&ð÷µVÁ¥…‡Îz…›“ ØŒœ«:bDîÖtö· *¸�æ[�9ì#³^«^ýé\ ŸŸ±‹ßS/tÑ.9¢Õ¡:ª¬ÂH:ã *÷úÏS}…ô|#™Ýìï�ëA …¨ËÆÔ»ÌY„oåc°†RŸªÇ¡²º£¦n»á,D¦ MëGÅ&^µ$�ßXïVRR3XŽ�d,Fg©€�4ªé¦þÇc/<Uö‡ ºõaÏMõâó³�~0ÜL#¤”m¯Þ†pפêx}Ó½ôÊ)$þ'5ñ ´o1‰�û!ÖCAæZ/ÐP2•ÖžŒ5{|ö�ALGü±½—AñLÅ+¿�øìÖ ÞÐl…Ø[KP²d ¯hu‡Ps­Ù&¿œbušøf�pȉ¡ç}9g¼æô1xVR ¯›§9øïô1®×Ä[žÙ°RànŠ»nØì–uKÄ%âÌ£÷ÄÅI SãnžÏr’zŠFFR½~þªèËz?TN¢ezŸ3A5qŠý!‰$ç-Ξ¤ pj€úÀœv»˜AZÿ9Ê[ƋŇ߭ߟ\ŽF7H�Dܼ{ Qnô€“+ni�¯xÛZZ“O§æ‡§Ðo™älÄ3à'íð1×J0)[´åûÓîN­ß׉ÂWÑ»×Âö½× sMÅ—ݘ/æyO�75O é–Ùˆí;»ß¤ã¬¼uŠ"ºˆö`SÕc;äw2·û‰Í…‰x$;þt74‰Š‹C…ëOQbáI|×´ú7ƒÜÇ)‰°ä­›4¦Þêë]– /_‘ø¤ÉC¿Ðç_ÚSR§†r]ˆ²zƒp‚p:[•Ó .¹R3 LP¼¥Ö„Äœz 8î~®¿¥¤c4å¼½²¦=Qé‹}ãÉèê£ù6j­n†h2ÁŸvRÇ#™Y`Z»!þ`vt!„—½%HzkIüi?¶D‚oëËIö!ì%n°ß>Í�ñÆf ñáóUž9ãÉø+%·åÔæƒP.Wê’* ͨ áYÔÚÖ’XÝÓíÜï­ŠµRÊGñ�z ö¶_�r"i)hÉ6ð�ݽâêU}¨1yPoëîL’T,ÛÈAÐ9.é$X ‚bj$Ó² = øÜAº§†š¿U˜nž…4%8ž÷%6 }�̽sþ@Öß ?¹7ëcaSWud‡pŽæ]_�wʹ��«eÿëTäÇ.Ý/‰laÈ¥‰Š¢ß²]ÇI®Ö*qå[m¯�¬ädTÁ…¯¹p•í$3{™SÛ¯ó ÒqÓC÷\¯àå8¯’Ÿ;Lwú®µtqAÍú¿ëÓ2ÎqÊÓ™›ùû:_ûI¹ÄéKÙZ|÷lã0¸-3e  �…•Р®‚SèJ]Ò–�l;`Öo ö¿ÍuÃÈíXÚxJظrÎ È“º:Ïåvé( ,M´»ž,�¯ÝoPj’/gýQ˜>ÞÒJ_¢3_~p†ÊN¯¾3“˜Â˜�ÚȱêÜÊ4 ×o±?÷Š‘nxz¦Å¬¾Š‰¥w/–2PøHéÒ럧ÀX»()†÷íŠ{d�=” Q ë´iÿT®5×¹¦šñˆØ‹ˆH¥�îªè, +wÜŸãåGŸ…@%ð,»lJk⦢³Ì ,1õûuNz.µg>Ö0a[2‡Û� I׺!›… ¿Uz¯15°\roKŠ£Ê0UˆŸÿ/ŽÆ÷h endstream endobj 1019 0 obj << /Length1 1641 /Length2 7057 /Length3 0 /Length 7900 /Filter /FlateDecode >> stream xÚ­teX\Û²-®BpMãîÁ!¸»¼ih¤�¦ñà n�àÜ�Æ!¸'H‚ $�ÁÝy$û�³ï·ß}î=?ÖúÖ¬Q5ªjŽZÅD§­Ç%cãb Vt�¹ø¸yÅšgkw= T�KÖÅÉFÎj£:@A&&9‡¸@å�p°Àl�ƒüü>QQQ&€œ‹« bg°è±qppþmùí°öùò鱃˜><ÁN.®Î`(ü�â¨àö`€-Ä �ÓÒ~¡¢©`UÒ4(�¡`ØCÚÖN@CÝÁl[Àé¯ôÐ)äwkîÜ\2î ÀÝ ‚<„�½A`×ß'À s†¸»?| î; ¸¸ 9yØü.àÁnëò§ W˜Ëƒ‡óö@¦íâwÁ ®pÀCVmyÅ¿ê„Ûá¿s»C`€‹íƒ§� ÈãwK°š„@Ýp°7üw.k0ÀâîêôyÈý@æ ƒü)Ãõû»N l„Ù8�ÝÝh¸ßÎß}þK÷@WW'Ÿ?Ñ.¼þ]îv²åÆáãÈ ‚?䶃@qx~Œ ÔÖÀÇû—ÝÆÃõ_˜'öç‚XÏ ÛC@¨“Àl‹Ã£éH `ýŸ©ÌýŸù? ñDàÿˆ¼ÿ;qÿ©Ñù‰ÿ·ÿó?©=œœ4�Îð×¢ká0ˆ7À”—›——ððþ×ó÷Éü4 P�‹ÍïÒƒ¡63÷oÃoäƒ=Hýg ‰û œ¨Bß.b�™é1®�Aƒ†H³Ñ±A¢sÉÉR²C Å뫾”Áu H*×;nÑð^“ŠÖøÝžîµ…¤Øy³Ñ;=o…šÛMµÞôÔ,üýœƒJ|GÂì;üò¬ê<¶z¡ýa&‡ëb¡ÅÆ¥EkŒµ$æŠ×fÜDæÜŠ'h±[+¿Z0 Efö;õÆH¼ßtßÅʧ)s¤eƒ ™atÖDY¥SrΫºÏ?”­Ô®Š"Ðï ;ÂË|+�Mq¹Æmù¦~´ý{A`ñÛ7sϦ”¥…—\§ð"gæË�êM–£íúž½Ü-�}?´¤©2eòMý(f,©‚¦�ÆÙìퟪ_û">ùÀj®Ð å‹p,h÷¯–á³Õѽ2OQ2&Tz×T…·g¥�„¦‰>š;cäpoúõJáеT¬¯ù±çÙ¾ˆÍ¢Õ縴·"ú§º ¿ð~u,5Å :À·¼¾ %¥x‘ž¿eß¾nóðy³í?ÉŒ©á7ÿ¸-BÙ¢÷¼Vð–£-4Y‹uÞrUîH’K•g®”�;?ÕìjCƒ?€Oåº-JŠ`øù1÷'¾MròÍV\9¡ÓøèÈz._^�t¾ÃiÄœ7;¢Ígª Ö³}ù$»Ée½sêý˜–q7Ÿë@ߨ×놎uê×ÀîZ•|‡Ö_´Æ}ª•‹A†ÁgÕÕø2®‘¨F=&â”Ø/ß1n•~ŽY¡Ù¢ä­�lÎÈÐ�’µz{&¿(ÅSòüðD…Éü©Û]âð£—ný[s.W7‚ ù;ÜüŽÌ0;´ÉzñÐý —œºÏŸÜ™wÐýÈC—n°ÍÆñQÖÞ|IDZn†ÍI­²D}\\1›¾xÎ~Áþ¦,àéãÀÕ,½}ÏÂÞ˜^õ­­QCŠr¸ •&Cñ$ýúæ%ºìÖ‰ ’O°©Å°Gµ‡ËSäðÞÑžt –�£Gû’¿€1@.¬°oó~`ñË„ahÑžF`…ºpS™``*.¾¢n„”7ŒüÌs–`Æ7 ø°Û}x(“wÛœµ8¦÷*Åÿ'ÝØç"�ÆAM qâ+ì}HH=…iɾƒÆ�³Ú°.Ф DŒÌrì•îr²ÙS*‚'ºÀ<÷'ã¦Rb4gæ³´‰ÔB�9â´'Ò©JÚÏü¯3M®¤(¢R¾Mø{Þ¢kOI�•C©µ µ\—JE‘ϼ™lïõƒ&¶ÌïÀ?ønô˜fˆ[Ú[oª<ü~c|¡oD†3°[ÐÙÏa!Êå»|Ëåæ®&l1¥rIöÂR?ÌÞNġهJ¾Y ÿ¼”ô³5÷êʦdàî ÅûºŠ¸ö%?Ê-Ä4qx•CT7QµÖêK*.­gM‚z %Ï€öøÝ¶|oÞ|©#v~‹”ö‹u̦kÖú,M«6µá8å×…¼ë¸²’ÊbL}9GÄ�4ò�„ X 6רÀ¥W¬šà Yuz-:©L䨡–­M‰¹ù‰2{Dˆ37 ™üÜí;åÈ=K�X å×B!Á #fãL´Áùqsý/¾{ÜÖ£·Œ§Ö¯“–eÒ¿z—Ãø9Êͦá§Iý˵ã É—äàw/åq¬b$›1Ù“Æeûp¶ãs /TsFÊé§ÕjMIEøŒ—LÇ¥óMG‘Œ2hÃUp¸ååâQ›§®{pðÔ&'{‚ô6‹TîLj¨Ôµ¾�$�0ω¢·Çôôh¦(áHÃnø.²ú¡ó/ЯC“c(î”ÌG]=’Â`ß0Kj"ð-q®êUâ׿Òõ;õ€YžÈW߬”{H8u,⹂*ë3Í k¸C°ªjU•îRhwÙ­좳$VË¢ãl2áL× O™3Qʦ5€•ów’”’gØ …þùg˜Õ1ÓÙ¥_5—±XI)IbÑÝ^„um"V{ƒ”­âΧ¡XæŽ:·Ï«ã© †[ÕzJIç÷B›ÅưìÊ ¯¾>·Y�‘*èzî|Ô’¾ø8–õ]ĺWs!È=’á²MÌEŽÄmÒÞ2ŠºR‹rT‡µRŠ¢Xö›æMaãY Œ½è‡-\ú¥œf¸²Qçî¼4þÕ"xľö­Èþ~nΩ_÷¼ÎÆPýf-I§ñ¦gÈZc !�yüÒ„™byШ±t àÆ§æŽ7Ëå@ÖgõÖÕTRcâ&ôk‹lƒn:>8P…½®I¥ÐÖ,H™jà„ó1®¸ÊàFãGzí°º`ÑúÛà§K5­ê+k„÷… Ý%÷Ü�FØ>^Êû‡ÆÁ° YÅ�í]ïÀæß©¬ÆsR¼,±j°²^ÇÜø? \ÀºŠ0¶ƒkDЮ‘�òZ²!uIå×e¹ÕÑ£4]ËÓz6¯òñI†]Òç�³iòËåÞ:¶õrÊ.{½hê?O·n\õ=úÒ;�!ŠÓìÆÞ'»k¡ø>sC£3e®ðu !1Ùs`�úZ²ò#=ºÌ—–·Ê\{k/[Ê*žg' w�ÈeËP*:œèÁî�^.9OfO«8˜ü,<7üŽÐN8§ìÛK �™õÌ®{—'ÌËàõ¯"ª•Ê^‚}ÔÇG‹Ò51&Œ1e7æª'õ÷6ý…â°Žò4»Û±ð�'~od÷~”ç5Ö@ÿŽ’ ½m™åú€s :Cé/q®~É#òÎÛµÀƒ‘™Ž}Õ°HóE?´‚â²»GvÖHÀ®Æëw·æÜHúlŸ…+ÕR—’ƒo| fiƒ.²¢íެÆ^^²-4Ý I³qBu]^ i+ó l\•~ñ³«×”\’”靈¯6�Û˜»çÕ ¢¸3Oçhì}Ï>äoŠÚóÊø~ØxÄÁe}5vlµ2B ËN-^.¤±WÄüh­a ¦÷²¢¤N8çFïí�aŠ> �0t.ù±'AÁ1Øñ-·½¼ nTiÉæ�|«ÃÔülá˜HZ>=›ŽOñž½ÒbÆÒu�H8˜qWÛæßKS4�È3ãvò–øÍp(8gã(¦6“XY¶{ÙwhÌÔü|VLÔ{55DZ¿¼©‹¦ãRFH ÜÚ°ÏROz�íÖc¿Ìck-楊ýÄ•+|ë0Ÿ]¡yL—«�çÊ;–»ÄÈ.S8¯¡¨ñZîi4-Š0UP‚K·„ ¸û­o.ÛÌCM½¬Õ˜|öðë'm,Ëê;EÅ“<éÇ\qD ¨’Àá÷MX³JüÉ2ÆQŽÌšnÑÓ¸Ñ.^¸éó‡2|9„è{5·ózèµ´Eµ�î.#ð:¾a¥¿(z®(uð*O@ZÑL¥3ÿôFÚÞ•�u×Ñö±jmÇoèøØ^±mÖü‘Á§o6çÒo>ž‡(öÆm„`mI%ê6KѪ/«ñÕâ�»7üi'nÙñÍcë;![? �ýÊêÀ]°ÜÌóM3û´lçÂT<ï"¾’z¯ûù|æµ1�|ðX÷ÆÎ«‚ytË ì¤ÞçÑîú™Õr÷”“Á8Ö§¤5ØâY÷‡þþxoõ%µ%Þœ'³»Æà\ª)éàµ$¥u¨ÌÏOgfµÊfå¥òSé2aKåYÞ}*Müuƒsƒ©$†1x“J ¢ð¦Ð|ñ3×Éxàà±ÏÆ(³eï£,›OìŸ ��x܇èýˆ=9C?�ºÝ6² ¾Ò?5�q øÁ�x­R^,©Mœ"p·žÈW«?žÞ÷]KàÔC—pûDÓ{Õ«o…Y¸@Æòø79β ¾¶ª�{7~!èŸ ¯ŠÐ"ÙÛo;ÈvO?° ²l¬±ûz–t%.·(…™þ@Ž;¡6— Óù^·{'E¼ëWj’ËËÃÚ ð6’(‰1ÀUØ0SWnäøS}ƒ–˽¡ýµ¦#QñdfßbWšî¹Ôù.œyñÅø!eÌDWÊl||‰ö6ï¹ësµ%ÒÕûtª­Qõqš3q(>Š…6·^Éë>ˆÌ�Iû³Úbqú—fyÍÊ2÷5Þ£�úÎG{E ò»¨© "˃̪U¾ýHðK3E‚MÛžeRÜq(?~Ê�ÙAW¿pº³ƒj@Gîñ…‹ó nV{» °,¶¡Ýðel–H}ó5Ø~»@™ ¯àR«¶¦î#–Vfòö|¾qÑŠ®^Ž+ø»GÂR% W"-‚¹¶~ôþùž‚jKBëT�®J¬éý—È (óEG�ÝÂòM¤µNš°#uw¾ï+žBvˆcÏžR@u¿ ú·ð/Ú'çÇ ¸ý¹ÑʼܦÅY=!çM®¢Ü,ñí¹l;}� xÄ.ôq–Çù×Y‰ˆZ˜©qa5Ò¦è*kv^‚TÕ.Ý(¾|`“`€Ìµß—䢜3úò”†þèX2H2DïPç‰\‡Òé:Û=ýa�kt‚“â{–°JNörqI7®©èYQö8“ ³\7‡ÂQû²ºH q¹žB_½7Š0Ù‡úg„SظN?;½‡±S­›¥‘ó8NkGã"æ±zÚs�ÚÄpk{�GkÔ·ÏH¢ï‹Œ>,/ ºEÚm©jµ£yäÓÈÚ3éÈ9 `}Ž…‹½e¦ö*00ÐYU¼‹S ¯ºB!ÛÄOáa�6}L‡ óU‰‰ºŒo6%ôófXd2fSÐÓÄ6|š§u^A)Àøs}žŒðD™„#׬Î�~Ô—~]«.šöÕ)¹ ?ù‘šžb5Èw¶�ÞÈ€A{­$»7÷`ÕW•ÅÆÚøtBÑȃj‘Ï»A`ë�@’|¶™àdÎTBŸ"¿W>ýÚëS qÓÕ ÖÏñ3á¡Yцl „zÔs‘é‚#ÇŽîÆ?žÅꎶ|Ú œtë½Jc#iœY 0Ï‘«Ìy«ù‹¡!$:§úÄOZp…kí-Zÿ6Ήýzô �gV >—x˜(¹Å2D.ó×­å<é„ü*•©~2ç��1/Ÿ ˜kxŒÚJâè}&Lÿþ¢CÛ”ö;©U³5…O=oó‡ݰÎÙ‚ºêžPŠ�ÝŒˆÙ.ì5‚õí„ãew~ü£˜%²ˆp4{‘§• ŒGºÈZ¥ƒ±W'Ì�‘Þ¶¾Üõ/üØØ&Î#®$ìÃÛë r>Xæ»}f²m ëþmí½Ïö3Lr½3Õ9?¿¥';hº‹¨t‘µž®0 l¹öà)bP(´'®ý–ýeA¶ƒÐS}&—K]ò ';¤îd@€ÑãÞ€üŸ5ºQqUÕo!Îø,óçTÖ©¿r´]냞‡<1�Må$~\‚›q\áuü!¡ƒf›‰¶Ã½åÒÜRàÏ}¢gÃÈD� µÁÞ�@O–†9‚7S<ù}§—î4žuÅHÿTDÿâ endstream endobj 1021 0 obj << /Length1 1144 /Length2 12441 /Length3 0 /Length 13215 /Filter /FlateDecode >> stream xÚu·eX]A¶-Š»tãîîîî è6¶qw·àîÁ=@p×àîî®Á�›î¾çô;}î[ëGU�1kZ�ú¾µ(IUÔEÍÀ&@)°�3#+ @ dkââ¤nl§À¨´pü9�‘()5@Î6ÀÿEÿ%Ä�ÆÎ °�„±ó_^ÃÒ hì`c°²ð±ððq²þ�³°ÿ—!Ø‘ â²{T€Î@G�Ý_Jlêb ´sVw±··ÍÔ€N`GS Àüofÿ;*@lïá²°tÐhªiÓÒÓ3üaååå˜xü�:�,ìT'®@°ý?"ýu! ´:þMÚì¶*æÆ’f ç”  ±tv¶çcf¶77þŘœÌ™ì€ÎÌ´•´3ÛþÃ�Ò?z&ršþ-ʃù?ûfmv³óú_°9ÈÎìŸ%™¹Ø3kÚ�\€²ÿ×ø/„ôoÌè àdacáea@wSKæ„Ôð°þ“dýllgæãe¶˜Û8}@æÀ¿’—“±+àìèôñúÿÿs…ÄÊ 0™:L€�áßÞÿÂ@ó­��Aî=&VË?Þÿžü=P3°��ǿ͕Œm�f5Mi% Múÿ¬ý¿­ÄÄÀ]2²rsÙx8ÿ*å¯G^Nöÿô¨b ú¿±ü{³¬�9Àû¯Äÿvì¿’w::ýU!€æŸ‚¥üOOJ`g�)@óo‘è³p²üÕÇß�õÿ)žÿÁÿ?%ôŸ1¤\llþY?Í¿ ü­Ü  øGí6ÆŽÿËÜØdãñÿØðŸ†ÚÀéüÿÇ�¬³± ÈTÔÎÂæ¿Ûr’¹ÍT@Φ–ÿÆ¿pM;³Þ8  Ø ô�; `dådýNÃdjmtrú«¾R@;³ÿ)ig 6ÙYÔ�ÿêÏØÑì¿�Ц.ŽŽÛóÏú»÷¿Öæ ¿ �î@S¤å°)°U]pûc�(�ãþ{—æý‡ ÒwÈ]&¨^%<ë2Žw<ÉÙ*£–BÕzЊÐ�¡q’߹ݬyÅ:˜à1±B0¡d"ðϘ~ (ñ¡\!ÐLýaéÃ��ÆKÍ=÷ø-sIZq¯K)$>Ž© þìGôøõðÈAŽ€¸¢  Qùh�–ç9ðBYÆÆW•nn¸S‚Å*0,Y®«qú‰Zî+rãÙVU¦ÑüB¿*§ß\¨4’sÝ• �n7_çxÛ³e‡¼H'd7CQdõá óòûÖ0Ý ^b<Ñ: Þd§‚-ÿ²)AÆ|~Ç4Í0 Ï£¨�Ñ©ÉO7²È ϲœ1„*¡øgb « ¸ñÄ[Vݰ§ �K:¶•ÊW´Pà²Þ ä×Y—�€@r’Ct8©~ùíú,ƒJÅ}¿×"þîk/X¡°}ƒæÇ‡Œô¢’ÝB}¥(b¥[Œ‘D1ŠØ£ÅÆd,Ç…õPý鲃‡: î>¤Éî^��Â¥¯”êâ\ß±\@oøI­4˜ÊŒžl~œpAL�ø£�%D =ƘZÛ,â{!ôjžŒôñüNÔãK„úFxƒŸFÉüºÀ?/:%ŸZ ¢ðg"Çá{µP¯—M…velx?r�?�à9]DÔ pmÆgù;WÌv#¹[ÏR“4A¥1%h-êÚ„·ÍN—_¶Baö ë(ýêv"%t÷u=ðD–å\6ÂT÷x £†õè3pë“)!éØñ-¸Fþ‚h‘‹§˜CÌÕhh1ð_¿`ü Å·Ê‹¨/�zóî®AA*†<�BˆØ‰º=duéÓå³àþ¹ †ÅÐJvz�»€ÍÚ”>Ú,̃ÿ5Á�©�…3ûó¯–Ú hÏz7OÞ‹+ÕK›–&ÁÃ(¦œ°†ÔÃà£w¥µÎv˜€Y+G>Ô½Ò�¶sz‹ÉX쪭2�G€\±Ô®ˆ@*!È^Ôäææ¾ez�¶ò�®š"¶Ùþrzg3¶[[‹/‚Ÿ¢C°7�ÓyÕ>6¥WÒ©¬[‹ü­~ ›Ü0feRGÃó´jYYÄšÐ6ù�jYBPô!äÜOf~Ì8vªßÚŠÛg·LŸž-© Çy!ª7'²KgUF�Tø²TPÄ#t¯!�‘‘ðJß^ b�=†S[Z/MV”á'oˆO ²qͯ]ôZaìßÞfòKÈÆhjÙÛÉv`tù–ûª„œºâÈ.p K ˆ¼GêB³!V�ø]êk±¶ü;2VãëÙO­ â嬋kU¤ªF¡%;Ç s ŒÔ¿+O¼Gár¦®jVË9( #“*fàÚªáÙXÏ‹‹<÷ÖÈˉz‰–�cw|¨°¿Û±bê÷jÉ7ÃZ o/eÕ#¾X¼ ’ ÚÌ9 ´–åèF1V{€Ú¹ ÂNch¶M_'E-øÂêý.m/r¬}�ׂ𶢓UR}o§i¾øüZlU5�2Û —îtÐé"4JÄ¥¦BÕ>ŸLˆ_â”O{ô¢E‚|oøšÎʨLÒg�ØÚuî�­<{a7º"íï±;>‹ú¾�ÅëÄXÀƒˆ›²A…!ÿWÍKŸI�ªÎ�`šÜm(‡ûñ±CľqÛ#'`Ä­MÖùø37Š˜7òÀ‚A^¥YŠ]� é½m�æRX ´"È…×™ÇýŒ{É~_EùÖùô#'¡jfËÏNofÍo¹^0€\*ñ˜ÀÄð�$Pš¹æZÌ*ÔÙ•æ|Ò�s™µò �EQäOàþ"LŸhž.ª3 ;f‘fïËý’ëV~ÂHs#ãA`á\½ª&œ‡ÎÒ¨ ],;ÇtŒÄaMÕâ±-ÞÌž«J»Ø›î¼ �aƒŠ-ÚNº’¹¸.}]•p³Ä+ÝÞ’3›·©в³´7P´¯6â�Séðhä^Q쎫íà] gY³Tc üH"Ù¡Eì¿ gü² Z•k~t-²M…/KöÄ9>7,Õ‰&*çÝLì�m}Ãb$,&*`è³EE½¾á9µ>ÝÌ$ÃUïfKLÊ©Ëô² ­ìaìÿà ‹ÞD}{}ËV 3m¤é à ؚßc =øêŒöæHÙcï�&ôûÞ^~YªÌøÉ¾Ø¬tW^Û§m3N¸d·èlŸc“ÎÕ¯so_>n¼øG´�q2ˆ_ÿk3Aµ1÷¢ zD²´Öì‚oõAF ¦n{”ù;•`±]êx/ýÔíÓ]v<qh¬î,3ú$“û,ûyìõÓ5/ÃcK(†€feL·µ×³wÎøƒ¸‡{@”BL3ç�”®Äõî—äÆž z ¿§K+tŽLÁþÑd�"ìV�z´À™§FÍá 0w´Y•7—Ó#²b›u�ü9bæÜ9D1Wÿ÷ê©P<»´�ì‰�ÒE³¼á¾u‰0LCÓú&CÒÁñΞÊÒ}Ÿüš¢J&G6†ä6’!TÜGµøºÞüz@m^‘î®3¼*^§ )1í0…5—wakÝ3ý9eû½�{d¡Ã ís'-dIëZæqT¤ ÖSÚ»lcŽâVA©ñ¬ô�٦ߧG~j›æ0öà‘Y|h;•dX‚5¸¡ ß?0C[a*lÛº—®´Q–vZQŸCJ+›˜ˆè†ÊźUW¥tåovû­F¡ßD¾í�H«¾j‡W¥•NÓNÊ�ÐO8µ_iϰ˜ÎPT›Û ò%sä`Ø�9ya•ƒ#7ç<)>²×!M瘌ïÊÀy¤ÉËñ‹Èr¨º¨�#õuqI“üœY•”Î_ïž 1*£¼ÆèË0–L¥…w®4Ì•�u¨ëž>î½1н/ìj_}_$Í!# ªxêiòïÛ´”ºlUXË$jg~Ó‡ºLÁ²u^êÓˆ ©æõÜ@…·¼\9ó2Š'|!‚)²»É…�}]ÜŽ€�–¸Âú£ë,w­u 7µi…lë{@®“säÇ黜ö}ªkcÔÚš™Ü Hµ²eS±1–ˆ—bYšg’º½aNKè%k ¬_Æ&¤#j]Ü¿€ ¯úú�ì/=ãT '“÷;Op“Z™#»çj¼C'»9À¡ø&íFo`%²;‘3)s¿þa¨Þ-zöOÆà¸B‚)cTÚBUþ{¦¬Ü6J{6†»kÏ#ú§ç‚º¹Úq—¨—ìç[ã�ÍI |š “+ÃMõX=ã ‚Ünú__‘KÉܵ©…'¶“x\›×¾Ü·­º…ÚV—«O/!Mdñ‡ T  V9å §Â\%[Xœš�$�Ï,Ð)+�oa©§´ÁÖ¶ÍŠ—Sƒ×Ï$u˜ª¿VV+°U­~û\x´tG(+iJ~Äç{`Þ£n1!ÞŸ/:3�$uÁà&ÈJÅ7jŽf…§[Qï‰ë-åNá3’ šMÉLph!wAöï¶qOJCYÕöA\Çw•Ã3ËŸä£Ý‡¾~R’Œ³ “¾?õÙ"Dyú~Evk ™¢šà*Zn±¯”csTå�Çü…‹迴ɲ4BãIƒâð h›GÙ’í6Y®’Û�áHN]R‚ÀìKc{åB’a-kr¦:\ǘéxÄײ2b𬀠S[ÞO�ê]}j>o>ÚÑŽï™­]ýg{mâ´üÈûn£ý�ߦ}d‘þð1›¤ô�]ɤ¸¼Ë[‚KÆ)+¨såWèp­ðp:0þ¬ˆ¦„!=í¾Þz¿•ŠEñ@aYþuaZø5Á.òüêãÔg ™îª Jh46Ê<ôÀ …»‘Q�àQÝûuåG`�¬’?jåÞaÓ*é±)kÔÙÝà�óÏôM›[Ì–=/[òÁùˆ²m&(¸Dó¡Œç$ Á C{�Y†ñ IYoá¥ÊÚ�ËËäžy…7•c-¢ƒlNüï¹T¹cE'ùáóå³´U>Xj[�ýƒ R/Î1„N†.»£Ôb³Âþ_LšT8!ŠÄ.ž”s*aµ9"±n11oƒª(l>JCÂåù\99v/é"¤Jƒà{µHôb¹¸Æ¶òŸ`Så�¹Ñ=oÔlÌ×.dÕŠ+6+4ÜcÝí¦›ŒËÆ~RxãÛ ¾°m!ôF‚„ø“³úñÝÞ¦xŸï×'ùö=UŒ=´œ^ìž[žgͨÎBæ-hm>èÔ Œ÷¨¥é«„lØ}LÅ/A“JLÝ&ë¹oÚr®Ó”¡Õ‘ �íÑ8_–I­;ü*ò¢·h¹ZnÒôÓ!^`£ÍËWy�ƒqȆ,§Š]uaM�~V[ïP¥ak—WT°4P‡È£ ¦í©º÷¥4±€[ß‚.…8‚ y—œäR †ÉøyðpBˆ´ 2iAß ü]u"AèâåRè²°°¤) W{ßcÕ´ÉF¾…�Ô…,e××ìÒå7Ò$Ũém$µkÇs‚ Ï]¦}­™Á9ë†&(¾’_Ä ·_ Çø©Iõ6ÅÔúÀ±�ärR $‘&æY²Ý‹2›½×Sß”GcC[ñ‹âÉ»yð’;Hìc²RŒu¼cЧÑO[[ùó2øR¥_,¿]Fž·IÝ÷(ÙJ $& ¸Xãë;ƒÅà€7¡e°Žu²Kí ]KIŒ*ú™û;”ܲ3ª�˜èB�ã9AͶ@§€(ÑOÄ(ª±ClÚ‘‹æ¿ø~÷,–“â@ß¡¯ö�vü¦ñÜÎQ%àÛ$ˬ1Y³×õ*.ë|!�ËÊüñ[Øyô'µLžgSmð-¦(�Ï[‰S _…æÌhç8캉j«ÕNZUµÝ,è,$.2^ލAº§‰ñGÆFŸ@E�CŸÝéµ|“ 57šND -¼Fþ´O ŽŠoí ªhøqYUœ—ªÑ�‹ü²‚+{tZ)!À´PÅóÛµRn¥^oödh˜`„ì”Ù“'ɯÜo–÷¸už\“ŸŸ}ñ³Oß×€\X5 >9ó•Õíø,ƒáa؆è/,sù™tÆÇ­iÈO•hpeÝH1– �»—ÓžIFï|îsÜæS°¶xMÎǧyP¾Ý8A¬8.õ¿S|¶œÝ3^¼¶pŒ­@ƒÒö{•¦!ç»»UhÞóÞÉóþ¿öº²Â ®°@J©öüÓ\.ÔÍ'7®¬®EÜuÃìzeÅud_( �7+Ol ߨdÃâÝœ³V½·4P¶¹‹‡d�‰ì×TÕ á42¸´Ù'™¡—h ª‹¹׌xð â33ãñUþxlô\0IcÐàGÎ)Ò`TeÈÝ# ]´­ÞÐÙ.r�ÙŽjµp”ÇWÅN‘©3a=–ÈÙ�Äv.ÃccmXŒzÇ "!X¬°c [éD`q>L~6Êga“1}š ‰,œˆnñ}§^[ß\=Õ n’41EGLdnªo�UVl%gOX8Êä©E5äÙ`øà0½q&¾Pµ Dz+{ƒjùÇò¬µ±ëO@&±œ«z¼ŒI{íÿ ïTP'¹7WÆc›=Û;~�älS”cb4k—?Rèf4®w`² :SÒò䉬Dï�_kK´nüÝ¡\ÅÛmâ ¢®JúG¯µ–0Å_0¯Z¢•„ò( +YsZ8h”� âðÉáøè7+¿ÆÛç)|‚Èäd|îÄî”Åã4ïvy·(Ý1òÄf¾÷a­MAiÜ„|“Œ+âN8‘ÂÔ!ø¾Èœ’'ÝrÜ“{^q®ûÝÎ|vž!Ýð uÑõ*�/‰œ°9;±-ö„=•¶z¯íò|ž|•É�²!*tޏOàa;ooê�¹ðÜ[g¬0“µ ðL©·ÿqx–�'½¼GR¿ -—õ.Ü[ò¨!%þt*õm¤è:RgÓ¯D€º6õíü¶ó‹ú¨öÓ­&ªŽëQùDâ¯bÄ¡··Uå¤ù¡+˜A‡§ó¤a¨�b½»Î‰³{Ö`¨LÁ޼*î.^ŒguéI%¬eÅmBŒ{À4�æV¸r…„ÓàsGO�$[x€>%²”û´öÖ2ÎL€FV�ú"sêãvQcBFJŠä�9þ—{¾è' çZ×6yaœDu’Ö£ <¬¯ú]ãœòtÂ(dŸê¸Ê‰yb ^fÝI@–k¨ë�¾ö„Y8CUŸ&åt½ZCó85¯,›«ÙB²Þ6 VÝ*«fß?[ p ÷­2ûµåX-®ä[}É¿=IÔ©ïlY+” |ȈPó3Y0? Ê:q _�üã”–$�(]Þ¨{·•o¥®.ú²°ÔÇô‘¿;Ƙm¡•üŠsòÛ©)n®m{�—ÿØPD°çi#ýú~¾XKo§hÁþDÿ`R˜Âo�0¸*Â#‹…[þç¸qíú¡�vž«ò�¿œˆ÷žKäå¢e‹ ý—QÓ~ ñg¨ �2+…ÿ¾ ÜÙ$]"S(˜Çznhs%:‘gŽÆÑŒ!ÝîfÙ °1›ŒŠ�¹›=JKv}WΓLzjç­= Fž¤æ: ¾ÇÈ"ÁwY=Cu fªÀþM¨Pœk²¦ÅyIuf×YÖqñ“¶$Žÿžçу`ïúÖB�#‹o#ä5 ê­\j�Ñ�¡&ÌXÕÝ”YñQ¸I~•ÇðA;C¡Ñk4V98Ý*«ñ¯þš½â’‚cÎ<Õ�Ö´X…ö;R·"#Ž‹Y‚ƒò"†bz:çÏ¥£ P‰DZµžƒ¸WÌóN,ûîõÚÞAmTÙ¾Ìte³�°tÈDuHÚfºÌdà›cº§äÉ×$žTÇX•É7lø‰_b»o¦Î²¤ºÚª"OðB^²z'PB9Œ/Wƒ�÷ˆûŽ.,¯´ë €Òå ¡ñZÛpÊΛŽ~ðSHëܹ2bèÃVŸ Z�@Xg|@­–2�j˜:á×dÜY°ä0+Žþëaíµ,êå˜#5ÚujEË�ßÈÉmÚrBR‹G�„ñŒÆ*Ĩ"F$ MŒ}.@ÃrÈœ ‡D¸¥,ææèJí|~ošèß"²¥sØÍÅ 0ljôz��¹](ÝïÀ“—ËP«š›¶ok£'¿µ&†ân¿ó�ç•[õ‰º]Þ©'¡ãr ѪýdmLÝz‚“–Ï¥ òIŠ*ã™—©®ÛG‰ÇÈ ùC6¢ €kE#2ò˜&%}¼kø¦’@ݯÚÖ¼öŒÞTrD\êw!ÖËRTy:wÕ $�Žʘ-n-ùø¦EC`:=Ôt)fFÒ¿K‡i!/ W�@z²ƒË¡(|I¯ÈÝmyèU–?£éÅx†þt�bÌáje]óG‘ gy�èa.Uw+ Žy£¢›Öbü‰ÐÔ/ ZXñÍÏM¾1÷ä¬HÛz³+ðsñ¶ÙêŽ=ÂÌrÀ…'‚&ÞúÓg?fr˜×ùðôüÉÞ¢™Èæö>Ýæ•2'ÅgáR0¦Õ¥ x¯M>v]µÜMmËt`ÿ)X¡É^ ‹Sv§”îžØ­NbR&.íwóÐaû™[êBòFR1c\ΞípW*Øœ·Í�¬ÿ)§ûáîÁÔþ) ¥µV%ýÖó}ÉÌqóÓ>sA qp†ü¥+ò¡ìv”�‹Oö[_Ö.†î¥”\|»žég uRäÆÔ—``½U3´GÔ6 #ª|Ñ/߆†‚c+ðºêž…Ó'n}†)Ù]�çxK<©1î5_¨@h£E‰|Óu3D†©˜…'ÎOÃZ«Í–Cø©ËCî’wI 2“ô§s‚¯ÞçmûÕuæ%¬Nò¥øš&®S•%tè÷ý83'O«_Žtˆ4x4–öÝ Dú™„Èb˜…`—ÆíšI.uìY±¼ü­Ýj\ÓšÞ­ÜþÉCûª£r­AÂîùÅQJûK ‘å˜õáfÒjH°Ë匬Tr½kµÂjB�ÅOÑpßè†×ÒQ<?²9â(à§^n1¶ƒ¼2Ž÷•`¹‡/ã¹fCGq;¡dcmŠ_ÀR PýN´"J·p´eõ¥2$ö}ñpt�¢ñ”šöttùèG1�(õ¡²ŠÓ2—ÔÈ) ¼c®„\î|ÃÂý$WìÉvM›°ûºðÖ/�?˜§;¯G²‚zsñQú¢¿ÑÔ¨W©Œ•FÀ{~´m…çÏY5žXÉïx¡LôÒqr�§§Ê÷_‡Ìß– «‹œ”¦3YºÎ”°„ÅÊp�}2L^7ñP•ôŸ!lõÖO©9`Ö„%ÝÓN˜|Mñ&íTuÏ��Ø“ ènñ³xrgÁ?V \t¾ë¤K,{PÇÉ9’Áx·òè^š‘¢tƒ¼¼Zþe#„ÍŸç¶ÃÆÀ<œ ³Ù}Þ;ûUžAȱr�þj²u×6â¸È1©Å­¼>§œ=¶)ì[æbO ¾S&û&:Ø3Gx²Š]{éÔuìî¬õ…ÂÈuŠê^ pË52<7í°ÕVð`á{ÌÇÉ[GTÄgi–Á�Ò~qw\«Éï¶�²¾ä³ÅL(¡º�\º U^\Ø5¨Oð]±#çDïé(­ dõdN‡{êG_‰Ã�Wçú)×\[1L�ÏVÝ¿Sû÷¡h¹‹1®=‚õjD–^=9ºo7÷UL×mr®™%—d­È8ÕÈÂ>nìA7#YÿƯQ)ðÓªç6q� 4jwöF(n/*�—öц^ß½ðôê?wϬ[°Ç=#&Rä÷>1 $ºÓÓïÝh‘q°ý3|p"2‡§œlí\>LeÔÔ¦Ù0ðµÂ~”-9fEÿ•¢nå Û¯HáÆ �L\ŠÔ‰‹ÛJ_ðÏBÕwŸÏóuÄn­†\b/yµÅ'û¸'\j�4ˆ—dÅ;p š+Ï¡ó]­»vœÚ UL;iXJ¸ŸÓ*L! 1X))ɹD-"úA}q­"pjßÌu[ ;«ŽÐ«æ©e¤@£LEg9ÝÙµÍÙRôäkÀÕ •9à–öÆ7ý÷{÷ÉÆó�óèßm›Þ(ÆJkQ½£Þ-”¹lô„­yÈ’�zuTDˆëý¸÷eÚî7~atü “ûp©º�ûŸ%&Ž_àBòû=ŸöKA໢Ÿ@Z¬/\Î¥¨¡fÔáKrÆ'fã�ßcçßYok©2# ÎiŠXO›¾²è�ÚÏšTÁgÍÝDÃ::Û 1_àšŸJ§þ‰ÛÂqiÿ†‹Ù�‚äµxI·¦3Ðmw©]µ÷X?)ܶ˺Ûr™lɘàŠÌKºñÇügä9Ì£Å/Ø^Ê1´\½FäÊ<Ë�²;Ës­wP³ãøN¯8ãëEÖÅoŒÙ„•dfOÜåÖ¾yÕäs¼F�A®q³7åëÑ8fõÛbfP"ÄþÃïðc˜ò ëbš‰ÔÈ64ã·,(îiÉÏ„šÕªæ4¸Êqv dbÓtŒ*Ùå`á$=Üð‘¡G´íÔùylÒAm*ú¦Ú^™#»Õ›ÛˆÒ†rÛZ½w³N°ºòˆærãYm"ß|2ªt~ôÜ5Wã÷�¾X½E'Ü‚ƒ%# |~}[ö˜:·½XVi;ñªì€Ò¹cÉXƒMÚ�Ã�i'˜è6:Æ<®:ÏÖ›HÊŒ‹03Á{cÕžoU›w˜+gv/§Á¡Þ&ÖœN ÷BÃyÛdkxÚý¹XÅw¥\è:d1…�yš51Ò·ï B j¬�p$A²h�mÚX{L¨éñ‡±Ö–¢›r¸š{nèí÷_ µD)ðâ!Q¼ó Å²~%=ø“C)ÇéæJû½›|v›r§à�¤4/ÖW››ÌŽ�[̅ĤHé’ϱíK€õ>ì†Æ<)‘ yBt'„WW�!stD«™Š@Ž/?²„…Îu.o¬ôå_ M T:ôŒ”˜0Y_·ímøS"Õx¾ü�ÿ&8L¡Â HãœS$Gæå�\—’µPM*�¸á¶R!'pRùÙ廼Âþm‰GŽ7Ü@Ñ!ûžz¾SÁj…NM¢+fÛ°ñY yà aIŒx€"e�íÖȲûÇg7d²Y´{Þl©#FrPWŒ\~J€¼fZ-ˆµ|x@½ê]3;žoE ÿÜê¹^õÇvF(œ^ já=ÉX컉�£4N•Úøº6±ŸhþÔwl�}çNF^dTYD!C°–¶‚®Áôñý÷j{Žù¾ïÜà™È�ÛQ³%îö”“û ’ K•¹€Oˆ®ÇÎ}ä å–ǰÙh—=e¸=¼ìBZˆN¡·ƒ¢iMïkÛ)ƒ�ÚŒ‹Ýl+¶o;ÙL™I,K”ˆ%\0L],M? B£õ¼J ¬*©tRp”AšLN„uô:‹ûr�l¿Ÿp‘ÏûÏ*�öW9à�í—þÁé¥  1¼——1d"¤u¼ƒ/ Ê›ñSØ/’!ƒƒy¤ õén¹(絬ñ?ãÂŒÆgSVæÂ;47Z[yå)újB¼© ±g$i£6™!ÿÒ€æF17=‡öì~uÖƒÒ-ØùÔJ²Cj®Çò„— m�qîŽ-¯¿5T4½D¿�eª‘Ò¦r†³É“q1FþÊ¥Ëdb•SòB6åU+JEXNß—µ´/Ìg‹’\(R×І¹ÔxakÔV«Ãlãä[PŸÓü*ÂíýtLœÌî¹®Ã+ žƒï×ù*¶tÔ„/ên“s®;  WØó!‹2à�.ùý[í´A®•$B’/0‹­ ^»�5S+Šñ5d–ž»ÜŒÅš¥îÄN­ÁYúYÙ3Kd,þ(‰8{O-PJ4“Pm)¥7ù'–¨ÜµàÍ»ýÛ¶‚ÜQ§Ï…e°kt�ÅŒÍæ‚õïÌSD1©_Ry‘½½ñÜÇ«xËþZÔuߥ¯:'œ³ü�p‘10K»×Qµ ƒ!{¿@¥õ¡CÙþ�Ž‘9ÓÄZáŽH­ñÈ·hNµÞÎæÕS�¾àVc±ûó¸|$m¿2» ¤â†>/ÇÍ}F]tag­éàbƒ`uŒÇ™ÃpÈl±wÀº­[”@Ú.k–Ð&üó° áŽ$Ø·àO8U½¹±=A_Ýùtûä ü�ôsbõ‘½y—·Ûͧï™N0Ÿeë°Æi¿rVœiU‘ïóÚŽw‹Xvâ2'{c—,]ä¡îeWߪC׉`ûɰ¿¬áÁã1Üß’°¿"jXšûTì_ea58,Í,2zãYCV5X'îQpz�ðˆ}¬ƒ Ö=¾Ê\[ަqö�€»™Èø¦°:FQvÞ+ª˜ù.MÁĵ%4ä2«qM­‹}Â×G†áD½W*ÏdÙ“yIÑ-ŠHY“�´ã4“žlÈàçÕ°"�˜Tål[qøÙ[^þàS©r”€Wò-wæÊüùÒ‚QLoR¿'ö[¥·[LôÇâÏ ›ãþ¥ó>BË.rè z?Œ!; ¯{IC¨ �æŠ,'¹©�GšK¼˜XùŒV¹ã¯XøðVÐ8˘V kø½Ñ2‹%ïý)·:»täV£…PŰ'¡¶\Q^«ÞÝúœ¶ºKºå›£Ómbî>Àø´f}ωW}t¤ªÑ¶›i’]fÛ�õÛ„%ÍT#± i;MLß�4�}ò ̳àReÉoÊý¼á‹å–#·Ë?µèR?¬¢„~(gL«|±Í�÷'m(‡ðØžÏÅA=UR�{x5T•IpCäJ Ò ‰ µ9‚r%5ŠX§þÏwc”MÐH Ç0¦ÖÆáÞ_øQ©›ÍÏ×Ìç"ôºS;¼~àuM.™ôÃóëFærÜu%¼pðÉ»ŒXW¼A•©0Á'ÈÊvÙ¢†‰ž†ÓðghŠÙþù¢âÊ0Æ02~ÌKÔ•²‰o ^C)ú›ºzˆe¹ìmÓ¢+ěӖDNÑ—‚ ‹+’¿,jE°“ò ]×:3hk¨4rÎ÷Èh½-Ððk5òñ`“~NY‹P‹èv3dÏÕ–M5ÀÎ9ÉS!iõH€jŽ,4$ù‹|6BEÅ!–!” ÄÖ½ ç’dññ]a1ô„Mݽ›¹Ó÷ÝmòþCBÖ~–gÜÈ’q}잢�þÂŽ8àœäªéüFòåêg�Æ•<¡êNb�ÎVì€) ÿ¢ø'ˆ'œ4À€+F²ÁLo;¨÷ð>Æ“çgPã�‘B5ébÑüf ʈ¹é•’›�á²ì2+� �žåu˜jÎËj¹HÐH-–ÔùÒ óÈA¹‹ þ a÷Ï—1‹¥àü(¥Vv«p¹µI©³|¬1‡‚ÿ`9êoÁ„É"ÜMäªß¸�·l™]ë#^_»Ù°l– aô'ˆ1töŸ0k¶5£Ÿa‰WéÌí´S cD{Ø(ŒÑ@s�Ÿ}ð¢çšñ\ÂÝ¿UC…UBIfÔ;WÖ]…Ê´a[5hÃ÷gÞÚ}ãz.­þ®iŒ"à9ý(N×ꜭ-¦Á¡z%ýÍBT’Œâ=�"Ûg¥fÕÃ0|}öóûÖÅÉ‚˜AËW!jÄΣ/æyf•ØU|äóÂZŠÝIdØ|áß¡•Ê*¡UëKÕ†ð±Ž÷ŠDd|8 ^ÖÖz–ïÍsçªÛwÿ„ӓ˹�Að¯º÷íέÊ$—sIüÀ&ß3ÏT*¢JW$]Nè–!jc®^mͶµ#b}‚‘«°p¦5ty­áûE§»ÛàEħRUÐg£‹Æ{Ù=éóÓk ÁB0?g}Ÿ&D¦ckÚO_¼]ZåŒ1» )ù)\@ƒÌ;w~©w&¨;ª2‘°»5i eÑ�Æ o…�È3¾ÿfsaëøú+ŒZª­޾éŸkR80.‚ûÖÃÂjB"åy6J°Z+sµøÉ/ Ä•þÐv‚¤‰@곞Σªt§�†‡! û"áûr¬Û7o<‰×ôö˜j¯ÔÀb¡V½Î0йíÉRR“R¿\7ù(âê: ïŠ`¸Ñs $�JÔÅç¦"³Eé*ÎÔ‡²?Þ}ÔÖŒIºhªÇz¢"©µ 2É8…£,>P0£©ÉŒ�¡\Õï�ÏS%bdT¾{+ ¿ ÌmX�dì„�¨mè®OiJ=‚E­ž�é(,þ ïšÊ=×õ.l�èÚªtÁLŸlôTá q(×YìÐ5“ã�d¿£’„xŽ-SñçÄr¡6ç!•ržóÎh;íb.ˆZŸV'Óצ3‹—2ÊÓÞ5Äðckª¥uMé‚$:ß[Š»—Y‰ÔËî>›“NÃÁéòÛS鬸!ýsôlÁñy÷*ý¦FFŸ~ç÷ƒ×sPî_ékÍ‹(´ ®ºTßrÊ/9Z‹lNaxˆ¶›Ç×Ì4·3œR¸o ïë0öý> stream xÚmvuTœIÞ5î,@ÐÆ]www‚k�5Ò8ww n� Á%Ü= î‚‚ó23»;ßî7çù£ªîýyÝ:ç¡¥T×b•°‚X€d!NPV ‡ @ìháî¦eî¤Ìª ²qW€š;^s4ZZm0Ôô�&/¤”+È †8I›C_l´mÝ*æ®N�C�ƒ_�›ãeÏÁõoCˆ« @Ýìñ¨ƒ  W°Ó % ±tw9AµÜ��À +M�ÄÝÕä&°~©ðŸ3¤ ÎÞ®`[(€AGS�‘™™åo( °ðþ7�¹�mœt/�Äù�l/!ä@N ח­þ°U·6—±CÿhÀ` …: ²³;[›ƒ^067k6'”�ñ¥X'+)ˆãÜÐþ˜Ÿ4ØdùÒ˜7û?ÍÐÞ âéäû�”5ØÉêÏö¬Ü�ÙuœÀ.î é9¼@hc6 (€‡ƒ“C€ƒr€¼,mÙÿH­íí ú“þ›;Yùû:CœÖæn °5èeAóu3÷ ®î ßÿ—øï°[B ›—+ù;ú ²þë¬bu{ 9Ø88€Ž?¾ÿìŒ_.× âäàý·¹ª¹#À®©#%¥«ÊüOýÿÇRRò–ÈÇ`åäç�/} ðpýoTusð¿ªâøÛYÁÉø«ø—©ý»�«Û‹* Š˜ðß‘T!P°%Àð·`Œ8x8^´ò²ÿQHÿÅÿ£œþ7‡¬»ƒÃŸ3`ø«yÀK÷neÀý;¼<‘?f¶üÿ¼ÌÁÞÿà÷¿†z ¿¤ÿ¯pÿKÿ]ÂÉÆ`rþ‚ÝdÁ^ +u0ÔÒö/•ü…ë8YýùAê7ð�ùÅ…ø?œ¶-ØÒÞ äæö"Å?)�“Õÿ$•q²„X��lZÐ1š»Zýøƒ¶twu}™ÓŸ7õâûï³5ø¥DÈ d‰¶4± µ«ý|S'Aâɺ;ÉÕÇ«sýìNÁ�ç»Í׫Jdÿ�„»ðÚ{iõ1[ÑCxxØðD™8>O{ÉN6d\¼0\8ù(âŸl ª‚g( Óç}ÄI±Dù?¤¼åO)«®õiE¥&pµÂ!¯Èn ö\Ô�HÈ«Š«QÕæî‚OÔäÞi"Í�tIsØGd +~iž¹¥W4@oþù¯º×ìÛ|¿$&OÀ\¸´þÌ‚DÿŸ`×ÄÎ;ÛN%ñ.Øn–ÒèúýKöqô§�¦9 $¢”$²U ,"¢© eG¡%K’ìoEý�3 #ü‹¬NfGµžTÑk>ò ¨‰Ü•‘å6¶–oZÇ9Ç:!Ö—6Ʊ¡CøŸ ­æ– R$ð ?¨d %ïgkÕ(šØxU,/04�5×ìM\ˆ—Ë è¿à©€ìl³M�^žÁ,`£*±ä$áTD{û(*Lm2bôIr�l™C�”8e½èJ¾ËB‘~!ì>((•Ë( QE"�”7¦è›‰X_+ð;š]^Dhdv ™ÝùzDŸ¯©¥ 0ÑÔæ®Ì Na¿i¦º¡6Jï: Y�/t %(ÿ‘åJ¿Ëâ„:LjN”@ÒŒ‰z‰y^q¹.?Uõ‘óYµ6æÂÿÈìó–¹/ËÂ!�&mš¯ õt ÊS­t¨7f)”õÃúb…¨Ös^:zç‹Ùê)³#2±øi1¨†Pm¼ùì3˜+¯™óú Ž'ÁÔ܂МVøN4ªg:Þ—Uµ«ÑØê6ñ$xyp®èÙ\3Z꽊 Qu[DLàŽóÌ�ùÓ0ý<·tâ†u3èXOàÁ¯AsFf˜ÌQÅ�8ö³ê¨•yÙØIG9Üoö<µ* I»âVa~?4+‹òðïMN)¿Kª­é“�Œú¾�Gíõ â¾×ó]ܘ/G=ò╳ì(ÜÓQ) ñYæÇr.²Ç‘TÅ�ê6ðD¾¥ø5Ú…ŸS‘¶™à¯¼/Ò£ü9$±¯S£Y2`ð�ª¯ûp·k(C„]˜ë'¥çùŒu]WêÍ‚‰‚øt©î–ÔIZÂóÍÞÅΛ�5Ì—D#Vx`€[“r=±ÑÀíšý­ê€�zijI}iÈäÒƒò‚5#i· )Ðÿk­ôŽ-ÌÓ’_ œf`‚Ýɺ|� •Q<á‰TIp¿Ú.›^­ü7…Lì/©wï0áE¹âñÓˆšDÞñÀ?åf4›u0ø‡|ëäÁ_‘'ƒY”6þÉ\qô,Áùš&é­�Q\~Ü‘iHU��¸JBØÂQåÛäûRa²ãW«Âéb>j€æØçl… šŽ›*¨>f¬»K¬uÃ^ƒi ˆºzÐþ¸l§3MŠƒ£mÝúl 9þ>’æ—*p<]¢äbÖ¿‹ÅÊ¿x9 G; ÜÖÉô:2kœŠùS«°o—§W÷YDãž³mmì½öñ’†®‹Csa>ÜýN«‚î|@°oÆÑ…œ!£øgœH‰�£/SŽ?F?ÐôØ7iâ@�y!µek•(5Ø¢Yeƒ1¡G‰êø¦ÓîŸ/³;`á'ܰbš •ÌÚ¬éGe>Tï#"À¹‡U™{¥Ùß´ÙŽrã8`}‚鵩¯†Ê_ õÀ*¢’�¨#“Vü@0éRdL»i,æzrÝ™¤dPñ³‡(ª2«�×ÒÚ ,TÐj¡UâE§ÌÖëÅÌ �e"*ËŽ¼JÏ_ö%I!ƒxZÐûP=5׎#�¶>ìwiÞ È|.ý½’ô’ŽÆ˜•!×í5ú[?F–Ú¾°pÌÔHe$Î÷ÜXGb6˜ÞÔyK½Â›cê¨ØÉ~S-Ü.šŸòÛyÔ~^·ìCJOUgÔÕXp§Ðè¯T+âvLœçÑN’Ew Œ]5˜”Š¢*øŽG3™®ïzý¥‘'#DF*t°ÞÕûôÌé'„,ã>=õFg”*‰Ïß�ä0a”ƒØ�?I%ĉr#Q$¯aü˜AÇíOŽãïtå\PënÄžWÍŠ{ô�…h•5:$·òMÝ`ÚJÆ)6=ì¼Y7è<¸f["ÏÓw¤5îMl»æÌ!�1 Çû×�X!ûs­â�NcÛ™oÓ8ÍçKÌ~~æB³6$®ùÎ1…¸™…ÍdóÎþâÆ´þ­„£÷øœlõò�;ì ÑQ¬ùõ/-Ã'À§‚I‘µè2IŒ—ÛÑSz9ZÇC&U"Ÿ;äƒÂDZUaPË�^8¢ÊŽëÞÛI¤WÂäœ$‘h\ÌmûÝ,Þx[ÃÆ™¤ Š*ØR§ï}“ed&6¡iÀM¢‘w8î|ïšÈš{Á{€‘ØIUiþ¹èš�pÑKª¯?$“vrþ@áé±'§’NþWÌh�83>�7 Ф:I n/ëQ´ ¤ÅVÀ[@åj?Ì×ÎñTÙõé"~%TØ JÚŸ•œ}DôUýò[‰/uóÌz!¢ö;Ûkë=+mfÙö–³'^_#4¾Xž4QŒ›üyÁ¦Y¬©ŒfDÏ%Ølª>²ÍZäštÁ°­¦?ä Ê.d‡6ú]•àí~îÝ,Ò 0üÎ …a�Oú`±"'¦óí}ظ´3P}ÕˆŽƒì;’xÞ^|Þ…‹r­H#’\YL-Sb:é³ü„�¼¬­"Šf§¹\.iµò“j5ÆrÄ0:¹rürJ§¿SJóªê‚ILOí\}•õ© ¹[í�Î@(÷J÷En¤úÛÞÙ„Þ˸}8 `ø+¶rðôÇŠX»¤4õ„Êþ!‰w�AÎÕÖ˜ÕÝ60^ià›‚4ʯ!ìëT¦\øq�¾z9ÜßÕÅ5b*Š� ¸ÄB„jÁ±á(>¢–¿B&)�%» 8¿'�$b°çÖá5û õ¸jJXtK÷øåshÁÿ°N%ç�Ô•º£ì´îtÈ3 2ŸòâÐ~ ×=ý1Îÿæá cm?»èÂ飏ɮ x__€€�áËÁÊZ&`Ø"ª:W9U74•x³õ~2QvZ9ŒàjM‘ÞµÚ]$Âóž±hš�›  xE ÎL�KSšÉ’9ÞÚÆR2çÏRž¼ûÚbÔX3)a— U±iþêÃXÌkŽÕ…öÙ}Mf nþKcù¸A!g4ŸJäˆ{½ ¬EÎk�Í/xㄈl˜m8Ïq˜àðŲÉS3Ôî¸÷CÄ݆¥Ñ�RUO³3]C-Ùo]=›ÁmþN’ªì‚\jÁ·.‘-"¼“D‹º`*G%ÔV5 Ñ˯¯öa¹Â` ¤ÒÐË( xf _°]ÏìVñ�îD5³~ }fv„¿ä�_\ž�ŽÛqò¹hü‰àe bʺrí×ðõ“‡ÍÝ IˆAæÞ«¿°¬þ'Ž.Œ†£˜?ŸÛ5+�4|êùa<ß]‹bÑtÐã¬ÉÁ¶EXv¦ÑêæI–‹¸÷6Znp îš¼Ò¯*î=¬W*ˆøqû€Û›‰’“kœÐÕsg¿‰¸Ù|‹`ËYVÛCîX˜Øg9‘öñ3GW¸TjcÜHµY�]QAÕàM ѾŠÿôsiÊ’²`²·‰Š±ß섎nG,LA½DˆñXúõçâtÆÕÓ�-c„â½r{Í!¬à1»ÌOø¿[¢Çç ­ä_;ü/?×H\�L°ih¯�uÓv  ”'TI�tSüÉJ`¡W˜:7•¥Y›dàŠÁ ø¤M°dë£i¢¢Ûð@æchU�‘›'íJµò_þZ¶ûhd�Ã'ü4œ×í…M5Õ|iüæÌ† m‘GœÁS:.k6owŽ$Ž�ègÔá}Äè–´>>Ú5"ÎÔ}×iqd? Ì÷MW‘ª  ´Õì¦øÆJœá„üÌØGb_Çí�Sâ±…1½ß¿ˆCýb7ôÅÞô�)U«oï„Üm° öÚZ„â­Å/¢;¼j?©½S5B–\Döü â�Ö¿ý™ø«�*@cÒQ÷ñR¹6ç kt~ŠD˜'?‰)±J1°c°þµÁ+QñW{ï)鳇uØbxíLDöè¤OÚgðAÞoî�‚›Gí›%B†ˆiutý;ßdëp3Ô†&‡Tò«‘™ŒÚq¨tÌ‘E"ñà_oŸï'–ŽƒüŠîPuÁt&—óÈqÒÔ¹nôL¯,w�¼èQ™Ë%'.+È{�¬¡Ä¥Cº7ܹ"nJ²xÒDKXìKúXlÄh¿Õ¾m£XÜß&drÿ~|½ÕªÇ1¤”w*Âò)”oZàsB’7´‚g×M÷S•‡eAXçëòÁè4ph Å�”·CÓ ÛÒgGãó„ j�õ6ØûÂe=a_/öóM4þÌ“c W¾Ô$íÆ&)'²VÌ`úvIãÉFEè8ÿuN¿«\gWG�ÖãC¦Àpö©�˜ Nxœ€Î>Çì'=žœ§}«È­âßh„‘˜�÷êó�(Y?š/{’€4~é¾2V ¼Ê _I�'mô9A¥6³¸P’¡’W 3=;¾>ìì5{ÝV&aÄä#Å… W|�t.�¹òCÛ¯š{ïô³+P²g´û¬ÌùgGk»±¥ðÀ‡Ï]™µëÆT…=ö­tL½‡âg9–•KäYóù|ƒ_6�tÕÊ&ê† »G•¿À5³;Zl�¡4YJ"Çp*J„ÃEX–¨T¼î|¬bú1óÈöÁÆ™+‰¾mîÇvì,ÏYBz¤¡ª·ÚÞ↬Émf%Wß.óz®ÛSxï“Õøš4Ëû€æ £øO«T~X '0µÖ²~ åXœ$¿µnçiã~�bzLç5yœ-«gèÐXXݼ>d<Ãx'³0“pßf!ã¶½ªBgã3®t©á™ÿéÁPµ-œeI&#åã‚rI¸NpK8,5tL¯²µkï^“¼Ó©Ê®JVÙ­ëú,ö¨ÄÖn²ÓßþÉÄ^ñMÂkÁÛÍ!ìíBz¹*²âÒ5±þ‰J‹„gÉ(Ñ対À½ɘ•]“½BõËšÀZÒùÈgBŸ¥iÀ;u(æ*�ƒ—L72¸f?1Ñ ^‘–™st/£^j03<¬ysm²¬ûŸãÕéñh༤n‰ü·5ý±a­Ò¼Œ„ŒÅ�ðÊmØlºdÁQ-iÓq½l-§Ðµ êÁ|�ôÕ ©0˜Àa_®Î^îC~”[•)™8Š×Øu‰ õ~�¼3ú‚[È�òíÎ,ÑBiîÝ+hÖæï„M_&4Áé Ê|S¾ö2ˆ½Ï·â*@½Ð”‡,UÛ&Þ¥a�3è’pýzV 1œ²b¾2ÖŽO°3fÂóbŽ•äÊßuw{9[±„ˆ­²Tµ¸ÓùyƒÄ>ç¾�}„Öv€Öqà“bßNºmŽpÐø©²ÄpÃMìeÚ%a¨Ñ«·oXÏL¤bg›Ò›zýL Dö„ � rTή�Ž�Ö玿,2KÒ„b¢J�äbt0F«ÞV ]çò±“Œ7�X³²S¬V~­F§þ¶ Œç|%-DS¶-S/Ì+R*âóFjõ¤¯[ÿjé#›¨,j꜓™8¡ÝýèžW E u�MÁºp’¸jšÓP‘YIïƒÄÕäh2_]XPfÇÌ âw]:·ç°C�ÑÁpÖ-ض«9eêý¹àë&Ÿþ;ù¬[:úFC¥}ä*I¼@ËY©ßmⱯ“ÏMˆ"#eRÚù�äW«�rnÞ­~$§†˜PÈÕ¯ì+pS‰>›L\²µ^t¤ø€˜$À›Uµ³.jÑä©r«¤z#”dfŸƒöê1HÅ áÖÑ›A�uÀæ�ÞdŒŠQ^ÆÄÁf²êŒyùjàÒ÷œM:ïÇŽL3@¶k6íœâü…¦êã¦F§ûó—•û»iéíT•C&eïôey²Mà°ŠBà¹f¨‘k¼_Ò.S„Œœ…DõÑ2‹ö»²`åk Ç µ�TG# Þ-++¶Ë„'“Fà ’0뜷|jDDú̱ƒ™Ò§)…ôÂ%»ÅG¢ÐÍHI±Œ)„؆0)ò¾”Ô0^#Øž�¦{^¡�øý„Ÿ,²rtÍsDšÀÆÄî¬ó}ô{:;&§r/ùŠ›%í™ê}ÛU Œ!îT¶vµ§¥­Çø¥g¿YàJn°×'O§-ûò°ªÐ¹`Ñxµoy‰¡¸sÆ™ Õe.®¥ø;}xNÊ»ò#B¬_Å"Ôk¦ò‡ûE.Ƥ¼—Õœ‚ïdTø¬ËÜÈîúîöqÇ€îŽ]mK¿—=ô1c>kKÛ}4.ÇsÝ<ðZ" ñ6äéÌ‹¾GºÁä!meW€~ò%væ2úºLu(»ÛFj\ökô�¨j4‹W^u©bñ-# X¼@£¶fá.aËVæg…ÙçŒó3³�Æ ‡§EÊ!{‹�|¡çB–€Å ÓϾ”qyݺº¯^É ®_é‹8ON®y7!º}ú ؤÛzµJ‰Qõý›Ñó#˜ 5_L‰åé¥Ji‰Ÿ‘–¯Úõ½íM¦«Ž`$N’½“ŒÔxðvÚç£�ÞÚT!¾£/ˆÊݬí«I^]~ÒŸ¾6­C‡¸¥ý¶]„ú§˜Œ=u.U>rrÈ1¿ŠvÉ£å3ªã’V:ûiîj¸ ’ž»K£KC o3¨'ð£N©¶T8ìO¸LÑÚÃWö¢tôÒÁ€ÄÔ“Ö±…a˜ïð8‰”Ès]ÿ†9— endstream endobj 1025 0 obj << /Length 696 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$� !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·�‚>ìþÝþ�”MS >Ù_êãP·ò{=éÇsæ@öd”ôÇöçºkŸ˜xäœ;`ÝVY×`Œs4½JaÓQÜ¡n«þª‡í¡.’Uu9\ßèY6î>�¼ý<¶Ù´‡.Z.ÙôÍž‡þ“4>DÓ—¾²}Ý~°û¯ÒÜÑör:-d0­V¬²WÑÍÿ¼k,›þ8ã�óþy²LÒ»ðºÊ®²çÓ®´ý®ý°Ñ’ó[Å*²mõíLrŸ²?ŒÜÔqù¥ã• â5F8@ šˆ=�@Šð)&°  È8Ô¹€ÂÅRx u€Dº\j2H—†ª¡ÐV�Á¹0CzL]ø Âb°ct‘I ©g$`htÑ‹0œÆ\F„áŒ0ä†sê�‡á jd< —Iê6œ»õñzgóñºË»þê W ¤qÈ�’£+—Ÿ#ö•ñÌÇkÄÞ .‰bªs��ré…¤šáæÄç†bïmŽXú¾„Kß7ǵHß7Géû„û¾nb§>&jÊØ�µäuœ�¯¼ú•ñ1ÜV™÷•âÜãâµÇ‰Ou$ÕŸqWèS/%1{\øxB!€§ÔK(hH©—TЖ枃»J©Ï�ϯv×ÜëÁ=küÒ2ø¥UðKÏ‚_:~é$ø¥Óà—ÖÁ/�¿Œ ~™Eð+7¿èË¢/ ÿlì¡ÛÒ(/}ïö -+ZXukoûìÔ��E?Z„ãæÅÛKýqíƒÄ endstream endobj 1026 0 obj << /Length 695 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$� !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·�‚>ìþÝþ�”MS§“ý¥>u;áà¾×ÃÑq~:fc_0F)l®»ö‰‰GιÖm•u f8GÓ«6•ê¶ê¯bØÒ"!YU—Ãõ�žeã.ÉÛÏó`›M{è¢å’MßÜáyè?IáC4}é+Û×í»ÿ¢Ì�l/§ÓÑBãÑjÅ*{pÝìϻƲéOÞ(ïŸ'Ë$½ ¯ªì*{>íJÛïÚ-9_±eQ¬"ÛVßÎ$÷)ûÃÈM—ÏñP:^9À ^`„ª‰Ø ¤Ÿbr š€Œ@ ‘{@(\,…RH¤Ë¡&€ti  mœ+3¤ÇÔ…Ï ,;F™$Б€‘zF†F½ÃiÌeDÎ(ó0œAº1a8§ÎyΠFÆÃp™ nù[¯w6¯»ü·ë¯Îpµ@‡ )9ºréñ9b_iaÏ|¼Fì-ÐÐà’(¦:×ù(—nQHªY^`nA|n(öÞæˆ¥ïK¸ô}s\‹ô}sÔ‘¾oA¸ïë&vqêcâ ¦Œ YK^ÇøÊ›!¡_Ãm•y_)Î=^ ^{œøTGRý÷w…¾1õR³Ç…��'ÄxJ½„‚†”zImiî9¸«”êðøüj'pͽܳÁ/-ƒ_Z¿ô,ø¥ãà—N‚_: ~iüÒyðËÈà—Y¿2qó‹¾,ú’ðÏÆºíŒòÒ÷n�Ъ¢5�Q·ö¶ÍNÝ Yô£58.]¼½Ñ»á‚ò endstream endobj 1027 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷�³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝÛ¹�׬�“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·�.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx�˜ÏJ�›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌY�ÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vð�c­48¸’ï¼äØWtù]Í:P~`�áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×�Mñ?®Xê endstream endobj 1028 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷�³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝÛ¹�׬�“B|Æœ‚>âþ)þ;ëvÇw7{>o§aœIä> §·”óѲH˜ø´åŸ8‡ýøU¨/RʬǾÙï0ñ˜_xˆù•ÙË0öÓ…ŒxµBiÑÝéòE¿Ý.‰�Í�ïÇSÜ=Œ/ûb¹ó_iñxšÞ‰áçbþcêã4Œ¯âþfiåñ|8¼E°²X­D_RÁ4û÷í.ŠùGÞRžÞQhúV̪Û÷ñxØvqÚŽ¯±XJ¹ËÍfUıÿkM;ÞòürÍ­S®lÒ�Ö‹jU,•N±2Ô@  "À–,Àû  ð õTË[<€5€ €¦¨¬Õ –€ê1Õ"à†á›×cvÃ÷GÂ@†m¯gÎ üKÖÄ §â| +T|5f©øÚÕàlù¼xZÇ1¸YîëPß^ê ¦å¾dbË}[Š×”_Q>kUbwñ88Òʘ×]´‚k¥ÁÁ•|'à%Ǿ¢ËïjÖ�ò{ gäˆ�µ”ÓrŒsqkŽé:n8Ÿú7ÏxIuø†ªì¯³ÿ½Éþ÷eö¿¯²ÿ½Íþ÷.ûß×ÙÿAfÿ•ýtö0Ùÿ¡Ìþ!û?4Ùÿ�ɳ4åmFºåt«ñÏÑíÙèÎÓ”^z­è¥À1Œñö öì¢?z ¯ï.¾~lŠÿP}éL endstream endobj 1029 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥ö�Ɔ@LE"¤¶­šhµ×œ.Rˆ$‡þýΛ1i·Z)Aãç™yoÆ7?ž·“¬î^Ý$º×êÅ�ºËP¹Iþsß77EW]Ž®=?:W»zÜ==¨ç¡«¶î¬nóM±i›ó%oÚêýR»1ëÿI+÷Ö´Ÿ)àQ·;÷{ÒWÃ`‡ ý4òvÍù�ö¿o)Z«ëZqê/7œš®}Pæ^kMÀº­óîݧ`ê¹ÕtTshÚzðÔ+ä&TuS�ýŠŸÕ‘ @ñöãtvÇM{è‚ÅBM_hót>XÙ]0}j74훺½ª"t{éûwJË¥ªÝ�šÑ¬�û£SÓïC]·w½S!¯�¨©ºÚ�ú}å†}ûæ‚…ÖKµ(ËeàÚúÛž‰¥äõ0æ&”«çx˜™Y°F\20/0–b“Ò# “!Ú‡\§)&q)€% 1Ϲ‘NÐÔ"Û‚%”’4¢8�1`rÈH%ÃDdè‘åÜ#C� ýйk Ю%£íºÀÜ"l é%²Ë€ìR„Q ƒF'b=:SýÙäøuX¤ð$”Qúó:ú\C¼–AfpGÇR~m%^!N%ί$†h�³³&„ÕšñR 󛣿#Æ¿p'XϾ¬½>ÿ‹A£Iä Â}3N¸h2Ž5ó¯gNÑE'�b«£œkýkåØ¿sè ý»¢%Æ|Vâ ¬áž!ü°¡äÀË3™¬?Ðfc91˜ÓŠ—9Ç|u 6ãZÖcW‚Cƒåƒabî ýd1×®eFæ-9žAgê¹�Ÿú÷Æ3•ZÆ=üI=ú¤ž ç6-Ä7p¥Ìçœã?)pe…øÆgT<ôŸ«?}øpq¹\¯ƒê2 tSð Ä·¾ÿ¦u×KªïzTñŸo·ñþÄê© þ…çr{ endstream endobj 1030 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁnâ0½ç+¼‡Jí�b'$8B ‘8l[•jµWHL©$Q€•ú÷;oÆÐ.Z ¢ñó̼7/Žo~<¯GYÝmÝ(º×êźÓP¹QþsÓ77EW�ö®=>:W»ú¼{xPÏCW­ÝQÝæ«bÕ6Ç;J^µÕÇ©vç¬ÿ'-Ü[Ó~¥€Gݾºß£þýÏÖ#úiä½6ÇÚ¿ÞR´V—µâÔ_n84]û Ì½Öš€e[çݺÁØs«ñYÍ®iëÁ P[È L¨ê¦:ú?«=€âõçáèö«v׳™¿Ðæá8|²²»`ü4ÔnhÚ7u{QEèúÔ÷ ”æsU»5£Y7{§Æ×C]¶_?{§B^QSuµ;ô›Ê ›öÍ3­çjV–óÀµõÕž‰¥d»;ç&”«§x˜‰™°D\20-0–b“Ò# “ !Ú‡\§)&q)€% 1O¹‘NÐÔ"Û‚%”’4¢8�0`rÈH%ÃDdè‘åÜ#C� ýŠ©K Ð.%£í²ÀÜ"l é%²Ë€ìR„Q ƒÎNÄúìLõ¾Èðë°HáI(£$ôçuôµ†x-ƒLàŽŽ¥üÚJ¼@œJœ!^H Ñ:ggM«5ã9¤æ7F7ÌFŒãN°ž|[{}&þƒF“È„ûf*œpÑdkæ_Μ¢‹NÅ0VG9×ú×ʱçÐúwþDKŒù¬Ä4XÃ=CøaCÉ�–g2)4X( ÍÆrb0§/sŽù4êlƵ¬Ç.‡ËÃÄÜúÉb®]ÊŒÌ[r<�ÎÔs!?õï�f*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñ�Ϩxè?Wúðáâr¹\Õiè¦àˆo|ÿMë.—Tßõ¨â?ßnçû«§2ø Ý7rX endstream endobj 1031 0 obj << /Length 701 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥ö�Ɔ@LE"¤¶­šjµ×œ©D’•ú÷;oÆiÚí@ãç™yoÆW?×£¬î¶nÝjõäÝi¨Ü(ÿ¹éƒ««¢«N{×ï�«]}Þ=ܩǡ«ÖóU±j›ã %¯ÚêíT»sÖÿ“î¥i/)àQ×Ïî÷¨ý³µC;²ÃH#ñ¹9¾Q·=E€ºŠ“¹áÐtí�2·Zk–m�w{H?cO¯ÆgA»¦­¯Am¡(0¡ª›êèWü®öäŠ×ۯÚ]ÌfjüD›‡ãðÎÚn‚ñÃP»¡i_ÔõEÁëSß¿9HP:˜ÏUívÔ�æ½ßì�›ëcÿù½w*äµ=UW»C¿©Ü°i_\0Óz®fe9\[ÿ³gb)Ùîι åê)^fbæ,— L Œ¥Ø¤ô ÃdB@ˆö!×iŠ @F\ ` H ÅSn¤4µÈ¶` ¥$�(N' ˜2RÉ0zd9÷ÈÐ#C¿b*À’€´KÉ(@»,0·[Bz‰ìrÁÅ »aà³±>;S½nòü:,RxÊ( =¼Ž.kˆ×2ÈîèXêÀ¯­Ä Ä©Äâ…Ä­svÖ„°Z3žCªa~atÃüaÄø'îëɧµ×gâ¯4šD¾ Ü7Sá„‹&ãX3ÿBpæ]t(†±:ʹÖVŽý7‡®Ð;ð'ZbÌg%ΠÁîÂJü°<“I¡ÁúCm6–ƒ9­x™şQGÐ`3®e=v!84X>&æžÐOsíRfdÞ’ã t¦ž ù©ÿn|0S©eÜsÁŸÔs¡Oê¹pnÓB|WÊ\qÎ9þ—WVˆo|FÅCÿ»úÓ‡×ËÇ}P�†�® ¾ƒøÀÿß´îãšê»Uüðýv¾D±z(ƒ¿Çt~ endstream endobj 1032 0 obj << /Length 702 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥ö�Ɔ@LE"¤¶­šjµ×œ©D’•ú÷;oÆiÓí@ãÇ›yoÆÆW?×£¬î¶nÝjõäÝi¨Ü(ÿ¹éƒ««¢«N{×ï�«]}þz¸S�CW­ÝQ]ç«bÕ6Ç"¯ÚêíT»3ëÿ¤…{iÚO tÔõ³û=ê_ÿl;;´#;Œ4˜ÏÍñ�ß?*BÔ¢˜þË ‡¦kÕZ°lë¼ÛÃý!{j|ö´kÚzð6Ô¦ªº©Ž~ÅïjOc@òúýptûU»ë‚ÙL�Ÿèãá8¼³»›`ü0ÔnhÚu}á‹ðõ©ïß<(Ìçªv;*G=ßoöN�¿·öAx~ï� ymÄQÕÕîÐo*7lÚÌ´ž«YYÎ×Öÿ|3±¤lwgnB\=ÅËLÌœ€%â’�iA€±›”^a˜LQ>äO¦zÝ 4èë°H1“PZIèáuô¹†y-�L0Kôµ•x�8•8C¼�¦uΓ5!F­ÏaÕ°¾‰Ðºaý0büB;Ázr±öþLüƒG“Èbúf*š˜¢É8Ö¬¿œ5Å�Š1Xåœë·•c¿çðú½ƒ~¢%FVâ ¬áš!æaCá`–{2)S¯~ê÷�f*¹Œ{-Ì'õZ¨“z-œÛ´�¹A+e­8gŽÿ¥ •27>£2Cÿ»úÓ‡ÌÇ…P�†�î ¾…øÀÿß´îã¢ê»Yüð w¾I±z(ƒ¿Ôãv© endstream endobj 1033 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥ö�Ɔ@LE"¤¶­šjµ×œ©D’•ú÷;oƤÝj¥�Ÿgæ½y_ýxÜN²º{q“èV«'wìÎCå&ùÏ]\]]u>¸ötï\íêq÷x§‡®Úº“ºÎ7ŦmN7”¼i«÷síÆ¬ÿ'­ÜkÓ~¦€G]?»ß“þíÏ`‡ ý4òž›Ó;íßR´V—µâÔ_n86]{§Ì­Öš€u[çݺ�ÁÔs«é¨fß´õà¨È L¨ê¦:ù?«€âíÇñä›vß‹…š>Ñæñ4|°²›`ú0ÔnhÚWu}QEèöÜ÷ï ”–KU»=5£Yïw§¦ß‡ºl?ôN…¼6¢¦êjwìw•ví« Z/Õ¢,—�këo{&–’—ý˜›P®žãaffIÀqÉÀ¼ ÀXŠMJ�0Lf„hr�¦˜dÄ¥–€ÄP<çF:AS‹l –PJÒˆâtÆ€É #• �¡G–s� =2ô+æ¬ (@»–Œ´ës‹°5¤—È.W PL²KF1 �ˆõèLõ¶Èðë°HáI(£$ôçuô¹†x-ƒÌàŽŽ¥üÚJ¼BœJœ!^I Ñ:ggM«5ã9¤æ7F7ÌFŒáN°ž}Y{}&þƒF“È„ûf.œpÑdkæ_ Μ¢‹NÅ0VG9×ú×ʱçÐúwþDKŒù¬Ä4XÃ=CøaCÉ�–g2)4X( ÍÆrb0§/sŽù4êlƵ¬Ç®‡ËÃÄÜúÉb®]ËŒÌ[r<ƒÎÔs!?õï�f*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñ�Ϩxè?Wúðáâr¹\Õyè¦àˆo|ÿMë.—Tßõ¨â?ßnãý‰ÕCü_er¨ endstream endobj 1034 0 obj << /Length 701 /Filter /FlateDecode >> stream xÚmTÁn›@½óÛC¤äàx ^"Ë#ùÐ&Š£ªWÖ R Û•ò÷�7³ÄiSÉF³�™yoÞ.{õía;ÉêîÙM¢[­ݱ;•›äßw}puUtÕùàÚÓçjW�o�wêa読;©ë|SlÚætCÉ›¶z;×nÌúÒʽ4í%<êúÉýšô¯¿‡Îúi$>5§7JøòN .€âäŸn86]{§Ì­Öš€u[çÝÒ�ÁÔÓ«é(hß´õà5¨g( L¨ê¦:ù?«y€âíûñä›vß‹…š>ÒËãixgm7Áô~¨Ýд/êú"‹àí¹ïß$(,—ªv{êFóþØœš~™ëãýÓ{ïTÈk#zª®vÇ~W¹a×¾¸`¡õR-Êr¸¶þç�‰¥äy?æ&”«çx˜™Y°F\20/0–b“Ò# “!Ú‡\§)&q)€% 1Ϲ‘NÐÔ"Û‚%”’4¢8�1`rÈH%ÃDdè‘åÜ#C� ýйk Ю%£íºÀÜ"l é%²Ë€ìR„Q ƒF'b=:S½îòü:,RxÊ( ýy]Ö¯e�ÜѱÔ�_[‰WˆS‰3Ä+‰!Zçì¬ aµf<‡TÃü&Âè†ùÈñOÜ Ö³Ok¯ÏÄcÐhÙA¸oæÂ MƱfþ•àÌ)ºè$P cu”s­ßVŽýžCWè÷ü‰–óY‰3h°†{†ðÆ’?,ÏdRh°þP@›�åÄ`N+^æóiÔ4ØŒkY�]  –†‰¹'ô“Å\»–™·äx�©çB~ê÷�f*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñ�Ϩxè?Wúðáâzù¸ªó0ÐUÁwßøþ›Ö}\S}×£Šÿ|¿�—(V÷eðcWtÓ endstream endobj 993 0 obj << /Type /ObjStm /N 100 /First 948 /Length 4323 /Filter /FlateDecode >> stream xÚí\ÙnG}×WÔc�ºö °ä8É$vËk?PR[bL‘ I%v¾~έªn6׈²¦�Ý{-çî÷V7�`‚E#™ÔGÅ”s8j¦cÄÑ0«Ž–9gqtÌÇ€£gQK“ÂQƒÈ¤Œê Z�‘”aÑbHcÑÎ*&mÄ$V3éf±†É`1�µLÆ€yp¡¤Â8è nG˜ÒSÙÈ”Uò :l,:É”hƒ‰U”˜Â®ÀÌѦe 6–i-©�cÚftži€Ù¦½B™ÆD/@m@w/™‘ݽbF�èè53Ú£»7ÌXIm,3ÎPÇŒÇíè=3Q€´³Bƒ™•˜1¨Õm0±Å@8QÌZLƒf8‚<ÝA’%P18æ¤ÀÁ3§H.`„Ó$€¨˜3˜Á5g!¶I4½"zEboD¯$HÊ"¢ôFC2B„Ôt&YИgŠ…Šp†ÞZˆœ]$'¤ð`%NIÚQSKpBJIR˜@JíitpUBÖ4¼D7%� ÑMYð4¡•Š©¤ • “A]$ Pœ%ÆklÒx’'$ˆ‰¤„@qfT„X!­H­ÑÃj(›" ¬UxJ`Á[° L–6y À{éDÒ:Sô gð4é±³’‚ÎpB异J@½¤ lÒSb²#.xBîa �µ²Q$WÄ0mé4׵ב8M Ð>ÝÅHºÁd‡3ÈS êD*® &éIIe¤ÞæëÂYpîà›oøËÏ75ã�ÆãÉü€ŸÜžÍÓõOÃñÇ~4™^ÔÓS2lñžÏàǧ2]ðõùœ�‚ÖÊ…4[Eæ„*G<¾R*¢Ý#öÍ7ŒŸ0þÝäå„ñÇì«›Áe]õ/öïàÿ€¡rÐLˆ òp4 ºç‰•V~;­„u•…¯�Ud¨�soƒ£® Ù;@˜aD%5ùKYɘT»d VTPªžA¨X‰à t¨|4=�°“C�bz2Y2våª{‡®àz`¤“Gò*•!{•PÔ ûUEPBUÎ÷% PG™„²+S‰¢Ò®F+X'‚— •@”5Æ©˜‡‘ÂMîpSè!4X/ERߨ{|%o<<ÂÒFØd„‚ê!l{m*Ør=@2fÈwî² ÷� $@@JU{�Öˆ"¤„ÀÔ++JK½„oD(Gp†Çð%ª eO �ÜÂÅP)øHÝ”‹Pß'-tÁ("&7a¡ËEøNÕ'D¬(_‡Sª�L3Ò¤}e�YôÄ —Di²d(�xId_EA|'ürBÂ*�"�¬È)¬$eòŽÄdw€+—ÒS¤1‰Ã+Ù¨aPT¸ ³Bæl�kzªV´_vñ!>¤mÀ@Q®8„l‡£�§êÎ)‹ «'FH]Q)ã(f£ö5˜[%L¸¯ûRòÕp (À«€ú‚<UeNÀNC_"‚•»�‚#ÇåQV¢æA¢ozÒJcaÖ9¨#ârkGU9JíbO �ÞR9l-2KT�Æ#ˆ؈‘=qBƒb‹\•ò: 1P¦ia¸ÊîHo�xø„0‚•j ݰÂôB#£¥•xÊ*-E�R'2 …µ&öVmJpŲn%¤wIC>dE&G¾:ÂW#†aFŽ:ô¢ÉgLÐ)š7ùŒ!p¡/N �!ï@u§$Û@Ý©Á˜—¥B¿à,‚� nÔ÷Ìãib�Ázð¥/…@&å$ùÎ�2}K«¯VëTO¨¼ •^¥«0¹G"¡cª}Pvô³Rf4²7im)+­CW´JMÉ]ÜY«‡Mo�N¯À`›Ò[Ádœ1öŨ_Zà ¡’I%OiÅu˜0=- Â¨¬•LC,•ÁF žf_!‚ï „GÍmiu\S¨‚ƒ¢x NÀnå®2Ø<äòŒÑ˜  i© F–Mï-´£úËõÄ 8éíJ²L‡ÄNƒ3Hð”ê‹’OéåP€P´x q Ò;+Ðøð T¤à P€ô–eç;å(n„vÅN!ÉÙ™Pýd¡ �ô ¬aƒBÒmÃ]ùð˜�ÆH³¼`üí»_ ½�FM›Æ·ÌE-‘·BD‘ö°Ä‘=9‘ÉèED#ºÓ+i/¨“C’€2ïc&Ø–¹ˆFC8‘É%z7ì;´h6í;¢1ˆÍ> réi‡Î!`ï ž…b§3ÜiÏwï´O/ÁmÙîÞíƒ¦Ýæ»Í|‹;�Æ‹k‡ O–ýƦ*½<¦–´ŽQö!$õL{Ò;kIäyŸ[$Ri)¨Ùw@æÙ|$�rÖ%I%�ò¤ŸVeµ MCŒ§yȧÃüiïò8Ž^µGÒ9z‰‹&P[zoD ë"Á2…¦Ñ‚X‚‡\Z�# ûòTÈ´;©­,‘ºaßa…³aßp_'å½*j䈙ÿl}nÅx“=Ðg9(+lŠ*�Ó&òÝ`X2Š,=MÑ.$ßô�žË˜>J›F¦qi ´Mѹ3‡1Í�Ú–±ikúüÝÖ¶O_ð”ͺÒd´y•l._ƒïCºN“û PëÜ÷S¿Ò®íWÎéÝW36Ýo@Іr¨ed ”ÝÜžj‡çt EÝ-‰€ž7ý²iÌ)‰1j‰<§ Òm2ãIŒMZ r—¢M¶‰‘žÓWÍ8$¦&áIIBI^š9R’€þI¢î•D‘LÈ ÊäD[ƒltëK ’>²jÆ1Þ,dce�Í8]ƒ$¬ôÍ^c‡;í1i˜J÷ïk� îGÇîß:džÏ];nÚ'‡Už5[âO§_»àÏ?nõÿ­¡€�.³¸’k,’HDB{ÃÁ§‹U)¦ÍŠÂÍ"ú6=Õéà< #Z Z’ŽíŒ^Ó‚SAAo’š{dë4j¹×Ú%µK‘¢cóÎA™vKúÞce˹p#ÁÎÖ•˜*Rn$¿º0ßmÓÕ¦¢ÛÔ“T¾+ýUµ½“ºÇ´rÿ}gõƒÖ׳óéðf>™æ5†gƒk<9y÷äùÑë¯�Ÿ>ýA < .gÌäGG“OìôP+v¨èKla@¤¥µ‘G³ózI}ÒYî3å3>«¯‡™„YýP̆ŸxfƜϯ¦uÍçNø-¿_ÆùdZó?øŸüÿÌÿâÕÓÉŠ:é}Ôéåã§oÞžu:@�Ž&£‹-ê„„ýP _~˜‘×Ï‹á(ÕU¨tÙ*”’ÛJv5Êjõ%uÖjÂE+|’÷’È;¢&A·2n›e—ÅÒc«ŠÖE°W˜yõëëçGÇ«"8žŒ·‰AÇ,úH\rÍ÷”ù±/’›/—ÀV¶‡„vÊ~1ó—oýüv“”ˆ§[$e`0Š~Ÿ&é7S÷¶—ÃØŠJ‰­¢ú! c°ÛSf i$Q ‹&à6qt¾ÎÁÏ+LÛ+¿xõݳǯºLÛ¬PŒª`óOÁbþð«pK.sK.sKoÑë`;¼Rz·ZÿgI±Ù².†õ´ž g‹àu¶�Ùg·£Q½�Î'7Ÿóã……Ôã òõkqªXÍhƒáü¶ËtZ”oD«!j¯hÔÎsGsSr?Í9>~ýlUsv˜*h½áK´ç�ý ;ôç:³ê».pajÝ<$ 6[ÞÇÖöîèíî‰Ô†dàÛñ9”d| . ?|€ÇçõŒ�ª¤s#Á�¶zÑQ°’]•\‡éØÍf6’ÐKÒ¶Ì–¢É…º¬^>±‚ˆËd&ÍOf�´0écæfÒûFM…Mi[æsIí˜3”`îmípØË–½ÈO;65ëÊ`‘àe=èºÙß:â¾�Éeg{Û1˜NÒÛ¤ÀyibãL²« _|.< -³.\SÆ-\ýPya¨ï×m¯ó5ÝD2v4˜Õéó�µ²~ÉTóïpIµø“át6'Ë`Í~40£7ËùÕ,ýî75}9y5†¬.’fnÉ‘vAZ)È×…UDÆvÑE‹Èm@äöG´ZI¯B’b’î ’Âu Å �üþ�Vêß5Dj ‘êB"2ZH~¤°?¤­5ë8³n‰_j!² ˆÆ�?K¿Ö^Ç÷Ç»µ(ZûfK¼T² Wß®ûÃÝY@¬A»!«.du'ÈòvówÙô*lµfHÆla5ý‚»ÀVûÃޚϮÁU»¸ ·Üå²¹\}¸;’¨5Èf]–w‚lÖ!?\Ö3dR“[Z†:Àõ”òˆô Ò?/(Én á,ò¦ÒÛLg£gº<×Ù^ÞßkmdÄ–A­ËGW÷å¹·_0IzY‚Ab 3™w8†|”å~.Gï7‰QeÐÃh ²3Ûèç˜éh¿€cË`Ζc¹ö…Ÿ¿-4A~Á$¡ ^¾u´EàÖd6Ú<8ýa’½&qÝI\a—3y2çòàÎg™ø¼œŽ²<Ü_T×»<™ù:ä—,!›É®IÔÖIBÎXù4t× z ª_²6�é¦?;’Ž¡èfö éŽdÉþ-?h)iË,.{ÜôJæw�FËñ¹s£'-Vºý|;¡&˜ÿÅŠ;"ÿ•þ¢Iº*uÛuˆôž©&I{„–ñ‚„.ŸOë?à—=ZîÞ$ÂÔ]-wÝÞJˆM½eÓ[6iòÆÞ²IYŸÑgºjåMVK6ù�evŽ¥–Æ›ÆÒ‹±Äæ±RïzÿÎúc" endstream endobj 1039 0 obj << /Type /ObjStm /N 100 /First 938 /Length 4881 /Filter /FlateDecode >> stream xÚ­\ÛŽ¹‘}×WÔ£{�yg0Œ•åYcà‘F�f°7 ’IŽ;£Z­…?O0+«2³˜Y¥Ñ>¨;‹—à‰Á+[’è ’ÌA ‰ßxvú ½;(ð[4·;:éðÛŒ'ük1ǺƒÓ˜cÕÁõB:�ðiÌ�æqƤÆ\ÁZ¤Tø¡ EzLU£<ÖPø  y!c¸ã¬/¤à%%ú;€‚0€Óæƒw‡€¶€^¨#ƒS(¤„e4Å˰BÊèæ*hô )�PH´C!e¥9@!eÉ �rø­1Ž ) þ…T€\Íýêh�Å1DË€ßÜÅZ¹ƒÖ�U´h 3Ö0Ê:æò´S’ŸäAûÐtÄØ  jc¢ÔÚ°´––Ÿ,ÀŒãÏY&Ã@"é&…V¨ÖáÉÂXZñ\+¶ÙO`š…å°†Õë©�ƒúA3*kA±d6°aO@ ·qtðÆ5)áàCCþÈžáä�‚óü¤ž�5àRAkž ¥ƒ•m†…ñšæ#ßžxš †Úä;×$byÙÜRð((Å­Íešs ßüɳ6¬°6¦µBc÷�hdSͳsiÛZÙQms}æ ¶ÖМŽ™y«$ÙÙ-càÏ6H¶Óæd#�Å¸æµ ¿ó²µòž �qò¼� ¯ÆNêí¸o2×0ÞóB"à‡§ñQñ®Tôâ�|ñ‡ž)ø°gß½øÃK<ºññm|*žÛn??•ÿmÛ·}ú·‡§Oè Ç�ßG|Âö?½züŒ™¿7/þô§Å"ö¼ˆZ.2‰Küi5[žf{Ú›í� ¼)ÿ|nqèRìt’eú²Ž³{Hà§Ùb�,»”E ê&˜�º æD�^-éÎöq+ûØ…ò®§®;ïÔîl1ì¨'ëlK{²ì ]\ölkú²Ž³{f°g3Ø]3è’•Û…Ž*oy°9›Á¬Ì0-2.izêš³ŒÚ�½0ƒé™ÁœÍ ©/ë8»‡DŸ‰×f�:EsYvIÝs¤ÎЮë³µôÚZ=Õ™jµ‘FP“ºGPz‘NŸŽ äz‘³EÔÊ"âD+Aó%•‹%'’Ž;yɃ]/y6œ\N.ö�tVäÙpÒôg�¬¨ÞŽ‘gÈ¥ hau!úÉÅ9JžôS«5ÄÙnbe·Iìq‘žcгA„êÏõ=Ÿ'nm«G Ÿ–KŸ>¢:ê*hO×p2FXÚ‚æ®sL‘Ë™'CÑ�Ù°…Žœõ*O/JÝÐ霣iC,¬1íÈq9Zì©öâÂ9«¯“úr=3'¦—ÓÏ)}•ÑÍ\ŒïãœÎWÙ|1ÓÍøŽeÎ)z•¡—bæfê¡9çêUª^Š™ÓßËÓç4½ÊÒ 1‹ÝKÑç mwX]$ë^®>§jÛ§¸Í´VÏw�pWþ1ç•ÞoçÞï—ÞïW«�È7»Þ¿Hнü|NÏz×­¹º—ªÏ™z�¨—‚‰ÚtLpο«ôÛ˾çä«vY_dâe"^äáý4|ÎÂûIXÍYïÂ>çÖ]Öç\©n}p>¨-ƒìâlÔ;X�ÓWoâñ4ÛI§M¿ëv‹CÈò ²8ÅîEøs†ÝXjÜBsŒoâ¯åÓá¿÷êÇW÷ï|÷Ý›¿ÞÁ¤ ÍaÖxÿÃÇòáõ[ô‘ûþò˜ÿþ9>=ßÔè‡ß}û/_¿ýþ[–põÝ›÷?¾üþ{nQÇ–çòë7 £×þŠ=üúð¼Æ0�ûûèØ.î°¡å\¢ä–ùŠ×°³Í ~Ö`¸�f  ãN�Ã:­8 êcr<Ùͤyn˜¯Gw|3kŒYŒ ß÷æoGö� ß|ûïïù#ua¹qÄn½gq ó[˜Ìè™Àû×?üå§ï_¾ûî¿~üî‡7Üif�oxýVq£[7Þ×â/¿”_îëãÓÿð?òT>>=æòéÓÇŸïëý§ÇÏO¹Üׇ_Ê'Öz¾È�/ß�šòUÚJµ5ö匾ªýxÿüq`�G`È÷?½ÿöówÔå§÷/ÿÚ\S�ŸãG¸ôððÏo^Þ|Xµýùî@ëq¯îø©‹ø a>ünþGüø\žØý�ìM- ]†e“æ�µl‚êÕDvY»lbG k˜³¥g7z¶ðR,{ïqñòü˜ÿÿ–§è¸ëÃÏŸŸÊ7ã?´M>v<|Ê?ñIºÙçû÷?½~ýòÝrû&\àX�¾€=Ãc#ca?|wt�Ç�ñéAÝß?•ŸÑyÿð¡>ÞÓ?îvŠ ãÏ¥) ͼA0µvÞÂaG\8Å Óiìø±ƒ·œs±š[ n ó˜ÞL2¶8n¡yK³ã¼Óª§QÀZÄ’s�²Ì|‰f笩›ý¼…Irs1Š5v¾�‹îΣú¸Óã™?'L1=~N˜bzhN˜bzh•5kª `¼êiÔ0ÐcÅœ N:f¾¦=vÊc è± \ôØ0gYCŽS}Cò¢§Q}\ô83WTƒç0@�£¹jÐãÅœB z¼^ŒÁâÞô ãUO£úÀ8/öœ=ÞÍÉ0-i1ôðG³ÐC‹½` Gp×Åu‚…A°ÀNs3`'„9Šyç6â¸ëæá‚~Џ¡ïõ¼â4¨�)ðák2ò â×/©…-­D§ý>ÊRtÐ&’Š­IiR*•”¯YT“9v™îLc3E€W6i=$¡3 Y < ºjbç9í¿ÕÌ\EB$“ƒÉI)t„Eâpá¨;Ó:ïéê]’ÞÛ`C©Ñy•�±2ZÛ%¯m€/vIòR€3ÖˆTŒ(2C�èü+.Yésäx#\WŠÅïd!cr¤,Z¸D:$/œs·´×EÒAî ¸�8Â"ƒY—ëÅ�…w5Q¢v®è%í‹0çüèäà‚ö¶æj† lTCÒ*Ê{%öEXø‰"rÒ“'.po�ŠJq ’ ‹�ûRžûò[6¾�„¸½‘ª„!æ(`© ³³šjòIhö¹:Qòu�5{/-‰ReQÙ•RKΖÃ)?m‰î(d†›–¥CöAèûSô,Bï‹Èä’©Ùda«›@L @àå�©fö ¿/bd]öZG †"ɃÐ*$ŽÆò CÄR%êN›(…”aO�cÀx9Úñ‹ß`›ßŽcËA>*OóðºÜ�óÞû(|r¶Vm¤�²º L2Qzk¢MN9Îg+Ã/ç£:÷�²«y(…¿ý®•R¬DUj¸qä|H;ó±}ò�¼ËÊ:°†\r¨bB�Yh^ßíÌ¿¾½W;ó½¥PUV1 ›l*ƒÍÒæPL3^°¿xÚ0ö’çß(ÿ#Þ•½Û£)˜"ÃPc’)i¼HRÙ8´£’÷{ó=’Qn�¦Ã`U¼)Å «BVÔh6;ó‹xdCp¹�R¢ÑÈËQ’k닽ùÒ« W1"f§XõE&)cªµZŽO~\–ó+¼>‚Ý”Œò4Ø‚D®I$µ <_Þ`æ[,ñì;ÂE’u¶·-;�½– ¦q~Ae�*68‰P(¹„àîA ¥fÞjNå ôáZ pœ*°)Nð…f"ìHkSöÁ£ò)hm‚¥��ËêëRTÒøŠe1B�EE•K­Œ%Üì·Xë«Ð|‰ã8=8‹¥Q)ê(Qi Y!˜b?YœšÛ— þú&�8…M‹Ò²jüª�, ¯£Êú&åú&D5�r%WP Ѝ¡í ¤1Áùv£u݉QfKasš\ÈÀUA fõà9¾²É¯;¡êÌ„”"µÓ3BqöÓ�¸€µîº3Xª‚’¨j÷Z†äsÊHÁP‹5²þ 纵¾ Í—8N€»©¨ L[”NˆaED9˜’r»5W Jƒ ƒÈA8O”Á;�üîS¦"K\ YÝXˆ2¾Âºƒ´|§ XƆ쩒¤’ˆ÷§½îÄ…2€Ä=c¤OÖÁ ø6¨ŽÄ§ï¯K‰ÈhÆgãµL¦HdU�*R{T “Oöþ:/5ð5p¬©9¡êG‰MA%¯°Þ�["úǹn­¯Bó%ŽƒlGVÄX¬,‡BL�YI»ÊS× Éü‚Æ:¿:n‰O%þ{-  ˆ1V“—Q¹b4�è4Ý(KÕ †šuðQ ðUaŠÅ‘‡½˜U)•e™e58þÆ PÖ„x—Û½¡$ø/Î�…ogä�²<âC¨Æ© ‘^óºE´uÒÔpÉ/pšë–úÀ´ï:=‘u¿°¤]]ô8– v9¾#õc¦(VóV·"N]¨�ªF1¡¨Dœ€)¸ZD-^ªF™½QöbG4Õ{“ƒÇ –Lr`OûÁæÊÚß(«®eN…À1'lA±¥pRW8A�<–5ÅÅÏiVšs):}¸êá Ýîšÿ·±}¹Î¥Mç#T«å…î€T­ ?”ó.=ÞØØnÏš¾fšu½:ÞóhÙéa\¾ût‰õrÞž‚¯ŽZÝ]”ï&Œït� ZÛíj—L¡ÛÅ�îvñ�G'M\`½œ·¯`»ß’¾Õ4¨>t»*õ Ú&0ÈnW{ÛÍv»X`» šK ÚîMÓr¿Ôݦˆ›èàM;XyGÓTÞÑDÛý¼ig3q1vö¾AÞ„¾Û’püòÊôîÛº_�aÃm…6=™°ÝÏ6ß Kz$ÚY¹ÝÏÛÔª[ˆw[®¡G‹9«·�ðn·ÝýñjНŽäV¿ûÕv?Ùß c?Iîº;' Wˆ‡±Eú®?öóÛcRôû�ãµÜê×c¿Úîç¯eµÞîç/hµÙ'â¤É†„«Dèñ(âµÝÒÎNÞèí~jÌv?¿bvä3ÑÆõûÍ‘èþ�±£É†„«D˜£Å\Ø¢ÛÑ�ÄÎfŠôv?3Ef»Ÿ™ÚÚæè’×öÆI• 71Á_»ní îço`ûiaì篼i‡¨ÀDnÌ·£ÉI¹­~=öû[ˆè‰QÂU"ìèQ¤6�¶½AÚo÷óKÝš®µ¾;J8ýÛÀÙíÿÐáÛ¡s|PÓƒžÌô`wÿF­ó‡4§eÜ$ÂO4=„ãƒ� X¹÷÷/¯öOkØ ¸�€Û ø±èlÿ%ÏñÁï¼£ÿÕïOž MJÚII7)é&¾Ýûò݇þk�¯müŸDOE endstream endobj 1104 0 obj << /Producer (pdfTeX-1.40.25) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20260730154121Z) /ModDate (D:20260730154121Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) kpathsea version 6.3.5) >> endobj 1094 0 obj << /Type /ObjStm /N 10 /First 88 /Length 459 /Filter /FlateDecode >> stream xÚ•“M‹Û0†ïþ:î^l}KÁÐz¡”î&!›ž–`[†|,kçÐ_YÉtÛÚM[ry2Öè}ßÄ(B £ SrM"E¬X¢t<DKF£”�+Õœ—R'³Y’}i뎼0ªePX…~­4‚A°0À&ÉÛCÛ‡þ»ÎW}{:¦,å÷ä®ëßÎU¿\<-yY®ü.|)ËöØœJ§9P¦¼ó²ò­å¶2žÖŽ6´nœošûM’ç¿83ôªjGèÞ¨‘³^D­xQ[%ÓÞÔZ:!•k¸`C’ó£©Hå„=“Á1“�+XŒ`ÙÈÞÏ2EÍ÷êÇ”‡Ÿ [œ‚Å)Xœ‚ÅZ4gÍ”ðï*0R/Rb³ u{û¡q*Î¥.&.Äa p߀I“ÂhÍź(Ÿ×«ÏóOÿ´5ÀÁn ì¯æ�Yàšexƒóyãºß…žø€Ã-X]{õ$+\ïö§]’-Ý·CTÄ I¶8÷ûöx)ÙKiî¾»¼ÿøhy:Õ>ûÚy<‹�në÷Ýl–Íχî…xÎ\žóoy.#<äù&xɯþø!Z'œý°øDš6÷ endstream endobj 1105 0 obj << /Type /XRef /Index [0 1106] /Size 1106 /W [1 3 1] /Root 1103 0 R /Info 1104 0 R /ID [<5297C48F2E16526F4FAB6C05D04D5CAA> <5297C48F2E16526F4FAB6C05D04D5CAA>] /Length 2614 /Filter /FlateDecode >> stream xÚ%˜[h]YÆÏZç$iÒ6·&M›¶i’ÞÛ$Mڦͥ¹'§IÚ$Ý=MšKÛ4) ‚ Œ—Bq„ôˆƒ¢(#èÌÀÖQqQgë Î¬g‰È¨(T‘åÃ8à’ñAôatÿ¾yùe¯ïìì³÷ú¾ÿÚÿ³r¹\î6—³9“ËÕer¾Þæ u=hX´U´n†yP@Û@ëbX*Ñî¡�aXvd—-ÐN3¬5h h§î»ÐN¢�d¸Ô¢�A;Á°Ô£]D;ΰ4¢�¡c¸4¡]A;ʰìE»Žv„a ؇VBëd¸´¢-£u0<¢ÝBkgx´¡ÝF;ÌPhG»‹ÖÆPèDÓ¼èßôåÙ]gÐ2Ô�GÛ…¦¯ÔCŸDëBke¨ ;�Öƒ¦ÛÕdw¡õ¢íc(£zÐúÐô¨gA/Ú&Ú^†}àœÍÙD÷¢i:. Y´&†ýà"Ú š¦ø@[Dkd8†Ð–ÐdÏ0¸œi©rPÏpŒ¢U¢ÉÚ10޶­–á˜D«AS,¦À4Ú´] g@­ M‘ºfÑZÐjÎ�y´ËhŠãUp mmðˆ6�¦(/�ëh h¤=›¢ 7Ðn¢© J Ú¨:¢Rì2XAÓ=«„n�U4Ý3Uf×À:šîYå·n£ ¡Q¡ö¸‹–ÝP>Üg¸ î¡%hÛ ·À6ÚM4 9ÙçŒùõS9>¸Å÷Ðø6ŸÝF¾|�ëyîÔ«ØkM®²MËOéUìÌ‹gÂ<3é™bÏÜ{Lñ»M®¹”­*ûeèû\†½¾ö� /=Îð—‡Ùm;ÃG5Ã7+ô Ƽҭ£:îEOyƒ!Ñó�Æüè‡94ŒòÄÖ“gOÐ=à) OÍxŠÉSežòóÔ¥§V=•ì©POí{êÒ³ZxªÑ³¾xjг"y*ϳ†yêͳêyªÌ³NzjË÷*ÊŸÔ‘¿¨ �ÐdÌ£ë©#O‘øË€Ò𣀂ðã€2ð“€ðûi@ä}t? ˆ·Ÿ„Ú_ƒÆüÂê‹)ö×ÙõšSëorêW ó Æ¼öQý¯R¢ ¬q¤ÿ]3­&Hu,s@ ò)p ŒƒY�Åì®1¿ZÔ•³-.ªÛÝæH�pŸ“sÆv¶ón*UkÌŸþªaTr²®\v0,q¤×I�1�_ÐÉ;�^'ºÉ=`·1~NŸê�Ò ô†Ø2{þVÖ§û¸èU0ǰ…çÕ[ã8Z�ùÇk:Y¯ ½ÚŒyç¾´Ã@ï€#€•¿t °Þ—X¸KÆükK'Ÿ§ù¶›¬Ô”xº †ùà,è6æ?-:™¾ÔÎ�óà½Æü÷ýóú¹@;8ôÞÒõ²l¼7¬S†À˜—�5ú`LƒIc+Þ‘643ÆV¾'­È=/st Ì[ý]}p,‚5°`lÍKú` Ü 9®ÊØS¿Ñ�–ÄWcìé?H# n7�Àm¸�­¾½mú”€8: ×hìÀAidȵ€fcÇž—F|݃Ûgìl¿4ÒäH‰;`ìRŸ4RâH‰k3vùwÒóå·8"%®ÃØÕ·õÉqäÅ©? N]æÔ Pekoé?΀n@^ÙpdÑ ×.&Û­ƒÛ`�G6Üe@"pc€JvÄMràȆ›EpP’Ž€¸y@±p €08Üw׋‚#ŽÒuÊ=Ar,Nv{ûŸz6Ù£i"MŽl8²áxñ¥t´ ½EB3‘T¨d'§ðONƒ:КÁÐ (’¤ P3I'8 vƒã\…W~ÒÅMB¢ï¥MIN‚‰Žèn¹ IT£Ä —ð&I®𱄥/™3öá—ô½ % ÿ¸ÖÀ¸Ã¥tã„!Ùô>É}Œâ*©ÈËMc?ñº>À²”¨¤J ¦¤Ä"m5öÅèò’’—”)N™â”Ok�}æI�‚yé^°ŸÇ_âWSŒJ1*ŨTž”¼¤x”’É£Rå ÏÓ@RÌK1/żóRÌKµ¶c^Šo©zåNc¿ð²nˆÙH±,%À)–¥j»ñ-U³�ç)Óž2é&`êRÍšúì îú POÍܧSÆ>ûK}ÑP­‡Æ¨£RŒOñ(Åø£¢\X5ö¹7õ¿j!ô¦S«]Us·fì/¨IÅžHõDJ-RB·"uÕ~PLó"æEü�”sÌ~Ä~oMW¡Ê"FŒŠøq+RQ‘ŠŠLgdJ"ÖF܊ر;bYÄÆˆe·b¶¬¿rL—g݈¬‘u#²nD¦=bwÄéˆÉk#®F\�¸q5âjÄ”HEE¼Œ”UÄ…ˆ "DlŒ]ÆþøcúrÂÉA$‘äDÊ4²FŒ�Ô[ĨHaG<�X©­¨_cÆþì[ºëZÄˈç/£~Ààe$%‘”Dý0Qå‘—¸aìëE]@¿Nôs„–®l€~\äATz¸r }+Wƒ°ì¼˜Ëµ€åzÐÁКÁ^ÐèÜÊb¹Á!Ðxë–ÛAèGÀQp 'ÀIp Р•Ï€.Ð zÀYÐ úÀ9p\ýà"¸À c`dMïï?H”‡�}ü®ja�á8˜“` Lƒ@ VfÝ-Ï‚90è^Ë×ÀXK€ŸUe~-–o€à‡by¬ÿò* ñ/ë66Àmpܛࠗ/Ëóûܸî÷îܸp?¨ƒÇý æ÷îܸԖá~ÐOAܸp?à~Àý€û÷îõíZ†q?à~Àý€û÷ƒz.ܸp?à~Àý€û÷îܸԞã~Àý€û÷îÜ2~ÔØ?~U�ßg _yYGz-’ˆ@"‰$"�ˆ@"‰$" ƒ¬ÿ{½þwÄäí¿u4jòm:3ù¡éhÜäWžÐÑ„Éý':š4ùßæt4e æý;˜6…Ž*͘Âr»ŽŠ¦ðàùœ)<üv†§¾ŸáéOgøÔF†Ï| Ã32|í‹Ïføò‹ú7rÈA á®)|§2ÇÅY Ý(m?�çÁд‡w €A ý�a Ý™0 ´¹7´E3 ¦À4ЖThÃoÌíÝ\×€¶m´W¥Í)í&àÐ& vq´õ·´á§�Ï5°´é©]¿;@{}ÚPÓߨYø Ål®ýœ))²¿VdC­˜l…+`Å*À¶W±Ú~úÙìß^}7÷? endstream endobj startxref 311035 %%EOF opari2-2.0.10/doc/PaxHeaders/tags0000644000000000000000000000013215232670236013500 xustar0030 mtime=1785426078.359260791 30 atime=1785426082.655235368 30 ctime=1785426078.359260791 opari2-2.0.10/doc/tags/0000775000175100001440000000000015232670236014107 5ustar00builderusersopari2-2.0.10/doc/tags/PaxHeaders/opari2.tag0000644000000000000000000000013215232670236015446 xustar0030 mtime=1785426078.563259584 30 atime=1785426078.359260791 30 ctime=1785426078.563259584 opari2-2.0.10/doc/tags/opari2.tag0000664000175100001440000007721315232670236016012 0ustar00builderusers opari2_region_info.h /CI/build/_work/src/src/opari-lib-dummy/ opari2__region__info_8h OPARI2_Region_info pomp2_lib.h /CI/build/_work/src/include/opari2/ pomp2__lib_8h void * OPARI2_Region_handle pomp2__lib_8h.html a8ae6e761e844cad11e306b839b7065d9 void POMP2_Assign_handle pomp2__lib_8h.html a4ced2800b4c94cb22193e4a8b9d7a0b2 (POMP2_Region_handle *pomp2_handle, const char ctc_string[]) POMP2_Task_handle POMP2_Get_new_task_handle pomp2__lib_8h.html a45c8a37325b33db03c8dc30db0d3f385 (void) size_t POMP2_Get_num_regions pomp2__lib_8h.html a5677283f76b1775959efa672bd0595af (void) void POMP2_Init_regions pomp2__lib_8h.html a1ee3934a87de5fb3e14bbef827fc0f4c (void) const char * POMP2_Get_opari2_version pomp2__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) size_t POMP2_Get_num_regions pomp2__lib_8h.html a5677283f76b1775959efa672bd0595af (void) void POMP2_Init_regions pomp2__lib_8h.html a1ee3934a87de5fb3e14bbef827fc0f4c (void) const char * POMP2_Get_opari2_version pomp2__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) pomp2_region_info.h /CI/build/_work/src/src/opari-lib-dummy/ pomp2__region__info_8h opari2_region_info.h POMP2_Region_info #define CTC_OMP_TOKENS pomp2__region__info_8h.html ac86b4fc4c04b1049b788a9fec71dc8fc POMP2_DefaultSharing_type pomp2__region__info_8h.html a93b8b7fd1fc771580ef1e2c6eefecc59 POMP2_Region_type pomp2__region__info_8h.html a680a7412e9daca09b793c6538fb7b381 POMP2_Schedule_type pomp2__region__info_8h.html a9bada01c672e9a100dc7903ba06e76a7 void ctcString2RegionInfo pomp2__region__info_8h.html ada8fce980385bdc6598a889bc2ba7892 (const char ctcString[], POMP2_Region_info *regionInfo) void freePOMP2RegionInfoMembers pomp2__region__info_8h.html a328c8dd30c3edae6a9c076f990ea36c6 (POMP2_Region_info *regionInfo) const char * pomp2defaultSharingType2String pomp2__region__info_8h.html ad0856c731e68eef9a148ab79cd0329b1 (POMP2_DefaultSharing_type defaultSharingType) const char * pomp2RegionType2String pomp2__region__info_8h.html a41324a61d69375fcf4d905a2db32a1b5 (POMP2_Region_type regionType) const char * pomp2ScheduleType2String pomp2__region__info_8h.html a5a45288617878806cd3773be2bad8ec4 (POMP2_Schedule_type scheduleType) pomp2_user_lib.h /CI/build/_work/src/include/opari2/ pomp2__user__lib_8h void * OPARI2_Region_handle pomp2__user__lib_8h.html a8ae6e761e844cad11e306b839b7065d9 size_t POMP2_USER_Get_num_regions pomp2__user__lib_8h.html ae0dfec7d859997b69bbcda438dca1867 (void) void POMP2_USER_Init_regions pomp2__user__lib_8h.html af54040ee98b4278d5b991a36b813357c (void) const char * POMP2_Get_opari2_version pomp2__user__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) void POMP2_Finalize pomp2__user__lib_8h.html ae172c40c40ac62b7587e1b11abfff559 (void) void POMP2_Init pomp2__user__lib_8h.html a973f7b06d14fddd52ed74ee50529c284 (void) void POMP2_Off pomp2__user__lib_8h.html a07b65ff3417a1f6924b4a1754a5b6260 (void) void POMP2_On pomp2__user__lib_8h.html a540cdb76c25649773dcec9fd6a9fac03 (void) void POMP2_Begin pomp2__user__lib_8h.html a103798c6fcdee1063ff8baf88f13d8ea (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) void POMP2_End pomp2__user__lib_8h.html a94e19dfab1ba91569bc18c057ca5ad37 (POMP2_USER_Region_handle *pomp2_handle) void POMP2_USER_Assign_handle pomp2__user__lib_8h.html a7589f2c2aa05b5bed5c15c9e4f07b701 (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) size_t POMP2_USER_Get_num_regions pomp2__user__lib_8h.html ae0dfec7d859997b69bbcda438dca1867 (void) void POMP2_USER_Init_regions pomp2__user__lib_8h.html af54040ee98b4278d5b991a36b813357c (void) const char * POMP2_Get_opari2_version pomp2__user__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) void POMP2_Finalize pomp2__user__lib_8h.html ae172c40c40ac62b7587e1b11abfff559 (void) void POMP2_Init pomp2__user__lib_8h.html a973f7b06d14fddd52ed74ee50529c284 (void) void POMP2_Off pomp2__user__lib_8h.html a07b65ff3417a1f6924b4a1754a5b6260 (void) void POMP2_On pomp2__user__lib_8h.html a540cdb76c25649773dcec9fd6a9fac03 (void) void POMP2_Begin pomp2__user__lib_8h.html a103798c6fcdee1063ff8baf88f13d8ea (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) void POMP2_End pomp2__user__lib_8h.html a94e19dfab1ba91569bc18c057ca5ad37 (POMP2_USER_Region_handle *pomp2_handle) void POMP2_USER_Assign_handle pomp2__user__lib_8h.html a7589f2c2aa05b5bed5c15c9e4f07b701 (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) pomp2_user_region_info.h /CI/build/_work/src/src/opari-lib-dummy/ pomp2__user__region__info_8h opari2_region_info.h POMP2_USER_Region_info #define CTC_USER_REGION_TOKENS pomp2__user__region__info_8h.html a93fefda49d7492bf924809e8b6b6ee77 POMP2_USER_Region_type pomp2__user__region__info_8h.html ae76f4de310f343b64c6541b68ef60600 void ctcString2UserRegionInfo pomp2__user__region__info_8h.html adf68daa6bcbb49e313189a50c692217a (const char ctcString[], POMP2_USER_Region_info *regionInfo) void freePOMP2UserRegionInfoMembers pomp2__user__region__info_8h.html af2baca6fe4127338e932a68d84af374f (POMP2_USER_Region_info *regionInfo) const char * pomp2UserRegionType2String pomp2__user__region__info_8h.html aea1b2a34dad1e46141aa650948fbacfb (POMP2_USER_Region_type regionType) OPARI2_Region_info structOPARI2__Region__info.html char * mEndFileName structOPARI2__Region__info.html aa33fdbf1549f6429201ee0293e7c3fc6 unsigned mEndLine1 structOPARI2__Region__info.html a79fa5ad783540110f20895c447d1744b unsigned mEndLine2 structOPARI2__Region__info.html a69ae9b2133cfc45a05348c9e942cff14 char * mStartFileName structOPARI2__Region__info.html afe9ce03c86b5a601fc5d5a02f364d10e unsigned mStartLine1 structOPARI2__Region__info.html afe9d460b353581336ef01828f36c532a unsigned mStartLine2 structOPARI2__Region__info.html a00a8fe35010120cc7bf9a69aab78428d POMP2_Region_info structPOMP2__Region__info.html char * mStartFileName structPOMP2__Region__info.html a6034a8b8c7b55bc7979977b9334958db unsigned mStartLine1 structPOMP2__Region__info.html a9f0d2a2d58e6ee5e23b2b1e0a1d4ebc1 unsigned mStartLine2 structPOMP2__Region__info.html a5685e6673c14de2660bf224eaa554b76 char * mEndFileName structPOMP2__Region__info.html a8c0105ca03822a142662e80953d75358 unsigned mEndLine1 structPOMP2__Region__info.html a94d58f08bbf8e8529fedb7cbccffd017 unsigned mEndLine2 structPOMP2__Region__info.html ade27fd75d1537732a2459c78f818eb8f POMP2_Region_type mRegionType structPOMP2__Region__info.html a34a3ca3ada9bbf45ae4f1e8248b13e70 bool mHasCopyIn structPOMP2__Region__info.html a2f7f3d1dc98587dbff386c6d8e38b96b bool mHasCopyPrivate structPOMP2__Region__info.html a4bf7f82ec65b0115b0a929e307c1bf58 bool mHasIf structPOMP2__Region__info.html afaf850aae51e3e80f1566ee8fbf836f4 bool mHasFirstPrivate structPOMP2__Region__info.html a4087657089faf52b1d6edc383388ff85 bool mHasLastPrivate structPOMP2__Region__info.html a8e6ec810e13638ac587810f23678487c bool mHasNoWait structPOMP2__Region__info.html a5f2a12e99defcacafcba38d7c161e89d bool mHasNumThreads structPOMP2__Region__info.html af9ecc5af683aba508fb892b2738bbdc5 bool mHasOrdered structPOMP2__Region__info.html a24a152ec56e0eafe41326d1d0329bc9b bool mHasReduction structPOMP2__Region__info.html a629015eae4cec0d4bc7e0da0f0dfaeff bool mHasShared structPOMP2__Region__info.html a127860ebef450e083a0100ddbb3b42a0 bool mHasCollapse structPOMP2__Region__info.html a80c536c6186f3c61f0358b073a302571 bool mHasUntied structPOMP2__Region__info.html a8790f498cf86eb6808a9df5d01449677 POMP2_Schedule_type mScheduleType structPOMP2__Region__info.html aeaa2f47c4731b4e10dd3bfb35a2024a3 POMP2_DefaultSharing_type mDefaultSharingType structPOMP2__Region__info.html abd19d390e07d1ed760ce07bc8e1ec915 char * mUserGroupName structPOMP2__Region__info.html ae8cebc481d4414f0857d96080ca16a8a unsigned mNumSections structPOMP2__Region__info.html a63d659e3d853a16e7dc2364a345af231 char * mCriticalName structPOMP2__Region__info.html a4e4565e6d2c2881d007ab343769f6766 char * mStartFileName structPOMP2__Region__info.html a6034a8b8c7b55bc7979977b9334958db unsigned mStartLine1 structPOMP2__Region__info.html a9f0d2a2d58e6ee5e23b2b1e0a1d4ebc1 unsigned mStartLine2 structPOMP2__Region__info.html a5685e6673c14de2660bf224eaa554b76 char * mEndFileName structPOMP2__Region__info.html a8c0105ca03822a142662e80953d75358 unsigned mEndLine1 structPOMP2__Region__info.html a94d58f08bbf8e8529fedb7cbccffd017 unsigned mEndLine2 structPOMP2__Region__info.html ade27fd75d1537732a2459c78f818eb8f POMP2_Region_type mRegionType structPOMP2__Region__info.html a34a3ca3ada9bbf45ae4f1e8248b13e70 bool mHasCopyIn structPOMP2__Region__info.html a2f7f3d1dc98587dbff386c6d8e38b96b bool mHasCopyPrivate structPOMP2__Region__info.html a4bf7f82ec65b0115b0a929e307c1bf58 bool mHasIf structPOMP2__Region__info.html afaf850aae51e3e80f1566ee8fbf836f4 bool mHasFirstPrivate structPOMP2__Region__info.html a4087657089faf52b1d6edc383388ff85 bool mHasLastPrivate structPOMP2__Region__info.html a8e6ec810e13638ac587810f23678487c bool mHasNoWait structPOMP2__Region__info.html a5f2a12e99defcacafcba38d7c161e89d bool mHasNumThreads structPOMP2__Region__info.html af9ecc5af683aba508fb892b2738bbdc5 bool mHasOrdered structPOMP2__Region__info.html a24a152ec56e0eafe41326d1d0329bc9b bool mHasReduction structPOMP2__Region__info.html a629015eae4cec0d4bc7e0da0f0dfaeff bool mHasShared structPOMP2__Region__info.html a127860ebef450e083a0100ddbb3b42a0 bool mHasCollapse structPOMP2__Region__info.html a80c536c6186f3c61f0358b073a302571 bool mHasUntied structPOMP2__Region__info.html a8790f498cf86eb6808a9df5d01449677 POMP2_Schedule_type mScheduleType structPOMP2__Region__info.html aeaa2f47c4731b4e10dd3bfb35a2024a3 POMP2_DefaultSharing_type mDefaultSharingType structPOMP2__Region__info.html abd19d390e07d1ed760ce07bc8e1ec915 char * mUserGroupName structPOMP2__Region__info.html ae8cebc481d4414f0857d96080ca16a8a unsigned mNumSections structPOMP2__Region__info.html a63d659e3d853a16e7dc2364a345af231 char * mCriticalName structPOMP2__Region__info.html a4e4565e6d2c2881d007ab343769f6766 POMP2_USER_Region_info structPOMP2__USER__Region__info.html char * mStartFileName structPOMP2__USER__Region__info.html a2f92dfc397a0dbc804e55c4ab7ac2eef unsigned mStartLine1 structPOMP2__USER__Region__info.html adad6ea05f301f28eabb3896fe0fe712f unsigned mStartLine2 structPOMP2__USER__Region__info.html afd6302572b35de605e7442e0824b7ae0 char * mEndFileName structPOMP2__USER__Region__info.html aecc81da4f774c976d884b6ae537d5cf7 unsigned mEndLine1 structPOMP2__USER__Region__info.html a199ea4217019eda9cf853871a26e4340 unsigned mEndLine2 structPOMP2__USER__Region__info.html aa6690583d3f6a7766d016dd527ffd4e2 char * mUserRegionName structPOMP2__USER__Region__info.html a42d60ea34302fba9dc19dfa189c79aae char * mStartFileName structPOMP2__USER__Region__info.html a2f92dfc397a0dbc804e55c4ab7ac2eef unsigned mStartLine1 structPOMP2__USER__Region__info.html adad6ea05f301f28eabb3896fe0fe712f unsigned mStartLine2 structPOMP2__USER__Region__info.html afd6302572b35de605e7442e0824b7ae0 char * mEndFileName structPOMP2__USER__Region__info.html aecc81da4f774c976d884b6ae537d5cf7 unsigned mEndLine1 structPOMP2__USER__Region__info.html a199ea4217019eda9cf853871a26e4340 unsigned mEndLine2 structPOMP2__USER__Region__info.html aa6690583d3f6a7766d016dd527ffd4e2 char * mUserRegionName structPOMP2__USER__Region__info.html a42d60ea34302fba9dc19dfa189c79aae INSTALL Installation INSTALL USAGE Basic Usage USAGE CTC_STRING CTC-String Decoding CTC_STRING OpenMP LINKING Linking to a Measurement System LINKING POMP_USER POMP User Instrumentation POMP_USER EXAMPLE Example Code EXAMPLE NEWS Latest Release News NEWS MODULARIZTION LINK_STEP POMP2 POMP2_Parallel_fork pomp_tpd TASKING Preprocessing_of_source_files installationfile OPARI2 INSTALL installationfile index OPARI2 - Introduction and Contents index content SUMMARY opari2-2.0.10/doc/PaxHeaders/Makefile.inc.am0000644000000000000000000000013215232670204015416 xustar0030 mtime=1785426052.179415713 30 atime=1785426052.243415334 30 ctime=1785426077.743264435 opari2-2.0.10/doc/Makefile.inc.am0000664000175100001440000002036415232670204015755 0ustar00builderusers## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen University, Germany ## ## Copyright (c) 2009-2011, ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## ## Copyright (c) 2009-2011, 2019-2020, ## Technische Universitaet Dresden, Germany ## ## Copyright (c) 2009-2011, ## University of Oregon, Eugene, USA ## ## Copyright (c) 2009-2011, 2015, 2019, ## Forschungszentrum Juelich GmbH, Germany ## ## Copyright (c) 2009-2011, ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Muenchen, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## ## file doc/doxygen-user/Makefile.inc.am ############################################################################### ## doxygen related targets ## ## In the following conditional we must distinguish if we are in "developer ## mode", i.e. if we are working on a svn working copy, or if we are in "user ## mode", i.e. we are working on a tarball. ## ## In developer mode we can create doxygen and pdf user documentation (make ## doxygen-user) that will be (automatically) included in the distribution at ## make dist. When creating a distribution, the developer should make sure ## that she has doxygen and related tools e.g. pdflatex in PATH in order to ## generate a complete documentation, see also ## build-config/common/m4/ac_scorep_doxygen.m4. ## ## make install is ignorant of documentation issues in developer mode. ## ## The user gets ready to install documentation in the tarball, i.e. there is no ## need to run doxygen and pdflatex in user mode. In user mode the provided ## documentation is just copied to a subdirectory of $prefix. DOC_SRC_DIR = $(srcdir)/doc doxygen-uninstall: rm -rf $(DESTDIR)$(docdir) if GIT_CONTROLLED USER_DOC_DIR = $(top_distdir)$(ac_scorep_doxygen_distdir)/doc doxygen-user-install: doxygen-user-generate: doxygen-user-pdf doxygen-user-html-compress copy-revision-file-to-dist update-revision: @$(am__tty_colors); \ if $(AM_V_P); then echo "cd $(srcdir) && git describe --always --dirty > 'build-config/REVISION'"; \ else echo " GEN $${mgn}$(srcdir)/build-config/REVISION$$std"; fi; \ cd $(srcdir) && git describe --always --dirty > "build-config/REVISION" copy-revision-file-to-dist: @$(MKDIR_P) "$(distdir)/build-config/" @cp -p "$(srcdir)/build-config/REVISION" "$(distdir)/build-config/" @case `cat "$(distdir)/build-config/REVISION"` in *-dirty) \ echo >&2 "WARNING: distribution does not match a single, unmodified revision.";; \ esac doxygen-user-html-compress: $(AM_V_at)if test -d "$(USER_DOC_DIR)/html"; then \ cd "$(USER_DOC_DIR)"; tar czf html.tar.gz html; rm -rf html/; \ fi doxygen-project-number: update-revision $(AM_V_at)echo "PROJECT_NUMBER = \"@PACKAGE_VERSION@ (revision `cat $(srcdir)/build-config/REVISION`)\"" > doc/doxygen-project-number.cfg CLEANFILES += doc/doxygen-project-number.cfg doxygen-user-clean: rm -rf $(USER_DOC_DIR)/* if HAVE_DOXYGEN OPARI2_V_DOXYGEN = $(opari2__v_DOXYGEN_@AM_V@) opari2__v_DOXYGEN_ = $(opari2__v_DOXYGEN_@AM_DEFAULT_V@) opari2__v_DOXYGEN_0 = @$(am__tty_colors); echo " DOXYGEN $${blu}$@$$std"; opari2__v_DOXYGEN_1 = OPARI2_V_DEVNULL = $(opari2__v_DEVNULL_@AM_V@) opari2__v_DEVNULL_ = $(opari2__v_DEVNULL_@AM_DEFAULT_V@) opari2__v_DEVNULL_0 = >/dev/null 2>&1 opari2__v_DEVNULL_1 = doxygen-user: doxygen-project-number doc/doxygen-user/main.dox doc/doxygen-user.cfg $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/tags" $(AM_V_at)echo "OUTPUT_DIRECTORY = $(USER_DOC_DIR)" > doc/doxygen-user-at-make-time.cfg $(AM_V_at)echo "GENERATE_TAGFILE = $(USER_DOC_DIR)/tags/@PACKAGE@.tag" >> doc/doxygen-user-at-make-time.cfg $(AM_V_at)cat doc/doxygen-project-number.cfg doc/doxygen-user-at-make-time.cfg doc/doxygen-user.cfg > doc/doxygen-user-html.cfg $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/html" $(AM_V_at)cp $(abs_srcdir)/doc/images/* $(USER_DOC_DIR)/html $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ else echo "QUIET = YES"; fi >>doc/doxygen-user-html.cfg $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-html.cfg CLEANFILES += doc/doxygen-user-html.cfg doc/doxygen-user-at-make-time.cfg doxygen.err else !HAVE_DOXYGEN doxygen-user: echo "WARNING: doxygen not available. Cannot generate documentation." >&2 endif !HAVE_DOXYGEN if HAVE_DOXYGEN_LATEX OPARI2_V_pdflatex = $(opari2__v_pdflatex_@AM_V@) opari2__v_pdflatex_ = $(opari2__v_pdflatex_@AM_DEFAULT_V@) opari2__v_pdflatex_0 = -interaction batchmode opari2__v_pdflatex_1 = -interaction nonstopmode doxygen-user-pdf: doxygen-user $(AM_V_at)cat doc/doxygen-user-html.cfg > doc/doxygen-user-pdf.cfg $(AM_V_at)echo "ENABLED_SECTIONS = LATEX" >> doc/doxygen-user-pdf.cfg $(AM_V_at)echo "GENERATE_HTML = NO" >> doc/doxygen-user-pdf.cfg $(AM_V_at)cp $(DOC_SRC_DIR)/license.tex $(USER_DOC_DIR)/pdf/ -$(AM_V_at)cp $(DOC_SRC_DIR)/images/project_logo.pdf $(USER_DOC_DIR)/pdf/ $(AM_V_at)echo "LATEX_CMD_NAME = \"pdflatex -file-line-error $(OPARI2_V_pdflatex)\"" >>doc/doxygen-user-pdf.cfg $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ else echo "QUIET = YES"; \ echo "MAKEINDEX_CMD_NAME = \"makeindex -q\""; \ fi >>doc/doxygen-user-pdf.cfg $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-pdf.cfg $(AM_V_at)cd "$(USER_DOC_DIR)/pdf" && \ make $(OPARI2_V_DEVNULL) && \ mv refman.pdf ../ && \ rm -f * && \ mv ../refman.pdf @PACKAGE@.pdf else !HAVE_DOXYGEN_LATEX doxygen-user-pdf: doxygen-user echo "WARNING: pdflatex not available. Cannot generate doxygen pdf documentation." >&2 if test -d "$(USER_DOC_DIR)/pdf"; then rm -rf "$(USER_DOC_DIR)/pdf"; fi endif !HAVE_DOXYGEN_LATEX else !GIT_CONTROLLED doxygen-user-clean: doxygen-user-generate: doxygen-user-pdf: doxygen-user-install: $(AM_V_at)if test -f "$(DOC_SRC_DIR)/html.tar.gz"; then \ $(MKDIR_P) $(DESTDIR)$(docdir); \ $(INSTALL_DATA) $(DOC_SRC_DIR)/html.tar.gz $(DESTDIR)$(docdir)/html.tar.gz; \ cd $(DESTDIR)$(docdir); \ tar xzf html.tar.gz; \ rm -f html.tar.gz; \ fi $(AM_V_at)if test -d "$(DOC_SRC_DIR)"; then \ cd $(DOC_SRC_DIR); \ dirs="pdf tags"; \ cd -; \ for i in $$dirs; do \ if test -d "$(DOC_SRC_DIR)/$$i"; then \ $(MKDIR_P) $(DESTDIR)$(docdir)/$$i; \ cd $(DOC_SRC_DIR)/$$i; \ files=`find . -type f`; \ cd -; \ for j in $$files; do \ $(INSTALL_DATA) $(DOC_SRC_DIR)/$$i/$$j $(DESTDIR)$(docdir)/$$i/$$j; \ done; \ fi; \ done; \ fi copy-revision-file-to-dist: endif !GIT_CONTROLLED ## ## ############################################################################### opari2-2.0.10/doc/PaxHeaders/example0000644000000000000000000000013015232670235014172 xustar0029 mtime=1785426077.73926446 30 atime=1785426082.655235368 29 ctime=1785426077.73926446 opari2-2.0.10/doc/example/0000775000175100001440000000000015232670235014603 5ustar00builderusersopari2-2.0.10/doc/example/PaxHeaders/pomp0000644000000000000000000000013215232670236015150 xustar0030 mtime=1785426078.115262235 30 atime=1785426082.655235368 30 ctime=1785426078.115262235 opari2-2.0.10/doc/example/pomp/0000775000175100001440000000000015232670236015557 5ustar00builderusersopari2-2.0.10/doc/example/pomp/PaxHeaders/Makefile.in0000644000000000000000000000013115232670204017264 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426078.115262235 opari2-2.0.10/doc/example/pomp/Makefile.in0000664000175100001440000000671415232670204017627 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # Copyright (c) 2009-2013, # RWTH Aachen University, Germany # Copyright (c) 2009-2013, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # Copyright (c) 2009-2013, 2020, # Technische Universitaet Dresden, Germany # Copyright (c) 2009-2013, # University of Oregon, Eugene, USA # Copyright (c) 2009-2013, 2016, # Forschungszentrum Juelich GmbH, Germany # Copyright (c) 2009-2013, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # Copyright (c) 2009-2013, # Technische Universitaet Muenchen, Germany # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. ###################################################### # Compiler # ###################################################### CC=@CC@ FORTRAN=@FC@ OPENMP_C_FLAG=@OPENMP_CFLAGS@ @CFLAGS@ OPENMP_F_FLAG=@OPENMP_FFLAGS@ @FFLAGS@ ###################################################### # OPARI & DUMMY LIBRARY # ###################################################### POMP_INC=-I@prefix@/include POMPLIBDIR=@prefix@/share/doc/opari2/example/lib POMPLIB=-L${POMPLIBDIR} -lpomp BINDIR=@BINDIR@ OPARI=$(BINDIR)/opari2 OPARI2_CONFIG=$(BINDIR)/opari2-config # We need to make sure that we use the right versions # of nm, awk and grep. opari2-config returns the right # commands with the necessary options. NM=`$(OPARI2_CONFIG) --nm` AWK_SCRIPT=`$(OPARI2_CONFIG) --region-initialization` all: c fortran ###################################################### # C EXAMPLE # ###################################################### c: example_c example_c_inst ./example_c ./example_c_inst # Build without instrumentation example_c: example.c $(CC) $(OPENMP_C_FLAG) $? -o $@ # Linking step example_c_inst: example_c.mod.o pompregions_c.o $(CC) $(OPENMP_C_FLAG) $? $(POMPLIB) -o $@ pompregions_c.o : pompregions_c.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_c.c : example_c.mod.o $(NM) example_c.mod.o | $(AWK_SCRIPT) > pompregions_c.c example_c.mod.o: example.mod.c $(CC) $(OPENMP_C_FLAG) $(POMP_INC) -c $? -o $@ example.mod.c: example.c $(OPARI) example.c ###################################################### # FORTRAN EXAMPLE # ###################################################### fortran: example_f example_f_inst # Build without instrumentation example_f: example.f90 $(FORTRAN) $(OPENMP_F_FLAG) $? -o $@ # Linking step example_f_inst: example_f.mod.o pompregions_f.o $(FORTRAN) $(OPENMP_F_FLAG) $? $(POMPLIB) -o $@ pompregions_f.o : pompregions_f.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_f.c : example_f.mod.o $(NM) example_f.mod.o | $(AWK_SCRIPT) > pompregions_f.c example_f.mod.o : example.mod.F90 $(FORTRAN) $(OPENMP_F_FLAG) -c -o $@ $? example.mod.F90: example.f90 $(OPARI) example.f90 ###################################################### clean: rm -rf example_? rm -rf example_?_inst rm -rf example.mod.* rm -rf example.*.opari.inc rm -rf pompregions_?.c rm -rf *.o opari2-2.0.10/doc/example/pomp/PaxHeaders/Makefile.inc.am0000644000000000000000000000013115232670204020023 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426078.083262424 opari2-2.0.10/doc/example/pomp/Makefile.inc.am0000664000175100001440000000101115232670204020347 0ustar00builderusers## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2020, ## Technische Universitaet Dresden, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## examplepompdir = $(docdir)/example/pomp examplepomp_DATA = \ $(SRC_ROOT)doc/example/pomp/example.c \ $(SRC_ROOT)doc/example/pomp/example.f90 \ ../doc/example/pomp/Makefile opari2-2.0.10/doc/example/pomp/PaxHeaders/example.f900000644000000000000000000000013115232670204017172 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426077.987262992 opari2-2.0.10/doc/example/pomp/example.f900000664000175100001440000000226315232670204017530 0ustar00builderusers!> !> This file is part of the Score-P software (http://www.score-p.org) !> !> Copyright (c) 2009-2011, !> RWTH Aachen University, Germany !> !> Copyright (c) 2009-2011, !> Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Dresden, Germany !> !> Copyright (c) 2009-2011, !> University of Oregon, Eugene, USA !> !> Copyright (c) 2009-2011, 2013 !> Forschungszentrum Juelich GmbH, Germany !> !> Copyright (c) 2009-2011, !> German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Muenchen, Germany !> !> This software may be modified and distributed under the terms of !> a BSD-style license. See the COPYING file in the package base !> directory for details. SUBROUTINE FOO INTEGER i !$POMP INST BEGIN(FOO) WRITE (*,*) 'Hello from FOO.' ! work is done here if (i.eq.0) THEN !$POMP INST ALTEND(FOO) RETURN END IF ! other work is done here !$POMP INST END(FOO) END PROGRAM EXAMPLE_USER_INSTRUMENTATION !$POMP INST INIT WRITE (*,*) 'Hello from PROGRAM.' CALL FOO() END opari2-2.0.10/doc/example/pomp/PaxHeaders/example.c0000644000000000000000000000013115232670204017016 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426077.987262992 opari2-2.0.10/doc/example/pomp/example.c0000664000175100001440000000267615232670204017364 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ #include /*Disable unknown pragma warning for the intel compiler. * This avoids warnings for pomp pragmas if the file is * not preprocessed with opari.*/ #ifdef __INTEL_COMPILER #pragma warning disable 161 #endif int foo() { int i = 0; #pragma pomp inst begin(foo) //usefull work could be done here which changes i printf( "Hello from foo.\n" ); if ( i == 0 ) { #pragma pomp inst altend(foo) return 42; } //other work might be done here #pragma pomp inst end(foo) return i; } int main( int argc, char** argv ) { #pragma pomp inst init printf( "Hello from main.\n" ); foo(); return 0; } opari2-2.0.10/doc/example/PaxHeaders/openmp0000644000000000000000000000013215232670236015473 xustar0030 mtime=1785426078.115262235 30 atime=1785426082.655235368 30 ctime=1785426078.115262235 opari2-2.0.10/doc/example/openmp/0000775000175100001440000000000015232670236016102 5ustar00builderusersopari2-2.0.10/doc/example/openmp/PaxHeaders/Makefile.in0000644000000000000000000000013115232670204017607 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426078.115262235 opari2-2.0.10/doc/example/openmp/Makefile.in0000664000175100001440000000676615232670204020161 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # Copyright (c) 2009-2013, # RWTH Aachen University, Germany # Copyright (c) 2009-2013, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # Copyright (c) 2009-2013, 2020, # Technische Universitaet Dresden, Germany # Copyright (c) 2009-2013, # University of Oregon, Eugene, USA # Copyright (c) 2009-2013, 2016, 2023, # Forschungszentrum Juelich GmbH, Germany # Copyright (c) 2009-2013, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # Copyright (c) 2009-2013, # Technische Universitaet Muenchen, Germany # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. ###################################################### # Compiler # ###################################################### CC=@CC@ FORTRAN=@FC@ OPENMP_C_FLAG=@OPENMP_CFLAGS@ @CFLAGS@ OPENMP_F_FLAG=@OPENMP_FFLAGS@ @FFLAGS@ ###################################################### # OPARI & DUMMY LIBRARY # ###################################################### POMP_INC=-I@prefix@/include POMPLIBDIR=@prefix@/share/doc/opari2/example/lib POMPLIB=-L${POMPLIBDIR} -lpomp BINDIR=@BINDIR@ OPARI=$(BINDIR)/opari2 OPARI2_CONFIG=$(BINDIR)/opari2-config # We need to make sure that we use the right versions # of nm, awk and grep. opari2-config returns the right # commands with the necessary options. NM=`$(OPARI2_CONFIG) --nm` AWK_SCRIPT=`$(OPARI2_CONFIG) --region-initialization` all: c fortran ###################################################### # C EXAMPLE # ###################################################### c: example_c example_c_inst OMP_NUM_THREADS=4 ./example_c OMP_NUM_THREADS=4 ./example_c_inst # Build without instrumentation example_c: example.c $(CC) $(OPENMP_C_FLAG) $? -o $@ # Linking step example_c_inst: example_c.mod.o pompregions_c.o $(CC) $(OPENMP_C_FLAG) $? $(POMPLIB) -o $@ pompregions_c.o : pompregions_c.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_c.c : example_c.mod.o $(NM) example_c.mod.o | $(AWK_SCRIPT) > pompregions_c.c example_c.mod.o: example.mod.c $(CC) $(OPENMP_C_FLAG) $(POMP_INC) -c $? -o $@ example.mod.c: example.c $(OPARI) example.c ###################################################### # FORTRAN EXAMPLE # ###################################################### fortran: example_f example_f_inst # Build without instrumentation example_f: example.f90 $(FORTRAN) $(OPENMP_F_FLAG) $? -o $@ # Linking step example_f_inst: example_f.mod.o pompregions_f.o $(FORTRAN) $(OPENMP_F_FLAG) $? $(POMPLIB) -o $@ pompregions_f.o : pompregions_f.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_f.c : example_f.mod.o $(NM) example_f.mod.o | $(AWK_SCRIPT) > pompregions_f.c example_f.mod.o : example.mod.F90 $(FORTRAN) $(OPENMP_F_FLAG) -c -o $@ $? example.mod.F90: example.f90 $(OPARI) example.f90 ###################################################### clean: rm -rf example_? rm -rf example_?_inst rm -rf example.mod.* rm -rf example.*.opari.inc rm -rf pompregions_?.c rm -rf *.o opari2-2.0.10/doc/example/openmp/PaxHeaders/Makefile.inc.am0000644000000000000000000000013115232670204020346 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426078.083262424 opari2-2.0.10/doc/example/openmp/Makefile.inc.am0000664000175100001440000000111015232670204020672 0ustar00builderusers## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2020, ## Technische Universitaet Dresden, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## if HAVE_OPENMP_SUPPORT exampleopenmpdir = $(docdir)/example/openmp exampleopenmp_DATA = \ $(SRC_ROOT)doc/example/openmp/example.c \ $(SRC_ROOT)doc/example/openmp/example.f90 \ ../doc/example/openmp/Makefile endif HAVE_OPENMP_SUPPORT opari2-2.0.10/doc/example/openmp/PaxHeaders/example.f900000644000000000000000000000013115232670204017515 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426077.987262992 opari2-2.0.10/doc/example/openmp/example.f900000664000175100001440000000217115232670204020051 0ustar00builderusers!> !> This file is part of the Score-P software (http://www.score-p.org) !> !> Copyright (c) 2009-2011, !> RWTH Aachen University, Germany !> !> Copyright (c) 2009-2011, !> Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Dresden, Germany !> !> Copyright (c) 2009-2011, !> University of Oregon, Eugene, USA !> !> Copyright (c) 2009-2011, 2013 !> Forschungszentrum Juelich GmbH, Germany !> !> Copyright (c) 2009-2011, !> German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Muenchen, Germany !> !> This software may be modified and distributed under the terms of !> a BSD-style license. See the COPYING file in the package base !> directory for details. PROGRAM EXAMPLE INTEGER i, lsum, sum sum = 0 !$omp parallel private(i, lsum) reduction(+:sum) lsum = 0 !$omp do do i=1,20 lsum = lsum + i enddo !$omp end do write(*,*) "LOCAL SUM: ", lsum sum = sum + lsum !$omp end parallel write(*,*) "TOTAL SUM: ", sum END opari2-2.0.10/doc/example/openmp/PaxHeaders/example.c0000644000000000000000000000013115232670204017341 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426077.983263016 opari2-2.0.10/doc/example/openmp/example.c0000664000175100001440000000230015232670204017667 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ #include int main( int argc, char** argv ) { int i, lsum, sum; sum = 0; #pragma omp parallel private(i, lsum) reduction(+:sum) { lsum = 0; #pragma omp for for ( i = 0; i < 21; i++ ) { lsum += i; } printf( "local sum: %d\n", lsum ); sum += lsum; } printf( "total sum: %d\n", sum ); return 0; } opari2-2.0.10/doc/PaxHeaders/doxygen-user0000644000000000000000000000013215232670235015172 xustar0030 mtime=1785426077.991262968 30 atime=1785426082.655235368 30 ctime=1785426077.991262968 opari2-2.0.10/doc/doxygen-user/0000775000175100001440000000000015232670235015601 5ustar00builderusersopari2-2.0.10/doc/doxygen-user/PaxHeaders/opari2-config_usage.dox.in0000644000000000000000000000013115232670204022206 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426077.991262968 opari2-2.0.10/doc/doxygen-user/opari2-config_usage.dox.in0000664000175100001440000000406215232670204022543 0ustar00builderusersUsage: opari2-config [OPTION] ... with the following commands: --nm Prints the nm command. --region-initialization Prints the script used to create the pomp2_init_regions.c file. --create-pomp2-regions Prints the whole command necessary for creating the initialization file. --awk-cmd [Deprecated, use --region-initialization instead.] Prints the awk command. --awk-script [Deprecated, use --region-initialization instead.] Prints the awk script. --egrep [Deprecated, use --region-initialization instead.] Prints the egrep command. --cflags[=(gnu|intel|sun| Prints compiler options to include pgi|ibm|cray|fujitsu| installed headers and adds compiler clang)] specific flags to prevent warnings for unused variables which can occur during the instrumentation. --fortran Indicates that the target language is fortran. Sometimes for fortran different compile flags are provided, in most of the cases there is no difference. --version Prints the OPARI2 version number. --interface-version Prints the pomp2 API version that instrumented files conform too. --revision Prints the revision number of the OPARI2 package. --help Prints this help text. and the following options: [--build-check] Tells opari2-config to use build paths instead of install paths. Used for build testing. [--config=] Reads in a configuration from the given file. Report bugs to . opari2-2.0.10/doc/doxygen-user/PaxHeaders/opari2_usage.dox.in0000644000000000000000000000013115232670204020743 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 30 ctime=1785426077.991262968 opari2-2.0.10/doc/doxygen-user/opari2_usage.dox.in0000664000175100001440000001002515232670204021274 0ustar00builderusersUsage: opari2 [OPTION] ... infile [outfile] ****************** general options and parameters ******************* [--f77|--f90|--c|--c++] [OPTIONAL] Specifies the programming language of the input source file. This option is only necessary if the automatic language detection based on the input file suffix fails. [--free-form] [OPTIONAL] Specifies that free formatting is used for Fortran source files. This is the default for Fortran 90/95. [--fix-form] [OPTIONAL] Specifies that fixed formatting is used for Fortran source files. This is the default for Fortran 77. [--nosrc] [OPTIONAL] If specified, OPARI2 does not generate #line constructs, which allow to preserve the original source file and line number information, in the transformation process. This option might be necessary if the OpenMP compiler does not understand #line constructs. The default is to generate #line constructs. [--disable=paradigm[:directive|group[:inner],...][+paradigm...] [OPTIONAL] Disable the instrumentation of whole paradigms, or specific directives or groups of directives of a paradigm. Furthermore it gives the possibility to suppress the insertion of instrumentation functions inside code regions, i.e. only the surrounding instrumentation is inserted. See the paradigm sections below. [--preprocessed] [OPTIONAL] Indicates that the source file is already preprocessed. It requires that necessary instrumentation interface headers are already included. Furthermore, it requires a marker, e.g. ___POMP2_INCLUDE___ immediately after the respective include file. [--version] [OPTIONAL] Prints version information. [--help] [OPTIONAL] Prints this help text. infile Input file name. [outfile] [OPTIONAL] Output file name. If not specified, OPARI2 uses the name infile.mod.suffix if the input file is called infile.suffix. ********************** OpenMP specific options ********************** [--disable=omp[:directive|group,...] [OPTIONAL] Accepted directives are 'atomic', 'critical', 'master', 'flush', 'single', 'ordered' or 'locks'. These directives form the group 'sync', that disables all of them. The group 'task' prevents the instrumentation of task directives. E.g., --disable=omp:master,atomic diables the instrumentation of master and atomic directives. [--omp-nodecl] [OPTIONAL] Disables the generation of POMP2_DLISTXXXXX macros. These are used in the parallel directives of the instrumentation to make the region handles shared. By using this option the shared clause is used directly on the parallel directive with the respective region handles. [--omp-tpd] [OPTIONAL] Adds the clause 'copyin()' to any parallel construct. This allows to pass data from the creating thread to its children. The variable is declared externally in all files, so it needs to be defined by the pomp library. This option is not supported when using the Fujitsu compiler. [--omp-tpd-mangling=gnu|intel|sun|pgi|ibm|cray] [OPTIONAL] If programming languages are mixed(C and Fortran), the needs to use the Fortran mangled name also in C files. This option specifies to use the mangling scheme of the gnu, intel, sun, pgi or ibm compiler. The default is to use the mangling scheme of the compiler used to build OPARI2. [--omp-task=abort|warn|remove] Special treatment for the task directive abort: Stop instrumentation with an error message when encountering a task directive. warn: Resume but print a warning. remove: Remove all task directives. [--omp-task-untied=abort|keep|no-warn] Special treatment for the untied task attribute. The default behavior is to remove the untied attribute, thus making all tasks tied, and print out a warning. abort: Stop instrumentation with an error message when encountering a task directive with the untied attribute. keep: Do not remove the untied attribute. no-warn: Do not print out a warning. ********************************************************************** Please report bugs to . opari2-2.0.10/doc/doxygen-user/PaxHeaders/doxygen-user.cfg.in0000644000000000000000000000013015232670204020760 xustar0030 mtime=1785426052.183415689 29 atime=1785426052.24741531 29 ctime=1785426077.77126427 opari2-2.0.10/doc/doxygen-user/doxygen-user.cfg.in0000664000175100001440000031665615232670204021335 0ustar00builderusers## Several variables will be added at 'make doxygen-user' time # Doxyfile 1.8.10 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all text # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv # for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = "OPARI2" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "OpenMP Pragma And Region Instrumentor" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = @abs_top_srcdir@/doc/images/project_logo.svg # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = NO # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = @abs_top_srcdir@ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. ALIASES = scorep=Score-P \ cube=CUBE \ cube4=CUBE4 \ opari2=OPARI2 \ otf2=OTF2 \ mpi=MPI \ pmpi=PMPI \ openmp=OpenMP \ pomp2=POMP2 \ ibm=IBM \ "bluegene=Blue Gene" \ "crayxt=Cray XT" \ "crayxe=Cray XE" \ "crayxk=Cray XK" \ "crayxc=Cray XC" \ "necsx=NEC SX" \ papi=PAPI \ "seclabel{1}=\latexonly\label{sec:\1} \endlatexonly" \ "secref{1}=\if LATEX \latexonly~\ref{sec:\1}\xspace \endlatexonly \else   '@ref \1'   \endif" \ "verb{1}=\latexonly\verb+\1+\endlatexonly\htmlonly\1\endhtmlonly" \ "htmlimg{3}=@anchor \2 @image html \1 \"Figure \2: \3\"" \ "teximg{4}=\latexonly\begin{figure}[hbt]\begin{center}\includegraphics[\4]{@abs_top_srcdir@/doc/images/\1}\caption{\3}\label{fig:\2}\end{center}\end{figure}\endlatexonly" \ "img{4}=\if LATEX @teximg{\1.pdf,\2,\3,\4} \else @htmlimg{\1.png,\2,\3} \endif" \ "figref{1}=\if LATEX \latexonly~\ref{fig:\1}\xspace \endlatexonly \else   @ref \1   \endif" \ "href{2}=\2" \ "emph{1}=\1" # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, Javascript, # C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: # FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: # Fortran. In the later case the parser tries to guess whether the code is fixed # or free formatted code, this is the default for Fortran type files), VHDL. For # instance to make doxygen treat .inc files as Fortran files (default is PHP), # and .f files as C (default is Fortran), use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = YES # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO, these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = YES # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = NO # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= NO # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong or incomplete # parameter documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = doxygen.err #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = doc/doxygen-user \ @abs_top_srcdir@/doc/doxygen-user \ @abs_top_srcdir@/include/opari2 \ @abs_top_srcdir@/src/opari-lib-dummy/opari2_region_info.h \ @abs_top_srcdir@/src/opari-lib-dummy/pomp2_region_info.h \ @abs_top_srcdir@/src/opari-lib-dummy/pomp2_user_region_info.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, # *.vhdl, *.ucf, *.qsf, *.as and *.js. FILE_PATTERNS = *.h \ *.dox # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = */.git/* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = @abs_top_srcdir@/doc/doxygen-user \ @abs_top_srcdir@/INSTALL # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = @abs_top_srcdir@/doc/doxygen-user # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # function all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the config file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = @abs_top_srcdir@/doc/doxygen-user/header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = @abs_top_srcdir@/doc/doxygen-user/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 199 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: http://developer.apple.com/tools/xcode/), introduced with # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the master .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 1 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /